[automerger skipped] Merge "Import translations. DO NOT MERGE ANYWHERE" into rvc-qpr-dev am: 5a90c02c58 -s ours
am skip reason: subject contains skip directive
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/services/Telephony/+/13241893
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: I584d4c44de7385920f94cda3c7bdca71ce925c31
diff --git a/Android.bp b/Android.bp
index 1887a8a..e7ca068 100644
--- a/Android.bp
+++ b/Android.bp
@@ -35,6 +35,7 @@
"com.android.phone.common-lib",
"guava",
"PlatformProperties",
+ "modules-utils-os",
],
srcs: [
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 340aab7..37e009d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -83,6 +83,7 @@
<protected-broadcast android:name= "com.android.cellbroadcastreceiver.GET_LATEST_CB_AREA_INFO" />
<protected-broadcast android:name= "com.android.internal.telephony.ACTION_CARRIER_CERTIFICATE_DOWNLOAD" />
<protected-broadcast android:name= "com.android.internal.telephony.OPEN_DEFAULT_SMS_APP" />
+ <protected-broadcast android:name= "com.android.internal.telephony.ACTION_TEST_OVERRIDE_CARRIER_ID" />
<protected-broadcast android:name= "android.telephony.action.SIM_CARD_STATE_CHANGED" />
<protected-broadcast android:name= "android.telephony.action.SIM_APPLICATION_STATE_CHANGED" />
<protected-broadcast android:name= "android.telephony.action.SIM_SLOT_STATUS_CHANGED" />
@@ -96,6 +97,9 @@
<!-- For Vendor Debugging in Telephony -->
<protected-broadcast android:name="android.telephony.action.ANOMALY_REPORTED" />
+ <protected-broadcast android:name= "android.intent.action.SUBSCRIPTION_INFO_RECORD_ADDED" />
+ <protected-broadcast android:name= "android.intent.action.ACTION_MANAGED_ROAMING_IND" />
+
<!-- Allows granting runtime permissions to telephony related components. -->
<uses-permission android:name="android.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS" />
@@ -211,13 +215,15 @@
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
<uses-permission android:name="android.permission.READ_PRECISE_PHONE_STATE" />
<uses-permission android:name="android.permission.MANAGE_ROLE_HOLDERS" />
- <!-- Allows us to whitelist receivers of the
+ <!-- Allows us to allow list receivers of the
ACTION_SIM_SLOT_STATUS_CHANGED broadcast to start activities
from the background. -->
<uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND" />
<uses-permission android:name="android.permission.NETWORK_STATS_PROVIDER" />
<uses-permission android:name="android.permission.HANDLE_CAR_MODE_CHANGES"/>
<uses-permission android:name="android.permission.MANAGE_SUBSCRIPTION_PLANS"/>
+ <uses-permission android:name="android.permission.OBSERVE_ROLE_HOLDERS"/>
+ <uses-permission android:name="android.permission.BIND_GBA_SERVICE"/>
<application android:name="PhoneApp"
android:persistent="true"
@@ -236,11 +242,16 @@
android:readPermission="android.permission.READ_CONTACTS"
android:writePermission="android.permission.WRITE_CONTACTS" />
+ <provider android:name="com.android.ims.rcs.uce.eab.EabProvider"
+ android:authorities="eab"
+ android:exported="false"/>
+
<!-- Dialer UI that only allows emergency calls -->
<activity android:name="EmergencyDialer"
android:label="@string/emergencyDialerIconLabel"
android:theme="@style/EmergencyDialerTheme"
android:screenOrientation="portrait"
+ android:exported="true"
android:resizeableActivity="false">
<intent-filter>
<action android:name="com.android.phone.EmergencyDialer.DIAL" />
@@ -268,6 +279,7 @@
android:label="@string/simContacts_title"
android:theme="@style/SimImportTheme"
android:screenOrientation="portrait"
+ android:exported="true"
android:icon="@mipmap/ic_launcher_contacts">
<intent-filter>
@@ -279,6 +291,7 @@
<activity android:name="com.android.phone.settings.fdn.FdnList"
android:label="@string/fdnListLabel"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
@@ -293,6 +306,7 @@
<activity android:name="GsmUmtsCallOptions"
android:label="@string/gsm_umts_options"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -301,6 +315,7 @@
<activity android:name="CdmaCallOptions"
android:label="@string/cdma_options"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -310,6 +325,17 @@
<activity android:name="GsmUmtsCallForwardOptions"
android:label="@string/labelCF"
android:configChanges="orientation|screenSize|keyboardHidden"
+ android:exported="true"
+ android:theme="@style/DialerSettingsLight">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="CdmaCallForwardOptions"
+ android:label="@string/labelCF"
+ android:configChanges="orientation|screenSize|keyboardHidden"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -319,6 +345,7 @@
<activity android:name="GsmUmtsCallBarringOptions"
android:label="@string/labelCallBarring"
android:configChanges="orientation|screenSize|keyboardHidden"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -328,6 +355,7 @@
<activity android:name="GsmUmtsAdditionalCallOptions"
android:label="@string/labelGSMMore"
android:configChanges="orientation|screenSize|keyboardHidden"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -337,6 +365,7 @@
<!-- fdn setting -->
<activity android:name="com.android.phone.settings.fdn.FdnSetting"
android:label="@string/fdn"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -346,6 +375,7 @@
<!-- SIM PIN setting -->
<activity android:name="EnableIccPinScreen"
android:label="@string/enable_pin"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -355,6 +385,7 @@
<activity android:name="ChangeIccPinScreen"
android:label="@string/change_pin"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -382,6 +413,7 @@
<activity android:name="CallFeaturesSetting"
android:label="@string/call_settings"
android:configChanges="orientation|screenSize|keyboardHidden"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
@@ -394,6 +426,7 @@
<!-- Activation service that trigger OTASP sim provisioning -->
<service android:name=".otasp.OtaspActivationService" android:launchMode="singleInstance"
androidprv:systemUserOnly="true"
+ android:exported="true"
android:permission="android.permission.MODIFY_PHONE_STATE">
<intent-filter>
<action android:name="android.service.simActivation.SimActivationService" />
@@ -410,6 +443,7 @@
<!-- "Accessibility" settings UI. Referenced by Dialer application. -->
<activity android:name="com.android.phone.settings.AccessibilitySettingsActivity"
android:label="@string/accessibility_settings_activity_title"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -424,6 +458,7 @@
<!-- service to dump telephony information -->
<service android:name="com.android.phone.TelephonyDebugService"
+ android:exported="true"
android:permission="android.permission.DUMP">
<intent-filter>
<action android:name="com.android.phone.TelephonyDebugService" />
@@ -433,6 +468,7 @@
<!-- Handler for EuiccManager's public-facing intents. -->
<activity android:name=".euicc.EuiccUiDispatcherActivity"
android:theme="@android:style/Theme.NoDisplay"
+ android:exported="true"
android:permission="android.permission.MODIFY_PHONE_STATE">
<!-- Max out priority to ensure nobody else will handle these intents. -->
<intent-filter android:priority="1000">
@@ -453,6 +489,7 @@
EuiccController#RESOLUTION_ACTIVITY_CLASS_NAME
-->
<activity android:name=".euicc.EuiccResolutionUiDispatcherActivity"
+ android:exported="true"
android:permission="android.permission.CALL_PRIVILEGED">
<!-- Max out priority to ensure nobody else will handle these intents. -->
<intent-filter android:priority="1000">
@@ -468,6 +505,7 @@
-->
<activity android:name=".euicc.EuiccPrivilegedActionUiDispatcherActivity"
android:theme="@android:style/Theme.NoDisplay"
+ android:exported="true"
android:permission="android.permission.CALL_PRIVILEGED">
<!-- Max out priority to ensure nobody else will handle these intents. -->
<intent-filter android:priority="1000">
@@ -487,6 +525,7 @@
whitelisted by the underlying eUICC service implementation (i.e. the LPA).
-->
<activity android:name=".euicc.EuiccPublicActionUiDispatcherActivity"
+ android:exported="true"
android:theme="@android:style/Theme.NoDisplay">
<!-- Max out priority to ensure nobody else will handle these intents. -->
<intent-filter android:priority="1000">
@@ -500,6 +539,7 @@
android:excludeFromRecents="true"
android:label="@string/ecm_exit_dialog"
android:launchMode="singleTop"
+ android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="com.android.phone.action.ACTION_SHOW_ECM_EXIT_DIALOG" />
@@ -512,13 +552,15 @@
<service android:name="com.android.services.telephony.sip.SipConnectionService"
android:label="@string/sip_connection_service_label"
android:singleUser="true"
+ android:exported="true"
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE" >
<intent-filter>
<action android:name="android.telecom.ConnectionService" />
</intent-filter>
</service>
- <receiver android:name="com.android.services.telephony.sip.SipIncomingCallReceiver">
+ <receiver android:name="com.android.services.telephony.sip.SipIncomingCallReceiver"
+ android:exported="true">
<intent-filter>
<action android:name="android.net.sip.action.SIP_INCOMING_CALL" />
</intent-filter>
@@ -526,6 +568,7 @@
<activity android:name="com.android.services.telephony.sip.SipPhoneAccountSettingsActivity"
android:theme="@android:style/Theme.NoDisplay"
+ android:exported="true"
android:excludeFromRecents="true">
<intent-filter>
<action android:name="android.telecom.action.CONFIGURE_PHONE_ACCOUNT" />
@@ -539,6 +582,7 @@
android:launchMode="singleTop"
android:configChanges="orientation|screenSize|keyboardHidden"
android:uiOptions="splitActionBarWhenNarrow"
+ android:exported="true"
android:parentActivityName="com.android.phone.CallFeaturesSetting" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -551,7 +595,8 @@
android:uiOptions="splitActionBarWhenNarrow">
</activity>
- <service android:name="com.android.services.telephony.sip.components.TelephonySipService">
+ <service android:name="com.android.services.telephony.sip.components.TelephonySipService"
+ android:exported="true">
<intent-filter>
<action android:name="android.net.sip.action.START_SIP" />
</intent-filter>
@@ -568,6 +613,7 @@
<activity android:name="com.android.phone.settings.PhoneAccountSettingsActivity"
android:label="@string/phone_accounts"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter>
<action android:name="android.telecom.action.CHANGE_PHONE_ACCOUNTS" />
@@ -579,6 +625,7 @@
android:label="@string/voicemail"
android:configChanges="orientation|screenSize|keyboardHidden|screenLayout"
android:screenOrientation="portrait"
+ android:exported="true"
android:theme="@style/DialerSettingsLight">
<intent-filter >
<!-- DO NOT RENAME. There are existing apps which use this string. -->
@@ -596,6 +643,7 @@
android:singleUser="true"
android:name="com.android.services.telephony.TelephonyConnectionService"
android:label="@string/pstn_connection_service_label"
+ android:exported="true"
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE" >
<intent-filter>
<action android:name="android.telecom.ConnectionService" />
@@ -638,12 +686,14 @@
android:name="com.android.phone.vvm.RemoteVvmTaskManager"
android:exported="false"/>
<service android:name="com.android.internal.telephony.CellularNetworkService"
+ android:exported="true"
android:permission="android.permission.BIND_TELEPHONY_NETWORK_SERVICE" >
<intent-filter>
<action android:name="android.telephony.NetworkService" />
</intent-filter>
</service>
<service android:name="com.android.internal.telephony.dataconnection.CellularDataService"
+ android:exported="true"
android:permission="android.permission.BIND_TELEPHONY_DATA_SERVICE" >
<intent-filter>
<action android:name="android.telephony.data.DataService" />
@@ -653,6 +703,7 @@
<activity
android:name=".settings.RadioInfo"
android:label="@string/phone_info_label"
+ android:exported="true"
android:theme="@style/Theme.AppCompat.DayNight">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -662,6 +713,7 @@
<activity android:name=".settings.BandMode"
android:label="@string/band_mode_title"
+ android:exported="true"
android:theme="@style/Theme.AppCompat.DayNight">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/TEST_MAPPING b/TEST_MAPPING
index e75dcb0..75b9d49 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -7,6 +7,9 @@
"exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
+ },
+ {
+ "name": "CarrierAppIntegrationTestCases"
}
]
}
diff --git a/res/layout/radio_info.xml b/res/layout/radio_info.xml
index 71cd32a..72627a3 100644
--- a/res/layout/radio_info.xml
+++ b/res/layout/radio_info.xml
@@ -334,11 +334,6 @@
android:background="?android:attr/listDivider" />
<!-- CellInfoListRate Selection -->
- <!-- Location -->
- <LinearLayout style="@style/RadioInfo_entry_layout">
- <TextView android:text="@string/radio_info_signal_location_label" style="@style/info_label" />
- <TextView android:id="@+id/location" style="@style/info_value" />
- </LinearLayout>
<TextView
android:layout_width="match_parent"
diff --git a/res/layout/sim_ndp.xml b/res/layout/sim_ndp.xml
index 5f03d7b..e16f99a 100644
--- a/res/layout/sim_ndp.xml
+++ b/res/layout/sim_ndp.xml
@@ -35,6 +35,13 @@
android:layout_height="wrap_content"
android:text="@string/label_ndp"/>
+ <TextView
+ android:id="@+id/perso_phoneid_text"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/label_phoneid"/>
+
<EditText android:id="@+id/pin_entry"
android:inputType="textPassword"
android:imeOptions="actionDone"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 600b497..74169e6 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -95,7 +95,7 @@
<string name="sum_loading_settings" msgid="434063780286688775">"Laai tans instellings..."</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"Nommer versteek in uitgaande oproepe"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Nommer wat vertoon in uitgaande oproepe"</string>
- <string name="sum_default_caller_id" msgid="1767070797135682959">"Gebruik verstekbeheerinstellings om my nommer te vertoon in uitgaande oproepe"</string>
+ <string name="sum_default_caller_id" msgid="1767070797135682959">"Gebruik verstek beheerinstellings om my nommer te vertoon in uitgaande oproepe"</string>
<string name="labelCW" msgid="8449327023861428622">"Oproep wag"</string>
<string name="sum_cw_enabled" msgid="3977308526187139996">"Stel my tydens \'n oproep in kennis van inkomende oproepe"</string>
<string name="sum_cw_disabled" msgid="3658094589461768637">"Stel my tydens \'n oproep in kennis van inkomende oproepe"</string>
@@ -141,7 +141,7 @@
<string name="close_dialog" msgid="1074977476136119408">"OK"</string>
<string name="enable" msgid="2636552299455477603">"Skakel aan"</string>
<string name="disable" msgid="1122698860799462116">"Skakel af"</string>
- <string name="change_num" msgid="6982164494063109334">"Dateer op"</string>
+ <string name="change_num" msgid="6982164494063109334">"Opdateer"</string>
<string-array name="clir_display_values">
<item msgid="8477364191403806960">"Netwerkverstek"</item>
<item msgid="6813323051965618926">"Versteek nommer"</item>
@@ -307,7 +307,9 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Datagebruiksperiode"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Datatempobeleid"</string>
<string name="throttle_help" msgid="2624535757028809735">"Kom meer te wete"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) van <xliff:g id="USED_2">%3$s</xliff:g> periode se maksimum\nVolgende periode begin oor <xliff:g id="USED_3">%4$d</xliff:g> dae (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) van <xliff:g id="USED_2">%3$s</xliff:g> tydperk se maksimum"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> maksimum oorskry\nDatatempo verminder na <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ van siklus het verloop\nVolgende periode begin oor <xliff:g id="USED_1">%2$d</xliff:g> dae (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -637,12 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ja"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Nee"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Maak toe"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Die foon is in noodterugbelmodus"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Tot <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Die foon sal in noodterugbelmodus wees vir <xliff:g id="COUNT_1">%s</xliff:g> minute.\nWil jy nou uitgaan?</item>
- <item quantity="one">Die foon sal in noodterugbelmodus wees vir <xliff:g id="COUNT_0">%s</xliff:g> minuut.\nWil jy nou uitgaan?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Diens"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Opstelling"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Nie gestel nie>"</string>
@@ -898,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Herlaai"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Wissel DNS-kontrole"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-spesifieke inligting/instellings"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC is beskikbaar:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR is beperk:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR is beskikbaar:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR-status:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR-frekwensie:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Stel radiobandmodus"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Laai tans bandlys …"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Stel"</string>
diff --git a/res/values-am/arrays.xml b/res/values-am/arrays.xml
index 9d43d58..f5cfebf 100644
--- a/res/values-am/arrays.xml
+++ b/res/values-am/arrays.xml
@@ -18,7 +18,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="preferred_network_mode_choices_world_mode">
- <item msgid="8359756926680194770">"ዓለምአቀፍ"</item>
+ <item msgid="8359756926680194770">"አለምአቀፍ"</item>
<item msgid="7497128470871581354">"LTE / CDMA"</item>
<item msgid="1732367262765147258">"LTE / GSM / UMTS"</item>
</string-array>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 719d30e..cecf2aa 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"የመለያ ቅንብሮችን ይውቀሩ"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"የሁሉም ደዋይ መለያዎች"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"የትኛዎቹ መለያዎች ጥሪዎችን ማድረግ እንደሚችሉ ይምረጡ"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"የWi-Fi ጥሪ"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"የWi-Fi ጥሪ ማድረጊያ"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"አብሮ የተገነባ የግንኙነት አገልግሎት"</string>
<string name="voicemail" msgid="7697769412804195032">"የድምፅ መልዕክት"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"የድምጽ መልዕክት (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -236,7 +236,7 @@
<string name="preferred_network_mode_lte_gsm_wcdma_summary" msgid="2217794334331254936">"ተመራጭ የአውታረመረብ ሁኔታ: GSM/WCDMA/LTE"</string>
<string name="preferred_network_mode_lte_cdma_evdo_summary" msgid="5559198623419981805">"ተመራጭ የአውታረመረብ ሁኔታ ፡ CDMA+LTE/EVDO"</string>
<string name="preferred_network_mode_lte_cdma_evdo_gsm_wcdma_summary" msgid="6707224437925495615">"የተመረጠው የአውታረ መረብ ሁነታ፦ LTE/CDMA/EvDo/GSM/WCDMA"</string>
- <string name="preferred_network_mode_global_summary" msgid="3847086258439582411">"ተመራጭ የአውታረመረብ ፡ ዓለምአቀፍ"</string>
+ <string name="preferred_network_mode_global_summary" msgid="3847086258439582411">"ተመራጭ የአውታረመረብ ፡ አለምአቀፍ"</string>
<string name="preferred_network_mode_lte_wcdma_summary" msgid="7001804022020813865">"ተመራጭ የአውታረመረብ ሁኔታ፡ LTE / WCDMA"</string>
<string name="preferred_network_mode_lte_gsm_umts_summary" msgid="6484203890156282179">"ተመራጭ የአውታረ መረብ ሁነታ፦ LTE / GSM / UMTS"</string>
<string name="preferred_network_mode_lte_cdma_summary" msgid="8187929456614068518">"ተመራጭ የአውታረመረብ ፡LTE / CDMA ሁነታ"</string>
@@ -403,7 +403,7 @@
<string name="network_recommended" msgid="3444321100580250926">" (የሚመከር)"</string>
<string name="network_lte" msgid="7206879277095094280">"LTE (የሚመከር)"</string>
<string name="network_4G" msgid="6800527815504223913">"4G (የሚመከር)"</string>
- <string name="network_global" msgid="3289646154407617631">"ዓለምአቀፍ"</string>
+ <string name="network_global" msgid="3289646154407617631">"አለምአቀፍ"</string>
<string name="cdma_system_select_title" msgid="614165233552656431">"የሥርዓት ምርጫ"</string>
<string name="cdma_system_select_summary" msgid="3840420390242060407">"የCDMA በእንቅስቃሴ ላይ ሁኔታ ለውጥ"</string>
<string name="cdma_system_select_dialogtitle" msgid="5524639510676501802">"የሥርዓት ምርጫ"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"አዎ"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"አይ"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"አሰናብት"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ስልኩ የአደጋ ጊዜ ተዘዋዋሪ ጥሪ ሁነታ ውስጥ ነው ያለው።"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"እስከ <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">ስልኩ ለ<xliff:g id="COUNT_1">%s</xliff:g> ደቂቃዎች የአደጋ ጊዜ ተዘዋዋሪ ጥሪ ሁነታ ውስጥ ይሆናል።\nአሁን መውጣት ይፈልጋሉ?</item>
- <item quantity="other">ስልኩ ለ<xliff:g id="COUNT_1">%s</xliff:g> ደቂቃዎች የአደጋ ጊዜ ተዘዋዋሪ ጥሪ ሁነታ ውስጥ ይሆናል።\nአሁን መውጣት ይፈልጋሉ?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"አገልግሎት"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"አዋቅር"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<አልተዘጋጀም >"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"አድስ"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"የDNS ፍተሻን ቀያይር"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-የተወሰነ መረጃ/ቅንብሮች"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC ይገኛል፦"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR ተገድቧል፦"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR ይገኛል፦"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR ሁኔታ፦"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR ድግግሞሽ፦"</string>
<string name="band_mode_title" msgid="7988822920724576842">"የሬዲዮ ባንድ ሁነታን ያቀናጁ"</string>
<string name="band_mode_loading" msgid="795923726636735967">"የባንድ ዝርዝርን በመጫን ላይ…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"አዋቅር"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 6cd92a3..9e0bad9 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -33,7 +33,7 @@
<string name="cancel" msgid="8984206397635155197">"إلغاء"</string>
<string name="enter_input" msgid="6193628663039958990">"يجب أن تتراوح حروف رسالة USSD بين <xliff:g id="MIN_LEN">%1$d</xliff:g> و<xliff:g id="MAX_LEN">%2$d</xliff:g>. يُرجى إعادة المحاولة."</string>
<string name="manageConferenceLabel" msgid="8415044818156353233">"إدارة مكالمة جماعية"</string>
- <string name="ok" msgid="7818974223666140165">"حسنًا"</string>
+ <string name="ok" msgid="7818974223666140165">"موافق"</string>
<string name="audio_mode_speaker" msgid="243689733219312360">"مكبر الصوت"</string>
<string name="audio_mode_earpiece" msgid="2823700267171134282">"سماعة الأذن للهاتف"</string>
<string name="audio_mode_wired_headset" msgid="5028010823105817443">"سماعة رأس سلكية"</string>
@@ -71,7 +71,7 @@
<string name="phone_accounts_choose_accounts" msgid="4748805293314824974">"اختيار الحسابات"</string>
<string name="phone_accounts_selection_header" msgid="2945830843104108440">"حسابات الهاتف"</string>
<string name="phone_accounts_add_sip_account" msgid="1437634802033309305">"إضافة حساب SIP"</string>
- <string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"ضبط إعدادات الحساب"</string>
+ <string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"تهيئة إعدادات الحساب"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"كل حسابات الاتصال"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"حدد الحسابات التي يمكنها إجراء مكالمات"</string>
<string name="wifi_calling" msgid="3650509202851355742">"الاتصال عبر Wi-Fi"</string>
@@ -118,7 +118,7 @@
<string name="sum_cfnry_enabled" msgid="3000500837493854799">"إعادة التوجيه إلى <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfnry_disabled" msgid="1990563512406017880">"غير مفعّل"</string>
<string name="disable_cfnry_forbidden" msgid="3174731413216550689">"لا يتيح مشغل شبكة الجوال إيقاف اعادة توجيه المكالمة عند عدم رد هاتفك."</string>
- <string name="labelCFNRc" msgid="4163399350778066013">"عند تعذر الوصول"</string>
+ <string name="labelCFNRc" msgid="4163399350778066013">"عند عدم الوصول"</string>
<string name="messageCFNRc" msgid="6980340731313007250">"الرقم عند عدم الوصول"</string>
<string name="sum_cfnrc_enabled" msgid="1799069234006073477">"إعادة التوجيه إلى <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfnrc_disabled" msgid="739289696796917683">"غير مفعّل"</string>
@@ -128,7 +128,7 @@
<string name="call_settings_with_label" msgid="8460230435361579511">"الإعدادات (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"خطأ في إعدادات الاتصال"</string>
<string name="reading_settings" msgid="1605904432450871183">"جارٍ قراءة الإعدادات..."</string>
- <string name="updating_settings" msgid="3650396734816028808">"جارٍ تعديل الإعدادات..."</string>
+ <string name="updating_settings" msgid="3650396734816028808">"جارٍ إعادة تحميل الإعدادات..."</string>
<string name="reverting_settings" msgid="7378668837291012205">"جارٍ إعادة الإعدادات..."</string>
<string name="response_error" msgid="3904481964024543330">"رد غير متوقع من الشبكة."</string>
<string name="exception_error" msgid="330994460090467">"خطأ في الشبكة أو في شريحة SIM"</string>
@@ -136,12 +136,12 @@
<string name="stk_cc_ss_to_ussd_error" msgid="8330749347425752192">"تم تغيير طلب SS إلى طلب USSD"</string>
<string name="stk_cc_ss_to_ss_error" msgid="8297155544652134278">"تم التغيير إلى طلب SS جديد"</string>
<string name="stk_cc_ss_to_dial_video_error" msgid="4255261231466032505">"تم تغيير طلب SS إلى مكالمة فيديو"</string>
- <string name="fdn_check_failure" msgid="1833769746374185247">"تم تفعيل إعداد أرقام الاتصال الثابتة بالتطبيق المثبت على هاتفك. ونتيجة لذلك، لن تعمل بعض الميزات المرتبطة بالمكالمات."</string>
- <string name="radio_off_error" msgid="8321564164914232181">"فعِّل اللاسلكي قبل عرض هذه الإعدادات."</string>
- <string name="close_dialog" msgid="1074977476136119408">"حسنًا"</string>
+ <string name="fdn_check_failure" msgid="1833769746374185247">"تم تشغيل إعداد أرقام الاتصال الثابتة بالتطبيق المثبت على هاتفك. ونتيجة لذلك، لن تعمل بعض الميزات المرتبطة بالمكالمات."</string>
+ <string name="radio_off_error" msgid="8321564164914232181">"شغّل اللاسلكي قبل عرض هذه الإعدادات."</string>
+ <string name="close_dialog" msgid="1074977476136119408">"موافق"</string>
<string name="enable" msgid="2636552299455477603">"تفعيل"</string>
<string name="disable" msgid="1122698860799462116">"إيقاف"</string>
- <string name="change_num" msgid="6982164494063109334">"تحديث"</string>
+ <string name="change_num" msgid="6982164494063109334">"إعادة تحميل"</string>
<string-array name="clir_display_values">
<item msgid="8477364191403806960">"الشبكة التلقائية"</item>
<item msgid="6813323051965618926">"إخفاء الرقم"</item>
@@ -174,7 +174,7 @@
<string name="connect_later" msgid="1950138106010005425">"يتعذر الاتصال بهذه الشبكة في الوقت الحالي. حاول مرة أخرى لاحقًا."</string>
<string name="registration_done" msgid="5337407023566953292">"مسجل على الشبكة."</string>
<string name="already_auto" msgid="8607068290733079336">"في التحديد التلقائي فعلاً."</string>
- <string name="select_automatically" msgid="779750291257872651">"اختيار الشبكة تلقائيًا"</string>
+ <string name="select_automatically" msgid="779750291257872651">"تحديد الشبكة تلقائيًا"</string>
<string name="manual_mode_disallowed_summary" msgid="3970048592179890197">"الشبكات غير متاحة عند الاتصال بمشغِّل شبكة الجوّال %1$s."</string>
<string name="network_select_title" msgid="4117305053881611988">"الشبكة"</string>
<string name="register_automatically" msgid="3907580547590554834">"التسجيل التلقائي..."</string>
@@ -294,7 +294,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">"بيانات الجوّال"</string>
<string name="mobile_data_settings_summary" msgid="5012570152029118471">"الوصول إلى البيانات باستخدام شبكة الجوّال"</string>
- <string name="data_usage_disable_mobile" msgid="5669109209055988308">"هل تريد إيقاف بيانات الجوّال؟"</string>
+ <string name="data_usage_disable_mobile" msgid="5669109209055988308">"هل تريد إيقاف تفعيل بيانات الجوّال؟"</string>
<string name="sim_selection_required_pref" msgid="6985901872978341314">"يلزم التحديد"</string>
<string name="sim_change_data_title" msgid="9142726786345906606">"هل تريد تغيير شريحة SIM للبيانات؟"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"هل تريد استخدام <xliff:g id="NEW_SIM">%1$s</xliff:g> بدلاً من <xliff:g id="OLD_SIM">%2$s</xliff:g> لبيانات الجوّال؟"</string>
@@ -344,7 +344,7 @@
<string name="international_enable" msgid="8943466745792690340">"تم تفعيل الأخبار الدولية"</string>
<string name="international_disable" msgid="4803498658100318265">"تم إيقاف الأخبار الدولية"</string>
<string name="list_language_title" msgid="1850167908665485738">"اللغة"</string>
- <string name="list_language_summary" msgid="7921756070782277559">"اختَر لغة الأخبار"</string>
+ <string name="list_language_summary" msgid="7921756070782277559">"حدد لغة الأخبار"</string>
<string-array name="list_language_entries">
<item msgid="2347238508726934281">"الإنجليزية"</item>
<item msgid="5172468397620875174">"الفرنسية"</item>
@@ -459,19 +459,19 @@
<string name="adding_fdn_contact" msgid="3112531600824361259">"جارٍ إضافة رقم الاتصال الثابت..."</string>
<string name="fdn_contact_added" msgid="2840016151693394596">"تمت إضافة رقم الاتصال الثابت."</string>
<string name="edit_fdn_contact" msgid="6030829994819587408">"تعديل رقم الاتصال الثابت"</string>
- <string name="updating_fdn_contact" msgid="6989341376868227150">"جارٍ تحديث رقم الاتصال الثابت..."</string>
- <string name="fdn_contact_updated" msgid="6876330243323118937">"تم تحديث رقم الاتصال الثابت."</string>
+ <string name="updating_fdn_contact" msgid="6989341376868227150">"جارٍ إعادة تحميل رقم الاتصال الثابت..."</string>
+ <string name="fdn_contact_updated" msgid="6876330243323118937">"تمت إعادة تحميل رقم الاتصال الثابت."</string>
<string name="delete_fdn_contact" msgid="7027405651994507077">"حذف رقم الاتصال الثابت"</string>
<string name="deleting_fdn_contact" msgid="6872320570844460428">"جارٍ حذف رقم الاتصال الثابت..."</string>
<string name="fdn_contact_deleted" msgid="1680714996763848838">"تم حذف رقم الاتصال الثابت."</string>
- <string name="pin2_invalid" msgid="2313954262684494442">"لم يتم تحديث FDN لأنك كتبت رقم تعريف شخصي غير صحيح."</string>
- <string name="fdn_invalid_number" msgid="9067189814657840439">"لم يتم تحديث FDN نظرًا لأن الرقم يتجاوز طوله <xliff:g id="FDN_NUMBER_LIMIT_LENGTH">%d</xliff:g> رقمًا."</string>
- <string name="pin2_or_fdn_invalid" msgid="7542639487955868181">"لم يتم تحديث FDN. رقم PIN2 غير صحيح، أو تم رفض رقم الهاتف."</string>
+ <string name="pin2_invalid" msgid="2313954262684494442">"لم يتم إعادة تحميل FDN لأنك كتبت رقم تعريف شخصي غير صحيح."</string>
+ <string name="fdn_invalid_number" msgid="9067189814657840439">"لم يتم إعادة تحميل FDN نظرًا لأن الرقم يتجاوز طوله <xliff:g id="FDN_NUMBER_LIMIT_LENGTH">%d</xliff:g> رقمًا."</string>
+ <string name="pin2_or_fdn_invalid" msgid="7542639487955868181">"لم يتم إعادة تحميل FDN. رقم PIN2 غير صحيح، أو تم رفض رقم الهاتف."</string>
<string name="fdn_failed" msgid="216592346853420250">"تعذّر إتمام عملية FDN!"</string>
<string name="simContacts_emptyLoading" msgid="4989040293858675483">"جارٍ القراءة من شريحة SIM..."</string>
<string name="simContacts_empty" msgid="1135632055473689521">"ليس هناك جهات اتصال على شريحة SIM."</string>
<string name="simContacts_title" msgid="2714029230160136647">"حدد جهات اتصال لاستيرادها"</string>
- <string name="simContacts_airplaneMode" msgid="4654884030631503808">"عليك إيقاف وضع الطيران لاستيراد جهات الاتصال من شريحة SIM."</string>
+ <string name="simContacts_airplaneMode" msgid="4654884030631503808">"عليك إيقاف وضع الطائرة لاستيراد جهات الاتصال من شريحة SIM."</string>
<string name="enable_pin" msgid="967674051730845376">"تفعيل/إيقاف رمز PIN لبطاقة SIM"</string>
<string name="change_pin" msgid="3657869530942905790">"تغيير رمز PIN لبطاقة SIM"</string>
<string name="enter_pin_text" msgid="3182311451978663356">"رمز PIN لبطاقة SIM:"</string>
@@ -484,10 +484,10 @@
<string name="disable_sim_pin" msgid="3112303905548613752">"محو رقم التعريف الشخصي لبطاقة SIM"</string>
<string name="enable_sim_pin" msgid="445461050748318980">"تعيين رقم التعريف الشخصي لبطاقة SIM"</string>
<string name="enable_in_progress" msgid="4135305985717272592">"جارٍ تعيين رقم التعريف الشخصي…"</string>
- <string name="enable_pin_ok" msgid="2877428038280804256">"تم ضبط رقم التعريف الشخصي"</string>
+ <string name="enable_pin_ok" msgid="2877428038280804256">"تم تعيين رقم التعريف الشخصي"</string>
<string name="disable_pin_ok" msgid="888505244389647754">"تم محو رقم التعريف الشخصي"</string>
<string name="pin_failed" msgid="4527347792881939652">"رقم التعريف الشخصي غير صحيح"</string>
- <string name="pin_changed" msgid="7291153750090452808">"تم تحديث رقم التعريف الشخصي"</string>
+ <string name="pin_changed" msgid="7291153750090452808">"تمت إعادة تحميل رقم التعريف الشخصي"</string>
<string name="puk_requested" msgid="2061337960609806851">"كلمة المرور غير صحيحة. تم قفل رقم التعريف الشخصي الآن. رمز PUK مطلوب."</string>
<string name="enter_pin2_text" msgid="7266379426804295979">"PIN2"</string>
<string name="oldPin2Label" msgid="4648543187859997203">"PIN2 القديم"</string>
@@ -498,7 +498,7 @@
<string name="mismatchPin2" msgid="4952718725266700631">"رمزا PIN2 غير متطابقين. أعد المحاولة."</string>
<string name="invalidPin2" msgid="6467957903056379343">"أدخل رمز PIN2 المكوّن من 4 إلى 8 أرقام."</string>
<string name="invalidPuk2" msgid="713729511903849544">"أدخل رمز PUK2 المكوّن من 8 أرقام."</string>
- <string name="pin2_changed" msgid="5710551850481287821">"تم تحديث رمز PIN2"</string>
+ <string name="pin2_changed" msgid="5710551850481287821">"تمت إعادة تحميل رمز PIN2"</string>
<string name="label_puk2_code" msgid="2852217004288085562">"أدخل رمز PUK2"</string>
<string name="fdn_enable_puk2_requested" msgid="5793652792131588041">"كلمة المرور غير صحيحة. أصبح PIN2 محظور الآن. لإعادة المحاولة، عليك تغيير PIN2."</string>
<string name="puk2_requested" msgid="6992374450720307514">"كلمة المرور غير صحيحة. تم قفل شريحة SIM الآن. أدخل رمز PUK2."</string>
@@ -522,9 +522,9 @@
<string name="notification_voicemail_no_vm_number" msgid="3423686009815186750">"رقم البريد الصوتي غير معروف"</string>
<string name="notification_network_selection_title" msgid="255595526707809121">"لا خدمة"</string>
<string name="notification_network_selection_text" msgid="553288408722427659">"الشبكة المحدّدة (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) غير مُتاحة"</string>
- <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"شغَّل شبكة الجوال، ثم أوقف تفعيل وضع الطيران أو أوقف تفعيل وضع توفير شحن البطارية لإجراء مكالمة."</string>
- <string name="incall_error_power_off" product="default" msgid="8131672264311208673">"عليك إيقاف وضع الطيران لإجراء مكالمة."</string>
- <string name="incall_error_power_off_wfc" msgid="9125661184694727052">"عليك إيقاف وضع الطيران أو الاتصال بشبكة لاسلكية لإجراء مكالمة."</string>
+ <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"شغَّل شبكة الجوال، ثم أوقف تفعيل وضع الطائرة أو أوقف تفعيل وضع توفير شحن البطارية لإجراء مكالمة."</string>
+ <string name="incall_error_power_off" product="default" msgid="8131672264311208673">"عليك إيقاف وضع الطائرة لإجراء مكالمة."</string>
+ <string name="incall_error_power_off_wfc" msgid="9125661184694727052">"عليك إيقاف وضع الطائرة أو الاتصال بشبكة لاسلكية لإجراء مكالمة."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"ينبغي الخروج من وضع معاودة الاتصال بالطوارئ لإجراء مكالمة غير طارئة."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"غير مسجل على الشبكة."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"شبكة الجوال غير متاحة."</string>
@@ -552,7 +552,7 @@
<string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"انقر مجددًا للاتصال بالرقم <xliff:g id="EMERGENCY_NUMBER">%s</xliff:g>"</string>
<string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"جارٍ تفعيل اللاسلكي..."</string>
<string name="emergency_enable_radio_dialog_retry" msgid="4329131876852608587">"لا تتوفر خدمة. جارٍ إعادة المحاولة…"</string>
- <string name="radio_off_during_emergency_call" msgid="8011154134040481609">"لا يمكن دخول وضع الطيران أثناء إجراء مكالمة طوارئ."</string>
+ <string name="radio_off_during_emergency_call" msgid="8011154134040481609">"لا يمكن دخول وضع الطائرة أثناء إجراء مكالمة طوارئ."</string>
<string name="dial_emergency_error" msgid="825822413209026039">"يتعذر الاتصال. لا يعد <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> رقم طوارئ."</string>
<string name="dial_emergency_empty_error" msgid="2785803395047793634">"يتعذر الاتصال. يمكنك طلب رقم طوارئ."</string>
<string name="dial_emergency_calling_not_available" msgid="6485846193794727823">"مكالمة الطوارئ غير متوفرة"</string>
@@ -633,36 +633,26 @@
<item quantity="one">سيكون الهاتف في وضع الرد على مكالمة الطوارئ لمدة <xliff:g id="COUNT_0">%s</xliff:g> دقيقة. وأثناء هذا الوضع، لا يمكن استخدام أي تطبيقات تستخدم اتصال بيانات. هل تريد الخروج الآن؟</item>
</plurals>
<plurals name="alert_dialog_not_avaialble_in_ecm" formatted="false" msgid="1152682528741457004">
- <item quantity="zero">الإجراء المحدد ليس متاحًا أثناء تفعيل وضع الرد على مكالمة الطوارئ. وسيكون الهاتف في هذا الوضع لمدة <xliff:g id="COUNT_1">%s</xliff:g> من الدقائق. هل تريد الخروج الآن؟</item>
- <item quantity="two">الإجراء المحدد ليس متاحًا أثناء تفعيل وضع الرد على مكالمة الطوارئ. وسيكون الهاتف في هذا الوضع لمدة دقيقتين (<xliff:g id="COUNT_1">%s</xliff:g>). هل تريد الخروج الآن؟</item>
- <item quantity="few">الإجراء المحدد ليس متاحًا أثناء تفعيل وضع الرد على مكالمة الطوارئ. وسيكون الهاتف في هذا الوضع لمدة <xliff:g id="COUNT_1">%s</xliff:g> دقائق. هل تريد الخروج الآن؟</item>
- <item quantity="many">الإجراء المحدد ليس متاحًا أثناء تفعيل وضع الرد على مكالمة الطوارئ. وسيكون الهاتف في هذا الوضع لمدة <xliff:g id="COUNT_1">%s</xliff:g> دقيقة. هل تريد الخروج الآن؟</item>
- <item quantity="other">الإجراء المحدد ليس متاحًا أثناء تفعيل وضع الرد على مكالمة الطوارئ. وسيكون الهاتف في هذا الوضع لمدة <xliff:g id="COUNT_1">%s</xliff:g> من الدقائق. هل تريد الخروج الآن؟</item>
- <item quantity="one">الإجراء المحدد ليس متاحًا أثناء تفعيل وضع الرد على مكالمة الطوارئ. وسيكون الهاتف في هذا الوضع لمدة <xliff:g id="COUNT_0">%s</xliff:g> دقيقة. هل تريد الخروج الآن؟</item>
+ <item quantity="zero">الإجراء المحدد ليس متاحًا أثناء تشغيل وضع الرد على مكالمة الطوارئ. وسيكون الهاتف في هذا الوضع لمدة <xliff:g id="COUNT_1">%s</xliff:g> من الدقائق. هل تريد الخروج الآن؟</item>
+ <item quantity="two">الإجراء المحدد ليس متاحًا أثناء تشغيل وضع الرد على مكالمة الطوارئ. وسيكون الهاتف في هذا الوضع لمدة دقيقتين (<xliff:g id="COUNT_1">%s</xliff:g>). هل تريد الخروج الآن؟</item>
+ <item quantity="few">الإجراء المحدد ليس متاحًا أثناء تشغيل وضع الرد على مكالمة الطوارئ. وسيكون الهاتف في هذا الوضع لمدة <xliff:g id="COUNT_1">%s</xliff:g> دقائق. هل تريد الخروج الآن؟</item>
+ <item quantity="many">الإجراء المحدد ليس متاحًا أثناء تشغيل وضع الرد على مكالمة الطوارئ. وسيكون الهاتف في هذا الوضع لمدة <xliff:g id="COUNT_1">%s</xliff:g> دقيقة. هل تريد الخروج الآن؟</item>
+ <item quantity="other">الإجراء المحدد ليس متاحًا أثناء تشغيل وضع الرد على مكالمة الطوارئ. وسيكون الهاتف في هذا الوضع لمدة <xliff:g id="COUNT_1">%s</xliff:g> من الدقائق. هل تريد الخروج الآن؟</item>
+ <item quantity="one">الإجراء المحدد ليس متاحًا أثناء تشغيل وضع الرد على مكالمة الطوارئ. وسيكون الهاتف في هذا الوضع لمدة <xliff:g id="COUNT_0">%s</xliff:g> دقيقة. هل تريد الخروج الآن؟</item>
</plurals>
<string name="alert_dialog_in_ecm_call" msgid="1207545603149771978">"الإجراء المحدد ليس متاحًا أثناء إجراء اتصال بالطوارئ."</string>
<string name="progress_dialog_exiting_ecm" msgid="9159080081676927217">"الخروج من وضع معاودة الاتصال بالطوارئ"</string>
<string name="alert_dialog_yes" msgid="3532525979632841417">"نعم"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"لا"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"استبعاد"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"الهاتف في وضع معاودة الاتصال بالطوارئ."</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"حتى <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="zero">سيكون الهاتف في وضع معاودة الاتصال بالطوارئ لمدة <xliff:g id="COUNT_1">%s</xliff:g> دقيقة.\nهل تريد الخروج الآن؟</item>
- <item quantity="two">سيكون الهاتف في وضع معاودة الاتصال بالطوارئ لمدة دقيقتين (<xliff:g id="COUNT_1">%s</xliff:g>).\nهل تريد الخروج الآن؟</item>
- <item quantity="few">سيكون الهاتف في وضع معاودة الاتصال بالطوارئ لمدة <xliff:g id="COUNT_1">%s</xliff:g> دقائق.\nهل تريد الخروج الآن؟</item>
- <item quantity="many">سيكون الهاتف في وضع معاودة الاتصال بالطوارئ لمدة <xliff:g id="COUNT_1">%s</xliff:g> دقيقة.\nهل تريد الخروج الآن؟</item>
- <item quantity="other">سيكون الهاتف في وضع معاودة الاتصال بالطوارئ لمدة <xliff:g id="COUNT_1">%s</xliff:g> دقيقة.\nهل تريد الخروج الآن؟</item>
- <item quantity="one">سيكون الهاتف في وضع معاودة الاتصال بالطوارئ لمدة دقيقة (<xliff:g id="COUNT_0">%s</xliff:g>).\nهل تريد الخروج الآن؟</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"الخدمة"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"الإعداد"</string>
- <string name="voicemail_number_not_set" msgid="8831561283386938155">"<لم يتم الضبط>"</string>
+ <string name="voicemail_number_not_set" msgid="8831561283386938155">"<لم يتم التعيين>"</string>
<string name="other_settings" msgid="8895088007393598447">"اعدادات المكالمات الاخرى"</string>
<string name="calling_via_template" msgid="1791323450703751750">"الاتصال عبر <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
<string name="contactPhoto" msgid="7885089213135154834">"صورة جهة الاتصال"</string>
<string name="goPrivate" msgid="4645108311382209551">"انتقال إلى مكالمة خاصة"</string>
- <string name="selectContact" msgid="1527612842599767382">"اختيار جهة اتصال"</string>
+ <string name="selectContact" msgid="1527612842599767382">"تحديد جهة اتصال"</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>
@@ -672,14 +662,14 @@
<string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"تغيير رقم التعريف الشخصي"</string>
<string name="preference_category_ringtone" msgid="8787281191375434976">"نغمة الرنين والاهتزاز"</string>
<string name="pstn_connection_service_label" msgid="9200102709997537069">"بطاقات SIM مدمجة"</string>
- <string name="enable_video_calling_title" msgid="7246600931634161830">"تفعيل مكالمات الفيديو"</string>
- <string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"لتفعيل مكالمات الفيديو، يجب عليك تفعيل وضع 4G LTE المحسّن في إعدادات الشبكة."</string>
+ <string name="enable_video_calling_title" msgid="7246600931634161830">"تشغيل مكالمات الفيديو"</string>
+ <string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"لتشغيل مكالمات الفيديو، يجب عليك تفعيل وضع 4G LTE المحسّن في إعدادات الشبكة."</string>
<string name="enable_video_calling_dialog_settings" msgid="8697890611305307110">"إعدادات الشبكة"</string>
<string name="enable_video_calling_dialog_close" msgid="4298929725917045270">"إغلاق"</string>
<string name="sim_label_emergency_calls" msgid="9078241989421522310">"مكالمات الطوارئ"</string>
<string name="sim_description_emergency_calls" msgid="5146872803938897296">"مكالمات الطوارئ فقط"</string>
<string name="sim_description_default" msgid="7474671114363724971">"شريحة SIM، المنفذ: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
- <string name="accessibility_settings_activity_title" msgid="7883415189273700298">"إعدادات تمكين الوصول"</string>
+ <string name="accessibility_settings_activity_title" msgid="7883415189273700298">"إمكانية الوصول"</string>
<string name="status_hint_label_incoming_wifi_call" msgid="2606052595898044071">"مكالمة Wi-Fi من"</string>
<string name="status_hint_label_wifi_call" msgid="942993035689809853">"مكالمة عبر Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="2762016865340891314">"انقر مرة أخرى للفتح."</string>
@@ -695,17 +685,17 @@
<string name="change_pin_title" msgid="3564254326626797321">"تغيير رقم التعريف الشخصي للبريد الصوتي"</string>
<string name="change_pin_continue_label" msgid="5177011752453506371">"متابعة"</string>
<string name="change_pin_cancel_label" msgid="2301711566758827936">"إلغاء"</string>
- <string name="change_pin_ok_label" msgid="6861082678817785330">"حسنًا"</string>
+ <string name="change_pin_ok_label" msgid="6861082678817785330">"موافق"</string>
<string name="change_pin_enter_old_pin_header" msgid="853151335217594829">"تأكيد رقم التعريف الشخصي القديم"</string>
<string name="change_pin_enter_old_pin_hint" msgid="8801292976275169367">"أدخل رقم التعريف الشخصي لبريدك الصوتي للمتابعة."</string>
<string name="change_pin_enter_new_pin_header" msgid="4739465616733486118">"تعيين رقم تعريف شخصي جديد"</string>
<string name="change_pin_enter_new_pin_hint" msgid="2326038476516364210">"ينبغي لرقم التعريف الشخصي أن يتكون من <xliff:g id="MIN">%1$d</xliff:g>-<xliff:g id="MAX">%2$d</xliff:g> أرقام."</string>
<string name="change_pin_confirm_pin_header" msgid="2606303906320705726">"تأكيد رقم التعريف الشخصي"</string>
<string name="change_pin_confirm_pins_dont_match" msgid="305164501222587215">"أرقام التعريف الشخصي غير متطابقة"</string>
- <string name="change_pin_succeeded" msgid="2504705600693014403">"تمّ تحديث رقم التعريف الشخصي للبريد الصوتي"</string>
+ <string name="change_pin_succeeded" msgid="2504705600693014403">"تمّ إعادة تحميل رقم التعريف الشخصي للبريد الصوتي"</string>
<string name="change_pin_system_error" msgid="7772788809875146873">"يتعذر تعيين رقم التعريف الشخصي"</string>
- <string name="mobile_data_status_roaming_turned_off_subtext" msgid="6840673347416227054">"تم إيقاف تجوال البيانات"</string>
- <string name="mobile_data_status_roaming_turned_on_subtext" msgid="5615757897768777865">"تم تفعيل تجوال البيانات"</string>
+ <string name="mobile_data_status_roaming_turned_off_subtext" msgid="6840673347416227054">"تم إيقاف تفعيل تجوال البيانات"</string>
+ <string name="mobile_data_status_roaming_turned_on_subtext" msgid="5615757897768777865">"تم تشغيل تجوال البيانات"</string>
<string name="mobile_data_status_roaming_without_plan_subtext" msgid="6536671968072284677">"التجوال قيد التشغيل حاليًا، يتطلب خطة بيانات"</string>
<string name="mobile_data_status_roaming_with_plan_subtext" msgid="2576177169108123095">"التجوال قيد التشغيل حاليًا، خطة البيانات نشطة"</string>
<string name="mobile_data_status_no_plan_subtext" msgid="170331026419263657">"لم تتبق أي بيانات جوال"</string>
@@ -719,7 +709,7 @@
<string name="mobile_data_activate_button" msgid="1139792516354374612">"إضافة بيانات"</string>
<string name="mobile_data_activate_cancel_button" msgid="3530174817572005860">"إلغاء"</string>
<string name="clh_card_title_call_ended_txt" msgid="5977978317527299698">"تم إنهاء الاتصال"</string>
- <string name="clh_callFailed_powerOff_txt" msgid="8279934912560765361">"تفعيل وضع الطيران"</string>
+ <string name="clh_callFailed_powerOff_txt" msgid="8279934912560765361">"تشغيل وضع الطائرة"</string>
<string name="clh_callFailed_simError_txt" msgid="5128538525762326413">"تعذر الوصول إلى شريحة SIM"</string>
<string name="clh_incall_error_out_of_service_txt" msgid="2736010617446749869">"شبكة الجوّال غير متوفرة"</string>
<string name="clh_callFailed_unassigned_number_txt" msgid="141967660286695682">"حدثت مشكلة في رقم الهاتف الذي تحاول الاتصال به. رمز الخطأ 1."</string>
@@ -910,11 +900,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"إعادة التحميل"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"تبديل فحص نظام أسماء النطاقات"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"المعلومات/الإعدادات المتعلّقة بالمصنّع الأصلي للجهاز"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC متوفر:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"تم حظر DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR متوفر:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"حالة NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"تردد NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"تحديد وضع النطاق اللاسلكي"</string>
<string name="band_mode_loading" msgid="795923726636735967">"جارٍ تحميل قائمة النطاقات…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"ضبط"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 764eb5c..f220afe 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"হয়"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"নহয়"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"অগ্ৰাহ্য কৰক"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ফ’নটো জৰুৰীকালীন কলবেক ম’ডত আছে"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> পৰ্যন্ত"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">ফ’নটো <xliff:g id="COUNT_1">%s</xliff:g> মিনিটৰ বাবে জৰুৰীকালীন কলবেক ম’ডত থাকিব।\nআপুনি এতিয়া বাহিৰ হ’বলৈ বিচাৰে নেকি?</item>
- <item quantity="other">ফ’নটো <xliff:g id="COUNT_1">%s</xliff:g> মিনিটৰ বাবে জৰুৰীকালীন কলবেক ম’ডত থাকিব।\nআপুনি এতিয়া বাহিৰ হ’বলৈ বিচাৰে নেকি?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"সেৱা"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"ছেট আপ কৰক"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<ছেট কৰা হোৱা নাই>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"ৰিফ্ৰেশ্ব কৰক"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS পৰীক্ষা ট’গল কৰক"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM বিশেষক তথ্য/ছেটিংসমূহ"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC উপলব্ধ:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR প্ৰতিবন্ধিত:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR উপলব্ধ:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR স্থিতি:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR ফ্ৰিকুৱেন্সী:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"ৰেডিঅ’ৰ বেণ্ড ম’ড ছেট কৰক"</string>
<string name="band_mode_loading" msgid="795923726636735967">"বেণ্ড সূচীখন ল’ড কৰি থকা হৈছে…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"ছেট কৰক"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 60829b2..a053ece 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -84,7 +84,7 @@
<string name="smart_forwarding_settings_menu_summary" msgid="5096947726032885325">"Nömrələrdən biri əlçatan olmadıqda zəngi digər nömrəyə yönləndirin"</string>
<string name="voicemail_notifications_preference_title" msgid="7829238858063382977">"Bildirişlər"</string>
<string name="cell_broadcast_settings" msgid="8135324242541809924">"Təcili yayımlar"</string>
- <string name="call_settings" msgid="3677282690157603818">"Zəng ayarları"</string>
+ <string name="call_settings" msgid="3677282690157603818">"Zəng parametrləri"</string>
<string name="additional_gsm_call_settings" msgid="1561980168685658846">"Əlavə ayarlar"</string>
<string name="additional_gsm_call_settings_with_label" msgid="7973920539979524908">"Əlavə parametrlər (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="sum_gsm_call_settings" msgid="7964692601608878138">"Əlavə GSM yalnız zəng parametrləri"</string>
@@ -123,11 +123,11 @@
<string name="sum_cfnrc_enabled" msgid="1799069234006073477">"<xliff:g id="PHONENUMBER">{0}</xliff:g> nömrəsinə yönləndirilir"</string>
<string name="sum_cfnrc_disabled" msgid="739289696796917683">"Deaktiv"</string>
<string name="disable_cfnrc_forbidden" msgid="775348748084726890">"Sizin mobil daşıyıcı telefon əlçatmaz olduğu zaman zəng yönləndirməni deaktiv etməyi dəstəkləmir."</string>
- <string name="updating_title" msgid="6130548922615719689">"Zəng ayarları"</string>
+ <string name="updating_title" msgid="6130548922615719689">"Zəng parametrləri"</string>
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"Zəng parametrləri yalnız admin olan istifadəçi tərəfindən dəyişdirilə bilər."</string>
<string name="call_settings_with_label" msgid="8460230435361579511">"Ayarlar ( <xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g> )"</string>
<string name="error_updating_title" msgid="2024290892676808965">"Zəng parametrləri xətası"</string>
- <string name="reading_settings" msgid="1605904432450871183">"Oxuma ayarları..."</string>
+ <string name="reading_settings" msgid="1605904432450871183">"Oxuma parametrləri ..."</string>
<string name="updating_settings" msgid="3650396734816028808">"Ayarlar güncəlləşdirilir…"</string>
<string name="reverting_settings" msgid="7378668837291012205">"Ayarlar qaytarılır..."</string>
<string name="response_error" msgid="3904481964024543330">"Şəbəkədən gözlənilməz cavab."</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Bəli"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Xeyr"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Kənarlaşdır"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefon fövqəladə geriyə zəng rejimindədir"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> olana qədər"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Telefon <xliff:g id="COUNT_1">%s</xliff:g> dəqiqəlik fövqəladə geri zəng rejimində olacaq.\nİndi çıxmaq istəyirsiniz?</item>
- <item quantity="one">Telefon <xliff:g id="COUNT_0">%s</xliff:g> dəqiqəlik fövqəladə geri zəng rejimində olacaq.\nİndi çıxmaq istəyirsiniz?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Xidmət"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Quraşdırma"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Ayarlanmayıb>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Yeniləyin"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS Yoxlanışına keçin"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Orijinal Avadanlıq İstehsalçısının Məlumatı/Ayarlar"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC Əlçatandır:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR Məhdudlaşdırılıb:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR Əlçatandır:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR Statusu:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR Tezliyi:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Radio Diapazon Rejimini Quraşdırın"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Diapazon Siyahısı Yüklənir…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Ayarlayın"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 4c08fc5..8940af5 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"Konfigurisanje podešavanja naloga"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"Svi nalozi za pozivanje"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"Izaberite koji nalozi mogu da obavljaju pozive"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"Pozivanje preko WiFi-a"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"Pozivanje preko Wi-Fi-ja"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"Ugrađena usluga povezivanja"</string>
<string name="voicemail" msgid="7697769412804195032">"Govorna pošta"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"Glasovna pošta (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -118,7 +118,7 @@
<string name="sum_cfnry_enabled" msgid="3000500837493854799">"Prosleđuje se na <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfnry_disabled" msgid="1990563512406017880">"Isključeno"</string>
<string name="disable_cfnry_forbidden" msgid="3174731413216550689">"Operater ne podržava onemogućavanje preusmeravanja poziva kada se na poziv ne odgovori."</string>
- <string name="labelCFNRc" msgid="4163399350778066013">"Kad sam nedostupan/na"</string>
+ <string name="labelCFNRc" msgid="4163399350778066013">"Kad sam nedostupan/a"</string>
<string name="messageCFNRc" msgid="6980340731313007250">"Broj kad je nedostupno"</string>
<string name="sum_cfnrc_enabled" msgid="1799069234006073477">"Prosleđuje se na <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfnrc_disabled" msgid="739289696796917683">"Isključeno"</string>
@@ -298,7 +298,7 @@
<string name="sim_selection_required_pref" msgid="6985901872978341314">"Potrebno je da izaberete nešto"</string>
<string name="sim_change_data_title" msgid="9142726786345906606">"Da promenimo SIM za podatke?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"Želite li da za mobilne podatke koristite <xliff:g id="NEW_SIM">%1$s</xliff:g> umesto <xliff:g id="OLD_SIM">%2$s</xliff:g>?"</string>
- <string name="wifi_calling_settings_title" msgid="5800018845662016507">"Pozivanje preko WiFi-a"</string>
+ <string name="wifi_calling_settings_title" msgid="5800018845662016507">"Pozivanje preko Wi-Fi-ja"</string>
<string name="video_calling_settings_title" msgid="342829454913266078">"Video pozivanje preko operatera"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"Opcije za GSM/UMTS"</string>
<string name="cdma_options" msgid="3669592472226145665">"CDMA opcije"</string>
@@ -542,7 +542,7 @@
<string name="incall_error_supp_service_hangup" msgid="836524952243836735">"Uspostavljanje poziva nije uspelo."</string>
<string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Nije moguće stavljati pozive na čekanje."</string>
<string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Povežite se na bežičnu mrežu da biste uputili poziv."</string>
- <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Omogućite pozivanje preko WiFi-a da biste uputili poziv."</string>
+ <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Omogućite pozivanje preko Wi-Fi-ja da biste uputili poziv."</string>
<string name="emergency_information_hint" msgid="9208897544917793012">"Informacije za hitne slučajeve"</string>
<string name="emergency_information_owner_hint" msgid="6256909888049185316">"Vlasnik"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Dodirnite ponovo da biste videli informacije"</string>
@@ -564,7 +564,7 @@
<string name="dialerKeyboardHintText" msgid="1115266533703764049">"Koristite tastaturu za pozivanje"</string>
<string name="onscreenHoldText" msgid="4025348842151665191">"Čekanje"</string>
<string name="onscreenEndCallText" msgid="6138725377654842757">"Završi"</string>
- <string name="onscreenShowDialpadText" msgid="658465753816164079">"Brojčanik"</string>
+ <string name="onscreenShowDialpadText" msgid="658465753816164079">"Numerička tastatura"</string>
<string name="onscreenMuteText" msgid="5470306116733843621">"Isključi zvuk"</string>
<string name="onscreenAddCallText" msgid="9075675082903611677">"Dodaj poziv"</string>
<string name="onscreenMergeCallsText" msgid="3692389519611225407">"Objedini pozive"</string>
@@ -604,7 +604,7 @@
<string name="ota_hfa_activation_title" msgid="3300556778212729671">"Aktiviranje..."</string>
<string name="ota_hfa_activation_dialog_message" msgid="7921718445773342996">"Telefon aktivira uslugu mobilnog prenosa podataka.\n\nTo može da potraje i do 5 minuta."</string>
<string name="ota_skip_activation_dialog_title" msgid="7666611236789203797">"Želite li da preskočite aktivaciju?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Ako preskočite aktivaciju, ne možete da upućujete pozive ili da se povezujete sa mrežama za mobilni prenos podataka (iako možete da se povežete sa WiFi mrežama). Sve dok ne aktivirate svoj telefon, bićete upitani da to učinite svaki put kada ga uključite."</string>
+ <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Ako preskočite aktivaciju, ne možete da upućujete pozive ili da se povezujete sa mrežama za mobilni prenos podataka (iako možete da se povežete sa Wi-Fi mrežama). Sve dok ne aktivirate svoj telefon, bićete upitani da to učinite svaki put kada ga uključite."</string>
<string name="ota_skip_activation_dialog_skip_label" msgid="5908029466817825633">"Preskoči"</string>
<string name="ota_activate" msgid="7939695753665438357">"Aktiviraj"</string>
<string name="ota_title_activate_success" msgid="1272135024761004889">"Telefon je aktiviran."</string>
@@ -639,13 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Da"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Ne"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Odbaci"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefon je u režimu za hitan povratni poziv"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Do <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Telefon će <xliff:g id="COUNT_1">%s</xliff:g> minut biti u režimu za hitan povratni poziv.\nŽelite sad da izađete iz njega?</item>
- <item quantity="few">Telefon će <xliff:g id="COUNT_1">%s</xliff:g> minuta biti u režimu za hitan povratni poziv.\nŽelite sad da izađete iz njega?</item>
- <item quantity="other">Telefon će <xliff:g id="COUNT_1">%s</xliff:g> minuta biti u režimu za hitan povratni poziv.\nŽelite sad da izađete iz njega?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Usluga"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Podešavanje"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Nije podešeno>"</string>
@@ -657,7 +650,7 @@
<string name="not_voice_capable" msgid="2819996734252084253">"Audio pozivi nisu podržani"</string>
<string name="description_dial_button" msgid="8614631902795087259">"biranje"</string>
<string name="description_dialpad_button" msgid="7395114120463883623">"prikažite numeričku tastaturu"</string>
- <string name="pane_title_emergency_dialpad" msgid="3627372514638694401">"Brojčanik za hitne pozive"</string>
+ <string name="pane_title_emergency_dialpad" msgid="3627372514638694401">"Numerička tastatura za hitne pozive"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="6610414098912832120">"Vizuelna govorna pošta"</string>
<string name="voicemail_set_pin_dialog_title" msgid="7005128605986960003">"Podesite PIN"</string>
<string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"Promenite PIN"</string>
@@ -671,18 +664,18 @@
<string name="sim_description_emergency_calls" msgid="5146872803938897296">"Samo za hitne pozive"</string>
<string name="sim_description_default" msgid="7474671114363724971">"SIM kartica, otvor: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="7883415189273700298">"Pristupačnost"</string>
- <string name="status_hint_label_incoming_wifi_call" msgid="2606052595898044071">"WiFi poziv od"</string>
- <string name="status_hint_label_wifi_call" msgid="942993035689809853">"WiFi poziv"</string>
+ <string name="status_hint_label_incoming_wifi_call" msgid="2606052595898044071">"Wi-Fi poziv od"</string>
+ <string name="status_hint_label_wifi_call" msgid="942993035689809853">"Wi-Fi poziv"</string>
<string name="emergency_action_launch_hint" msgid="2762016865340891314">"Dodirnite ponovo da biste otvorili"</string>
<string name="message_decode_error" msgid="1061856591500290887">"Došlo je do greške pri dekodiranju poruke."</string>
<string name="callFailed_cdma_activation" msgid="5392057031552253550">"SIM kartica je aktivirala uslugu i ažurirala funkcije rominga na telefonu."</string>
<string name="callFailed_cdma_call_limit" msgid="1074219746093031412">"Ima previše aktivnih poziva. Završite ili objedinite postojeće pozive pre nego što uputite novi."</string>
<string name="callFailed_imei_not_accepted" msgid="7257903653685147251">"Povezivanje nije uspelo, ubacite važeću SIM karticu."</string>
- <string name="callFailed_wifi_lost" msgid="1788036730589163141">"WiFi veza je prekinuta. Poziv je završen."</string>
+ <string name="callFailed_wifi_lost" msgid="1788036730589163141">"Wi-Fi veza je prekinuta. Poziv je završen."</string>
<string name="dialFailed_low_battery" msgid="6857904237423407056">"Ne možete da uputite poziv jer je baterija skoro prazna."</string>
<string name="callFailed_low_battery" msgid="4056828320214416182">"Video poziv je prekinut jer je baterija skoro prazna."</string>
- <string name="callFailed_emergency_call_over_wfc_not_available" msgid="5944309590693432042">"Hitni pozivi pomoću funkcije Pozivanje preko WiFi-a nisu dostupni na ovoj lokaciji."</string>
- <string name="callFailed_wfc_service_not_available_in_this_location" msgid="3624536608369524988">"Pozivanje preko WiFi-a nije dostupno na ovoj lokaciji."</string>
+ <string name="callFailed_emergency_call_over_wfc_not_available" msgid="5944309590693432042">"Hitni pozivi pomoću funkcije Pozivanje preko Wi-Fi-ja nisu dostupni na ovoj lokaciji."</string>
+ <string name="callFailed_wfc_service_not_available_in_this_location" msgid="3624536608369524988">"Pozivanje preko Wi-Fi-ja nije dostupno na ovoj lokaciji."</string>
<string name="change_pin_title" msgid="3564254326626797321">"Promenite PIN kôd govorne pošte"</string>
<string name="change_pin_continue_label" msgid="5177011752453506371">"Nastavi"</string>
<string name="change_pin_cancel_label" msgid="2301711566758827936">"Otkaži"</string>
@@ -827,7 +820,7 @@
<string name="radio_info_data_connection_disable" msgid="6404751291511368706">"Onemogući vezu za prenos podataka"</string>
<string name="volte_provisioned_switch_string" msgid="4812874990480336178">"Dodeljeno za VoLTE"</string>
<string name="vt_provisioned_switch_string" msgid="8295542122512195979">"Video pozivi su dodeljeni"</string>
- <string name="wfc_provisioned_switch_string" msgid="3835004640321078988">"Pozivanje preko WiFi-a je dodeljeno"</string>
+ <string name="wfc_provisioned_switch_string" msgid="3835004640321078988">"Pozivanje preko Wi-Fi-ja je dodeljeno"</string>
<string name="eab_provisioned_switch_string" msgid="4449676720736033035">"Dodeljen je EAB/prisustvo"</string>
<string name="cbrs_data_switch_string" msgid="6060356430838077653">"Podaci CBRS-a"</string>
<string name="dsds_switch_string" msgid="7564769822086764796">"Omogući DSDS"</string>
@@ -845,7 +838,7 @@
<string name="radio_info_ims_reg_status_not_registered" msgid="8045821447288876085">"Nije registrovano"</string>
<string name="radio_info_ims_feature_status_available" msgid="6493200914756969292">"Dostupno"</string>
<string name="radio_info_ims_feature_status_unavailable" msgid="8930391136839759778">"Nije dostupno"</string>
- <string name="radio_info_ims_reg_status" msgid="25582845222446390">"Registracija IMS-a: <xliff:g id="STATUS">%1$s</xliff:g>\nGlas preko LTE-a: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nGlas preko WiFi-a: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nVideo poziv: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT interfejs: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
+ <string name="radio_info_ims_reg_status" msgid="25582845222446390">"Registracija IMS-a: <xliff:g id="STATUS">%1$s</xliff:g>\nGlas preko LTE-a: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nGlas preko Wi-Fi-ja: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nVideo poziv: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT interfejs: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
<string name="radioInfo_service_in" msgid="45753418231446400">"Radi"</string>
<string name="radioInfo_service_out" msgid="287972405416142312">"Ne radi"</string>
<string name="radioInfo_service_emergency" msgid="4763879891415016848">"Samo hitni pozivi"</string>
@@ -901,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Osveži"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Uključi/isključi proveru DNS-a"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Informacije/podešavanja specifična za proizvođača originalne opreme"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC dostupno:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR ograničeno:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR dostupno:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR stanje:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR učestalost:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Podesite režim radijskog opsega"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Učitava se lista opsega…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Podesi"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index e9ebdea..ea3af2c 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -30,7 +30,7 @@
<string name="mmiStarted" msgid="9212975136944568623">"Пачалося выкананне MMI кода"</string>
<string name="ussdRunning" msgid="1163586813106772717">"Запускаецца USSD-код..."</string>
<string name="mmiCancelled" msgid="5339191899200678272">"Код MMI адменены"</string>
- <string name="cancel" msgid="8984206397635155197">"Скасаваць"</string>
+ <string name="cancel" msgid="8984206397635155197">"Адмяніць"</string>
<string name="enter_input" msgid="6193628663039958990">"Паведамленне USSD павінна складацца з наступнай колькасцi знакаў: ад <xliff:g id="MIN_LEN">%1$d</xliff:g> да <xliff:g id="MAX_LEN">%2$d</xliff:g>. Паспрабуйце яшчэ раз."</string>
<string name="manageConferenceLabel" msgid="8415044818156353233">"Кіраванне канферэнц-выклікам"</string>
<string name="ok" msgid="7818974223666140165">"ОК"</string>
@@ -302,12 +302,12 @@
<string name="video_calling_settings_title" msgid="342829454913266078">"Відэавыклікі праз аператара"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"Параметры GSM/UMTS"</string>
<string name="cdma_options" msgid="3669592472226145665">"Параметры CDMA"</string>
- <string name="throttle_data_usage" msgid="1944145350660420711">"Выкарыстанне трафіка"</string>
+ <string name="throttle_data_usage" msgid="1944145350660420711">"Выкарыстанне трафіку"</string>
<string name="throttle_current_usage" msgid="7483859109708658613">"Выкарыстанне даных у бягучы перыяд"</string>
<string name="throttle_time_frame" msgid="1813452485948918791">"Перыяд выкарыстання дадзеных"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Палітыка хуткасці перадачы дадзеных"</string>
- <string name="throttle_help" msgid="2624535757028809735">"Даведацца больш"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"Выкарыстана <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) з максімальнага перыяду (<xliff:g id="USED_2">%3$s</xliff:g>)\nНаступны перыяд пачнецца праз <xliff:g id="USED_3">%4$d</xliff:g> сут (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_help" msgid="2624535757028809735">"Дадатковая iнфармацыя"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"Выкарыстана <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>??) з максімуму перыяду <xliff:g id="USED_2">%3$s</xliff:g>\nНаступны перыяд пачнецца праз <xliff:g id="USED_3">%4$d</xliff:g> д. (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"Выкарыстана <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>??) з максімуму перыяду (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"Максімум <xliff:g id="USED_0">%1$s</xliff:g> перавышаны\nХуткасць перадачы дадзеных зніжана да <xliff:g id="USED_1">%2$d</xliff:g> Кб/с"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>?? цыклу прайшло\nНаступны перыяд пачнецца праз <xliff:g id="USED_1">%2$d</xliff:g> д. (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -442,7 +442,7 @@
<string name="sum_fdn_manage_list" msgid="3311397063233992907">"Кіраванне спісам тэлефонных нумароў"</string>
<string name="voice_privacy" msgid="7346935172372181951">"Палiтыка прыватнасцi Voice"</string>
<string name="voice_privacy_summary" msgid="3556460926168473346">"Уключыць пашыраны рэжым прыватнасці"</string>
- <string name="tty_mode_option_title" msgid="3843817710032641703">"Рэжым TTY"</string>
+ <string name="tty_mode_option_title" msgid="3843817710032641703">"Рэжым тэлетайпа"</string>
<string name="tty_mode_option_summary" msgid="4770510287236494371">"Задаць рэжым TTY"</string>
<string name="auto_retry_mode_title" msgid="2985801935424422340">"Аўтаматычны паўтор"</string>
<string name="auto_retry_mode_summary" msgid="2863919925349511402">"Уключыць рэжым аўтаматычнага паўтору"</string>
@@ -525,7 +525,7 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Каб пазваніць, уключыце мабільную сетку, выключыце рэжым палёту або рэжым эканоміі зараду."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Адключыце рэжым палёту, каб зрабіць выклік."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Адключыце рэжым палёту або падлучыцеся да бесправадной сеткі, каб зрабіць выклік."</string>
- <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Каб зрабіць звычайны выклік, выйдзіце з рэжыму экстранных зваротных выклікаў."</string>
+ <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Выйдзіце з рэжыму экстранных зваротных выклікаў, каб зрабіць няэкстранны выклік."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Не зарэгістраваны ў сетцы."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Мабільная сетка недаступная."</string>
<string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Мабільная сетка недаступная. Падлучыцеся да бесправадной сеткі, каб зрабіць выклік."</string>
@@ -586,10 +586,10 @@
<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">
- <item msgid="3238070884803849303">"TTY выключаны"</item>
- <item msgid="1449091874731375214">"Поўнафункцыянальны TTY"</item>
- <item msgid="1044179293199519425">"TTY з магчымасцю чуць суразмоўніка"</item>
- <item msgid="2131559553795606483">"TTY з магчымасцю перадачы голасу"</item>
+ <item msgid="3238070884803849303">"Тэлетайп выключаны"</item>
+ <item msgid="1449091874731375214">"Поўнафункцыянальны тэлетайп"</item>
+ <item msgid="1044179293199519425">"Тэлетайп HCO"</item>
+ <item msgid="2131559553795606483">"Тэлетайп VCO"</item>
</string-array>
<string name="dtmf_tones_title" msgid="7874845461117175236">"Сігналы DTMF"</string>
<string name="dtmf_tones_summary" msgid="2294822239899471201">"Задаць даўжыню тонаў DTMF"</string>
@@ -617,38 +617,30 @@
<string name="ota_unsuccessful" msgid="8531037653803955754">"Ваш тэлефон не актываваны. \nМагчыма, вам спатрэбіцца знайсці вобласць з лепшым пакрыццём (каля акна ці на вуліцы). \n\nПаўтарыце спробу ці звярнiцеся ў цэнтр абслугоўвання кліентаў, каб атрымаць дадатковую інфармацыю."</string>
<string name="ota_spc_failure" msgid="904092035241370080">"ПАМЫЛКІ ПЕРАВЫШЭННЯ SPC"</string>
<string name="ota_call_end" msgid="8657746378290737034">"Назад"</string>
- <string name="ota_try_again" msgid="6914781945599998550">"Паўтарыць спробу"</string>
+ <string name="ota_try_again" msgid="6914781945599998550">"Паспрабаваць яшчэ раз"</string>
<string name="ota_next" msgid="2041016619313475914">"Далей"</string>
<string name="ecm_exit_dialog" msgid="4200691880721429078">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="8431238297843035842">"У рэжыме экстранных зваротных выклікаў"</string>
- <string name="phone_in_ecm_notification_title" msgid="6825016389926367946">"Рэжым экстранных зваротных выклікаў"</string>
+ <string name="phone_entered_ecm_text" msgid="8431238297843035842">"У рэжыме аварыйнага зваротнага выкліку"</string>
+ <string name="phone_in_ecm_notification_title" msgid="6825016389926367946">"Рэжым аварыйнага зваротнага выкліку"</string>
<string name="phone_in_ecm_call_notification_text" msgid="653972232922670335">"Падлучэнне для перадачы дадзеных адключана"</string>
<string name="phone_in_ecm_notification_complete_time" msgid="7341624337163082759">"Няма злучэння для перадачы даных да <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
<plurals name="alert_dialog_exit_ecm" formatted="false" msgid="5425906903766466743">
- <item quantity="one">Тэлефон будзе заставацца ў рэжыме экстранных зваротных выклікаў <xliff:g id="COUNT_1">%s</xliff:g> хвіліну. У гэтым рэжыме недаступныя праграмы, якія выкарыстоўваюць перадачу даных. Выйсці зараз?</item>
- <item quantity="few">Тэлефон будзе заставацца ў рэжыме экстранных зваротных выклікаў <xliff:g id="COUNT_1">%s</xliff:g> хвіліны. У гэтым рэжыме недаступныя праграмы, якія выкарыстоўваюць перадачу даных. Выйсці зараз?</item>
- <item quantity="many">Тэлефон будзе заставацца ў рэжыме экстранных зваротных выклікаў <xliff:g id="COUNT_1">%s</xliff:g> хвілін. У гэтым рэжыме недаступныя праграмы, якія выкарыстоўваюць перадачу даных. Выйсці зараз?</item>
- <item quantity="other">Тэлефон будзе заставацца ў рэжыме экстранных зваротных выклікаў <xliff:g id="COUNT_1">%s</xliff:g> хвіліны. У гэтым рэжыме недаступныя праграмы, якія выкарыстоўваюць перадачу даных. Выйсці зараз?</item>
+ <item quantity="one">Тэлефон пяройдзе ў рэжым экстраннага зваротнага выкліку на <xliff:g id="COUNT_1">%s</xliff:g> хвіліну. У гэтым рэжыме немагчыма карыстацца праграмамі, якія выкарыстоўваюць злучэнне для перадачы даных. Жадаеце выйсці зараз?</item>
+ <item quantity="few">Тэлефон пяройдзе ў рэжым экстраннага зваротнага выкліку на <xliff:g id="COUNT_1">%s</xliff:g> хвіліны. У гэтым рэжыме немагчыма карыстацца праграмамі, якія выкарыстоўваюць злучэнне для перадачы даных. Жадаеце выйсці зараз?</item>
+ <item quantity="many">Тэлефон пяройдзе ў рэжым экстраннага зваротнага выкліку на <xliff:g id="COUNT_1">%s</xliff:g> хвілін. У гэтым рэжыме немагчыма карыстацца праграмамі, якія выкарыстоўваюць злучэнне для перадачы даных. Жадаеце выйсці зараз?</item>
+ <item quantity="other">Тэлефон пяройдзе ў рэжым экстраннага зваротнага выкліку на <xliff:g id="COUNT_1">%s</xliff:g> хвіліны. У гэтым рэжыме немагчыма карыстацца праграмамі, якія выкарыстоўваюць злучэнне для перадачы даных. Жадаеце выйсці зараз?</item>
</plurals>
<plurals name="alert_dialog_not_avaialble_in_ecm" formatted="false" msgid="1152682528741457004">
- <item quantity="one">Выбранае дзеянне недаступнае ў рэжыме экстранных зваротных выклікаў. Тэлефон будзе заставацца ў гэтым рэжыме <xliff:g id="COUNT_1">%s</xliff:g> хвіліну. Выйсці зараз?</item>
- <item quantity="few">Выбранае дзеянне недаступнае ў рэжыме экстранных зваротных выклікаў. Тэлефон будзе заставацца ў гэтым рэжыме <xliff:g id="COUNT_1">%s</xliff:g> хвіліны. Выйсці зараз?</item>
- <item quantity="many">Выбранае дзеянне недаступнае ў рэжыме экстранных зваротных выклікаў. Тэлефон будзе заставацца ў гэтым рэжыме <xliff:g id="COUNT_1">%s</xliff:g> хвілін. Выйсці зараз?</item>
- <item quantity="other">Выбранае дзеянне недаступнае ў рэжыме экстранных зваротных выклікаў. Тэлефон будзе заставацца ў гэтым рэжыме <xliff:g id="COUNT_1">%s</xliff:g> хвіліны. Выйсці зараз?</item>
+ <item quantity="one">Выбранае дзеянне недаступнае ў рэжыме экстраннага зваротнага выкліку. Тэлефон застанецца ў гэтым рэжыме на <xliff:g id="COUNT_1">%s</xliff:g> хвіліну. Жадаеце выйсці зараз?</item>
+ <item quantity="few">Выбранае дзеянне недаступнае ў рэжыме экстраннага зваротнага выкліку. Тэлефон застанецца ў гэтым рэжыме на <xliff:g id="COUNT_1">%s</xliff:g> хвіліны. Жадаеце выйсці зараз?</item>
+ <item quantity="many">Выбранае дзеянне недаступнае ў рэжыме экстраннага зваротнага выкліку. Тэлефон застанецца ў гэтым рэжыме на <xliff:g id="COUNT_1">%s</xliff:g> хвілін. Жадаеце выйсці зараз?</item>
+ <item quantity="other">Выбранае дзеянне недаступнае ў рэжыме экстраннага зваротнага выкліку. Тэлефон застанецца ў гэтым рэжыме на <xliff:g id="COUNT_1">%s</xliff:g> хвіліны. Жадаеце выйсці зараз?</item>
</plurals>
<string name="alert_dialog_in_ecm_call" msgid="1207545603149771978">"Выбранае дзеянне недаступнае падчас экстранага выкліку."</string>
- <string name="progress_dialog_exiting_ecm" msgid="9159080081676927217">"Выконваецца выхад з рэжыму экстранных зваротных выклікаў"</string>
+ <string name="progress_dialog_exiting_ecm" msgid="9159080081676927217">"Выхад з рэжыму экстранага выкліку"</string>
<string name="alert_dialog_yes" msgid="3532525979632841417">"Так"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Не"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Адхіліць"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Тэлефон знаходзіцца ў рэжыме экстранных зваротных выклікаў"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Да <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Тэлефон будзе заставацца ў рэжыме экстранных зваротных выклікаў <xliff:g id="COUNT_1">%s</xliff:g> хвіліну.\nВыйсці зараз?</item>
- <item quantity="few">Тэлефон будзе заставацца ў рэжыме экстранных зваротных выклікаў <xliff:g id="COUNT_1">%s</xliff:g> хвіліны.\nВыйсці зараз?</item>
- <item quantity="many">Тэлефон будзе заставацца ў рэжыме экстранных зваротных выклікаў <xliff:g id="COUNT_1">%s</xliff:g> хвілін.\nВыйсці зараз?</item>
- <item quantity="other">Тэлефон будзе заставацца ў рэжыме экстранных зваротных выклікаў <xliff:g id="COUNT_1">%s</xliff:g> хвіліны.\nВыйсці зараз?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Сэрвіс"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Наладка"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Не зададзены>"</string>
@@ -904,11 +896,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Абнавіць"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Уключыць/выключыць праверку DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Інфармацыя/налады пастаўшчыка"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Даступнасць EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Абмежаванне DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Даступнасць NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Стан NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Частата NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Задаць рэжым радыёдыяпазону"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Загружаецца спіс дыяпазонаў…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Задаць"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index d5a1a53..3a3d43d 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -185,7 +185,7 @@
<string name="choose_network_title" msgid="5335832663422653082">"Избиране на мрежа"</string>
<string name="network_disconnected" msgid="8844141106841160825">"Връзката е прекратена"</string>
<string name="network_connected" msgid="2760235679963580224">"Има връзка"</string>
- <string name="network_connecting" msgid="160901383582774987">"Свързване…"</string>
+ <string name="network_connecting" msgid="160901383582774987">"Свързва се…"</string>
<string name="network_could_not_connect" msgid="6547460848093727998">"Не можа да се установи връзка"</string>
<string-array name="preferred_network_mode_choices">
<item msgid="4531933377509551889">"Предпочита се GSM/WCDMA"</item>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Да"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Не"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Отхвърляне"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Телефонът е в режим на спешно обратно обаждане"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"До <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Телефонът ще бъде в режим на спешно обратно обаждане в продължение на <xliff:g id="COUNT_1">%s</xliff:g> минути.\nИскате ли да излезете сега?</item>
- <item quantity="one">Телефонът ще бъде в режим на спешно обратно обаждане в продължение на <xliff:g id="COUNT_0">%s</xliff:g> минута.\nИскате ли да излезете сега?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Услуга"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Настройка"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Не е зададено>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Опресняване"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Превключване на проверката на DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Информация/настройки, специфични за ОЕМ"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Налично EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Ограничено DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Налично NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Състояние на NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Честота за NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Задаване на режима за радиодиапазона"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Списъкът с диапазони се зарежда…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Задаване"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 7410e96..db4be42 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"হ্যাঁ"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"না"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"খারিজ করুন"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ফোনটি জরুরি কলব্যাক মোডে থাকবে"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> পর্যন্ত"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> মিনিটের জন্য ফোনটি জরুরি কলব্যাক মোডে থাকবে।\nআপনি কি এখন বেরিয়ে আসতে চান?</item>
- <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> মিনিটের জন্য ফোনটি জরুরি কলব্যাক মোডে থাকবে।\nআপনি কি এখন বেরিয়ে আসতে চান?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"পরিষেবা"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"সেটআপ"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<সেট করা নেই>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"রিফ্রেশ"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS চেক টগল করুন"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-নির্দিষ্ট তথ্য/সেটিংস"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC উপলভ্য:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR সীমাবদ্ধ করা আছে:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR উপলভ্য:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR স্ট্যাটাস:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR ফ্রিকোয়েন্সি:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"রেডিও ব্যান্ড মোড সেট করুন"</string>
<string name="band_mode_loading" msgid="795923726636735967">"ব্যান্ড তালিকা লোড হচ্ছে..."</string>
<string name="band_mode_set" msgid="6657819412803771421">"সেট করুন"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index b0c408b..7256c32 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -105,7 +105,7 @@
<string name="labelCFU" msgid="8870170873036279706">"Uvijek proslijedi"</string>
<string name="messageCFU" msgid="1361806450979589744">"Uvijek koristi ovaj broj"</string>
<string name="sum_cfu_enabled_indicator" msgid="9030139213402432776">"Prosljeđivanje svih poziva"</string>
- <string name="sum_cfu_enabled" msgid="5806923046528144526">"Prosljeđivanje svih poziva na <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
+ <string name="sum_cfu_enabled" msgid="5806923046528144526">"Preusmjeravaju se svi pozivi na <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfu_enabled_no_number" msgid="7287752761743377930">"Broj je nedostupan"</string>
<string name="sum_cfu_disabled" msgid="5010617134210809853">"Isključeno"</string>
<string name="labelCFB" msgid="615265213360512768">"Kada je zauzeto"</string>
@@ -127,8 +127,8 @@
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"Postavke poziva može promijeniti samo administrator."</string>
<string name="call_settings_with_label" msgid="8460230435361579511">"Postavke (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"Greška u postavkama poziva"</string>
- <string name="reading_settings" msgid="1605904432450871183">"Čitanje postavki…"</string>
- <string name="updating_settings" msgid="3650396734816028808">"Ažuriranje postavki…"</string>
+ <string name="reading_settings" msgid="1605904432450871183">"Čitanje postavki u toku…"</string>
+ <string name="updating_settings" msgid="3650396734816028808">"Ažuriranje postavki u toku…"</string>
<string name="reverting_settings" msgid="7378668837291012205">"Vraćanje postavki u toku…"</string>
<string name="response_error" msgid="3904481964024543330">"Neočekivani odgovor mreže."</string>
<string name="exception_error" msgid="330994460090467">"Greška na mreži ili SIM kartici."</string>
@@ -296,7 +296,7 @@
<string name="mobile_data_settings_summary" msgid="5012570152029118471">"Pristup prijenosu podataka mobilnom mrežom"</string>
<string name="data_usage_disable_mobile" msgid="5669109209055988308">"Isključiti prijenos podataka na mobilnoj mreži?"</string>
<string name="sim_selection_required_pref" msgid="6985901872978341314">"Potreban izbor"</string>
- <string name="sim_change_data_title" msgid="9142726786345906606">"Promijeniti SIM za prijenos podataka?"</string>
+ <string name="sim_change_data_title" msgid="9142726786345906606">"Promijeniti podatkovni SIM?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"Koristiti SIM karticu <xliff:g id="NEW_SIM">%1$s</xliff:g> umjesto SIM kartice <xliff:g id="OLD_SIM">%2$s</xliff:g> za prijenos podataka na mobilnoj mreži?"</string>
<string name="wifi_calling_settings_title" msgid="5800018845662016507">"Pozivanje putem WiFi-ja"</string>
<string name="video_calling_settings_title" msgid="342829454913266078">"Operater video pozivanja"</string>
@@ -604,7 +604,7 @@
<string name="ota_hfa_activation_title" msgid="3300556778212729671">"Aktivacija u toku..."</string>
<string name="ota_hfa_activation_dialog_message" msgid="7921718445773342996">"Telefon aktivira uslugu prijenosa mobilnih podataka.\n\nTo može potrajati do 5 minuta."</string>
<string name="ota_skip_activation_dialog_title" msgid="7666611236789203797">"Preskočiti aktivaciju?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Ako preskočite aktivaciju, nećete moći upućivati pozive niti se povezati na mobilne podatkovne mreže (iako se možete povezati s WiFi mrežama). Dok ne aktivirate telefon, prikazivat će se upit za aktivaciju svaki put kada upalite telefon."</string>
+ <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Ako preskočite aktivaciju, nećete moći upućivati pozive niti se povezati na mobilne podatkovne mreže (iako se možete povezati na WiFi mreže). Dok ne aktivirate telefon, prikazivat će se upit za aktivaciju svaki put kada upalite telefon."</string>
<string name="ota_skip_activation_dialog_skip_label" msgid="5908029466817825633">"Preskoči"</string>
<string name="ota_activate" msgid="7939695753665438357">"Aktiviraj"</string>
<string name="ota_title_activate_success" msgid="1272135024761004889">"Telefon je aktiviran."</string>
@@ -639,13 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Da"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Ne"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Odbaci"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefon je u načinu rada za hitni povratni poziv"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Do <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Telefon će biti u načinu rada za hitni povratni poziv <xliff:g id="COUNT_1">%s</xliff:g> minutu.\nŽelite li izaći iz ovog načina rada sada?</item>
- <item quantity="few">Telefon će biti u načinu rada za hitni povratni poziv <xliff:g id="COUNT_1">%s</xliff:g> minute.\nŽelite li izaći iz ovog načina rada sada?</item>
- <item quantity="other">Telefon će biti u načinu rada za hitni povratni poziv <xliff:g id="COUNT_1">%s</xliff:g> minuta.\nŽelite li izaći iz ovog načina rada sada?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Usluga"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Postavljanje"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Nije postavljeno>"</string>
@@ -858,7 +851,7 @@
<string name="radioInfo_data_disconnected" msgid="8085447971880814541">"Veza je prekinuta"</string>
<string name="radioInfo_data_connecting" msgid="925092271092152472">"Povezivanje"</string>
<string name="radioInfo_data_connected" msgid="7637335645634239508">"Povezano"</string>
- <string name="radioInfo_data_suspended" msgid="8695262782642002785">"Obustavljeno"</string>
+ <string name="radioInfo_data_suspended" msgid="8695262782642002785">"Suspendirano"</string>
<string name="radioInfo_unknown" msgid="5401423738500672850">"Nepoznato"</string>
<string name="radioInfo_display_packets" msgid="6794302192441084157">"paketi"</string>
<string name="radioInfo_display_bytes" msgid="7701006329222413797">"bajtova"</string>
@@ -867,7 +860,7 @@
<string name="radioInfo_lac" msgid="3892986460272607013">"LAC"</string>
<string name="radioInfo_cid" msgid="1423185536264406705">"CID"</string>
<string name="radio_info_subid" msgid="6839966868621703203">"Trenutni pomoćni ID:"</string>
- <string name="radio_info_dds" msgid="1122593144425697126">"Pomoćni ID za zadani SIM za prijenos podataka:"</string>
+ <string name="radio_info_dds" msgid="1122593144425697126">"Pomoćni ID za zadani podatkovni SIM:"</string>
<string name="radio_info_dl_kbps" msgid="2382922659525318726">"DL propusnost (kbps):"</string>
<string name="radio_info_ul_kbps" msgid="2102225400904799036">"UL propusnost (kbps):"</string>
<string name="radio_info_signal_location_label" msgid="6188435197086550049">"Informacije o lokaciji ćelije (zastarjele):"</string>
@@ -901,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Osvježi"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Uključi/isključi provjeru DNS-a"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-specifične informacije/postavke"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC dostupno:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR ograničeno:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR dostupno:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR stanje:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR učestalost:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Postavite način radijskog opsega"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Učitavanje liste opsega…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Postavi"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 5d3f3dd..a99de70 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -62,7 +62,7 @@
<string name="labelCdmaMore_with_label" msgid="7759692829160238152">"Configuració de trucades CDMA (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="apn_settings" msgid="1978652203074756623">"Noms dels punts d\'accés"</string>
<string name="settings_label" msgid="9101778088412567956">"Configuració de xarxa"</string>
- <string name="phone_accounts" msgid="1216879437523774604">"Comptes de trucada"</string>
+ <string name="phone_accounts" msgid="1216879437523774604">"Comptes de trucades"</string>
<string name="phone_accounts_make_calls_with" msgid="16747814788918145">"Truca amb"</string>
<string name="phone_accounts_make_sip_calls_with" msgid="4691221006731847255">"Fes trucades SIP amb"</string>
<string name="phone_accounts_ask_every_time" msgid="6192347582666047168">"Pregunta primer"</string>
@@ -95,7 +95,7 @@
<string name="sum_loading_settings" msgid="434063780286688775">"Carregant la configuració..."</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"Número amagat en trucades sortints"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Número mostrat a les trucades de sortida"</string>
- <string name="sum_default_caller_id" msgid="1767070797135682959">"Utilitza la configuració predeterminada de l\'operador per mostrar el meu número a les trucades sortints"</string>
+ <string name="sum_default_caller_id" msgid="1767070797135682959">"Utilitza la configuració predeterminada de l\'operador per mostrar el meu número a les trucades de sortida"</string>
<string name="labelCW" msgid="8449327023861428622">"Trucada en espera"</string>
<string name="sum_cw_enabled" msgid="3977308526187139996">"Durant una trucada, avisa\'m de les trucades entrants"</string>
<string name="sum_cw_disabled" msgid="3658094589461768637">"Durant una trucada, avisa\'m de les trucades entrants"</string>
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Període d\'ús de dades"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Política de velocitat de dades"</string>
<string name="throttle_help" msgid="2624535757028809735">"Més informació"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) del període màxim de <xliff:g id="USED_2">%3$s</xliff:g>.\nEl període següent comença d\'aquí a <xliff:g id="USED_3">%4$d</xliff:g> dies (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) del període <xliff:g id="USED_2">%3$s</xliff:g> màxim\nEl període següent comença d\'aquí a <xliff:g id="USED_3">%4$d</xliff:g> dies (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) de període <xliff:g id="USED_2">%3$s</xliff:g> màxim"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> màxim superat\nVelocitat de dades reduïda a <xliff:g id="USED_1">%2$d</xliff:g> kbps"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ del cicle transcorregut\nEl període següent comença d\'aquí a <xliff:g id="USED_1">%2$d</xliff:g> dies (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -583,7 +583,7 @@
<string name="hac_mode_summary" msgid="7774989500136009881">"Activa la compatibilitat amb audiòfons"</string>
<string name="rtt_mode_title" msgid="3075948111362818043">"Trucada de text en temps real (RTT)"</string>
<string name="rtt_mode_summary" msgid="8631541375609989562">"Permet l\'ús de missatges en una trucada de veu"</string>
- <string name="rtt_mode_more_information" msgid="587500128658756318">"La funció RTT ofereix assistència als usuaris que són sords, tenen deficiències auditives o alteracions de la parla, o bé que necessiten un text a banda de la veu.<br> <a href=<xliff:g id="URL">http://support.google.com/mobile?p=telephony_rtt</xliff:g>>Més informació</a>\n <br><br> - Les trucades RTT es desen en forma de transcripció.\n <br> - Aquesta funció no està disponible per a videotrucades."</string>
+ <string name="rtt_mode_more_information" msgid="587500128658756318">"La funció RTT ofereix assistència als usuaris que són sords, tenen problemes d\'audició o alteracions de la parla, o bé que necessiten un text a banda de la veu.<br> <a href=<xliff:g id="URL">http://support.google.com/mobile?p=telephony_rtt</xliff:g>>Més informació</a>\n <br><br> - Les trucades RTT es desen en forma de transcripció.\n <br> - Aquesta funció no està disponible per a videotrucades."</string>
<string name="no_rtt_when_roaming" msgid="5268008247378355389">"Nota: la funció RTT no està disponible en itinerància"</string>
<string-array name="tty_mode_entries">
<item msgid="3238070884803849303">"TTY desactivat"</item>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Sí"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"No"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Ignora"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"El telèfon està en el mode de devolució de trucada d\'emergència"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Fins a les <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">El telèfon estarà en el mode de devolució de trucada d\'emergència durant <xliff:g id="COUNT_1">%s</xliff:g> minuts.\nVols sortir-ne ara?</item>
- <item quantity="one">El telèfon estarà en el mode de devolució de trucada d\'emergència durant <xliff:g id="COUNT_0">%s</xliff:g> minut.\nVols sortir-ne ara?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Servei"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Configuració"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<No definit>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Actualitza"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Activa o desactiva la comprovació de DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Informació/configuració específica d\'OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC disponible:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR amb restriccions:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR disponible:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Estat d\'NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Freqüència d\'NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Configura el mode de banda de senyal mòbil"</string>
<string name="band_mode_loading" msgid="795923726636735967">"S\'està carregant la llista de bandes…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Defineix"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index d6bc45a..7ce0a25 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -141,7 +141,7 @@
<string name="close_dialog" msgid="1074977476136119408">"OK"</string>
<string name="enable" msgid="2636552299455477603">"Zapnout"</string>
<string name="disable" msgid="1122698860799462116">"Vypnout"</string>
- <string name="change_num" msgid="6982164494063109334">"Aktualizovat"</string>
+ <string name="change_num" msgid="6982164494063109334">"Aktualiz."</string>
<string-array name="clir_display_values">
<item msgid="8477364191403806960">"Výchozí nastavení sítě"</item>
<item msgid="6813323051965618926">"Skrýt číslo"</item>
@@ -641,14 +641,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ano"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Ne"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Zavřít"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefon je v režimu tísňového zpětného volání"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Do <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="few">Telefon bude v režimu tísňového zpětného volání po dobu <xliff:g id="COUNT_1">%s</xliff:g> minut.\nChcete tento režim ukončit?</item>
- <item quantity="many">Telefon bude v režimu tísňového zpětného volání po dobu <xliff:g id="COUNT_1">%s</xliff:g> minuty.\nChcete tento režim ukončit?</item>
- <item quantity="other">Telefon bude v režimu tísňového zpětného volání po dobu <xliff:g id="COUNT_1">%s</xliff:g> minut.\nChcete tento režim ukončit?</item>
- <item quantity="one">Telefon bude v režimu tísňového zpětného volání po dobu <xliff:g id="COUNT_0">%s</xliff:g> minuty.\nChcete tento režim ukončit?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Služba"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Konfigurace"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Nenastaveno>"</string>
@@ -904,11 +896,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Obnovit"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Přepnout kontrolu DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Informace a nastavení specifické pro výrobce OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC k dispozici:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR zakázáno:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR k dispozici:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Stav NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frekvence NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Nastavit režim pásma bezdrátového modulu"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Načítání seznamu pásem…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Nastavit"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 857e9e4..c8a1c34 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -168,7 +168,7 @@
<string name="label_available" msgid="1316084116670821258">"Tilgængelige netværk"</string>
<string name="load_networks_progress" msgid="4051433047717401683">"Søger..."</string>
<string name="empty_networks_list" msgid="9216418268008582342">"Der blev ikke fundet nogen netværk."</string>
- <string name="network_query_error" msgid="3862515805115145124">"Der blev ikke fundet netværk. Prøv igen."</string>
+ <string name="network_query_error" msgid="3862515805115145124">"Der kunne ikke findes netværk. Prøv igen."</string>
<string name="register_on_network" msgid="4194770527833960423">"Registrerer på <xliff:g id="NETWORK">%s</xliff:g> ..."</string>
<string name="not_allowed" msgid="8541221928746104798">"Dit SIM-kort tillader ikke en forbindelse til dette netværk."</string>
<string name="connect_later" msgid="1950138106010005425">"Der kan ikke oprettes forbindelse til dette netværk lige nu. Prøv igen senere."</string>
@@ -307,7 +307,9 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Periode for databrug"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Politik om datahastighed"</string>
<string name="throttle_help" msgid="2624535757028809735">"Flere oplysninger"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> %%) af <xliff:g id="USED_2">%3$s</xliff:g> periodens maksimum\nNæste periode om <xliff:g id="USED_3">%4$d</xliff:g> dage (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> ٪) af <xliff:g id="USED_2">%3$s</xliff:g> periodens maksimum"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> maksimum er overskredet\nDatahastigheden er nedsat til <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g> ٪ af forløbet er gennemført\nNæste periode om <xliff:g id="USED_1">%2$d</xliff:g> dage (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -570,7 +572,7 @@
<string name="onscreenMergeCallsText" msgid="3692389519611225407">"Slå opkald sammen"</string>
<string name="onscreenSwapCallsText" msgid="2682542150803377991">"Skift"</string>
<string name="onscreenManageCallsText" msgid="1162047856081836469">"Administrer opkald"</string>
- <string name="onscreenManageConferenceText" msgid="4700574060601755137">"Admin. møde"</string>
+ <string name="onscreenManageConferenceText" msgid="4700574060601755137">"Admin. konference"</string>
<string name="onscreenAudioText" msgid="7224226735052019986">"Lyd"</string>
<string name="onscreenVideoCallText" msgid="1743992456126258698">"Videoopkald"</string>
<string name="importSimEntry" msgid="3892354284082689894">"Importer"</string>
@@ -637,12 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ja"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Nej"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Luk"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefonen er i nødtilbagekaldstilstand"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Indtil <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Telefonen er i nødtilbagekaldstilstand i <xliff:g id="COUNT_1">%s</xliff:g> minut.\nVil du lukke nu?</item>
- <item quantity="other">Telefonen er i nødtilbagekaldstilstand i <xliff:g id="COUNT_1">%s</xliff:g> minutter.\nVil du lukke nu?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Tjeneste"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Konfiguration"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Ikke angivet>"</string>
@@ -804,7 +800,7 @@
<string name="supp_service_additional_call_forwarded" msgid="8772753260008398632">"Det andet opkald er videresendt."</string>
<string name="supp_service_additional_ect_connected" msgid="8525934162945220237">"Opkaldet blev tilsluttet ECT."</string>
<string name="supp_service_additional_ect_connecting" msgid="7046240728781222753">"Opkaldet tilsluttes ECT."</string>
- <string name="supp_service_call_on_hold" msgid="2836811319594503059">"Opkald på hold."</string>
+ <string name="supp_service_call_on_hold" msgid="2836811319594503059">"Parkeret opkald."</string>
<string name="supp_service_call_resumed" msgid="3786864005920743546">"Opkaldet er genoptaget."</string>
<string name="supp_service_deflected_call" msgid="7565979024562921707">"Opkaldet blev viderestillet."</string>
<string name="supp_service_forwarded_call" msgid="6475776013771821457">"Videresendt opkald."</string>
@@ -898,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Opdater"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Skift DNS-kontrol"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-specifikke oplysninger/indstillinger"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Tilgængelig for EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Begrænset til DCNR"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Tilgængelig for NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Status for NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frekvens for NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Konfigurer radiobåndstilstand"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Indlæser båndliste…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Angiv"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index dec144a..ac9859c 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -49,12 +49,12 @@
<string name="add_vm_number_str" msgid="7368168964435881637">"Nummer hinzufügen"</string>
<string name="voice_number_setting_primary_user_only" msgid="3394706575741912843">"Mailboxeinstellungen können nur vom primären Nutzer geändert werden."</string>
<string name="puk_unlocked" msgid="4627340655215746511">"Deine SIM-Karte wurde entsperrt. Dein Telefon wird nun entsperrt..."</string>
- <string name="label_ndp" msgid="7617392683877410341">"Entsperr-PIN für netzgebundenes Gerät"</string>
+ <string name="label_ndp" msgid="7617392683877410341">"PIN zur Entsperrung des SIM-Netzwerks"</string>
<string name="sim_ndp_unlock_text" msgid="7737338355451978338">"Entsperren"</string>
<string name="sim_ndp_dismiss_text" msgid="89667342248929777">"Verwerfen"</string>
- <string name="requesting_unlock" msgid="930512210309437741">"Entsperrung des netzgebundenen Geräts wird angefordert..."</string>
- <string name="unlock_failed" msgid="7103543844840661366">"Entsperranforderung für netzgebundenes Gerät war nicht erfolgreich."</string>
- <string name="unlock_success" msgid="32681089371067565">"Entsperrung des netzgebundenen Geräts war nicht erfolgreich."</string>
+ <string name="requesting_unlock" msgid="930512210309437741">"Netzwerkentsperrung wird angefordert..."</string>
+ <string name="unlock_failed" msgid="7103543844840661366">"Anfrage für Entsperrung des Netzwerks war nicht erfolgreich."</string>
+ <string name="unlock_success" msgid="32681089371067565">"Entsperrung des Netzwerks nicht erfolgreich."</string>
<string name="mobile_network_settings_not_available" msgid="8678168497517090039">"Mobile Netzwerkeinstellungen sind für diesen Nutzer nicht verfügbar."</string>
<string name="labelGSMMore" msgid="7354182269461281543">"GSM-Anrufeinstellungen"</string>
<string name="labelGsmMore_with_label" msgid="3206015314393246224">"GSM-Anrufeinstellungen (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -307,7 +307,9 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Zeitraum des Datenverbrauchs"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Richtlinien zur Datenrate"</string>
<string name="throttle_help" msgid="2624535757028809735">"Weitere Informationen"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> %%) des maximalen Zeitraums von <xliff:g id="USED_2">%3$s</xliff:g>.\nDer nächste Zeitraum beginnt in <xliff:g id="USED_3">%4$d</xliff:g> Tagen (<xliff:g id="USED_4">%5$s</xliff:g>)."</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> ٪) des maximalen Zeitraums von <xliff:g id="USED_2">%3$s</xliff:g>"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"Maximum von <xliff:g id="USED_0">%1$s</xliff:g> wurde überschritten.\nDatenrate wurde auf <xliff:g id="USED_1">%2$d</xliff:g> kbit/s reduziert."</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g> ٪ des Zyklus sind verstrichen. \nDer nächste Zeitraum beginnt in <xliff:g id="USED_1">%2$d</xliff:g> Tagen (<xliff:g id="USED_2">%3$s</xliff:g>)."</string>
@@ -637,12 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ja"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Nein"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Verwerfen"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Das Smartphone ist im Notfallrückrufmodus"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Bis <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Das Smartphone bleibt <xliff:g id="COUNT_1">%s</xliff:g> Minuten im Notfallrückrufmodus.\nMöchtest du den Vorgang jetzt beenden?</item>
- <item quantity="one">Das Smartphone bleibt <xliff:g id="COUNT_0">%s</xliff:g> Minute im Notfallrückrufmodus.\nMöchtest du den Vorgang jetzt beenden?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Dienst"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Einrichtung"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Nicht festgelegt>"</string>
@@ -898,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Aktualisieren"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS-Überprüfung ein-/ausschalten"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-spezifische Infos/Einstellungen"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC verfügbar:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR eingeschränkt:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR verfügbar:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR-Status:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR-Frequenz:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Frequenzbereichmodus festlegen"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Frequenzliste wird geladen…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Festlegen"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index e7af2ec..9a4e243 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Περίοδος χρήσης δεδομένων"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Πολιτική ταχύτητας δεδομένων"</string>
<string name="throttle_help" msgid="2624535757028809735">"Μάθετε περισσότερα"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>%%) με μέγιστη περίοδο <xliff:g id="USED_2">%3$s</xliff:g>\nΗ επόμενη περίοδος ξεκινά σε <xliff:g id="USED_3">%4$d</xliff:g> ημέρες (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) με μέγιστη περίοδο <xliff:g id="USED_2">%3$s</xliff:g>\nΗ επόμενη περίδος ξεκινά σε <xliff:g id="USED_3">%4$d</xliff:g> ημέρες (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) με μέγιστη περίοδο <xliff:g id="USED_2">%3$s</xliff:g>"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"Συμπληρώθηκε το μέγιστο όριο <xliff:g id="USED_0">%1$s</xliff:g>\nΗ ταχύτητα δεδομένων μειώθηκε σε <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"Έχει περάσει το <xliff:g id="USED_0">%1$d</xliff:g>٪ του κύκλου\nΗ επόμενη περίοδος ξεκινά σε <xliff:g id="USED_1">%2$d</xliff:g> ημέρες (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ναι"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Όχι"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Απόρριψη"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Το τηλέφωνο βρίσκεται σε λειτουργία επιστροφής κλήσης έκτακτης ανάγκης"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Έως <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Το τηλέφωνο θα βρίσκεται σε λειτουργία επιστροφής κλήσης έκτακτης ανάγκης για <xliff:g id="COUNT_1">%s</xliff:g> λεπτά.\nΕπιθυμείτε έξοδο τώρα;</item>
- <item quantity="one">Το τηλέφωνο θα βρίσκεται σε λειτουργία επιστροφής κλήσης έκτακτης ανάγκης για <xliff:g id="COUNT_0">%s</xliff:g> λεπτό.\nΕπιθυμείτε έξοδο τώρα;</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Υπηρεσία"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Ρυθμίσεις"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Δεν έχει οριστεί>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Ανανέωση"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Εναλλαγή ελέγχου DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Πληροφορίες/ρυθμίσεις για OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC διαθέσιμο:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR με περιορισμό:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR διαθέσιμο:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Κατάσταση NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Συχνότητα NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Ρύθμιση λειτουργίας ζώνης συχνοτήτων πομπού"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Φόρτωση λίστας ζωνών…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Ορισμός"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index aacdc53..b732508 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"Configure account settings"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"All calling accounts"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"Select which accounts can make calls"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi calling"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi Calling"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"Built-in connection service"</string>
<string name="voicemail" msgid="7697769412804195032">"Voicemail"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Yes"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"No"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Dismiss"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"The phone is in emergency callback mode"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Until <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">The phone will be in emergency callback mode for <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nDo you want to exit now?</item>
- <item quantity="one">The phone will be in emergency callback mode for <xliff:g id="COUNT_0">%s</xliff:g> minute.\nDo you want to exit now?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Service"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Setup"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Not set>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Refresh"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Toggle DNS check"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-specific info/settings"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC available:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR restricted:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR available:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR status:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR frequency:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Set radio band mode"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Loading band list…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Set"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 16b1df4..4cd63be 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"Configure account settings"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"All calling accounts"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"Select which accounts can make calls"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi calling"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi Calling"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"Built-in connection service"</string>
<string name="voicemail" msgid="7697769412804195032">"Voicemail"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -471,7 +471,7 @@
<string name="simContacts_emptyLoading" msgid="4989040293858675483">"Reading from SIM card…"</string>
<string name="simContacts_empty" msgid="1135632055473689521">"No contacts on your SIM card."</string>
<string name="simContacts_title" msgid="2714029230160136647">"Select contacts to import"</string>
- <string name="simContacts_airplaneMode" msgid="4654884030631503808">"Turn off Airplane mode to import contacts from the SIM card."</string>
+ <string name="simContacts_airplaneMode" msgid="4654884030631503808">"Turn off aeroplane mode to import contacts from the SIM card."</string>
<string name="enable_pin" msgid="967674051730845376">"Enable/disable SIM PIN"</string>
<string name="change_pin" msgid="3657869530942905790">"Change SIM PIN"</string>
<string name="enter_pin_text" msgid="3182311451978663356">"SIM PIN:"</string>
@@ -523,8 +523,8 @@
<string name="notification_network_selection_title" msgid="255595526707809121">"No service"</string>
<string name="notification_network_selection_text" msgid="553288408722427659">"Selected network<xliff:g id="OPERATOR_NAME">%s</xliff:g> unavailable"</string>
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Turn on mobile network, turn off airplane mode or turn off battery saver mode to make a call."</string>
- <string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Turn off Airplane mode to make a call."</string>
- <string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Turn off Airplane mode or connect to a wireless network to make a call."</string>
+ <string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Turn off aeroplane mode to make a call."</string>
+ <string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Turn off aeroplane mode or connect to a wireless network to make a call."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Exit emergency callback mode to make a non-emergency call."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Not registered on network."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobile network not available."</string>
@@ -552,7 +552,7 @@
<string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"Tap again to call <xliff:g id="EMERGENCY_NUMBER">%s</xliff:g>"</string>
<string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"Turning on radio…"</string>
<string name="emergency_enable_radio_dialog_retry" msgid="4329131876852608587">"No service. Trying again…"</string>
- <string name="radio_off_during_emergency_call" msgid="8011154134040481609">"Cannot enter Airplane mode during an emergency call."</string>
+ <string name="radio_off_during_emergency_call" msgid="8011154134040481609">"Cannot enter aeroplane mode during an emergency call."</string>
<string name="dial_emergency_error" msgid="825822413209026039">"Can\'t call. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> is not an emergency number."</string>
<string name="dial_emergency_empty_error" msgid="2785803395047793634">"Can\'t call. Dial an emergency number."</string>
<string name="dial_emergency_calling_not_available" msgid="6485846193794727823">"Emergency calling not available"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Yes"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"No"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Dismiss"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"The phone is in emergency callback mode"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Until <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">The phone will be in emergency callback mode for <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nDo you want to exit now?</item>
- <item quantity="one">The phone will be in emergency callback mode for <xliff:g id="COUNT_0">%s</xliff:g> minute.\nDo you want to exit now?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Service"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Setup"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Not set>"</string>
@@ -707,7 +701,7 @@
<string name="mobile_data_activate_button" msgid="1139792516354374612">"ADD DATA"</string>
<string name="mobile_data_activate_cancel_button" msgid="3530174817572005860">"CANCEL"</string>
<string name="clh_card_title_call_ended_txt" msgid="5977978317527299698">"Call ended"</string>
- <string name="clh_callFailed_powerOff_txt" msgid="8279934912560765361">"Airplane mode is on"</string>
+ <string name="clh_callFailed_powerOff_txt" msgid="8279934912560765361">"Aeroplane mode is on"</string>
<string name="clh_callFailed_simError_txt" msgid="5128538525762326413">"Can\'t access SIM card"</string>
<string name="clh_incall_error_out_of_service_txt" msgid="2736010617446749869">"Mobile network not available"</string>
<string name="clh_callFailed_unassigned_number_txt" msgid="141967660286695682">"Issue with phone number you are trying to dial. Error code 1."</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Refresh"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Toggle DNS check"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-specific info/settings"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC available:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR restricted:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR available:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR status:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR frequency:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Set radio band mode"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Loading band list…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Set"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index aacdc53..b732508 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"Configure account settings"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"All calling accounts"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"Select which accounts can make calls"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi calling"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi Calling"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"Built-in connection service"</string>
<string name="voicemail" msgid="7697769412804195032">"Voicemail"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Yes"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"No"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Dismiss"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"The phone is in emergency callback mode"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Until <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">The phone will be in emergency callback mode for <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nDo you want to exit now?</item>
- <item quantity="one">The phone will be in emergency callback mode for <xliff:g id="COUNT_0">%s</xliff:g> minute.\nDo you want to exit now?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Service"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Setup"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Not set>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Refresh"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Toggle DNS check"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-specific info/settings"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC available:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR restricted:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR available:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR status:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR frequency:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Set radio band mode"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Loading band list…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Set"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index aacdc53..b732508 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"Configure account settings"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"All calling accounts"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"Select which accounts can make calls"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi calling"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi Calling"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"Built-in connection service"</string>
<string name="voicemail" msgid="7697769412804195032">"Voicemail"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Yes"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"No"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Dismiss"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"The phone is in emergency callback mode"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Until <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">The phone will be in emergency callback mode for <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nDo you want to exit now?</item>
- <item quantity="one">The phone will be in emergency callback mode for <xliff:g id="COUNT_0">%s</xliff:g> minute.\nDo you want to exit now?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Service"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Setup"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Not set>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Refresh"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Toggle DNS check"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-specific info/settings"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC available:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR restricted:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR available:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR status:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR frequency:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Set radio band mode"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Loading band list…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Set"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 91835c5..3f04696 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Yes"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"No"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Dismiss"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"The phone is in emergency callback mode"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Until <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">The phone will be in emergency callback mode for <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nDo you want to exit now?</item>
- <item quantity="one">The phone will be in emergency callback mode for <xliff:g id="COUNT_0">%s</xliff:g> minute.\nDo you want to exit now?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Service"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Setup"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Not set>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Refresh"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Toggle DNS Check"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-specific Info/Settings"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC Available:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR Restricted:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR Available:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR State:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR Frequency:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Set Radio Band Mode"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Loading Band List…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Set"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index d2f0d94..6a052dc 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -95,12 +95,12 @@
<string name="sum_loading_settings" msgid="434063780286688775">"Cargando la configuración…"</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"Número escondido en llamadas salientes"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Número visualizado en llamadas salientes"</string>
- <string name="sum_default_caller_id" msgid="1767070797135682959">"Utilizar configuración predeterminada del operador para visualizar mi número en las llamadas salientes"</string>
+ <string name="sum_default_caller_id" msgid="1767070797135682959">"Utilizar configuración del operador predeterminada para visualizar mi número en las llamadas salientes"</string>
<string name="labelCW" msgid="8449327023861428622">"Llamada en espera"</string>
<string name="sum_cw_enabled" msgid="3977308526187139996">"Durante una llamada, notificarme sobre las llamadas entrantes"</string>
<string name="sum_cw_disabled" msgid="3658094589461768637">"Durante una llamada, notificarme sobre las llamadas entrantes"</string>
<string name="call_forwarding_settings" msgid="8937130467468257671">"Desvío de llamadas"</string>
- <string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"Configuración de desvío de llamadas (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+ <string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"Configuración de desvío de llamada (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"Desvío de llamadas"</string>
<string name="labelCFU" msgid="8870170873036279706">"Desviar siempre"</string>
<string name="messageCFU" msgid="1361806450979589744">"Usar siempre este número"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Sí"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"No"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Descartar"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"El teléfono está en modo de devolución de llamadas de emergencia"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Hasta las <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">El teléfono estará en modo de devolución de llamada de emergencia durante <xliff:g id="COUNT_1">%s</xliff:g> minutos.\n¿Quieres salir ahora?</item>
- <item quantity="one">El teléfono estará en modo de devolución de llamada de emergencia durante <xliff:g id="COUNT_0">%s</xliff:g> minuto.\n¿Quieres salir ahora?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Servicio"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Configuración"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Sin configurar>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Actualizar"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Activar o desactivar la comprobación de DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Configuración/Datos específicos del OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC disponible:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR restringida:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR disponible:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Estado de NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frecuencia de NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Establecer modo de banda de radio"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Cargando lista de bandas…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Establecer"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 183cea5..e8a92c4 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -43,7 +43,7 @@
<string name="send_button" msgid="5070379600779031932">"Enviar"</string>
<string name="pause_prompt_yes" msgid="8184132073048369575">"Sí"</string>
<string name="pause_prompt_no" msgid="2145264674774138579">"No"</string>
- <string name="wild_prompt_str" msgid="5858910969703305375">"Reemplazar el carácter comodín por"</string>
+ <string name="wild_prompt_str" msgid="5858910969703305375">"Sustituir el carácter comodín por"</string>
<string name="no_vm_number" msgid="6623853880546176930">"Falta el número del buzón de voz."</string>
<string name="no_vm_number_msg" msgid="5165161462411372504">"No se ha almacenado ningún número de buzón de voz en la tarjeta SIM."</string>
<string name="add_vm_number_str" msgid="7368168964435881637">"Añadir número"</string>
@@ -62,7 +62,7 @@
<string name="labelCdmaMore_with_label" msgid="7759692829160238152">"Ajustes de llamada de CDMA (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="apn_settings" msgid="1978652203074756623">"Nombres de puntos de acceso"</string>
<string name="settings_label" msgid="9101778088412567956">"Ajustes de red"</string>
- <string name="phone_accounts" msgid="1216879437523774604">"Cuentas de llamada"</string>
+ <string name="phone_accounts" msgid="1216879437523774604">"Cuentas de llamadas"</string>
<string name="phone_accounts_make_calls_with" msgid="16747814788918145">"Realizar llamadas con"</string>
<string name="phone_accounts_make_sip_calls_with" msgid="4691221006731847255">"Realizar llamadas SIP con"</string>
<string name="phone_accounts_ask_every_time" msgid="6192347582666047168">"Preguntar primero"</string>
@@ -184,7 +184,7 @@
<string name="forbidden_network" msgid="5081729819561333023">"(prohibida)"</string>
<string name="choose_network_title" msgid="5335832663422653082">"Elegir red"</string>
<string name="network_disconnected" msgid="8844141106841160825">"Desconectado"</string>
- <string name="network_connected" msgid="2760235679963580224">"Conectado"</string>
+ <string name="network_connected" msgid="2760235679963580224">"Conectada"</string>
<string name="network_connecting" msgid="160901383582774987">"Conectando..."</string>
<string name="network_could_not_connect" msgid="6547460848093727998">"No se ha podido conectar"</string>
<string-array name="preferred_network_mode_choices">
@@ -293,7 +293,7 @@
<string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"operador, esim, sim, euicc, cambiar de operador, añadir operador"</string>
<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">"Datos móviles"</string>
- <string name="mobile_data_settings_summary" msgid="5012570152029118471">"Acceder a datos con la red móvil"</string>
+ <string name="mobile_data_settings_summary" msgid="5012570152029118471">"Acceder a los datos con la red móvil"</string>
<string name="data_usage_disable_mobile" msgid="5669109209055988308">"¿Quieres desactivar los datos móviles?"</string>
<string name="sim_selection_required_pref" msgid="6985901872978341314">"Debes seleccionar una opción"</string>
<string name="sim_change_data_title" msgid="9142726786345906606">"¿Cambiar la SIM de datos?"</string>
@@ -307,7 +307,9 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Período uso datos"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Política velocidad datos"</string>
<string name="throttle_help" msgid="2624535757028809735">"Más información"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) de periodo máximo de <xliff:g id="USED_2">%3$s</xliff:g>.\nPróx periodo en <xliff:g id="USED_3">%4$d</xliff:g> días (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) de periodo máx de <xliff:g id="USED_2">%3$s</xliff:g>"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"Máx de <xliff:g id="USED_0">%1$s</xliff:g> superado.\nFrec datos reducida a <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ del ciclo transcurrido.\nPróx periodo en <xliff:g id="USED_1">%2$d</xliff:g> días (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -547,7 +549,7 @@
<string name="emergency_information_owner_hint" msgid="6256909888049185316">"Propietario"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tocar de nuevo para ver la información"</string>
<string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"Llamada de emergencia"</string>
- <string name="single_emergency_number_title" msgid="8413371079579067196">"Número de emergencia"</string>
+ <string name="single_emergency_number_title" msgid="8413371079579067196">"Llamada de emergencia"</string>
<string name="numerous_emergency_numbers_title" msgid="8972398932506755510">"Números de emergencia"</string>
<string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"Tocar de nuevo para llamar al <xliff:g id="EMERGENCY_NUMBER">%s</xliff:g>"</string>
<string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"Activando señal móvil…"</string>
@@ -567,7 +569,7 @@
<string name="onscreenShowDialpadText" msgid="658465753816164079">"Teclado"</string>
<string name="onscreenMuteText" msgid="5470306116733843621">"Silenciar"</string>
<string name="onscreenAddCallText" msgid="9075675082903611677">"Añadir llamada"</string>
- <string name="onscreenMergeCallsText" msgid="3692389519611225407">"Combinar llamadas"</string>
+ <string name="onscreenMergeCallsText" msgid="3692389519611225407">"Llamada a tres"</string>
<string name="onscreenSwapCallsText" msgid="2682542150803377991">"Cambiar"</string>
<string name="onscreenManageCallsText" msgid="1162047856081836469">"Administrar llamadas"</string>
<string name="onscreenManageConferenceText" msgid="4700574060601755137">"Gestionar llamada de conferencia"</string>
@@ -617,7 +619,7 @@
<string name="ota_unsuccessful" msgid="8531037653803955754">"El teléfono no se ha activado. \nEs posible que tengas que situarte en una zona con más cobertura (cerca de una ventana o en el exterior). \n\nInténtalo de nuevo o ponte en contacto con el servicio de atención al cliente para consultar otras opciones."</string>
<string name="ota_spc_failure" msgid="904092035241370080">"EXCESO DE ERRORES DE SPC"</string>
<string name="ota_call_end" msgid="8657746378290737034">"Atrás"</string>
- <string name="ota_try_again" msgid="6914781945599998550">"Reintentar"</string>
+ <string name="ota_try_again" msgid="6914781945599998550">"Volver a intentarlo"</string>
<string name="ota_next" msgid="2041016619313475914">"Siguiente"</string>
<string name="ecm_exit_dialog" msgid="4200691880721429078">"EcmExitDialog"</string>
<string name="phone_entered_ecm_text" msgid="8431238297843035842">"Se ha activado el modo de devolución de llamada de emergencia."</string>
@@ -637,15 +639,9 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Sí"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"No"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Cerrar"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"El teléfono está en modo de devolución de llamada de emergencia"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Hasta las <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">El teléfono estará en modo de devolución de llamada de emergencia durante <xliff:g id="COUNT_1">%s</xliff:g> minutos.\n¿Quieres salir ahora?</item>
- <item quantity="one">El teléfono estará en modo de devolución de llamada de emergencia durante <xliff:g id="COUNT_0">%s</xliff:g> minuto.\n¿Quieres salir ahora?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Servicio"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Configuración"</string>
- <string name="voicemail_number_not_set" msgid="8831561283386938155">"<Sin establecer>"</string>
+ <string name="voicemail_number_not_set" msgid="8831561283386938155">"<No definido>"</string>
<string name="other_settings" msgid="8895088007393598447">"Otras opciones de llamada"</string>
<string name="calling_via_template" msgid="1791323450703751750">"Llamada vía <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
<string name="contactPhoto" msgid="7885089213135154834">"foto de contacto"</string>
@@ -764,19 +760,19 @@
<string name="sum_call_barring_disabled" msgid="5699448000600153096">"Desactivado"</string>
<string name="call_barring_baoc" msgid="7400892586336429326">"Todas las realizadas"</string>
<string name="call_barring_baoc_enabled" msgid="3131509193386668182">"¿Quieres desbloquear todas las llamadas realizadas?"</string>
- <string name="call_barring_baoc_disabled" msgid="8534224684091141509">"¿Bloquear todas las llamadas realizadas?"</string>
+ <string name="call_barring_baoc_disabled" msgid="8534224684091141509">"¿Quieres bloquear todas las llamadas realizadas?"</string>
<string name="call_barring_baoic" msgid="8668125428666851665">"Internacionales realizadas"</string>
<string name="call_barring_baoic_enabled" msgid="1203758092657630123">"¿Quieres desbloquear las llamadas internacionales realizadas?"</string>
- <string name="call_barring_baoic_disabled" msgid="5656889339002997449">"¿Bloquear las llamadas internacionales realizadas?"</string>
+ <string name="call_barring_baoic_disabled" msgid="5656889339002997449">"¿Quieres bloquear las llamadas internacionales realizadas?"</string>
<string name="call_barring_baoicr" msgid="8566167764432343487">"Itinerancia de llamadas internacionales realizadas"</string>
<string name="call_barring_baoicr_enabled" msgid="1615324165512798478">"¿Quieres desbloquear la itinerancia de las llamadas internacionales realizadas?"</string>
- <string name="call_barring_baoicr_disabled" msgid="172010175248142831">"¿Bloquear la itinerancia de las llamadas internacionales realizadas?"</string>
+ <string name="call_barring_baoicr_disabled" msgid="172010175248142831">"¿Quieres bloquear la itinerancia de las llamadas internacionales realizadas?"</string>
<string name="call_barring_baic" msgid="7941393541678658566">"Todas las entrantes"</string>
<string name="call_barring_baic_enabled" msgid="4357332358020337470">"¿Quieres desbloquear todas las llamadas entrantes?"</string>
- <string name="call_barring_baic_disabled" msgid="2355945245938240958">"¿Bloquear todas las llamadas entrantes?"</string>
+ <string name="call_barring_baic_disabled" msgid="2355945245938240958">"¿Quieres bloquear todas las llamadas entrantes?"</string>
<string name="call_barring_baicr" msgid="8712249337313034226">"Itinerancia de llamadas internacionales entrantes"</string>
<string name="call_barring_baicr_enabled" msgid="64774270234828175">"¿Quieres desbloquear la itinerancia de las llamadas internacionales entrantes?"</string>
- <string name="call_barring_baicr_disabled" msgid="3488129262744027262">"¿Bloquear la itinerancia de las llamadas internacionales entrantes?"</string>
+ <string name="call_barring_baicr_disabled" msgid="3488129262744027262">"¿Quieres bloquear la itinerancia de las llamadas internacionales entrantes?"</string>
<string name="call_barring_deactivate_all" msgid="7837931580047157328">"Desactivar todo"</string>
<string name="call_barring_deactivate_all_description" msgid="4474119585042121604">"Desactivar todos los ajustes de bloqueo de llamadas"</string>
<string name="call_barring_deactivate_success" msgid="3545644320298275337">"Se ha desactivado el bloqueo de llamadas"</string>
@@ -898,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Actualizar"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Activar o desactivar comprobación de DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Ajustes o información específica de OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC disponible:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR restringido:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR disponible:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Estado de NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frecuencia de NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Establecer modo de banda de señal móvil"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Cargando lista de bandas…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Seleccionar"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 50e54e5..dcbbc23 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Andmete kasutamise periood"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Andmeedastuskiiruse eeskirjad"</string>
<string name="throttle_help" msgid="2624535757028809735">"Lisateave"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) / <xliff:g id="USED_2">%3$s</xliff:g> perioodi maksimumist\nJärgmine periood algab <xliff:g id="USED_3">%4$d</xliff:g> päeva pärast (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>??) / <xliff:g id="USED_2">%3$s</xliff:g> maksimaalne periood\nJärgmine periood algab <xliff:g id="USED_3">%4$d</xliff:g> päeva pärast (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>??) / <xliff:g id="USED_2">%3$s</xliff:g> maksimaalsest perioodist"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> maksimaalne ületatud\nAndmeedastuskiirus vähendatud määrale <xliff:g id="USED_1">%2$d</xliff:g> kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>?? tsüklist möödunud\nJärgmine periood algab <xliff:g id="USED_1">%2$d</xliff:g> päeva pärast (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Jah"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Ei"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Loobu"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefon on hädaolukorra tagasihelistusrežiimis"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Kuni <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Telefon on hädaolukorra tagasihelistusrežiimis <xliff:g id="COUNT_1">%s</xliff:g> minutit.\nKas soovite kohe väljuda?</item>
- <item quantity="one">Telefon on hädaolukorra tagasihelistusrežiimis <xliff:g id="COUNT_0">%s</xliff:g> minut.\nKas soovite kohe väljuda?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Teenus"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Seadistus"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Määramata>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Värskendamine"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS-i kontrolli sisse- või väljalülitamine"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-i teave/seaded"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC saadaval:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR piiratud:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR saadaval:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR-i olek:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR-i sagedus:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Raadio ribarežiimi määramine"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Ribaloendi laadimine …"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Määra"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 552a138..1c75c30 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -38,7 +38,7 @@
<string name="audio_mode_earpiece" msgid="2823700267171134282">"Aurikularrak"</string>
<string name="audio_mode_wired_headset" msgid="5028010823105817443">"Entzungailu kableduna"</string>
<string name="audio_mode_bluetooth" msgid="25732183428018809">"Bluetooth entzungailua"</string>
- <string name="wait_prompt_str" msgid="5136209532150094910">"Tonu hauek bidali nahi dituzu?\n"</string>
+ <string name="wait_prompt_str" msgid="5136209532150094910">"Ondorengo tonuak bidali?\n"</string>
<string name="pause_prompt_str" msgid="2308897950360272213">"Tonuak bidaltzen\n"</string>
<string name="send_button" msgid="5070379600779031932">"Bidali"</string>
<string name="pause_prompt_yes" msgid="8184132073048369575">"Bai"</string>
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"Konfiguratu kontuaren ezarpenak"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"Deiak egiteko kontu guztiak"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"Hautatu zein kontutatik egin daitezkeen deiak"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"Wifi bidezko deiak"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi bidezko deiak"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"Konektatzeko zerbitzu integratua"</string>
<string name="voicemail" msgid="7697769412804195032">"Erantzungailua"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"Erantzungailua (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -95,32 +95,32 @@
<string name="sum_loading_settings" msgid="434063780286688775">"Ezarpenak kargatzen…"</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"Ezkutatu zenbakia irteerako deietan"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Erakutsi zenbakia irteerako deietan"</string>
- <string name="sum_default_caller_id" msgid="1767070797135682959">"Erabili operadorearen ezarpen lehenetsiak, egiten ditudan deietan nire zenbakia erakusteko"</string>
+ <string name="sum_default_caller_id" msgid="1767070797135682959">"Erabili operadorearen ezarpen lehenetsiak irteerako deietan nire zenbakia erakusteko"</string>
<string name="labelCW" msgid="8449327023861428622">"Deiak zain"</string>
- <string name="sum_cw_enabled" msgid="3977308526187139996">"Deiak abian dauden bitartean, eman jasotzen ditudan deien berri"</string>
- <string name="sum_cw_disabled" msgid="3658094589461768637">"Deiak abian dauden bitartean, eman jasotzen ditudan deien berri"</string>
+ <string name="sum_cw_enabled" msgid="3977308526187139996">"Deiak abian dauden bitartean, eman sarrerako deien berri"</string>
+ <string name="sum_cw_disabled" msgid="3658094589461768637">"Deiak abian dauden bitartean, eman sarrerako deien berri"</string>
<string name="call_forwarding_settings" msgid="8937130467468257671">"Dei-desbideratzearen ezarpenak"</string>
<string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"Deiak desbideratzeko ezarpenak (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"Dei-desbideratzea"</string>
<string name="labelCFU" msgid="8870170873036279706">"Desbideratu beti"</string>
<string name="messageCFU" msgid="1361806450979589744">"Erabili beti zenbaki hau"</string>
<string name="sum_cfu_enabled_indicator" msgid="9030139213402432776">"Dei guztiak desbideratzen"</string>
- <string name="sum_cfu_enabled" msgid="5806923046528144526">"Dei guztiak <xliff:g id="PHONENUMBER">{0}</xliff:g> zenbakira desbideratzen dira"</string>
+ <string name="sum_cfu_enabled" msgid="5806923046528144526">"Dei guztiak <xliff:g id="PHONENUMBER">{0}</xliff:g> zenbakira desbideratzen"</string>
<string name="sum_cfu_enabled_no_number" msgid="7287752761743377930">"Zenbakia ez dago eskuragarri"</string>
<string name="sum_cfu_disabled" msgid="5010617134210809853">"Desaktibatuta"</string>
<string name="labelCFB" msgid="615265213360512768">"Okupatuta nagoenean"</string>
<string name="messageCFB" msgid="1958017270393563388">"Okupatuta dagoenerako zenbakia"</string>
- <string name="sum_cfb_enabled" msgid="332037613072049492">"<xliff:g id="PHONENUMBER">{0}</xliff:g> zenbakira desbideratzen dira"</string>
+ <string name="sum_cfb_enabled" msgid="332037613072049492">"<xliff:g id="PHONENUMBER">{0}</xliff:g> zenbakira desbideratzen"</string>
<string name="sum_cfb_disabled" msgid="3589913334164866035">"Desaktibatuta"</string>
<string name="disable_cfb_forbidden" msgid="4831494744351633961">"Operadoreak ez du dei-desbideratzeak desgaitzea onartzen telefonoa okupatuta dagoen bitartean."</string>
<string name="labelCFNRy" msgid="3403533792248457946">"Erantzuten ez dudanean"</string>
<string name="messageCFNRy" msgid="7644434155765359009">"Erantzunik jasotzen ez denerako zenbakia"</string>
- <string name="sum_cfnry_enabled" msgid="3000500837493854799">"<xliff:g id="PHONENUMBER">{0}</xliff:g> zenbakira desbideratzen dira"</string>
+ <string name="sum_cfnry_enabled" msgid="3000500837493854799">"<xliff:g id="PHONENUMBER">{0}</xliff:g> zenbakira desbideratzen"</string>
<string name="sum_cfnry_disabled" msgid="1990563512406017880">"Desaktibatuta"</string>
<string name="disable_cfnry_forbidden" msgid="3174731413216550689">"Operadoreak ez du dei-desbideratzeak desgaitzea onartzen telefonoak erantzuten ez duenean."</string>
- <string name="labelCFNRc" msgid="4163399350778066013">"Telefonoa itzalita edo estalduratik at dagoenean"</string>
+ <string name="labelCFNRc" msgid="4163399350778066013">"Konektatu gabe nagoenean"</string>
<string name="messageCFNRc" msgid="6980340731313007250">"Eskuragarri ez dagoenerako zenbakia"</string>
- <string name="sum_cfnrc_enabled" msgid="1799069234006073477">"<xliff:g id="PHONENUMBER">{0}</xliff:g> zenbakira desbideratzen dira"</string>
+ <string name="sum_cfnrc_enabled" msgid="1799069234006073477">"<xliff:g id="PHONENUMBER">{0}</xliff:g> zenbakira desbideratzen"</string>
<string name="sum_cfnrc_disabled" msgid="739289696796917683">"Desaktibatuta"</string>
<string name="disable_cfnrc_forbidden" msgid="775348748084726890">"Operadoreak ez du dei-desbideratzeak desgaitzea onartzen telefonoa eskuragarri ez dagoen bitartean."</string>
<string name="updating_title" msgid="6130548922615719689">"Deien ezarpenak"</string>
@@ -298,7 +298,7 @@
<string name="sim_selection_required_pref" msgid="6985901872978341314">"Hautatu egin behar da"</string>
<string name="sim_change_data_title" msgid="9142726786345906606">"Datuetarako SIMa aldatu nahi duzu?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"Datu-konexiorako, <xliff:g id="NEW_SIM">%1$s</xliff:g> txartela erabili nahi duzu <xliff:g id="OLD_SIM">%2$s</xliff:g> txartelaren ordez?"</string>
- <string name="wifi_calling_settings_title" msgid="5800018845662016507">"Wifi bidezko deiak"</string>
+ <string name="wifi_calling_settings_title" msgid="5800018845662016507">"Wi-Fi bidezko deiak"</string>
<string name="video_calling_settings_title" msgid="342829454913266078">"Operadorearen bideo-deiak"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"GSM/UMTS aukerak"</string>
<string name="cdma_options" msgid="3669592472226145665">"CDMA aukerak"</string>
@@ -307,7 +307,9 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Datuak erabiltzeko epea"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Datu-abiaduraren gidalerroak"</string>
<string name="throttle_help" msgid="2624535757028809735">"Lortu informazio gehiago"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g>/<xliff:g id="USED_2">%3$s</xliff:g> erabilita (%% <xliff:g id="USED_1">%2$d</xliff:g>) muga-epean\nHurrengo epea <xliff:g id="USED_3">%4$d</xliff:g> egun barru hasiko da (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g>/<xliff:g id="USED_2">%3$s</xliff:g> erabilita (٪ <xliff:g id="USED_1">%2$d</xliff:g>) muga-epean"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> muga gainditu duzu\nDatu-abiadura murriztu zaizu. <xliff:g id="USED_1">%2$d</xliff:g> Kb/s duzu orain."</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"Zikloaren ٪ <xliff:g id="USED_0">%1$d</xliff:g> igaro da\nHurrengo aldia <xliff:g id="USED_1">%2$d</xliff:g> egun barru hasten da (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -430,7 +432,7 @@
<string name="manage_fdn_list" msgid="3341716430375195441">"Markatze finkoko zenbakien zerrenda"</string>
<string name="fdn_list_with_label" msgid="1409655283510382556">"Markatze finkoko zenbakiak (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="fdn_activation" msgid="2178637004710435895">"Markatze finkoko zenbakiaren aktibazioa"</string>
- <string name="fdn_enabled" msgid="7017355494808056447">"Markatze finkoko zenbakiak gaituta"</string>
+ <string name="fdn_enabled" msgid="7017355494808056447">"Markatze finkoko zenbakiak gaituta daude"</string>
<string name="fdn_disabled" msgid="6696468878037736600">"Markatze finkoko zenbakiak desgaituta daude"</string>
<string name="enable_fdn" msgid="4830555730418033723">"Gaitu markatze finkoko zenbakiak"</string>
<string name="disable_fdn" msgid="3918794950264647541">"Desgaitu markatze finkoko zenbakia"</string>
@@ -525,7 +527,7 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Deitzeko, aktibatu sare mugikorra, desaktibatu hegaldi modua edo desaktibatu bateria-aurrezlea."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Deia egiteko, desaktibatu hegaldi modua."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Deia egiteko, desaktibatu hegaldi modua edo konektatu haririk gabeko sare batera."</string>
- <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Larrialdikoak ez diren deiak egiteko, irten larrialdi-zerbitzuen deiak jasotzeko modutik."</string>
+ <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Larrialdikoak ez diren deiak egiteko, irten larrialdi-deiak soilik jasotzeko modutik."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Ez dago sarean erregistratuta."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Sare mugikorra ez dago erabilgarri."</string>
<string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Sare mugikorra ez dago erabilgarri. Deia egiteko, konektatu haririk gabeko sare batera."</string>
@@ -566,7 +568,7 @@
<string name="onscreenEndCallText" msgid="6138725377654842757">"Amaitu"</string>
<string name="onscreenShowDialpadText" msgid="658465753816164079">"Markagailua"</string>
<string name="onscreenMuteText" msgid="5470306116733843621">"Desaktibatu audioa"</string>
- <string name="onscreenAddCallText" msgid="9075675082903611677">"Gehitu dei bat"</string>
+ <string name="onscreenAddCallText" msgid="9075675082903611677">"Gehitu deia"</string>
<string name="onscreenMergeCallsText" msgid="3692389519611225407">"Bateratu deiak"</string>
<string name="onscreenSwapCallsText" msgid="2682542150803377991">"Trukatu"</string>
<string name="onscreenManageCallsText" msgid="1162047856081836469">"Kudeatu deiak"</string>
@@ -614,35 +616,29 @@
<string name="ota_progress" msgid="8837259285255700132">"Telefonoa programatzen…"</string>
<string name="ota_failure" msgid="5674217489921481576">"Ezin izan da programatu telefonoa"</string>
<string name="ota_successful" msgid="1106825981548107774">"Telefonoa aktibatu egin da. Zerbitzua hasteko 15 minutu ere behar izan daitezke."</string>
- <string name="ota_unsuccessful" msgid="8531037653803955754">"Ez duzu telefonoa aktibatu.\nBaliteke estaldura gehiago duen eremu bat aurkitu behar izatea (leiho baten ondoan edo kanpoan).\n\nSaiatu berriro edo, aukera gehiago ezagutzeko, deitu bezeroarentzako laguntza-zerbitzura."</string>
+ <string name="ota_unsuccessful" msgid="8531037653803955754">"Ez duzu telefonoa aktibatu.\nBaliteke estaldura gehiago duen eremu bat aurkitu behar izatea (leiho baten ondoan edo kanpoan).\n\nSaiatu berriro edo, aukera gehiago ezagutzeko, deitu bezeroarentzako zerbitzura."</string>
<string name="ota_spc_failure" msgid="904092035241370080">"SPC HUTSEGITE GEHIEGI"</string>
<string name="ota_call_end" msgid="8657746378290737034">"Atzera"</string>
<string name="ota_try_again" msgid="6914781945599998550">"Saiatu berriro"</string>
<string name="ota_next" msgid="2041016619313475914">"Hurrengoa"</string>
<string name="ecm_exit_dialog" msgid="4200691880721429078">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="8431238297843035842">"Larrialdi-zerbitzuen deiak jasotzeko modua aktibatu da"</string>
- <string name="phone_in_ecm_notification_title" msgid="6825016389926367946">"Larrialdi-zerbitzuen deiak jasotzeko modua"</string>
+ <string name="phone_entered_ecm_text" msgid="8431238297843035842">"Larrialdi-deiak soilik jasotzeko modua aktibatu da"</string>
+ <string name="phone_in_ecm_notification_title" msgid="6825016389926367946">"Larrialdi-deiak soilik jasotzeko modua"</string>
<string name="phone_in_ecm_call_notification_text" msgid="653972232922670335">"Datu-konexioa desgaituta"</string>
<string name="phone_in_ecm_notification_complete_time" msgid="7341624337163082759">"Ez duzu izango datu-konexiorik ordu honetara arte: <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
<plurals name="alert_dialog_exit_ecm" formatted="false" msgid="5425906903766466743">
- <item quantity="other">Telefonoa larrialdi-zerbitzuen deiak jasotzeko moduan egongo da <xliff:g id="COUNT_1">%s</xliff:g> minutuz. Modu horretan dagoen bitartean, ezingo duzu datu-konexioa behar duen aplikaziorik erabili. Irten nahi duzu?</item>
- <item quantity="one">Telefonoa larrialdi-zerbitzuen deiak jasotzeko moduan egongo da <xliff:g id="COUNT_0">%s</xliff:g> minutuz. Modu horretan dagoen bitartean, ezingo duzu datu-konexioa behar duen aplikaziorik erabili. Irten nahi duzu?</item>
+ <item quantity="other">Telefonoa larrialdi-deiak soilik jasotzeko moduan egongo da <xliff:g id="COUNT_1">%s</xliff:g> minutuz. Modu horretan dagoen bitartean, ezingo duzu datu-konexioa behar duen aplikaziorik erabili. Irten nahi duzu?</item>
+ <item quantity="one">Telefonoa larrialdi-deiak soilik jasotzeko moduan egongo da <xliff:g id="COUNT_0">%s</xliff:g> minutuz. Modu horretan dagoen bitartean, ezingo duzu datu-konexioa behar duen aplikaziorik erabili. Irten nahi duzu?</item>
</plurals>
<plurals name="alert_dialog_not_avaialble_in_ecm" formatted="false" msgid="1152682528741457004">
- <item quantity="other">Hautatutako ekintza ez dago larrialdi-zerbitzuen deiak jasotzeko moduan erabilgarri. Telefonoa <xliff:g id="COUNT_1">%s</xliff:g> minutuz egongo da modu horretan. Irten nahi duzu?</item>
- <item quantity="one">Hautatutako ekintza ez dago larrialdi-zerbitzuen deiak jasotzeko moduan erabilgarri. Telefonoa <xliff:g id="COUNT_0">%s</xliff:g> minutuz egongo da modu horretan. Irten nahi duzu?</item>
+ <item quantity="other">Hautatutako ekintza ez dago larrialdi-deiak soilik jasotzeko moduan erabilgarri. Telefonoa <xliff:g id="COUNT_1">%s</xliff:g> minutuz egongo da modu horretan. Irten nahi duzu?</item>
+ <item quantity="one">Hautatutako ekintza ez dago larrialdi-deiak soilik jasotzeko moduan erabilgarri. Telefonoa <xliff:g id="COUNT_0">%s</xliff:g> minutuz egongo da modu horretan. Irten nahi duzu?</item>
</plurals>
<string name="alert_dialog_in_ecm_call" msgid="1207545603149771978">"Hautatutako ekintza ez dago erabilgarri larrialdi-deia egiten ari den bitartean."</string>
- <string name="progress_dialog_exiting_ecm" msgid="9159080081676927217">"Larrialdi-zerbitzuen deiak jasotzeko modutik irteten"</string>
+ <string name="progress_dialog_exiting_ecm" msgid="9159080081676927217">"Larrialdi-deiak soilik jasotzeko modutik irteten"</string>
<string name="alert_dialog_yes" msgid="3532525979632841417">"Bai"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Ez"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Baztertu"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Larrialdi-zerbitzuen deiak jasotzeko moduan dago telefonoa"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> arte"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Telefonoa <xliff:g id="COUNT_1">%s</xliff:g> minutuz egongo da larrialdi-zerbitzuen deiak jasotzeko moduan.\nIrten nahi duzu?</item>
- <item quantity="one">Telefonoa <xliff:g id="COUNT_0">%s</xliff:g> minutuz egongo da larrialdi-zerbitzuen deiak jasotzeko moduan.\nIrten nahi duzu?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Zerbitzua"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Konfigurazioa"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Ezarri gabe>"</string>
@@ -675,7 +671,7 @@
<string name="callFailed_cdma_activation" msgid="5392057031552253550">"SIM txartel batek zerbitzua aktibatu du eta telefonoaren ibiltaritza-gaitasunak eguneratu ditu."</string>
<string name="callFailed_cdma_call_limit" msgid="1074219746093031412">"Dei gehiegi daude aktibo. Amaitu edo bateratu abian diren deiak beste bat egin aurretik."</string>
<string name="callFailed_imei_not_accepted" msgid="7257903653685147251">"Ezin da konektatu. Erabili balio duen SIM txartel bat."</string>
- <string name="callFailed_wifi_lost" msgid="1788036730589163141">"Galdu egin da wifi-konexioa. Amaitu da deia."</string>
+ <string name="callFailed_wifi_lost" msgid="1788036730589163141">"Galdu egin da wifi bidezko konexioa. Amaitu da deia."</string>
<string name="dialFailed_low_battery" msgid="6857904237423407056">"Ezin da egin deia, bateria gutxi gelditzen delako."</string>
<string name="callFailed_low_battery" msgid="4056828320214416182">"Bideo-deia amaitu egin da bateria gutxi gelditzen delako."</string>
<string name="callFailed_emergency_call_over_wfc_not_available" msgid="5944309590693432042">"Ez daude erabilgarri wifi bidezko larrialdi-deiak kokapen honetan."</string>
@@ -898,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Freskatu"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Aldatu DNS egiaztapenaren egoera"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Jatorrizko fabrikatzailearen berariazko informazioa edota ezarpenak"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC erabilgarri:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR mugatuta:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR erabilgarri:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR estatua:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR maiztasuna:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Ezarri irrati-bandaren modua"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Banden zerrenda kargatzen…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Ezarri"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 56ec019..5e029f0 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -135,7 +135,7 @@
<string name="stk_cc_ss_to_dial_error" msgid="5147693491690618704">"درخواست SS به تماس معمولی تغییر کرد"</string>
<string name="stk_cc_ss_to_ussd_error" msgid="8330749347425752192">"درخواست SS بهدرخواست USSD تغییر کرد"</string>
<string name="stk_cc_ss_to_ss_error" msgid="8297155544652134278">"بهدرخواست SS جدید تغییر کرد"</string>
- <string name="stk_cc_ss_to_dial_video_error" msgid="4255261231466032505">"درخواست SS به تماس تصویری تغییر کرد"</string>
+ <string name="stk_cc_ss_to_dial_video_error" msgid="4255261231466032505">"درخواست SS به تماس ویدیویی تغییر کرد"</string>
<string name="fdn_check_failure" msgid="1833769746374185247">"تنظیم اعداد شمارهگیری ثابت برنامههای تلفن شما غیرفعال است. درنتیجه، برخی از ویژگیهای مربوط به تماس کار نمیکند."</string>
<string name="radio_off_error" msgid="8321564164914232181">"قبل از مشاهدهٔ این تنظیمات، رادیو را روشن کنید."</string>
<string name="close_dialog" msgid="1074977476136119408">"تأیید"</string>
@@ -299,7 +299,7 @@
<string name="sim_change_data_title" msgid="9142726786345906606">"سیمکارت داده تغییر کند؟"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"برای داده تلفن همراه، از <xliff:g id="NEW_SIM">%1$s</xliff:g> بهجای <xliff:g id="OLD_SIM">%2$s</xliff:g> استفاده شود؟"</string>
<string name="wifi_calling_settings_title" msgid="5800018845662016507">"تماس ازطریق Wi-Fi"</string>
- <string name="video_calling_settings_title" msgid="342829454913266078">"تماس تصویری با شرکت مخابراتی"</string>
+ <string name="video_calling_settings_title" msgid="342829454913266078">"تماس ویدیویی با شرکت مخابراتی"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"گزینههای GSM/UMTS"</string>
<string name="cdma_options" msgid="3669592472226145665">"گزینههای CDMA"</string>
<string name="throttle_data_usage" msgid="1944145350660420711">"مصرف داده"</string>
@@ -440,13 +440,13 @@
<string name="sum_fdn" msgid="6152246141642323582">"مدیریت شمارههای شمارهگیری ثابت"</string>
<string name="sum_fdn_change_pin" msgid="3510994280557335727">"تغییر پین برای دسترسی FDN"</string>
<string name="sum_fdn_manage_list" msgid="3311397063233992907">"مدیریت فهرست شماره تلفن"</string>
- <string name="voice_privacy" msgid="7346935172372181951">"حریمخصوصی صوتی"</string>
+ <string name="voice_privacy" msgid="7346935172372181951">"حریم خصوصی صوتی"</string>
<string name="voice_privacy_summary" msgid="3556460926168473346">"فعال کردن حالت رازداری پیشرفته"</string>
<string name="tty_mode_option_title" msgid="3843817710032641703">"حالت TTY"</string>
<string name="tty_mode_option_summary" msgid="4770510287236494371">"تنظیم حالت TTY"</string>
<string name="auto_retry_mode_title" msgid="2985801935424422340">"سعی مجدد خودکار"</string>
<string name="auto_retry_mode_summary" msgid="2863919925349511402">"فعال کردن حالت سعی مجدد خودکار"</string>
- <string name="tty_mode_not_allowed_video_call" msgid="6551976083652752815">"تغییر حالت TTY در طول تماس تصویری مجاز نیست"</string>
+ <string name="tty_mode_not_allowed_video_call" msgid="6551976083652752815">"تغییر حالت TTY در طول تماس ویدئویی مجاز نیست"</string>
<string name="menu_add" msgid="5616487894975773141">"افزودن مخاطب"</string>
<string name="menu_edit" msgid="3593856941552460706">"ویرایش مخاطب"</string>
<string name="menu_delete" msgid="6326861853830546488">"حذف مخاطب"</string>
@@ -572,7 +572,7 @@
<string name="onscreenManageCallsText" msgid="1162047856081836469">"مدیریت تماسها"</string>
<string name="onscreenManageConferenceText" msgid="4700574060601755137">"مدیریت کنفرانس"</string>
<string name="onscreenAudioText" msgid="7224226735052019986">"صوتی"</string>
- <string name="onscreenVideoCallText" msgid="1743992456126258698">"تماس تصویری"</string>
+ <string name="onscreenVideoCallText" msgid="1743992456126258698">"تماس ویدئویی"</string>
<string name="importSimEntry" msgid="3892354284082689894">"وارد کردن"</string>
<string name="importAllSimEntries" msgid="2628391505643564007">"وارد کردن همه"</string>
<string name="importingSimContacts" msgid="4995457122107888932">"وارد کردن مخاطبین سیم"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"بله"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"نه"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"رد کردن"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"تلفن در حالت «تماس اضطراری» است"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"تا<xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">تلفن به مدت <xliff:g id="COUNT_1">%s</xliff:g> دقیقه در حالت «تماس اضطراری» خواهد بود.\nمیخواهید اکنون خارج شوید؟</item>
- <item quantity="other">تلفن به مدت <xliff:g id="COUNT_1">%s</xliff:g> دقیقه در حالت «تماس اضطراری» خواهد بود.\nمیخواهید اکنون خارج شوید؟</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"سرویس"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"تنظیم"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<تنظیم نشده>"</string>
@@ -660,8 +654,8 @@
<string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"تغییر پین"</string>
<string name="preference_category_ringtone" msgid="8787281191375434976">"آهنگ زنگ و لرزش"</string>
<string name="pstn_connection_service_label" msgid="9200102709997537069">"سیمکارتهای داخلی"</string>
- <string name="enable_video_calling_title" msgid="7246600931634161830">"روشن کردن تماس تصویری"</string>
- <string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"برای روشن کردن تماس تصویری، باید حالت پیشرفته 4G LTE را در تنظیمات شبکه فعال کنید."</string>
+ <string name="enable_video_calling_title" msgid="7246600931634161830">"روشن کردن تماس ویدئویی"</string>
+ <string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"برای روشن کردن تماس ویدئویی، باید حالت پیشرفته 4G LTE را در تنظیمات شبکه فعال کنید."</string>
<string name="enable_video_calling_dialog_settings" msgid="8697890611305307110">"تنظیمات شبکه"</string>
<string name="enable_video_calling_dialog_close" msgid="4298929725917045270">"بستن"</string>
<string name="sim_label_emergency_calls" msgid="9078241989421522310">"تماسهای اضطراری"</string>
@@ -677,7 +671,7 @@
<string name="callFailed_imei_not_accepted" msgid="7257903653685147251">"مرتبط نشد، لطفاً سیم کارت معتبری را وارد کنید."</string>
<string name="callFailed_wifi_lost" msgid="1788036730589163141">"اتصال وایفای قطع شد. تماس پایان یافت."</string>
<string name="dialFailed_low_battery" msgid="6857904237423407056">"به دلیل شارژ کم باتری، نمیتوان تماسی برقرار کرد."</string>
- <string name="callFailed_low_battery" msgid="4056828320214416182">"تماس تصویری بهدلیل شارژ کم باتری پایان یافت."</string>
+ <string name="callFailed_low_battery" msgid="4056828320214416182">"تماس ویدیویی بهدلیل شارژ کم باتری پایان یافت."</string>
<string name="callFailed_emergency_call_over_wfc_not_available" msgid="5944309590693432042">"در این مکان تماس اضطراری با «تماس ازطریق Wi-Fi» امکانپذیر نیست."</string>
<string name="callFailed_wfc_service_not_available_in_this_location" msgid="3624536608369524988">"در این مکان تماس ازطریق Wi-Fi امکانپذیر نیست."</string>
<string name="change_pin_title" msgid="3564254326626797321">"تغییر پین پست صوتی"</string>
@@ -842,7 +836,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>\nصدا ازطریق LTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nصدا ازطریق WiFi: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nتماس تصویری: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nواسط UT: <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>\nصدا ازطریق LTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nصدا ازطریق WiFi: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nتماس ویدیویی: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nواسط UT: <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>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"بازخوانی"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"تغییر وضعیت علامت DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"تنظیمات/اطلاعات خاص OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC دردسترس است:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR محدود شده است:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR دردسترس است:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"وضعیت NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"فرکانس NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"تنظیم حالت باند رادیو"</string>
<string name="band_mode_loading" msgid="795923726636735967">"درحال بار کردن فهرست باند…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"تنظیم"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 91e2e87..e9ac919 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -107,21 +107,21 @@
<string name="sum_cfu_enabled_indicator" msgid="9030139213402432776">"Kaikki puhelut siirretään"</string>
<string name="sum_cfu_enabled" msgid="5806923046528144526">"Siirretään kaikki puhelut numeroon <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfu_enabled_no_number" msgid="7287752761743377930">"Numeroon ei saada yhteyttä"</string>
- <string name="sum_cfu_disabled" msgid="5010617134210809853">"Ei päällä"</string>
+ <string name="sum_cfu_disabled" msgid="5010617134210809853">"Ei käytössä"</string>
<string name="labelCFB" msgid="615265213360512768">"Kun olen varattu"</string>
<string name="messageCFB" msgid="1958017270393563388">"Soita, kun numero on varattu:"</string>
<string name="sum_cfb_enabled" msgid="332037613072049492">"Puhelu siirretään numeroon <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
- <string name="sum_cfb_disabled" msgid="3589913334164866035">"Ei päällä"</string>
+ <string name="sum_cfb_disabled" msgid="3589913334164866035">"Ei käytössä"</string>
<string name="disable_cfb_forbidden" msgid="4831494744351633961">"Operaattorisi ei tue soitonsiirtojen poistamista käytöstä, kun puhelimesi on varattuna."</string>
<string name="labelCFNRy" msgid="3403533792248457946">"Kun en vastaa"</string>
<string name="messageCFNRy" msgid="7644434155765359009">"Soita, kun numero ei vastaa:"</string>
<string name="sum_cfnry_enabled" msgid="3000500837493854799">"Puhelu siirretään numeroon <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
- <string name="sum_cfnry_disabled" msgid="1990563512406017880">"Ei päällä"</string>
+ <string name="sum_cfnry_disabled" msgid="1990563512406017880">"Ei käytössä"</string>
<string name="disable_cfnry_forbidden" msgid="3174731413216550689">"Operaattorisi ei tue soitonsiirtojen poistamista käytöstä, kun puhelimesi ei vastaa."</string>
<string name="labelCFNRc" msgid="4163399350778066013">"Kun en ole tavoitettavissa"</string>
<string name="messageCFNRc" msgid="6980340731313007250">"Soita, kun numeroon ei saada yhteyttä:"</string>
<string name="sum_cfnrc_enabled" msgid="1799069234006073477">"Puhelu siirretään numeroon <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
- <string name="sum_cfnrc_disabled" msgid="739289696796917683">"Ei päällä"</string>
+ <string name="sum_cfnrc_disabled" msgid="739289696796917683">"Ei käytössä"</string>
<string name="disable_cfnrc_forbidden" msgid="775348748084726890">"Operaattorisi ei tue soitonsiirtojen poistamista käytöstä puhelimesi ollessa saavuttamattomissa."</string>
<string name="updating_title" msgid="6130548922615719689">"Puheluasetukset"</string>
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"Vain järjestelmänvalvoja voi muuttaa puheluasetuksia."</string>
@@ -274,8 +274,8 @@
<string name="data_enable_summary" msgid="696860063456536557">"Salli tiedonsiirto"</string>
<string name="dialog_alert_title" msgid="5260471806940268478">"Huomio"</string>
<string name="roaming" msgid="1576180772877858949">"Roaming"</string>
- <string name="roaming_enable" msgid="6853685214521494819">"Yhdistä verkkoon roaming-tilassa"</string>
- <string name="roaming_disable" msgid="8856224638624592681">"Yhdistä verkkoon roaming-tilassa"</string>
+ <string name="roaming_enable" msgid="6853685214521494819">"Yhdistä verkkoon roaming-tilassa."</string>
+ <string name="roaming_disable" msgid="8856224638624592681">"Yhdistä verkkoon roaming-tilassa."</string>
<string name="roaming_reenable_message" msgid="1951802463885727915">"Roaming ei ole käytössä. Ota käyttöön napauttamalla."</string>
<string name="roaming_enabled_message" msgid="9022249120750897">"Puhelusta saatetaan periä roaming-maksuja. Muokkaa napauttamalla."</string>
<string name="roaming_notification_title" msgid="3590348480688047320">"Mobiilidatayhteys katkesi"</string>
@@ -294,7 +294,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">"Mobiilidata"</string>
<string name="mobile_data_settings_summary" msgid="5012570152029118471">"Käytä dataa mobiiliverkon kautta."</string>
- <string name="data_usage_disable_mobile" msgid="5669109209055988308">"Laitetaanko mobiilidata pois päältä?"</string>
+ <string name="data_usage_disable_mobile" msgid="5669109209055988308">"Poistetaanko mobiilidata käytöstä?"</string>
<string name="sim_selection_required_pref" msgid="6985901872978341314">"Valinta on pakollinen"</string>
<string name="sim_change_data_title" msgid="9142726786345906606">"Vaihdetaanko tied.siirto-SIM?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"Käytetäänkö SIM-kortin <xliff:g id="NEW_SIM">%1$s</xliff:g> mobiilidataa kortin <xliff:g id="OLD_SIM">%2$s</xliff:g> sijaan?"</string>
@@ -307,7 +307,9 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Tietojen käyttöjakso"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Tiedonsiirtonopeuskäytäntö"</string>
<string name="throttle_help" msgid="2624535757028809735">"Lisätietoja"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> %%) / <xliff:g id="USED_2">%3$s</xliff:g> jakson enimmäismäärästä\nSeuraava kausi alkaa <xliff:g id="USED_3">%4$d</xliff:g> päivän kuluttua (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) / <xliff:g id="USED_2">%3$s</xliff:g> jakson enimmäismäärästä"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> enimmäismäärä ylitetty\nTiedonsiirtonopeus vähennetty nopeuteen<xliff:g id="USED_1">%2$d</xliff:g> kt/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ kierrosta valmis\nSeuraava jakso alkaa <xliff:g id="USED_1">%2$d</xliff:g> päivän kuluttua (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -543,7 +545,7 @@
<string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Puhelujen pito ei onnistu."</string>
<string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Yhdistä langattomaan verkkoon, jos haluat soittaa puhelun."</string>
<string name="incall_error_promote_wfc" msgid="9164896813931363415">"Ota Wi-Fi-puhelut käyttöön soittaaksesi."</string>
- <string name="emergency_information_hint" msgid="9208897544917793012">"Vaaratiedot"</string>
+ <string name="emergency_information_hint" msgid="9208897544917793012">"Hätätilannetiedot"</string>
<string name="emergency_information_owner_hint" msgid="6256909888049185316">"Omistaja"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Katso tiedot napauttamalla uudelleen"</string>
<string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"Hätäpuhelu"</string>
@@ -637,18 +639,12 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Kyllä"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Ei"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Hylkää"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Puhelin on hätäpuhelujen takaisinsoittotilassa."</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> asti"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Puhelin on hätäpuhelujen takaisinsoittotilassa <xliff:g id="COUNT_1">%s</xliff:g> minuutin ajan.\nHaluatko poistua nyt?</item>
- <item quantity="one">Puhelin on hätäpuhelujen takaisinsoittotilassa <xliff:g id="COUNT_0">%s</xliff:g> minuutin ajan.\nHaluatko poistua nyt?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Palveluntarjoaja"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Asetukset"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Ei asetettu>"</string>
<string name="other_settings" msgid="8895088007393598447">"Muut puheluasetukset"</string>
<string name="calling_via_template" msgid="1791323450703751750">"Operaattorilla <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="contactPhoto" msgid="7885089213135154834">"yhteyshenkilön kuva"</string>
+ <string name="contactPhoto" msgid="7885089213135154834">"yhteyshenkilön valokuva"</string>
<string name="goPrivate" msgid="4645108311382209551">"muuta yksityiseksi"</string>
<string name="selectContact" msgid="1527612842599767382">"valitse yhteystieto"</string>
<string name="not_voice_capable" msgid="2819996734252084253">"Äänipuheluita ei tueta"</string>
@@ -898,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Päivitä"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Ota DNS-tarkistus käyttöön tai poista se käytöstä"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-kohtaiset tiedot/asetukset"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC saatavilla:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR rajoitettu:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR saatavilla:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR:n tila:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR:n taajuus:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Radion taajuustilan valinta"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Ladataan taajuusluetteloa…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Aseta"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 7597f6a..2368721 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -307,7 +307,9 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Période d\'utilisation des données"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Règles relatives au taux de transfert des données"</string>
<string name="throttle_help" msgid="2624535757028809735">"En savoir plus"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> sur <xliff:g id="USED_2">%3$s</xliff:g> (soit <xliff:g id="USED_1">%2$d</xliff:g> %%) du maximum par période\nLa prochaine période démarre dans <xliff:g id="USED_3">%4$d</xliff:g> jours (<xliff:g id="USED_4">%5$s</xliff:g>)."</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> sur <xliff:g id="USED_2">%3$s</xliff:g> : (<xliff:g id="USED_1">%2$d</xliff:g> ٪) du maximum par période"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> maximum dépassé\nTaux de transfert des données réduit à <xliff:g id="USED_1">%2$d</xliff:g> Ko/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g> ٪ du cycle écoulé.\nLa prochaine période démarre dans <xliff:g id="USED_1">%2$d</xliff:g> jours (<xliff:g id="USED_2">%3$s</xliff:g>)."</string>
@@ -522,7 +524,7 @@
<string name="notification_voicemail_no_vm_number" msgid="3423686009815186750">"Numéro de messagerie vocale inconnu"</string>
<string name="notification_network_selection_title" msgid="255595526707809121">"Aucun service"</string>
<string name="notification_network_selection_text" msgid="553288408722427659">"Réseau sélectionné<xliff:g id="OPERATOR_NAME">%s</xliff:g> non disponible"</string>
- <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Activez le réseau cellulaire ou désactivez le mode Avion ou le mode Économiseur de pile pour faire un appel."</string>
+ <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Activez le réseau cellulaire ou désactivez le mode Avion ou le mode Économie d\'énergie pour faire un appel."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Désactivez le mode Avion pour faire un appel."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Désactivez le mode Avion ou connectez-vous à un réseau Wi-Fi pour faire un appel."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Quittez le mode de rappel d\'urgence pour effectuer un appel non urgent."</string>
@@ -580,7 +582,7 @@
<string name="singleContactImportedMsg" msgid="3619804066300998934">"Contacts importés"</string>
<string name="failedToImportSingleContactMsg" msgid="228095510489830266">"Impossible d\'importer le contact"</string>
<string name="hac_mode_title" msgid="4127986689621125468">"Assistance auditive"</string>
- <string name="hac_mode_summary" msgid="7774989500136009881">"Activer la compatibilité des prothèses auditives"</string>
+ <string name="hac_mode_summary" msgid="7774989500136009881">"Activer la compatibilité du service d\'assistance auditive"</string>
<string name="rtt_mode_title" msgid="3075948111362818043">"Appel texte en temps réel (TTR)"</string>
<string name="rtt_mode_summary" msgid="8631541375609989562">"Autoriser l\'utilisation de la messagerie lors des appels vocaux"</string>
<string name="rtt_mode_more_information" msgid="587500128658756318">"La fonctionnalité TTR aide les appelants qui sont sourds ou malentendants, qui ont un trouble de la parole ou pour qui la voix ne suffit pas.<br> <a href=<xliff:g id="URL">http://support.google.com/mobile?p=telephony_rtt</xliff:g>>En savoir plus</a>\n <br><br> - Les appels TTR sont enregistrés en tant que transcriptions de messages\n <br> - La fonctionnalité TTR n\'est pas disponible pour les appels vidéo"</string>
@@ -637,12 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Oui"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Non"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Ignorer"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Le téléphone est en mode de rappel d\'urgence"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Jusqu\'à <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Le mode de rappel d\'urgence sera activé sur le téléphone pour une durée de <xliff:g id="COUNT_1">%s</xliff:g> minute.\nVoulez-vous quitter ce mode maintenant?</item>
- <item quantity="other">Le mode de rappel d\'urgence sera activé sur le téléphone pour une durée de <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nVoulez-vous quitter ce mode maintenant?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Service"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Configuration"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Non défini>"</string>
@@ -867,7 +863,7 @@
<string name="radio_info_dds" msgid="1122593144425697126">"Sous-identifiant de la carte SIM par défaut :"</string>
<string name="radio_info_dl_kbps" msgid="2382922659525318726">"Bande passante de téléchargement (kb/s) :"</string>
<string name="radio_info_ul_kbps" msgid="2102225400904799036">"Bande passante de téléversement (kb/s) :"</string>
- <string name="radio_info_signal_location_label" msgid="6188435197086550049">"Données de la position de la cellule (obsolètes) :"</string>
+ <string name="radio_info_signal_location_label" msgid="6188435197086550049">"Données de la position de la cellule (discontinuées) :"</string>
<string name="radio_info_phy_chan_config" msgid="1277949603275436081">"Configuration du canal physique LTE :"</string>
<string name="radio_info_cell_info_refresh_rate" msgid="670511448975997340">"Taux d\'actualisation des données de la cellule :"</string>
<string name="radio_info_cellinfo_label" msgid="8199062974670377659">"Données des mesures de toutes les cellules :"</string>
@@ -898,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Actualiser"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Basculer la vérification DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Informations/paramètres OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC disponible :"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR restreinte :"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR disponible :"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"État NR :"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Fréquence NR :"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Définir le mode de bande radio"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Chargement de la liste de bandes en cours…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Définir"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 597fdbd..dbaa128 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -36,7 +36,7 @@
<string name="ok" msgid="7818974223666140165">"OK"</string>
<string name="audio_mode_speaker" msgid="243689733219312360">"Haut-parleur"</string>
<string name="audio_mode_earpiece" msgid="2823700267171134282">"Écouteur du combiné"</string>
- <string name="audio_mode_wired_headset" msgid="5028010823105817443">"Casque filaire"</string>
+ <string name="audio_mode_wired_headset" msgid="5028010823105817443">"Écouteurs filaires"</string>
<string name="audio_mode_bluetooth" msgid="25732183428018809">"Bluetooth"</string>
<string name="wait_prompt_str" msgid="5136209532150094910">"Envoyer les tonalités suivantes ?\n"</string>
<string name="pause_prompt_str" msgid="2308897950360272213">"Envoi des tonalités\n"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Oui"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Non"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Ignorer"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Le téléphone est en mode de rappel d\'urgence"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Jusqu\'à <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Le téléphone sera en mode de rappel d\'urgence pendant <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nSouhaitez-vous quitter ce mode maintenant ?</item>
- <item quantity="other">Le téléphone sera en mode de rappel d\'urgence pendant <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nSouhaitez-vous quitter ce mode maintenant ?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Service"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Configuration"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Non défini>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Actualiser"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Activer/Désactiver le contrôle DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Infos/paramètres OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Accès EN-DC disponible :"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Limitation DCNR :"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Accès NR disponible :"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"État NR :"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Fréquence NR :"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Définir le mode de bande radio"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Chargement de la liste de bandes…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Définir"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 3137f92..58b1d27 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Período de uso de datos"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Política de velocidade de datos"</string>
<string name="throttle_help" msgid="2624535757028809735">"Máis información"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>%%) de <xliff:g id="USED_2">%3$s</xliff:g> de período máximo\nO seguinte período comeza dentro de <xliff:g id="USED_3">%4$d</xliff:g> días (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) de <xliff:g id="USED_2">%3$s</xliff:g> de período máximo\nO seguinte período comeza dentro de <xliff:g id="USED_3">%4$d</xliff:g> días (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) de <xliff:g id="USED_2">%3$s</xliff:g> de período máximo"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> máximo superado\nTaxa de datos reducida a <xliff:g id="USED_1">%2$d</xliff:g> kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ do ciclo transcorrido\nO seguinte período comeza dentro de <xliff:g id="USED_1">%2$d</xliff:g> días (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Si"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Non"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Rexeitar"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"O teléfono está no modo de devolución de chamadas de emerxencia"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Ata: <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">O teléfono estará no modo de devolución de chamadas de emerxencia durante <xliff:g id="COUNT_1">%s</xliff:g> minutos.\nQueres saír agora?</item>
- <item quantity="one">O teléfono estará no modo de devolución de chamadas de emerxencia durante <xliff:g id="COUNT_0">%s</xliff:g> minuto.\nQueres saír agora?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Servizo"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Configuración"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Sen configurar>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Actualizar"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Alternar comprobación de DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Información ou configuración específica de OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC dispoñible:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR con restricións:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR dispoñible:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Estado de NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frecuencia de NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Definir modo de banda de radio"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Cargando lista de bandas…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Definir"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 3672095..9d706a7 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -62,7 +62,7 @@
<string name="labelCdmaMore_with_label" msgid="7759692829160238152">"CDMA કૉલ સેટિંગ્સ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="apn_settings" msgid="1978652203074756623">"ઍક્સેસ પોઇન્ટનું નામ"</string>
<string name="settings_label" msgid="9101778088412567956">"નેટવર્ક સેટિંગ્સ"</string>
- <string name="phone_accounts" msgid="1216879437523774604">"કૉલ કરવા માટેના એકાઉન્ટ"</string>
+ <string name="phone_accounts" msgid="1216879437523774604">"કૉલિંગ એકાઉન્ટ્સ"</string>
<string name="phone_accounts_make_calls_with" msgid="16747814788918145">"આના વડે કૉલ કરો"</string>
<string name="phone_accounts_make_sip_calls_with" msgid="4691221006731847255">"આના વડે SIP કૉલ્સ કરો"</string>
<string name="phone_accounts_ask_every_time" msgid="6192347582666047168">"પહેલાં પૂછો"</string>
@@ -84,9 +84,9 @@
<string name="smart_forwarding_settings_menu_summary" msgid="5096947726032885325">"એક નંબર પર પહોંચી શકાય તેમ ન હોય, ત્યારે હંમેશાં તમારા અન્ય નંબર પર કૉલ ફૉરવર્ડ કરો"</string>
<string name="voicemail_notifications_preference_title" msgid="7829238858063382977">"નોટિફિકેશન"</string>
<string name="cell_broadcast_settings" msgid="8135324242541809924">"કટોકટીના બ્રોડકાસ્ટ્સ"</string>
- <string name="call_settings" msgid="3677282690157603818">"કૉલ સેટિંગ"</string>
- <string name="additional_gsm_call_settings" msgid="1561980168685658846">"વધારાના સેટિંગ"</string>
- <string name="additional_gsm_call_settings_with_label" msgid="7973920539979524908">"વધારાના સેટિંગ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+ <string name="call_settings" msgid="3677282690157603818">"કૉલ સેટિંગ્સ"</string>
+ <string name="additional_gsm_call_settings" msgid="1561980168685658846">"વધારાની સેટિંગ્સ"</string>
+ <string name="additional_gsm_call_settings_with_label" msgid="7973920539979524908">"વધારાની સેટિંગ્સ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="sum_gsm_call_settings" msgid="7964692601608878138">"ફક્ત વધારાની GSM કૉલ સેટિંગ્સ"</string>
<string name="additional_cdma_call_settings" msgid="2178016561980611304">"વધારાની CDMA કૉલ સેટિંગ્સ"</string>
<string name="sum_cdma_call_settings" msgid="3185825305136993636">"ફક્ત વધારાની CDMA કૉલ સેટિંગ્સ"</string>
@@ -97,10 +97,10 @@
<string name="sum_show_caller_id" msgid="3571854755324664591">"આઉટગોઇંગ કૉલ્સમાં નંબર પ્રદર્શિત થાય છે"</string>
<string name="sum_default_caller_id" msgid="1767070797135682959">"આઉટગોઇંગ કૉલ્સમાં મારો નંબર પ્રદર્શિત કરવા માટે ડિફોલ્ટ ઓપરેટર સેટિંગ્સનો ઉપયોગ કરો"</string>
<string name="labelCW" msgid="8449327023861428622">"કૉલ પ્રતીક્ષા"</string>
- <string name="sum_cw_enabled" msgid="3977308526187139996">"કૉલ દરમ્યાન, મને ઇનકમિંગ કૉલની સૂચના આપો"</string>
- <string name="sum_cw_disabled" msgid="3658094589461768637">"કૉલ દરમ્યાન, મને ઇનકમિંગ કૉલની સૂચના આપો"</string>
- <string name="call_forwarding_settings" msgid="8937130467468257671">"કૉલ ફોરવર્ડિંગ સેટિંગ"</string>
- <string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"કૉલ ફોરવર્ડિંગ સેટિંગ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+ <string name="sum_cw_enabled" msgid="3977308526187139996">"કૉલ દરમ્યાન, મને આવનારા કૉલ્સની સૂચના આપો"</string>
+ <string name="sum_cw_disabled" msgid="3658094589461768637">"કૉલ દરમ્યાન, મને આવનારા કૉલ્સની સૂચના આપો"</string>
+ <string name="call_forwarding_settings" msgid="8937130467468257671">"કૉલ ફોરવર્ડિંગ સેટિંગ્સ"</string>
+ <string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"કૉલ ફોરવર્ડિંગ સેટિંગ્સ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"કૉલ ફોરવર્ડિંગ"</string>
<string name="labelCFU" msgid="8870170873036279706">"હંમેશા ફોરવર્ડ કરો"</string>
<string name="messageCFU" msgid="1361806450979589744">"હંમેશાં આ નંબરનો ઉપયોગ કરો"</string>
@@ -123,12 +123,12 @@
<string name="sum_cfnrc_enabled" msgid="1799069234006073477">"<xliff:g id="PHONENUMBER">{0}</xliff:g> પર ફોરવર્ડ કરી રહ્યાં છે"</string>
<string name="sum_cfnrc_disabled" msgid="739289696796917683">"બંધ"</string>
<string name="disable_cfnrc_forbidden" msgid="775348748084726890">"જ્યારે તમારો ફોન પહોંચયોગ્ય ન હોય ત્યારે તમારા કેરિઅર કૉલ ફોરવર્ડિંગને અક્ષમ કરવાને સમર્થન આપતા નથી."</string>
- <string name="updating_title" msgid="6130548922615719689">"કૉલ સેટિંગ"</string>
+ <string name="updating_title" msgid="6130548922615719689">"કૉલ સેટિંગ્સ"</string>
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"કૉલ સેટિંગ્સને ફક્ત એડમિન વપરાશકર્તા દ્વારા જ બદલી શકાય છે."</string>
<string name="call_settings_with_label" msgid="8460230435361579511">"સેટિંગ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"કૉલ સેટિંગની ભૂલ"</string>
- <string name="reading_settings" msgid="1605904432450871183">"સેટિંગ વાંચી રહ્યાં છે…"</string>
- <string name="updating_settings" msgid="3650396734816028808">"સેટિંગ અપડેટ કરી રહ્યાં છીએ..."</string>
+ <string name="reading_settings" msgid="1605904432450871183">"સેટિંગ્સ વાંચી રહ્યાં છે…"</string>
+ <string name="updating_settings" msgid="3650396734816028808">"સેટિંગ્સ અપડેટ કરી રહ્યાં છે..."</string>
<string name="reverting_settings" msgid="7378668837291012205">"સેટિંગ્સ પાછી ફરાવી રહ્યાં છે…"</string>
<string name="response_error" msgid="3904481964024543330">"નેટવર્ક તરફથી અનપેક્ષિત પ્રતિસાદ."</string>
<string name="exception_error" msgid="330994460090467">"નેટવર્ક અથવા SIM કાર્ડ ભૂલ."</string>
@@ -173,8 +173,8 @@
<string name="not_allowed" msgid="8541221928746104798">"તમારું SIM કાર્ડ આ નેટવર્કથી કનેક્શનને મંજૂરી આપતું નથી."</string>
<string name="connect_later" msgid="1950138106010005425">"હમણાં આ નેટવર્કથી કનેક્ટ કરી શકાતું નથી. પછીથી ફરી પ્રયાસ કરો."</string>
<string name="registration_done" msgid="5337407023566953292">"નેટવર્ક પર નોંધણી કરી."</string>
- <string name="already_auto" msgid="8607068290733079336">"પહેલેથી જ ઑટોમૅટિક પસંદગીમાં."</string>
- <string name="select_automatically" msgid="779750291257872651">"નેટવર્ક ઑટોમૅટિક રીતે પસંદ કરો"</string>
+ <string name="already_auto" msgid="8607068290733079336">"પહેલેથી જ આપમેળે પસંદગીમાં."</string>
+ <string name="select_automatically" msgid="779750291257872651">"નેટવર્ક આપમેળે પસંદ કરો"</string>
<string name="manual_mode_disallowed_summary" msgid="3970048592179890197">"%1$s સાથે કનેક્ટ કરેલું હોય ત્યારે અનુપલબ્ધ"</string>
<string name="network_select_title" msgid="4117305053881611988">"નેટવર્ક"</string>
<string name="register_automatically" msgid="3907580547590554834">"સ્વયંચાલિત નોંધણી…"</string>
@@ -546,8 +546,8 @@
<string name="emergency_information_hint" msgid="9208897544917793012">"ઇમર્જન્સીની માહિતી"</string>
<string name="emergency_information_owner_hint" msgid="6256909888049185316">"માલિક"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"માહિતી જોવા માટે ફરીથી ટૅપ કરો"</string>
- <string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"ઇમર્જન્સી કૉલ"</string>
- <string name="single_emergency_number_title" msgid="8413371079579067196">"ઇમર્જન્સી નંબર"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"કટોકટીનો કૉલ"</string>
+ <string name="single_emergency_number_title" msgid="8413371079579067196">"કટોકટીનો નંબર"</string>
<string name="numerous_emergency_numbers_title" msgid="8972398932506755510">"કટોકટીના નંબર"</string>
<string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"<xliff:g id="EMERGENCY_NUMBER">%s</xliff:g>ને ફરીથી કૉલ કરવા માટે ટૅપ કરો"</string>
<string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"રેડિઓ ચાલુ કરી રહ્યાં છે…"</string>
@@ -572,7 +572,7 @@
<string name="onscreenManageCallsText" msgid="1162047856081836469">"કૉલ્સ સંચાલિત કરો"</string>
<string name="onscreenManageConferenceText" msgid="4700574060601755137">"કોન્ફરન્સ સંચાલિત કરો"</string>
<string name="onscreenAudioText" msgid="7224226735052019986">"ઑડિઓ"</string>
- <string name="onscreenVideoCallText" msgid="1743992456126258698">"વીડિયો કૉલ"</string>
+ <string name="onscreenVideoCallText" msgid="1743992456126258698">"વિડિઓ કૉલ"</string>
<string name="importSimEntry" msgid="3892354284082689894">"આયાત કરો"</string>
<string name="importAllSimEntries" msgid="2628391505643564007">"બધુ આયાત કરો"</string>
<string name="importingSimContacts" msgid="4995457122107888932">"SIM સંપર્કો આયાત કરી રહ્યાં છે"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"હા"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"નહીં"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"છોડી દો"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ફોન ઇમર્જન્સી કૉલબૅક મોડમાં છે"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> સુધી"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">ફોન <xliff:g id="COUNT_1">%s</xliff:g> મિનિટ માટે ઇમર્જન્સી કૉલબૅક મોડમાં રહેશે.\nશું તમે હમણાં બહાર નીકળવા માગો છો?</item>
- <item quantity="other">ફોન <xliff:g id="COUNT_1">%s</xliff:g> મિનિટ માટે ઇમર્જન્સી કૉલબૅક મોડમાં રહેશે.\nશું તમે હમણાં બહાર નીકળવા માગો છો?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"સેવા"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"સેટઅપ"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<સેટ કરેલ નથી>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"રિફ્રેશ કરો"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS તપાસ ટૉગલ કરો"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-વિશિષ્ટ માહિતી/સેટિંગ"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC ઉપલબ્ધ:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR પ્રતિબંધિત:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR ઉપલબ્ધ:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR સ્ટેટસ:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR આવર્તન:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"રેડિયો બૅન્ડ મોડ સેટ કરો"</string>
<string name="band_mode_loading" msgid="795923726636735967">"બૅન્ડની સૂચિ લોડ કરી રહ્યું છે…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"સેટ કરો"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index c472d63..2cdc768 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"डेटा उपयोग अवधि"</string>
<string name="throttle_rate" msgid="7641913901133634905">"डेटा दर नीति"</string>
<string name="throttle_help" msgid="2624535757028809735">"ज़्यादा जानें"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_2">%3$s</xliff:g> में से <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) अवधि अधिकतम\nअगली अवधि <xliff:g id="USED_3">%4$d</xliff:g> दिनों (<xliff:g id="USED_4">%5$s</xliff:g>) में शुरू होगी"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_2">%3$s</xliff:g> में से <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) अवधि अधिकतम\nअगली अवधि <xliff:g id="USED_3">%4$d</xliff:g> दिनों (<xliff:g id="USED_4">%5$s</xliff:g>) में प्रारंभ होगी"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_2">%3$s</xliff:g> में से <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) अवधि अधिकतम"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> अधिकतम सीमा पार हो गई\nडेटा दर <xliff:g id="USED_1">%2$d</xliff:g> Kb/s तक कम हो गई है"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"चक्र का <xliff:g id="USED_0">%1$d</xliff:g>٪ बीत चुका है\nअगली अवधि <xliff:g id="USED_1">%2$d</xliff:g> दिन में आरंभ होगी (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -637,18 +637,12 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"हां"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"नहीं"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"खारिज करें"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"फ़ोन आपातकालीन कॉलबैक मोड में है"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> तक"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">फ़ोन <xliff:g id="COUNT_1">%s</xliff:g> मिनट के लिए आपातकालीन कॉलबैक मोड में रहेगा.\nक्या आप अभी बाहर निकलना चाहते हैं?</item>
- <item quantity="other">फ़ोन <xliff:g id="COUNT_1">%s</xliff:g> मिनट के लिए आपातकालीन कॉलबैक मोड में रहेगा.\nक्या आप अभी बाहर निकलना चाहते हैं?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"सेवा"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"सेटअप"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<सेट नहीं है>"</string>
<string name="other_settings" msgid="8895088007393598447">"अन्य कॉल सेटिंग"</string>
<string name="calling_via_template" msgid="1791323450703751750">"कॉल <xliff:g id="PROVIDER_NAME">%s</xliff:g> से जा रही है"</string>
- <string name="contactPhoto" msgid="7885089213135154834">"संपर्क की फ़ोटो"</string>
+ <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>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"रीफ़्रेश करें"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"डीएनएस जांच टॉगल करें"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"ओईएम-खास जानकारी/सेटिंग"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC उपलब्ध है:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR प्रतिबंधित है:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR उपलब्ध है:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR की स्थिति:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR की फ़्रीक्वेंसी:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"\'रेडियो बैंड\' मोड सेट करें"</string>
<string name="band_mode_loading" msgid="795923726636735967">"बैंड सूची लोड की जा रही है…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"सेट करें"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 6028212..67cc6de 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -95,17 +95,17 @@
<string name="sum_loading_settings" msgid="434063780286688775">"Učitavanje postavki…"</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"Broj je skriven u izlaznim pozivima"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Broj prikazan za izlazne pozive"</string>
- <string name="sum_default_caller_id" msgid="1767070797135682959">"Upotrijebi zadane postavke operatera za prikaz mog broja kod odlaznih poziva"</string>
+ <string name="sum_default_caller_id" msgid="1767070797135682959">"Koristiti zadane postavke operatera za prikaz mog broja kod odlaznih poziva"</string>
<string name="labelCW" msgid="8449327023861428622">"Poziv na čekanju"</string>
- <string name="sum_cw_enabled" msgid="3977308526187139996">"Obavijesti me o dolaznim pozivima tijekom poziva"</string>
- <string name="sum_cw_disabled" msgid="3658094589461768637">"Obavijesti me o dolaznim pozivima tijekom poziva"</string>
+ <string name="sum_cw_enabled" msgid="3977308526187139996">"Obavijesti me tijekom poziva o dolaznim pozivima"</string>
+ <string name="sum_cw_disabled" msgid="3658094589461768637">"Obavijesti me tijekom poziva o dolaznim pozivima"</string>
<string name="call_forwarding_settings" msgid="8937130467468257671">"Postavke preusmjeravanja poziva"</string>
<string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"Prosljeđivanje poziva (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"Preusmjeravanje poziva"</string>
<string name="labelCFU" msgid="8870170873036279706">"Uvijek preusmjeri"</string>
<string name="messageCFU" msgid="1361806450979589744">"Uvijek koristi ovaj broj"</string>
<string name="sum_cfu_enabled_indicator" msgid="9030139213402432776">"Preusmjeravanje svih poziva"</string>
- <string name="sum_cfu_enabled" msgid="5806923046528144526">"Preusmjeravanje svih poziva na <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
+ <string name="sum_cfu_enabled" msgid="5806923046528144526">"Preusmjeravanje poziva na <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfu_enabled_no_number" msgid="7287752761743377930">"Broj je nedostupan"</string>
<string name="sum_cfu_disabled" msgid="5010617134210809853">"Isključeno"</string>
<string name="labelCFB" msgid="615265213360512768">"Kad je broj zauzet"</string>
@@ -639,13 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Da"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Ne"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Odbaci"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefon je u načinu rada hitnog povratnog poziva"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Do <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Telefon će biti u načinu rada hitnog povratnog poziva <xliff:g id="COUNT_1">%s</xliff:g> minutu.\nŽelite li sada izaći?</item>
- <item quantity="few">Telefon će biti u načinu rada hitnog povratnog poziva <xliff:g id="COUNT_1">%s</xliff:g> minute.\nŽelite li sada izaći?</item>
- <item quantity="other">Telefon će biti u načinu rada hitnog povratnog poziva <xliff:g id="COUNT_1">%s</xliff:g> minuta.\nŽelite li sada izaći?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Usluga"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Postavljanje"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Nije postavljeno>"</string>
@@ -901,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Osvježi"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Uključi/isključi provjeru DNS-a"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Informacije/postavke koje se posebno odnose na OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Dostupno za EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Ograničeno za DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Dostupno za NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Stanje NR-a:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frekvencija NR-a:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Postavi način radijske frekvencije"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Učitavanje popisa frekvencija…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Postavi"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 75b1783..ff5d11b 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -273,16 +273,16 @@
<string name="data_enabled" msgid="22525832097434368">"Adatok engedélyezése"</string>
<string name="data_enable_summary" msgid="696860063456536557">"Adatforgalom engedélyezése"</string>
<string name="dialog_alert_title" msgid="5260471806940268478">"Figyelem"</string>
- <string name="roaming" msgid="1576180772877858949">"Roaming"</string>
- <string name="roaming_enable" msgid="6853685214521494819">"Csatlakozás adatszolgáltatásokhoz roaming során"</string>
- <string name="roaming_disable" msgid="8856224638624592681">"Csatlakozás adatszolgáltatásokhoz roaming során"</string>
+ <string name="roaming" msgid="1576180772877858949">"Barangolás"</string>
+ <string name="roaming_enable" msgid="6853685214521494819">"Csatlakozás adatszolgáltatásokhoz barangolás során"</string>
+ <string name="roaming_disable" msgid="8856224638624592681">"Csatlakozás adatszolgáltatásokhoz barangolás során"</string>
<string name="roaming_reenable_message" msgid="1951802463885727915">"Az adatbarangolás ki van kapcsolva. Koppintson a bekapcsolásához."</string>
<string name="roaming_enabled_message" msgid="9022249120750897">"A szolgáltató adatroamingdíjat számíthat fel. Koppintson a módosításhoz."</string>
<string name="roaming_notification_title" msgid="3590348480688047320">"Nincs mobiladat-kapcsolat"</string>
<string name="roaming_on_notification_title" msgid="7451473196411559173">"Az adatroaming be van kapcsolva"</string>
<string name="roaming_warning" msgid="7855681468067171971">"Lehet, hogy jelentős összeget számítanak fel érte."</string>
<string name="roaming_check_price_warning" msgid="8212484083990570215">"Az árakat a szolgáltatótól tudhatja meg."</string>
- <string name="roaming_alert_title" msgid="5689615818220960940">"Engedélyezi az adatroamingot?"</string>
+ <string name="roaming_alert_title" msgid="5689615818220960940">"Engedélyezi az adatbarangolást?"</string>
<string name="limited_sim_function_notification_title" msgid="612715399099846281">"Korlátozott SIM-funkció"</string>
<string name="limited_sim_function_with_phone_num_notification_message" msgid="5928988883403677610">"A(z) <xliff:g id="PHONE_NUMBER">%2$s</xliff:g> szám használatakor előfordulhat, hogy a(z) <xliff:g id="CARRIER_NAME">%1$s</xliff:g>-hívások és az adatszolgáltatások nem működnek."</string>
<string name="limited_sim_function_notification_message" msgid="5338638075496721160">"Másik SIM esetén lehet, hogy a(z) <xliff:g id="CARRIER_NAME">%1$s</xliff:g>-hívások és -adatszolgáltatások nem működnek."</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Igen"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Nem"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Elvetés"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"A telefon sürgősségi visszahívás módban van."</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Eddig: <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">A telefon <xliff:g id="COUNT_1">%s</xliff:g> percig sürgősségi visszahívás módban lesz.\nKilép?</item>
- <item quantity="one">A telefon <xliff:g id="COUNT_0">%s</xliff:g> percig sürgősségi visszahívás módban lesz.\nKilép?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Szolgáltatás"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Beállítás"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Nincs megadva>"</string>
@@ -769,13 +763,13 @@
<string name="call_barring_baoic_enabled" msgid="1203758092657630123">"Megszünteti a kimenő nemzetközi hívások letiltását?"</string>
<string name="call_barring_baoic_disabled" msgid="5656889339002997449">"Letiltja a kimenő nemzetközi hívásokat?"</string>
<string name="call_barring_baoicr" msgid="8566167764432343487">"Kimenő hívások nemzetközi barangoláskor"</string>
- <string name="call_barring_baoicr_enabled" msgid="1615324165512798478">"Megszünteti a nemzetközi roaming során kimenő hívások letiltását?"</string>
+ <string name="call_barring_baoicr_enabled" msgid="1615324165512798478">"Megszünteti a nemzetközi barangolás során kimenő hívások letiltását?"</string>
<string name="call_barring_baoicr_disabled" msgid="172010175248142831">"Letiltja a kimenő hívásokat nemzetközi barangoláskor?"</string>
<string name="call_barring_baic" msgid="7941393541678658566">"Minden bejövő hívás"</string>
<string name="call_barring_baic_enabled" msgid="4357332358020337470">"Megszünteti az összes bejövő hívás letiltását?"</string>
<string name="call_barring_baic_disabled" msgid="2355945245938240958">"Letiltja az összes bejövő hívást?"</string>
<string name="call_barring_baicr" msgid="8712249337313034226">"Bejövő hívások nemzetközi barangoláskor"</string>
- <string name="call_barring_baicr_enabled" msgid="64774270234828175">"Megszünteti a nemzetközi roaming során bejövő összes hívás letiltását?"</string>
+ <string name="call_barring_baicr_enabled" msgid="64774270234828175">"Megszünteti a nemzetközi barangolás során bejövő összes hívás letiltását?"</string>
<string name="call_barring_baicr_disabled" msgid="3488129262744027262">"Letiltja a bejövő hívásokat nemzetközi barangoláskor?"</string>
<string name="call_barring_deactivate_all" msgid="7837931580047157328">"Az összes deaktiválása"</string>
<string name="call_barring_deactivate_all_description" msgid="4474119585042121604">"Az összes híváskorlátozási beállítás deaktiválása"</string>
@@ -872,7 +866,7 @@
<string name="radio_info_cell_info_refresh_rate" msgid="670511448975997340">"Cellainformáció frissítési gyakorisága:"</string>
<string name="radio_info_cellinfo_label" msgid="8199062974670377659">"Minden cellamérési információ:"</string>
<string name="radio_info_gprs_service_label" msgid="6819204246355412952">"Adatszolgáltatás:"</string>
- <string name="radio_info_roaming_label" msgid="6636932886446857120">"Roaming:"</string>
+ <string name="radio_info_roaming_label" msgid="6636932886446857120">"Barangolás:"</string>
<string name="radio_info_imei_label" msgid="8947899706930120368">"IMEI:"</string>
<string name="radio_info_call_redirect_label" msgid="4526480903023362276">"Hívásátirányítás:"</string>
<string name="radio_info_ppp_resets_label" msgid="9131901102339077661">"PPP-visszaállítások száma a legutolsó rendszerindítás óta:"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Frissítés"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS-ellenőrzés váltása"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-specifikus adatok és beállítások:"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC rendelkezésre áll:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR korlátozva:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR rendelkezésre áll:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR-állapot:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR-frekvencia:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Rádióhullámsáv mód beállítása"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Sávlista betöltése…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Beállítás"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 789c4bc..bc9945e 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -102,7 +102,7 @@
<string name="call_forwarding_settings" msgid="8937130467468257671">"Վերահասցեավորում"</string>
<string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"Զանգի փոխանցման կարգավորումներ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"Զանգի վերահասցեավորում"</string>
- <string name="labelCFU" msgid="8870170873036279706">"Միշտ վերահասցեավորել"</string>
+ <string name="labelCFU" msgid="8870170873036279706">"Միշտ փոխանցել"</string>
<string name="messageCFU" msgid="1361806450979589744">"Միշտ օգտագործել այս համարը"</string>
<string name="sum_cfu_enabled_indicator" msgid="9030139213402432776">"Բոլոր զանգերը վերահասցեավորվում են"</string>
<string name="sum_cfu_enabled" msgid="5806923046528144526">"Բոլոր զանգերը վերահասցեավորվում են <xliff:g id="PHONENUMBER">{0}</xliff:g>-ին"</string>
@@ -113,12 +113,12 @@
<string name="sum_cfb_enabled" msgid="332037613072049492">"Վերահասցեավորվում է դեպի <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfb_disabled" msgid="3589913334164866035">"Անջատված է"</string>
<string name="disable_cfb_forbidden" msgid="4831494744351633961">"Ձեր օպերատորը չի աջակցում զանգի վերահասցեավորման կասեցում, երբ ձեր հեռախոսը զբաղված է:"</string>
- <string name="labelCFNRy" msgid="3403533792248457946">"Երբ չեմ պատասխանում"</string>
+ <string name="labelCFNRy" msgid="3403533792248457946">"Երբ պատասխան չկա"</string>
<string name="messageCFNRy" msgid="7644434155765359009">"Թվել, երբ անպատասխան է"</string>
<string name="sum_cfnry_enabled" msgid="3000500837493854799">"Վերահասցեավորվում է դեպի <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfnry_disabled" msgid="1990563512406017880">"Անջատված է"</string>
<string name="disable_cfnry_forbidden" msgid="3174731413216550689">"Ձեր օպերատորը չի աջակցում զանգի վերահասցեավորման կասեցում, երբ ձեր հեռախոսը չի պատասխանում:"</string>
- <string name="labelCFNRc" msgid="4163399350778066013">"Երբ անհասանելի եմ"</string>
+ <string name="labelCFNRc" msgid="4163399350778066013">"Երբ անհասանելի է"</string>
<string name="messageCFNRc" msgid="6980340731313007250">"Թվել, երբ անհասանելի է"</string>
<string name="sum_cfnrc_enabled" msgid="1799069234006073477">"Վերահասցեավորվում է դեպի <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfnrc_disabled" msgid="739289696796917683">"Անջատված է"</string>
@@ -128,7 +128,7 @@
<string name="call_settings_with_label" msgid="8460230435361579511">"Կարգավորումներ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"Զանգի կարգավորումների սխալ"</string>
<string name="reading_settings" msgid="1605904432450871183">"Ընթերցման կարգավորումներ..."</string>
- <string name="updating_settings" msgid="3650396734816028808">"Կարգավորումների թարմացում..."</string>
+ <string name="updating_settings" msgid="3650396734816028808">"Թարմացվում են կարգավորումները..."</string>
<string name="reverting_settings" msgid="7378668837291012205">"Կարգավորւմները հետադարձվում են..."</string>
<string name="response_error" msgid="3904481964024543330">"Անակնկալ պատասխան ցանցից:"</string>
<string name="exception_error" msgid="330994460090467">"Ցանցի կամ SIM քարտի սխալ"</string>
@@ -141,7 +141,7 @@
<string name="close_dialog" msgid="1074977476136119408">"Լավ"</string>
<string name="enable" msgid="2636552299455477603">"Միացնել"</string>
<string name="disable" msgid="1122698860799462116">"Անջատել"</string>
- <string name="change_num" msgid="6982164494063109334">"Թարմացնել"</string>
+ <string name="change_num" msgid="6982164494063109334">"Նորացնել"</string>
<string-array name="clir_display_values">
<item msgid="8477364191403806960">"Կանխադրված ցանց"</item>
<item msgid="6813323051965618926">"Թաքցնել համարը"</item>
@@ -307,7 +307,9 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Տվյալների օգտագործման ժամանահատվածը"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Տվյալների սակագնային քաղաքականությունը"</string>
<string name="throttle_help" msgid="2624535757028809735">"Իմանալ ավելին"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) <xliff:g id="USED_2">%3$s</xliff:g>-ից (առավելագույն)\nՀաջորդ ժամանակահատվածը սկսվում է <xliff:g id="USED_3">%4$d</xliff:g> օրից (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) <xliff:g id="USED_2">%3$s</xliff:g>-ի ժամանակահատվածի առավելագույնը"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> առավելագույնը գերազանցվել է\nՏվյալների արժեքը նվազել է մինչև <xliff:g id="USED_1">%2$d</xliff:g> Կբիթ/վ"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"Շրջանի <xliff:g id="USED_0">%1$d</xliff:g>٪ -ը լրացել է\nՀաջորդ ժամանակահատվածը սկսվում է <xliff:g id="USED_1">%2$d</xliff:g> օրից (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -637,12 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Այո"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Ոչ"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Անտեսել"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Հեռախոսը շտապ հետզանգի ռեժիմում է"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Մինչև <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Շտապ հետզանգի ռեժիմը կգործի դեռ <xliff:g id="COUNT_1">%s</xliff:g> րոպե։\nԴո՞ւրս գալ։</item>
- <item quantity="other">Շտապ հետզանգի ռեժիմը կգործի դեռ <xliff:g id="COUNT_1">%s</xliff:g> րոպե։\nԴո՞ւրս գալ։</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Ծառայություն"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Կարգավորում"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Նշված չէ>"</string>
@@ -898,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Թարմացնել"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Փոխարկել DNS ստուգումը"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-հատուկ տեղեկություններ/կարգավորումներ"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC-ն հասանելի է՝"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR-ը սահմանափակված է՝"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR-ը հասանելի է՝"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR-ի կարգավիճակը՝"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR-ի հաճախականությունը՝"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Կարգավորել հաճախությունների շերտի ռեժիմը"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Շերտերի ցուցակը բեռնվում է…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Կարգավորել"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index b59c6bf..e27ba14 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -135,7 +135,7 @@
<string name="stk_cc_ss_to_dial_error" msgid="5147693491690618704">"Permintaan SS diubah ke panggilan reguler"</string>
<string name="stk_cc_ss_to_ussd_error" msgid="8330749347425752192">"Permintaan SS diubah ke permintaan USSD"</string>
<string name="stk_cc_ss_to_ss_error" msgid="8297155544652134278">"Diubah ke permintaan SS baru"</string>
- <string name="stk_cc_ss_to_dial_video_error" msgid="4255261231466032505">"Permintaan SS diubah ke panggilan video"</string>
+ <string name="stk_cc_ss_to_dial_video_error" msgid="4255261231466032505">"Permintaan SS diubah ke video call"</string>
<string name="fdn_check_failure" msgid="1833769746374185247">"Setelan Nomor Panggilan Tetap aplikasi Ponsel Anda diaktifkan. Akibatnya, beberapa fitur yang terkait dengan panggilan tidak bekerja."</string>
<string name="radio_off_error" msgid="8321564164914232181">"Keluar dari mode pesawat sebelum melihat setelan ini."</string>
<string name="close_dialog" msgid="1074977476136119408">"Oke"</string>
@@ -152,7 +152,7 @@
<string name="fw_change_failed" msgid="9179241823460192148">"Tidak dapat mengubah nomor penerusan.\nHubungi operator Anda jika masalah ini terus berlanjut."</string>
<string name="fw_get_in_vm_failed" msgid="2432678237218183844">"Tidak dapat mengambil dan menyimpan setelan nomor telepon penerusan saat ini.\nTetap beralih ke operator baru?"</string>
<string name="no_change" msgid="3737264882821031892">"Tidak ada perubahan yang dilakukan."</string>
- <string name="sum_voicemail_choose_provider" msgid="6750824719081403773">"Pilih layanan pesan suara"</string>
+ <string name="sum_voicemail_choose_provider" msgid="6750824719081403773">"Pilih layanan kotak pesan"</string>
<string name="voicemail_default" msgid="6427575113775462077">"Operator Anda"</string>
<string name="vm_change_pin_old_pin" msgid="7154951790929009241">"PIN Lama"</string>
<string name="vm_change_pin_new_pin" msgid="2656200418481288069">"PIN Baru"</string>
@@ -185,7 +185,7 @@
<string name="choose_network_title" msgid="5335832663422653082">"Pilih jaringan"</string>
<string name="network_disconnected" msgid="8844141106841160825">"Terputus"</string>
<string name="network_connected" msgid="2760235679963580224">"Terhubung"</string>
- <string name="network_connecting" msgid="160901383582774987">"Menghubungkan..."</string>
+ <string name="network_connecting" msgid="160901383582774987">"Menyambungkan..."</string>
<string name="network_could_not_connect" msgid="6547460848093727998">"Tidak dapat tersambung"</string>
<string-array name="preferred_network_mode_choices">
<item msgid="4531933377509551889">"GSM/WCDMA lebih disukai"</item>
@@ -286,7 +286,7 @@
<string name="limited_sim_function_notification_title" msgid="612715399099846281">"Fungsi SIM terbatas"</string>
<string name="limited_sim_function_with_phone_num_notification_message" msgid="5928988883403677610">"Layanan data dan panggilan <xliff:g id="CARRIER_NAME">%1$s</xliff:g> dapat diblokir saat menggunakan <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>."</string>
<string name="limited_sim_function_notification_message" msgid="5338638075496721160">"Layanan data dan panggilan <xliff:g id="CARRIER_NAME">%1$s</xliff:g> dapat diblokir saat menggunakan SIM lain."</string>
- <string name="data_usage_title" msgid="8438592133893837464">"Penggunaan data aplikasi"</string>
+ <string name="data_usage_title" msgid="8438592133893837464">"Penggunaan kuota aplikasi"</string>
<string name="data_usage_template" msgid="6287906680674061783">"<xliff:g id="ID_1">%1$s</xliff:g> data seluler digunakan pada <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="advanced_options_title" msgid="9208195294513520934">"Lanjutan"</string>
<string name="carrier_settings_euicc" msgid="1190237227261337749">"Operator"</string>
@@ -299,7 +299,7 @@
<string name="sim_change_data_title" msgid="9142726786345906606">"Ubah SIM data?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"Gunakan <xliff:g id="NEW_SIM">%1$s</xliff:g> dan bukan <xliff:g id="OLD_SIM">%2$s</xliff:g> untuk data seluler?"</string>
<string name="wifi_calling_settings_title" msgid="5800018845662016507">"Panggilan Wi-Fi"</string>
- <string name="video_calling_settings_title" msgid="342829454913266078">"Panggilan video operator"</string>
+ <string name="video_calling_settings_title" msgid="342829454913266078">"Video call operator"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"Opsi GSM//UMTS"</string>
<string name="cdma_options" msgid="3669592472226145665">"Opsi CDMA"</string>
<string name="throttle_data_usage" msgid="1944145350660420711">"Penggunaan kuota"</string>
@@ -446,7 +446,7 @@
<string name="tty_mode_option_summary" msgid="4770510287236494371">"Setel Mode TTY"</string>
<string name="auto_retry_mode_title" msgid="2985801935424422340">"Coba lagi otomatis"</string>
<string name="auto_retry_mode_summary" msgid="2863919925349511402">"Aktifkan mode Coba lagi otomatis"</string>
- <string name="tty_mode_not_allowed_video_call" msgid="6551976083652752815">"Perubahan Mode TTY tidak diizinkan selama panggilan video"</string>
+ <string name="tty_mode_not_allowed_video_call" msgid="6551976083652752815">"Perubahan Mode TTY tidak diizinkan selama video call"</string>
<string name="menu_add" msgid="5616487894975773141">"Tambahkan kontak"</string>
<string name="menu_edit" msgid="3593856941552460706">"Edit kontak"</string>
<string name="menu_delete" msgid="6326861853830546488">"Hapus kontak"</string>
@@ -572,7 +572,7 @@
<string name="onscreenManageCallsText" msgid="1162047856081836469">"Kelola panggilan"</string>
<string name="onscreenManageConferenceText" msgid="4700574060601755137">"Kelola konferensi"</string>
<string name="onscreenAudioText" msgid="7224226735052019986">"Audio"</string>
- <string name="onscreenVideoCallText" msgid="1743992456126258698">"Panggilan video"</string>
+ <string name="onscreenVideoCallText" msgid="1743992456126258698">"Video call"</string>
<string name="importSimEntry" msgid="3892354284082689894">"Impor"</string>
<string name="importAllSimEntries" msgid="2628391505643564007">"Impor semua"</string>
<string name="importingSimContacts" msgid="4995457122107888932">"Mengimpor kontak dari SIM"</string>
@@ -583,7 +583,7 @@
<string name="hac_mode_summary" msgid="7774989500136009881">"Aktifkan kompatibilitas alat bantu dengar"</string>
<string name="rtt_mode_title" msgid="3075948111362818043">"Panggilan pesan real-time (RTT)"</string>
<string name="rtt_mode_summary" msgid="8631541375609989562">"Izinkan pengiriman pesan pada saat panggilan suara berlangsung"</string>
- <string name="rtt_mode_more_information" msgid="587500128658756318">"RTT membantu penelepon yang tunarungu, kesulitan mendengar, memiliki gangguan berbicara, atau memerlukan lebih dari sekadar suara.<br> <a href=<xliff:g id="URL">http://support.google.com/mobile?p=telephony_rtt</xliff:g>>Pelajari lebih lanjut</a>\n <br><br> - Panggilan RTT disimpan sebagai transkrip pesan\n <br> - RTT tidak tersedia untuk panggilan video"</string>
+ <string name="rtt_mode_more_information" msgid="587500128658756318">"RTT membantu penelepon yang tunarungu, kesulitan mendengar, memiliki gangguan berbicara, atau memerlukan lebih dari sekadar suara.<br> <a href=<xliff:g id="URL">http://support.google.com/mobile?p=telephony_rtt</xliff:g>>Pelajari lebih lanjut</a>\n <br><br> - Panggilan RTT disimpan sebagai transkrip pesan\n <br> - RTT tidak tersedia untuk video call"</string>
<string name="no_rtt_when_roaming" msgid="5268008247378355389">"Catatan: RTT tidak tersedia saat melakukan roaming"</string>
<string-array name="tty_mode_entries">
<item msgid="3238070884803849303">"TTY Nonaktif"</item>
@@ -621,28 +621,22 @@
<string name="ota_next" msgid="2041016619313475914">"Berikutnya"</string>
<string name="ecm_exit_dialog" msgid="4200691880721429078">"EcmExitDialog"</string>
<string name="phone_entered_ecm_text" msgid="8431238297843035842">"Masukkan Mode Telepon Balik Darurat"</string>
- <string name="phone_in_ecm_notification_title" msgid="6825016389926367946">"Mode Telepon Balik Darurat"</string>
+ <string name="phone_in_ecm_notification_title" msgid="6825016389926367946">"Mode Panggilan Balik Darurat"</string>
<string name="phone_in_ecm_call_notification_text" msgid="653972232922670335">"Sambungan data dinonaktifkan"</string>
<string name="phone_in_ecm_notification_complete_time" msgid="7341624337163082759">"Tidak ada koneksi data sampai <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
<plurals name="alert_dialog_exit_ecm" formatted="false" msgid="5425906903766466743">
- <item quantity="other">Ponsel ini akan berada dalam mode Telepon Balik Darurat selama <xliff:g id="COUNT_1">%s</xliff:g> menit. Saat dalam mode ini, aplikasi yang menggunakan sambungan data tidak dapat digunakan. Ingin keluar sekarang?</item>
- <item quantity="one">Ponsel ini akan berada dalam mode Telepon Balik Darurat selama <xliff:g id="COUNT_0">%s</xliff:g> menit. Saat dalam mode ini, aplikasi yang menggunakan sambungan data tidak dapat digunakan. Ingin keluar sekarang?</item>
+ <item quantity="other">Ponsel ini akan berada dalam mode Panggilan Balik Darurat selama <xliff:g id="COUNT_1">%s</xliff:g> menit. Saat dalam mode ini, aplikasi yang menggunakan sambungan data tidak dapat digunakan. Ingin keluar sekarang?</item>
+ <item quantity="one">Ponsel ini akan berada dalam mode Panggilan Balik Darurat selama <xliff:g id="COUNT_0">%s</xliff:g> menit. Saat dalam mode ini, aplikasi yang menggunakan sambungan data tidak dapat digunakan. Ingin keluar sekarang?</item>
</plurals>
<plurals name="alert_dialog_not_avaialble_in_ecm" formatted="false" msgid="1152682528741457004">
- <item quantity="other">Tindakan yang dipilih tidak tersedia saat dalam mode Telepon Balik Darurat. Ponsel ini akan berada dalam mode ini selama <xliff:g id="COUNT_1">%s</xliff:g> menit. Ingin keluar sekarang?</item>
- <item quantity="one">Tindakan yang dipilih tidak tersedia saat dalam mode Telepon Balik Darurat. Ponsel ini akan berada dalam mode ini selama <xliff:g id="COUNT_0">%s</xliff:g> menit. Ingin keluar sekarang?</item>
+ <item quantity="other">Tindakan yang dipilih tidak tersedia saat dalam mode Panggilan Balik Darurat. Ponsel ini akan berada dalam mode ini selama <xliff:g id="COUNT_1">%s</xliff:g> menit. Ingin keluar sekarang?</item>
+ <item quantity="one">Tindakan yang dipilih tidak tersedia saat dalam mode Panggilan Balik Darurat. Ponsel ini akan berada dalam mode ini selama <xliff:g id="COUNT_0">%s</xliff:g> menit. Ingin keluar sekarang?</item>
</plurals>
<string name="alert_dialog_in_ecm_call" msgid="1207545603149771978">"Tindakan yang dipilih tidak tersedia ketika dalam panggilan darurat."</string>
<string name="progress_dialog_exiting_ecm" msgid="9159080081676927217">"Keluar dari mode Telepon Balik Darurat"</string>
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ya"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Tidak"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Tutup"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Ponsel berada dalam mode telepon balik darurat."</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Sampai <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Ponsel akan berada dalam mode telepon balik darurat selama <xliff:g id="COUNT_1">%s</xliff:g> menit.\nApakah Anda ingin keluar sekarang?</item>
- <item quantity="one">Ponsel akan berada dalam mode telepon balik darurat selama <xliff:g id="COUNT_0">%s</xliff:g> menit.\nApakah Anda ingin keluar sekarang?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Layanan"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Penyiapan"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Tidak disetel>"</string>
@@ -660,8 +654,8 @@
<string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"Ubah PIN"</string>
<string name="preference_category_ringtone" msgid="8787281191375434976">"Nada dering & Getar"</string>
<string name="pstn_connection_service_label" msgid="9200102709997537069">"Kartu SIM internal"</string>
- <string name="enable_video_calling_title" msgid="7246600931634161830">"Aktifkan panggilan video"</string>
- <string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"Untuk mengaktifkan panggilan video, Anda perlu mengaktifkan Mode LTE 4G yang Ditingkatkan di setelan jaringan."</string>
+ <string name="enable_video_calling_title" msgid="7246600931634161830">"Aktifkan video call"</string>
+ <string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"Untuk mengaktifkan video call, Anda perlu mengaktifkan Mode LTE 4G yang Ditingkatkan di setelan jaringan."</string>
<string name="enable_video_calling_dialog_settings" msgid="8697890611305307110">"Setelan jaringan"</string>
<string name="enable_video_calling_dialog_close" msgid="4298929725917045270">"Tutup"</string>
<string name="sim_label_emergency_calls" msgid="9078241989421522310">"Panggilan darurat"</string>
@@ -676,8 +670,8 @@
<string name="callFailed_cdma_call_limit" msgid="1074219746093031412">"Ada terlalu banyak panggilan aktif. Akhiri atau gabungkan panggilan yang ada sebelum melakukan panggilan baru."</string>
<string name="callFailed_imei_not_accepted" msgid="7257903653685147251">"Tidak dapat tersambung, masukkan kartu SIM yang valid."</string>
<string name="callFailed_wifi_lost" msgid="1788036730589163141">"Sambungan Wi-Fi terputus. Panggilan diakhiri."</string>
- <string name="dialFailed_low_battery" msgid="6857904237423407056">"Panggilan video tidak bisa dilakukan karena daya baterai lemah."</string>
- <string name="callFailed_low_battery" msgid="4056828320214416182">"Panggilan video berakhir karena daya baterai lemah."</string>
+ <string name="dialFailed_low_battery" msgid="6857904237423407056">"Video call tidak bisa dilakukan karena daya baterai lemah."</string>
+ <string name="callFailed_low_battery" msgid="4056828320214416182">"Video call berakhir karena daya baterai lemah."</string>
<string name="callFailed_emergency_call_over_wfc_not_available" msgid="5944309590693432042">"Panggilan darurat melalui panggilan Wi-Fi tidak tersedia di lokasi ini."</string>
<string name="callFailed_wfc_service_not_available_in_this_location" msgid="3624536608369524988">"Panggilan Wi-Fi tidak tersedia di lokasi ini."</string>
<string name="change_pin_title" msgid="3564254326626797321">"Ubah PIN Pesan Suara"</string>
@@ -823,7 +817,7 @@
<string name="radio_info_data_connection_enable" msgid="6183729739783252840">"Aktifkan Koneksi Data"</string>
<string name="radio_info_data_connection_disable" msgid="6404751291511368706">"Nonaktifkan Koneksi Data"</string>
<string name="volte_provisioned_switch_string" msgid="4812874990480336178">"VoLTE Disediakan"</string>
- <string name="vt_provisioned_switch_string" msgid="8295542122512195979">"Panggilan Video Disediakan"</string>
+ <string name="vt_provisioned_switch_string" msgid="8295542122512195979">"Video Call Disediakan"</string>
<string name="wfc_provisioned_switch_string" msgid="3835004640321078988">"Panggilan Wi-Fi Disediakan"</string>
<string name="eab_provisioned_switch_string" msgid="4449676720736033035">"EAB/Presence Disediakan"</string>
<string name="cbrs_data_switch_string" msgid="6060356430838077653">"Data Cbrs"</string>
@@ -842,7 +836,7 @@
<string name="radio_info_ims_reg_status_not_registered" msgid="8045821447288876085">"Tidak Terdaftar"</string>
<string name="radio_info_ims_feature_status_available" msgid="6493200914756969292">"Tersedia"</string>
<string name="radio_info_ims_feature_status_unavailable" msgid="8930391136839759778">"Tidak tersedia"</string>
- <string name="radio_info_ims_reg_status" msgid="25582845222446390">"Pendaftaran IMS: <xliff:g id="STATUS">%1$s</xliff:g>\nSuara melalui LTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nSuara melalui Wi-Fi: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nPanggilan Video: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nAntarmuka UT: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
+ <string name="radio_info_ims_reg_status" msgid="25582845222446390">"Pendaftaran IMS: <xliff:g id="STATUS">%1$s</xliff:g>\nSuara melalui LTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nSuara melalui Wi-Fi: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nVideo Call: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nAntarmuka UT: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
<string name="radioInfo_service_in" msgid="45753418231446400">"Dalam Layanan"</string>
<string name="radioInfo_service_out" msgid="287972405416142312">"Di Luar Area Layanan"</string>
<string name="radioInfo_service_emergency" msgid="4763879891415016848">"Panggilan Darurat Saja"</string>
@@ -875,7 +869,7 @@
<string name="radio_info_roaming_label" msgid="6636932886446857120">"Roaming:"</string>
<string name="radio_info_imei_label" msgid="8947899706930120368">"IMEI"</string>
<string name="radio_info_call_redirect_label" msgid="4526480903023362276">"Pengalihan Panggilan:"</string>
- <string name="radio_info_ppp_resets_label" msgid="9131901102339077661">"Jumlah Reset PPP Sejak Boot:"</string>
+ <string name="radio_info_ppp_resets_label" msgid="9131901102339077661">"Jumlah Setel Ulang PPP Sejak Boot:"</string>
<string name="radio_info_current_network_label" msgid="3052098695239642450">"Jaringan Saat Ini:"</string>
<string name="radio_info_ppp_received_label" msgid="5753592451640644889">"Data Diterima:"</string>
<string name="radio_info_gsm_service_label" msgid="6443348321714241328">"Layanan Suara:"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Perbarui"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Aktifkan Pemeriksaan DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Info spesifik OEM/Setelan"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC Tersedia:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Dibatasi DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR Tersedia:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Status NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frekuensi NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Setel Mode Band Radio"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Memuat Daftar Band…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Setel"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index aae0de3..6c46864 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -108,7 +108,7 @@
<string name="sum_cfu_enabled" msgid="5806923046528144526">"Áframsendir öll símtöl í <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfu_enabled_no_number" msgid="7287752761743377930">"Ekki næst í númerið"</string>
<string name="sum_cfu_disabled" msgid="5010617134210809853">"Slökkt"</string>
- <string name="labelCFB" msgid="615265213360512768">"Þegar það er á tali"</string>
+ <string name="labelCFB" msgid="615265213360512768">"Þegar er á tali"</string>
<string name="messageCFB" msgid="1958017270393563388">"Númeraval þegar síminn er á tali"</string>
<string name="sum_cfb_enabled" msgid="332037613072049492">"Áframsendir í <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfb_disabled" msgid="3589913334164866035">"Slökkt"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Já"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Nei"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Hunsa"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Síminn er í stillingu fyrir svarhringingu neyðarsímtala"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Til <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Síminn verður í stillingu fyrir svarhringingu neyðarsímtala í <xliff:g id="COUNT_1">%s</xliff:g> mínútu.\nViltu hætta núna?</item>
- <item quantity="other">Síminn verður í stillingu fyrir svarhringingu neyðarsímtala í <xliff:g id="COUNT_1">%s</xliff:g> mínútur.\nViltu hætta núna?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Þjónusta"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Uppsetning"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Ekki valið>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Endurnýja"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Kveikja/slökkva á DNS-prófun"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Upplýsingar/stillingar framleiðanda"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC tiltækt:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR takmarkað:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR tiltækt:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR staða:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR tíðni:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Velja útvarpstíðni"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Hleður lista yfir tíðnisvið…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Stilla"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 987dd0a..e6f6150 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -95,7 +95,7 @@
<string name="sum_loading_settings" msgid="434063780286688775">"Caricamento impostazioni…"</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"Numero nascosto per chiamate in uscita"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Numero visualizzato in chiamate in uscita"</string>
- <string name="sum_default_caller_id" msgid="1767070797135682959">"Usa le impostazioni predefinite dell\'operatore per mostrare il mio numero nelle chiamate in uscita"</string>
+ <string name="sum_default_caller_id" msgid="1767070797135682959">"Usa impostazioni dell\'operatore per mostrare il mio numero nelle chiamate in uscita"</string>
<string name="labelCW" msgid="8449327023861428622">"Avviso di chiamata"</string>
<string name="sum_cw_enabled" msgid="3977308526187139996">"Notifica chiamate in entrata durante telefonata"</string>
<string name="sum_cw_disabled" msgid="3658094589461768637">"Notifica chiamate in entrata durante telefonata"</string>
@@ -307,7 +307,9 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Periodo utilizzo dati"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Norme velocità dati"</string>
<string name="throttle_help" msgid="2624535757028809735">"Ulteriori informazioni"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) del <xliff:g id="USED_2">%3$s</xliff:g> max periodo\nIl periodo succ. inizia tra <xliff:g id="USED_3">%4$d</xliff:g> gg (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) del <xliff:g id="USED_2">%3$s</xliff:g> max periodo"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> max superato\nVelocità dati ridotta a <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ del ciclo trascorso\nIl periodo succ. inizia tra <xliff:g id="USED_1">%2$d</xliff:g> gg (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -637,12 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Sì"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"No"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Ignora"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Il telefono è in modalità di richiamata di emergenza"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Fino alle ore <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Il telefono sarà in modalità di richiamata di emergenza per <xliff:g id="COUNT_1">%s</xliff:g> minuti.\nVuoi uscire ora?</item>
- <item quantity="one">Il telefono sarà in modalità di richiamata di emergenza per <xliff:g id="COUNT_0">%s</xliff:g> minuto.\nVuoi uscire ora?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Servizio"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Configurazione"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Non impostato>"</string>
@@ -898,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Aggiorna"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Attiva o disattiva verifica DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Info/impostazioni specifiche OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC disponibile:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR con limitazioni:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR disponibile:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Stato NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frequenza NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Imposta modalità banda radio"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Caricamento elenco bande…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Imposta"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 1b0d1fc..4780834 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"תקופת השימוש בנתונים"</string>
<string name="throttle_rate" msgid="7641913901133634905">"מדיניות קצב נתונים"</string>
<string name="throttle_help" msgid="2624535757028809735">"למידע נוסף"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>%%) מתוך התקופה המרבית של <xliff:g id="USED_2">%3$s</xliff:g>\nהתקופה הבאה מתחילה בעוד <xliff:g id="USED_3">%4$d</xliff:g> ימים (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>??) מתוך התקופה המרבית של <xliff:g id="USED_2">%3$s</xliff:g>\nהתקופה הבאה מתחילה בעוד <xliff:g id="USED_3">%4$d</xliff:g> ימים (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>??) מתוך התקופה המרבית של<xliff:g id="USED_2">%3$s</xliff:g>"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> חריגה מהמקסימום\nקצב הנתונים ירד ל-<xliff:g id="USED_1">%2$d</xliff:g> Kb לשנייה"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>?? מהמחזור חלפו\nהתקופה הבאה מתחילה בעוד <xliff:g id="USED_1">%2$d</xliff:g> ימים (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -641,14 +641,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"כן"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"לא"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"סגור"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"הטלפון במצב \'התקשרות בחזרה בחירום\'"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"עד <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="two">הטלפון יהיה במצב \'התקשרות בחזרה בחירום\' ל-<xliff:g id="COUNT_1">%s</xliff:g> דקות.\nרוצה לצאת מהמצב הזה?</item>
- <item quantity="many">הטלפון יהיה במצב \'התקשרות בחזרה בחירום\' ל-<xliff:g id="COUNT_1">%s</xliff:g> דקות.\nרוצה לצאת מהמצב הזה?</item>
- <item quantity="other">הטלפון יהיה במצב \'התקשרות בחזרה בחירום\' ל-<xliff:g id="COUNT_1">%s</xliff:g> דקות.\nרוצה לצאת מהמצב הזה?</item>
- <item quantity="one">הטלפון יהיה במצב \'התקשרות בחזרה בחירום\' לדקה אחת (<xliff:g id="COUNT_0">%s</xliff:g>).\nרוצה לצאת מהמצב הזה?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"שירות"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"הגדרות"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<לא מוגדר>"</string>
@@ -904,11 +896,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"רענון"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"החלפת מצב של בדיקת DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"מידע/הגדרות ספציפיים ל-OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"תומך ב-EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"לא תומך ב-5G NR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"תומך ב-5G NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"מצב 5G NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"תדירות 5G NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"הגדרת מצב תדרים של רדיו"</string>
<string name="band_mode_loading" msgid="795923726636735967">"טוען רשימת תדרים…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"הגדרה"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 6bfe82e..3177d31 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -49,7 +49,7 @@
<string name="add_vm_number_str" msgid="7368168964435881637">"番号を追加"</string>
<string name="voice_number_setting_primary_user_only" msgid="3394706575741912843">"ボイスメール設定を変更できるのはメインユーザーのみに限られています。"</string>
<string name="puk_unlocked" msgid="4627340655215746511">"SIMカードロックを解除しました。デバイスのロックを解除しています..."</string>
- <string name="label_ndp" msgid="7617392683877410341">"SIM のネットワーク ロック解除 PIN"</string>
+ <string name="label_ndp" msgid="7617392683877410341">"SIMネットワークのロック解除PIN"</string>
<string name="sim_ndp_unlock_text" msgid="7737338355451978338">"ロック解除"</string>
<string name="sim_ndp_dismiss_text" msgid="89667342248929777">"無効"</string>
<string name="requesting_unlock" msgid="930512210309437741">"ネットワークのロック解除をリクエスト中..."</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"はい"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"いいえ"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"解除"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"スマートフォンが緊急通報待機モードになっています"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> まで"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">スマートフォンが <xliff:g id="COUNT_1">%s</xliff:g> 分間にわたって緊急通報待機モードになります。\n今すぐ終了してもよろしいですか?</item>
- <item quantity="one">スマートフォンが <xliff:g id="COUNT_0">%s</xliff:g> 分間にわたって緊急通報待機モードになります。\n今すぐ終了してもよろしいですか?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"サービス"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"セットアップ"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<未設定>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"更新"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS チェックを切り替え"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM 固有の情報 / 設定"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC 利用可能:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR 制限あり:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR 利用可能:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR ステータス:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR 周波数:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"無線バンドモードの設定"</string>
<string name="band_mode_loading" msgid="795923726636735967">"バンドリストを読み込み中…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"設定"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 4d26062..3c3249b 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"ანგარიშის პარამეტრების კონფიგურაცია"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"დარეკვის ყველა ანგარიში"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"აირჩიეთ რომელ ანგარიშს შეეძლება ზარების განხორციელება"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi დარეკვა"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"დარეკვა Wi-Fi-ს მეშვეობით"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"კავშირის ჩაშენებული სერვისი"</string>
<string name="voicemail" msgid="7697769412804195032">"ხმოვანი ფოსტა"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"ხმოვანი ფოსტა (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"დიახ"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"არა"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"იგნორირება"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ტელეფონი გადაუდებელი გადმორეკვის რეჟიმშია"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g>-მდე"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">ტელეფონი <xliff:g id="COUNT_1">%s</xliff:g> წუთის განმავლობაში გადაუდებელი გადმორეკვის რეჟიმში იქნება.\nგსურთ გასვლა ახლავე?</item>
- <item quantity="one">ტელეფონი <xliff:g id="COUNT_0">%s</xliff:g> წუთის განმავლობაში გადაუდებელი გადმორეკვის რეჟიმში იქნება.\nგსურთ გასვლა ახლავე?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"სერვისი"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"დაყენება"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<არ არის დაყენებული>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"განახლება"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS შემოწმების გადართვა"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"ინფორმაცია/პარამეტრები სპეციალურად OEM-ისთვის"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC ხელმისაწვდომია:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR შეზღუდულია:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR ხელმისაწვდომია:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR-ის მდგომარეობა:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR-ის სიხშირე:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"რადიოდიაპაზონის რეჟიმის დაყენება"</string>
<string name="band_mode_loading" msgid="795923726636735967">"მიმდინარეობს დიაპაზონთა სიის ჩატვირთვა…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"დაყენება"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 443c4d1..39fb4c6 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -96,7 +96,7 @@
<string name="sum_hide_caller_id" msgid="131100328602371933">"Шығыс қоңырауларда нөмірді жасыру"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Шығыс қоңыраулар нөмірді көрсету"</string>
<string name="sum_default_caller_id" msgid="1767070797135682959">"Шығыс қоңырауларында менің нөмірім көрсетілуі үшін бастапқы оператор параметрлерін қолдану"</string>
- <string name="labelCW" msgid="8449327023861428622">"Қоңырауды ұстап тұру"</string>
+ <string name="labelCW" msgid="8449327023861428622">"Күтудегі қоңырау"</string>
<string name="sum_cw_enabled" msgid="3977308526187139996">"Қоңырау кезінде маған келген қоңыраулар жайлы хабарлау"</string>
<string name="sum_cw_disabled" msgid="3658094589461768637">"Қоңырау кезінде маған келген қоңыраулар жайлы хабарлау"</string>
<string name="call_forwarding_settings" msgid="8937130467468257671">"Қоңырауды басқа нөмірге бағыттау параметрлері"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Иә"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Жоқ"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Бас тарту"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Телефон шұғыл кері қоңырау шалу режимінде"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> дейін"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Телефон <xliff:g id="COUNT_1">%s</xliff:g> минут бойы шұғыл кері қоңырау шалу режимінде болады.\nҚазір шыққыңыз келе ме?</item>
- <item quantity="one">Телефон <xliff:g id="COUNT_0">%s</xliff:g> минут бойы шұғыл кері қоңырау шалу режимінде болады.\nҚазір шыққыңыз келе ме?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Қызмет"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Орнату"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Реттелген жоқ>"</string>
@@ -664,7 +658,7 @@
<string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"Бейне қоңырауларды қосу үшін желі параметрлерінде жақсартылған 4G LTE режимін қосу керек."</string>
<string name="enable_video_calling_dialog_settings" msgid="8697890611305307110">"Желі параметрлері"</string>
<string name="enable_video_calling_dialog_close" msgid="4298929725917045270">"Жабу"</string>
- <string name="sim_label_emergency_calls" msgid="9078241989421522310">"Құтқару қызметіне қоңырау шалу"</string>
+ <string name="sim_label_emergency_calls" msgid="9078241989421522310">"Жедел қоңыраулар"</string>
<string name="sim_description_emergency_calls" msgid="5146872803938897296">"Тек жедел қоңыраулар"</string>
<string name="sim_description_default" msgid="7474671114363724971">"SIM картасы, ұяшық: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="7883415189273700298">"Арнайы мүмкіндіктер"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Жаңарту"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS тексерісін қосу/өшіру"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Өндірушіге қатысты ақпарат/параметрлер"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC қолжетімді:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR шектеулі:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR қолжетімді:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR күйі:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR жиілігі:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Радиожолақ режимін орнату"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Жолақтар тізімі жүктелуде…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Орнату"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index d8bd447..610a133 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -24,7 +24,7 @@
<string name="unknown" msgid="8279698889921830815">"មិនស្គាល់"</string>
<string name="private_num" msgid="4487990167889159992">"លេខឯកជន"</string>
<string name="payphone" msgid="7936735771836716941">"ទូរស័ព្ទសាធារណៈ"</string>
- <string name="onHold" msgid="6132725550015899006">"កំពុងរង់ចាំ"</string>
+ <string name="onHold" msgid="6132725550015899006">"រង់ចាំ"</string>
<string name="carrier_mmi_msg_title" msgid="6050165242447507034">"សារ <xliff:g id="MMICARRIER">%s</xliff:g>"</string>
<string name="default_carrier_mmi_msg_title" msgid="7754317179938537213">"សារក្រុមហ៊ុនសេវាទូរសព្ទ"</string>
<string name="mmiStarted" msgid="9212975136944568623">"បានចាប់ផ្ដើមកូដ MMI"</string>
@@ -91,7 +91,7 @@
<string name="additional_cdma_call_settings" msgid="2178016561980611304">"កំណត់ការហៅ CDMA បន្ថែម"</string>
<string name="sum_cdma_call_settings" msgid="3185825305136993636">"កំណត់ការហៅតែ CDMA បន្ថែមប៉ុណ្ណោះ"</string>
<string name="labelNwService" msgid="6015891883487125120">"ការកំណត់សេវាបណ្ដាញ"</string>
- <string name="labelCallerId" msgid="2090540744550903172">"អត្តសញ្ញាណអ្នកហៅទូរសព្ទ"</string>
+ <string name="labelCallerId" msgid="2090540744550903172">"លេខសម្គាល់អ្នកហៅ"</string>
<string name="sum_loading_settings" msgid="434063780286688775">"កំពុងផ្ទុកការកំណត់…"</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"បានលាក់លេខក្នុងការហៅចេញ"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"បានបង្ហាញលេខក្នុងការហៅចេញ"</string>
@@ -99,8 +99,8 @@
<string name="labelCW" msgid="8449327023861428622">"រង់ចាំការហៅ"</string>
<string name="sum_cw_enabled" msgid="3977308526187139996">"ក្នុងអំឡុងពេលហៅ ជូនដំណឹងដល់ខ្ញុំអំពីការហៅចូល"</string>
<string name="sum_cw_disabled" msgid="3658094589461768637">"ក្នុងអំឡុងពេលហៅ ជូនដំណឹងដល់ខ្ញុំអំពីការហៅចូល"</string>
- <string name="call_forwarding_settings" msgid="8937130467468257671">"ការកំណត់ការបញ្ជូនបន្តការហៅទូរសព្ទ"</string>
- <string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"ការកំណត់ការបញ្ជូនបន្តការហៅទូរសព្ទ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+ <string name="call_forwarding_settings" msgid="8937130467468257671">"កំណត់ការហៅបញ្ជូនបន្ត"</string>
+ <string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"ការកំណត់ការបញ្ជូនការហៅបន្ត (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"បញ្ជូនការហៅបន្ត"</string>
<string name="labelCFU" msgid="8870170873036279706">"បញ្ជូនបន្តជានិច្ច"</string>
<string name="messageCFU" msgid="1361806450979589744">"ប្រើលេខនេះជានិច្ច"</string>
@@ -128,7 +128,7 @@
<string name="call_settings_with_label" msgid="8460230435361579511">"ការកំណត់ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"បញ្ហាការកំណត់ការហៅ"</string>
<string name="reading_settings" msgid="1605904432450871183">"កំពុងអានការកំណត់…"</string>
- <string name="updating_settings" msgid="3650396734816028808">"កំពុងធ្វើបច្ចុប្បន្នភាពការកំណត់…"</string>
+ <string name="updating_settings" msgid="3650396734816028808">"កំណត់ការធ្វើបច្ចុប្បន្នភាព…"</string>
<string name="reverting_settings" msgid="7378668837291012205">"ត្រឡប់ការកំណត់…"</string>
<string name="response_error" msgid="3904481964024543330">"ការឆ្លើយតបដែលមិនរំពឹងទុកពីបណ្ដាញ។"</string>
<string name="exception_error" msgid="330994460090467">"បញ្ហាស៊ីមកាត ឬបណ្ដាញ។"</string>
@@ -298,7 +298,7 @@
<string name="sim_selection_required_pref" msgid="6985901872978341314">"ជម្រើសដែលត្រូវមាន"</string>
<string name="sim_change_data_title" msgid="9142726786345906606">"ប្ដូរស៊ីមទិន្នន័យ?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"ប្រើប្រាស់ <xliff:g id="NEW_SIM">%1$s</xliff:g> ជំនួសឲ្យ <xliff:g id="OLD_SIM">%2$s</xliff:g> សម្រាប់ទិន្នន័យទូរសព្ទចល័តដែរឬទេ?"</string>
- <string name="wifi_calling_settings_title" msgid="5800018845662016507">"ការហៅតាម Wi-Fi"</string>
+ <string name="wifi_calling_settings_title" msgid="5800018845662016507">"ការហៅទូរសព្ទតាម Wi-Fi"</string>
<string name="video_calling_settings_title" msgid="342829454913266078">"ការហៅវីដេអូតាមក្រុមផ្ដល់សេវាទូរសព្ទ"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"ជម្រើស GSM/UMTS"</string>
<string name="cdma_options" msgid="3669592472226145665">"ជម្រើស CDMA"</string>
@@ -513,7 +513,7 @@
<string name="card_title_conf_call" msgid="901197309274457427">"ការហៅជាក្រុម"</string>
<string name="card_title_incoming_call" msgid="881424648458792430">"ការហៅចូល"</string>
<string name="card_title_call_ended" msgid="650223980095026340">"បានបញ្ចប់ការហៅ"</string>
- <string name="card_title_on_hold" msgid="9028319436626975207">"កំពុងរង់ចាំ"</string>
+ <string name="card_title_on_hold" msgid="9028319436626975207">"រង់ចាំ"</string>
<string name="card_title_hanging_up" msgid="814874106866647871">"បញ្ចប់ការសន្ទនា"</string>
<string name="card_title_in_call" msgid="8231896539567594265">"ការហៅចូល"</string>
<string name="notification_voicemail_title" msgid="3932876181831601351">"សារជាសំឡេងថ្មី"</string>
@@ -564,7 +564,7 @@
<string name="dialerKeyboardHintText" msgid="1115266533703764049">"ប្រើក្ដារចុចដើម្បីចុចលេខ"</string>
<string name="onscreenHoldText" msgid="4025348842151665191">"ដាក់ឱ្យរង់ចាំ"</string>
<string name="onscreenEndCallText" msgid="6138725377654842757">"បញ្ចប់"</string>
- <string name="onscreenShowDialpadText" msgid="658465753816164079">"ផ្ទាំងចុចលេខ"</string>
+ <string name="onscreenShowDialpadText" msgid="658465753816164079">"បន្ទះលេខ"</string>
<string name="onscreenMuteText" msgid="5470306116733843621">"ស្ងាត់"</string>
<string name="onscreenAddCallText" msgid="9075675082903611677">"បន្ថែមការហៅ"</string>
<string name="onscreenMergeCallsText" msgid="3692389519611225407">"បញ្ចូលការហៅរួមគ្នា"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"បាទ/ចាស"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"ទេ"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"បោះបង់"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ទូរសព្ទស្ថិតក្នុងមុខងារហៅទៅវិញពេលមានអាសន្ន"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"រហូតដល់ម៉ោង <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">ទូរសព្ទនឹងស្ថិតក្នុងមុខងារហៅទៅវិញពេលមានអាសន្នរយៈពេល <xliff:g id="COUNT_1">%s</xliff:g> នាទី។\nតើអ្នកចង់ចេញឥឡូវនេះដែរឬទេ?</item>
- <item quantity="one">ទូរសព្ទនឹងស្ថិតក្នុងមុខងារហៅទៅវិញពេលមានអាសន្នរយៈពេល <xliff:g id="COUNT_0">%s</xliff:g> នាទី។\nតើអ្នកចង់ចេញឥឡូវនេះដែរឬទេ?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"សេវា"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"រៀបចំ"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"< មិនកំណត់ >"</string>
@@ -845,7 +839,7 @@
<string name="radio_info_ims_reg_status" msgid="25582845222446390">"ការចុះឈ្មោះ IMS៖ <xliff:g id="STATUS">%1$s</xliff:g>\nការហៅជាសំឡេងតាម LTE៖ <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nការហៅជាសំឡេងតាម WiFi៖ <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nការហៅជាវីដេអូ៖ <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nផ្ទៃ UT ៖ <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>
+ <string name="radioInfo_service_emergency" msgid="4763879891415016848">"សម្រាប់តែការហៅទៅលេខសង្គ្រោះបន្ទាន់ប៉ុណ្ណោះ"</string>
<string name="radioInfo_service_off" msgid="3456583511226783064">"វិទ្យុបានបិទ"</string>
<string name="radioInfo_roaming_in" msgid="3156335577793145965">"រ៉ូមីង"</string>
<string name="radioInfo_roaming_not" msgid="1904547918725478110">"មិនរ៉ូមីងទេ"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"ផ្ទុកឡើងវិញ"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"បិទ/បើកការពិនិត្យ DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"ការកំណត់/ព័ត៌មានជាក់លាក់ OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"មាន EN-DC៖"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR ត្រូវបានរឹតត្បិត៖"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"មាន NR៖"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"ស្ថានភាព NR៖"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"កម្រិតញឹកញាប់នៃ NR៖"</string>
<string name="band_mode_title" msgid="7988822920724576842">"កំណត់មុខងារកម្រិតបញ្ជូនវិទ្យុ"</string>
<string name="band_mode_loading" msgid="795923726636735967">"កំពុងដំណើរការបញ្ជីក្រុម…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"កំណត់"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index d2fd35f..5dc6cdd 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -128,7 +128,7 @@
<string name="call_settings_with_label" msgid="8460230435361579511">"ಸೆಟ್ಟಿಂಗ್ಗಳು (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"ಕರೆ ಸೆಟ್ಟಿಂಗ್ಗಳ ದೋಷ"</string>
<string name="reading_settings" msgid="1605904432450871183">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಓದಲಾಗುತ್ತಿದೆ…"</string>
- <string name="updating_settings" msgid="3650396734816028808">"ಸೆಟ್ಟಿಂಗ್ಗಳು ಅಪ್ಡೇಟ್ ಆಗುತ್ತಿವೆ…"</string>
+ <string name="updating_settings" msgid="3650396734816028808">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನವೀಕರಿಸಲಾಗುತ್ತಿದೆ…"</string>
<string name="reverting_settings" msgid="7378668837291012205">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಹಿಂತಿರುಗಿಸಲಾಗುತ್ತಿದೆ…"</string>
<string name="response_error" msgid="3904481964024543330">"ನೆಟ್ವರ್ಕ್ನಿಂದ ಅನಿರೀಕ್ಷಿತ ಪ್ರತಿಕ್ರಿಯೆ."</string>
<string name="exception_error" msgid="330994460090467">"ನೆಟ್ವರ್ಕ್ ಅಥವಾ ಸಿಮ್ ಕಾರ್ಡ್ ದೋಷ."</string>
@@ -141,7 +141,7 @@
<string name="close_dialog" msgid="1074977476136119408">"ಸರಿ"</string>
<string name="enable" msgid="2636552299455477603">"ಆನ್ ಮಾಡಿ"</string>
<string name="disable" msgid="1122698860799462116">"ಆಫ್ ಮಾಡು"</string>
- <string name="change_num" msgid="6982164494063109334">"ಅಪ್ಡೇಟ್ ಮಾಡಿ"</string>
+ <string name="change_num" msgid="6982164494063109334">"ಅಪ್ಡೇಟ್ ಮಾಡು"</string>
<string-array name="clir_display_values">
<item msgid="8477364191403806960">"ನೆಟ್ವರ್ಕ್ ಡಿಫಾಲ್ಟ್"</item>
<item msgid="6813323051965618926">"ಸಂಖ್ಯೆಯನ್ನು ಮರೆಮಾಡು"</item>
@@ -185,7 +185,7 @@
<string name="choose_network_title" msgid="5335832663422653082">"ನೆಟ್ವರ್ಕ್ ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="network_disconnected" msgid="8844141106841160825">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="network_connected" msgid="2760235679963580224">"ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
- <string name="network_connecting" msgid="160901383582774987">"ಕನೆಕ್ಟ್ ಆಗುತ್ತಿದೆ..."</string>
+ <string name="network_connecting" msgid="160901383582774987">"ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ..."</string>
<string name="network_could_not_connect" msgid="6547460848093727998">"ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string>
<string-array name="preferred_network_mode_choices">
<item msgid="4531933377509551889">"GSM/WCDMA ಗೆ ಪ್ರಾಶಸ್ತ್ಯ ನೀಡಲಾಗಿದೆ"</item>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"ಹೌದು"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"ಇಲ್ಲ"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"ವಜಾಗೊಳಿಸಿ"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ಫೋನ್, ತುರ್ತು ಕಾಲ್ಬ್ಯಾಕ್ ಮೋಡ್ನಲ್ಲಿದೆ"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> ವರೆಗೆ"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">ಫೋನ್ <xliff:g id="COUNT_1">%s</xliff:g> ನಿಮಿಷಗಳವರೆಗೆ ತುರ್ತು ಕಾಲ್ಬ್ಯಾಕ್ ಮೋಡ್ನಲ್ಲಿರುತ್ತದೆ.\n ನೀವು ಈಗಲೇ ನಿರ್ಗಮಿಸಲು ಬಯಸುತ್ತೀರಾ?</item>
- <item quantity="other">ಫೋನ್ <xliff:g id="COUNT_1">%s</xliff:g> ನಿಮಿಷಗಳವರೆಗೆ ತುರ್ತು ಕಾಲ್ಬ್ಯಾಕ್ ಮೋಡ್ನಲ್ಲಿರುತ್ತದೆ.\n ನೀವು ಈಗಲೇ ನಿರ್ಗಮಿಸಲು ಬಯಸುತ್ತೀರಾ?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"ಸೇವೆ"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"ಸೆಟಪ್"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<ಹೊಂದಿಸಿಲ್ಲ>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"ರಿಫ್ರೆಶ್ ಮಾಡಿ"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS ಪರಿಶೀಲನೆ ಟಾಗಲ್ ಮಾಡಿ"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-ನಿರ್ದಿಷ್ಟ ಮಾಹಿತಿ/ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC ಲಭ್ಯವಿದೆ:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"ನಿರ್ಬಂಧಿತ DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR ಲಭ್ಯವಿದೆ:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR ಸ್ಥಿತಿ:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR ಫ್ರೀಕ್ವೆನ್ಸಿ:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"ರೇಡಿಯೋ ಬ್ಯಾಂಡ್ ಮೋಡ್ ಹೊಂದಿಸಿ"</string>
<string name="band_mode_loading" msgid="795923726636735967">"ಬ್ಯಾಂಡ್ ಪಟ್ಟಿಯನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"ಹೊಂದಿಸಿ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 462af54..3729c99 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -511,7 +511,7 @@
<string name="card_title_dialing" msgid="8742182654254431781">"전화 거는 중"</string>
<string name="card_title_redialing" msgid="18130232613559964">"재다이얼 중"</string>
<string name="card_title_conf_call" msgid="901197309274457427">"다자간 통화"</string>
- <string name="card_title_incoming_call" msgid="881424648458792430">"수신 전화"</string>
+ <string name="card_title_incoming_call" msgid="881424648458792430">"수신전화"</string>
<string name="card_title_call_ended" msgid="650223980095026340">"통화 종료됨"</string>
<string name="card_title_on_hold" msgid="9028319436626975207">"대기 중"</string>
<string name="card_title_hanging_up" msgid="814874106866647871">"전화 끊는 중"</string>
@@ -572,7 +572,7 @@
<string name="onscreenManageCallsText" msgid="1162047856081836469">"통화 관리"</string>
<string name="onscreenManageConferenceText" msgid="4700574060601755137">"다자간 통화 관리"</string>
<string name="onscreenAudioText" msgid="7224226735052019986">"오디오"</string>
- <string name="onscreenVideoCallText" msgid="1743992456126258698">"영상 통화"</string>
+ <string name="onscreenVideoCallText" msgid="1743992456126258698">"화상 통화"</string>
<string name="importSimEntry" msgid="3892354284082689894">"가져오기"</string>
<string name="importAllSimEntries" msgid="2628391505643564007">"모두 가져오기"</string>
<string name="importingSimContacts" msgid="4995457122107888932">"SIM 주소록 가져오는 중"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"예"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"아니요"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"해제"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"휴대전화가 긴급 콜백 모드입니다."</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g>까지"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">휴대전화가 <xliff:g id="COUNT_1">%s</xliff:g>분간 긴급 콜백 모드로 유지됩니다.\n지금 종료하시겠습니까?</item>
- <item quantity="one">휴대전화가 <xliff:g id="COUNT_0">%s</xliff:g>분간 긴급 콜백 모드로 유지됩니다.\n지금 종료하시겠습니까?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"서비스"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"설정"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<설정 안됨>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"새로고침"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS 확인 전환"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM별 정보/설정"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC 사용 가능:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR 제한됨:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR 사용 가능:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR 상태:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR 빈도:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"무선 주파수 대역 모드 설정"</string>
<string name="band_mode_loading" msgid="795923726636735967">"대역 목록 로드 중…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"설정"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index d6c23fb..f0804b1 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -48,7 +48,7 @@
<string name="no_vm_number_msg" msgid="5165161462411372504">"SIM-картада сакталган үн почтасынын номери жок."</string>
<string name="add_vm_number_str" msgid="7368168964435881637">"Номер кошуу"</string>
<string name="voice_number_setting_primary_user_only" msgid="3394706575741912843">"Үн почта жөндөөлөрүн алгачкы колдонуучу гана өзгөртө алат."</string>
- <string name="puk_unlocked" msgid="4627340655215746511">"SIM картаңыз бөгөттөн чыгарылган. Телефонуңуздун кулпусу ачылууда…"</string>
+ <string name="puk_unlocked" msgid="4627340655215746511">"SIM-картаңыз бөгөттөн чыгарылган. Телефонуңуздун кулпусу ачылууда…"</string>
<string name="label_ndp" msgid="7617392683877410341">"SIM-карта тармагынын кулпусун ачуучу PIN код"</string>
<string name="sim_ndp_unlock_text" msgid="7737338355451978338">"Кулпусун ачуу"</string>
<string name="sim_ndp_dismiss_text" msgid="89667342248929777">"Этибарга албоо"</string>
@@ -170,7 +170,7 @@
<string name="empty_networks_list" msgid="9216418268008582342">"Эч тармак табылган жок."</string>
<string name="network_query_error" msgid="3862515805115145124">"Тармактар табылбай койду. Кайталап көрүңүз."</string>
<string name="register_on_network" msgid="4194770527833960423">"<xliff:g id="NETWORK">%s</xliff:g> тармагына катталууда…"</string>
- <string name="not_allowed" msgid="8541221928746104798">"Сиздин SIM картаңыз бул түйүнгө кошулганга жол бербейт."</string>
+ <string name="not_allowed" msgid="8541221928746104798">"Сиздин SIM-картаңыз бул түйүнгө кошулганга жол бербейт."</string>
<string name="connect_later" msgid="1950138106010005425">"Бул түйүнгө азыр кошулуу мүмкүн эмес. Бир аздан соң кайра аракеттениңиз."</string>
<string name="registration_done" msgid="5337407023566953292">"Тармакка катталды."</string>
<string name="already_auto" msgid="8607068290733079336">"Мурунтан эле автоматтык түрдө тандоодо."</string>
@@ -238,7 +238,7 @@
<string name="preferred_network_mode_lte_cdma_evdo_gsm_wcdma_summary" msgid="6707224437925495615">"Тандалган тармак режими: LTE/CDMA/EvDo/GSM/WCDMA"</string>
<string name="preferred_network_mode_global_summary" msgid="3847086258439582411">"Тандалган тармак режими: Дүйнө жүзү"</string>
<string name="preferred_network_mode_lte_wcdma_summary" msgid="7001804022020813865">"Артыкчылыктуу желе тартиби: LTE / WCDMA"</string>
- <string name="preferred_network_mode_lte_gsm_umts_summary" msgid="6484203890156282179">"Жаккан режим: LTE / GSM / UMTS"</string>
+ <string name="preferred_network_mode_lte_gsm_umts_summary" msgid="6484203890156282179">"Жактырылган режим: LTE / GSM / UMTS"</string>
<string name="preferred_network_mode_lte_cdma_summary" msgid="8187929456614068518">"Тандалган тармак режими: LTE / CDMA"</string>
<string name="preferred_network_mode_tdscdma_summary" msgid="3602127224234207206">"Тандалган тармак режими: TDSCDMA"</string>
<string name="preferred_network_mode_tdscdma_wcdma_summary" msgid="7076968749402201123">"Тандалган тармак режими: TDSCDMA / WCDMA"</string>
@@ -274,8 +274,8 @@
<string name="data_enable_summary" msgid="696860063456536557">"Дайындарды пайдаланууга уруксат берүү"</string>
<string name="dialog_alert_title" msgid="5260471806940268478">"Көңүл буруңуз"</string>
<string name="roaming" msgid="1576180772877858949">"Роуминг"</string>
- <string name="roaming_enable" msgid="6853685214521494819">"Роуминг учурунда дайын-даректерди өткөрүүчү кызматтарга туташуу"</string>
- <string name="roaming_disable" msgid="8856224638624592681">"Роуминг учурунда дайын-даректерди өткөрүүчү кызматтарга туташуу"</string>
+ <string name="roaming_enable" msgid="6853685214521494819">"Роуминг учурунда мобилдик Интернетке туташат"</string>
+ <string name="roaming_disable" msgid="8856224638624592681">"Роуминг учурунда мобилдик Интернетке туташат"</string>
<string name="roaming_reenable_message" msgid="1951802463885727915">"Интернет-роуминг өчүрүлгөн. Күйгүзүү үчүн басыңыз."</string>
<string name="roaming_enabled_message" msgid="9022249120750897">"Роуминг акысын төлөп калышыңыз мүмкүн. Өзгөртүү үчүн таптап коюңуз."</string>
<string name="roaming_notification_title" msgid="3590348480688047320">"Мобилдик интернет туташуусу үзүлдү"</string>
@@ -285,7 +285,7 @@
<string name="roaming_alert_title" msgid="5689615818220960940">"Интернет-роумингди иштетесизби?"</string>
<string name="limited_sim_function_notification_title" msgid="612715399099846281">"SIM-картанын функциялары чектелген"</string>
<string name="limited_sim_function_with_phone_num_notification_message" msgid="5928988883403677610">"<xliff:g id="PHONE_NUMBER">%2$s</xliff:g> номерин колдонгондо <xliff:g id="CARRIER_NAME">%1$s</xliff:g> чалуулары жана дайындар кызматтары бөгөттөлүшү мүмкүн."</string>
- <string name="limited_sim_function_notification_message" msgid="5338638075496721160">"Башка SIM картаны колднгндо <xliff:g id="CARRIER_NAME">%1$s</xliff:g> чалуулары жана дайындар кызмттары бөгөттлшү мүмкүн."</string>
+ <string name="limited_sim_function_notification_message" msgid="5338638075496721160">"Башка SIM-картаны колднгндо <xliff:g id="CARRIER_NAME">%1$s</xliff:g> чалуулары жана дайындар кызмттары бөгөттлшү мүмкүн."</string>
<string name="data_usage_title" msgid="8438592133893837464">"Колдонмолордун трафиги"</string>
<string name="data_usage_template" msgid="6287906680674061783">"<xliff:g id="ID_2">%2$s</xliff:g> аралыгында <xliff:g id="ID_1">%1$s</xliff:g> мобилдик трафик колдонулду"</string>
<string name="advanced_options_title" msgid="9208195294513520934">"Өркүндөтүлгөн"</string>
@@ -464,9 +464,9 @@
<string name="delete_fdn_contact" msgid="7027405651994507077">"Туруктуу терүү номерин жок кылуу"</string>
<string name="deleting_fdn_contact" msgid="6872320570844460428">"Туруктуу терүү номери жок кылынууда…"</string>
<string name="fdn_contact_deleted" msgid="1680714996763848838">"Туруктуу терүү номери өчүрүлдү."</string>
- <string name="pin2_invalid" msgid="2313954262684494442">"БНТ жаңырган жок, анткени туура эмес PIN-код киргизилди."</string>
- <string name="fdn_invalid_number" msgid="9067189814657840439">"Уруксат берилген номер жаңырган жок, себеби жазылган номердин саны <xliff:g id="FDN_NUMBER_LIMIT_LENGTH">%d</xliff:g> ашпашы керек."</string>
- <string name="pin2_or_fdn_invalid" msgid="7542639487955868181">"БНТ жаңырган жок. PIN2 туура эмес, же телефон номуру жараксыз."</string>
+ <string name="pin2_invalid" msgid="2313954262684494442">"БНТ жаңыртылган жок, анткени туура эмес PIN-код киргизилди."</string>
+ <string name="fdn_invalid_number" msgid="9067189814657840439">"Уруксат берилген номер жаңыртылган жок, себеби жазылган номердин саны <xliff:g id="FDN_NUMBER_LIMIT_LENGTH">%d</xliff:g> ашпашы керек."</string>
+ <string name="pin2_or_fdn_invalid" msgid="7542639487955868181">"БНТ жаңыртылган жок. PIN2 туура эмес, же телефон номуру жараксыз."</string>
<string name="fdn_failed" msgid="216592346853420250">"БНТ иши кыйрады."</string>
<string name="simContacts_emptyLoading" msgid="4989040293858675483">"SIM-картадан окулууда…"</string>
<string name="simContacts_empty" msgid="1135632055473689521">"SIM картаңызда байланыштар жок."</string>
@@ -520,7 +520,7 @@
<string name="notification_voicemail_title_count" msgid="2806950319222327082">"Жаңы үн почтасы (<xliff:g id="COUNT">%d</xliff:g>)"</string>
<string name="notification_voicemail_text_format" msgid="5720947141702312537">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> номерин терүү"</string>
<string name="notification_voicemail_no_vm_number" msgid="3423686009815186750">"Үн почтасынын номери белгисиз"</string>
- <string name="notification_network_selection_title" msgid="255595526707809121">"Интернет жок"</string>
+ <string name="notification_network_selection_title" msgid="255595526707809121">"Байланыш жок"</string>
<string name="notification_network_selection_text" msgid="553288408722427659">"Тандалган тармак <xliff:g id="OPERATOR_NAME">%s</xliff:g> жеткиликсиз"</string>
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Мобилдик тармакты күйгүзүңүз, чалуу үчүн \"Учакта\" режимин же \"Батареяны үнөмдөө\" режимин өчүрүңүз."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Чалуу үчүн учак режимин өчүрүңүз."</string>
@@ -543,7 +543,7 @@
<string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Чалууну кармап туруу мүмкүн эмес."</string>
<string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Чалуу үчүн зымсыз тармакка туташыңыз."</string>
<string name="incall_error_promote_wfc" msgid="9164896813931363415">"Wi-Fi аркылуу чалыңыз."</string>
- <string name="emergency_information_hint" msgid="9208897544917793012">"Кырсыктаганда керек болчу маалымат"</string>
+ <string name="emergency_information_hint" msgid="9208897544917793012">"Өзгөчө кырдаал маалыматы"</string>
<string name="emergency_information_owner_hint" msgid="6256909888049185316">"Ээси"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Маалыматты көрүү үчүн кайра таптап коюңуз"</string>
<string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"Шашылыш чалуу"</string>
@@ -575,7 +575,7 @@
<string name="onscreenVideoCallText" msgid="1743992456126258698">"Видео чалуу"</string>
<string name="importSimEntry" msgid="3892354284082689894">"Импорттоо"</string>
<string name="importAllSimEntries" msgid="2628391505643564007">"Баарын импорттоо"</string>
- <string name="importingSimContacts" msgid="4995457122107888932">"SIM картадагы байланыштардан импорттоо"</string>
+ <string name="importingSimContacts" msgid="4995457122107888932">"SIM-картадагы байланыштардан импорттоо"</string>
<string name="importToFDNfromContacts" msgid="5068664870738407341">"Байланыштардан импорттоо"</string>
<string name="singleContactImportedMsg" msgid="3619804066300998934">"Байланыш импорттолду"</string>
<string name="failedToImportSingleContactMsg" msgid="228095510489830266">"Байланыш импорттолбой калды"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ооба"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Жок"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Этибарга албоо"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Телефон шашылыш кайра чалуу режиминде"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> чейин"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Телефон шашылыш кайра чалуу режиминде <xliff:g id="COUNT_1">%s</xliff:g> мүнөт бою болот.\nАзыр чыгып кетесизби?</item>
- <item quantity="one">Телефон шашылыш кайра чалуу режиминде <xliff:g id="COUNT_0">%s</xliff:g> мүнөт бою болот.\nАзыр чыгып кетесизби?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Кызмат"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Жөндөө"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Коюлган эмес>"</string>
@@ -674,7 +668,7 @@
<string name="message_decode_error" msgid="1061856591500290887">"Билдирүү дешифрленип жатканда ката кеткен."</string>
<string name="callFailed_cdma_activation" msgid="5392057031552253550">"SIM-карта кызматыңызды жандырып, телефонуңуздун роуминг мүмкүнчүлүктөрүн жаңыртты."</string>
<string name="callFailed_cdma_call_limit" msgid="1074219746093031412">"Учурда жигердүү чалуулар өтө көп. Чалуу үчүн учурдагы чалууларды бүтүрүңүз же бириктириңиз."</string>
- <string name="callFailed_imei_not_accepted" msgid="7257903653685147251">"Байланышуу мумкүн эмес. Жарактуу SIM картаны салыңыз."</string>
+ <string name="callFailed_imei_not_accepted" msgid="7257903653685147251">"Байланышуу мумкүн эмес. Жарактуу SIM-картаны салыңыз."</string>
<string name="callFailed_wifi_lost" msgid="1788036730589163141">"Wi-Fi туташуусу үзүлүп калды. Чалуу аяктады."</string>
<string name="dialFailed_low_battery" msgid="6857904237423407056">"Батареянын заряды төмөн болгондуктан, видео режиминде чала албайсыз."</string>
<string name="callFailed_low_battery" msgid="4056828320214416182">"Батареянын заряды төмөн болгондуктан, видео чалуу аяктады."</string>
@@ -703,7 +697,7 @@
<string name="mobile_data_activate_roaming_plan_summary" msgid="5379228493306235969">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> оператору аркылуу роуминг планын күйгүзүңүз"</string>
<string name="mobile_data_activate_footer" msgid="7895874069807204548">"Сиз мобилдик Интернетти же роуминг планын <xliff:g id="PROVIDER_NAME">%s</xliff:g> операторуңуз аркылуу кошо аласыз."</string>
<string name="mobile_data_activate_diag_title" msgid="5401741936224757312">"Мобилдик Интернет күйгүзүлсүнбү?"</string>
- <string name="mobile_data_activate_diag_message" msgid="3527260988020415441">"Мобилдик интернетти <xliff:g id="PROVIDER_NAME">%s</xliff:g> оператордун жардамы менен, күйгүзүү керек болушу мүмкүн"</string>
+ <string name="mobile_data_activate_diag_message" msgid="3527260988020415441">"Мобилдик интернетти <xliff:g id="PROVIDER_NAME">%s</xliff:g> оператордун жардамы менен күйгүзүү керек болушу мүмкүн"</string>
<string name="mobile_data_activate_button" msgid="1139792516354374612">"ДАЙЫНДАРДЫ КОШУУ"</string>
<string name="mobile_data_activate_cancel_button" msgid="3530174817572005860">"ЖОККО ЧЫГАРУУ"</string>
<string name="clh_card_title_call_ended_txt" msgid="5977978317527299698">"Чалуу аяктады"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Жаңылоо"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS текшерүүнү которуштуруу"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM\'ге тиешелүү Маалымат/Жөндөөлөр"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC жеткиликтүү:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR чектелген:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR жеткиликтүү:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR абалы:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR жыштыгы:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Радио жыштыгынын режимин коюу"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Жыштык режиминин тизмеси жүктөлүүдө…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Жөндөө"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 08947eb..dbfcfd6 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"ຕົກລົງ"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"ບໍ່"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"ປິດໄວ້"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ໂທລະສັບຢູ່ໃນໂໝດໂທກັບສຸກເສີນ"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"ຈົນຮອດ <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">ໂທລະສັບຈະຢູ່ໃນໂໝດໂທກັບສຸກເສີນເປັນເວລາ <xliff:g id="COUNT_1">%s</xliff:g> ນາທີ.\nທ່ານຕ້ອງການອອກຕອນນີ້ເລີຍບໍ?</item>
- <item quantity="one">ໂທລະສັບຈະຢູ່ໃນໂໝດໂທກັບສຸກເສີນເປັນເວລາ <xliff:g id="COUNT_0">%s</xliff:g> ນາທີ.\nທ່ານຕ້ອງການອອກຕອນນີ້ເລີຍບໍ?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"ບໍລິການ"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"ຕັ້ງຄ່າ"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<ຍັງບໍ່ໄດ້ຕັ້ງ>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"ໂຫຼດຂໍ້ມູນໃໝ່"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"ເປີດ/ປິດ ການກວດ DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"ຂໍ້ມູນ/ການຕັ້ງຄ່າສະເພາະ OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"ມີ EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"ຈຳກັດ DCNR ໄວ້ແລ້ວ:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"ມີ NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"ສະຖານະ NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"ຄວາມຖີ່ NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"ຕັ້ງໂໝດແຖບຄວາມຖີ່ວິທະຍຸ"</string>
<string name="band_mode_loading" msgid="795923726636735967">"ກຳລັງດາວໂຫລດລາຍຊື່ແຖບຄວາມຖີ່..."</string>
<string name="band_mode_set" msgid="6657819412803771421">"ກຳນົດ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 1002dd9..ddb18fb 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -127,7 +127,7 @@
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"Skambučių nustatymus gali keisti tik administruojantis naudotojas."</string>
<string name="call_settings_with_label" msgid="8460230435361579511">"Nustatymai (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"Skambinimo nustatymų klaida"</string>
- <string name="reading_settings" msgid="1605904432450871183">"Analizuojami nustatymai..."</string>
+ <string name="reading_settings" msgid="1605904432450871183">"Skaitomi nustatymai..."</string>
<string name="updating_settings" msgid="3650396734816028808">"Atnaujinami nustatymai..."</string>
<string name="reverting_settings" msgid="7378668837291012205">"Grąžinami nustatymai…"</string>
<string name="response_error" msgid="3904481964024543330">"Netikėtas atsakas iš tinklo."</string>
@@ -307,9 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Duomenų naudojimo laikotarpis"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Duomenų perdavimo spartos politika"</string>
<string name="throttle_help" msgid="2624535757028809735">"Sužinokite daugiau"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
- <skip />
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) iš <xliff:g id="USED_2">%3$s</xliff:g> laikotarpio maksimumo\nKitas laikotarpis prasidės po <xliff:g id="USED_3">%4$d</xliff:g> dienų (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) iš <xliff:g id="USED_2">%3$s</xliff:g> laikotarpio maksimumo"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"Viršytas <xliff:g id="USED_0">%1$s</xliff:g> maksimumas\nDuomenų perdavimo sparta sumažinta iki <xliff:g id="USED_1">%2$d</xliff:g> Kb / sek."</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"Praėjo <xliff:g id="USED_0">%1$d</xliff:g>٪ ciklo\nKitas laikotarpis prasidės po<xliff:g id="USED_1">%2$d</xliff:g> dienų (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -643,14 +641,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Taip"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Ne"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Atsisakyti"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefone veikia atgalinio skambinimo pagalbos numeriu režimas"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Iki <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Telefone <xliff:g id="COUNT_1">%s</xliff:g> minutę veiks atgalinio skambinimo pagalbos numeriu režimas.\nAr norite jį išjungti dabar?</item>
- <item quantity="few">Telefone <xliff:g id="COUNT_1">%s</xliff:g> minutes veiks atgalinio skambinimo pagalbos numeriu režimas.\nAr norite jį išjungti dabar?</item>
- <item quantity="many">Telefone <xliff:g id="COUNT_1">%s</xliff:g> minutės veiks atgalinio skambinimo pagalbos numeriu režimas.\nAr norite jį išjungti dabar?</item>
- <item quantity="other">Telefone <xliff:g id="COUNT_1">%s</xliff:g> minučių veiks atgalinio skambinimo pagalbos numeriu režimas.\nAr norite jį išjungti dabar?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Paslaugos teikėjas"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Sąranka"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Nenustatyta>"</string>
@@ -906,11 +896,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Atnaujinti"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Kaitalioti DNS tikrinimą"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM būdinga informacija / nustatymai"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC (pasiekiama):"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR (apribota):"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR (pasiekiama):"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR būsena:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR dažnis:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Nustatyti radijo dažnių režimą"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Įkeliamas dažnių sąrašas…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Nustatyti"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 0ba2739..8161b61 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -522,7 +522,7 @@
<string name="notification_voicemail_no_vm_number" msgid="3423686009815186750">"Balss pasta numurs nav zināms."</string>
<string name="notification_network_selection_title" msgid="255595526707809121">"Nav pakalpojuma"</string>
<string name="notification_network_selection_text" msgid="553288408722427659">"Atlasītais tīkls (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nav pieejams"</string>
- <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Lai veiktu zvanu, ieslēdziet mobilo tīklu, izslēdziet lidojuma režīmu vai izslēdziet akumulatora enerģijas taupīšanas režīmu."</string>
+ <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Lai veiktu zvanu, ieslēdziet mobilo tīklu, izslēdziet lidojuma režīmu vai izslēdziet akumulatora jaudas taupīšanas režīmu."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Lai veiktu zvanu, izslēdziet lidojuma režīmu."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Lai veiktu zvanu, izslēdziet lidojuma režīmu vai izveidojiet savienojumu ar bezvadu tīklu."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Lai veiktu parastu zvanu, izejiet no ārkārtas atzvana režīma."</string>
@@ -639,13 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Jā"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Nē"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Noraidīt"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Tālrunis atrodas ārkārtas atzvana režīmā."</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Līdz plkst. <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="zero">Tālrunis atradīsies ārkārtas atzvana režīmā <xliff:g id="COUNT_1">%s</xliff:g> minūtes.\nVai vēlaties iziet tūlīt?</item>
- <item quantity="one">Tālrunis atradīsies ārkārtas atzvana režīmā <xliff:g id="COUNT_1">%s</xliff:g> minūti.\nVai vēlaties iziet tūlīt?</item>
- <item quantity="other">Tālrunis atradīsies ārkārtas atzvana režīmā <xliff:g id="COUNT_1">%s</xliff:g> minūtes.\nVai vēlaties iziet tūlīt?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Pakalpojums"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Iestatīšana"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Nav iestatīts>"</string>
@@ -901,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Atsvaidzināt"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Pārslēgt DNS pārbaudi"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM raksturīga informācija/iestatījumi"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC pieejamība:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR ierobežojums:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR pieejamība:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR statuss:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR biežums:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Radio frekvenču joslu režīma iestatīšana"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Notiek joslu saraksta ielāde…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Iestatīt"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index b5ce5df..1167e3d 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"Конфигурирајте ги поставките на сметка"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"Сите сметки за повици"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"Изберете кои сметки може да повикуваат"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"Повик преку Wi-Fi"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"Повикување преку Wi-Fi"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"Вградена услуга на поврзување"</string>
<string name="voicemail" msgid="7697769412804195032">"Говорна пошта"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"Говорна пошта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -84,7 +84,7 @@
<string name="smart_forwarding_settings_menu_summary" msgid="5096947726032885325">"Кога едниот број е недостапен, секогаш проследувајте ги повиците на вашиот друг број"</string>
<string name="voicemail_notifications_preference_title" msgid="7829238858063382977">"Известувања"</string>
<string name="cell_broadcast_settings" msgid="8135324242541809924">"Итни емитувања"</string>
- <string name="call_settings" msgid="3677282690157603818">"Поставки за повици"</string>
+ <string name="call_settings" msgid="3677282690157603818">"Поставки на повик"</string>
<string name="additional_gsm_call_settings" msgid="1561980168685658846">"Дополнителни поставки"</string>
<string name="additional_gsm_call_settings_with_label" msgid="7973920539979524908">"Дополнителни поставки (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="sum_gsm_call_settings" msgid="7964692601608878138">"Дополнителни поставки на повик само за GSM"</string>
@@ -123,11 +123,11 @@
<string name="sum_cfnrc_enabled" msgid="1799069234006073477">"Проследување на <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfnrc_disabled" msgid="739289696796917683">"Исклучено"</string>
<string name="disable_cfnrc_forbidden" msgid="775348748084726890">"Вашиот оператор не поддржува оневозможување проследување повик кога вашиот телефон е недостапен."</string>
- <string name="updating_title" msgid="6130548922615719689">"Поставки за повици"</string>
+ <string name="updating_title" msgid="6130548922615719689">"Поставки на повик"</string>
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"Поставките за повик може да ги измени само администраторскиот корисник."</string>
<string name="call_settings_with_label" msgid="8460230435361579511">"Поставки (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"Грешка со поставки на повици"</string>
- <string name="reading_settings" msgid="1605904432450871183">"Се читаат поставките..."</string>
+ <string name="reading_settings" msgid="1605904432450871183">"Поставки за читање..."</string>
<string name="updating_settings" msgid="3650396734816028808">"Ажурирање поставки..."</string>
<string name="reverting_settings" msgid="7378668837291012205">"Враќање поставки..."</string>
<string name="response_error" msgid="3904481964024543330">"Неочекуван одговор од мрежата."</string>
@@ -168,7 +168,7 @@
<string name="label_available" msgid="1316084116670821258">"Достапни мрежи"</string>
<string name="load_networks_progress" msgid="4051433047717401683">"Се пребарува..."</string>
<string name="empty_networks_list" msgid="9216418268008582342">"Не се пронајдени мрежи."</string>
- <string name="network_query_error" msgid="3862515805115145124">"Не може да се најдат мрежи. Обидете се повторно."</string>
+ <string name="network_query_error" msgid="3862515805115145124">"Не можеше да се најдат мрежи. Обидете се повторно."</string>
<string name="register_on_network" msgid="4194770527833960423">"Регистрирање на <xliff:g id="NETWORK">%s</xliff:g>..."</string>
<string name="not_allowed" msgid="8541221928746104798">"Вашата SIM картичка не дозволува поврзување со оваа мрежа."</string>
<string name="connect_later" msgid="1950138106010005425">"Не може да се поврзе со оваа мрежа во моментов. Обидете се повторно подоцна."</string>
@@ -186,7 +186,7 @@
<string name="network_disconnected" msgid="8844141106841160825">"Исклучено"</string>
<string name="network_connected" msgid="2760235679963580224">"Поврзано"</string>
<string name="network_connecting" msgid="160901383582774987">"Се поврзува…"</string>
- <string name="network_could_not_connect" msgid="6547460848093727998">"Не може да се поврзе"</string>
+ <string name="network_could_not_connect" msgid="6547460848093727998">"Не можеше да се поврзе"</string>
<string-array name="preferred_network_mode_choices">
<item msgid="4531933377509551889">"Претпочитан: GSM/WCDMA"</item>
<item msgid="5120532750027435355">"Само GSM"</item>
@@ -298,7 +298,7 @@
<string name="sim_selection_required_pref" msgid="6985901872978341314">"Треба да се избере"</string>
<string name="sim_change_data_title" msgid="9142726786345906606">"Да се промени SIM за интернет?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"Да се користи <xliff:g id="NEW_SIM">%1$s</xliff:g> наместо <xliff:g id="OLD_SIM">%2$s</xliff:g> за мобилен интернет?"</string>
- <string name="wifi_calling_settings_title" msgid="5800018845662016507">"Повик преку Wi-Fi"</string>
+ <string name="wifi_calling_settings_title" msgid="5800018845662016507">"Повикување преку Wi-Fi"</string>
<string name="video_calling_settings_title" msgid="342829454913266078">"Видеоповикување преку оператор"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"Опции за GSM/UMTS"</string>
<string name="cdma_options" msgid="3669592472226145665">"Опции на CDMA"</string>
@@ -307,7 +307,9 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Период на потрошен интернет"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Политика на стапка на податоци"</string>
<string name="throttle_help" msgid="2624535757028809735">"Дознај повеќе"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> ٪) од максимум <xliff:g id="USED_2">%3$s</xliff:g> за периодот\nСледниот период започнува за <xliff:g id="USED_3">%4$d</xliff:g> дена (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) од <xliff:g id="USED_2">%3$s</xliff:g> максимален период"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> максимум е надминат\nСтапката на податоци е намалена на <xliff:g id="USED_1">%2$d</xliff:g> кб/с"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ од циклусот помина\nНаредниот период започнува за <xliff:g id="USED_1">%2$d</xliff:g> дена (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -543,7 +545,7 @@
<string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Не може да се задржат повици."</string>
<string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Поврзете се на безжична мрежа за да повикате."</string>
<string name="incall_error_promote_wfc" msgid="9164896813931363415">"Овозможете повикување преку Wi-Fi за воспоставување повик."</string>
- <string name="emergency_information_hint" msgid="9208897544917793012">"Податоци за итни случаи"</string>
+ <string name="emergency_information_hint" msgid="9208897544917793012">"Информации за итни случаи"</string>
<string name="emergency_information_owner_hint" msgid="6256909888049185316">"Сопственик"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Допрете повторно за приказ на информации"</string>
<string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"Повик за итни случаи"</string>
@@ -612,7 +614,7 @@
<string name="ota_listen" msgid="2772252405488894280">"Следете ги гласовните упатства додека не слушнете дека активацијата е завршена."</string>
<string name="ota_speaker" msgid="1086766980329820528">"Звучник"</string>
<string name="ota_progress" msgid="8837259285255700132">"Телефонот се програмира…"</string>
- <string name="ota_failure" msgid="5674217489921481576">"Телефонот не може да се програмира"</string>
+ <string name="ota_failure" msgid="5674217489921481576">"Телефонот не можеше да се програмира"</string>
<string name="ota_successful" msgid="1106825981548107774">"Вашиот телефон е сега активиран. Може да поминат и до 15 минути за услугата да започне."</string>
<string name="ota_unsuccessful" msgid="8531037653803955754">"Вашиот телефон не се активираше. \nМожеби ќе треба да најде област со подобра покриеност (во близина на прозорец или надвор). \n\nОбидете се повторно или јавете се во служба за услуги на клиенти за повеќе опции."</string>
<string name="ota_spc_failure" msgid="904092035241370080">"ВИШОК SPC ГРЕШКИ"</string>
@@ -637,12 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Да"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Не"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Отфрли"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Телефонот е во режим на итни повратни повици"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"До <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Телефонот ќе биде во режим на итни повратни повици <xliff:g id="COUNT_1">%s</xliff:g> минута.\n Дали сакате да излезете сега?</item>
- <item quantity="other">Телефонот ќе биде во режим на итни повратни повици <xliff:g id="COUNT_1">%s</xliff:g> минути.\n Дали сакате да излезете сега?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Услуга"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Поставување"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Не е поставен>"</string>
@@ -711,54 +707,54 @@
<string name="clh_callFailed_simError_txt" msgid="5128538525762326413">"Не може да се пристапи до SIM-картичката"</string>
<string name="clh_incall_error_out_of_service_txt" msgid="2736010617446749869">"Мобилната мрежа не е достапна"</string>
<string name="clh_callFailed_unassigned_number_txt" msgid="141967660286695682">"Проблем со телефонскиот број што се обидувате да го бирате. Код за грешка: 1."</string>
- <string name="clh_callFailed_no_route_to_destination_txt" msgid="4805015149822352308">"Повикот не може да се заврши. Код за грешка: 3."</string>
- <string name="clh_callFailed_channel_unacceptable_txt" msgid="4062754579408613021">"Повикот не може да се заврши. Код за грешка: 6."</string>
- <string name="clh_callFailed_operator_determined_barring_txt" msgid="4202077821465974286">"Повикот не може да се заврши. Код за грешка: 8."</string>
- <string name="clh_callFailed_normal_call_clearing_txt" msgid="5677987959062976462">"Повикот не може да се заврши. Код за грешка: 16."</string>
+ <string name="clh_callFailed_no_route_to_destination_txt" msgid="4805015149822352308">"Повикот не можеше да се заврши. Код за грешка: 3."</string>
+ <string name="clh_callFailed_channel_unacceptable_txt" msgid="4062754579408613021">"Повикот не можеше да се заврши. Код за грешка: 6."</string>
+ <string name="clh_callFailed_operator_determined_barring_txt" msgid="4202077821465974286">"Повикот не можеше да се заврши. Код за грешка: 8."</string>
+ <string name="clh_callFailed_normal_call_clearing_txt" msgid="5677987959062976462">"Повикот не можеше да се заврши. Код за грешка: 16."</string>
<string name="clh_callFailed_user_busy_txt" msgid="8886432858568086854">"Корисникот е зафатен"</string>
<string name="clh_callFailed_no_user_responding_txt" msgid="341100226919865128">"Корисникот не одговара"</string>
- <string name="clh_callFailed_user_alerting_txt" msgid="896082976264427969">"Повикот не може да се заврши. Код за грешка: 19."</string>
+ <string name="clh_callFailed_user_alerting_txt" msgid="896082976264427969">"Повикот не можеше да се заврши. Код за грешка: 19."</string>
<string name="clh_callFailed_call_rejected_txt" msgid="3439435671153341709">"Повикот е одбиен"</string>
<string name="clh_callFailed_number_changed_txt" msgid="2868476949771441667">"Бројот е променет"</string>
- <string name="clh_callFailed_pre_emption_txt" msgid="8887998866342162724">"Повикот не може да се заврши. Код за грешка: 25."</string>
- <string name="clh_callFailed_non_selected_user_clearing_txt" msgid="4804529874810197550">"Повикот не може да се заврши. Код за грешка: 26."</string>
- <string name="clh_callFailed_destination_out_of_order_txt" msgid="1130697076352728824">"Повикот не може да се заврши. Код за грешка: 27."</string>
+ <string name="clh_callFailed_pre_emption_txt" msgid="8887998866342162724">"Повикот не можеше да се заврши. Код за грешка: 25."</string>
+ <string name="clh_callFailed_non_selected_user_clearing_txt" msgid="4804529874810197550">"Повикот не можеше да се заврши. Код за грешка: 26."</string>
+ <string name="clh_callFailed_destination_out_of_order_txt" msgid="1130697076352728824">"Повикот не можеше да се заврши. Код за грешка: 27."</string>
<string name="clh_callFailed_invalid_number_format_txt" msgid="3171016382987224989">"Неважечки формат на број (нецелосен број)"</string>
- <string name="clh_callFailed_facility_rejected_txt" msgid="1054386430010898993">"Повикот не може да се заврши. Код за грешка: 29."</string>
- <string name="clh_callFailed_response_to_STATUS_ENQUIRY_txt" msgid="2763172551412307536">"Повикот не може да се заврши. Код за грешка: 30."</string>
- <string name="clh_callFailed_normal_unspecified_txt" msgid="978119938935737419">"Повикот не може да се заврши. Код за грешка: 31."</string>
- <string name="clh_callFailed_no_circuit_available_txt" msgid="1519684050419134605">"Повикот не може да се заврши. Код за грешка: 34."</string>
- <string name="clh_callFailed_network_out_of_order_txt" msgid="8689826504394592289">"Повикот не може да се заврши. Код за грешка: 38."</string>
- <string name="clh_callFailed_temporary_failure_txt" msgid="5065091554509067874">"Повикот не може да се заврши. Код за грешка: 41."</string>
- <string name="clh_callFailed_switching_equipment_congestion_txt" msgid="8681599376741988769">"Повикот не може да се заврши. Код за грешка: 42."</string>
- <string name="clh_callFailed_access_information_discarded_txt" msgid="2476199425130545428">"Повикот не може да се заврши. Код за грешка: 43."</string>
- <string name="clh_callFailed_requested_circuit_txt" msgid="7497497808928490219">"Повикот не може да се заврши. Код за грешка: 44."</string>
- <string name="clh_callFailed_resources_unavailable_unspecified_txt" msgid="144010529672928445">"Повикот не може да се заврши. Код за грешка: 47."</string>
- <string name="clh_callFailed_quality_of_service_unavailable_txt" msgid="4650329342288289290">"Повикот не може да се заврши. Код за грешка: 49."</string>
- <string name="clh_callFailed_requested_facility_not_subscribed_txt" msgid="9107977008516882170">"Повикот не може да се заврши. Код за грешка: 50."</string>
- <string name="clh_callFailed_incoming_calls_barred_within_the_CUG_txt" msgid="501037491908315591">"Повикот не може да се заврши. Код за грешка: 55."</string>
- <string name="clh_callFailed_bearer_capability_not_authorized_txt" msgid="4344366517528362620">"Повикот не може да се заврши. Код за грешка: 57."</string>
- <string name="clh_callFailed_bearer_capability_not_presently_available_txt" msgid="1436957294571545381">"Повикот не може да се заврши. Код за грешка: 58."</string>
- <string name="clh_callFailed_service_or_option_not_available_unspecified_txt" msgid="2149878874722675428">"Повикот не може да се заврши. Код за грешка: 63."</string>
- <string name="clh_callFailed_bearer_service_not_implemented_txt" msgid="1074983013965612410">"Повикот не може да се заврши. Код за грешка: 65."</string>
- <string name="clh_callFailed_ACM_equal_to_or_greater_than_ACMmax_txt" msgid="7889034195264205333">"Повикот не може да се заврши. Код за грешка: 68."</string>
- <string name="clh_callFailed_requested_facility_not_implemented_txt" msgid="7996646684699167978">"Повикот не може да се заврши. Код за грешка: 69."</string>
- <string name="clh_callFailed_only_restricted_digital_information_bearer_capability_is_available_txt" msgid="2358958110447385682">"Повикот не може да се заврши. Код за грешка: 70."</string>
- <string name="clh_callFailed_service_or_option_not_implemented_unspecified_txt" msgid="3046428509531159481">"Повикот не може да се заврши. Код за грешка: 79."</string>
- <string name="clh_callFailed_invalid_transaction_identifier_value_txt" msgid="1727401871777396619">"Повикот не може да се заврши. Код за грешка: 81."</string>
- <string name="clh_callFailed_user_not_member_of_CUG_txt" msgid="442282135105229307">"Повикот не може да се заврши. Код за грешка: 87."</string>
- <string name="clh_callFailed_incompatible_destination_txt" msgid="5900394706344969020">"Повикот не може да се заврши. Код за грешка: 88."</string>
- <string name="clh_callFailed_invalid_transit_network_selection_txt" msgid="6274621838349037741">"Повикот не може да се заврши. Код за грешка: 91."</string>
- <string name="clh_callFailed_semantically_incorrect_message_txt" msgid="7000705190197981937">"Повикот не може да се заврши. Код за грешка: 95."</string>
- <string name="clh_callFailed_invalid_mandatory_information_txt" msgid="3609204152671052123">"Повикот не може да се заврши. Код за грешка: 96."</string>
- <string name="clh_callFailed_message_type_non_existent_or_not_implemented_txt" msgid="1552110431052032814">"Повикот не може да се заврши. Код за грешка: 97."</string>
- <string name="clh_callFailed_message_type_not_compatible_with_protocol_state_txt" msgid="7717048934226300032">"Повикот не може да се заврши. Код за грешка: 98."</string>
- <string name="clh_callFailed_information_element_non_existent_or_not_implemented_txt" msgid="8931396541061612169">"Повикот не може да се заврши. Код за грешка: 99."</string>
- <string name="clh_callFailed_conditional_IE_error_txt" msgid="4630685477888727741">"Повикот не може да се заврши. Код за грешка: 100."</string>
- <string name="clh_callFailed_message_not_compatible_with_protocol_state_txt" msgid="3014075977395922947">"Повикот не може да се заврши. Код за грешка: 101."</string>
- <string name="clh_callFailed_recovery_on_timer_expiry_txt" msgid="5637581978978731672">"Повикот не може да се заврши. Код за грешка: 102."</string>
- <string name="clh_callFailed_protocol_Error_unspecified_txt" msgid="9203320572562697755">"Повикот не може да се заврши. Код за грешка: 111."</string>
- <string name="clh_callFailed_interworking_unspecified_txt" msgid="7969686413930847182">"Повикот не може да се заврши. Код за грешка: 127."</string>
+ <string name="clh_callFailed_facility_rejected_txt" msgid="1054386430010898993">"Повикот не можеше да се заврши. Код за грешка: 29."</string>
+ <string name="clh_callFailed_response_to_STATUS_ENQUIRY_txt" msgid="2763172551412307536">"Повикот не можеше да се заврши. Код за грешка: 30."</string>
+ <string name="clh_callFailed_normal_unspecified_txt" msgid="978119938935737419">"Повикот не можеше да се заврши. Код за грешка: 31."</string>
+ <string name="clh_callFailed_no_circuit_available_txt" msgid="1519684050419134605">"Повикот не можеше да се заврши. Код за грешка: 34."</string>
+ <string name="clh_callFailed_network_out_of_order_txt" msgid="8689826504394592289">"Повикот не можеше да се заврши. Код за грешка: 38."</string>
+ <string name="clh_callFailed_temporary_failure_txt" msgid="5065091554509067874">"Повикот не можеше да се заврши. Код за грешка: 41."</string>
+ <string name="clh_callFailed_switching_equipment_congestion_txt" msgid="8681599376741988769">"Повикот не можеше да се заврши. Код за грешка: 42."</string>
+ <string name="clh_callFailed_access_information_discarded_txt" msgid="2476199425130545428">"Повикот не можеше да се заврши. Код за грешка: 43."</string>
+ <string name="clh_callFailed_requested_circuit_txt" msgid="7497497808928490219">"Повикот не можеше да се заврши. Код за грешка: 44."</string>
+ <string name="clh_callFailed_resources_unavailable_unspecified_txt" msgid="144010529672928445">"Повикот не можеше да се заврши. Код за грешка: 47."</string>
+ <string name="clh_callFailed_quality_of_service_unavailable_txt" msgid="4650329342288289290">"Повикот не можеше да се заврши. Код за грешка: 49."</string>
+ <string name="clh_callFailed_requested_facility_not_subscribed_txt" msgid="9107977008516882170">"Повикот не можеше да се заврши. Код за грешка: 50."</string>
+ <string name="clh_callFailed_incoming_calls_barred_within_the_CUG_txt" msgid="501037491908315591">"Повикот не можеше да се заврши. Код за грешка: 55."</string>
+ <string name="clh_callFailed_bearer_capability_not_authorized_txt" msgid="4344366517528362620">"Повикот не можеше да се заврши. Код за грешка: 57."</string>
+ <string name="clh_callFailed_bearer_capability_not_presently_available_txt" msgid="1436957294571545381">"Повикот не можеше да се заврши. Код за грешка: 58."</string>
+ <string name="clh_callFailed_service_or_option_not_available_unspecified_txt" msgid="2149878874722675428">"Повикот не можеше да се заврши. Код за грешка: 63."</string>
+ <string name="clh_callFailed_bearer_service_not_implemented_txt" msgid="1074983013965612410">"Повикот не можеше да се заврши. Код за грешка: 65."</string>
+ <string name="clh_callFailed_ACM_equal_to_or_greater_than_ACMmax_txt" msgid="7889034195264205333">"Повикот не можеше да се заврши. Код за грешка: 68."</string>
+ <string name="clh_callFailed_requested_facility_not_implemented_txt" msgid="7996646684699167978">"Повикот не можеше да се заврши. Код за грешка: 69."</string>
+ <string name="clh_callFailed_only_restricted_digital_information_bearer_capability_is_available_txt" msgid="2358958110447385682">"Повикот не можеше да се заврши. Код за грешка: 70."</string>
+ <string name="clh_callFailed_service_or_option_not_implemented_unspecified_txt" msgid="3046428509531159481">"Повикот не можеше да се заврши. Код за грешка: 79."</string>
+ <string name="clh_callFailed_invalid_transaction_identifier_value_txt" msgid="1727401871777396619">"Повикот не можеше да се заврши. Код за грешка: 81."</string>
+ <string name="clh_callFailed_user_not_member_of_CUG_txt" msgid="442282135105229307">"Повикот не можеше да се заврши. Код за грешка: 87."</string>
+ <string name="clh_callFailed_incompatible_destination_txt" msgid="5900394706344969020">"Повикот не можеше да се заврши. Код за грешка: 88."</string>
+ <string name="clh_callFailed_invalid_transit_network_selection_txt" msgid="6274621838349037741">"Повикот не можеше да се заврши. Код за грешка: 91."</string>
+ <string name="clh_callFailed_semantically_incorrect_message_txt" msgid="7000705190197981937">"Повикот не можеше да се заврши. Код за грешка: 95."</string>
+ <string name="clh_callFailed_invalid_mandatory_information_txt" msgid="3609204152671052123">"Повикот не можеше да се заврши. Код за грешка: 96."</string>
+ <string name="clh_callFailed_message_type_non_existent_or_not_implemented_txt" msgid="1552110431052032814">"Повикот не можеше да се заврши. Код за грешка: 97."</string>
+ <string name="clh_callFailed_message_type_not_compatible_with_protocol_state_txt" msgid="7717048934226300032">"Повикот не можеше да се заврши. Код за грешка: 98."</string>
+ <string name="clh_callFailed_information_element_non_existent_or_not_implemented_txt" msgid="8931396541061612169">"Повикот не можеше да се заврши. Код за грешка: 99."</string>
+ <string name="clh_callFailed_conditional_IE_error_txt" msgid="4630685477888727741">"Повикот не можеше да се заврши. Код за грешка: 100."</string>
+ <string name="clh_callFailed_message_not_compatible_with_protocol_state_txt" msgid="3014075977395922947">"Повикот не можеше да се заврши. Код за грешка: 101."</string>
+ <string name="clh_callFailed_recovery_on_timer_expiry_txt" msgid="5637581978978731672">"Повикот не можеше да се заврши. Код за грешка: 102."</string>
+ <string name="clh_callFailed_protocol_Error_unspecified_txt" msgid="9203320572562697755">"Повикот не можеше да се заврши. Код за грешка: 111."</string>
+ <string name="clh_callFailed_interworking_unspecified_txt" msgid="7969686413930847182">"Повикот не можеше да се заврши. Код за грешка: 127."</string>
<string name="labelCallBarring" msgid="4180377113052853173">"Забрана на повик"</string>
<string name="sum_call_barring_enabled" msgid="5184331188926370824">"Вклучено"</string>
<string name="sum_call_barring_disabled" msgid="5699448000600153096">"Исклучено"</string>
@@ -841,7 +837,7 @@
<string name="radio_info_ims_reg_status_registered" msgid="7095182114078864326">"Регистриран"</string>
<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_feature_status_unavailable" msgid="8930391136839759778">"Недостапен"</string>
<string name="radio_info_ims_reg_status" msgid="25582845222446390">"IMS-регистрација: <xliff:g id="STATUS">%1$s</xliff:g>\nКомуникација преку LTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nКомуникација преку Wi-Fi: <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>
@@ -898,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Освежи"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Префрли на DNS-проверка"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Информации/Поставки карактеристични за ОЕМ"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Достапно за EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Ограничено на DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Достапно за NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Состојба на NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Фреквенција на NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Поставете режим на појас на радио"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Се вчитува список на појаси…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Постави"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 8ab18ac..1d65c97 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -95,11 +95,11 @@
<string name="sum_loading_settings" msgid="434063780286688775">"ക്രമീകരണങ്ങൾ ലോഡുചെയ്യുന്നു…"</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"ഔട്ട്ഗോയിംഗ് കോളുകളിൽ നമ്പർ മറച്ചിരിക്കുന്നു"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"ഔട്ട്ഗോയിംഗ് കോളുകളിൽ നമ്പർ ദൃശ്യമാക്കിയിരിക്കുന്നു"</string>
- <string name="sum_default_caller_id" msgid="1767070797135682959">"ഔട്ട്ഗോയിംഗ് കോളുകളിൽ എന്റെ നമ്പർ കാണിക്കാൻ ഡിഫോൾട്ട് ഓപ്പറേറ്റർ ക്രമീകരണങ്ങൾ ഉപയോഗിക്കുക"</string>
+ <string name="sum_default_caller_id" msgid="1767070797135682959">"ഔട്ട്ഗോയിംഗ് കോളുകളിൽ എന്റെ നമ്പർ ദൃശ്യമാക്കാൻ സ്ഥിര ഓപ്പറേറ്റർ ക്രമീകരണങ്ങൾ ഉപയോഗിക്കുക"</string>
<string name="labelCW" msgid="8449327023861428622">"കോൾ വെയ്റ്റിംഗ്"</string>
<string name="sum_cw_enabled" msgid="3977308526187139996">"ഒരു കോളിനിടയിൽ, ഇൻകമിംഗ് കോളുകളെക്കുറിച്ച് എന്നെ അറിയിക്കുക"</string>
<string name="sum_cw_disabled" msgid="3658094589461768637">"ഒരു കോളിനിടയിൽ, ഇൻകമിംഗ് കോളുകളെക്കുറിച്ച് എന്നെ അറിയിക്കുക"</string>
- <string name="call_forwarding_settings" msgid="8937130467468257671">"കോൾ ഫോർവേഡിംഗ് ക്രമീകരണം"</string>
+ <string name="call_forwarding_settings" msgid="8937130467468257671">"കോൾഫോർവേഡിംഗ് ക്രമീകരണം"</string>
<string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"കോൾഫോർവേഡിംഗ് ക്രമീകരണം (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"കോൾ ഫോർവേഡിംഗ്"</string>
<string name="labelCFU" msgid="8870170873036279706">"എല്ലായ്പ്പോഴും കൈമാറുക"</string>
@@ -127,8 +127,8 @@
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"അഡ്മിൻ ഉപയോക്താവിന് മാത്രമേ കോൾ ക്രമീകരണം മാറ്റാൻ കഴിയൂ."</string>
<string name="call_settings_with_label" msgid="8460230435361579511">"ക്രമീകരണം (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"കോൾ ക്രമീകരണ പിശക്"</string>
- <string name="reading_settings" msgid="1605904432450871183">"ക്രമീകരണങ്ങൾ റീഡ് ചെയ്യുന്നു.…"</string>
- <string name="updating_settings" msgid="3650396734816028808">"ക്രമീകരണങ്ങൾ അപ്ഡേറ്റ് ചെയ്യുന്നു…"</string>
+ <string name="reading_settings" msgid="1605904432450871183">"ക്രമീകരണങ്ങൾ റീഡുചെയ്യുന്നു.…"</string>
+ <string name="updating_settings" msgid="3650396734816028808">"ക്രമീകരണങ്ങൾ അപ്ഡേറ്റുചെയ്യുന്നു…"</string>
<string name="reverting_settings" msgid="7378668837291012205">"ക്രമീകരണങ്ങൾ പഴയപടിയാക്കുന്നു…"</string>
<string name="response_error" msgid="3904481964024543330">"നെറ്റ്വർക്കിൽ നിന്നുള്ള അപ്രതീക്ഷിത പ്രതികരണം."</string>
<string name="exception_error" msgid="330994460090467">"നെറ്റ്വർക്ക് അല്ലെങ്കിൽ സിം കാർഡ് പിശക്."</string>
@@ -522,7 +522,7 @@
<string name="notification_voicemail_no_vm_number" msgid="3423686009815186750">"വോയ്സ്മെയിൽ നമ്പർ അജ്ഞാതമാണ്"</string>
<string name="notification_network_selection_title" msgid="255595526707809121">"സേവനമില്ല"</string>
<string name="notification_network_selection_text" msgid="553288408722427659">"തിരഞ്ഞെടുത്ത നെറ്റ്വർക്ക് (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ലഭ്യമല്ല"</string>
- <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"ഒരു കോൾ വിളിക്കാൻ മൊബൈൽ നെറ്റ്വർക്ക് ഓണാക്കുകയോ ഫ്ലൈറ്റ് മോഡ് അല്ലെങ്കിൽ ബാറ്ററി ലാഭിക്കൽ മോഡ് ഓഫാക്കുകയോ ചെയ്യുക."</string>
+ <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"ഒരു കോൾ വിളിക്കാൻ മൊബൈൽ നെറ്റ്വർക്ക് ഓണാക്കുകയോ ഫ്ലൈറ്റ് മോഡ് അല്ലെങ്കിൽ ബാറ്ററി സേവർ മോഡ് ഓഫാക്കുകയോ ചെയ്യുക."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"ഒരു കോൾ വിളിക്കാൻ വിമാന മോഡ് ഓഫാക്കുക."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"ഒരു കോൾ വിളിക്കാൻ വിമാന മോഡ് ഓഫാക്കുക അല്ലെങ്കിൽ വയർലെസ്സ് നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യുക."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"അടിയന്തിരമല്ലാത്ത കോൾ ചെയ്യാൻ അടിയന്തിര കോൾബാക്ക് മോഡിൽ നിന്ന് പുറത്തുകടക്കുക."</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"വേണം"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"വേണ്ട"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"നിരസിക്കുക"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ഫോൺ അടിയന്തര കോൾബാക്ക് മോഡിലാണ്"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> വരെ"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">ഫോൺ <xliff:g id="COUNT_1">%s</xliff:g> മിനിറ്റ്, അടിയന്തര കോൾബാക്ക് മോഡിലായിരിക്കും.\nനിങ്ങൾക്ക് ഇപ്പോൾ പുറത്ത് കടക്കണോ?</item>
- <item quantity="one">ഫോൺ <xliff:g id="COUNT_0">%s</xliff:g> മിനിറ്റ്, അടിയന്തര കോൾബാക്ക് മോഡിലായിരിക്കും.\nനിങ്ങൾക്ക് ഇപ്പോൾ പുറത്ത് കടക്കണോ?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"സേവനം"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"സജ്ജമാക്കുക"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<സജ്ജീകരിച്ചിട്ടില്ല>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"പുതുക്കിയെടുക്കുക"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS പരിശോധന മാറ്റുക"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-നിർദ്ദിഷ്ട വിവരം/ക്രമീകരണം"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC ലഭ്യം:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR നിയന്ത്രിച്ചിരിക്കുന്നു:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR ലഭ്യം:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR നില:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR ഫ്രീക്വൻസി:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"റേഡിയോ ബാൻഡ് മോഡ് സജ്ജീകരിക്കുക"</string>
<string name="band_mode_loading" msgid="795923726636735967">"ബാൻഡ് ലിസ്റ്റ് ലോഡ് ചെയ്യുന്നു…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"സജ്ജീകരിക്കുക"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 124ab8a..09e6b64 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -31,7 +31,7 @@
<string name="ussdRunning" msgid="1163586813106772717">"USSD код ажиллаж байна…"</string>
<string name="mmiCancelled" msgid="5339191899200678272">"MMI код цуцлагдсан"</string>
<string name="cancel" msgid="8984206397635155197">"Цуцлах"</string>
- <string name="enter_input" msgid="6193628663039958990">"USSD мессежийн үсгийн тоо <xliff:g id="MIN_LEN">%1$d</xliff:g> болон <xliff:g id="MAX_LEN">%2$d</xliff:g> хооронд байх шаардлагатай. Дахин оролдоно уу."</string>
+ <string name="enter_input" msgid="6193628663039958990">"USSD зурвасын үсгийн тоо <xliff:g id="MIN_LEN">%1$d</xliff:g> болон <xliff:g id="MAX_LEN">%2$d</xliff:g> хооронд байх шаардлагатай. Дахин оролдоно уу."</string>
<string name="manageConferenceLabel" msgid="8415044818156353233">"Хурлын дуудлага удирдах"</string>
<string name="ok" msgid="7818974223666140165">"OK"</string>
<string name="audio_mode_speaker" msgid="243689733219312360">"Чанга яригч"</string>
@@ -62,7 +62,7 @@
<string name="labelCdmaMore_with_label" msgid="7759692829160238152">"CDMA дуудлагын тохиргоо (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="apn_settings" msgid="1978652203074756623">"Хандалтын Цэгийн Нэрс"</string>
<string name="settings_label" msgid="9101778088412567956">"Сүлжээний тохиргоо"</string>
- <string name="phone_accounts" msgid="1216879437523774604">"Дуудлагын бүртгэлүүд"</string>
+ <string name="phone_accounts" msgid="1216879437523774604">"Дуудах бүртгэл"</string>
<string name="phone_accounts_make_calls_with" msgid="16747814788918145">"Дараахаар дуудлага хийх"</string>
<string name="phone_accounts_make_sip_calls_with" msgid="4691221006731847255">"Дараахаар SIP дуудлага хийх"</string>
<string name="phone_accounts_ask_every_time" msgid="6192347582666047168">"Эхлэж хандах"</string>
@@ -102,10 +102,10 @@
<string name="call_forwarding_settings" msgid="8937130467468257671">"Дуудлага шилжүүлэх тохиргоо"</string>
<string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"Дуудлага шилжүүлэх тохиргоонууд (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"Дуудлага дамжуулах"</string>
- <string name="labelCFU" msgid="8870170873036279706">"Байнга шилжүүлэх"</string>
+ <string name="labelCFU" msgid="8870170873036279706">"Байнга дамжуулах"</string>
<string name="messageCFU" msgid="1361806450979589744">"Байнга энэ дугаарыг ашиглах"</string>
<string name="sum_cfu_enabled_indicator" msgid="9030139213402432776">"Бүх дуудлагыг дамжуулж байна"</string>
- <string name="sum_cfu_enabled" msgid="5806923046528144526">"Бүх дуудлагыг <xliff:g id="PHONENUMBER">{0}</xliff:g> руу шилжүүлж байна"</string>
+ <string name="sum_cfu_enabled" msgid="5806923046528144526">"Бүх дуудлагыг <xliff:g id="PHONENUMBER">{0}</xliff:g> руу дамжуулж байна"</string>
<string name="sum_cfu_enabled_no_number" msgid="7287752761743377930">"Дугаар холбогдох боломжгүй"</string>
<string name="sum_cfu_disabled" msgid="5010617134210809853">"Идэвхгүй"</string>
<string name="labelCFB" msgid="615265213360512768">"Завгүй бол"</string>
@@ -163,7 +163,7 @@
<string name="vm_change_pin_error_mismatch" msgid="5364847280026257331">"Хуучин PIN таарахгүй байна."</string>
<string name="vm_change_pin_error_invalid" msgid="5230002671175580674">"Шинэ PIN-д буруу тэмдэгт агуулагдаж байна."</string>
<string name="vm_change_pin_error_system_error" msgid="9116483527909681791">"PIN-г өөрчлөх боломжгүй"</string>
- <string name="vvm_unsupported_message_format" msgid="4206402558577739713">"Дэмжигдээгүй мессежийн төрөл, сонсохын тулд <xliff:g id="NUMBER">%s</xliff:g> руу залгана уу."</string>
+ <string name="vvm_unsupported_message_format" msgid="4206402558577739713">"Дэмжигдээгүй зурвасын төрөл, сонсохын тулд <xliff:g id="NUMBER">%s</xliff:g> руу залгана уу."</string>
<string name="network_settings_title" msgid="7560807107123171541">"Мобайл сүлжээ"</string>
<string name="label_available" msgid="1316084116670821258">"Боломжтой сүлжээнүүд"</string>
<string name="load_networks_progress" msgid="4051433047717401683">"Хайж байна..."</string>
@@ -425,7 +425,7 @@
<string name="cdma_activate_device" msgid="5914720276140097632">"Төхөөрөмжийг идэвхжүүлэх"</string>
<string name="cdma_lte_data_service" msgid="359786441782404562">"Дата үйлчилгээний тохиргоо"</string>
<string name="carrier_settings_title" msgid="6292869148169850220">"Операторын тохиргоо"</string>
- <string name="fdn" msgid="2545904344666098749">"Тогтсон залгах дугаарууд"</string>
+ <string name="fdn" msgid="2545904344666098749">"Тогтсон Залгах Дугаарууд"</string>
<string name="fdn_with_label" msgid="6412087553365709494">"Тогтсон Дуудлагын Дугаарууд(<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="manage_fdn_list" msgid="3341716430375195441">"FDN жагсаалт"</string>
<string name="fdn_list_with_label" msgid="1409655283510382556">"FDN жагсаалт (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -531,7 +531,7 @@
<string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Мобайл сүлжээнд холбогдох боломжгүй байна. Дуудлага хийхийн тулд утасгүй интернетэд холбогдоно уу."</string>
<string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Дуудлага хийхийн тулд хүчин төгөлдөр дугаар оруулна уу."</string>
<string name="incall_error_call_failed" msgid="393508653582682539">"Дуудлага амжилтгүй болсон."</string>
- <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Дуудлагыг энэ удаад нэмэх боломжгүй. Та мессеж илгээн холбоо тогтоохыг оролдох боломжтой."</string>
+ <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Дуудлагыг энэ удаад нэмэх боломжгүй. Та зурвас илгээн холбоо тогтоохыг оролдох боломжтой."</string>
<string name="incall_error_supp_service_unknown" msgid="8751177117194592623">"Үйлчилгээг дэмждэггүй байна"</string>
<string name="incall_error_supp_service_switch" msgid="5272822448189448479">"Дуудлагыг солих боломжгүй байна."</string>
<string name="incall_error_supp_service_resume" msgid="1276861499306817035">"Дуудлагыг үргэлжлүүлэх боломжгүй."</string>
@@ -562,7 +562,7 @@
<string name="fire_type_description" msgid="6565200468934914930">"Гал"</string>
<string name="description_concat_format" msgid="2014471565101724088">"%1$s, %2$s"</string>
<string name="dialerKeyboardHintText" msgid="1115266533703764049">"Залгахдаа гар ашиглах"</string>
- <string name="onscreenHoldText" msgid="4025348842151665191">"Хүлээлгэх"</string>
+ <string name="onscreenHoldText" msgid="4025348842151665191">"Саатуулах"</string>
<string name="onscreenEndCallText" msgid="6138725377654842757">"Дуусгах"</string>
<string name="onscreenShowDialpadText" msgid="658465753816164079">"Диалпад"</string>
<string name="onscreenMuteText" msgid="5470306116733843621">"Дууг хаах"</string>
@@ -582,8 +582,8 @@
<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_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="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">
<item msgid="3238070884803849303">"TTY Унтраасан"</item>
@@ -597,14 +597,14 @@
<item msgid="2271798469250155310">"Энгийн"</item>
<item msgid="6044210222666533564">"Урт"</item>
</string-array>
- <string name="network_info_message" msgid="7599413947016532355">"Сүлжээний мессеж"</string>
- <string name="network_error_message" msgid="4271579424089326618">"Алдаатай мессеж"</string>
+ <string name="network_info_message" msgid="7599413947016532355">"Сүлжээний зурвас"</string>
+ <string name="network_error_message" msgid="4271579424089326618">"Алдаатай зурвас"</string>
<string name="ota_title_activate" msgid="4049645324841263423">"Утсаа идэвхжүүлнэ үү"</string>
<string name="ota_touch_activate" msgid="838764494319694754">"Таны утасны үйлчилгээ идэвхжүүлэхийн тулд тусгай дуудлага хийх шаардлагатай. \n\n“Идэвхжүүлэх” гэснийг дарсны дараа өгч байгаа зааврыг сонсон утсаа идэвхжүүлнэ үү."</string>
<string name="ota_hfa_activation_title" msgid="3300556778212729671">"Идэвхжүүлж байна..."</string>
<string name="ota_hfa_activation_dialog_message" msgid="7921718445773342996">"Утас таны мобайл дата үйлчилгээг идэвхжүүлж байна.\n\nҮүнд 5 хүртэл минут орж болно."</string>
<string name="ota_skip_activation_dialog_title" msgid="7666611236789203797">"Идэвхжүүлэхийг алгасах уу?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Хэрэв та идэвхжүүлэхийг алгасвал дуудлага хийх буюу мобайль дата сүлжээнд холбогдох (хэдийгээр Wi-Fi сүлжээнд холбогдож болох ч) боломжгүй болно. Таныг утсаа идэвхжүүлэх хүртэл утсаа асаах бүрд идэвхжүүлэхийг хүсэх болно."</string>
+ <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Хэрэв та идэвхжүүлэхийг алгасвал дуудлага хийх буюу мобайль дата сүлжээнд холбогдох (хэдийгээр Wi-Fi сүлжээнд холбогдож болох ч) боломжгүй болно. Таныг утсаа идэвхжүүлэх хүртэл утсаа асаах бүрт идэвхжүүлэхийг хүсэх болно."</string>
<string name="ota_skip_activation_dialog_skip_label" msgid="5908029466817825633">"Алгасах"</string>
<string name="ota_activate" msgid="7939695753665438357">"Идэвхжүүлэх"</string>
<string name="ota_title_activate_success" msgid="1272135024761004889">"Утсыг идэвхжүүллээ."</string>
@@ -625,8 +625,8 @@
<string name="phone_in_ecm_call_notification_text" msgid="653972232922670335">"Дата холболтыг идэвхгүйжүүлсэн"</string>
<string name="phone_in_ecm_notification_complete_time" msgid="7341624337163082759">"<xliff:g id="COMPLETETIME">%s</xliff:g> болтол дата холболт байхгүй"</string>
<plurals name="alert_dialog_exit_ecm" formatted="false" msgid="5425906903766466743">
- <item quantity="other">Таны гар утас яаралтай түргэн тусламжийн дуудлагын хэлбэрт<xliff:g id="COUNT_1">%s</xliff:g> минут байна. Энэ горимд байгаа тохиолдолд интернет холболт ашигладаг ямар ч программыг ашиглаж үл болно. Та гарахыг хүсэж байна уу?</item>
- <item quantity="one">Таны гар утас яаралтай түргэн тусламжийн дуудлагын хэлбэрт <xliff:g id="COUNT_0">%s</xliff:g> минут байна. Энэ горимд байгаа тохиолдолд интернет холболт ашигладаг ямар ч программыг ашиглаж үл болно. Та гарахыг хүсэж байна уу?</item>
+ <item quantity="other">Таны гар утас яаралтай түргэн тусламжийн дуудлагын хэлбэрт<xliff:g id="COUNT_1">%s</xliff:g> минут байна. Энэ горимд байгаа тохиолдолд интернет холболт ашигладаг ямар ч програмыг ашиглаж үл болно. Та гарахыг хүсэж байна уу?</item>
+ <item quantity="one">Таны гар утас яаралтай түргэн тусламжийн дуудлагын хэлбэрт <xliff:g id="COUNT_0">%s</xliff:g> минут байна. Энэ горимд байгаа тохиолдолд интернет холболт ашигладаг ямар ч програмыг ашиглаж үл болно. Та гарахыг хүсэж байна уу?</item>
</plurals>
<plurals name="alert_dialog_not_avaialble_in_ecm" formatted="false" msgid="1152682528741457004">
<item quantity="other">Сонгосон үйлдлийг яаралтай түргэн тусламжийн горимд байгаа үед ашиглах боломжгүй. Таны гар утас энэ горимд <xliff:g id="COUNT_1">%s</xliff:g> минут байх болно. Та гарахыг хүсэж байна уу?</item>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Тийм"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Үгүй"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Алгасах"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Утас яаралтай буцаж холбоо барих горимд байна"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> хүртэл"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Утас <xliff:g id="COUNT_1">%s</xliff:g> минутын турш яаралтай буцаж холбоо барих горимд байх болно.\nТа одоо гарахыг хүсэж байна уу?</item>
- <item quantity="one">Утас <xliff:g id="COUNT_0">%s</xliff:g> минутын турш яаралтай буцаж холбоо барих горимд байх болно.\nТа одоо гарахыг хүсэж байна уу?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Үйлчилгээ"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Тохиргоо"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Тохируулаагүй>"</string>
@@ -655,7 +649,7 @@
<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>
- <string name="voicemail_visual_voicemail_switch_title" msgid="6610414098912832120">"Визуал дуут шуудан"</string>
+ <string name="voicemail_visual_voicemail_switch_title" msgid="6610414098912832120">"Уншиж болохуйц дуут шуудан"</string>
<string name="voicemail_set_pin_dialog_title" msgid="7005128605986960003">"PIN тохируулах"</string>
<string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"PIN өөрчлөх"</string>
<string name="preference_category_ringtone" msgid="8787281191375434976">"Хонхны ая & Чичиргээ"</string>
@@ -671,7 +665,7 @@
<string name="status_hint_label_incoming_wifi_call" msgid="2606052595898044071">"Wi-Fi дуудлага"</string>
<string name="status_hint_label_wifi_call" msgid="942993035689809853">"Wi-Fi дуудлага"</string>
<string name="emergency_action_launch_hint" msgid="2762016865340891314">"Нээхийн тулд дахин дарна уу"</string>
- <string name="message_decode_error" msgid="1061856591500290887">"Мессежийн кодыг тайлах явцад алдаа гарсан."</string>
+ <string name="message_decode_error" msgid="1061856591500290887">"Зурвасын кодыг тайлах явцад алдаа гарсан."</string>
<string name="callFailed_cdma_activation" msgid="5392057031552253550">"SIM карт таны үйлчилгээг идэвхжүүлж, утасны роаминг багтаамжийг шинэчиллээ."</string>
<string name="callFailed_cdma_call_limit" msgid="1074219746093031412">"Хэт олон идэвхтэй дуудлага байна. Шинэ дуудлага хийхийн өмнө одоогийн дуудлагуудыг таслах буюу нэгтгэнэ үү."</string>
<string name="callFailed_imei_not_accepted" msgid="7257903653685147251">"Холбох боломжгүй, хүчинтэй SIM карт оруулна уу."</string>
@@ -866,7 +860,7 @@
<string name="radio_info_subid" msgid="6839966868621703203">"Одоогийн subId:"</string>
<string name="radio_info_dds" msgid="1122593144425697126">"Өгөгдмөл дата SIM-н SubId:"</string>
<string name="radio_info_dl_kbps" msgid="2382922659525318726">"DLзурвасын өргөн (kbps):"</string>
- <string name="radio_info_ul_kbps" msgid="2102225400904799036">"UL Мессежийн өргөн (kbps):"</string>
+ <string name="radio_info_ul_kbps" msgid="2102225400904799036">"UL Зурвасын өргөн (kbps):"</string>
<string name="radio_info_signal_location_label" msgid="6188435197086550049">"Үүрэн байршлын мэдээлэл (цуцалсан):"</string>
<string name="radio_info_phy_chan_config" msgid="1277949603275436081">"LTE Сувгийн бодит тохиргоо:"</string>
<string name="radio_info_cell_info_refresh_rate" msgid="670511448975997340">"Үүрэн мэдээлэл сэргээх тариф:"</string>
@@ -882,9 +876,9 @@
<string name="radio_info_signal_strength_label" msgid="5545444702102543260">"Дохионы хүч:"</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_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_band_mode_label" msgid="23480556225515290">"Радио зурвасыг сонгох"</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>
@@ -898,13 +892,8 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Сэргээх"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS шалгалтыг унтраах/асаах"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-тодорхой Мэдээлэл/Тохиргоо"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC боломжтой:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR хязгаарласан:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR боломжтой:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR төлөв:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR давтамж:"</string>
- <string name="band_mode_title" msgid="7988822920724576842">"Радио мессежийн горимыг тохируулах"</string>
- <string name="band_mode_loading" msgid="795923726636735967">"Мессежийн жагсаалтыг ачаалж байна…"</string>
+ <string name="band_mode_title" msgid="7988822920724576842">"Радио зурвасын горимыг тохируулах"</string>
+ <string name="band_mode_loading" msgid="795923726636735967">"Зурвасын жагсаалтыг ачаалж байна…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Тохируулах"</string>
<string name="band_mode_failed" msgid="1707488541847192924">"Амжилтгүй"</string>
<string name="band_mode_succeeded" msgid="2230018000534761063">"Амжилттай"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 4617df3..210395c 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/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="1916019789885839910">"मोबाइल डेटा"</string>
+ <string name="phoneAppLabel" product="tablet" msgid="1916019789885839910">"मोबाईल डेटा"</string>
<string name="phoneAppLabel" product="default" msgid="130465039375347763">"फोन सेवा"</string>
<string name="emergencyDialerIconLabel" msgid="8668005772339436680">"आणीबाणी डायलर"</string>
<string name="phoneIconLabel" msgid="3015941229249651419">"फोन"</string>
@@ -28,16 +28,16 @@
<string name="carrier_mmi_msg_title" msgid="6050165242447507034">"<xliff:g id="MMICARRIER">%s</xliff:g> मेसेज"</string>
<string name="default_carrier_mmi_msg_title" msgid="7754317179938537213">"वाहक मेसेज"</string>
<string name="mmiStarted" msgid="9212975136944568623">"MMI कोड प्रारंभ केला"</string>
- <string name="ussdRunning" msgid="1163586813106772717">"USSD कोड सुरू…"</string>
+ <string name="ussdRunning" msgid="1163586813106772717">"USSD कोड चालू…"</string>
<string name="mmiCancelled" msgid="5339191899200678272">"MMI कोड रद्द केला"</string>
<string name="cancel" msgid="8984206397635155197">"रद्द करा"</string>
<string name="enter_input" msgid="6193628663039958990">"USSD मेसेज <xliff:g id="MIN_LEN">%1$d</xliff:g> आणि <xliff:g id="MAX_LEN">%2$d</xliff:g> वर्णांमधील असणे आवश्यक आहे. कृपया पुन्हा प्रयत्न करा."</string>
- <string name="manageConferenceLabel" msgid="8415044818156353233">"कॉंफरन्स कॉल व्यवस्थापित करा"</string>
+ <string name="manageConferenceLabel" msgid="8415044818156353233">"कॉन्फरन्स कॉल व्यवस्थापित करा"</string>
<string name="ok" msgid="7818974223666140165">"ठीक"</string>
<string name="audio_mode_speaker" msgid="243689733219312360">"स्पीकर"</string>
<string name="audio_mode_earpiece" msgid="2823700267171134282">"हँडसेट इअरपीस"</string>
<string name="audio_mode_wired_headset" msgid="5028010823105817443">"वायर्ड हेडसेट"</string>
- <string name="audio_mode_bluetooth" msgid="25732183428018809">"ब्लूटूथ"</string>
+ <string name="audio_mode_bluetooth" msgid="25732183428018809">"ब्लूटुथ"</string>
<string name="wait_prompt_str" msgid="5136209532150094910">"खालील टोन पाठवायचे?\n"</string>
<string name="pause_prompt_str" msgid="2308897950360272213">"टोन पाठवित आहे\n"</string>
<string name="send_button" msgid="5070379600779031932">"पाठवा"</string>
@@ -55,7 +55,7 @@
<string name="requesting_unlock" msgid="930512210309437741">"नेटवर्क अनलॉकची विनंती करत आहे..."</string>
<string name="unlock_failed" msgid="7103543844840661366">"नेटवर्क अनलॉक विनंती अयशस्वी."</string>
<string name="unlock_success" msgid="32681089371067565">"नेटवर्क अनलॉक यशस्वी."</string>
- <string name="mobile_network_settings_not_available" msgid="8678168497517090039">"या वापरकर्त्यासाठी मोबाइल नेटवर्क सेटिंग्ज उपलब्ध नाहीत"</string>
+ <string name="mobile_network_settings_not_available" msgid="8678168497517090039">"या वापरकर्त्यासाठी मोबाईल नेटवर्क सेटिंग्ज उपलब्ध नाहीत"</string>
<string name="labelGSMMore" msgid="7354182269461281543">"GSM कॉल सेटिंग्ज"</string>
<string name="labelGsmMore_with_label" msgid="3206015314393246224">"GSM कॉल सेटिंग्ज (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCDMAMore" msgid="7937441382611224632">"CDMA कॉल सेटिंग्ज"</string>
@@ -105,7 +105,7 @@
<string name="labelCFU" msgid="8870170873036279706">"नेहमी फॉरवर्ड करा"</string>
<string name="messageCFU" msgid="1361806450979589744">"नेहमी हा नंबर वापरा"</string>
<string name="sum_cfu_enabled_indicator" msgid="9030139213402432776">"सर्व कॉल अग्रेषित करत आहे"</string>
- <string name="sum_cfu_enabled" msgid="5806923046528144526">"सर्व कॉल <xliff:g id="PHONENUMBER">{0}</xliff:g> वर फॉरवर्ड करत आहे"</string>
+ <string name="sum_cfu_enabled" msgid="5806923046528144526">"सर्व कॉल <xliff:g id="PHONENUMBER">{0}</xliff:g> वर अग्रेषित करत आहे"</string>
<string name="sum_cfu_enabled_no_number" msgid="7287752761743377930">"नंबर अनुपलब्ध आहे"</string>
<string name="sum_cfu_disabled" msgid="5010617134210809853">"बंद"</string>
<string name="labelCFB" msgid="615265213360512768">"व्यस्त असताना"</string>
@@ -136,10 +136,10 @@
<string name="stk_cc_ss_to_ussd_error" msgid="8330749347425752192">"SS विनंती USSD विनंतीवर बदलली"</string>
<string name="stk_cc_ss_to_ss_error" msgid="8297155544652134278">"नवीन SS विनंतीवर बदलली"</string>
<string name="stk_cc_ss_to_dial_video_error" msgid="4255261231466032505">"SS विनंती व्हिडिओ कॉलवर बदलली"</string>
- <string name="fdn_check_failure" msgid="1833769746374185247">"आपल्या फोन अॅप्सचे निश्चित डायलिंग नंबर सेटिंग सुरू केले. परिणामी, काही कॉल संबंधित वैशिष्ट्ये कार्य करीत नाहीत."</string>
- <string name="radio_off_error" msgid="8321564164914232181">"या सेटिंग्ज पाहण्यापूर्वी रेडिओ सुरू करा."</string>
+ <string name="fdn_check_failure" msgid="1833769746374185247">"आपल्या फोन अॅप्सचे निश्चित डायलिंग नंबर सेटिंग चालू केले. परिणामी, काही कॉल संबंधित वैशिष्ट्ये कार्य करीत नाहीत."</string>
+ <string name="radio_off_error" msgid="8321564164914232181">"या सेटिंग्ज पाहण्यापूर्वी रेडिओ चालू करा."</string>
<string name="close_dialog" msgid="1074977476136119408">"ठीक"</string>
- <string name="enable" msgid="2636552299455477603">"सुरू करा"</string>
+ <string name="enable" msgid="2636552299455477603">"चालू करा"</string>
<string name="disable" msgid="1122698860799462116">"बंद करा"</string>
<string name="change_num" msgid="6982164494063109334">"अपडेट करा"</string>
<string-array name="clir_display_values">
@@ -510,7 +510,7 @@
<string name="voicemail_settings_number_label" msgid="1265118640154688162">"व्हॉइसमेल नंबर"</string>
<string name="card_title_dialing" msgid="8742182654254431781">"डायल करत आहे"</string>
<string name="card_title_redialing" msgid="18130232613559964">"रीडायल करत आहे"</string>
- <string name="card_title_conf_call" msgid="901197309274457427">"कॉंफरन्स कॉल"</string>
+ <string name="card_title_conf_call" msgid="901197309274457427">"कॉन्फरन्स कॉल"</string>
<string name="card_title_incoming_call" msgid="881424648458792430">"येणारे कॉल"</string>
<string name="card_title_call_ended" msgid="650223980095026340">"कॉल संपला"</string>
<string name="card_title_on_hold" msgid="9028319436626975207">"होल्ड वर"</string>
@@ -522,7 +522,7 @@
<string name="notification_voicemail_no_vm_number" msgid="3423686009815186750">"व्हॉइसमेल नंबर अज्ञात"</string>
<string name="notification_network_selection_title" msgid="255595526707809121">"सेवा नाही"</string>
<string name="notification_network_selection_text" msgid="553288408722427659">"निवडलेले नेटवर्क<xliff:g id="OPERATOR_NAME">%s</xliff:g> उपलब्ध नाही"</string>
- <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"कॉल करण्यासाठी मोबाइल नेटवर्क सुरू करा, विमान मोड बंद करा किंवा बॅटरी बचकर्ता मोड बंद करा."</string>
+ <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"कॉल करण्यासाठी मोबाइल नेटवर्क चालू करा, विमान मोड बंद करा किंवा बॅटरी बचकर्ता मोड बंद करा."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"कॉल करण्यासाठी विमान मोड बंद करा."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"कॉल करण्यासाठी विमान मोड बंद करा किंवा वायरलेस नेटवर्कशी कनेक्ट करा."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"आणीबाणी नसलेला कॉल करण्यासाठी आणीबाणी कॉलबॅक मोडमधून बाहेर पडा."</string>
@@ -540,7 +540,7 @@
<string name="incall_error_supp_service_conference" msgid="27578082433544702">"कॉल विलीन करता आले नाहीत."</string>
<string name="incall_error_supp_service_reject" msgid="3044363092441655912">"कॉल नाकारू शकत नाही."</string>
<string name="incall_error_supp_service_hangup" msgid="836524952243836735">"कॉल रिलीज करू शकत नाही."</string>
- <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"कॉल सुरू ठेवू शकत नाही."</string>
+ <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"कॉल सुरु ठेवू शकत नाही."</string>
<string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"कॉल करण्यासाठी वायरलेस नेटवर्कशी कनेक्ट करा."</string>
<string name="incall_error_promote_wfc" msgid="9164896813931363415">"कॉल करण्यासाठी वाय-फाय कॉलिंग सक्षम करा."</string>
<string name="emergency_information_hint" msgid="9208897544917793012">"अतिमहत्त्वाची माहिती"</string>
@@ -550,7 +550,7 @@
<string name="single_emergency_number_title" msgid="8413371079579067196">"आणीबाणी नंबर"</string>
<string name="numerous_emergency_numbers_title" msgid="8972398932506755510">"आणीबाणी नंबर"</string>
<string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"<xliff:g id="EMERGENCY_NUMBER">%s</xliff:g> ला कॉल करण्यासाठी पुन्हा टॅप करा"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"रेडिओ सुरू करत आहे..."</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"रेडिओ चालू करत आहे..."</string>
<string name="emergency_enable_radio_dialog_retry" msgid="4329131876852608587">"सेवा नाही. पुन्हा प्रयत्न करत आहे…"</string>
<string name="radio_off_during_emergency_call" msgid="8011154134040481609">"आणीबाणी कॉलदरम्यान विमान मोडमध्ये प्रवेश करू शकत नाही."</string>
<string name="dial_emergency_error" msgid="825822413209026039">"कॉल करू शकत नाही. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> हा आणीबाणी नंबर नाहीये."</string>
@@ -565,7 +565,7 @@
<string name="onscreenHoldText" msgid="4025348842151665191">"होल्ड करा"</string>
<string name="onscreenEndCallText" msgid="6138725377654842757">"शेवट"</string>
<string name="onscreenShowDialpadText" msgid="658465753816164079">"डायलपॅड"</string>
- <string name="onscreenMuteText" msgid="5470306116733843621">"म्यूट करा"</string>
+ <string name="onscreenMuteText" msgid="5470306116733843621">"नि:शब्द करा"</string>
<string name="onscreenAddCallText" msgid="9075675082903611677">"कॉल जोडा"</string>
<string name="onscreenMergeCallsText" msgid="3692389519611225407">"कॉल विलीन करा"</string>
<string name="onscreenSwapCallsText" msgid="2682542150803377991">"अदलाबदल करा"</string>
@@ -580,7 +580,7 @@
<string name="singleContactImportedMsg" msgid="3619804066300998934">"इंपोर्ट केलेला संपर्क"</string>
<string name="failedToImportSingleContactMsg" msgid="228095510489830266">"संपर्क इंपोर्ट करण्यात अयशस्वी"</string>
<string name="hac_mode_title" msgid="4127986689621125468">"श्रवणयंत्रे"</string>
- <string name="hac_mode_summary" msgid="7774989500136009881">"श्रवणयंत्र कंपॅटिबिलिटी सुरू करा"</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_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/> - RTT cकॉल मेसेज प्रतिलेख म्हणून सेव्ह केले आहेत\n <br/> - RTT व्हिडिओ कॉलसाठी उपलब्ध नाही"</string>
@@ -604,7 +604,7 @@
<string name="ota_hfa_activation_title" msgid="3300556778212729671">"सक्रिय करत आहे..."</string>
<string name="ota_hfa_activation_dialog_message" msgid="7921718445773342996">"फोन तुमची मोबाइल डेटा सेवा सक्रिय करत आहे.\n\nयास सुमारे 5 मिनिटे लागतील."</string>
<string name="ota_skip_activation_dialog_title" msgid="7666611236789203797">"सक्रिय करणे वगळायचे?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"तुम्ही सक्रिय करणे वगळल्यास, तुम्ही कॉल करू शकत नाही किंवा मोबाइल डेटा नेटवर्कशी कनेक्ट करू शकत नाही (तुम्ही वाय-फाय नेटवर्कशी कनेक्ट करू शकत असला तरीही). तुम्ही तुमचा फोन सक्रिय करेपर्यंत, तुम्ही तो प्रत्येक वेळी सुरू करताना आपल्याला तो सक्रिय करण्यास सांगितले जाईल."</string>
+ <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"तुम्ही सक्रिय करणे वगळल्यास, तुम्ही कॉल करू शकत नाही किंवा मोबाइल डेटा नेटवर्कशी कनेक्ट करू शकत नाही (तुम्ही वाय-फाय नेटवर्कशी कनेक्ट करू शकत असला तरीही). तुम्ही तुमचा फोन सक्रिय करेपर्यंत, तुम्ही तो प्रत्येक वेळी चालू करताना आपल्याला तो सक्रिय करण्यास सांगितले जाईल."</string>
<string name="ota_skip_activation_dialog_skip_label" msgid="5908029466817825633">"वगळा"</string>
<string name="ota_activate" msgid="7939695753665438357">"सक्रिय करा"</string>
<string name="ota_title_activate_success" msgid="1272135024761004889">"फोन सक्रिय केला आहे."</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"होय"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"नाही"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"डिसमिस करा"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"फोन आणीबाणी कॉलबॅक मोडमध्ये आहे"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> पर्यंत"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">फोन <xliff:g id="COUNT_1">%s</xliff:g> मिनिटे आणीबाणी कॉलबॅक मोडमध्ये राहील.\nतुम्हाला आता बाहेर पडायचे आहे का?</item>
- <item quantity="one">फोन <xliff:g id="COUNT_0">%s</xliff:g> मिनिट आणीबाणी कॉलबॅक मोडमध्ये राहील.\nतुम्हाला आता बाहेर पडायचे आहे का?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"सेवा"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"सेटअप"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<सेट नाही>"</string>
@@ -660,8 +654,8 @@
<string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"पिन बदला"</string>
<string name="preference_category_ringtone" msgid="8787281191375434976">"रिंगटोन आणि कंपन"</string>
<string name="pstn_connection_service_label" msgid="9200102709997537069">"अंगभूत सिम कार्डे"</string>
- <string name="enable_video_calling_title" msgid="7246600931634161830">"व्हिडिओ कॉलिंग सुरू करा"</string>
- <string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"व्हिडिओ कॉल करणे सुरू करण्यासाठी, आपल्याला नेटवर्क सेटिंग्ज मधील वर्धित 4G LTE मोड सक्षम करणे आवश्यक आहे."</string>
+ <string name="enable_video_calling_title" msgid="7246600931634161830">"व्हिडिओ कॉलिंग चालू करा"</string>
+ <string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"व्हिडिओ कॉल करणे चालू करण्यासाठी, आपल्याला नेटवर्क सेटिंग्ज मधील वर्धित 4G LTE मोड सक्षम करणे आवश्यक आहे."</string>
<string name="enable_video_calling_dialog_settings" msgid="8697890611305307110">"नेटवर्क सेटिंग्ज"</string>
<string name="enable_video_calling_dialog_close" msgid="4298929725917045270">"बंद करा"</string>
<string name="sim_label_emergency_calls" msgid="9078241989421522310">"आणीबाणी कॉल"</string>
@@ -685,7 +679,7 @@
<string name="change_pin_cancel_label" msgid="2301711566758827936">"रद्द करा"</string>
<string name="change_pin_ok_label" msgid="6861082678817785330">"ठीक आहे"</string>
<string name="change_pin_enter_old_pin_header" msgid="853151335217594829">"आपल्या जुन्या पिनची पुष्टी करा"</string>
- <string name="change_pin_enter_old_pin_hint" msgid="8801292976275169367">"सुरू ठेवण्यासाठी तुमचा व्हॉइसमेल पिन प्रविष्ट करा."</string>
+ <string name="change_pin_enter_old_pin_hint" msgid="8801292976275169367">"सुरु ठेवण्यासाठी तुमचा व्हॉइसमेल पिन प्रविष्ट करा."</string>
<string name="change_pin_enter_new_pin_header" msgid="4739465616733486118">"नवीन पिन सेट करा"</string>
<string name="change_pin_enter_new_pin_hint" msgid="2326038476516364210">"पिन <xliff:g id="MIN">%1$d</xliff:g>-<xliff:g id="MAX">%2$d</xliff:g> अंकी असणे आवश्यक आहे."</string>
<string name="change_pin_confirm_pin_header" msgid="2606303906320705726">"आपल्या पिनची पुष्टी करा"</string>
@@ -693,7 +687,7 @@
<string name="change_pin_succeeded" msgid="2504705600693014403">"व्हॉइसमेल पिन अपडेट केला"</string>
<string name="change_pin_system_error" msgid="7772788809875146873">"पिन सेट करण्यात अक्षम"</string>
<string name="mobile_data_status_roaming_turned_off_subtext" msgid="6840673347416227054">"डेटा रोमिंग बंद केलेले आहे"</string>
- <string name="mobile_data_status_roaming_turned_on_subtext" msgid="5615757897768777865">"डेटा रोमिंग सुरू केलेले आहे"</string>
+ <string name="mobile_data_status_roaming_turned_on_subtext" msgid="5615757897768777865">"डेटा रोमिंग चालू केलेले आहे"</string>
<string name="mobile_data_status_roaming_without_plan_subtext" msgid="6536671968072284677">"सध्या रोमिंग, डेटा योजना आवश्यक आहे"</string>
<string name="mobile_data_status_roaming_with_plan_subtext" msgid="2576177169108123095">"सध्या रोमिंग, डेटा योजना सक्रिय आहे"</string>
<string name="mobile_data_status_no_plan_subtext" msgid="170331026419263657">"मोबाइल डेटा शिल्लक नाही"</string>
@@ -707,7 +701,7 @@
<string name="mobile_data_activate_button" msgid="1139792516354374612">"डेटा जोडा"</string>
<string name="mobile_data_activate_cancel_button" msgid="3530174817572005860">"रद्द करा"</string>
<string name="clh_card_title_call_ended_txt" msgid="5977978317527299698">"कॉल संपला"</string>
- <string name="clh_callFailed_powerOff_txt" msgid="8279934912560765361">"विमान मोड सुरू आहे"</string>
+ <string name="clh_callFailed_powerOff_txt" msgid="8279934912560765361">"विमान मोड चालू आहे"</string>
<string name="clh_callFailed_simError_txt" msgid="5128538525762326413">"सिम कार्ड अॅक्सेस करू शकत नाही"</string>
<string name="clh_incall_error_out_of_service_txt" msgid="2736010617446749869">"मोबाइल नेटवर्क उपलब्ध नाही"</string>
<string name="clh_callFailed_unassigned_number_txt" msgid="141967660286695682">"तुम्ही डायल करायचा प्रयत्न करत असलेल्या फोन नंबरमध्ये समस्या आहे. एरर कोड 1."</string>
@@ -760,7 +754,7 @@
<string name="clh_callFailed_protocol_Error_unspecified_txt" msgid="9203320572562697755">"कॉल पूर्ण करता आला नाही. एरर कोड १११."</string>
<string name="clh_callFailed_interworking_unspecified_txt" msgid="7969686413930847182">"कॉल पूर्ण करता आला नाही. एरर कोड १२७."</string>
<string name="labelCallBarring" msgid="4180377113052853173">"कॉल बारिंग"</string>
- <string name="sum_call_barring_enabled" msgid="5184331188926370824">"सुरू"</string>
+ <string name="sum_call_barring_enabled" msgid="5184331188926370824">"चालू"</string>
<string name="sum_call_barring_disabled" msgid="5699448000600153096">"बंद"</string>
<string name="call_barring_baoc" msgid="7400892586336429326">"सर्व जाणारे"</string>
<string name="call_barring_baoc_enabled" msgid="3131509193386668182">"सर्व जाणारे कॉल ब्लॉक करणे बंद करायचे का?"</string>
@@ -868,7 +862,7 @@
<string name="radio_info_dl_kbps" msgid="2382922659525318726">"DL बँडविड्थ (kbps):"</string>
<string name="radio_info_ul_kbps" msgid="2102225400904799036">"UL बँडविड्थ (kbps):"</string>
<string name="radio_info_signal_location_label" msgid="6188435197086550049">"सेल स्थान माहिती (कालबाह्य झाली):"</string>
- <string name="radio_info_phy_chan_config" msgid="1277949603275436081">"LTE फिजिकल चॅनल कॉंफिगरेशन:"</string>
+ <string name="radio_info_phy_chan_config" msgid="1277949603275436081">"LTE फिजिकल चॅनेल कॉंफिगरेशन:"</string>
<string name="radio_info_cell_info_refresh_rate" msgid="670511448975997340">"सेल माहिती रिफ्रेश रेट:"</string>
<string name="radio_info_cellinfo_label" msgid="8199062974670377659">"सर्व सेल परिमाण माहिती:"</string>
<string name="radio_info_gprs_service_label" msgid="6819204246355412952">"डेटा सर्व्हिस:"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"रिफ्रेश करा"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS तपासणी टॉगल करा"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-विशिष्ट माहिती/सेटिंग्ज"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC उपलब्ध:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR प्रतिबंधित:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR उपलब्ध:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR स्थिती:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR वारंवारता:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"रेडिओ बँड मोड सेट करा"</string>
<string name="band_mode_loading" msgid="795923726636735967">"बँड सूची लोड करत आहे…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"सेट करा"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 145a6ab..a3fb35e 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -121,7 +121,7 @@
<string name="labelCFNRc" msgid="4163399350778066013">"Jika tidak dapat dihubungi"</string>
<string name="messageCFNRc" msgid="6980340731313007250">"Nombor apabila tidak dapat dihubungi"</string>
<string name="sum_cfnrc_enabled" msgid="1799069234006073477">"Memajukan ke <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
- <string name="sum_cfnrc_disabled" msgid="739289696796917683">"Dimatikan"</string>
+ <string name="sum_cfnrc_disabled" msgid="739289696796917683">"Mati"</string>
<string name="disable_cfnrc_forbidden" msgid="775348748084726890">"Pembawa anda tidak menyokong pelumpuhan pemajuan panggilan semasa telefon anda tidak boleh dihubungi."</string>
<string name="updating_title" msgid="6130548922615719689">"Tetapan panggilan"</string>
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"Tetapan panggilan hanya boleh diubah oleh pengguna pentadbir."</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ya"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Tidak"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Ketepikan"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefon dalam mod panggil balik kecemasan"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Hingga <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Telefon akan berada dalam mod panggil balik kecemasan selama <xliff:g id="COUNT_1">%s</xliff:g> minit.\nAdakah anda mahu keluar sekarang?</item>
- <item quantity="one">Telefon akan berada dalam mod panggil balik kecemasan selama <xliff:g id="COUNT_0">%s</xliff:g> minit.\nAdakah anda mahu keluar sekarang?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Perkhidmatan"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Persediaan"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Tidak ditetapkan>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Muat semula"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Togol Semakan DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Maklumat/Tetapan khusus OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC Tersedia:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR Terhad:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR Tersedia:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Keadaan NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frekuensi NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Tetapkan Mod Jalur Radio"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Memuatkan Senarai Jalur…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Tetapkan"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index ac21213..91391c7 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -24,7 +24,7 @@
<string name="unknown" msgid="8279698889921830815">"မသိပါ"</string>
<string name="private_num" msgid="4487990167889159992">"လျို့ဝှက် နံပါတ်"</string>
<string name="payphone" msgid="7936735771836716941">"ငွေပေးရသည့်ဖုန်း"</string>
- <string name="onHold" msgid="6132725550015899006">"ဖုန်းကိုင်ထားသည်"</string>
+ <string name="onHold" msgid="6132725550015899006">"ခဏ ကိုင်ထားစဉ်"</string>
<string name="carrier_mmi_msg_title" msgid="6050165242447507034">"<xliff:g id="MMICARRIER">%s</xliff:g> မက်ဆေ့ဂျ်"</string>
<string name="default_carrier_mmi_msg_title" msgid="7754317179938537213">"ဖုန်းလိုင်းဝန်ဆောင်မှု မက်ဆေ့ဂျ်"</string>
<string name="mmiStarted" msgid="9212975136944568623">"MMIကုတ်နံပါတ်ကို စတင်ပြီးပါပြီ"</string>
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"အကောင့် ချိန်ညှိချက်များ ပြုပြင်မည်"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"ခေါ်ဆိုနေသော အကောင့်များ အားလုံး"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"ဖုန်းခေါ်ဆိုနိုင်သည့် အကောင့်များအား ရွေးရန်"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi ခေါ်ဆိုခြင်း"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi ခေါ်ဆိုမှု"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"တပ်ဆင်ပြီး ချိတ်ဆက်ရေး ဝန်ဆောင်မှု"</string>
<string name="voicemail" msgid="7697769412804195032">"အသံမေးလ်"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"အသံမေးလ် ( <xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g> )"</string>
@@ -91,7 +91,7 @@
<string name="additional_cdma_call_settings" msgid="2178016561980611304">"ပိုမိုသော CDMA ခေါ်ဆိုမှု အပြင်အဆင်"</string>
<string name="sum_cdma_call_settings" msgid="3185825305136993636">"CDMA ခေါ်ဆိုမှုအတွက်သာ ဖြည့်စွက်အပြင်အဆင်"</string>
<string name="labelNwService" msgid="6015891883487125120">"ကွန်ရက် ဝန်ဆောင်မှု ဆက်တင်"</string>
- <string name="labelCallerId" msgid="2090540744550903172">"ခေါ်ဆိုသူ ID"</string>
+ <string name="labelCallerId" msgid="2090540744550903172">"ခေါ်ဆိုသူအိုင်ဒီ"</string>
<string name="sum_loading_settings" msgid="434063780286688775">"ဆက်တင်များကို ကြည့်ရှုရန် လုပ်နေပါသည်…"</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"အထွက်ဖုန်းများတွင် နံပါတ်ဖျောက်ထားပါ"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"အထွက်ဖုန်းများတွင် နံပါတ်မြင်ရသည်"</string>
@@ -105,7 +105,7 @@
<string name="labelCFU" msgid="8870170873036279706">"အမြဲတမ်း ထပ်ဆင့်ပို့ပါ"</string>
<string name="messageCFU" msgid="1361806450979589744">"ဤနံပါတ်ကို အမြဲသုံးပါ"</string>
<string name="sum_cfu_enabled_indicator" msgid="9030139213402432776">"ခေါ်ဆိုမှုအားလုံးအား တဆင့်ထပ်ပို့နေသည်"</string>
- <string name="sum_cfu_enabled" msgid="5806923046528144526">"ခေါ်ဆိုမှုအားလုံးကို <xliff:g id="PHONENUMBER">{0}</xliff:g> သို့ ထပ်ဆင့်ပို့နေသည်"</string>
+ <string name="sum_cfu_enabled" msgid="5806923046528144526">"<xliff:g id="PHONENUMBER">{0}</xliff:g> သို့ခေါ်ဆိုမှုအားလုံးအား တဆင့်ထပ်ပို့နေသည်"</string>
<string name="sum_cfu_enabled_no_number" msgid="7287752761743377930">"ဖုန်းနံပါတ်မှာ မရှိပါ"</string>
<string name="sum_cfu_disabled" msgid="5010617134210809853">"ပိတ်ထားသည်"</string>
<string name="labelCFB" msgid="615265213360512768">"မအားလပ်ချိန်"</string>
@@ -127,7 +127,7 @@
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"ခေါ်ဆိုမှုကြိုတင်ပြင်ဆင်ချက်များကို ကြီးကြပ်သူသာလျှင် ပြောင်းလဲနိုင်သည်။"</string>
<string name="call_settings_with_label" msgid="8460230435361579511">"ဆက်တင်များ ( <xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g> )"</string>
<string name="error_updating_title" msgid="2024290892676808965">"ခေါ်ဆိုမှုဆက်တင်အမှား"</string>
- <string name="reading_settings" msgid="1605904432450871183">"ဆက်တင်များကို ဖတ်နေပါသည်…"</string>
+ <string name="reading_settings" msgid="1605904432450871183">"အပြင်အဆင်များကို ဖတ်နေပါသည်…"</string>
<string name="updating_settings" msgid="3650396734816028808">"ဆက်တင်များအား ပြင်နေသည်…"</string>
<string name="reverting_settings" msgid="7378668837291012205">"ဆက်တင်များကို ပြန်ပြောင်းနေစဉ်…"</string>
<string name="response_error" msgid="3904481964024543330">"ကွန်ယက်မှ မထင်မှတ်သောတုံ့ပြန်ချက်"</string>
@@ -140,7 +140,7 @@
<string name="radio_off_error" msgid="8321564164914232181">"ဤအပြင်အဆင်များကို မကြည့်ခင် ရေဒီယိုကို ဖွင့်ပါ"</string>
<string name="close_dialog" msgid="1074977476136119408">"OK"</string>
<string name="enable" msgid="2636552299455477603">"ဖွင့်ထားရန်"</string>
- <string name="disable" msgid="1122698860799462116">"ပိတ်ရန်"</string>
+ <string name="disable" msgid="1122698860799462116">"ပိတ်မည်"</string>
<string name="change_num" msgid="6982164494063109334">"အဆင်မြှင့်ခြင်း"</string>
<string-array name="clir_display_values">
<item msgid="8477364191403806960">"မူရင်း ကွန်ရက်"</item>
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"ဒေတာအသုံးပြုမှုသတ်မှတ်ကာလ"</string>
<string name="throttle_rate" msgid="7641913901133634905">"ဒေတာနှုန်းထားမူဝါဒ"</string>
<string name="throttle_help" msgid="2624535757028809735">"ပိုမိုသိလိုလျှင် ..."</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"သတ်မှတ်ကာလ အမြင့်ဆုံး <xliff:g id="USED_2">%3$s</xliff:g> မှ <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪)\nနောက်သတ်မှတ်ကာလကို <xliff:g id="USED_3">%4$d</xliff:g> ရက်အကြာတွင် စတင်မည် (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) မှ <xliff:g id="USED_2">%3$s</xliff:g> သတ်မှတ်ကာလ အမြင့်ဆုံး\n နောက်သတ်မှတ်ကာလကို <xliff:g id="USED_3">%4$d</xliff:g> ရက်တွင် စတင်မည် (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪)၏ <xliff:g id="USED_2">%3$s</xliff:g> ကာလ အမြင့်ဆုံး"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> အမြင့်ဆုံး ကျော်လွန်\nဒေတာနှုန်း <xliff:g id="USED_1">%2$d</xliff:g> Kb/s သို့လျှော့ချလိုက်သည်"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ ကုန်ဆုံးပြီး \n နောက်သတ်မှတ်ကာလစရန် <xliff:g id="USED_1">%2$d</xliff:g> ရက်(<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -513,7 +513,7 @@
<string name="card_title_conf_call" msgid="901197309274457427">"ကွန်းဖရင့်ခေါ်ဆိုမှု"</string>
<string name="card_title_incoming_call" msgid="881424648458792430">"အဝင်ခေါ်ဆိုမှု"</string>
<string name="card_title_call_ended" msgid="650223980095026340">"ဖုန်းခေါ်ဆိုမှု ပြီးဆုံးပါပြီ"</string>
- <string name="card_title_on_hold" msgid="9028319436626975207">"ဖုန်းကိုင်ထားသည်"</string>
+ <string name="card_title_on_hold" msgid="9028319436626975207">"ခဏ ကိုင်ထားစဉ်"</string>
<string name="card_title_hanging_up" msgid="814874106866647871">"ဖုန်းချနေပါသည်"</string>
<string name="card_title_in_call" msgid="8231896539567594265">"ဖုန်းပြောနေစဉ်"</string>
<string name="notification_voicemail_title" msgid="3932876181831601351">"အသံမေးလ်အသစ်"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Yes"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"No"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"ပယ်ရန်"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ဤဖုန်းသည် အရေးပေါ် ပြန်ခေါ်ရန်မုဒ်တွင် ရှိနေသည်"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> အထိ"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">ဤဖုန်းသည် အရေးပေါ် ပြန်ခေါ်ရန်မုဒ်တွင် <xliff:g id="COUNT_1">%s</xliff:g> မိနစ်ကြာ ရှိနေပါမည်။ \nယခု ထွက်လိုပါသလား။</item>
- <item quantity="one">ဤဖုန်းသည် အရေးပေါ် ပြန်ခေါ်ရန်မုဒ်တွင် <xliff:g id="COUNT_0">%s</xliff:g> မိနစ်ကြာ ရှိနေပါမည်။ \nယခု ထွက်လိုပါသလား။</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"ဝန်ဆောင်မှု"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"စနစ်သတ်မှတ်ခြင်း"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"သတ်မှတ်မထားပါ"</string>
@@ -664,7 +658,7 @@
<string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"ဗွီဒီယို ခေါ်ဆိုမှု ဖွင့်ရန်၊ မြှင့်ထားသည့် 4G LTE မုဒ်ကို ကွန်ရက် ချိိန်ညှိချက်များတွင် ဖွင့်ပေးရပါမည်။"</string>
<string name="enable_video_calling_dialog_settings" msgid="8697890611305307110">"ကွန်ရက် ဆက်တင်များ"</string>
<string name="enable_video_calling_dialog_close" msgid="4298929725917045270">"ပိတ်ရန်"</string>
- <string name="sim_label_emergency_calls" msgid="9078241989421522310">"အရေးပေါ်ခေါ်ဆိုမှုများ"</string>
+ <string name="sim_label_emergency_calls" msgid="9078241989421522310">"အရေးပေါ် ခေါ်ဆိုမှုများ"</string>
<string name="sim_description_emergency_calls" msgid="5146872803938897296">"အရေးပေါ် ခေါ်ဆိုမှုသာလျှင်"</string>
<string name="sim_description_default" msgid="7474671114363724971">"SIM ကတ်၊ အပေါက်: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="7883415189273700298">"အများသုံးနိုင်မှု"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"ပြန်စရန်"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS စစ်ဆေးမှုခလုတ်ကို နှိပ်ပါ"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"ထုတ်လုပ်သူနှင့် သက်ဆိုင်သော အချက်အလက်/ဆက်တင်များ"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC အသုံးပြုနိုင်သည် -"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR ကန့်သတ်ထားသည် -"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR အသုံးပြုနိုင်သည် -"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR အခြေအနေ -"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR ကြိမ်နှုန်း -"</string>
<string name="band_mode_title" msgid="7988822920724576842">"ရေဒီယိုလိုင်းမုဒ်အဖြစ် သတ်မှတ်ပါ"</string>
<string name="band_mode_loading" msgid="795923726636735967">"ရေဒီယိုလိုင်းစာရင်းကို ဖွင့်နေသည်…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"သတ်မှတ်ရန်"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index aa66631..3495f8a 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -307,8 +307,12 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Databrukperiode"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Retningslinjer for datahastighet"</string>
<string name="throttle_help" msgid="2624535757028809735">"Les mer"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> %%) av maksimum <xliff:g id="USED_2">%3$s</xliff:g> for perioden\nNeste periode starter om <xliff:g id="USED_3">%4$d</xliff:g> dager (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> ٪) av maksimum <xliff:g id="USED_2">%3$s</xliff:g> for perioden"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_data_usage_subtext (3185429653996709840) -->
+ <skip />
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> har overskredet maksimumsgrensen\nDatahastigheten er redusert til <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g> ٪ av syklusen er fullført\nNeste periode starter om <xliff:g id="USED_1">%2$d</xliff:g> dager (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
<string name="throttle_rate_subtext" msgid="7221971817325779535">"Datahastigheten reduseres til <xliff:g id="USED">%1$d</xliff:g> Kb/s hvis databruken overskrider grenseverdien"</string>
@@ -637,12 +641,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ja"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Nei"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Lukk"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefonen er i modus for tilbakeringing av nødanrop"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Til <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Telefonen kommer til å være i modus for tilbakeringing av nødanrop i <xliff:g id="COUNT_1">%s</xliff:g> minutter.\nVil du avslutte nå?</item>
- <item quantity="one">Telefonen kommer til å være i modus for tilbakeringing av nødanrop i <xliff:g id="COUNT_0">%s</xliff:g> minutt.\nVil du avslutte nå?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Tjeneste"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Konfigurering"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Ikke angitt>"</string>
@@ -898,11 +896,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Last inn på nytt"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Slå av/på DNS-sjekk"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Produsentspesfikk informasjon og innstillinger"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC tilgjengelig:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR begrenset:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR tilgjengelig:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR-tilstand:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR-frekvens:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Angi båndmodus for radio"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Laster inn båndlisten …"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Angi"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 8e629e0..7b891fc 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -18,7 +18,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="phoneAppLabel" product="tablet" msgid="1916019789885839910">"मोबाइल डेटा"</string>
<string name="phoneAppLabel" product="default" msgid="130465039375347763">"फोन सेवाहरू"</string>
- <string name="emergencyDialerIconLabel" msgid="8668005772339436680">"आपत्कालीन डायल गर्ने"</string>
+ <string name="emergencyDialerIconLabel" msgid="8668005772339436680">"आपतकालीन डायल गर्ने"</string>
<string name="phoneIconLabel" msgid="3015941229249651419">"फोन"</string>
<string name="fdnListLabel" msgid="4119121875004244097">"FDN सूची"</string>
<string name="unknown" msgid="8279698889921830815">"अज्ञात"</string>
@@ -83,7 +83,7 @@
<string name="smart_forwarding_settings_menu" msgid="8850429887958938540">"स्मार्ट तरिकाले फर्वार्ड गर्ने सुविधा"</string>
<string name="smart_forwarding_settings_menu_summary" msgid="5096947726032885325">"एउटा नम्बर सम्पर्क क्षेत्रबाहिर भएका बेला कल सधैँ आफ्नो अर्को नम्बरमा फर्वार्ड गर्नुहोस्"</string>
<string name="voicemail_notifications_preference_title" msgid="7829238858063382977">"सूचनाहरू"</string>
- <string name="cell_broadcast_settings" msgid="8135324242541809924">"आपत्कालीन प्रसारणहरू"</string>
+ <string name="cell_broadcast_settings" msgid="8135324242541809924">"आपतकालीन प्रसारणहरू"</string>
<string name="call_settings" msgid="3677282690157603818">"कल सेटिङहरू"</string>
<string name="additional_gsm_call_settings" msgid="1561980168685658846">"अतिरिक्त सेटिङहरू"</string>
<string name="additional_gsm_call_settings_with_label" msgid="7973920539979524908">"अतिरिक्त सेटिङ ( <xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g> )"</string>
@@ -136,12 +136,12 @@
<string name="stk_cc_ss_to_ussd_error" msgid="8330749347425752192">"SS अनुरोध USSD अनुरोधमा परिवर्तन गरियो"</string>
<string name="stk_cc_ss_to_ss_error" msgid="8297155544652134278">"नयाँ SS अनुरोधमा परिवर्तन गरियो"</string>
<string name="stk_cc_ss_to_dial_video_error" msgid="4255261231466032505">"SS अनुरोध भिडियो कलमा परिवर्तन गरियो"</string>
- <string name="fdn_check_failure" msgid="1833769746374185247">"तपाईंको फोन एप स्थिर डायल गर्ने नम्बर सेटिङहरू खोलिएको छ। केही कल-सम्बन्धित विशेषताहरूले कार्य गरिरहेका छैनन्।"</string>
+ <string name="fdn_check_failure" msgid="1833769746374185247">"तपाईंको फोन अनुप्रयोग स्थिर डायल गर्ने नम्बर सेटिङहरू खोलिएको छ। केही कल-सम्बन्धित विशेषताहरूले कार्य गरिरहेका छैनन्।"</string>
<string name="radio_off_error" msgid="8321564164914232181">"यी सेटिङहरू हेर्नु पहिले रेडियो खोल्नुहोस्।"</string>
<string name="close_dialog" msgid="1074977476136119408">"ठिक छ"</string>
<string name="enable" msgid="2636552299455477603">"सकृय पार्नुहोस्"</string>
<string name="disable" msgid="1122698860799462116">"निस्कृय पार्नुहोस्"</string>
- <string name="change_num" msgid="6982164494063109334">"अपडेट गर्नुहोस्"</string>
+ <string name="change_num" msgid="6982164494063109334">"अद्यावधिक गर्नुहोस्"</string>
<string-array name="clir_display_values">
<item msgid="8477364191403806960">"नेटवर्क पूर्वनिर्धारित"</item>
<item msgid="6813323051965618926">"सङ्ख्या लुकाउनुहोस्"</item>
@@ -298,7 +298,7 @@
<string name="sim_selection_required_pref" msgid="6985901872978341314">"चयन गर्न आवश्यक छ"</string>
<string name="sim_change_data_title" msgid="9142726786345906606">"डेटा सिम परिवर्तन गर्ने हो?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"मोबाइल डेटाका लागि <xliff:g id="OLD_SIM">%2$s</xliff:g> को सट्टा <xliff:g id="NEW_SIM">%1$s</xliff:g> को प्रयोग गर्ने हो?"</string>
- <string name="wifi_calling_settings_title" msgid="5800018845662016507">"Wi-Fi कलिङ"</string>
+ <string name="wifi_calling_settings_title" msgid="5800018845662016507">"Wi-Fi कल"</string>
<string name="video_calling_settings_title" msgid="342829454913266078">"सेवा प्रदायकको भिडियो कल"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"GSM/UMTS विकल्पहरू"</string>
<string name="cdma_options" msgid="3669592472226145665">"CDMA विकल्पहरू"</string>
@@ -318,9 +318,9 @@
<string name="cell_bc_sms_enable" msgid="2019708772024632073">"सेल प्रसारण SMS सक्षम"</string>
<string name="cell_bc_sms_disable" msgid="1214238639910875347">"सेल प्रसारण SMS अक्षम"</string>
<string name="cb_sms_settings" msgid="6858093721831312036">"सेल प्रसारण SMS सेटिङहरू"</string>
- <string name="enable_disable_emergency_broadcast" msgid="6325655044472196496">"आपत्कालीन प्रसारण"</string>
- <string name="emergency_broadcast_enable" msgid="5759610647771102442">"आपत्कालीन प्रसारण सक्षम भयो"</string>
- <string name="emergency_broadcast_disable" msgid="2844904734469323266">"आपत्कालीन प्रसारण अक्षम भयो"</string>
+ <string name="enable_disable_emergency_broadcast" msgid="6325655044472196496">"आपतकालीन प्रसारण"</string>
+ <string name="emergency_broadcast_enable" msgid="5759610647771102442">"आपतकालीन प्रसारण सक्षम भयो"</string>
+ <string name="emergency_broadcast_disable" msgid="2844904734469323266">"आपतकालीन प्रसारण अक्षम भयो"</string>
<string name="enable_disable_administrative" msgid="7825925366822117961">"प्रशासकीय"</string>
<string name="administrative_enable" msgid="5717963431079532028">"प्रशासनिक सक्षम"</string>
<string name="administrative_disable" msgid="156796633660118691">"प्रशासनिक असक्षम"</string>
@@ -525,7 +525,7 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"मोबाइल नेटवर्क सक्रिय पार्नुहोस्, कल गर्न हवाइजहाज मोड वा ब्याट्री सेवर मोड निष्क्रिय पार्नुहोस्।"</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"एक कल गर्न हवाइजहाज मोड बन्द गर्नुहोस्।"</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"एक कल गर्न हवाइजहाज मोड बन्द गर्नुहोस् वा एक ताररहितको सञ्जालमा जडान गर्नुहोस्।"</string>
- <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"गैर-आपत्कालीन कल गर्न आपत्कालीन कलब्याक मोडबाट निस्कनुहोस्।"</string>
+ <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"गैर-आपतकालीन कल गर्न आपतकालीन कलब्याक मोडबाट निस्कनुहोस्।"</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"नेटवर्कमा दर्ता भएको छैन।"</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"मोबाइल नेटवर्क उपलब्ध छैन।"</string>
<string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"मोबाइल नेटवर्क उपलब्ध छैन। कल गर्न तारविनाको नेटवर्कमा जडान गर्नुहोस्।"</string>
@@ -543,19 +543,19 @@
<string name="incall_error_supp_service_hold" msgid="8535056414643540997">"कल सञ्चालन गर्न सकिँदैन।"</string>
<string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"एक कल गर्न एक ताररहितको सञ्जालमा जडान गर्नुहोस्।"</string>
<string name="incall_error_promote_wfc" msgid="9164896813931363415">"कल गर्नका लागि Wi-Fi कलिङ सक्षम गर्नुहोस्।"</string>
- <string name="emergency_information_hint" msgid="9208897544917793012">"आपत्कालीन जानकारी"</string>
+ <string name="emergency_information_hint" msgid="9208897544917793012">"आपतकालीन जानकारी"</string>
<string name="emergency_information_owner_hint" msgid="6256909888049185316">"मालिक"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"जानकारी हेर्न पुनः ट्याप गर्नुहोस्"</string>
- <string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"आपत्कालीन कल"</string>
- <string name="single_emergency_number_title" msgid="8413371079579067196">"आपत्कालीन नम्बर"</string>
- <string name="numerous_emergency_numbers_title" msgid="8972398932506755510">"आपत्कालीन नम्बरहरू"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"आपतकालीन कल"</string>
+ <string name="single_emergency_number_title" msgid="8413371079579067196">"आपतकालीन नम्बर"</string>
+ <string name="numerous_emergency_numbers_title" msgid="8972398932506755510">"आपतकालीन नम्बरहरू"</string>
<string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"<xliff:g id="EMERGENCY_NUMBER">%s</xliff:g> मा कल गर्न फेरि ट्याप गर्नुहोस्"</string>
<string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"रेडियो खोल्दै..."</string>
<string name="emergency_enable_radio_dialog_retry" msgid="4329131876852608587">"कुनै सेवा छैन। फेरि प्रयास गर्दै ..."</string>
- <string name="radio_off_during_emergency_call" msgid="8011154134040481609">"आपत्कालीन कलको समयमा हवाइजहाज मोडमा प्रविष्ट गर्न सक्दैन।"</string>
- <string name="dial_emergency_error" msgid="825822413209026039">"कल गर्न सकिँदैन। <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> आपत्कालीन नम्बर होइन।"</string>
- <string name="dial_emergency_empty_error" msgid="2785803395047793634">"कल गर्न सकिँदैन। आपत्कालीन नम्बर डायल गर्नुहोस्।"</string>
- <string name="dial_emergency_calling_not_available" msgid="6485846193794727823">"आपत्कालीन कल सेवा उपलब्ध छैन"</string>
+ <string name="radio_off_during_emergency_call" msgid="8011154134040481609">"आपतकालीन कलको समयमा हवाइजहाज मोडमा प्रविष्ट गर्न सक्दैन।"</string>
+ <string name="dial_emergency_error" msgid="825822413209026039">"कल गर्न सकिँदैन। <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> आपतकालीन नम्बर होइन।"</string>
+ <string name="dial_emergency_empty_error" msgid="2785803395047793634">"कल गर्न सकिँदैन। आपतकालीन नम्बर डायल गर्नुहोस्।"</string>
+ <string name="dial_emergency_calling_not_available" msgid="6485846193794727823">"आपतकालीन कल सेवा उपलब्ध छैन"</string>
<string name="pin_puk_system_user_only" msgid="1045147220686867922">"यन्त्रका मालिक मात्र PIN/PUK कोडहरू प्रविष्टि गर्न सक्नुहुन्छ।"</string>
<string name="police_type_description" msgid="2819533883972081757">"प्रहरी"</string>
<string name="ambulance_type_description" msgid="6798237503553180461">"एम्बुलेन्स सेवा"</string>
@@ -620,41 +620,35 @@
<string name="ota_try_again" msgid="6914781945599998550">"फेरि प्रयास गर्नुहोस्"</string>
<string name="ota_next" msgid="2041016619313475914">"अर्को"</string>
<string name="ecm_exit_dialog" msgid="4200691880721429078">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="8431238297843035842">"आपत्कालीन कलब्याक मोड प्रविष्टि गरियो"</string>
- <string name="phone_in_ecm_notification_title" msgid="6825016389926367946">"आपत्कालीन कलब्याक मोड"</string>
+ <string name="phone_entered_ecm_text" msgid="8431238297843035842">"आपतकालीन कलब्याक मोड प्रविष्टि गरियो"</string>
+ <string name="phone_in_ecm_notification_title" msgid="6825016389926367946">"आपतकालीन कलब्याक मोड"</string>
<string name="phone_in_ecm_call_notification_text" msgid="653972232922670335">"डेटा जडान अक्षम भयो"</string>
- <string name="phone_in_ecm_notification_complete_time" msgid="7341624337163082759">"<xliff:g id="COMPLETETIME">%s</xliff:g> सम्म डेटा कनेक्ट भएको छैन"</string>
+ <string name="phone_in_ecm_notification_complete_time" msgid="7341624337163082759">"<xliff:g id="COMPLETETIME">%s</xliff:g> सम्म डेटा जडान भएको छैन"</string>
<plurals name="alert_dialog_exit_ecm" formatted="false" msgid="5425906903766466743">
- <item quantity="other"> फोन आपत्कालीन कलब्याक मोडमा <xliff:g id="COUNT_1">%s</xliff:g> मिनेटको लागि हुनेछ। यस मोडको अवस्थामा एक डेटा जडान प्रयोग गरेर कुनै पनि एपहरू प्रयोग गर्न सकिँदैन। के तपाईं अहिले निस्कन चाहनुहुन्छ?</item>
- <item quantity="one"> फोन आपत्कालीन कलब्याक मोडमा <xliff:g id="COUNT_0">%s</xliff:g> मिनेटको लागि हुनेछ। यस मोडको समयमा एक डेटा जडान प्रयोग गरेर कुनै पनि एपहरू प्रयोग गर्न सकिँदैन। के तपाईं अहिले निस्कन चाहनुहुन्छ?</item>
+ <item quantity="other"> फोन आपतकालीन कलब्याक मोडमा <xliff:g id="COUNT_1">%s</xliff:g> मिनेटको लागि हुनेछ। यस मोडको अवस्थामा एक डेटा जडान प्रयोग गरेर कुनै पनि अनुप्रयोगहरू प्रयोग गर्न सकिँदैन। के तपाईं अहिले निस्कन चाहनुहुन्छ?</item>
+ <item quantity="one"> फोन आपतकालीन कलब्याक मोडमा <xliff:g id="COUNT_0">%s</xliff:g> मिनेटको लागि हुनेछ। यस मोडको समयमा एक डेटा जडान प्रयोग गरेर कुनै पनि अनुप्रयोगहरू प्रयोग गर्न सकिँदैन। के तपाईं अहिले निस्कन चाहनुहुन्छ?</item>
</plurals>
<plurals name="alert_dialog_not_avaialble_in_ecm" formatted="false" msgid="1152682528741457004">
- <item quantity="other"> आपत्कालीन कलब्याक मोडको समयमा चयनित कार्य उपलब्ध छैन। फोन यस मोडमा <xliff:g id="COUNT_1">%s</xliff:g> मिनेटको लागि हुनेछ। के तपाईं अहिले निस्कन चाहनुहुन्छ?</item>
- <item quantity="one"> आपत्कालीन कलब्याक मोडको समयमा चयनित कार्य उपलब्ध छैन। फोन यस मोडमा <xliff:g id="COUNT_0">%s</xliff:g> मिनेटको लागि हुनेछ। के तपाईं अहिले निस्कन चाहनुहुन्छ?</item>
+ <item quantity="other"> आपतकालीन कलब्याक मोडको समयमा चयनित कार्य उपलब्ध छैन। फोन यस मोडमा <xliff:g id="COUNT_1">%s</xliff:g> मिनेटको लागि हुनेछ। के तपाईं अहिले निस्कन चाहनुहुन्छ?</item>
+ <item quantity="one"> आपतकालीन कलब्याक मोडको समयमा चयनित कार्य उपलब्ध छैन। फोन यस मोडमा <xliff:g id="COUNT_0">%s</xliff:g> मिनेटको लागि हुनेछ। के तपाईं अहिले निस्कन चाहनुहुन्छ?</item>
</plurals>
- <string name="alert_dialog_in_ecm_call" msgid="1207545603149771978">"आपत्कालीन कल हुँदा चयन भएको कार्य उपलब्ध हुँदैन।"</string>
- <string name="progress_dialog_exiting_ecm" msgid="9159080081676927217">"आपत्कालीन कलब्याक मोडबाट निस्कदै"</string>
+ <string name="alert_dialog_in_ecm_call" msgid="1207545603149771978">"आपतकालीन कल हुँदा चयन भएको कार्य उपलब्ध हुँदैन।"</string>
+ <string name="progress_dialog_exiting_ecm" msgid="9159080081676927217">"आपतकालीन कलब्याक मोडबाट निस्कदै"</string>
<string name="alert_dialog_yes" msgid="3532525979632841417">"हो"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"होइन"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"खारेज गर्नुहोस्"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"यो फोन आपत्कालीन कलब्याक मोडमा छ"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> सम्म"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">यो फोन <xliff:g id="COUNT_1">%s</xliff:g> मिनेटका लागि आपत्कालीन कलब्याक मोडमा हुने छ।\nतपाईं अहिले नै बाहिर निस्कन चाहनुहुन्छ?</item>
- <item quantity="one">यो फोन <xliff:g id="COUNT_0">%s</xliff:g> मिनेटका लागि आपत्कालीन कलब्याक मोडमा हुने छ।\nतपाईं अहिले नै बाहिर निस्कन चाहनुहुन्छ?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"सेवा"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"सेटअप"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"सेट गरेको छैन"</string>
<string name="other_settings" msgid="8895088007393598447">"अन्य कल सेटिङहरू"</string>
<string name="calling_via_template" msgid="1791323450703751750">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> को मार्फत कल गर्दै"</string>
- <string name="contactPhoto" msgid="7885089213135154834">"सम्पर्क फोटो"</string>
+ <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="description_dial_button" msgid="8614631902795087259">"डायल"</string>
<string name="description_dialpad_button" msgid="7395114120463883623">"डायलप्याड देखाउनुहोस्"</string>
- <string name="pane_title_emergency_dialpad" msgid="3627372514638694401">"आपत्कालीन डायलप्याड"</string>
+ <string name="pane_title_emergency_dialpad" msgid="3627372514638694401">"आपतकालीन डायलप्याड"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="6610414098912832120">"भिजुअल भ्वाइस मेल"</string>
<string name="voicemail_set_pin_dialog_title" msgid="7005128605986960003">"PIN सेट गर्नुहोस्"</string>
<string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"PIN परिवर्तन गर्नुहोस्"</string>
@@ -678,7 +672,7 @@
<string name="callFailed_wifi_lost" msgid="1788036730589163141">"Wi-Fi जडान विच्छेद भयो। कल समाप्त भयो।"</string>
<string name="dialFailed_low_battery" msgid="6857904237423407056">"ब्याट्रीको चार्ज स्तर कम हुनाले तपाईं भिडियो कल गर्न सक्नुहुन्न।"</string>
<string name="callFailed_low_battery" msgid="4056828320214416182">"ब्याट्रीको चार्ज स्तर कम हुनाले भिडियो कल बन्द भयो।"</string>
- <string name="callFailed_emergency_call_over_wfc_not_available" msgid="5944309590693432042">"यो स्थानमा Wi-Fi कलिङमार्फत आपत्कालीन कलहरू गर्ने सुविधा उपलब्ध छैन।"</string>
+ <string name="callFailed_emergency_call_over_wfc_not_available" msgid="5944309590693432042">"यो स्थानमा Wi-Fi कलिङमार्फत आपतकालीन कलहरू गर्ने सुविधा उपलब्ध छैन।"</string>
<string name="callFailed_wfc_service_not_available_in_this_location" msgid="3624536608369524988">"यो स्थानमा Wi-Fi कलिङ उपलब्ध छैन।"</string>
<string name="change_pin_title" msgid="3564254326626797321">"भ्वाइस मेलको PIN परिवर्तन गर्नुहोस्"</string>
<string name="change_pin_continue_label" msgid="5177011752453506371">"जारी राख्नुहोस्"</string>
@@ -845,7 +839,7 @@
<string name="radio_info_ims_reg_status" msgid="25582845222446390">"IMS को दर्ता: <xliff:g id="STATUS">%1$s</xliff:g>\nभ्वाइस ओभर LTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nभ्वाइस ओभर WiFi: <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>
+ <string name="radioInfo_service_emergency" msgid="4763879891415016848">"आपतकालीन कल मात्र"</string>
<string name="radioInfo_service_off" msgid="3456583511226783064">"रेडियो निष्क्रिय छ"</string>
<string name="radioInfo_roaming_in" msgid="3156335577793145965">"रोमिङ"</string>
<string name="radioInfo_roaming_not" msgid="1904547918725478110">"रोमिङमा छैन"</string>
@@ -894,15 +888,10 @@
<string name="radio_info_http_client_test" msgid="1329583721088428238">"HTTP क्लाइन्टको परीक्षण:"</string>
<string name="ping_test_label" msgid="448617502935719694">"पिङसम्बन्धी परीक्षण सञ्चालन गर्नुहोस्"</string>
<string name="radio_info_smsc_label" msgid="3749927072726033763">"SMSC:"</string>
- <string name="radio_info_smsc_update_label" msgid="5141996256097115753">"अपडेट गर्नुहोस्"</string>
+ <string name="radio_info_smsc_update_label" msgid="5141996256097115753">"अद्यावधिक गर्नुहोस्"</string>
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"पुनः ताजा गर्नुहोस्"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS को जाँचलाई टगल गर्नुहोस्"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-विशिष्ट जानकारी/सेटिङ"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC उपलब्ध छ:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR प्रतिबन्धित छ:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR उपलब्ध छ:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR को स्थिती:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR फ्रिक्वेन्सी:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"रेडियोको ब्यान्डसम्बन्धी मोडलाई सेट गर्नुहोस्"</string>
<string name="band_mode_loading" msgid="795923726636735967">"ब्यान्डको सूची लोड गर्दै…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"सेट गर्नुहोस्"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 9f7ab07..5da9697 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -32,7 +32,7 @@
<string name="mmiCancelled" msgid="5339191899200678272">"MMI-code geannuleerd"</string>
<string name="cancel" msgid="8984206397635155197">"Annuleren"</string>
<string name="enter_input" msgid="6193628663039958990">"USSD-bericht moet tussen <xliff:g id="MIN_LEN">%1$d</xliff:g> en <xliff:g id="MAX_LEN">%2$d</xliff:g> tekens lang zijn. Probeer het opnieuw."</string>
- <string name="manageConferenceLabel" msgid="8415044818156353233">"Conferencecall beheren"</string>
+ <string name="manageConferenceLabel" msgid="8415044818156353233">"Telefonische vergadering beheren"</string>
<string name="ok" msgid="7818974223666140165">"OK"</string>
<string name="audio_mode_speaker" msgid="243689733219312360">"Luidspreker"</string>
<string name="audio_mode_earpiece" msgid="2823700267171134282">"Oortelefoon van handset"</string>
@@ -506,11 +506,11 @@
<string name="pin2_attempts" msgid="5625178102026453023">\n"Je hebt nog <xliff:g id="NUMBER">%d</xliff:g> pogingen."</string>
<string name="pin2_unblocked" msgid="4481107908727789303">"PIN2 niet langer geblokkeerd"</string>
<string name="pin2_error_exception" msgid="8116103864600823641">"Netwerk- of simkaartfout"</string>
- <string name="doneButton" msgid="7371209609238460207">"Klaar"</string>
+ <string name="doneButton" msgid="7371209609238460207">"Gereed"</string>
<string name="voicemail_settings_number_label" msgid="1265118640154688162">"Voicemailnummer"</string>
<string name="card_title_dialing" msgid="8742182654254431781">"Kiezen"</string>
<string name="card_title_redialing" msgid="18130232613559964">"Opnieuw bellen"</string>
- <string name="card_title_conf_call" msgid="901197309274457427">"Conferencecall"</string>
+ <string name="card_title_conf_call" msgid="901197309274457427">"Telefonische vergadering"</string>
<string name="card_title_incoming_call" msgid="881424648458792430">"Inkomend gesprek"</string>
<string name="card_title_call_ended" msgid="650223980095026340">"Gesprek beëindigd"</string>
<string name="card_title_on_hold" msgid="9028319436626975207">"In de wacht"</string>
@@ -579,8 +579,8 @@
<string name="importToFDNfromContacts" msgid="5068664870738407341">"Importeren uit contacten"</string>
<string name="singleContactImportedMsg" msgid="3619804066300998934">"Contact geïmporteerd"</string>
<string name="failedToImportSingleContactMsg" msgid="228095510489830266">"Kan contact niet importeren"</string>
- <string name="hac_mode_title" msgid="4127986689621125468">"Hoortoestellen"</string>
- <string name="hac_mode_summary" msgid="7774989500136009881">"Compatibiliteit voor hoortoestel inschakelen"</string>
+ <string name="hac_mode_title" msgid="4127986689621125468">"Gehoorapparaten"</string>
+ <string name="hac_mode_summary" msgid="7774989500136009881">"Compatibiliteit voor gehoorapparaat inschakelen"</string>
<string name="rtt_mode_title" msgid="3075948111362818043">"Realtime tekstoproep (RTT)"</string>
<string name="rtt_mode_summary" msgid="8631541375609989562">"Berichten in een audiogesprek toestaan"</string>
<string name="rtt_mode_more_information" msgid="587500128658756318">"RTT helpt bellers die doof of slechthorend zijn, een spraakbeperking hebben of meer dan alleen een stem nodig hebben.<br> <a href=<xliff:g id="URL">http://support.google.com/mobile?p=telephony_rtt</xliff:g>>Meer informatie</a>\n <br><br> - RTT-gesprekken worden opgeslagen als berichttranscript.\n <br> - RTT is niet beschikbaar voor videogesprekken"</string>
@@ -602,9 +602,9 @@
<string name="ota_title_activate" msgid="4049645324841263423">"Je telefoon activeren"</string>
<string name="ota_touch_activate" msgid="838764494319694754">"Je moet een speciaal gesprek voeren om je telefoonservice te activeren. \n\nNadat je op \'Activeren\' hebt gedrukt, luister je naar de instructies om je telefoon te activeren."</string>
<string name="ota_hfa_activation_title" msgid="3300556778212729671">"Activeren..."</string>
- <string name="ota_hfa_activation_dialog_message" msgid="7921718445773342996">"De telefoon activeert je mobiele-dataservice.\n\nDit kan tot vijf minuten duren."</string>
+ <string name="ota_hfa_activation_dialog_message" msgid="7921718445773342996">"De telefoon activeert je mobiele gegevensservice.\n\nDit kan tot vijf minuten duren."</string>
<string name="ota_skip_activation_dialog_title" msgid="7666611236789203797">"Activering overslaan?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Als je de activering overslaat, kun je niet bellen of verbinding maken met mobiele-datanetwerken (je kunt wel verbinding maken met wifi-netwerken). Tot je de telefoon activeert, wordt je gevraagd deze te activeren telkens wanneer je de telefoon inschakelt."</string>
+ <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Als je de activering overslaat, kun je niet bellen of verbinding maken met mobiele gegevensnetwerken (je kunt wel verbinding maken met wifi-netwerken). Tot je de telefoon activeert, wordt je gevraagd deze te activeren telkens wanneer je de telefoon inschakelt."</string>
<string name="ota_skip_activation_dialog_skip_label" msgid="5908029466817825633">"Overslaan"</string>
<string name="ota_activate" msgid="7939695753665438357">"Activeren"</string>
<string name="ota_title_activate_success" msgid="1272135024761004889">"De telefoon is geactiveerd."</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ja"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Nee"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Negeren"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"De modus voor noodoproepen is geactiveerd voor de telefoon"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Tot <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">De telefoon blijft <xliff:g id="COUNT_1">%s</xliff:g> minuten in de modus voor noodoproepen.\nWil je nu afsluiten?</item>
- <item quantity="one">De telefoon blijft <xliff:g id="COUNT_0">%s</xliff:g> minuut in de modus voor noodoproepen.\nWil je nu afsluiten?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Service"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Instellen"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Niet ingesteld>"</string>
@@ -898,11 +892,6 @@
<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="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>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR beschikbaar:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR-status:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR-frequentie:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Modus voor radioband instellen"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Bandlijst laden…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Instellen"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index ec9a3f8..3b2c3cd 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"ଆକାଉଣ୍ଟ ସେଟିଙ୍ଗକୁ କନଫିଗର୍ କରନ୍ତୁ"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"ସମସ୍ତ କଲିଙ୍ଗ ଆକାଉଣ୍ଟ"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"କଲ୍ କରିପାରୁଥିବା ଆକାଉଣ୍ଟକୁ ଚୟନ କରନ୍ତୁ"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"ୱାଇ-ଫାଇ କଲିଂ"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"ୱାଇ-ଫାଇ କଲିଙ୍ଗ"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"ବିଲ୍ଟ-ଇନ୍ ସଂଯୋଗ ସେବା"</string>
<string name="voicemail" msgid="7697769412804195032">"ଭଏସମେଲ୍"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"ଭଏସମେଲ୍ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -84,7 +84,7 @@
<string name="smart_forwarding_settings_menu_summary" msgid="5096947726032885325">"ଯେତେବେଳେ ଏକ ନମ୍ବର୍ ଅପହଞ୍ଚ ଦୂରରେ ରହିଥାଏ, ସେତେବେଳେ ସର୍ବଦା ଆପଣଙ୍କର ଅନ୍ୟ ନମ୍ବର୍କୁ କଲ୍ଗୁଡ଼ିକ ଫର୍ୱର୍ଡ ହେବ"</string>
<string name="voicemail_notifications_preference_title" msgid="7829238858063382977">"ବିଜ୍ଞପ୍ତି"</string>
<string name="cell_broadcast_settings" msgid="8135324242541809924">"ଜରୁରିକାଳୀନ ପ୍ରସାରଣ"</string>
- <string name="call_settings" msgid="3677282690157603818">"କଲ୍ ସେଟିଂସ୍"</string>
+ <string name="call_settings" msgid="3677282690157603818">"କଲ୍ ସେଟିଙ୍ଗ"</string>
<string name="additional_gsm_call_settings" msgid="1561980168685658846">"ଅତିରିକ୍ତ ସେଟିଙ୍ଗ"</string>
<string name="additional_gsm_call_settings_with_label" msgid="7973920539979524908">"ଅତିରିକ୍ତ ସେଟିଙ୍ଗ(<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="sum_gsm_call_settings" msgid="7964692601608878138">"ଅତିରିକ୍ତ କେବଳ GSM କଲ୍ ସେଟିଙ୍ଗ"</string>
@@ -95,40 +95,40 @@
<string name="sum_loading_settings" msgid="434063780286688775">"ସେଟିଙ୍ଗ ଲୋଡ୍ ହେଉଛି…"</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"ଆଉଟ୍ଗୋଇଙ୍ଗ କଲ୍ରେ ଲୁଚିଥିବା କଲ୍"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"ଆଉଟ୍ଗୋଇଙ୍ଗ କଲ୍ରେ ନମ୍ବର୍ ଡିସପ୍ଲେ ହୋଇଛି"</string>
- <string name="sum_default_caller_id" msgid="1767070797135682959">"ଆଉଟ୍ଗୋଇଙ୍ଗ କଲ୍ରେ ମୋର ନମ୍ବର୍କୁ ଡିସପ୍ଲେ କରିବା ପାଇଁ ଡିଫଲ୍ଟ ଅପରେଟର୍ ସେଟିଂସକୁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="sum_default_caller_id" msgid="1767070797135682959">"ଆଉଟ୍ଗୋଇଙ୍ଗ କଲ୍ରେ ମୋର ନମ୍ବର୍କୁ ଦେଖାଇବା ପାଇଁ ଡିଫଲ୍ଟ ଅପରେଟର୍ ସେଟିଙ୍ଗକୁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="labelCW" msgid="8449327023861428622">"କଲ୍ ଅପେକ୍ଷାରେ ଅଛି"</string>
- <string name="sum_cw_enabled" msgid="3977308526187139996">"ଗୋଟିଏ କଲ୍ ସମୟରେ ଇନକମିଙ୍ଗ କଲ୍ ପାଇଁ ମୋତେ ସୂଚିତ କରନ୍ତୁ"</string>
- <string name="sum_cw_disabled" msgid="3658094589461768637">"ଗୋଟିଏ କଲ୍ ସମୟରେ ଇନକମିଙ୍ଗ କଲ୍ ପାଇଁ ମୋତେ ସୂଚିତ କରନ୍ତୁ"</string>
- <string name="call_forwarding_settings" msgid="8937130467468257671">"କଲ୍ ଫରୱାର୍ଡିଂ ସେଟିଂସ୍"</string>
- <string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"କଲ୍ ଫର୍ୱାର୍ଡିଂ ସେଟିଂସ୍ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+ <string name="sum_cw_enabled" msgid="3977308526187139996">"ଗୋଟିଏ କଲ୍ କରିବା ବେଳେ ଇନକମିଙ୍ଗ କଲ୍ ପାଇଁ ମୋତେ ସୂଚିତ କରନ୍ତୁ"</string>
+ <string name="sum_cw_disabled" msgid="3658094589461768637">"ଗୋଟିଏ କଲ୍ କରିବା ବେଳେ ଇନକମିଙ୍ଗ କଲ୍ ପାଇଁ ମୋତେ ସୂଚିତ କରନ୍ତୁ"</string>
+ <string name="call_forwarding_settings" msgid="8937130467468257671">"କଲ୍ ଫରୱାର୍ଡିଙ୍ଗ ସେଟିଙ୍ଗ"</string>
+ <string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"କଲ୍ ଫର୍ୱାର୍ଡିଙ୍ଗ ସେଟିଙ୍ଗ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"କଲ୍ ଫର୍ୱାର୍ଡିଙ୍ଗ"</string>
<string name="labelCFU" msgid="8870170873036279706">"ସର୍ବଦା ଫର୍ୱାର୍ଡ କରନ୍ତୁ"</string>
<string name="messageCFU" msgid="1361806450979589744">"ସର୍ବଦା ଏହି ନମ୍ବର୍କୁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="sum_cfu_enabled_indicator" msgid="9030139213402432776">"ସମସ୍ତ କଲ୍ ଫରୱାର୍ଡ କରାଯାଉଛି"</string>
<string name="sum_cfu_enabled" msgid="5806923046528144526">"<xliff:g id="PHONENUMBER">{0}</xliff:g>କୁ ସମସ୍ତ କଲ୍ ଫରୱାର୍ଡ କରାଯାଉଛି"</string>
<string name="sum_cfu_enabled_no_number" msgid="7287752761743377930">"ନମ୍ବର୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
- <string name="sum_cfu_disabled" msgid="5010617134210809853">"ବନ୍ଦ ଅଛି"</string>
+ <string name="sum_cfu_disabled" msgid="5010617134210809853">"ଅଫ୍ ଅଛି"</string>
<string name="labelCFB" msgid="615265213360512768">"ବ୍ୟସ୍ତଥିବା ବେଳେ"</string>
<string name="messageCFB" msgid="1958017270393563388">"ବ୍ୟସ୍ତ ଥିବା ବେଳେ ନମ୍ବର୍"</string>
<string name="sum_cfb_enabled" msgid="332037613072049492">"<xliff:g id="PHONENUMBER">{0}</xliff:g>କୁ ଫରୱାର୍ଡ କରାଯାଉଛି"</string>
- <string name="sum_cfb_disabled" msgid="3589913334164866035">"ବନ୍ଦ ଅଛି"</string>
+ <string name="sum_cfb_disabled" msgid="3589913334164866035">"ଅଫ୍ ଅଛି"</string>
<string name="disable_cfb_forbidden" msgid="4831494744351633961">"ଆପଣଙ୍କର ଫୋନ୍ ବ୍ୟସ୍ତ ଥିବାବେଳେ ଆପଣଙ୍କର ଅପରେଟର୍ କଲ୍ ଫର୍ୱାର୍ଡିଙ୍ଗକୁ ଅକ୍ଷମ କରିବାରେ ସପୋର୍ଟ କରିବେ ନାହିଁ।"</string>
<string name="labelCFNRy" msgid="3403533792248457946">"ଉତ୍ତର ଦେଉନଥିବା ବେଳେ"</string>
<string name="messageCFNRy" msgid="7644434155765359009">"ଉତ୍ତର ଦେଉନଥିବା ବେଳେ ନମ୍ବର୍"</string>
<string name="sum_cfnry_enabled" msgid="3000500837493854799">"<xliff:g id="PHONENUMBER">{0}</xliff:g>କୁ ଫରୱାର୍ଡ କରାଯାଉଛି"</string>
- <string name="sum_cfnry_disabled" msgid="1990563512406017880">"ବନ୍ଦ ଅଛି"</string>
+ <string name="sum_cfnry_disabled" msgid="1990563512406017880">"ଅଫ୍ ଅଛି"</string>
<string name="disable_cfnry_forbidden" msgid="3174731413216550689">"ଆପଣଙ୍କର ଫୋନ୍ ଉତ୍ତର ଦେଇନପାରିବାବେଳେ ଆପଣଙ୍କର ଅପରେଟର୍ କଲ୍ ଫର୍ୱାର୍ଡିଙ୍ଗକୁ ଅକ୍ଷମ କରିବାରେ ସପୋର୍ଟ କରିବେ ନାହିଁ।"</string>
<string name="labelCFNRc" msgid="4163399350778066013">"ଅପହଞ୍ଚ ଦୂରତାରେ ଥିବା ବେଳେ"</string>
<string name="messageCFNRc" msgid="6980340731313007250">"ଅପହଞ୍ଚ ଦୂରତାରେ ଥିବା ବେଳେ ନମ୍ବର୍"</string>
<string name="sum_cfnrc_enabled" msgid="1799069234006073477">"<xliff:g id="PHONENUMBER">{0}</xliff:g>କୁ ଫରୱାର୍ଡ କରାଯାଉଛି"</string>
- <string name="sum_cfnrc_disabled" msgid="739289696796917683">"ବନ୍ଦ ଅଛି"</string>
+ <string name="sum_cfnrc_disabled" msgid="739289696796917683">"ଅଫ୍ ଅଛି"</string>
<string name="disable_cfnrc_forbidden" msgid="775348748084726890">"ଆପଣଙ୍କର ଫୋନ୍ ଅପହଞ୍ଚ ଦୂରତାରେ ଥିବାବେଳେ ଆପଣଙ୍କର କେରିଅର୍ କଲ୍ ଫର୍ୱାର୍ଡିଙ୍ଗକୁ ଅକ୍ଷମ କରିବାରେ ସପୋର୍ଟ କରିବେ ନାହିଁ।"</string>
- <string name="updating_title" msgid="6130548922615719689">"କଲ୍ ସେଟିଂସ୍"</string>
+ <string name="updating_title" msgid="6130548922615719689">"କଲ୍ ସେଟିଙ୍ଗ"</string>
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"କଲ୍ ସେଟିଙ୍ଗକୁ କେବଳ ଆଡମିନ୍ ୟୁଜର୍ ବଦଳାଇପାରିବେ।"</string>
<string name="call_settings_with_label" msgid="8460230435361579511">"ସେଟିଙ୍ଗ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"କଲ୍ ସେଟିଙ୍ଗରେ ତ୍ରୁଟି"</string>
- <string name="reading_settings" msgid="1605904432450871183">"ସେଟିଂସକୁ ପଢ଼ାଯାଉଛି…"</string>
- <string name="updating_settings" msgid="3650396734816028808">"ସେଟିଂସ୍ ଅପଡେଟ୍ ହେଉଛି…"</string>
+ <string name="reading_settings" msgid="1605904432450871183">"ସେଟିଙ୍ଗକୁ ପଢ଼ାଯାଉଛି…"</string>
+ <string name="updating_settings" msgid="3650396734816028808">"ସେଟିଙ୍ଗ ଅପଡେଟ୍ ହେଉଛି…"</string>
<string name="reverting_settings" msgid="7378668837291012205">"ସେଟିଙ୍ଗକୁ ଫେରାଇଅଣାଯାଉଛି…"</string>
<string name="response_error" msgid="3904481964024543330">"ନେଟ୍ୱର୍କରୁ ଆଶା କରାଯାଇନଥିବା ଉତ୍ତର ମିଳିଲା।"</string>
<string name="exception_error" msgid="330994460090467">"ନେଟ୍ୱର୍କ କିମ୍ବା SIM କାର୍ଡରେ ତ୍ରୁଟି।"</string>
@@ -288,7 +288,7 @@
<string name="limited_sim_function_notification_message" msgid="5338638075496721160">"ଅନ୍ୟ SIM ବ୍ୟବହାର କରିବା ସମୟରେ <xliff:g id="CARRIER_NAME">%1$s</xliff:g> କଲ୍ ଏବଂ ଡାଟା ସେବାଗୁଡ଼ିକ ବ୍ଲକ୍ କରାଯାଇପାରେ।"</string>
<string name="data_usage_title" msgid="8438592133893837464">"ଆପ୍ ଦ୍ୱାରା ଡାଟା ବ୍ୟବହାର"</string>
<string name="data_usage_template" msgid="6287906680674061783">"<xliff:g id="ID_2">%2$s</xliff:g>ରେ <xliff:g id="ID_1">%1$s</xliff:g> ମୋବାଇଲ୍ ଡାଟା ବ୍ୟବହାର କରାଯାଇଛି"</string>
- <string name="advanced_options_title" msgid="9208195294513520934">"ଉନ୍ନତ"</string>
+ <string name="advanced_options_title" msgid="9208195294513520934">"ଆଧୁନିକ"</string>
<string name="carrier_settings_euicc" msgid="1190237227261337749">"ନେଟୱର୍କ କ୍ୟାରିଅର"</string>
<string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"ମୋବାଇଲ୍ ଓ ଇଣ୍ଟରନେଟ୍ ସେବା ପ୍ରଦାନକାରୀ କମ୍ପାନୀ, ଇସିମ୍, ସିମ୍, euicc, ମୋବାଇଲ୍ ଓ ଇଣ୍ଟରନେଟ୍ ସେବା ପ୍ରଦାନକାରୀ କମ୍ପାନୀକୁ ସ୍ଵିଚ୍ କରନ୍ତୁ, ମୋବାଇଲ୍ ଓ ଇଣ୍ଟରନେଟ୍ ସେବା ପ୍ରଦାନକାରୀ କମ୍ପାନୀକୁ ଯୋଡ଼ନ୍ତୁ"</string>
<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>
@@ -298,7 +298,7 @@
<string name="sim_selection_required_pref" msgid="6985901872978341314">"ମନୋନୟନ ଆବଶ୍ୟକ"</string>
<string name="sim_change_data_title" msgid="9142726786345906606">"ଡାଟା ସିମ୍ ବଦଳାଇବେ?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"ମୋବାଇଲ୍ ଡାଟା ପାଇଁ <xliff:g id="OLD_SIM">%2$s</xliff:g> ବଦଳରେ <xliff:g id="NEW_SIM">%1$s</xliff:g> ବ୍ୟବହାର କରିବେ?"</string>
- <string name="wifi_calling_settings_title" msgid="5800018845662016507">"ୱାଇ-ଫାଇ କଲିଂ"</string>
+ <string name="wifi_calling_settings_title" msgid="5800018845662016507">"ୱାଇ-ଫାଇ କଲିଙ୍ଗ"</string>
<string name="video_calling_settings_title" msgid="342829454913266078">"କେରିଅର୍ ଭିଡିଓ କଲିଙ୍ଗ"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"GSM/UMTS ବିକଳ୍ପ"</string>
<string name="cdma_options" msgid="3669592472226145665">"CDMA ବିକଳ୍ପ"</string>
@@ -426,7 +426,7 @@
<string name="cdma_lte_data_service" msgid="359786441782404562">"ଡାଟା ସେବାକୁ ସେଟଅପ୍ କରନ୍ତୁ"</string>
<string name="carrier_settings_title" msgid="6292869148169850220">"କେରିଅର୍ ସେଟିଙ୍ଗ"</string>
<string name="fdn" msgid="2545904344666098749">"ଫିକ୍ସଡ୍ ଡାଏଲିଙ୍ଗ ନମ୍ବର୍"</string>
- <string name="fdn_with_label" msgid="6412087553365709494">"ଫିକ୍ସଡ୍ ଡାଏଲିଂ ନମ୍ବର୍ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+ <string name="fdn_with_label" msgid="6412087553365709494">"ଫିକ୍ସଡ୍ ଡାଏଲିଙ୍ଗ ନମ୍ବର୍ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="manage_fdn_list" msgid="3341716430375195441">"FDN ତାଲିକା"</string>
<string name="fdn_list_with_label" msgid="1409655283510382556">"FDN ତାଲିକା (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="fdn_activation" msgid="2178637004710435895">"FDNକୁ ସକ୍ରିୟ କରିବା"</string>
@@ -546,7 +546,7 @@
<string name="emergency_information_hint" msgid="9208897544917793012">"ଜରୁରୀକାଳୀନ ସୂଚନା"</string>
<string name="emergency_information_owner_hint" msgid="6256909888049185316">"ମାଲିକ"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"ସୂଚନା ଦେଖିବାକୁ ପୁଣିଥରେ ଟାପ୍ କରନ୍ତୁ"</string>
- <string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"ଜରୁରୀକାଳୀନ କଲ୍"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"ଜରୁରୀକାଳିନ କଲ୍"</string>
<string name="single_emergency_number_title" msgid="8413371079579067196">"ଜରୁରୀକାଳୀନ ନମ୍ବର୍"</string>
<string name="numerous_emergency_numbers_title" msgid="8972398932506755510">"ଜରୁରୀକାଳୀନ ନମ୍ବର୍"</string>
<string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"<xliff:g id="EMERGENCY_NUMBER">%s</xliff:g>ରେ କଲ୍ କରନ୍ତୁ"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"ହଁ"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"ନାହିଁ"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"ଖାରଜ କରନ୍ତୁ"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ଫୋନଟି ଜରୁରୀକାଳୀନ କଲବ୍ୟାକ୍ ମୋଡରେ ଅଛି"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> ପର୍ଯ୍ୟନ୍ତ"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">ଫୋନଟି <xliff:g id="COUNT_1">%s</xliff:g> ମିନିଟ୍ ପାଇଁ ଜରୁରୀକାଳୀନ କଲବ୍ୟାକ୍ ମୋଡରେ ରହିବ।\nଆପଣ ବର୍ତ୍ତମାନ ବାହାରି ଯିବାକୁ ଚାହାଁନ୍ତି କି?</item>
- <item quantity="one">ଫୋନଟି <xliff:g id="COUNT_0">%s</xliff:g> ମିନିଟ୍ ପାଇଁ ଜରୁରୀକାଳୀନ କଲବ୍ୟାକ୍ ମୋଡରେ ରହିବ।\nଆପଣ ବର୍ତ୍ତମାନ ବାହାରି ଯିବାକୁ ଚାହାଁନ୍ତି କି?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"ସେବା"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"ସେଟଅପ୍ କରନ୍ତୁ"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<ସେଟ୍ ହୋଇନାହିଁ>"</string>
@@ -879,7 +873,7 @@
<string name="radio_info_current_network_label" msgid="3052098695239642450">"ବର୍ତ୍ତମାନର ନେଟ୍ୱାର୍କ:"</string>
<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_signal_strength_label" msgid="5545444702102543260">"ସିଗ୍ନାଲ୍ ଶକ୍ତି:"</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>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"ରିଫ୍ରେସ୍ କରନ୍ତୁ"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS ଯାଞ୍ଚ ଟୋଗଲ୍ କରନ୍ତୁ"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-ନିର୍ଦ୍ଦିଷ୍ଟ ସୂଚନା/ସେଟିଂସ୍"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC ଉପଲବ୍ଧ:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR ପ୍ରତିବନ୍ଧିତ:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR ଉପଲବ୍ଧ:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR ସ୍ଥିତି:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR ଫ୍ରିକ୍ୱେନ୍ସୀ:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"ରେଡିଓ ବ୍ୟାଣ୍ଡ ମୋଡ୍ ସେଟ୍ କରନ୍ତୁ"</string>
<string name="band_mode_loading" msgid="795923726636735967">"ବ୍ୟାଣ୍ଡ ତାଲିକା ଲୋଡ୍ କରାଯାଉଛି…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"ସେଟ୍ କରନ୍ତୁ"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 7e166eb..65df16f 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"ਹਾਂ"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"ਨਹੀਂ"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"ਖਾਰਜ ਕਰੋ"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ਫ਼ੋਨ ਸੰਕਟਕਾਲੀਨ ਕਾਲ ਮੋਡ ਵਿੱਚ ਹੈ"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> ਤੱਕ"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">ਫ਼ੋਨ <xliff:g id="COUNT_1">%s</xliff:g> ਮਿੰਟ ਲਈ ਸੰਕਟਕਾਲੀਨ ਕਾਲ ਮੋਡ ਵਿੱਚ ਹੋਵੇਗਾ।\nਕੀ ਤੁਸੀਂ ਹੁਣ ਬਾਹਰ ਜਾਣਾ ਚਾਹੁੰਦੇ ਹੋ?</item>
- <item quantity="other">ਫ਼ੋਨ <xliff:g id="COUNT_1">%s</xliff:g> ਮਿੰਟਾਂ ਲਈ ਸੰਕਟਕਾਲੀਨ ਕਾਲ ਮੋਡ ਵਿੱਚ ਹੋਵੇਗਾ।\nਕੀ ਤੁਸੀਂ ਹੁਣ ਬਾਹਰ ਜਾਣਾ ਚਾਹੁੰਦੇ ਹੋ?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"ਸੇਵਾ"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"ਸੈੱਟਅੱਪ ਕਰੋ"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"ਰਿਫ੍ਰੈਸ਼ ਕਰੋ"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS ਜਾਂਚ ਟੌਗਲ ਕਰੋ"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-ਵਿਸ਼ੇਸ਼ ਜਾਣਕਾਰੀ/ਸੈਟਿੰਗਾਂ"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC ਉਪਲਬਧ:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR ਪ੍ਰਤਿਬੰਧਿਤ:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR ਉਪਲਬਧ:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR ਸਥਿਤੀ:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR ਵਾਰਵਾਰਤਾ:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"ਰੇਡੀਓ ਬੈਂਡ ਮੋਡ ਸੈੱਟ ਕਰੋ"</string>
<string name="band_mode_loading" msgid="795923726636735967">"ਬੈਂਡ ਸੂਚੀ ਲੋਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"ਸੈੱਟ ਕਰੋ"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index b0044e4..5d4131b 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Okres użycia danych"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Zasada prędkości przesyłu danych"</string>
<string name="throttle_help" msgid="2624535757028809735">"Więcej informacji"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) z <xliff:g id="USED_2">%3$s</xliff:g> (wartość maksymalna w okresie)\nNastępny okres za <xliff:g id="USED_3">%4$d</xliff:g> dni (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) z <xliff:g id="USED_2">%3$s</xliff:g> (wartość maksymalna w okresie)\nNastępny okres za: <xliff:g id="USED_3">%4$d</xliff:g> dni (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) z <xliff:g id="USED_2">%3$s</xliff:g> (wartość maksymalna w okresie)"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"Przekroczono limit: <xliff:g id="USED_0">%1$s</xliff:g>\nSzybkość transmisji zmniejszona do <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"Minęło <xliff:g id="USED_0">%1$d</xliff:g>٪ cyklu\nNastępny okres za: <xliff:g id="USED_1">%2$d</xliff:g> dni (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -641,14 +641,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Tak"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Nie"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Zamknij"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefon jest w trybie alarmowego połączenia zwrotnego"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Do <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="few">Telefon będzie w trybie alarmowego połączenia zwrotnego przez <xliff:g id="COUNT_1">%s</xliff:g> minuty.\nCzy chcesz teraz zakończyć ten tryb?</item>
- <item quantity="many">Telefon będzie w trybie alarmowego połączenia zwrotnego przez <xliff:g id="COUNT_1">%s</xliff:g> minut.\nCzy chcesz teraz zakończyć ten tryb?</item>
- <item quantity="other">Telefon będzie w trybie alarmowego połączenia zwrotnego przez <xliff:g id="COUNT_1">%s</xliff:g> minuty.\nCzy chcesz teraz zakończyć ten tryb?</item>
- <item quantity="one">Telefon będzie w trybie alarmowego połączenia zwrotnego przez <xliff:g id="COUNT_0">%s</xliff:g> minutę.\nCzy chcesz teraz zakończyć ten tryb?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Dostawca"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Konfiguracja"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Nie ustawiono>"</string>
@@ -695,7 +687,7 @@
<string name="change_pin_enter_new_pin_header" msgid="4739465616733486118">"Ustaw nowy kod PIN"</string>
<string name="change_pin_enter_new_pin_hint" msgid="2326038476516364210">"Kod PIN musi zawierać od <xliff:g id="MIN">%1$d</xliff:g> do <xliff:g id="MAX">%2$d</xliff:g> cyfr."</string>
<string name="change_pin_confirm_pin_header" msgid="2606303906320705726">"Potwierdź kod PIN"</string>
- <string name="change_pin_confirm_pins_dont_match" msgid="305164501222587215">"Kody PIN nie są takie same"</string>
+ <string name="change_pin_confirm_pins_dont_match" msgid="305164501222587215">"Kody PIN nie są identyczne."</string>
<string name="change_pin_succeeded" msgid="2504705600693014403">"Kod PIN poczty głosowej został zaktualizowany."</string>
<string name="change_pin_system_error" msgid="7772788809875146873">"Nie udało się ustawić kodu PIN"</string>
<string name="mobile_data_status_roaming_turned_off_subtext" msgid="6840673347416227054">"Transmisja danych w roamingu jest wyłączona"</string>
@@ -904,11 +896,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Odśwież"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Przełącz sprawdzanie DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Informacje/ustawienia specyficzne dla producenta OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Dostępne EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Ograniczenie DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Dostępne NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Stan NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Częstotliwość NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Ustawianie trybu pasma radiowego"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Ładuję listę pasm…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Ustaw"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 8cbe585..41b01ad 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -95,10 +95,10 @@
<string name="sum_loading_settings" msgid="434063780286688775">"A carregar as definições..."</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"Ocultar o número em chamadas efectuadas"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Número apresentado em chamadas efectuadas"</string>
- <string name="sum_default_caller_id" msgid="1767070797135682959">"Utilizar as predefinições do operador para apresentar o meu número nas chamadas efetuadas"</string>
+ <string name="sum_default_caller_id" msgid="1767070797135682959">"Utilizar as predefinições do operador para apresentar o meu número nas chamadas efectuadas"</string>
<string name="labelCW" msgid="8449327023861428622">"Chamada em espera"</string>
- <string name="sum_cw_enabled" msgid="3977308526187139996">"Notificar-me de chamadas em espera durante uma chamada"</string>
- <string name="sum_cw_disabled" msgid="3658094589461768637">"Notificar-me de chamadas em espera durante uma chamada"</string>
+ <string name="sum_cw_enabled" msgid="3977308526187139996">"Notificar-me de chamadas a receber durante uma chamada"</string>
+ <string name="sum_cw_disabled" msgid="3658094589461768637">"Notificar-me de chamadas a receber durante uma chamada"</string>
<string name="call_forwarding_settings" msgid="8937130467468257671">"Definições do encaminhamento de chamadas"</string>
<string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"Definições de encaminhamento de chamadas (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"Encaminhamento de chamadas"</string>
@@ -136,7 +136,7 @@
<string name="stk_cc_ss_to_ussd_error" msgid="8330749347425752192">"Pedido SS alterado para um novo pedido USSD"</string>
<string name="stk_cc_ss_to_ss_error" msgid="8297155544652134278">"Foi alterado para um novo pedido SS"</string>
<string name="stk_cc_ss_to_dial_video_error" msgid="4255261231466032505">"O pedido SS foi alterado para uma videochamada"</string>
- <string name="fdn_check_failure" msgid="1833769746374185247">"A definição Números Autorizados da app do seu Telemóvel está ativada. Por conseguinte, algumas funcionalidades relacionadas com chamadas não estão a funcionar."</string>
+ <string name="fdn_check_failure" msgid="1833769746374185247">"A definição Números Autorizados da aplicação do seu Telemóvel está ativada. Por conseguinte, algumas funcionalidades relacionadas com chamadas não estão a funcionar."</string>
<string name="radio_off_error" msgid="8321564164914232181">"Ative o rádio antes de visualizar estas definições."</string>
<string name="close_dialog" msgid="1074977476136119408">"OK"</string>
<string name="enable" msgid="2636552299455477603">"Ativar"</string>
@@ -286,7 +286,7 @@
<string name="limited_sim_function_notification_title" msgid="612715399099846281">"Funcionalidade de SIM limitada"</string>
<string name="limited_sim_function_with_phone_num_notification_message" msgid="5928988883403677610">"As chamadas e os serviços de dados da <xliff:g id="CARRIER_NAME">%1$s</xliff:g> podem ficar bloqueados ao utilizar o número <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>."</string>
<string name="limited_sim_function_notification_message" msgid="5338638075496721160">"As chamadas e serviços de dados da <xliff:g id="CARRIER_NAME">%1$s</xliff:g> podem ser bloqueados se utilizar outro SIM."</string>
- <string name="data_usage_title" msgid="8438592133893837464">"Utilização de dados da app"</string>
+ <string name="data_usage_title" msgid="8438592133893837464">"Utilização de dados da aplicação"</string>
<string name="data_usage_template" msgid="6287906680674061783">"<xliff:g id="ID_1">%1$s</xliff:g> de dados móveis utilizados entre <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="advanced_options_title" msgid="9208195294513520934">"Avançadas"</string>
<string name="carrier_settings_euicc" msgid="1190237227261337749">"Operador"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Sim"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Não"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Ignorar"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"O telemóvel está no modo de chamada de retorno de emergência."</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Até à(s) <xliff:g id="COMPLETETIME">%s</xliff:g>."</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">O telemóvel ficará no modo de chamada de retorno de emergência durante <xliff:g id="COUNT_1">%s</xliff:g> minutos.\nPretende sair agora?</item>
- <item quantity="one">O telemóvel ficará no modo de chamada de retorno de emergência durante <xliff:g id="COUNT_0">%s</xliff:g> minuto.\nPretende sair agora?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Serviço"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Configuração"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Não definido>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Atualizar"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Ativar/desativar verificação de DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Informações/definições específicas de OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC disponível:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR restrito:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR disponível:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Estado NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frequência NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Definir modo de banda de rádio"</string>
<string name="band_mode_loading" msgid="795923726636735967">"A carregar lista de bandas…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Definir"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 2d44e3c..3fd76d4 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -91,14 +91,14 @@
<string name="additional_cdma_call_settings" msgid="2178016561980611304">"Configurações de chamada CDMA adicionais"</string>
<string name="sum_cdma_call_settings" msgid="3185825305136993636">"Configurações adicionais somente de chamada CDMA"</string>
<string name="labelNwService" msgid="6015891883487125120">"Configurações do serviço de rede"</string>
- <string name="labelCallerId" msgid="2090540744550903172">"Identificador de chamadas"</string>
+ <string name="labelCallerId" msgid="2090540744550903172">"ID da chamada"</string>
<string name="sum_loading_settings" msgid="434063780286688775">"Carregando configurações…"</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"Número oculto nas chamadas enviadas"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Número exibido nas chamadas enviadas"</string>
- <string name="sum_default_caller_id" msgid="1767070797135682959">"Usar configurações padrão da operadora para exibir meu número em chamadas realizadas"</string>
+ <string name="sum_default_caller_id" msgid="1767070797135682959">"Usar configurações padrão da operadora para exibir meu número em chamadas efetuadas"</string>
<string name="labelCW" msgid="8449327023861428622">"Chamada em espera"</string>
- <string name="sum_cw_enabled" msgid="3977308526187139996">"Notificar sobre outras chamadas recebidas durante uma ligação"</string>
- <string name="sum_cw_disabled" msgid="3658094589461768637">"Notificar sobre outras chamadas recebidas durante uma ligação"</string>
+ <string name="sum_cw_enabled" msgid="3977308526187139996">"Notificar sobre a entrada de outras chamadas durante uma ligação"</string>
+ <string name="sum_cw_disabled" msgid="3658094589461768637">"Notificar sobre a entrada de outras chamadas durante uma ligação"</string>
<string name="call_forwarding_settings" msgid="8937130467468257671">"Configurações de encaminhamento de chamada"</string>
<string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"Configurações de encaminhamento de chamada (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"Encaminhamento de chamada"</string>
@@ -136,7 +136,7 @@
<string name="stk_cc_ss_to_ussd_error" msgid="8330749347425752192">"Solicitação SS alterada para solicitação USSD"</string>
<string name="stk_cc_ss_to_ss_error" msgid="8297155544652134278">"Alterada para uma nova solicitação SS"</string>
<string name="stk_cc_ss_to_dial_video_error" msgid="4255261231466032505">"Solicitação SS alterada para videochamada"</string>
- <string name="fdn_check_failure" msgid="1833769746374185247">"A configuração \"N fixa\" do seu app Telefone está ativada. Por isso, alguns recursos relacionados a chamadas não funcionam."</string>
+ <string name="fdn_check_failure" msgid="1833769746374185247">"A configuração \"Números de discagem fixa\" do seu app Telefone está ativada. Por isso, alguns recursos relacionados a chamadas não funcionam."</string>
<string name="radio_off_error" msgid="8321564164914232181">"Ligue o rádio antes de ver essas configurações."</string>
<string name="close_dialog" msgid="1074977476136119408">"OK"</string>
<string name="enable" msgid="2636552299455477603">"Ativar"</string>
@@ -425,8 +425,8 @@
<string name="cdma_activate_device" msgid="5914720276140097632">"Ativar aparelho"</string>
<string name="cdma_lte_data_service" msgid="359786441782404562">"Configurar serviço de dados"</string>
<string name="carrier_settings_title" msgid="6292869148169850220">"Config. da operadora"</string>
- <string name="fdn" msgid="2545904344666098749">"N fixa"</string>
- <string name="fdn_with_label" msgid="6412087553365709494">"N fixa (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+ <string name="fdn" msgid="2545904344666098749">"Números de discagem fixa"</string>
+ <string name="fdn_with_label" msgid="6412087553365709494">"Números de discagem fixa (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="manage_fdn_list" msgid="3341716430375195441">"Lista FDN"</string>
<string name="fdn_list_with_label" msgid="1409655283510382556">"Lista de FDNs (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="fdn_activation" msgid="2178637004710435895">"Ativação do FDN"</string>
@@ -508,9 +508,9 @@
<string name="pin2_error_exception" msgid="8116103864600823641">"Erro de rede ou do chip"</string>
<string name="doneButton" msgid="7371209609238460207">"Concluído"</string>
<string name="voicemail_settings_number_label" msgid="1265118640154688162">"Número correio de voz"</string>
- <string name="card_title_dialing" msgid="8742182654254431781">"Chamando..."</string>
+ <string name="card_title_dialing" msgid="8742182654254431781">"Discando"</string>
<string name="card_title_redialing" msgid="18130232613559964">"Rediscando"</string>
- <string name="card_title_conf_call" msgid="901197309274457427">"Teleconferência"</string>
+ <string name="card_title_conf_call" msgid="901197309274457427">"teleconferência"</string>
<string name="card_title_incoming_call" msgid="881424648458792430">"Recebendo chamada"</string>
<string name="card_title_call_ended" msgid="650223980095026340">"Chamada encerrada"</string>
<string name="card_title_on_hold" msgid="9028319436626975207">"Em espera"</string>
@@ -554,7 +554,7 @@
<string name="emergency_enable_radio_dialog_retry" msgid="4329131876852608587">"Sem serviço. Tentando novamente..."</string>
<string name="radio_off_during_emergency_call" msgid="8011154134040481609">"Não é possível usar o modo avião durante uma chamada de emergência."</string>
<string name="dial_emergency_error" msgid="825822413209026039">"Não é possível realizar chamadas. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> não é um telefone de emergência."</string>
- <string name="dial_emergency_empty_error" msgid="2785803395047793634">"Não é possível realizar chamadas. Ligue para o número de telefone de emergência."</string>
+ <string name="dial_emergency_empty_error" msgid="2785803395047793634">"Não é possível realizar chamadas. Disque o número de telefone de emergência."</string>
<string name="dial_emergency_calling_not_available" msgid="6485846193794727823">"Chamada de emergência indisponível"</string>
<string name="pin_puk_system_user_only" msgid="1045147220686867922">"Somente o proprietário do dispositivo pode digitar os códigos PIN/PUK."</string>
<string name="police_type_description" msgid="2819533883972081757">"Polícia"</string>
@@ -572,7 +572,7 @@
<string name="onscreenManageCallsText" msgid="1162047856081836469">"Gerenciar chamadas"</string>
<string name="onscreenManageConferenceText" msgid="4700574060601755137">"Gerenciar conferência"</string>
<string name="onscreenAudioText" msgid="7224226735052019986">"Áudio"</string>
- <string name="onscreenVideoCallText" msgid="1743992456126258698">"Vídeo"</string>
+ <string name="onscreenVideoCallText" msgid="1743992456126258698">"Videocham."</string>
<string name="importSimEntry" msgid="3892354284082689894">"Importar"</string>
<string name="importAllSimEntries" msgid="2628391505643564007">"Importar tudo"</string>
<string name="importingSimContacts" msgid="4995457122107888932">"Importando contatos do chip"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Sim"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Não"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Descartar"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"O smartphone está no modo de retorno de chamada de emergência"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Até <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">O smartphone ficará no modo de retorno de chamada de emergência por <xliff:g id="COUNT_1">%s</xliff:g> minuto.\nVocê quer sair agora?</item>
- <item quantity="other">O smartphone ficará no modo de retorno de chamada de emergência por <xliff:g id="COUNT_1">%s</xliff:g> minutos.\nVocê quer sair agora?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Serviço"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Configuração"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Não definido>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Atualizar"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Ativar/desativar verificação do DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Informações/configurações específicas de OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC disponível:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR restrita:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR disponível:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Estado do NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frequência do NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Definir modo de banda de rádio"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Carregando a lista de bandas…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Definir"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 35ee855..1b1f1b7 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -639,13 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Da"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Nu"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Renunțați"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefonul va fi în modul Apelare inversă de urgență"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Până la <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="few">Telefonul va fi în modul Apelare inversă de urgență timp de <xliff:g id="COUNT_1">%s</xliff:g> minute.\nDoriți să ieșiți acum?</item>
- <item quantity="other">Telefonul va fi în modul Apelare inversă de urgență timp de <xliff:g id="COUNT_1">%s</xliff:g> de minute.\nDoriți să ieșiți acum?</item>
- <item quantity="one">Telefonul va fi în modul Apelare inversă de urgență timp de <xliff:g id="COUNT_0">%s</xliff:g> minut.\nDoriți să ieșiți acum?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Serviciu"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Configurare"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Nesetat>"</string>
@@ -901,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Actualizați"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Activați/dezactivați verificarea DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Informații/Setări caracteristice OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Disponibilă EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Restricționată DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Disponibilă NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Stare NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frecvență NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Setați Modul bandă radio"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Se încarcă lista de benzi…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Setați"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index a7980bf..8086351 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -96,7 +96,7 @@
<string name="sum_hide_caller_id" msgid="131100328602371933">"Скрывать номер при исходящих вызовах"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Номер, отображающийся при исходящих вызовах"</string>
<string name="sum_default_caller_id" msgid="1767070797135682959">"Использовать стандартные настройки оператора для показа моего номера при исходящих вызовах"</string>
- <string name="labelCW" msgid="8449327023861428622">"Ожидание вызова"</string>
+ <string name="labelCW" msgid="8449327023861428622">"Параллельный вызов"</string>
<string name="sum_cw_enabled" msgid="3977308526187139996">"Извещать меня о входящих вызовах во время разговора"</string>
<string name="sum_cw_disabled" msgid="3658094589461768637">"Извещать меня о входящих вызовах во время разговора"</string>
<string name="call_forwarding_settings" msgid="8937130467468257671">"Переадресация"</string>
@@ -310,7 +310,9 @@
<string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) из <xliff:g id="USED_2">%3$s</xliff:g> (максимум)\nСледующий период начнется в течение <xliff:g id="USED_3">%4$d</xliff:g> дн. (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) из <xliff:g id="USED_2">%3$s</xliff:g> (максимум)"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"Превышен лимит в <xliff:g id="USED_0">%1$s</xliff:g>.\nСкорость передачи данных снижена до <xliff:g id="USED_1">%2$d</xliff:g> кбит/с."</string>
- <string name="throttle_time_frame_subtext" msgid="6462089615392402127">"Пройдено: <xliff:g id="USED_0">%1$d</xliff:g>٪ цикла.\nСледующий период начнется через <xliff:g id="USED_1">%2$d</xliff:g> дн. (<xliff:g id="USED_2">%3$s</xliff:g>)."</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_time_frame_subtext (6462089615392402127) -->
+ <skip />
<string name="throttle_rate_subtext" msgid="7221971817325779535">"Превышение лимита снижает скорость передачи данных до <xliff:g id="USED">%1$d</xliff:g> кбит/с"</string>
<string name="throttle_help_subtext" msgid="2817114897095534807">"Подробнее о политике передачи данных вашего оператора мобильной связи..."</string>
<string name="cell_broadcast_sms" msgid="4053449797289031063">"Широковещательные SMS-службы"</string>
@@ -641,14 +643,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Да"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Нет"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Закрыть"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Телефон находится в режиме экстренных обратных вызовов"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"До <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Телефон будет оставаться в режиме экстренных обратных вызовов <xliff:g id="COUNT_1">%s</xliff:g> минуту.\nВыйти сейчас?</item>
- <item quantity="few">Телефон будет оставаться в режиме экстренных обратных вызовов <xliff:g id="COUNT_1">%s</xliff:g> минуты.\nВыйти сейчас?</item>
- <item quantity="many">Телефон будет оставаться в режиме экстренных обратных вызовов <xliff:g id="COUNT_1">%s</xliff:g> минут.\nВыйти сейчас?</item>
- <item quantity="other">Телефон будет оставаться в режиме экстренных обратных вызовов <xliff:g id="COUNT_1">%s</xliff:g> минуты.\nВыйти сейчас?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Служба"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Настройка"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Не задано>"</string>
@@ -904,11 +898,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Обновить"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Включить/отключить проверку DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Информация/настройки OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC доступно:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR ограничено:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR доступно:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Состояние NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Частота NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Настроить режим сети"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Загрузка списка частот…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Сохранить"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 45850c8..e92c865 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"ඔව්"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"නැත"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"ඉවතලන්න"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"දුරකථනය හදිසි පසු ඇමතුම් ප්රකාරයේ ඇත"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> තෙක්"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">දුරකථනය මිනිත්තු <xliff:g id="COUNT_1">%s</xliff:g>ක් තිස්සේ හදිසි පසු ඇමතුම් ප්රකාරයේ තිබෙනු ඇත.\nදැන් ඔබට පිටවීමට අවශ්යද?</item>
- <item quantity="other">දුරකථනය මිනිත්තු <xliff:g id="COUNT_1">%s</xliff:g>ක් තිස්සේ හදිසි පසු ඇමතුම් ප්රකාරයේ තිබෙනු ඇත.\nදැන් ඔබට පිටවීමට අවශ්යද?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"සේවාව"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"ස්ථාපනය කරන්න"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<පිහිටුවා නැත>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"නැවුම් කරන්න"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS පරීක්ෂාව ටොගල කරන්න"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-විශේෂිත තොරතුරු/සැකසීම්"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC ලබා ගත හැකි:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR සීමා කළ:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR ලබා ගත හැකි:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR තත්ත්වය:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR සංඛ්යාතය:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"රේඩියෝ කලාප ප්රකාරය සකසන්න"</string>
<string name="band_mode_loading" msgid="795923726636735967">"කලාප ලැයිස්තුව පූරණය කරමින්…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"සකසන්න"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 5436158..e38b635 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -127,7 +127,7 @@
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"Nastavenia hovorov môže zmeniť iba používateľ s povoleniami správcu."</string>
<string name="call_settings_with_label" msgid="8460230435361579511">"Nastavenia (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"Chyba nastavení hovorov"</string>
- <string name="reading_settings" msgid="1605904432450871183">"Nastavenia sa načítavajú…"</string>
+ <string name="reading_settings" msgid="1605904432450871183">"Nastavenia sa načítajú…"</string>
<string name="updating_settings" msgid="3650396734816028808">"Prebieha aktualizácia nastavení..."</string>
<string name="reverting_settings" msgid="7378668837291012205">"Prebieha vrátenie predchádzajúcich nastavení…"</string>
<string name="response_error" msgid="3904481964024543330">"Neočakávaná odpoveď siete."</string>
@@ -171,7 +171,7 @@
<string name="network_query_error" msgid="3862515805115145124">"Nepodarilo sa nájsť siete. Skúste to znova."</string>
<string name="register_on_network" msgid="4194770527833960423">"Prebieha registrácia v sieti <xliff:g id="NETWORK">%s</xliff:g>..."</string>
<string name="not_allowed" msgid="8541221928746104798">"Vaša SIM karta nepovoľuje pripojenie k tejto sieti."</string>
- <string name="connect_later" msgid="1950138106010005425">"V tejto chvíli sa nedá pripojiť k sieti. Skúste to neskôr."</string>
+ <string name="connect_later" msgid="1950138106010005425">"V tejto chvíli sa nedá pripojiť k sieti. Skúste to znova neskôr."</string>
<string name="registration_done" msgid="5337407023566953292">"Prihlásenie k sieti prebehlo úspešne."</string>
<string name="already_auto" msgid="8607068290733079336">"Už v automatickom výbere"</string>
<string name="select_automatically" msgid="779750291257872651">"Vybrať sieť automaticky"</string>
@@ -641,14 +641,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Áno"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Nie"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Zatvoriť"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefón je v režime tiesňového spätného volania"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Do <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="few">Telefón bude v režime tiesňového spätného volania <xliff:g id="COUNT_1">%s</xliff:g> minúty.\nChcete tento režim ukončiť?</item>
- <item quantity="many">Telefón bude v režime tiesňového spätného volania <xliff:g id="COUNT_1">%s</xliff:g> minúty.\nChcete tento režim ukončiť?</item>
- <item quantity="other">Telefón bude v režime tiesňového spätného volania <xliff:g id="COUNT_1">%s</xliff:g> minút.\nChcete tento režim ukončiť?</item>
- <item quantity="one">Telefón bude v režime tiesňového spätného volania <xliff:g id="COUNT_0">%s</xliff:g> minútu.\nChcete tento režim ukončiť?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Služba"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Nastavenie"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Nenastavené>"</string>
@@ -904,11 +896,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Obnoviť"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Prepnúť kontrolu DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Informácie alebo nastavenia špecifické pre výrobcu OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Dostupné EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Obmedzené DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Dostupné NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Stav NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frekvencia NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Nastaviť režim rádiového pásma"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Načítava sa zoznam pásiem…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Nastaviť"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 40a54b3..0ee96d6 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -641,14 +641,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Da"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Ne"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Opusti"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefon je v načinu za povratni klic v sili"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Do <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Telefon bo v načinu za povratni klic v sili čez <xliff:g id="COUNT_1">%s</xliff:g> minuto.\nAli želite zapustiti ta način?</item>
- <item quantity="two">Telefon bo v načinu za povratni klic v sili čez <xliff:g id="COUNT_1">%s</xliff:g> minuti.\nAli želite zapustiti ta način?</item>
- <item quantity="few">Telefon bo v načinu za povratni klic v sili čez <xliff:g id="COUNT_1">%s</xliff:g> minute.\nAli želite zapustiti ta način?</item>
- <item quantity="other">Telefon bo v načinu za povratni klic v sili čez <xliff:g id="COUNT_1">%s</xliff:g> minut.\nAli želite zapustiti ta način?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Storitev"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Nastavitev"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Ni nastavljeno>"</string>
@@ -904,11 +896,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Osveži"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Preklop preverjanja DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Informacije/nastavitve za OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Razpoložljivo za EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Omejeno za DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Razpoložljivo za NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Stanje NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frekvenca NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Nastavljanje načina radijskega območja"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Nalaganje seznama frekvenčnih pasov …"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Nastavi"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 9e37521..e9a245c 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"Konfiguro cilësimet e llogarisë"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"Të gjitha llogaritë e telefonatave"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"Zgjidh se cilat llogari mund të kryejnë telefonata"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"Telefonata me Wi-Fi"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"Telefonatë me Wi-Fi"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"Shërbim i integruar lidhjeje"</string>
<string name="voicemail" msgid="7697769412804195032">"Posta zanore"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"Posta zanore (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Periudha e përdorimit të të dhënave"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Politika e shpejtësisë së të dhënave"</string>
<string name="throttle_help" msgid="2624535757028809735">"Mëso më shumë"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) nga maksimumi i periudhës prej <xliff:g id="USED_2">%3$s</xliff:g>\nPeriudha tjetër fillon për <xliff:g id="USED_3">%4$d</xliff:g> ditë (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) nga maksimumi i periudhës prej <xliff:g id="USED_2">%3$s</xliff:g> \nPeriudha tjetër fillon për <xliff:g id="USED_3">%4$d</xliff:g> ditë (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) nga maksimumi i periudhës prej <xliff:g id="USED_2">%3$s</xliff:g>"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"U kapërcye maksimumi i <xliff:g id="USED_0">%1$s</xliff:g>\nShpejtësia e të dhënave u pakësua deri në <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"Ka kaluar <xliff:g id="USED_0">%1$d</xliff:g>٪ të ciklit\nPeriudha tjetër fillon për <xliff:g id="USED_1">%2$d</xliff:g> ditë (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -506,7 +506,7 @@
<string name="pin2_attempts" msgid="5625178102026453023">\n"Të kanë mbetur edhe <xliff:g id="NUMBER">%d</xliff:g> përpjekje."</string>
<string name="pin2_unblocked" msgid="4481107908727789303">"PIN2-shi nuk është më i bllokuar"</string>
<string name="pin2_error_exception" msgid="8116103864600823641">"Gabim në rrjet ose në kartën SIM"</string>
- <string name="doneButton" msgid="7371209609238460207">"U krye"</string>
+ <string name="doneButton" msgid="7371209609238460207">"U krye!"</string>
<string name="voicemail_settings_number_label" msgid="1265118640154688162">"Numri i postës zanore"</string>
<string name="card_title_dialing" msgid="8742182654254431781">"Po telefonon"</string>
<string name="card_title_redialing" msgid="18130232613559964">"Po riformon numrin"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Po"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Jo"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Injoro"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefoni është në modalitetin e kthimit të telefonatës së urgjencës"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Deri në <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Telefoni do të jetë në modalitetin e kthimit të telefonatës së urgjencës për <xliff:g id="COUNT_1">%s</xliff:g> minuta.\nDëshiron të dalësh tani?</item>
- <item quantity="one">Telefoni do të jetë në modalitetin e kthimit të telefonatës së urgjencës për <xliff:g id="COUNT_0">%s</xliff:g> minutë.\nDëshiron të dalësh tani?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Shërbimi"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Konfigurimi"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<I pavendosur>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Rifresko"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Ndrysho kontrollin e DNS-së"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Informacion/cilësime specifike për OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Ofrohet EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR me kufizime:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Ofrohet NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Gjendja e NR-së:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frekuenca e NR-së:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Cakto modalitetin e brezit të radios"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Po ngarkon listën e brezave…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Cakto"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 1501a88..69a24f1 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"Конфигурисање подешавања налога"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"Сви налози за позивање"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"Изаберите који налози могу да обављају позиве"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"Позивање преко WiFi-а"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"Позивање преко Wi-Fi-ја"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"Уграђена услуга повезивања"</string>
<string name="voicemail" msgid="7697769412804195032">"Говорна пошта"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"Гласовна пошта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -118,7 +118,7 @@
<string name="sum_cfnry_enabled" msgid="3000500837493854799">"Прослеђује се на <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfnry_disabled" msgid="1990563512406017880">"Искључено"</string>
<string name="disable_cfnry_forbidden" msgid="3174731413216550689">"Оператер не подржава онемогућавање преусмеравања позива када се на позив не одговори."</string>
- <string name="labelCFNRc" msgid="4163399350778066013">"Кад сам недоступан/на"</string>
+ <string name="labelCFNRc" msgid="4163399350778066013">"Кад сам недоступан/а"</string>
<string name="messageCFNRc" msgid="6980340731313007250">"Број кад је недоступно"</string>
<string name="sum_cfnrc_enabled" msgid="1799069234006073477">"Прослеђује се на <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfnrc_disabled" msgid="739289696796917683">"Искључено"</string>
@@ -298,7 +298,7 @@
<string name="sim_selection_required_pref" msgid="6985901872978341314">"Потребно је да изаберете нешто"</string>
<string name="sim_change_data_title" msgid="9142726786345906606">"Да променимо SIM за податке?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"Желите ли да за мобилне податке користите <xliff:g id="NEW_SIM">%1$s</xliff:g> уместо <xliff:g id="OLD_SIM">%2$s</xliff:g>?"</string>
- <string name="wifi_calling_settings_title" msgid="5800018845662016507">"Позивање преко WiFi-а"</string>
+ <string name="wifi_calling_settings_title" msgid="5800018845662016507">"Позивање преко Wi-Fi-ја"</string>
<string name="video_calling_settings_title" msgid="342829454913266078">"Видео позивање преко оператера"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"Опције за GSM/UMTS"</string>
<string name="cdma_options" msgid="3669592472226145665">"CDMA опције"</string>
@@ -542,7 +542,7 @@
<string name="incall_error_supp_service_hangup" msgid="836524952243836735">"Успостављање позива није успело."</string>
<string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Није могуће стављати позиве на чекање."</string>
<string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Повежите се на бежичну мрежу да бисте упутили позив."</string>
- <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Омогућите позивање преко WiFi-а да бисте упутили позив."</string>
+ <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Омогућите позивање преко Wi-Fi-ја да бисте упутили позив."</string>
<string name="emergency_information_hint" msgid="9208897544917793012">"Информације за хитне случајеве"</string>
<string name="emergency_information_owner_hint" msgid="6256909888049185316">"Власник"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Додирните поново да бисте видели информације"</string>
@@ -564,7 +564,7 @@
<string name="dialerKeyboardHintText" msgid="1115266533703764049">"Користите тастатуру за позивање"</string>
<string name="onscreenHoldText" msgid="4025348842151665191">"Чекање"</string>
<string name="onscreenEndCallText" msgid="6138725377654842757">"Заврши"</string>
- <string name="onscreenShowDialpadText" msgid="658465753816164079">"Бројчаник"</string>
+ <string name="onscreenShowDialpadText" msgid="658465753816164079">"Нумеричка тастатура"</string>
<string name="onscreenMuteText" msgid="5470306116733843621">"Искључи звук"</string>
<string name="onscreenAddCallText" msgid="9075675082903611677">"Додај позив"</string>
<string name="onscreenMergeCallsText" msgid="3692389519611225407">"Обједини позиве"</string>
@@ -604,7 +604,7 @@
<string name="ota_hfa_activation_title" msgid="3300556778212729671">"Активирање..."</string>
<string name="ota_hfa_activation_dialog_message" msgid="7921718445773342996">"Телефон активира услугу мобилног преноса података.\n\nТо може да потраје и до 5 минута."</string>
<string name="ota_skip_activation_dialog_title" msgid="7666611236789203797">"Желите ли да прескочите активацију?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Ако прескочите активацију, не можете да упућујете позиве или да се повезујете са мрежама за мобилни пренос података (иако можете да се повежете са WiFi мрежама). Све док не активирате свој телефон, бићете упитани да то учините сваки пут када га укључите."</string>
+ <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Ако прескочите активацију, не можете да упућујете позиве или да се повезујете са мрежама за мобилни пренос података (иако можете да се повежете са Wi-Fi мрежама). Све док не активирате свој телефон, бићете упитани да то учините сваки пут када га укључите."</string>
<string name="ota_skip_activation_dialog_skip_label" msgid="5908029466817825633">"Прескочи"</string>
<string name="ota_activate" msgid="7939695753665438357">"Активирај"</string>
<string name="ota_title_activate_success" msgid="1272135024761004889">"Телефон је активиран."</string>
@@ -639,13 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Да"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Не"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Одбаци"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Телефон је у режиму за хитан повратни позив"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"До <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Телефон ће <xliff:g id="COUNT_1">%s</xliff:g> минут бити у режиму за хитан повратни позив.\nЖелите сад да изађете из њега?</item>
- <item quantity="few">Телефон ће <xliff:g id="COUNT_1">%s</xliff:g> минута бити у режиму за хитан повратни позив.\nЖелите сад да изађете из њега?</item>
- <item quantity="other">Телефон ће <xliff:g id="COUNT_1">%s</xliff:g> минута бити у режиму за хитан повратни позив.\nЖелите сад да изађете из њега?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Услуга"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Подешавање"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Није подешено>"</string>
@@ -657,7 +650,7 @@
<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>
+ <string name="pane_title_emergency_dialpad" msgid="3627372514638694401">"Нумеричка тастатура за хитне позиве"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="6610414098912832120">"Визуелна говорна пошта"</string>
<string name="voicemail_set_pin_dialog_title" msgid="7005128605986960003">"Подесите PIN"</string>
<string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"Промените PIN"</string>
@@ -671,18 +664,18 @@
<string name="sim_description_emergency_calls" msgid="5146872803938897296">"Само за хитне позиве"</string>
<string name="sim_description_default" msgid="7474671114363724971">"SIM картица, отвор: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="7883415189273700298">"Приступачност"</string>
- <string name="status_hint_label_incoming_wifi_call" msgid="2606052595898044071">"WiFi позив од"</string>
- <string name="status_hint_label_wifi_call" msgid="942993035689809853">"WiFi позив"</string>
+ <string name="status_hint_label_incoming_wifi_call" msgid="2606052595898044071">"Wi-Fi позив од"</string>
+ <string name="status_hint_label_wifi_call" msgid="942993035689809853">"Wi-Fi позив"</string>
<string name="emergency_action_launch_hint" msgid="2762016865340891314">"Додирните поново да бисте отворили"</string>
<string name="message_decode_error" msgid="1061856591500290887">"Дошло је до грешке при декодирању поруке."</string>
<string name="callFailed_cdma_activation" msgid="5392057031552253550">"SIM картица је активирала услугу и ажурирала функције роминга на телефону."</string>
<string name="callFailed_cdma_call_limit" msgid="1074219746093031412">"Има превише активних позива. Завршите или обједините постојеће позиве пре него што упутите нови."</string>
<string name="callFailed_imei_not_accepted" msgid="7257903653685147251">"Повезивање није успело, убаците важећу SIM картицу."</string>
- <string name="callFailed_wifi_lost" msgid="1788036730589163141">"WiFi веза је прекинута. Позив је завршен."</string>
+ <string name="callFailed_wifi_lost" msgid="1788036730589163141">"Wi-Fi веза је прекинута. Позив је завршен."</string>
<string name="dialFailed_low_battery" msgid="6857904237423407056">"Не можете да упутите позив јер је батерија скоро празна."</string>
<string name="callFailed_low_battery" msgid="4056828320214416182">"Видео позив је прекинут јер је батерија скоро празна."</string>
- <string name="callFailed_emergency_call_over_wfc_not_available" msgid="5944309590693432042">"Хитни позиви помоћу функције Позивање преко WiFi-а нису доступни на овој локацији."</string>
- <string name="callFailed_wfc_service_not_available_in_this_location" msgid="3624536608369524988">"Позивање преко WiFi-а није доступно на овој локацији."</string>
+ <string name="callFailed_emergency_call_over_wfc_not_available" msgid="5944309590693432042">"Хитни позиви помоћу функције Позивање преко Wi-Fi-ја нису доступни на овој локацији."</string>
+ <string name="callFailed_wfc_service_not_available_in_this_location" msgid="3624536608369524988">"Позивање преко Wi-Fi-ја није доступно на овој локацији."</string>
<string name="change_pin_title" msgid="3564254326626797321">"Промените PIN кôд говорне поште"</string>
<string name="change_pin_continue_label" msgid="5177011752453506371">"Настави"</string>
<string name="change_pin_cancel_label" msgid="2301711566758827936">"Откажи"</string>
@@ -827,7 +820,7 @@
<string name="radio_info_data_connection_disable" msgid="6404751291511368706">"Онемогући везу за пренос података"</string>
<string name="volte_provisioned_switch_string" msgid="4812874990480336178">"Додељено за VoLTE"</string>
<string name="vt_provisioned_switch_string" msgid="8295542122512195979">"Видео позиви су додељени"</string>
- <string name="wfc_provisioned_switch_string" msgid="3835004640321078988">"Позивање преко WiFi-а је додељено"</string>
+ <string name="wfc_provisioned_switch_string" msgid="3835004640321078988">"Позивање преко Wi-Fi-ја је додељено"</string>
<string name="eab_provisioned_switch_string" msgid="4449676720736033035">"Додељен је EAB/присуство"</string>
<string name="cbrs_data_switch_string" msgid="6060356430838077653">"Подаци CBRS-а"</string>
<string name="dsds_switch_string" msgid="7564769822086764796">"Омогући DSDS"</string>
@@ -845,7 +838,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>\nГлас преко LTE-а: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nГлас преко WiFi-а: <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>\nГлас преко LTE-а: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nГлас преко Wi-Fi-ја: <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>
@@ -901,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Освежи"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Укључи/искључи проверу DNS-а"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Информације/подешавања специфична за произвођача оригиналне опреме"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC доступно:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR ограничено:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR доступно:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR стање:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR учесталост:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Подесите режим радијског опсега"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Учитава се листа опсега…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Подеси"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index bf32bfb..6ff09d6 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -307,8 +307,12 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Dataanvändningsperiod"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Datahastighetspolicy"</string>
<string name="throttle_help" msgid="2624535757028809735">"Läs mer"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) av högst <xliff:g id="USED_2">%3$s</xliff:g> för perioden\nNästa period börjar om <xliff:g id="USED_3">%4$d</xliff:g> dagar (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> ٪) av högst <xliff:g id="USED_2">%3$s</xliff:g> för perioden"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_data_usage_subtext (3185429653996709840) -->
+ <skip />
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> maxvärdet har överskridits\nDatahastigheten har sänkts till <xliff:g id="USED_1">%2$d</xliff:g> kbit/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g> ٪ av cykeln har gått\nNästa period börjar om <xliff:g id="USED_1">%2$d</xliff:g> dagar (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
<string name="throttle_rate_subtext" msgid="7221971817325779535">"Datahastigheten sänks till <xliff:g id="USED">%1$d</xliff:g> kbit/s om dataanvändningsgränsen överskrids"</string>
@@ -637,12 +641,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ja"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Nej"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Ta bort permanent"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefonen är i läget för återuppringning vid nödsamtal"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Till <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Telefonen kommer att vara i läget för återuppringning vid nödsamtal i <xliff:g id="COUNT_1">%s</xliff:g> minuter.\nVill du avsluta nu?</item>
- <item quantity="one">Telefonen kommer att vara i läget för återuppringning vid nödsamtal i <xliff:g id="COUNT_0">%s</xliff:g> minut.\nVill du avsluta nu?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Tjänst"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Konfiguration"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Har inte angetts>"</string>
@@ -688,7 +686,7 @@
<string name="change_pin_enter_old_pin_hint" msgid="8801292976275169367">"Ange pinkoden till röstbrevlådan för att fortsätta."</string>
<string name="change_pin_enter_new_pin_header" msgid="4739465616733486118">"Ange en ny pinkod"</string>
<string name="change_pin_enter_new_pin_hint" msgid="2326038476516364210">"Pinkoden måste ha <xliff:g id="MIN">%1$d</xliff:g>-<xliff:g id="MAX">%2$d</xliff:g> siffror."</string>
- <string name="change_pin_confirm_pin_header" msgid="2606303906320705726">"Bekräfta PIN-kod"</string>
+ <string name="change_pin_confirm_pin_header" msgid="2606303906320705726">"Bekräfta pinkod"</string>
<string name="change_pin_confirm_pins_dont_match" msgid="305164501222587215">"Pinkoderna matchar inte"</string>
<string name="change_pin_succeeded" msgid="2504705600693014403">"Röstbrevlådans pinkod bekräftad"</string>
<string name="change_pin_system_error" msgid="7772788809875146873">"Det går inte att ställa in pinkod"</string>
@@ -898,11 +896,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Uppdatera"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Aktivera och inaktivera DNS-kontroll"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-specifik information/inställningar"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC tillgänglig:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR begränsad:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR tillgänglig:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR-status:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR-frekvens:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Konfigurera radiobandsläget"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Läser in bandlista …"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Ange"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index b91d798..f2ac8d8 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -24,7 +24,7 @@
<string name="unknown" msgid="8279698889921830815">"Haijulikani"</string>
<string name="private_num" msgid="4487990167889159992">" Number isiyojulikana"</string>
<string name="payphone" msgid="7936735771836716941">"Simu ya kulipia"</string>
- <string name="onHold" msgid="6132725550015899006">"Imesitishwa"</string>
+ <string name="onHold" msgid="6132725550015899006">"Inangoja"</string>
<string name="carrier_mmi_msg_title" msgid="6050165242447507034">"Ujumbe wa <xliff:g id="MMICARRIER">%s</xliff:g>"</string>
<string name="default_carrier_mmi_msg_title" msgid="7754317179938537213">"Ujumbe wa Mtoa Huduma"</string>
<string name="mmiStarted" msgid="9212975136944568623">"Msimbo wa MMI umeanza"</string>
@@ -91,11 +91,11 @@
<string name="additional_cdma_call_settings" msgid="2178016561980611304">"Mipangilio ya ziada ya simu ya CDMA"</string>
<string name="sum_cdma_call_settings" msgid="3185825305136993636">"Mipangilio ya ziada ya simu ya CDMA tu"</string>
<string name="labelNwService" msgid="6015891883487125120">"Mipangilio ya huduma ya mtandao"</string>
- <string name="labelCallerId" msgid="2090540744550903172">"Kitambulisho cha anayepiga"</string>
+ <string name="labelCallerId" msgid="2090540744550903172">"Kitambulisho cha mpigaji SIM"</string>
<string name="sum_loading_settings" msgid="434063780286688775">"Mipangilio inapakia..."</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"Nambari imefichwa kwa simu unayopiga"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Namba inaonekana kwa simu zinazopigwa"</string>
- <string name="sum_default_caller_id" msgid="1767070797135682959">"Tumia mipangilio ya mtoa huduma chaguomsingi kuonyesha nambari kwa simu unazopiga"</string>
+ <string name="sum_default_caller_id" msgid="1767070797135682959">"Tumia mipangilio ya kiendesha chaguomsingi kuonyesha namba kwa simu zinazopigwa"</string>
<string name="labelCW" msgid="8449327023861428622">"Simu inayosubiri kupokewa"</string>
<string name="sum_cw_enabled" msgid="3977308526187139996">"Wakati ninapokea simu, niarifu kuhusu simu zingine zinazoingia"</string>
<string name="sum_cw_disabled" msgid="3658094589461768637">"Wakati ninapokea simu, niarifu kuhusu simu zingine zinazoingia"</string>
@@ -128,7 +128,7 @@
<string name="call_settings_with_label" msgid="8460230435361579511">"Mipangilio (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"Hitilafu ya mipangilio ya kupiga simu"</string>
<string name="reading_settings" msgid="1605904432450871183">"Inasoma mipangilio…."</string>
- <string name="updating_settings" msgid="3650396734816028808">"Inasasisha mipangilio…"</string>
+ <string name="updating_settings" msgid="3650396734816028808">"Inaboresha mipangilio…"</string>
<string name="reverting_settings" msgid="7378668837291012205">"Inageuza mipangilio..."</string>
<string name="response_error" msgid="3904481964024543330">"Jibu lisilotarajiwa kutoka kwa mtandao."</string>
<string name="exception_error" msgid="330994460090467">"Hitilafu ya mtandao au SIM kadi."</string>
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Muda wa matumizi ya data"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Sera ya kasi ya data"</string>
<string name="throttle_help" msgid="2624535757028809735">"Pata maelezo zaidi"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) imetumika kati ya kipindi cha juu cha <xliff:g id="USED_2">%3$s</xliff:g>\nKipindi kijacho kinaanza baada ya siku <xliff:g id="USED_3">%4$d</xliff:g> (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) ya<xliff:g id="USED_2">%3$s</xliff:g> muda wa kiwango cha juu\nMuda unaofuata unaanza baada ya siku<xliff:g id="USED_3">%4$d</xliff:g>(<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (asilimia <xliff:g id="USED_1">%2$d</xliff:g>) ya upeo wa muda wa <xliff:g id="USED_2">%3$s</xliff:g>"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"Upeo wa <xliff:g id="USED_0">%1$s</xliff:g> umepitwa\nKasi ya data imepunguzwa hadi kilobaiti <xliff:g id="USED_1">%2$d</xliff:g> kwa sekunde"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ ya mzunguko imekamilika\nMuda ufuatao unaanza baada ya siku <xliff:g id="USED_1">%2$d</xliff:g> (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -513,7 +513,7 @@
<string name="card_title_conf_call" msgid="901197309274457427">"Simu ya kongamano"</string>
<string name="card_title_incoming_call" msgid="881424648458792430">"Simu inayoingia"</string>
<string name="card_title_call_ended" msgid="650223980095026340">"Simu imekamilika"</string>
- <string name="card_title_on_hold" msgid="9028319436626975207">"Imesitishwa"</string>
+ <string name="card_title_on_hold" msgid="9028319436626975207">"Inangoja"</string>
<string name="card_title_hanging_up" msgid="814874106866647871">"Kukata simu"</string>
<string name="card_title_in_call" msgid="8231896539567594265">"Katika simu"</string>
<string name="notification_voicemail_title" msgid="3932876181831601351">"Ujumbe mpya wa sauti"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ndiyo"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Hapana"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Ondoa"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Simu hii iko katika hali ya kuomba upigiwe simu ya dharura"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Hadi <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Simu hii itakuwa katika hali ya kuomba upigiwe simu ya dharura kwa dakika <xliff:g id="COUNT_1">%s</xliff:g>.\nJe, ungependa kuondoka sasa?</item>
- <item quantity="one">Simu hii itakuwa katika hali ya kuomba upigiwe simu ya dharura kwa dakika <xliff:g id="COUNT_0">%s</xliff:g>.\nJe, ungependa kuondoka sasa?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Huduma"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Weka mipangilio"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Haijawekwa>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Onyesha upya"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Geuza Ukaguzi wa DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Maelezo/Mipangilio Mahususi kwa Kampuni Inayotengeneza Vifaa (OEM)"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC Inapatikana:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR Imewekewa Vizuizi:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR Inapatikana:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Hali ya NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Masafa ya NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Weka Hali ya Bendi ya Redio"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Inapakia Orodha ya Bendi…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Weka"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 9257194..8382af1 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"தரவு பயன்படுத்தப்பட்ட காலம்"</string>
<string name="throttle_rate" msgid="7641913901133634905">"தரவு கட்டண கொள்கை"</string>
<string name="throttle_help" msgid="2624535757028809735">"மேலும் அறிக"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"அதிகபட்ச சேமிப்பிடம் <xliff:g id="USED_2">%3$s</xliff:g> இல் <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) பயன்படுத்தப்பட்டுள்ளது\nஅடுத்த காலகட்டம் <xliff:g id="USED_3">%4$d</xliff:g> நாட்களில் (<xliff:g id="USED_4">%5$s</xliff:g>) தொடங்கும்"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) / <xliff:g id="USED_2">%3$s</xliff:g> அதிகபட்சம்\nஅடுத்த காலநேரம் <xliff:g id="USED_3">%4$d</xliff:g> நாட்களுக்குள் தொடங்கும் (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"அதிகபட்சம் <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) / <xliff:g id="USED_2">%3$s</xliff:g>"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> அதிகபட்சத்தை மீறிவிட்டது\n<xliff:g id="USED_1">%2$d</xliff:g> Kb/s க்குத் தரவு கட்டணம் குறைந்தது"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ சுழற்சி கடந்துவிட்டன\nஅடுத்த காலம் <xliff:g id="USED_1">%2$d</xliff:g> நாட்களில் தொடங்கும் (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"ஆம்"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"இல்லை"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"விலக்கு"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"மொபைல் இப்போது அவசரகால திரும்ப அழைக்கும் பயன்முறையில் உள்ளது"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> வரை"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">மொபைல் இன்னும் <xliff:g id="COUNT_1">%s</xliff:g> நிமிடங்களுக்கு அவசரகால திரும்ப அழைக்கும் பயன்முறையில் இருக்கும்.\nஇப்போதே அதை விட்டு வெளியேறவா?</item>
- <item quantity="one">மொபைல் இன்னும் <xliff:g id="COUNT_0">%s</xliff:g> நிமிடத்திற்கு அவசரகால திரும்ப அழைக்கும் பயன்முறையில் இருக்கும்.\nஇப்போதே அதை விட்டு வெளியேறவா?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"சேவை"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"அமைவு"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<அமைக்கப்படவில்லை>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"புதுப்பி"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS சரிபார்ப்பை நிலைமாற்று"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM சார்ந்த தகவல்/அமைப்புகள்"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC உள்ளது:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR கட்டுப்படுத்தப்பட்டது:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR உள்ளது:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR நிலை:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR அலைவரிசை:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"ரேடியோ பேண்டு பயன்முறையை அமை"</string>
<string name="band_mode_loading" msgid="795923726636735967">"பேண்டு பட்டியலை ஏற்றுகிறது…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"அமை"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index e15fb86..a4f1660 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -128,7 +128,7 @@
<string name="call_settings_with_label" msgid="8460230435361579511">"సెట్టింగ్లు (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"కాల్ సెట్టింగ్ల లోపం"</string>
<string name="reading_settings" msgid="1605904432450871183">"సెట్టింగ్లను చదువుతోంది…"</string>
- <string name="updating_settings" msgid="3650396734816028808">"సెట్టింగ్లను అప్డేట్ చేస్తోంది…"</string>
+ <string name="updating_settings" msgid="3650396734816028808">"సెట్టింగ్లను నవీకరిస్తోంది…"</string>
<string name="reverting_settings" msgid="7378668837291012205">"సెట్టింగ్లను తిరిగి మారుస్తోంది…"</string>
<string name="response_error" msgid="3904481964024543330">"నెట్వర్క్ నుండి ఊహించని ప్రతిస్పందన."</string>
<string name="exception_error" msgid="330994460090467">"నెట్వర్క్ లేదా SIM కార్డు లోపం."</string>
@@ -141,7 +141,7 @@
<string name="close_dialog" msgid="1074977476136119408">"సరే"</string>
<string name="enable" msgid="2636552299455477603">"ఆన్ చేయి"</string>
<string name="disable" msgid="1122698860799462116">"ఆఫ్ చేయి"</string>
- <string name="change_num" msgid="6982164494063109334">"అప్డేట్ చేయి"</string>
+ <string name="change_num" msgid="6982164494063109334">"నవీకరించు"</string>
<string-array name="clir_display_values">
<item msgid="8477364191403806960">"నెట్వర్క్ డిఫాల్ట్"</item>
<item msgid="6813323051965618926">"నంబర్ను దాచు"</item>
@@ -288,7 +288,7 @@
<string name="limited_sim_function_notification_message" msgid="5338638075496721160">"వేరొక SIMను ఉపయోగిస్తున్నప్పుడు <xliff:g id="CARRIER_NAME">%1$s</xliff:g> కాల్లు మరియు డేటా సేవలు బ్లాక్ చేయబడవచ్చు."</string>
<string name="data_usage_title" msgid="8438592133893837464">"యాప్ డేటా వినియోగం"</string>
<string name="data_usage_template" msgid="6287906680674061783">"<xliff:g id="ID_2">%2$s</xliff:g> మధ్య కాలంలో <xliff:g id="ID_1">%1$s</xliff:g> మొబైల్ డేటా ఉపయోగించబడింది"</string>
- <string name="advanced_options_title" msgid="9208195294513520934">"అధునాతన సెట్టింగ్లు"</string>
+ <string name="advanced_options_title" msgid="9208195294513520934">"అధునాతనం"</string>
<string name="carrier_settings_euicc" msgid="1190237227261337749">"క్యారియర్"</string>
<string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"క్యారియర్, ఇసిమ్, సిమ్, ఇయుక్, క్యారియర్లను మార్చు, క్యారియర్ను జోడించు"</string>
<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>
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"డేటా వినియోగ వ్యవధి"</string>
<string name="throttle_rate" msgid="7641913901133634905">"డేటా రేట్ విధానం"</string>
<string name="throttle_help" msgid="2624535757028809735">"మరింత తెలుసుకోండి"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"గరిష్ఠ వ్యవధి అయిన <xliff:g id="USED_2">%3$s</xliff:g>లో <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪)\nతర్వాతి వ్యవధి <xliff:g id="USED_3">%4$d</xliff:g> రోజుల్లో (<xliff:g id="USED_4">%5$s</xliff:g>) ప్రారంభమవుతుంది"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"గరిష్టంగా <xliff:g id="USED_2">%3$s</xliff:g> వ్యవధిలో <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪)\nతదపరి వ్యవధి <xliff:g id="USED_3">%4$d</xliff:g> రోజుల్లో (<xliff:g id="USED_4">%5$s</xliff:g>) ప్రారంభమవుతుంది"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"గరిష్టంగా <xliff:g id="USED_2">%3$s</xliff:g>లో <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪)"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> గరిష్ట పరిమితి మించిపోయింది\nడేటా రేట్ <xliff:g id="USED_1">%2$d</xliff:g> Kb/sకి తగ్గించబడింది"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"సైకిల్లో <xliff:g id="USED_0">%1$d</xliff:g>٪ గడిచిపోయింది\nతదుపరి వ్యవధి <xliff:g id="USED_1">%2$d</xliff:g> రోజుల్లో (<xliff:g id="USED_2">%3$s</xliff:g>) ప్రారంభమవుతుంది"</string>
@@ -581,7 +581,7 @@
<string name="failedToImportSingleContactMsg" msgid="228095510489830266">"పరిచయాన్ని దిగుమతి చేయడంలో విఫలమైంది"</string>
<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_title" msgid="3075948111362818043">"నిజ సమయ వచనం (RTT) కాల్"</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>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"అవును"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"కాదు"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"తీసివేయి"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"ఫోన్ అత్యవసర కాల్బ్యాక్ మోడ్లో ఉంది"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> వరకు"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">ఫోన్ అత్యవసర కాల్బ్యాక్ మోడ్లో <xliff:g id="COUNT_1">%s</xliff:g> నిమిషాల పాటు ఉంటుంది.\n మీరు ఇప్పుడే నిష్క్రమించాలనుకుంటున్నారా?</item>
- <item quantity="one">ఫోన్ అత్యవసర కాల్బ్యాక్ మోడ్లో <xliff:g id="COUNT_0">%s</xliff:g> నిమిషం పాటు ఉంటుంది. \n మీరు ఇప్పుడే నిష్క్రమించాలనుకుంటున్నారా?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"సేవ"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"సెటప్"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<సెట్ చేయలేదు>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"రిఫ్రెష్ చేయి"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS తనిఖీని టోగుల్ చేయండి"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-నిర్దిష్ట సమాచారం/సెట్టింగ్లు"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC అందుబాటులో ఉంది:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR నియంత్రించబడింది:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR అందుబాటులో ఉంది:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR స్టేటస్:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR ఫ్రీక్వెన్సీ:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"రేడియో బ్యాండ్ మోడ్ను సెట్ చేయండి"</string>
<string name="band_mode_loading" msgid="795923726636735967">"బ్యాండ్ జాబితాను లోడ్ చేస్తోంది…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"సెట్ చేయి"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index e527e89..e5eee82 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"ช่วงเวลาการใช้ข้อมูล"</string>
<string name="throttle_rate" msgid="7641913901133634905">"นโยบายอัตราการส่งข้อมูล"</string>
<string name="throttle_help" msgid="2624535757028809735">"ดูข้อมูลเพิ่มเติม"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) จากช่วงสูงสุด <xliff:g id="USED_2">%3$s</xliff:g>\nช่วงถัดไปจะเริ่มในอีก <xliff:g id="USED_3">%4$d</xliff:g> วัน (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) จากช่วงสูงสุด <xliff:g id="USED_2">%3$s</xliff:g> \nช่วงถัดไปจะเริ่มในอีก <xliff:g id="USED_3">%4$d</xliff:g> วัน (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) จากช่วงสูงสุด <xliff:g id="USED_2">%3$s</xliff:g>"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g>เกินจำนวนสูงสุด\nอัตราการส่งข้อมูลถูกลดเหลือ<xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ ของรอบผ่านไป \n ช่วงถัดไปจะเริ่มในอีก <xliff:g id="USED_1">%2$d</xliff:g> วัน (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -425,8 +425,8 @@
<string name="cdma_activate_device" msgid="5914720276140097632">"เปิดใช้งานอุปกรณ์"</string>
<string name="cdma_lte_data_service" msgid="359786441782404562">"ตั้งค่าบริการข้อมูล"</string>
<string name="carrier_settings_title" msgid="6292869148169850220">"การตั้งค่าของผู้ให้บริการ"</string>
- <string name="fdn" msgid="2545904344666098749">"หมายเลขโทรออกที่กำหนดตายตัว"</string>
- <string name="fdn_with_label" msgid="6412087553365709494">"หมายเลขโทรออกที่กำหนดตายตัว (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+ <string name="fdn" msgid="2545904344666098749">"การจำกัดหมายเลขโทรออก"</string>
+ <string name="fdn_with_label" msgid="6412087553365709494">"โหมดจำกัดการโทร (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="manage_fdn_list" msgid="3341716430375195441">"รายการ FDN"</string>
<string name="fdn_list_with_label" msgid="1409655283510382556">"รายการ FDN (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="fdn_activation" msgid="2178637004710435895">"การเปิดใช้งาน FDN"</string>
@@ -518,7 +518,7 @@
<string name="card_title_in_call" msgid="8231896539567594265">"กำลังใช้สาย"</string>
<string name="notification_voicemail_title" msgid="3932876181831601351">"ข้อความเสียงใหม่"</string>
<string name="notification_voicemail_title_count" msgid="2806950319222327082">"ข้อความเสียงใหม่ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="5720947141702312537">"โทร <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_text_format" msgid="5720947141702312537">"หมุนหมายเลข <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
<string name="notification_voicemail_no_vm_number" msgid="3423686009815186750">"ไม่ทราบหมายเลขข้อความเสียง"</string>
<string name="notification_network_selection_title" msgid="255595526707809121">"ไม่มีบริการ"</string>
<string name="notification_network_selection_text" msgid="553288408722427659">"เครือข่ายที่เลือกไว้<xliff:g id="OPERATOR_NAME">%s</xliff:g> ไม่พร้อมใช้งาน"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"ใช่"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"ไม่"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"เลิกแสดง"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"โทรศัพท์อยู่ในโหมดติดต่อกลับฉุกเฉิน"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"จนถึง <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">โทรศัพท์จะอยู่ในโหมดติดต่อกลับฉุกเฉินเป็นเวลา <xliff:g id="COUNT_1">%s</xliff:g> นาที\nคุณต้องการออกเลยไหม</item>
- <item quantity="one">โทรศัพท์จะอยู่ในโหมดติดต่อกลับฉุกเฉินเป็นเวลา <xliff:g id="COUNT_0">%s</xliff:g> นาที\nคุณต้องการออกเลยไหม</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"บริการ"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"การตั้งค่า"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<ไม่ได้ตั้งค่า>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"รีเฟรช"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"สลับการตรวจสอบ DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"ข้อมูล/การตั้งค่าเฉพาะตาม OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"มี EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR ถูกจำกัด:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"มี NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"สถานะ NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"ความถี่ NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"ตั้งค่าโหมดย่านความถี่วิทยุ"</string>
<string name="band_mode_loading" msgid="795923726636735967">"กำลังโหลดรายการย่านความถี่…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"ตั้งค่า"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 83b4585..e8b075a 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -74,7 +74,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"I-configure ang mga setting ng account"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"Lahat ng account sa pagtawag"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"Piliin kung aling mga account ang maaaring tumawag"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"Pagtawag gamit ang Wi-Fi"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"Pagtawag sa pamamagitan ng Wi-Fi"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"Built-in na serbisyo ng koneksyon"</string>
<string name="voicemail" msgid="7697769412804195032">"Voicemail"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -306,7 +306,7 @@
<string name="throttle_current_usage" msgid="7483859109708658613">"Ginamit na data sa kasalukuyang panahon"</string>
<string name="throttle_time_frame" msgid="1813452485948918791">"Panahon ng paggamit ng data"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Patakaran ng rate ng data"</string>
- <string name="throttle_help" msgid="2624535757028809735">"Matuto pa"</string>
+ <string name="throttle_help" msgid="2624535757028809735">"Matuto nang higit pa"</string>
<string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) ng <xliff:g id="USED_2">%3$s</xliff:g> maximum na tagal ng panahon\nMagsisimula ang susunod na tagal ng panahon sa loob ng <xliff:g id="USED_3">%4$d</xliff:g> (na) araw (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) ng <xliff:g id="USED_2">%3$s</xliff:g> maximum na period"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"Ang <xliff:g id="USED_0">%1$s</xliff:g> na maximum ay lumagpas sa\nBinabaan ang rate ng data sa <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Oo"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Hindi"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Balewalain"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Nasa emergency callback mode ang telepono"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Hanggang <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Nasa emergency callback mode ang telepono nang <xliff:g id="COUNT_1">%s</xliff:g> minuto.\nGusto mo bang lumabas ngayon?</item>
- <item quantity="other">Nasa emergency callback mode ang telepono nang <xliff:g id="COUNT_1">%s</xliff:g> na minuto.\nGusto mo bang lumabas ngayon?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Serbisyo"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Setup"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Hindi nakatakda>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"I-refresh"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"I-toggle ang DNS Check"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Impormasyon/Mga Setting na partikular sa OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Available ang EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Pinaghihigpitan ang DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Available ang NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Status ng NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Frequency ng NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Itakda ang Band Mode ng Radyo"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Nilo-load ang Listahan ng Band…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Itakda"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 3a9a099..05412b1 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -546,7 +546,7 @@
<string name="emergency_information_hint" msgid="9208897544917793012">"Acil durum bilgisi"</string>
<string name="emergency_information_owner_hint" msgid="6256909888049185316">"Sahip"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Bilgileri görüntülemek için tekrar dokunun"</string>
- <string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"Acil durum araması"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"Acil durum çağrısı"</string>
<string name="single_emergency_number_title" msgid="8413371079579067196">"Acil durum numarası"</string>
<string name="numerous_emergency_numbers_title" msgid="8972398932506755510">"Acil durum numaraları"</string>
<string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"<xliff:g id="EMERGENCY_NUMBER">%s</xliff:g> numaralı telefonu aramak için tekrar dokunun"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Evet"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Hayır"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Kapat"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefon, acil geri arama modunda"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Şu saate kadar: <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Telefon <xliff:g id="COUNT_1">%s</xliff:g> dakika boyunca acil geri arama modunda olacak.\nŞimdi çıkmak istiyor musunuz?</item>
- <item quantity="one">Telefon <xliff:g id="COUNT_0">%s</xliff:g> dakika boyunca acil geri arama modunda olacak.\nŞimdi çıkmak istiyor musunuz?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Hizmet"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Kurulum"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Ayarlanmadı>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Yenile"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS Denetimini Aç/Kapat"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM\'e Özgü Bilgiler/Ayarlar"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC Kullanılabilir:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR Kısıtlanmış:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR Kullanılabilir:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR Durumu:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR Frekansı:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Radyo Bant Modunu Ayarla"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Bant Listesi Yükleniyor…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Ayarla"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 5cdd5fb..ff4cf88 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Період викор. даних"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Пол. шв. перед. дан."</string>
<string name="throttle_help" msgid="2624535757028809735">"Докладніше"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) з <xliff:g id="USED_2">%3$s</xliff:g> на цей період\nНаступний період почнеться за <xliff:g id="USED_3">%4$d</xliff:g> дн. (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) з <xliff:g id="USED_2">%3$s</xliff:g> макс. пеірод\nНаступний період поч. через <xliff:g id="USED_3">%4$d</xliff:g> дн. (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) з<xliff:g id="USED_2">%3$s</xliff:g> максим. періоду"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> макс. перевищ.\nШв. перед. дан. скор. до <xliff:g id="USED_1">%2$d</xliff:g> КБ/сек"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ з циклу здійсн.\nНаст. період почин. через <xliff:g id="USED_1">%2$d</xliff:g> дн. (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -641,14 +641,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Так"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Ні"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Відхилити"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Телефон перебуває в режимі екстреного зворотного виклику"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"До <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Телефон перебуватиме в режимі екстреного зворотного виклику протягом <xliff:g id="COUNT_1">%s</xliff:g> хвилини.\nВийти зараз?</item>
- <item quantity="few">Телефон перебуватиме в режимі екстреного зворотного виклику протягом <xliff:g id="COUNT_1">%s</xliff:g> хвилин.\nВийти зараз?</item>
- <item quantity="many">Телефон перебуватиме в режимі екстреного зворотного виклику протягом <xliff:g id="COUNT_1">%s</xliff:g> хвилин.\nВийти зараз?</item>
- <item quantity="other">Телефон перебуватиме в режимі екстреного зворотного виклику протягом <xliff:g id="COUNT_1">%s</xliff:g> хвилини.\nВийти зараз?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Обслуговування"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Налаштування"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Не введено>"</string>
@@ -904,11 +896,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Оновити"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Увімк./вимк. перевірку DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Інформація/налаштування OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC доступно:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR обмежено:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR доступно:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Статус NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Частота NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Установити режим радіодіапазону"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Завантаження списку діапазонів частот…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Установити"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 366bad3..9cfeaa3 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -95,17 +95,17 @@
<string name="sum_loading_settings" msgid="434063780286688775">"ترتیبات لوڈ ہو رہی ہیں…"</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"باہر جانے والی کالوں میں نمبر پوشیدہ ہے"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"باہر جانے والی کالوں میں ڈسپلے نمبر ہوتا ہے"</string>
- <string name="sum_default_caller_id" msgid="1767070797135682959">"آؤٹ گوئنگ کالوں میں میرا نمبر ڈسپلے کرنے کیلئے ڈیفالٹ آپریٹر کی ترتیبات کا استعمال کریں"</string>
+ <string name="sum_default_caller_id" msgid="1767070797135682959">"باہر جانے والی کالوں میں میرا نمبر ڈسپلے کرنے کیلئے ڈیفالٹ آپریٹر کی ترتیبات کا استعمال کریں"</string>
<string name="labelCW" msgid="8449327023861428622">"کال کا انتظار"</string>
- <string name="sum_cw_enabled" msgid="3977308526187139996">"کال کے دوران، مجھے اِن کمنگ کالوں سے مطلع کریں"</string>
- <string name="sum_cw_disabled" msgid="3658094589461768637">"کال کے دوران، مجھے اِن کمنگ کالوں سے مطلع کریں"</string>
- <string name="call_forwarding_settings" msgid="8937130467468257671">"کال فارورڈنگ کی ترتیبات"</string>
+ <string name="sum_cw_enabled" msgid="3977308526187139996">"کال کے دوران، مجھے آنے والی کالوں سے مطلع کریں"</string>
+ <string name="sum_cw_disabled" msgid="3658094589461768637">"کال کے دوران، مجھے آنے والی کالوں سے مطلع کریں"</string>
+ <string name="call_forwarding_settings" msgid="8937130467468257671">"کال آگے منتقل کرنے کی ترتیبات"</string>
<string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"کال فارورڈنگ ترتیبات (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"کال فارورڈنگ"</string>
- <string name="labelCFU" msgid="8870170873036279706">"ہمیشہ فارورڈ کریں"</string>
+ <string name="labelCFU" msgid="8870170873036279706">"ہمیشہ آگے منتقل کریں"</string>
<string name="messageCFU" msgid="1361806450979589744">"ہمیشہ یہ نمبر استعمال کریں"</string>
<string name="sum_cfu_enabled_indicator" msgid="9030139213402432776">"سبھی کالیں آگے منتقل کر رہا ہے"</string>
- <string name="sum_cfu_enabled" msgid="5806923046528144526">"سبھی کالیں <xliff:g id="PHONENUMBER">{0}</xliff:g> کو فارورڈ ہو رہی ہیں"</string>
+ <string name="sum_cfu_enabled" msgid="5806923046528144526">"سبھی کالیں <xliff:g id="PHONENUMBER">{0}</xliff:g> کو آگے منتقل کر رہا ہے"</string>
<string name="sum_cfu_enabled_no_number" msgid="7287752761743377930">"نمبر دستیاب نہیں ہے"</string>
<string name="sum_cfu_disabled" msgid="5010617134210809853">"آف"</string>
<string name="labelCFB" msgid="615265213360512768">"مصروف ہونے پر"</string>
@@ -511,7 +511,7 @@
<string name="card_title_dialing" msgid="8742182654254431781">"ڈائل ہو رہا ہے"</string>
<string name="card_title_redialing" msgid="18130232613559964">"دوبارہ ڈائل ہو رہا ہے"</string>
<string name="card_title_conf_call" msgid="901197309274457427">"کانفرنس کال"</string>
- <string name="card_title_incoming_call" msgid="881424648458792430">"اِن کمنگ کال"</string>
+ <string name="card_title_incoming_call" msgid="881424648458792430">"آنے والی کال"</string>
<string name="card_title_call_ended" msgid="650223980095026340">"کال ختم ہوگئی"</string>
<string name="card_title_on_hold" msgid="9028319436626975207">"ہولڈ پر"</string>
<string name="card_title_hanging_up" msgid="814874106866647871">"کال منقطع ہو رہی ہے"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"ہاں"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"نہیں"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"کالعدم کریں"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"فون ہنگامی کال بیک وضع میں ہے"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> تک"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">فون <xliff:g id="COUNT_1">%s</xliff:g> منٹ تک ہنگامی کال بیک وضع میں رہے گا۔\n کیا آپ ابھی باہر نکلنا چاہتے ہیں؟</item>
- <item quantity="one">فون <xliff:g id="COUNT_0">%s</xliff:g> منٹ تک ہنگامی کال بیک وضع میں رہے گا۔\n کیا آپ ابھی باہر نکلنا چاہتے ہیں؟</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"سروس"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"سیٹ اپ"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<سیٹ نہیں ہے>"</string>
@@ -812,7 +806,7 @@
<string name="supp_service_held_call_released" msgid="2847835124639112410">"ہولڈ پر رکھی کال جاری ہو گئی۔"</string>
<string name="callFailed_otasp_provisioning_in_process" msgid="3345666183602879326">"کال نہیں کی جا سکتی کیوںکہ فی الحال آلہ فراہم کیا جا رہا ہے۔"</string>
<string name="callFailed_already_dialing" msgid="7250591188960691086">"کال نہیں کی جا سکتی کیونکہ باہر جانے والی دوسری کال پہلے سے ڈائل کی جا رہی ہے۔"</string>
- <string name="callFailed_already_ringing" msgid="2376603543544289303">"ایک جواب نہ ملنے والی اِن کمنگ کال کی وجہ سے کال نہیں کی جا سکتی۔ نئی کال کرنے کے لیے پہلے اِن کمنگ کال کا جواب دیں یا مسترد کریں۔"</string>
+ <string name="callFailed_already_ringing" msgid="2376603543544289303">"ایک جواب نہ ملنے والی موصول ہونے والی کال کی وجہ سے کال نہیں کی جا سکتی۔ نئی کال کرنے کے لیے پہلے موصول ہونے والی کال کا جواب دیں یا مسترد کریں۔"</string>
<string name="callFailed_calling_disabled" msgid="5010992739401206283">"ro.telephony.disable-call سسٹم کی خصوصیت کے ذریعے کال کرنے کو غیر فعال کر دیے جانے کی وجہ سے کال نہیں کی جا سکتی۔"</string>
<string name="callFailed_too_many_calls" msgid="5379426826618582180">"پہلے سے دو کالز کے پیش رفت میں ہونے کی وجہ سے کال نہیں کی جا سکتی۔ نئی کال کرنے کے لیے پہلے ان میں سے ایک کو غیر منسلک کریں یا انہیں کانفرنس میں ضم کریں۔"</string>
<string name="supp_service_over_ut_precautions" msgid="2145018231396701311">"<xliff:g id="SUPP_SERVICE">%s</xliff:g> استعمال کرنے کے لیے، یقینی بنائيں کہ موبائل ڈیٹا آن ہے۔ آپ موبائل یٹ ورک کی ترتیبات میں اسے تبدیل کر سکتے ہیں۔"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"ریفریش کریں"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS چیک ٹوگل کریں"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-کیلئے مخصوص معلومات/ترتیبات"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC دستیاب ہے:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR محدود کردہ:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR دستیاب ہے:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR ریاست:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR فریکوئنسی:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"ریڈیو بینڈ موڈ سیٹ کریں"</string>
<string name="band_mode_loading" msgid="795923726636735967">"بینڈ کی فہرست لوڈ ہو رہی ہے…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"سیٹ کریں"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 2aae625..25d9c28 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -24,7 +24,7 @@
<string name="unknown" msgid="8279698889921830815">"Noma’lum"</string>
<string name="private_num" msgid="4487990167889159992">"Yashirin raqam"</string>
<string name="payphone" msgid="7936735771836716941">"Taksofon"</string>
- <string name="onHold" msgid="6132725550015899006">"Pauzada"</string>
+ <string name="onHold" msgid="6132725550015899006">"Kutmoqda"</string>
<string name="carrier_mmi_msg_title" msgid="6050165242447507034">"<xliff:g id="MMICARRIER">%s</xliff:g> orqali xabar"</string>
<string name="default_carrier_mmi_msg_title" msgid="7754317179938537213">"Operatordan xabar"</string>
<string name="mmiStarted" msgid="9212975136944568623">"MMI kodi ishga tushirildi"</string>
@@ -127,7 +127,7 @@
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"Faqat administrator qo‘ng‘iroq sozlamalarini o‘zgartirishi mumkin."</string>
<string name="call_settings_with_label" msgid="8460230435361579511">"Sozlamalar (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"Chaqiruv sozlamalarida xato"</string>
- <string name="reading_settings" msgid="1605904432450871183">"Sozlamalar olinmoqda…"</string>
+ <string name="reading_settings" msgid="1605904432450871183">"Sozlamalar o‘qilmoqda…"</string>
<string name="updating_settings" msgid="3650396734816028808">"Sozlamalar yangilanmoqda…"</string>
<string name="reverting_settings" msgid="7378668837291012205">"Sozlamalar tiklanmoqda…"</string>
<string name="response_error" msgid="3904481964024543330">"Tarmoqdan kutilmagan javob."</string>
@@ -140,7 +140,7 @@
<string name="radio_off_error" msgid="8321564164914232181">"Ushbu sozlamalarni ko‘rishdan oldin radioni yoqing."</string>
<string name="close_dialog" msgid="1074977476136119408">"OK"</string>
<string name="enable" msgid="2636552299455477603">"Yoqish"</string>
- <string name="disable" msgid="1122698860799462116">"Faolsizlantirish"</string>
+ <string name="disable" msgid="1122698860799462116">"O‘chirib qo‘yish"</string>
<string name="change_num" msgid="6982164494063109334">"Yangilash"</string>
<string-array name="clir_display_values">
<item msgid="8477364191403806960">"Standart tarmoq sozlamalari"</item>
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Ma‘lumotdan foydalanish muddati"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Ma‘lumotlar uzatish tezligi siyosati"</string>
<string name="throttle_help" msgid="2624535757028809735">"Batafsil"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>%%) / <xliff:g id="USED_2">%3$s</xliff:g> (maksimum)\nKeyingi davr <xliff:g id="USED_3">%4$d</xliff:g> kun ichida boshlanadi (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"Maksimal daraja muddati <xliff:g id="USED_2">%3$s</xliff:g>dan <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) \nKeyingi muddat <xliff:g id="USED_3">%4$d</xliff:g> kunda (<xliff:g id="USED_4">%5$s</xliff:g>) boshlanadi."</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"Maksimal daraja muddati <xliff:g id="USED_2">%3$s</xliff:g>dan <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪)"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> maksimal darajadan oshib ketdi\nTrafik tezligi <xliff:g id="USED_1">%2$d</xliff:g> Kb/s’ga pasaydi"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ o‘tgan bosqichdan\nKeyingi bosqich <xliff:g id="USED_1">%2$d</xliff:g> kunda boshlanadi (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Ha"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Yo‘q"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Rad etish"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Telefon favqulodda teskari chaqiruv rejimida"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"<xliff:g id="COMPLETETIME">%s</xliff:g> gacha"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Telefon favqulodda teskari chaqiruv rejimida <xliff:g id="COUNT_1">%s</xliff:g> daqiqa qoladi.\nBu rejimdan chiqilsinmi?</item>
- <item quantity="one">Telefon favqulodda teskari chaqiruv rejimida <xliff:g id="COUNT_0">%s</xliff:g> daqiqa qoladi.\nBu rejimdan chiqilsinmi?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Xizmat"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Sozlash"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Kiritilmagan>"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Yangilash"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS tekshiruvini yoqish/o‘chirish"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM maxsus axboroti va sozlamalari"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC ochiq:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR cheklangan:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR ochiq:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR holati:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR chastotasi:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Tarmoq rejimini sozlash"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Chastotalar ro‘yxati yuklanmoqda…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Saqlash"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index d34d544..371d0da 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -24,7 +24,7 @@
<string name="unknown" msgid="8279698889921830815">"Không xác định"</string>
<string name="private_num" msgid="4487990167889159992">"Số cá nhân"</string>
<string name="payphone" msgid="7936735771836716941">"Điện thoại công cộng"</string>
- <string name="onHold" msgid="6132725550015899006">"Đang giữ máy"</string>
+ <string name="onHold" msgid="6132725550015899006">"Đang chờ"</string>
<string name="carrier_mmi_msg_title" msgid="6050165242447507034">"Tin nhắn <xliff:g id="MMICARRIER">%s</xliff:g>"</string>
<string name="default_carrier_mmi_msg_title" msgid="7754317179938537213">"Tin nhắn nhà mạng"</string>
<string name="mmiStarted" msgid="9212975136944568623">"Đã bắt đầu mã MMI"</string>
@@ -85,13 +85,13 @@
<string name="voicemail_notifications_preference_title" msgid="7829238858063382977">"Thông báo"</string>
<string name="cell_broadcast_settings" msgid="8135324242541809924">"Phát sóng trong tình huống khẩn cấp"</string>
<string name="call_settings" msgid="3677282690157603818">"Cài đặt cuộc gọi"</string>
- <string name="additional_gsm_call_settings" msgid="1561980168685658846">"Tùy chọn cài đặt bổ sung"</string>
- <string name="additional_gsm_call_settings_with_label" msgid="7973920539979524908">"Tùy chọn cài đặt bổ sung (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+ <string name="additional_gsm_call_settings" msgid="1561980168685658846">"Cài đặt bổ sung"</string>
+ <string name="additional_gsm_call_settings_with_label" msgid="7973920539979524908">"Cài đặt bổ sung (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="sum_gsm_call_settings" msgid="7964692601608878138">"Cài đặt cuộc gọi chỉ GSM bổ sung"</string>
<string name="additional_cdma_call_settings" msgid="2178016561980611304">"Cài đặt cuộc gọi CDMA bổ sung"</string>
<string name="sum_cdma_call_settings" msgid="3185825305136993636">"Cài đặt cuộc gọi chỉ CDMA bổ sung"</string>
<string name="labelNwService" msgid="6015891883487125120">"Cài đặt dịch vụ mạng"</string>
- <string name="labelCallerId" msgid="2090540744550903172">"Số nhận dạng người gọi"</string>
+ <string name="labelCallerId" msgid="2090540744550903172">"ID người gọi"</string>
<string name="sum_loading_settings" msgid="434063780286688775">"Đang tải cài đặt…"</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"Số bị ẩn trong cuộc gọi đi"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Số được hiển thị trong cuộc gọi đi"</string>
@@ -127,8 +127,8 @@
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"Chỉ người dùng quản trị mới có thể thay đổi cài đặt cuộc gọi."</string>
<string name="call_settings_with_label" msgid="8460230435361579511">"Cài đặt (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="error_updating_title" msgid="2024290892676808965">"Lỗi cài đặt cuộc gọi"</string>
- <string name="reading_settings" msgid="1605904432450871183">"Đang đọc các tùy chọn cài đặt…"</string>
- <string name="updating_settings" msgid="3650396734816028808">"Đang cập nhật các tùy chọn cài đặt..."</string>
+ <string name="reading_settings" msgid="1605904432450871183">"Đang đọc cài đặt…"</string>
+ <string name="updating_settings" msgid="3650396734816028808">"Đang cập nhật cài đặt..."</string>
<string name="reverting_settings" msgid="7378668837291012205">"Đang hoàn nguyên cài đặt…"</string>
<string name="response_error" msgid="3904481964024543330">"Phản hồi không mong muốn từ mạng."</string>
<string name="exception_error" msgid="330994460090467">"Lỗi mạng hoặc thẻ SIM."</string>
@@ -277,7 +277,7 @@
<string name="roaming_enable" msgid="6853685214521494819">"Kết nối với dịch vụ dữ liệu khi chuyển vùng"</string>
<string name="roaming_disable" msgid="8856224638624592681">"Kết nối với dịch vụ dữ liệu khi chuyển vùng"</string>
<string name="roaming_reenable_message" msgid="1951802463885727915">"Tính năng Chuyển vùng dữ liệu bị tắt. Nhấn để bật."</string>
- <string name="roaming_enabled_message" msgid="9022249120750897">"Bạn có thể bị tính phí chuyển vùng. Nhấn để sửa đổi."</string>
+ <string name="roaming_enabled_message" msgid="9022249120750897">"Có thể áp dụng phí chuyển vùng. Nhấn để sửa đổi."</string>
<string name="roaming_notification_title" msgid="3590348480688047320">"Đã mất kết nối dữ liệu di động"</string>
<string name="roaming_on_notification_title" msgid="7451473196411559173">"Chuyển vùng dữ liệu đang bật"</string>
<string name="roaming_warning" msgid="7855681468067171971">"Bạn có thể phải trả một khoản phí lớn."</string>
@@ -299,7 +299,7 @@
<string name="sim_change_data_title" msgid="9142726786345906606">"Thay đổi SIM cho dữ liệu di động?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"Sử dụng <xliff:g id="NEW_SIM">%1$s</xliff:g> thay vì <xliff:g id="OLD_SIM">%2$s</xliff:g> cho dữ liệu di động?"</string>
<string name="wifi_calling_settings_title" msgid="5800018845662016507">"Gọi qua Wi-Fi"</string>
- <string name="video_calling_settings_title" msgid="342829454913266078">"Tính năng gọi video của nhà cung cấp dịch vụ"</string>
+ <string name="video_calling_settings_title" msgid="342829454913266078">"Tính năng gọi điện video của nhà cung cấp dịch vụ"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"Tùy chọn GSM/UMTS"</string>
<string name="cdma_options" msgid="3669592472226145665">"Tùy chọn CDMA"</string>
<string name="throttle_data_usage" msgid="1944145350660420711">"Sử dụng dữ liệu"</string>
@@ -307,7 +307,7 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"Thời gian sử dụng dữ liệu"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Chính sách tốc độ dữ liệu"</string>
<string name="throttle_help" msgid="2624535757028809735">"Tìm hiểu thêm"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>%%) trong tổng <xliff:g id="USED_2">%3$s</xliff:g> thời gian tối đa\nThời gian tiếp theo bắt đầu sau <xliff:g id="USED_3">%4$d</xliff:g> ngày nữa (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) trong tổng số <xliff:g id="USED_2">%3$s</xliff:g> thời gian tối đa\nThời gian tiếp theo bắt đầu sau <xliff:g id="USED_3">%4$d</xliff:g> ngày nữa (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) trong tổng số <xliff:g id="USED_2">%3$s</xliff:g> thời gian tối đa"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"Đã vượt quá tối đa <xliff:g id="USED_0">%1$s</xliff:g>\nTốc độ dữ liệu bị giảm xuống <xliff:g id="USED_1">%2$d</xliff:g> Kb/giây"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ của chu kỳ đã qua\nThời gian tiếp theo sẽ bắt đầu trong <xliff:g id="USED_1">%2$d</xliff:g> ngày (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -447,7 +447,7 @@
<string name="auto_retry_mode_title" msgid="2985801935424422340">"Tự động thử lại"</string>
<string name="auto_retry_mode_summary" msgid="2863919925349511402">"Bật chế độ Tự động thử lại"</string>
<string name="tty_mode_not_allowed_video_call" msgid="6551976083652752815">"Không được phép thay đổi Chế độ Máy điện báo đánh chữ (TTY) trong cuộc gọi video"</string>
- <string name="menu_add" msgid="5616487894975773141">"Thêm người liên hệ"</string>
+ <string name="menu_add" msgid="5616487894975773141">"Thêm liên hệ"</string>
<string name="menu_edit" msgid="3593856941552460706">"Chỉnh sửa liên hệ"</string>
<string name="menu_delete" msgid="6326861853830546488">"Xóa liên hệ"</string>
<string name="menu_dial" msgid="4178537318419450012">"Quay số liên hệ"</string>
@@ -513,7 +513,7 @@
<string name="card_title_conf_call" msgid="901197309274457427">"Cuộc gọi hội nghị"</string>
<string name="card_title_incoming_call" msgid="881424648458792430">"Cuộc gọi đến"</string>
<string name="card_title_call_ended" msgid="650223980095026340">"Cuộc gọi đã kết thúc"</string>
- <string name="card_title_on_hold" msgid="9028319436626975207">"Đang giữ máy"</string>
+ <string name="card_title_on_hold" msgid="9028319436626975207">"Đang chờ"</string>
<string name="card_title_hanging_up" msgid="814874106866647871">"Kết thúc cuộc gọi"</string>
<string name="card_title_in_call" msgid="8231896539567594265">"Đang trong cuộc gọi"</string>
<string name="notification_voicemail_title" msgid="3932876181831601351">"Thư thoại mới"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Có"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Không"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Loại bỏ"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Điện thoại đang ở chế độ gọi lại khẩn cấp"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Cho đến <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">Điện thoại sẽ ở chế độ gọi lại khẩn cấp trong <xliff:g id="COUNT_1">%s</xliff:g> phút.\nBạn có muốn thoát ngay không?</item>
- <item quantity="one">Điện thoại sẽ ở chế độ gọi lại khẩn cấp trong <xliff:g id="COUNT_0">%s</xliff:g> phút.\nBạn có muốn thoát ngay không?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Dịch vụ"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Thiết lập"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Chưa đặt>"</string>
@@ -660,8 +654,8 @@
<string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"Thay đổi mã PIN"</string>
<string name="preference_category_ringtone" msgid="8787281191375434976">"Nhạc chuông và rung"</string>
<string name="pstn_connection_service_label" msgid="9200102709997537069">"Thẻ SIM tích hợp sẵn"</string>
- <string name="enable_video_calling_title" msgid="7246600931634161830">"Bật gọi video"</string>
- <string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"Để bật tính năng gọi video, bạn cần bật chế độ 4G LTE tăng cường trong cài đặt mạng."</string>
+ <string name="enable_video_calling_title" msgid="7246600931634161830">"Bật gọi điện video"</string>
+ <string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"Để bật tính năng gọi điện video, bạn cần bật chế độ 4G LTE tăng cường trong cài đặt mạng."</string>
<string name="enable_video_calling_dialog_settings" msgid="8697890611305307110">"Cài đặt mạng"</string>
<string name="enable_video_calling_dialog_close" msgid="4298929725917045270">"Đóng"</string>
<string name="sim_label_emergency_calls" msgid="9078241989421522310">"Cuộc gọi khẩn cấp"</string>
@@ -804,7 +798,7 @@
<string name="supp_service_additional_call_forwarded" msgid="8772753260008398632">"Đã chuyển tiếp cuộc gọi bổ sung."</string>
<string name="supp_service_additional_ect_connected" msgid="8525934162945220237">"Hoàn tất chuyển cuộc gọi ở chế độ rõ."</string>
<string name="supp_service_additional_ect_connecting" msgid="7046240728781222753">"Đang chuyển cuộc gọi ở chế độ rõ."</string>
- <string name="supp_service_call_on_hold" msgid="2836811319594503059">"Cuộc gọi đang giữ máy."</string>
+ <string name="supp_service_call_on_hold" msgid="2836811319594503059">"Cuộc gọi đang chờ."</string>
<string name="supp_service_call_resumed" msgid="3786864005920743546">"Đã tiếp tục cuộc gọi."</string>
<string name="supp_service_deflected_call" msgid="7565979024562921707">"Cuộc gọi đã bị chuyển hướng."</string>
<string name="supp_service_forwarded_call" msgid="6475776013771821457">"Cuộc gọi đã được chuyển tiếp."</string>
@@ -823,7 +817,7 @@
<string name="radio_info_data_connection_enable" msgid="6183729739783252840">"Bật kết nối dữ liệu"</string>
<string name="radio_info_data_connection_disable" msgid="6404751291511368706">"Tắt kết nối dữ liệu"</string>
<string name="volte_provisioned_switch_string" msgid="4812874990480336178">"Đã cấp phép VoLTE"</string>
- <string name="vt_provisioned_switch_string" msgid="8295542122512195979">"Đã cấp phép gọi video"</string>
+ <string name="vt_provisioned_switch_string" msgid="8295542122512195979">"Đã cấp phép gọi điện video"</string>
<string name="wfc_provisioned_switch_string" msgid="3835004640321078988">"Đã cấp phép Gọi qua Wi-Fi"</string>
<string name="eab_provisioned_switch_string" msgid="4449676720736033035">"Đã cấp phép hiện diện/EAB"</string>
<string name="cbrs_data_switch_string" msgid="6060356430838077653">"Dữ liệu Cbrs"</string>
@@ -842,7 +836,7 @@
<string name="radio_info_ims_reg_status_not_registered" msgid="8045821447288876085">"Chưa đăng ký"</string>
<string name="radio_info_ims_feature_status_available" msgid="6493200914756969292">"Có sẵn"</string>
<string name="radio_info_ims_feature_status_unavailable" msgid="8930391136839759778">"Không có sẵn"</string>
- <string name="radio_info_ims_reg_status" msgid="25582845222446390">"Đăng ký IMS: <xliff:g id="STATUS">%1$s</xliff:g>\nThoại qua LTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nThoại qua Wi-Fi: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nGọi video: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nGiao diện UT: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
+ <string name="radio_info_ims_reg_status" msgid="25582845222446390">"Đăng ký IMS: <xliff:g id="STATUS">%1$s</xliff:g>\nThoại qua LTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nThoại qua Wi-Fi: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nGọi điện video: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nGiao diện UT: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
<string name="radioInfo_service_in" msgid="45753418231446400">"Đang sử dụng"</string>
<string name="radioInfo_service_out" msgid="287972405416142312">"Không có dịch vụ"</string>
<string name="radioInfo_service_emergency" msgid="4763879891415016848">"Chỉ cuộc gọi khẩn cấp"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Làm mới"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Bật/tắt chế độ kiểm tra DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Thông tin/Cài đặt dành riêng cho OEM"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"Hỗ trợ EN-DC:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Hạn chế DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"Hỗ trợ NR:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Trạng thái NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Tần số NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Đặt chế độ dải tần số"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Đang tải danh sách băng tần…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Đặt"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index d0d079d..66eae10 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -163,7 +163,7 @@
<string name="vm_change_pin_error_mismatch" msgid="5364847280026257331">"旧的 PIN 码不匹配。"</string>
<string name="vm_change_pin_error_invalid" msgid="5230002671175580674">"新的 PIN 码包含无效字符。"</string>
<string name="vm_change_pin_error_system_error" msgid="9116483527909681791">"无法更改 PIN 码"</string>
- <string name="vvm_unsupported_message_format" msgid="4206402558577739713">"不受支持的语音信息类型,请拨打 <xliff:g id="NUMBER">%s</xliff:g> 收听。"</string>
+ <string name="vvm_unsupported_message_format" msgid="4206402558577739713">"不受支持的语音邮件类型,请拨打 <xliff:g id="NUMBER">%s</xliff:g> 收听。"</string>
<string name="network_settings_title" msgid="7560807107123171541">"移动网络"</string>
<string name="label_available" msgid="1316084116670821258">"可用网络"</string>
<string name="load_networks_progress" msgid="4051433047717401683">"正在搜索..."</string>
@@ -276,13 +276,13 @@
<string name="roaming" msgid="1576180772877858949">"漫游"</string>
<string name="roaming_enable" msgid="6853685214521494819">"漫游时连接到移动数据网络服务"</string>
<string name="roaming_disable" msgid="8856224638624592681">"漫游时连接到移动数据网络服务"</string>
- <string name="roaming_reenable_message" msgid="1951802463885727915">"数据漫游已关闭。点按即可开启。"</string>
+ <string name="roaming_reenable_message" msgid="1951802463885727915">"数据网络漫游已停用。点按即可启用。"</string>
<string name="roaming_enabled_message" msgid="9022249120750897">"可能需要支付漫游费。点按即可修改。"</string>
<string name="roaming_notification_title" msgid="3590348480688047320">"移动网络连接中断"</string>
- <string name="roaming_on_notification_title" msgid="7451473196411559173">"已开启数据漫游功能"</string>
+ <string name="roaming_on_notification_title" msgid="7451473196411559173">"已开启数据网络漫游功能"</string>
<string name="roaming_warning" msgid="7855681468067171971">"这可能会产生高额费用。"</string>
<string name="roaming_check_price_warning" msgid="8212484083990570215">"请与您的网络服务提供商联系以了解定价。"</string>
- <string name="roaming_alert_title" msgid="5689615818220960940">"允许数据漫游?"</string>
+ <string name="roaming_alert_title" msgid="5689615818220960940">"要允许移动数据网络漫游吗?"</string>
<string name="limited_sim_function_notification_title" msgid="612715399099846281">"SIM 卡功能受限"</string>
<string name="limited_sim_function_with_phone_num_notification_message" msgid="5928988883403677610">"使用 <xliff:g id="PHONE_NUMBER">%2$s</xliff:g> 时,系统可能会屏蔽<xliff:g id="CARRIER_NAME">%1$s</xliff:g>通话和数据服务。"</string>
<string name="limited_sim_function_notification_message" msgid="5338638075496721160">"使用另一张 SIM 卡时,系统可能会屏蔽<xliff:g id="CARRIER_NAME">%1$s</xliff:g>通话和数据服务。"</string>
@@ -516,8 +516,8 @@
<string name="card_title_on_hold" msgid="9028319436626975207">"保持"</string>
<string name="card_title_hanging_up" msgid="814874106866647871">"正在挂断"</string>
<string name="card_title_in_call" msgid="8231896539567594265">"正在通话"</string>
- <string name="notification_voicemail_title" msgid="3932876181831601351">"新语音信息"</string>
- <string name="notification_voicemail_title_count" msgid="2806950319222327082">"新语音信息 (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_title" msgid="3932876181831601351">"新语音邮件"</string>
+ <string name="notification_voicemail_title_count" msgid="2806950319222327082">"新语音邮件 (<xliff:g id="COUNT">%d</xliff:g>)"</string>
<string name="notification_voicemail_text_format" msgid="5720947141702312537">"拨打 <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
<string name="notification_voicemail_no_vm_number" msgid="3423686009815186750">"语音信箱号码未知"</string>
<string name="notification_network_selection_title" msgid="255595526707809121">"无服务"</string>
@@ -637,12 +637,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"是"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"否"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"关闭"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"手机正处于紧急回拨模式"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"直到 <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">手机在 <xliff:g id="COUNT_1">%s</xliff:g> 分钟内都将处于紧急回拨模式。\n您要立即退出吗?</item>
- <item quantity="one">手机在 <xliff:g id="COUNT_0">%s</xliff:g> 分钟内都将处于紧急回拨模式。\n您要立即退出吗?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"服务"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"设置"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<未设置>"</string>
@@ -692,8 +686,8 @@
<string name="change_pin_confirm_pins_dont_match" msgid="305164501222587215">"PIN 码不一致"</string>
<string name="change_pin_succeeded" msgid="2504705600693014403">"语音信箱 PIN 码已更新"</string>
<string name="change_pin_system_error" msgid="7772788809875146873">"无法设置 PIN 码"</string>
- <string name="mobile_data_status_roaming_turned_off_subtext" msgid="6840673347416227054">"数据漫游服务已关闭"</string>
- <string name="mobile_data_status_roaming_turned_on_subtext" msgid="5615757897768777865">"数据漫游服务已开启"</string>
+ <string name="mobile_data_status_roaming_turned_off_subtext" msgid="6840673347416227054">"数据网络漫游功能已停用"</string>
+ <string name="mobile_data_status_roaming_turned_on_subtext" msgid="5615757897768777865">"数据网络漫游功能已启用"</string>
<string name="mobile_data_status_roaming_without_plan_subtext" msgid="6536671968072284677">"目前处于漫游状态,需要添加数据流量套餐"</string>
<string name="mobile_data_status_roaming_with_plan_subtext" msgid="2576177169108123095">"目前处于漫游状态,数据流量套餐已启用"</string>
<string name="mobile_data_status_no_plan_subtext" msgid="170331026419263657">"无剩余移动数据流量"</string>
@@ -898,11 +892,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"刷新"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"切换 DNS 检查"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"特定 OEM 的信息/设置"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"4G/5G 双连接可用:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"5G 双连接受限:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"5G 可用:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"5G 状态:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"5G 频率:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"设置无线装置频道模式"</string>
<string name="band_mode_loading" msgid="795923726636735967">"正在加载频道列表…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"设置"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index d60fdcd..3920bad 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -307,7 +307,9 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"資料使用量週期"</string>
<string name="throttle_rate" msgid="7641913901133634905">"資料傳輸速率政策"</string>
<string name="throttle_help" msgid="2624535757028809735">"瞭解更多資訊"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>%%),週期上限為 <xliff:g id="USED_2">%3$s</xliff:g>\n下一週期會在 <xliff:g id="USED_3">%4$d</xliff:g> 天後開始 (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> ٪),週期上限為 <xliff:g id="USED_2">%3$s</xliff:g>"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"已達 <xliff:g id="USED_0">%1$s</xliff:g> 上限\n資料速率降低至 <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"已經過 <xliff:g id="USED_0">%1$d</xliff:g>٪ 的循環週期\n下一週期會在 <xliff:g id="USED_1">%2$d</xliff:g> 天後開始 (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -510,7 +512,7 @@
<string name="voicemail_settings_number_label" msgid="1265118640154688162">"留言信箱號碼"</string>
<string name="card_title_dialing" msgid="8742182654254431781">"撥號中"</string>
<string name="card_title_redialing" msgid="18130232613559964">"重撥"</string>
- <string name="card_title_conf_call" msgid="901197309274457427">"視像會議"</string>
+ <string name="card_title_conf_call" msgid="901197309274457427">"視訊會議"</string>
<string name="card_title_incoming_call" msgid="881424648458792430">"來電"</string>
<string name="card_title_call_ended" msgid="650223980095026340">"通話已結束"</string>
<string name="card_title_on_hold" msgid="9028319436626975207">"保留通話"</string>
@@ -637,12 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"是"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"否"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"關閉"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"手機處於緊急回撥模式"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"直至<xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">手機在接下來的 <xliff:g id="COUNT_1">%s</xliff:g> 分鐘都將處於緊急回撥模式。\n您要立即退出嗎?</item>
- <item quantity="one">手機在接下來的 <xliff:g id="COUNT_0">%s</xliff:g> 分鐘都將處於緊急回撥模式。\n您要立即退出嗎?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"服務"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"設定"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<未設定>"</string>
@@ -898,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"重新整理"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"切換 DNS 檢查"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM 專用資訊/設定"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC 可用:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR 受限:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR 可用:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR 狀態:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR 頻率:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"設定無線電頻段模式"</string>
<string name="band_mode_loading" msgid="795923726636735967">"正在載入頻段清單…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"設定"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 585f332..9a7a0df 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -22,7 +22,7 @@
<string name="phoneIconLabel" msgid="3015941229249651419">"電話"</string>
<string name="fdnListLabel" msgid="4119121875004244097">"固定撥號清單"</string>
<string name="unknown" msgid="8279698889921830815">"不明"</string>
- <string name="private_num" msgid="4487990167889159992">"隱藏號碼"</string>
+ <string name="private_num" msgid="4487990167889159992">"私人號碼"</string>
<string name="payphone" msgid="7936735771836716941">"公用電話"</string>
<string name="onHold" msgid="6132725550015899006">"通話保留"</string>
<string name="carrier_mmi_msg_title" msgid="6050165242447507034">"「<xliff:g id="MMICARRIER">%s</xliff:g>」的訊息"</string>
@@ -96,7 +96,7 @@
<string name="sum_hide_caller_id" msgid="131100328602371933">"隱藏本機號碼"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"撥出電話時顯示本機號碼"</string>
<string name="sum_default_caller_id" msgid="1767070797135682959">"使用預設值,在撥出電話時顯示本機號碼"</string>
- <string name="labelCW" msgid="8449327023861428622">"來電等候"</string>
+ <string name="labelCW" msgid="8449327023861428622">"來電等待"</string>
<string name="sum_cw_enabled" msgid="3977308526187139996">"通話時如有來電請通知我"</string>
<string name="sum_cw_disabled" msgid="3658094589461768637">"通話時如有來電請通知我"</string>
<string name="call_forwarding_settings" msgid="8937130467468257671">"來電轉接設定"</string>
@@ -307,7 +307,9 @@
<string name="throttle_time_frame" msgid="1813452485948918791">"資料使用量週期"</string>
<string name="throttle_rate" msgid="7641913901133634905">"資料傳輸速率政策"</string>
<string name="throttle_help" msgid="2624535757028809735">"瞭解更多資訊"</string>
- <string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪),週期上限為 <xliff:g id="USED_2">%3$s</xliff:g>\n下一週期會在 <xliff:g id="USED_3">%4$d</xliff:g> 天後開始 (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for throttle_status_subtext (1110276415078236687) -->
+ <skip />
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> ٪),週期上限為 <xliff:g id="USED_2">%3$s</xliff:g>"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"已達 <xliff:g id="USED_0">%1$s</xliff:g> 上限\n資料速率降低至 <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"已經過 <xliff:g id="USED_0">%1$d</xliff:g> ٪ 的循環週期\n下一週期會在 <xliff:g id="USED_1">%2$d</xliff:g> 天內開始 (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
@@ -637,12 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"是"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"否"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"關閉"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"手機目前處於緊急回撥模式"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"結束時間:<xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="other">接下來的 <xliff:g id="COUNT_1">%s</xliff:g> 分鐘內,手機將處於緊急回撥模式。\n要立即退出這個模式嗎?</item>
- <item quantity="one">接下來的 <xliff:g id="COUNT_0">%s</xliff:g> 分鐘內,手機將處於緊急回撥模式。\n要立即退出這個模式嗎?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"服務"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"設定"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<未設定>"</string>
@@ -898,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"重新整理"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"切換 DNS 檢查"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"原始設備製造商 (OEM) 專用資訊/設定"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC 可供使用:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR 受限:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"NR 可供使用:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"NR 狀態:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR 頻率:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"設定無線電頻帶模式"</string>
<string name="band_mode_loading" msgid="795923726636735967">"正在載入頻帶清單…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"設定"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index b5180d8..8c0a4b8 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -639,12 +639,6 @@
<string name="alert_dialog_yes" msgid="3532525979632841417">"Yebo"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"Cha"</string>
<string name="alert_dialog_dismiss" msgid="1336356286354517054">"Susa"</string>
- <string name="phone_in_ecm_call_notification_text_without_data_restriction_hint" msgid="3747860785153531225">"Ifoni ikumodi yokushaya okuphuthumayo"</string>
- <string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Kuze kube ngu-<xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
- <item quantity="one">Ifoni izoba kumodi yokushaya kwesimo esiphuthumayo amaminithi angu-<xliff:g id="COUNT_1">%s</xliff:g>.\nIngabe ufuna ukuphuma manje?</item>
- <item quantity="other">Ifoni izoba kumodi yokushaya kwesimo esiphuthumayo amaminithi angu-<xliff:g id="COUNT_1">%s</xliff:g>.\nIngabe ufuna ukuphuma manje?</item>
- </plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Isevisi"</string>
<string name="voicemail_settings" msgid="4451045613238972776">"Ukumisa"</string>
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<Ayisethiwe>"</string>
@@ -900,11 +894,6 @@
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Vuselela"</string>
<string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Guqula ukuhlola i-DNS"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"Ulwazi oucacile kwe-OEM/Izilungiselelo"</string>
- <string name="radio_info_endc_available" msgid="4410653375290113436">"I-EN-DC Iyatholakala:"</string>
- <string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"Okukhawulelwe kwe-DCNR:"</string>
- <string name="radio_info_nr_available" msgid="1321318331361249997">"I-NR Iyatholakala:"</string>
- <string name="radio_info_nr_state" msgid="1337571996788535356">"Isimo se-NR:"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"Imvamisa ye-NR:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"Isetha imodi yebhendi yerediyo"</string>
<string name="band_mode_loading" msgid="795923726636735967">"Ilayisha uhlu lwebhendi…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Setha"</string>
diff --git a/res/values/config.xml b/res/values/config.xml
index 7e71068..f69120f 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -211,9 +211,6 @@
CarrierConfigManager.KEY_CARRIER_VVM_PACKAGE_NAME_STRING does not handle it -->
<string name="system_visual_voicemail_client" translatable="false"/>
- <!-- Flag to enable VVM3 visual voicemail. VVM3 is used by Verizon Wireless. -->
- <bool name="vvm3_enabled">false</bool>
-
<!-- Flag indicating whether to allow pstn phone accounts [DO NOT TRANSLATE] -->
<bool name="config_pstn_phone_accounts_enabled">true</bool>
@@ -299,4 +296,11 @@
<item>250</item>
<item>350</item>
</integer-array>
+
+ <!-- String indicating the package name of the device GbaService implementation. -->
+ <string name="config_gba_package" translatable="false"/>
+ <!-- The interval to release/unbind GbaService after the authentication request
+ by millisecond. -1 - no release, 0 - release immediately,
+ positive n - release in n milliseconds -->
+ <integer name="config_gba_release_time">0</integer>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6509f13..83a5673 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -107,6 +107,8 @@
<!-- network depersonalization -->
<!-- Label text for PIN entry widget on SIM Network Depersonalization panel -->
<string name="label_ndp">SIM network unlock PIN</string>
+ <!-- Label text for Operator displayName on SIM Network Depersonalization panel -->
+ <string name="label_phoneid">SIM locked for operator</string>
<!-- Button label on SIM Network Depersonalization panel -->
<string name="sim_ndp_unlock_text">Unlock</string>
<!-- Button label on SIM Network Depersonalization panel -->
@@ -273,6 +275,15 @@
<string name="sum_cfnrc_disabled">Off</string>
<!-- Error message displayed after failing to disable forwarding calls when the phone is unreachable -->
<string name="disable_cfnrc_forbidden">Your carrier doesn\'t support disabling call forwarding when your phone is unreachable.</string>
+ <string name="registration_cf_forbidden">Your carrier doesn\'t support call forwarding.</string>
+
+ <!-- Cdma Call waiting settings screen, setting option name -->
+ <string name="cdma_call_waiting">Turn on call waiting?</string>
+ <string name="enable_cdma_call_waiting_setting">During a call, you\'ll be notified about incoming calls</string>
+ <string name="enable_cdma_cw">Turn on</string>
+ <string name="disable_cdma_cw">Cancel</string>
+ <string name="cdma_call_waiting_in_ims_on">CDMA Call Waiting under IMS On</string>
+ <string name="cdma_call_waiting_in_ims_off">CDMA Call Waiting under IMS Off</string>
<!-- Title of the progress dialog displayed while updating Call settings -->
<string name="updating_title">Call settings</string>
@@ -2068,8 +2079,6 @@
<!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
<string name="radio_info_ul_kbps">UL Bandwidth (kbps):</string>
<!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
- <string name="radio_info_signal_location_label">Cell Location Info (deprecated):</string>
- <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
<string name="radio_info_phy_chan_config">LTE Physical Channel Configuration:</string>
<!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
<string name="radio_info_cell_info_refresh_rate">Cell Info Refresh Rate:</string>
@@ -2163,5 +2172,4 @@
<string name="carrier_provisioning">Carrier Provisioning Info</string>
<!-- Trigger Carrier Provisioning [CHAR LIMIT=NONE] -->
<string name="trigger_carrier_provisioning">Trigger Carrier Provisioning</string>
-
</resources>
diff --git a/res/xml/cdma_call_privacy.xml b/res/xml/cdma_call_privacy.xml
index 1aeeefe..a16a504 100644
--- a/res/xml/cdma_call_privacy.xml
+++ b/res/xml/cdma_call_privacy.xml
@@ -7,4 +7,14 @@
android:title="@string/voice_privacy"
android:persistent="false"
android:summary="@string/voice_privacy_summary"/>
+
+ <PreferenceScreen
+ android:key="call_forwarding_key"
+ android:title="@string/labelCF"
+ android:persistent="false" />
+
+ <com.android.phone.CdmaCallWaitingPreference
+ android:key="call_waiting_key"
+ android:title="@string/labelCW"
+ android:persistent="false" />
</PreferenceScreen>
diff --git a/sip/res/values-ar/strings.xml b/sip/res/values-ar/strings.xml
index 4cc9450..e971077 100644
--- a/sip/res/values-ar/strings.xml
+++ b/sip/res/values-ar/strings.xml
@@ -34,7 +34,7 @@
<string name="sip_menu_save" msgid="4377112554203123060">"حفظ"</string>
<string name="sip_menu_discard" msgid="1883166691772895243">"إلغاء"</string>
<string name="alert_dialog_close" msgid="1734746505531110706">"إغلاق الملف الشخصي"</string>
- <string name="alert_dialog_ok" msgid="7806760618798687406">"حسنًا"</string>
+ <string name="alert_dialog_ok" msgid="7806760618798687406">"موافق"</string>
<string name="close_profile" msgid="3756064641769751774">"إغلاق"</string>
<string name="registration_status_checking_status" msgid="884179594507591180">"جارٍ فحص الحالة…"</string>
<string name="registration_status_registering" msgid="7986331597809521791">"جارٍ التسجيل…"</string>
@@ -61,9 +61,9 @@
<string name="advanced_settings" msgid="2704644977548662872">"الإعدادات الاختيارية"</string>
<string name="auth_username_title" msgid="9002505242616662698">"اسم المستخدِم للمصادقة"</string>
<string name="auth_username_summary" msgid="6346313945275377230">"اسم المستخدِم المستخدَم للمصادقة"</string>
- <string name="default_preference_summary_username" msgid="8788114717555599222">"<لم يتم الضبط>"</string>
- <string name="default_preference_summary_password" msgid="3695366978153175549">"<لم يتم الضبط>"</string>
- <string name="default_preference_summary_domain_address" msgid="443247296785732364">"<لم يتم الضبط>"</string>
+ <string name="default_preference_summary_username" msgid="8788114717555599222">"<لم يتم التعيين>"</string>
+ <string name="default_preference_summary_password" msgid="3695366978153175549">"<لم يتم التعيين>"</string>
+ <string name="default_preference_summary_domain_address" msgid="443247296785732364">"<لم يتم التعيين>"</string>
<string name="display_name_summary" msgid="6749135030093260358">"<مثل اسم المستخدم>"</string>
<string name="optional_summary" msgid="620379377865437488">"<اختياري>"</string>
<string name="advanced_settings_show" msgid="2318728080037568529">"▷ المس لإظهار الكل"</string>
diff --git a/sip/res/values-b+sr+Latn/strings.xml b/sip/res/values-b+sr+Latn/strings.xml
index adb537b..dadfa20 100644
--- a/sip/res/values-b+sr+Latn/strings.xml
+++ b/sip/res/values-b+sr+Latn/strings.xml
@@ -22,7 +22,7 @@
<string name="sip_receive_calls" msgid="3403644006618369349">"Primaj dolazne pozive"</string>
<string name="sip_receive_calls_summary" msgid="5306603671778761443">"Više troši bateriju"</string>
<string name="sip_call_options_title" msgid="5027066677561068192">"Koristite SIP pozivanje"</string>
- <string name="sip_call_options_wifi_only_title" msgid="6663105297927456484">"Koristite SIP pozivanje (samo za WiFi)"</string>
+ <string name="sip_call_options_wifi_only_title" msgid="6663105297927456484">"Koristite SIP pozivanje (samo za Wi-Fi)"</string>
<string name="sip_call_options_entry_1" msgid="4722647332760934261">"Za sve pozive kada je mreža za prenos podataka dostupna"</string>
<string name="sip_call_options_entry_2" msgid="7338504256051655013">"Samo za SIP pozive"</string>
<string name="sip_call_options_wifi_only_entry_1" msgid="922329055414010991">"Za sve pozive"</string>
@@ -41,7 +41,7 @@
<string name="registration_status_still_trying" msgid="7178623685868766282">"I dalje pokušava..."</string>
<string name="registration_status_not_receiving" msgid="3873074208531938401">"Ne primamo pozive."</string>
<string name="registration_status_no_data" msgid="2987064560116584121">"Registracija naloga je zaustavljena zato što ne postoji internet veza."</string>
- <string name="registration_status_no_wifi_data" msgid="685470618241482948">"Registracija naloga je zaustavljena zato što ne postoji WiFi veza."</string>
+ <string name="registration_status_no_wifi_data" msgid="685470618241482948">"Registracija naloga je zaustavljena zato što ne postoji Wi-Fi veza."</string>
<string name="registration_status_not_running" msgid="6236403137652262659">"Registracija naloga nije uspela."</string>
<string name="registration_status_done" msgid="6787397199273357721">"Primamo pozive."</string>
<string name="registration_status_failed_try_later" msgid="7855389184910312091">"Registracija naloga nije uspela: <xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>; pokušaćemo kasnije"</string>
@@ -72,7 +72,7 @@
<string name="empty_alert" msgid="3693655518612836718">"Polje <xliff:g id="INPUT_FIELD_NAME">%s</xliff:g> je obavezno i ne može da bude prazno."</string>
<string name="not_a_valid_port" msgid="3664668836663491376">"Broj porta bi trebalo da bude između 1000 i 65.534."</string>
<string name="no_internet_available" msgid="161720645084325479">"Da biste uputili SIP poziv, prvo proverite internet vezu."</string>
- <string name="no_wifi_available" msgid="1179092018692306312">"Treba da budete povezani sa WiFi mrežom da biste upućivali SIP pozive (koristite Podešavanja bežičnih veza i mreža)."</string>
+ <string name="no_wifi_available" msgid="1179092018692306312">"Treba da budete povezani sa Wi-Fi mrežom da biste upućivali SIP pozive (koristite Podešavanja bežičnih veza i mreža)."</string>
<string name="no_voip" msgid="3366395789297981738">"SIP pozivanje nije podržano"</string>
<string name="sip_system_decide" msgid="197230378376326430">"Automatski"</string>
<string name="sip_always_send_keepalive" msgid="4986533673960084769">"Uvek šalji"</string>
diff --git a/sip/res/values-bs/strings.xml b/sip/res/values-bs/strings.xml
index cc0f175..69aa5a8 100644
--- a/sip/res/values-bs/strings.xml
+++ b/sip/res/values-bs/strings.xml
@@ -72,7 +72,7 @@
<string name="empty_alert" msgid="3693655518612836718">"<xliff:g id="INPUT_FIELD_NAME">%s</xliff:g> je obavezno polje i ne može biti prazno."</string>
<string name="not_a_valid_port" msgid="3664668836663491376">"Broj priključka treba biti između 1000 i 65534."</string>
<string name="no_internet_available" msgid="161720645084325479">"Da uputite SIP poziv, prvo provjerite internet vezu."</string>
- <string name="no_wifi_available" msgid="1179092018692306312">"Trebate biti povezani s WiFi mrežom za SIP pozive (koristite postavke Bežično povezivanje i mreža)."</string>
+ <string name="no_wifi_available" msgid="1179092018692306312">"Trebate biti povezani na Wi-FI mrežu za SIP pozive (koristite postavke Bežično povezivanje i mreža)."</string>
<string name="no_voip" msgid="3366395789297981738">"SIP pozivanje nije podržano"</string>
<string name="sip_system_decide" msgid="197230378376326430">"Automatski"</string>
<string name="sip_always_send_keepalive" msgid="4986533673960084769">"Uvijek pošalji"</string>
diff --git a/sip/res/values-eu/strings.xml b/sip/res/values-eu/strings.xml
index 5ad7d9c..5c7b0ce 100644
--- a/sip/res/values-eu/strings.xml
+++ b/sip/res/values-eu/strings.xml
@@ -26,7 +26,7 @@
<string name="sip_call_options_entry_1" msgid="4722647332760934261">"Dei guztietan datu-sarea erabilgarri dagoenean"</string>
<string name="sip_call_options_entry_2" msgid="7338504256051655013">"SIP deietan soilik"</string>
<string name="sip_call_options_wifi_only_entry_1" msgid="922329055414010991">"Dei guztietan"</string>
- <string name="add_sip_account" msgid="5754758646745144384">"Gehitu kontu bat"</string>
+ <string name="add_sip_account" msgid="5754758646745144384">"Gehitu kontua"</string>
<string name="remove_sip_account" msgid="8272617403399636513">"Kendu kontua"</string>
<string name="sip_account_list" msgid="2596262496233721769">"SIP kontuak"</string>
<string name="saving_account" msgid="3390358043846687266">"Kontua gordetzen…"</string>
@@ -41,7 +41,7 @@
<string name="registration_status_still_trying" msgid="7178623685868766282">"Oraindik saiatzen…"</string>
<string name="registration_status_not_receiving" msgid="3873074208531938401">"Ez da deirik jasotzen ari."</string>
<string name="registration_status_no_data" msgid="2987064560116584121">"Kontua erregistratzeko prozesua gelditu da ez zaudelako konektatuta Internetera."</string>
- <string name="registration_status_no_wifi_data" msgid="685470618241482948">"Kontua erregistratzeko prozesua gelditu da ez dagoelako wifi-konexiorik."</string>
+ <string name="registration_status_no_wifi_data" msgid="685470618241482948">"Kontua erregistratzeko prozesua gelditu da ez dagoelako wifi bidezko konexiorik."</string>
<string name="registration_status_not_running" msgid="6236403137652262659">"Ez da kontua erregistratu."</string>
<string name="registration_status_done" msgid="6787397199273357721">"Deiak jasotzen."</string>
<string name="registration_status_failed_try_later" msgid="7855389184910312091">"Ez da kontua erregistratu: (<xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>). Geroago saiatuko gara berriro."</string>
@@ -72,7 +72,7 @@
<string name="empty_alert" msgid="3693655518612836718">"<xliff:g id="INPUT_FIELD_NAME">%s</xliff:g> behar da eta ezin da hutsik utzi."</string>
<string name="not_a_valid_port" msgid="3664668836663491376">"Ataka-zenbakiak 1000 eta 65534 artean egon behar luke."</string>
<string name="no_internet_available" msgid="161720645084325479">"SIP deiak egiteko, egiaztatu Internetera konektatuta zaudela."</string>
- <string name="no_wifi_available" msgid="1179092018692306312">"Wifi-sare batera konektatuta egon behar zara SIP deiak egiteko (erabili hari gabekoen eta sareen ezarpenak)."</string>
+ <string name="no_wifi_available" msgid="1179092018692306312">"Wi-Fi sare batera konektatuta egon behar zara SIP deiak egiteko (erabili hari gabekoen eta sareen ezarpenak)."</string>
<string name="no_voip" msgid="3366395789297981738">"SIP deiak ez dira onartzen"</string>
<string name="sip_system_decide" msgid="197230378376326430">"Automatikoa"</string>
<string name="sip_always_send_keepalive" msgid="4986533673960084769">"Bidali beti"</string>
diff --git a/sip/res/values-fa/strings.xml b/sip/res/values-fa/strings.xml
index e2843bc..6a0f0bf 100644
--- a/sip/res/values-fa/strings.xml
+++ b/sip/res/values-fa/strings.xml
@@ -59,8 +59,8 @@
<string name="transport_title" msgid="1661659138226029178">"نوع حملونقل"</string>
<string name="send_keepalive_title" msgid="5319788151608946049">"ارسال حفظ اتصال"</string>
<string name="advanced_settings" msgid="2704644977548662872">"تنظیمات اختیاری"</string>
- <string name="auth_username_title" msgid="9002505242616662698">"نام کاربری برای اصالتسنجی"</string>
- <string name="auth_username_summary" msgid="6346313945275377230">"نام کاربری مورد استفاده برای اصالتسنجی"</string>
+ <string name="auth_username_title" msgid="9002505242616662698">"نام کاربری برای احراز هویت"</string>
+ <string name="auth_username_summary" msgid="6346313945275377230">"نام کاربری مورد استفاده برای احراز هویت"</string>
<string name="default_preference_summary_username" msgid="8788114717555599222">"<تنظیم نشده>"</string>
<string name="default_preference_summary_password" msgid="3695366978153175549">"<تنظیم نشده>"</string>
<string name="default_preference_summary_domain_address" msgid="443247296785732364">"<تنظیم نشده>"</string>
diff --git a/sip/res/values-gu/strings.xml b/sip/res/values-gu/strings.xml
index 9eb810b..aa32a85 100644
--- a/sip/res/values-gu/strings.xml
+++ b/sip/res/values-gu/strings.xml
@@ -18,7 +18,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="sip_settings" msgid="7452587325305604702">"SIP સેટિંગ્સ"</string>
<string name="sip_accounts" msgid="7297896885665783239">"SIP એકાઉન્ટ્સ"</string>
- <string name="sip_accounts_title" msgid="3061686404598143943">"એકાઉન્ટ"</string>
+ <string name="sip_accounts_title" msgid="3061686404598143943">"એકાઉન્ટ્સ"</string>
<string name="sip_receive_calls" msgid="3403644006618369349">"આવનારા કૉલ્સ પ્રાપ્ત કરો"</string>
<string name="sip_receive_calls_summary" msgid="5306603671778761443">"બધુ બૅટરીની આવરદાનો ઉપયોગ કરે છે"</string>
<string name="sip_call_options_title" msgid="5027066677561068192">"SIP કૉલિંગનો ઉપયોગ કરો"</string>
diff --git a/sip/res/values-in/strings.xml b/sip/res/values-in/strings.xml
index 709205c..535e5ac 100644
--- a/sip/res/values-in/strings.xml
+++ b/sip/res/values-in/strings.xml
@@ -40,7 +40,7 @@
<string name="registration_status_registering" msgid="7986331597809521791">"Mendaftarkan..."</string>
<string name="registration_status_still_trying" msgid="7178623685868766282">"Masih mencoba..."</string>
<string name="registration_status_not_receiving" msgid="3873074208531938401">"Tidak menerima panggilan."</string>
- <string name="registration_status_no_data" msgid="2987064560116584121">"Pendaftaran akun terhenti karena tidak ada koneksi internet."</string>
+ <string name="registration_status_no_data" msgid="2987064560116584121">"Pendaftaran akun terhenti karena tidak ada sambungan internet."</string>
<string name="registration_status_no_wifi_data" msgid="685470618241482948">"Pendaftaran akun terhenti karena tidak ada sambungan Wi-Fi."</string>
<string name="registration_status_not_running" msgid="6236403137652262659">"Pendaftaran akun gagal."</string>
<string name="registration_status_done" msgid="6787397199273357721">"Menerima panggilan."</string>
@@ -71,7 +71,7 @@
<string name="all_empty_alert" msgid="6085603517610199098">"Masukkan detail akun SIP baru."</string>
<string name="empty_alert" msgid="3693655518612836718">"<xliff:g id="INPUT_FIELD_NAME">%s</xliff:g> diwajibkan dan tidak boleh kosong."</string>
<string name="not_a_valid_port" msgid="3664668836663491376">"Nomor port harus dalam rentang 1000 dan 65534."</string>
- <string name="no_internet_available" msgid="161720645084325479">"Untuk melakukan panggilan SIP, periksa koneksi internet terlebih dahulu."</string>
+ <string name="no_internet_available" msgid="161720645084325479">"Untuk melakukan panggilan SIP, periksa sambungan internet terlebih dahulu."</string>
<string name="no_wifi_available" msgid="1179092018692306312">"Anda harus tersambung ke jaringan Wi-Fi untuk melakukan panggilan SIP (gunakan setelan Nirkabel & Jaringan)."</string>
<string name="no_voip" msgid="3366395789297981738">"Panggilan SIP tidak didukung"</string>
<string name="sip_system_decide" msgid="197230378376326430">"Otomatis"</string>
diff --git a/sip/res/values-ky/strings.xml b/sip/res/values-ky/strings.xml
index 6916f24..23d5561 100644
--- a/sip/res/values-ky/strings.xml
+++ b/sip/res/values-ky/strings.xml
@@ -40,7 +40,7 @@
<string name="registration_status_registering" msgid="7986331597809521791">"Катталууда…"</string>
<string name="registration_status_still_trying" msgid="7178623685868766282">"Дагы эле аракет жасалууда…"</string>
<string name="registration_status_not_receiving" msgid="3873074208531938401">"Чалуулар кабыл алынбайт"</string>
- <string name="registration_status_no_data" msgid="2987064560116584121">"Интернет жок болгондуктан, эсепти каттоо аракети токтотулду."</string>
+ <string name="registration_status_no_data" msgid="2987064560116584121">"Интернет байланышы жок болгондуктан, эсепти каттоо аракети токтотулду."</string>
<string name="registration_status_no_wifi_data" msgid="685470618241482948">"Wi-Fi байланышы жок болгондуктан, эсепти каттоо аракети токтотулду."</string>
<string name="registration_status_not_running" msgid="6236403137652262659">"Эсеп катталбай калды."</string>
<string name="registration_status_done" msgid="6787397199273357721">"Чалуулар кабыл алынат."</string>
diff --git a/sip/res/values-mk/strings.xml b/sip/res/values-mk/strings.xml
index f6b568a..b810af8 100644
--- a/sip/res/values-mk/strings.xml
+++ b/sip/res/values-mk/strings.xml
@@ -26,7 +26,7 @@
<string name="sip_call_options_entry_1" msgid="4722647332760934261">"За сите повици кога е достапна мрежа на податоци"</string>
<string name="sip_call_options_entry_2" msgid="7338504256051655013">"Само за повици со SIP"</string>
<string name="sip_call_options_wifi_only_entry_1" msgid="922329055414010991">"За сите повици"</string>
- <string name="add_sip_account" msgid="5754758646745144384">"Додајте сметка"</string>
+ <string name="add_sip_account" msgid="5754758646745144384">"Додај сметка"</string>
<string name="remove_sip_account" msgid="8272617403399636513">"Отстрани сметка"</string>
<string name="sip_account_list" msgid="2596262496233721769">"Сметки за SIP"</string>
<string name="saving_account" msgid="3390358043846687266">"Зачувување на сметката..."</string>
diff --git a/sip/res/values-mr/strings.xml b/sip/res/values-mr/strings.xml
index 60d9c88..252b3bf 100644
--- a/sip/res/values-mr/strings.xml
+++ b/sip/res/values-mr/strings.xml
@@ -45,13 +45,13 @@
<string name="registration_status_not_running" msgid="6236403137652262659">"खाते नोंदणी अयशस्वी."</string>
<string name="registration_status_done" msgid="6787397199273357721">"कॉल प्राप्त करत आहे."</string>
<string name="registration_status_failed_try_later" msgid="7855389184910312091">"खाते नोंदणी अयशस्वी: (<xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>); नंतर प्रयत्न करू"</string>
- <string name="registration_status_invalid_credentials" msgid="8896714049938660777">"खाते नोंदणी अयशस्वी: चुकीचे वापरकर्ता नाव किंवा संकेतशब्द."</string>
+ <string name="registration_status_invalid_credentials" msgid="8896714049938660777">"खाते नोंदणी अयशस्वी: चुकीचे वापरकर्तानाव किंवा संकेतशब्द."</string>
<string name="registration_status_server_unreachable" msgid="3832339558868965604">"खाते नोंदणी अयशस्वी: सर्व्हर नाव तपासा."</string>
<string name="third_party_account_summary" msgid="5918779106950859167">"हे खाते सध्या <xliff:g id="ACCOUNT_OWNER">%s</xliff:g> अॅपद्वारे वापरात आहे."</string>
<string name="sip_edit_title" msgid="7438891546610820307">"SIP खाते तपशील"</string>
<string name="sip_edit_new_title" msgid="8394790068979636381">"SIP खाते तपशील"</string>
<string name="domain_address_title" msgid="8238078615181248579">"सर्व्हर"</string>
- <string name="username_title" msgid="298416796886107970">"वापरकर्ता नाव"</string>
+ <string name="username_title" msgid="298416796886107970">"वापरकर्तानाव"</string>
<string name="password_title" msgid="8035579335591959021">"पासवर्ड"</string>
<string name="display_name_title" msgid="3730105783656830160">"प्रदर्शन नाव"</string>
<string name="proxy_address_title" msgid="4120361943254795287">"आउटबाउंड प्रॉक्सी पत्ता"</string>
@@ -60,7 +60,7 @@
<string name="send_keepalive_title" msgid="5319788151608946049">"चैतन्यमय-ठेवा पाठवा"</string>
<string name="advanced_settings" msgid="2704644977548662872">"पर्यायी सेटिंग्ज"</string>
<string name="auth_username_title" msgid="9002505242616662698">"ऑथेंटिकेशन वापरकर्ता नाव"</string>
- <string name="auth_username_summary" msgid="6346313945275377230">"प्रमाणीकरणासाठी वापरकर्ता नाव वापरले"</string>
+ <string name="auth_username_summary" msgid="6346313945275377230">"प्रमाणीकरणासाठी वापरकर्तानाव वापरले"</string>
<string name="default_preference_summary_username" msgid="8788114717555599222">"<सेट नाही>"</string>
<string name="default_preference_summary_password" msgid="3695366978153175549">"<सेट नाही>"</string>
<string name="default_preference_summary_domain_address" msgid="443247296785732364">"<सेट नाही>"</string>
diff --git a/sip/res/values-ne/strings.xml b/sip/res/values-ne/strings.xml
index 9fc1263..3b33681 100644
--- a/sip/res/values-ne/strings.xml
+++ b/sip/res/values-ne/strings.xml
@@ -45,7 +45,7 @@
<string name="registration_status_not_running" msgid="6236403137652262659">"खाता दर्ता गर्न विफल"</string>
<string name="registration_status_done" msgid="6787397199273357721">"कलहरू प्राप्त गर्दै।"</string>
<string name="registration_status_failed_try_later" msgid="7855389184910312091">"खाता दर्ता गर्न विफल: (<xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>); पछि प्रयास गर्नुहोस्"</string>
- <string name="registration_status_invalid_credentials" msgid="8896714049938660777">"खाता दर्ता प्रक्रिया असफल: गलत युजरनेम वा पासवर्ड।"</string>
+ <string name="registration_status_invalid_credentials" msgid="8896714049938660777">"खाता दर्ता प्रक्रिया असफल: गलत प्रयोगकर्ताको नाम वा पासवर्ड।"</string>
<string name="registration_status_server_unreachable" msgid="3832339558868965604">"खाता दर्ता गर्न असफल: सर्भरको नाम जाँच गर्नुहोस्।"</string>
<string name="third_party_account_summary" msgid="5918779106950859167">"<xliff:g id="ACCOUNT_OWNER">%s</xliff:g> अनुप्रयोगद्वारा यो खाता हाल प्रयोगमा छ।"</string>
<string name="sip_edit_title" msgid="7438891546610820307">"SIP खाता विवरणहरू"</string>
diff --git a/sip/res/values-pt-rPT/strings.xml b/sip/res/values-pt-rPT/strings.xml
index 35aca3e..ae1b2ed 100644
--- a/sip/res/values-pt-rPT/strings.xml
+++ b/sip/res/values-pt-rPT/strings.xml
@@ -47,7 +47,7 @@
<string name="registration_status_failed_try_later" msgid="7855389184910312091">"O registo da conta não teve êxito: (<xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>); tentaremos mais tarde"</string>
<string name="registration_status_invalid_credentials" msgid="8896714049938660777">"O registo da conta não teve êxito: palavra-passe ou nome de utilizador incorreto"</string>
<string name="registration_status_server_unreachable" msgid="3832339558868965604">"O registo da conta não teve êxito: verifique o nome do servidor."</string>
- <string name="third_party_account_summary" msgid="5918779106950859167">"Esta conta está atualmente a ser utilizada pela app <xliff:g id="ACCOUNT_OWNER">%s</xliff:g>."</string>
+ <string name="third_party_account_summary" msgid="5918779106950859167">"Esta conta está atualmente a ser utilizada pela aplicação <xliff:g id="ACCOUNT_OWNER">%s</xliff:g>."</string>
<string name="sip_edit_title" msgid="7438891546610820307">"Detalhes da conta SIP"</string>
<string name="sip_edit_new_title" msgid="8394790068979636381">"Detalhes da conta SIP"</string>
<string name="domain_address_title" msgid="8238078615181248579">"Servidor"</string>
diff --git a/sip/res/values-sq/strings.xml b/sip/res/values-sq/strings.xml
index 5c50085..1b83380 100644
--- a/sip/res/values-sq/strings.xml
+++ b/sip/res/values-sq/strings.xml
@@ -32,7 +32,7 @@
<string name="saving_account" msgid="3390358043846687266">"Po ruan llogarinë…"</string>
<string name="removing_account" msgid="1544132880414780408">"Po heq llogarinë…"</string>
<string name="sip_menu_save" msgid="4377112554203123060">"Ruaj"</string>
- <string name="sip_menu_discard" msgid="1883166691772895243">"Hiq"</string>
+ <string name="sip_menu_discard" msgid="1883166691772895243">"Injoro"</string>
<string name="alert_dialog_close" msgid="1734746505531110706">"Mbyll profilin"</string>
<string name="alert_dialog_ok" msgid="7806760618798687406">"Në rregull"</string>
<string name="close_profile" msgid="3756064641769751774">"Mbyll"</string>
diff --git a/sip/res/values-sr/strings.xml b/sip/res/values-sr/strings.xml
index 4c15528..f877e1b 100644
--- a/sip/res/values-sr/strings.xml
+++ b/sip/res/values-sr/strings.xml
@@ -22,7 +22,7 @@
<string name="sip_receive_calls" msgid="3403644006618369349">"Примај долазне позиве"</string>
<string name="sip_receive_calls_summary" msgid="5306603671778761443">"Више троши батерију"</string>
<string name="sip_call_options_title" msgid="5027066677561068192">"Користите SIP позивање"</string>
- <string name="sip_call_options_wifi_only_title" msgid="6663105297927456484">"Користите SIP позивање (само за WiFi)"</string>
+ <string name="sip_call_options_wifi_only_title" msgid="6663105297927456484">"Користите SIP позивање (само за Wi-Fi)"</string>
<string name="sip_call_options_entry_1" msgid="4722647332760934261">"За све позиве када је мрежа за пренос података доступна"</string>
<string name="sip_call_options_entry_2" msgid="7338504256051655013">"Само за SIP позиве"</string>
<string name="sip_call_options_wifi_only_entry_1" msgid="922329055414010991">"За све позиве"</string>
@@ -41,7 +41,7 @@
<string name="registration_status_still_trying" msgid="7178623685868766282">"И даље покушава..."</string>
<string name="registration_status_not_receiving" msgid="3873074208531938401">"Не примамо позиве."</string>
<string name="registration_status_no_data" msgid="2987064560116584121">"Регистрација налога је заустављена зато што не постоји интернет веза."</string>
- <string name="registration_status_no_wifi_data" msgid="685470618241482948">"Регистрација налога је заустављена зато што не постоји WiFi веза."</string>
+ <string name="registration_status_no_wifi_data" msgid="685470618241482948">"Регистрација налога је заустављена зато што не постоји Wi-Fi веза."</string>
<string name="registration_status_not_running" msgid="6236403137652262659">"Регистрација налога није успела."</string>
<string name="registration_status_done" msgid="6787397199273357721">"Примамо позиве."</string>
<string name="registration_status_failed_try_later" msgid="7855389184910312091">"Регистрација налога није успела: <xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>; покушаћемо касније"</string>
@@ -72,7 +72,7 @@
<string name="empty_alert" msgid="3693655518612836718">"Поље <xliff:g id="INPUT_FIELD_NAME">%s</xliff:g> је обавезно и не може да буде празно."</string>
<string name="not_a_valid_port" msgid="3664668836663491376">"Број порта би требало да буде између 1000 и 65.534."</string>
<string name="no_internet_available" msgid="161720645084325479">"Да бисте упутили SIP позив, прво проверите интернет везу."</string>
- <string name="no_wifi_available" msgid="1179092018692306312">"Треба да будете повезани са WiFi мрежом да бисте упућивали SIP позиве (користите Подешавања бежичних веза и мрежа)."</string>
+ <string name="no_wifi_available" msgid="1179092018692306312">"Треба да будете повезани са Wi-Fi мрежом да бисте упућивали SIP позиве (користите Подешавања бежичних веза и мрежа)."</string>
<string name="no_voip" msgid="3366395789297981738">"SIP позивање није подржано"</string>
<string name="sip_system_decide" msgid="197230378376326430">"Аутоматски"</string>
<string name="sip_always_send_keepalive" msgid="4986533673960084769">"Увек шаљи"</string>
diff --git a/sip/res/values-uz/strings.xml b/sip/res/values-uz/strings.xml
index f951de2..e6d00e7 100644
--- a/sip/res/values-uz/strings.xml
+++ b/sip/res/values-uz/strings.xml
@@ -26,7 +26,7 @@
<string name="sip_call_options_entry_1" msgid="4722647332760934261">"Tarmoq trafigi mavjud bo‘lganda barcha qo‘ng‘iroqlar uchun"</string>
<string name="sip_call_options_entry_2" msgid="7338504256051655013">"Faqat SIP chaqiruvlar uchun"</string>
<string name="sip_call_options_wifi_only_entry_1" msgid="922329055414010991">"Barcha chaqiruvlar uchun"</string>
- <string name="add_sip_account" msgid="5754758646745144384">"Hisob kiritish"</string>
+ <string name="add_sip_account" msgid="5754758646745144384">"Hisob qo‘shish"</string>
<string name="remove_sip_account" msgid="8272617403399636513">"Hisobni olib tashlash"</string>
<string name="sip_account_list" msgid="2596262496233721769">"SIP hisoblari"</string>
<string name="saving_account" msgid="3390358043846687266">"Hisob saqlanmoqda…"</string>
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index 54acaad..ef83ead 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -397,14 +397,10 @@
} else {
if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
prefSet.removePreference(fdnButton);
-
- if (!carrierConfig.getBoolean(
- CarrierConfigManager.KEY_VOICE_PRIVACY_DISABLE_UI_BOOL)) {
- addPreferencesFromResource(R.xml.cdma_call_privacy);
- CdmaVoicePrivacySwitchPreference buttonVoicePrivacy =
- (CdmaVoicePrivacySwitchPreference) findPreference(BUTTON_VP_KEY);
- buttonVoicePrivacy.setPhone(mPhone);
- }
+ addPreferencesFromResource(R.xml.cdma_call_privacy);
+ CdmaVoicePrivacySwitchPreference buttonVoicePrivacy =
+ (CdmaVoicePrivacySwitchPreference) findPreference(BUTTON_VP_KEY);
+ buttonVoicePrivacy.setPhone(mPhone);
} else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
if (mPhone.getIccCard() == null || !mPhone.getIccCard().getIccFdnAvailable()) {
prefSet.removePreference(fdnButton);
diff --git a/src/com/android/phone/CallForwardEditPreference.java b/src/com/android/phone/CallForwardEditPreference.java
index e8cf0d1..bf296f9 100644
--- a/src/com/android/phone/CallForwardEditPreference.java
+++ b/src/com/android/phone/CallForwardEditPreference.java
@@ -122,7 +122,27 @@
Log.d(LOG_TAG, "mButtonClicked=" + mButtonClicked + ", positiveResult=" + positiveResult);
// Ignore this event if the user clicked the cancel button, or if the dialog is dismissed
// without any button being pressed (back button press or click event outside the dialog).
- if (this.mButtonClicked != DialogInterface.BUTTON_NEGATIVE) {
+ if (isUnknownStatus() && this.mButtonClicked != DialogInterface.BUTTON_NEGATIVE) {
+ int action = (mButtonClicked == DialogInterface.BUTTON_POSITIVE) ?
+ CommandsInterface.CF_ACTION_REGISTRATION :
+ CommandsInterface.CF_ACTION_DISABLE;
+ final String number = (action == CommandsInterface.CF_ACTION_DISABLE) ?
+ "" : getPhoneNumber();
+
+ Log.d(LOG_TAG, "reason=" + reason + ", action=" + action + ", number=" + number);
+
+ // Display no forwarding number while we're waiting for confirmation.
+ setSummaryOff("");
+
+ mPhone.setCallForwardingOption(action,
+ reason,
+ number,
+ mServiceClass,
+ 0,
+ mHandler.obtainMessage(MyHandler.MESSAGE_SET_CF,
+ action,
+ MyHandler.MESSAGE_SET_CF));
+ } else if (this.mButtonClicked != DialogInterface.BUTTON_NEGATIVE) {
int action = (isToggled() || (mButtonClicked == DialogInterface.BUTTON_POSITIVE)) ?
CommandsInterface.CF_ACTION_REGISTRATION :
CommandsInterface.CF_ACTION_DISABLE;
@@ -194,6 +214,7 @@
Log.i(LOG_TAG, "handleGetCFResponse: Overridding CF number");
}
+ setUnknownStatus(callForwardInfo.status == CommandsInterface.SS_STATUS_UNKNOWN);
setToggled(callForwardInfo.status == 1);
boolean displayVoicemailNumber = false;
if (TextUtils.isEmpty(callForwardInfo.number)) {
@@ -343,6 +364,7 @@
AsyncResult ar = (AsyncResult) msg.obj;
callForwardInfo = null;
+ boolean summaryOff = false;
if (ar.exception != null) {
Log.d(LOG_TAG, "handleGetCFResponse: ar.exception=" + ar.exception);
if (ar.exception instanceof CommandException) {
@@ -362,7 +384,9 @@
CallForwardInfo cfInfoArray[] = (CallForwardInfo[]) ar.result;
if (cfInfoArray == null || cfInfoArray.length == 0) {
Log.d(LOG_TAG, "handleGetCFResponse: cfInfoArray.length==0");
- mTcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR);
+ if (!(ar.userObj instanceof Throwable)) {
+ mTcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR);
+ }
} else {
for (int i = 0, length = cfInfoArray.length; i < length; i++) {
Log.d(LOG_TAG, "handleGetCFResponse, cfInfoArray[" + i + "]="
@@ -372,6 +396,8 @@
CallForwardInfo info = cfInfoArray[i];
handleCallForwardResult(info);
+ summaryOff = (info.status == CommandsInterface.SS_STATUS_UNKNOWN);
+
if (ar.userObj instanceof Throwable) {
Log.d(LOG_TAG, "Skipped duplicated error dialog");
continue;
@@ -379,8 +405,7 @@
// Show an alert if we got a success response but
// with unexpected values.
- // Currently only handle the fail-to-disable case
- // since we haven't observed fail-to-enable.
+ // Handle the fail-to-disable case.
if (msg.arg2 == MESSAGE_SET_CF &&
msg.arg1 == CommandsInterface.CF_ACTION_DISABLE &&
info.status == 1) {
@@ -404,7 +429,21 @@
}
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setNeutralButton(R.string.close_dialog, null);
- builder.setTitle(getContext().getText(R.string.error_updating_title));
+ builder.setTitle(getContext()
+ .getText(R.string.error_updating_title));
+ builder.setMessage(s);
+ builder.setCancelable(true);
+ builder.create().show();
+ } else if (msg.arg2 == MESSAGE_SET_CF &&
+ msg.arg1 == CommandsInterface.CF_ACTION_REGISTRATION &&
+ info.status == 0) {
+ // Handle the fail-to-enable case.
+ CharSequence s = getContext()
+ .getText(R.string.registration_cf_forbidden);
+ AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
+ builder.setNeutralButton(R.string.close_dialog, null);
+ builder.setTitle(getContext()
+ .getText(R.string.error_updating_title));
builder.setMessage(s);
builder.setCancelable(true);
builder.create().show();
@@ -417,7 +456,15 @@
// Now whether or not we got a new number, reset our enabled
// summary text since it may have been replaced by an empty
// placeholder.
- updateSummaryText();
+ // for CDMA, doesn't display summary.
+ if (summaryOff) {
+ setSummaryOff("");
+ } else {
+ // Now whether or not we got a new number, reset our enabled
+ // summary text since it may have been replaced by an empty
+ // placeholder.
+ updateSummaryText();
+ }
}
private void handleSetCFResponse(Message msg) {
@@ -426,6 +473,16 @@
Log.d(LOG_TAG, "handleSetCFResponse: ar.exception=" + ar.exception);
// setEnabled(false);
}
+
+ if (ar.result != null) {
+ int arr = (int)ar.result;
+ if (arr == CommandsInterface.SS_STATUS_UNKNOWN) {
+ Log.d(LOG_TAG, "handleSetCFResponse: no need to re get in CDMA");
+ mTcpListener.onFinished(CallForwardEditPreference.this, false);
+ return;
+ }
+ }
+
Log.d(LOG_TAG, "handleSetCFResponse: re get");
if (!mCallForwardByUssd) {
mPhone.getCallForwardingOption(reason, mServiceClass,
diff --git a/src/com/android/phone/CdmaCallForwardOptions.java b/src/com/android/phone/CdmaCallForwardOptions.java
new file mode 100644
index 0000000..a8d2e93
--- /dev/null
+++ b/src/com/android/phone/CdmaCallForwardOptions.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import android.app.ActionBar;
+import android.content.Intent;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.preference.Preference;
+import android.preference.PreferenceScreen;
+import android.telephony.CarrierConfigManager;
+import android.util.Log;
+import android.view.MenuItem;
+
+import com.android.internal.telephony.CallForwardInfo;
+import com.android.internal.telephony.CommandsInterface;
+import com.android.internal.telephony.Phone;
+
+import java.util.ArrayList;
+
+public class CdmaCallForwardOptions extends TimeConsumingPreferenceActivity {
+ private static final String LOG_TAG = "CdmaCallForwardOptions";
+
+ private static final String NUM_PROJECTION[] = {
+ android.provider.ContactsContract.CommonDataKinds.Phone.NUMBER
+ };
+
+ private static final String BUTTON_CFU_KEY = "button_cfu_key";
+ private static final String BUTTON_CFB_KEY = "button_cfb_key";
+ private static final String BUTTON_CFNRY_KEY = "button_cfnry_key";
+ private static final String BUTTON_CFNRC_KEY = "button_cfnrc_key";
+
+ private static final String KEY_TOGGLE = "toggle";
+ private static final String KEY_STATUS = "status";
+ private static final String KEY_NUMBER = "number";
+ private static final String KEY_ENABLE = "enable";
+
+ private CallForwardEditPreference mButtonCFU;
+ private CallForwardEditPreference mButtonCFB;
+ private CallForwardEditPreference mButtonCFNRy;
+ private CallForwardEditPreference mButtonCFNRc;
+
+ private final ArrayList<CallForwardEditPreference> mPreferences =
+ new ArrayList<CallForwardEditPreference> ();
+ private int mInitIndex= 0;
+
+ private boolean mFirstResume;
+ private Bundle mIcicle;
+ private Phone mPhone;
+ private SubscriptionInfoHelper mSubscriptionInfoHelper;
+ private boolean mReplaceInvalidCFNumbers;
+ private boolean mCallForwardByUssd;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ addPreferencesFromResource(R.xml.callforward_options);
+
+ mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent());
+ mSubscriptionInfoHelper.setActionBarTitle(
+ getActionBar(), getResources(), R.string.call_forwarding_settings_with_label);
+ mPhone = mSubscriptionInfoHelper.getPhone();
+
+ PersistableBundle b = null;
+ boolean supportCFNRc = true;
+ if (mSubscriptionInfoHelper.hasSubId()) {
+ b = PhoneGlobals.getInstance().getCarrierConfigForSubId(
+ mSubscriptionInfoHelper.getSubId());
+ } else {
+ b = PhoneGlobals.getInstance().getCarrierConfig();
+ }
+ if (b != null) {
+ mReplaceInvalidCFNumbers = b.getBoolean(
+ CarrierConfigManager.KEY_CALL_FORWARDING_MAP_NON_NUMBER_TO_VOICEMAIL_BOOL);
+ mCallForwardByUssd = b.getBoolean(
+ CarrierConfigManager.KEY_USE_CALL_FORWARDING_USSD_BOOL);
+ supportCFNRc = b.getBoolean(
+ CarrierConfigManager.KEY_CALL_FORWARDING_WHEN_UNREACHABLE_SUPPORTED_BOOL);
+ }
+
+ PreferenceScreen prefSet = getPreferenceScreen();
+ mButtonCFU = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFU_KEY);
+ mButtonCFB = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFB_KEY);
+ mButtonCFNRy = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFNRY_KEY);
+ mButtonCFNRc = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFNRC_KEY);
+
+ mButtonCFU.setParentActivity(this, mButtonCFU.reason);
+ mButtonCFB.setParentActivity(this, mButtonCFB.reason);
+ mButtonCFNRy.setParentActivity(this, mButtonCFNRy.reason);
+ mButtonCFNRc.setParentActivity(this, mButtonCFNRc.reason);
+
+ mPreferences.add(mButtonCFU);
+ mPreferences.add(mButtonCFB);
+ mPreferences.add(mButtonCFNRy);
+
+ if (supportCFNRc) {
+ mPreferences.add(mButtonCFNRc);
+ } else {
+ // When CFNRc is not supported, mButtonCFNRc is grayed out from the menu.
+ // Default state for the preferences in this PreferenceScreen is disabled.
+ // Only preferences listed in the ArrayList mPreferences will be enabled.
+ // By not adding mButtonCFNRc to mPreferences it will be kept disabled.
+ Log.d(LOG_TAG, "onCreate: CFNRc is not supported, grey out the item.");
+ }
+
+ if (mCallForwardByUssd) {
+ //the call forwarding ussd command's behavior is similar to the call forwarding when
+ //unanswered,so only display the call forwarding when unanswered item.
+ prefSet.removePreference(mButtonCFU);
+ prefSet.removePreference(mButtonCFB);
+ prefSet.removePreference(mButtonCFNRc);
+ mPreferences.remove(mButtonCFU);
+ mPreferences.remove(mButtonCFB);
+ mPreferences.remove(mButtonCFNRc);
+ mButtonCFNRy.setDependency(null);
+ }
+
+ // we wait to do the initialization until onResume so that the
+ // TimeConsumingPreferenceActivity dialog can display as it
+ // relies on onResume / onPause to maintain its foreground state.
+
+ mFirstResume = true;
+ mIcicle = icicle;
+
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ // android.R.id.home will be triggered in onOptionsItemSelected()
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ if (mFirstResume) {
+ if (mIcicle == null) {
+ Log.d(LOG_TAG, "start to init ");
+ CallForwardEditPreference pref = mPreferences.get(mInitIndex);
+ pref.init(this, mPhone, mReplaceInvalidCFNumbers, mCallForwardByUssd);
+ pref.startCallForwardOptionsQuery();
+
+ } else {
+ mInitIndex = mPreferences.size();
+
+ for (CallForwardEditPreference pref : mPreferences) {
+ Bundle bundle = mIcicle.getParcelable(pref.getKey());
+ pref.setToggled(bundle.getBoolean(KEY_TOGGLE));
+ pref.setEnabled(bundle.getBoolean(KEY_ENABLE));
+ CallForwardInfo cf = new CallForwardInfo();
+ cf.number = bundle.getString(KEY_NUMBER);
+ cf.status = bundle.getInt(KEY_STATUS);
+ pref.init(this, mPhone, mReplaceInvalidCFNumbers, mCallForwardByUssd);
+ pref.restoreCallForwardInfo(cf);
+ }
+ }
+ mFirstResume = false;
+ mIcicle = null;
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ for (CallForwardEditPreference pref : mPreferences) {
+ Bundle bundle = new Bundle();
+ bundle.putBoolean(KEY_TOGGLE, pref.isToggled());
+ bundle.putBoolean(KEY_ENABLE, pref.isEnabled());
+ if (pref.callForwardInfo != null) {
+ bundle.putString(KEY_NUMBER, pref.callForwardInfo.number);
+ bundle.putInt(KEY_STATUS, pref.callForwardInfo.status);
+ }
+ outState.putParcelable(pref.getKey(), bundle);
+ }
+ }
+
+ @Override
+ public void onFinished(Preference preference, boolean reading) {
+ if (mInitIndex < mPreferences.size()-1 && !isFinishing()) {
+ mInitIndex++;
+ CallForwardEditPreference pref = mPreferences.get(mInitIndex);
+ pref.init(this, mPhone, mReplaceInvalidCFNumbers, mCallForwardByUssd);
+ pref.startCallForwardOptionsQuery();
+ }
+
+ super.onFinished(preference, reading);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ Log.d(LOG_TAG, "onActivityResult: done");
+ if (resultCode != RESULT_OK) {
+ Log.d(LOG_TAG, "onActivityResult: contact picker result not OK.");
+ return;
+ }
+ Cursor cursor = null;
+ try {
+ cursor = getContentResolver().query(data.getData(),
+ NUM_PROJECTION, null, null, null);
+ if ((cursor == null) || (!cursor.moveToFirst())) {
+ Log.d(LOG_TAG, "onActivityResult: bad contact data, no results found.");
+ return;
+ }
+
+ switch (requestCode) {
+ case CommandsInterface.CF_REASON_UNCONDITIONAL:
+ mButtonCFU.onPickActivityResult(cursor.getString(0));
+ break;
+ case CommandsInterface.CF_REASON_BUSY:
+ mButtonCFB.onPickActivityResult(cursor.getString(0));
+ break;
+ case CommandsInterface.CF_REASON_NO_REPLY:
+ mButtonCFNRy.onPickActivityResult(cursor.getString(0));
+ break;
+ case CommandsInterface.CF_REASON_NOT_REACHABLE:
+ mButtonCFNRc.onPickActivityResult(cursor.getString(0));
+ break;
+ default:
+ // TODO: may need exception here.
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ final int itemId = item.getItemId();
+ if (itemId == android.R.id.home) { // See ActionBar#setDisplayHomeAsUpEnabled()
+ CallFeaturesSetting.goUpToTopLevelSetting(this, mSubscriptionInfoHelper);
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+}
diff --git a/src/com/android/phone/CdmaCallOptions.java b/src/com/android/phone/CdmaCallOptions.java
index 8513664..2e310aa 100644
--- a/src/com/android/phone/CdmaCallOptions.java
+++ b/src/com/android/phone/CdmaCallOptions.java
@@ -19,18 +19,19 @@
import android.os.Bundle;
import android.os.PersistableBundle;
import android.preference.Preference;
-import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.telephony.CarrierConfigManager;
import android.view.MenuItem;
import com.android.internal.telephony.PhoneConstants;
-public class CdmaCallOptions extends PreferenceActivity {
+public class CdmaCallOptions extends TimeConsumingPreferenceActivity {
private static final String LOG_TAG = "CdmaCallOptions";
private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
private static final String BUTTON_VP_KEY = "button_voice_privacy_key";
+ private static final String CALL_FORWARDING_KEY = "call_forwarding_key";
+ private static final String CALL_WAITING_KEY = "call_waiting_key";
private CdmaVoicePrivacySwitchPreference mButtonVoicePrivacy;
@Override
@@ -55,8 +56,15 @@
if (subInfoHelper.getPhone().getPhoneType() != PhoneConstants.PHONE_TYPE_CDMA
|| carrierConfig.getBoolean(CarrierConfigManager.KEY_VOICE_PRIVACY_DISABLE_UI_BOOL)) {
// disable the entire screen
- getPreferenceScreen().setEnabled(false);
+ mButtonVoicePrivacy.setEnabled(false);
}
+
+ Preference callForwardingPref = getPreferenceScreen().findPreference(CALL_FORWARDING_KEY);
+ callForwardingPref.setIntent(subInfoHelper.getIntent(CdmaCallForwardOptions.class));
+
+ CdmaCallWaitingPreference callWaitingPref = (CdmaCallWaitingPreference)getPreferenceScreen()
+ .findPreference(CALL_WAITING_KEY);
+ callWaitingPref.init(this, subInfoHelper.getPhone());
}
@Override
@@ -76,5 +84,4 @@
}
return false;
}
-
}
diff --git a/src/com/android/phone/CdmaCallWaitingPreference.java b/src/com/android/phone/CdmaCallWaitingPreference.java
new file mode 100644
index 0000000..4cda7ba
--- /dev/null
+++ b/src/com/android/phone/CdmaCallWaitingPreference.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import com.android.internal.telephony.CommandException;
+import com.android.internal.telephony.CommandsInterface;
+import com.android.internal.telephony.Phone;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.res.TypedArray;
+import android.os.AsyncResult;
+import android.os.Handler;
+import android.os.Message;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.util.AttributeSet;
+import android.util.Log;
+
+public class CdmaCallWaitingPreference extends Preference {
+ private static final String LOG_TAG = "CdmaCallWaitingPreference";
+ private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
+
+ private int mButtonClicked;
+ private Context mContext;
+ private Phone mPhone;
+ private SubscriptionInfoHelper mSubscriptionInfoHelper;
+ private TimeConsumingPreferenceListener mTcpListener;
+ private MyHandler mHandler = new MyHandler();
+
+ public CdmaCallWaitingPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ mContext = context;
+ }
+
+ public CdmaCallWaitingPreference(Context context, AttributeSet attrs) {
+ this(context, attrs, com.android.internal.R.attr.preferenceStyle);
+ }
+
+ public CdmaCallWaitingPreference(Context context) {
+ this(context, null);
+ }
+
+ public void init(TimeConsumingPreferenceListener listener, Phone phone) {
+ mPhone = phone;
+ mTcpListener = listener;
+ Log.d(LOG_TAG, "phone id= " + mPhone.getPhoneId());
+ mPhone.getCallWaiting(mHandler.obtainMessage(MyHandler.MESSAGE_GET_CALL_WAITING,
+ MyHandler.MESSAGE_GET_CALL_WAITING, MyHandler.MESSAGE_GET_CALL_WAITING));
+ if (mTcpListener != null) {
+ mTcpListener.onStarted(this, true);
+ }
+ }
+
+ @Override
+ public void onClick() {
+ super.onClick();
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ builder.setTitle(mContext.getText(R.string.cdma_call_waiting));
+ builder.setMessage(mContext.getText(R.string.enable_cdma_call_waiting_setting));
+ builder.setPositiveButton(R.string.enable_cdma_cw, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ mPhone.setCallWaiting(true,
+ mHandler.obtainMessage(MyHandler.MESSAGE_SET_CALL_WAITING));
+ if (mTcpListener != null) {
+ mTcpListener.onStarted(CdmaCallWaitingPreference.this, false);
+ }
+ }
+ });
+ builder.setNegativeButton(R.string.disable_cdma_cw, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ mPhone.setCallWaiting(false,
+ mHandler.obtainMessage(MyHandler.MESSAGE_SET_CALL_WAITING));
+ if (mTcpListener != null) {
+ mTcpListener.onStarted(CdmaCallWaitingPreference.this, false);
+ }
+ }
+ });
+ builder.create().show();
+ }
+
+ private class MyHandler extends Handler {
+ static final int MESSAGE_GET_CALL_WAITING = 0;
+ static final int MESSAGE_SET_CALL_WAITING = 1;
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MESSAGE_GET_CALL_WAITING:
+ handleGetCallWaitingResponse(msg);
+ break;
+ case MESSAGE_SET_CALL_WAITING:
+ handleSetCallWaitingResponse(msg);
+ break;
+ }
+ }
+
+ private void handleGetCallWaitingResponse(Message msg) {
+ AsyncResult ar = (AsyncResult) msg.obj;
+
+ if (mTcpListener != null) {
+ if (msg.arg2 == MESSAGE_SET_CALL_WAITING) {
+ mTcpListener.onFinished(CdmaCallWaitingPreference.this, false);
+ } else {
+ mTcpListener.onFinished(CdmaCallWaitingPreference.this, true);
+ }
+ }
+
+ if (ar.exception instanceof CommandException) {
+ if (DBG) {
+ Log.d(LOG_TAG, "handleGetCallWaitingResponse: CommandException=" +
+ ar.exception);
+ }
+ if (mTcpListener != null) {
+ mTcpListener.onException(CdmaCallWaitingPreference.this,
+ (CommandException)ar.exception);
+ }
+ } else if (ar.userObj instanceof Throwable || ar.exception != null) {
+ if (DBG) {
+ Log.d(LOG_TAG, "handleGetCallWaitingResponse: Exception" + ar.exception);
+ }
+ if (mTcpListener != null) {
+ mTcpListener.onError(CdmaCallWaitingPreference.this,
+ TimeConsumingPreferenceActivity.RESPONSE_ERROR);
+ }
+ } else {
+ if (DBG) {
+ Log.d(LOG_TAG, "handleGetCallWaitingResponse: CW state successfully queried.");
+ }
+ int[] cwArray = (int[])ar.result;
+ if (cwArray == null) {
+ if (mTcpListener != null) {
+ mTcpListener.onError(CdmaCallWaitingPreference.this,
+ TimeConsumingPreferenceActivity.RESPONSE_ERROR);
+ }
+ return;
+ }
+
+ try {
+ if (cwArray[0] == CommandsInterface.SS_STATUS_UNKNOWN) {
+ setSummary("");
+ } else if(cwArray[0] == 1) {
+ setSummary(mContext.getString(R.string.cdma_call_waiting_in_ims_on));
+ } else if(cwArray[0] == 0) {
+ setSummary(mContext.getString(R.string.cdma_call_waiting_in_ims_off));
+ }
+ } catch (ArrayIndexOutOfBoundsException e) {
+ setSummary("");
+ Log.e(LOG_TAG, "handleGetCallWaitingResponse: improper result: err ="
+ + e.getMessage());
+ }
+ }
+ }
+
+ private void handleSetCallWaitingResponse(Message msg) {
+ AsyncResult ar = (AsyncResult) msg.obj;
+
+ if (ar.exception != null) {
+ if (DBG) {
+ Log.d(LOG_TAG, "handleSetCallWaitingResponse: ar.exception=" + ar.exception);
+ }
+ }
+
+ if (ar.result != null) {
+ int arr = (int)ar.result;
+ if (arr == CommandsInterface.SS_STATUS_UNKNOWN) {
+ Log.d(LOG_TAG, "handleSetCallWaitingResponse: no need to re get in CDMA");
+ mTcpListener.onFinished(CdmaCallWaitingPreference.this, false);
+ return;
+ }
+ }
+
+ if (DBG) Log.d(LOG_TAG, "handleSetCallWaitingResponse: re get");
+ mPhone.getCallWaiting(obtainMessage(MESSAGE_GET_CALL_WAITING,
+ MESSAGE_SET_CALL_WAITING, MESSAGE_SET_CALL_WAITING, ar.exception));
+ }
+ }
+}
diff --git a/src/com/android/phone/EditPhoneNumberPreference.java b/src/com/android/phone/EditPhoneNumberPreference.java
index 74b8a45..505c284 100644
--- a/src/com/android/phone/EditPhoneNumberPreference.java
+++ b/src/com/android/phone/EditPhoneNumberPreference.java
@@ -16,6 +16,9 @@
package com.android.phone;
+import static android.view.View.LAYOUT_DIRECTION_LOCALE;
+import static android.view.View.TEXT_DIRECTION_LOCALE;
+
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
@@ -37,6 +40,8 @@
import android.widget.ImageButton;
import android.widget.TextView;
+import com.android.internal.telephony.CommandsInterface;
+
public class EditPhoneNumberPreference extends EditTextPreference {
//allowed modes for this preference.
@@ -90,6 +95,7 @@
private String mPhoneNumber;
private boolean mChecked;
+ private boolean mIsUnknownStatus;
/**
* Interface for the dialog closed listener, related to
@@ -209,7 +215,9 @@
}
}
editText.setText(BidiFormatter.getInstance().unicodeWrap(
- mPhoneNumber, TextDirectionHeuristics.LTR));
+ mPhoneNumber, TextDirectionHeuristics.LOCALE));
+ editText.setTextDirection(TEXT_DIRECTION_LOCALE);
+ editText.setLayoutDirection(LAYOUT_DIRECTION_LOCALE);
editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
editText.setKeyListener(DialerKeyListener.getInstance());
editText.setOnFocusChangeListener(mDialogFocusChangeListener);
@@ -254,7 +262,13 @@
// displayed, since there is no need to hide the edittext
// field anymore.
if (mConfirmationMode == CM_ACTIVATION) {
- if (mChecked) {
+ if (mIsUnknownStatus) {
+ builder.setPositiveButton(mEnableText, this);
+ builder.setNeutralButton(mDisableText, this);
+ if (mPrefId == CommandsInterface.CF_REASON_ALL) {
+ builder.setPositiveButton(null, null);
+ }
+ } else if (mChecked) {
builder.setPositiveButton(mChangeNumberText, this);
builder.setNeutralButton(mDisableText, this);
} else {
@@ -310,7 +324,8 @@
@Override
public void onClick(DialogInterface dialog, int which) {
// The neutral button (button3) is always the toggle.
- if ((mConfirmationMode == CM_ACTIVATION) && (which == DialogInterface.BUTTON_NEUTRAL)) {
+ if ((mConfirmationMode == CM_ACTIVATION) && (which == DialogInterface.BUTTON_NEUTRAL)
+ && !mIsUnknownStatus) {
//flip the toggle if we are in the correct mode.
setToggled(!isToggled());
}
@@ -499,4 +514,12 @@
public void showPhoneNumberDialog() {
showDialog(null);
}
+
+ public void setUnknownStatus(boolean isUnknown) {
+ mIsUnknownStatus = isUnknown;
+ }
+
+ public boolean isUnknownStatus() {
+ return mIsUnknownStatus;
+ }
}
diff --git a/src/com/android/phone/IccNetworkDepersonalizationPanel.java b/src/com/android/phone/IccNetworkDepersonalizationPanel.java
index a26225e..a4ec8a4 100644
--- a/src/com/android/phone/IccNetworkDepersonalizationPanel.java
+++ b/src/com/android/phone/IccNetworkDepersonalizationPanel.java
@@ -23,6 +23,8 @@
import android.os.Message;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.Editable;
import android.text.Spannable;
@@ -68,6 +70,7 @@
private static IccNetworkDepersonalizationPanel [] sNdpPanel =
new IccNetworkDepersonalizationPanel[
TelephonyManager.getDefault().getSupportedModemCount()];
+ private SubscriptionInfo mSir;
//UI elements
private EditText mPinEntry;
@@ -75,6 +78,7 @@
private LinearLayout mStatusPanel;
private TextView mPersoSubtypeText;
private PersoSubState mPersoSubState;
+ private TextView mPhoneIdText;
private TextView mStatusText;
private Button mUnlockButton;
@@ -167,6 +171,8 @@
super(context);
mPhone = PhoneGlobals.getPhone();
mPersoSubtype = PersoSubState.PERSOSUBSTATE_SIM_NETWORK.ordinal();
+ mSir = SubscriptionManager.from(context)
+ .getActiveSubscriptionInfoForSimSlotIndex(mPhone.getPhoneId());
}
//constructor
@@ -175,6 +181,8 @@
super(context);
mPhone = phone == null ? PhoneGlobals.getPhone() : phone;
mPersoSubtype = subtype;
+ mSir = SubscriptionManager.from(context)
+ .getActiveSubscriptionInfoForSimSlotIndex(mPhone.getPhoneId());
}
@Override
@@ -194,6 +202,7 @@
mEntryPanel = (LinearLayout) findViewById(R.id.entry_panel);
mPersoSubtypeText = (TextView) findViewById(R.id.perso_subtype_text);
+ mPhoneIdText = (TextView) findViewById(R.id.perso_phoneid_text);
displayStatus(statusType.ENTRY.name());
mUnlockButton = (Button) findViewById(R.id.ndp_unlock);
@@ -282,6 +291,17 @@
log ("Unsupported Perso Subtype :" + mPersoSubState.name());
return;
}
+ if(mSir != null) {
+ CharSequence displayName = mSir.getDisplayName();
+ log("Operator displayName is: " + displayName + "phoneId: " + mPhone.getPhoneId());
+
+ if(displayName != null && displayName != "") {
+ // Displaying Operator displayName on UI
+ String phoneIdText = getContext().getString(R.string.label_phoneid)
+ + ": " + displayName;
+ mPhoneIdText.setText(phoneIdText);
+ }
+ }
if (type == statusType.ENTRY.name()) {
String displayText = getContext().getString(label);
diff --git a/src/com/android/phone/ImsRcsController.java b/src/com/android/phone/ImsRcsController.java
index dcae24b..12c8cda 100644
--- a/src/com/android/phone/ImsRcsController.java
+++ b/src/com/android/phone/ImsRcsController.java
@@ -16,30 +16,42 @@
package com.android.phone;
+import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Binder;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
+import android.os.UserHandle;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyFrameworkInitializer;
+import android.telephony.ims.DelegateRequest;
import android.telephony.ims.ImsException;
+import android.telephony.ims.RcsUceAdapter.PublishState;
import android.telephony.ims.RegistrationManager;
import android.telephony.ims.aidl.IImsCapabilityCallback;
import android.telephony.ims.aidl.IImsRcsController;
import android.telephony.ims.aidl.IImsRegistrationCallback;
import android.telephony.ims.aidl.IRcsUceControllerCallback;
+import android.telephony.ims.aidl.IRcsUcePublishStateCallback;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateConnectionStateCallback;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.telephony.ims.feature.ImsFeature;
import android.telephony.ims.feature.RcsFeature;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.util.Log;
import com.android.ims.ImsManager;
+import com.android.ims.internal.IImsServiceFeatureCallback;
import com.android.internal.telephony.IIntegerConsumer;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.TelephonyPermissions;
+import com.android.internal.telephony.ims.ImsResolver;
import com.android.internal.telephony.imsphone.ImsPhone;
import com.android.services.telephony.rcs.RcsFeatureController;
+import com.android.services.telephony.rcs.SipTransportController;
import com.android.services.telephony.rcs.TelephonyRcsService;
-import com.android.services.telephony.rcs.UserCapabilityExchangeImpl;
+import com.android.services.telephony.rcs.UceControllerManager;
import java.util.List;
@@ -54,6 +66,7 @@
private PhoneGlobals mApp;
private TelephonyRcsService mRcsService;
+ private ImsResolver mImsResolver;
/**
* Initialize the singleton ImsRcsController instance.
@@ -76,6 +89,7 @@
mApp = app;
TelephonyFrameworkInitializer
.getTelephonyServiceManager().getTelephonyImsServiceRegisterer().register(this);
+ mImsResolver = mApp.getImsResolver();
}
/**
@@ -255,30 +269,94 @@
}
final long token = Binder.clearCallingIdentity();
try {
- UserCapabilityExchangeImpl uce = getRcsFeatureController(subId).getFeature(
- UserCapabilityExchangeImpl.class);
- if (uce == null) {
+ UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
+ UceControllerManager.class);
+ if (uceCtrlManager == null) {
throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
"This subscription does not support UCE.");
}
- uce.requestCapabilities(contactNumbers, c);
+ uceCtrlManager.requestCapabilities(contactNumbers, c);
+ } catch (ImsException e) {
+ throw new ServiceSpecificException(e.getCode(), e.getMessage());
} finally {
Binder.restoreCallingIdentity(token);
}
}
@Override
- public int getUcePublishState(int subId) {
- enforceReadPrivilegedPermission("getUcePublishState");
+ public void requestNetworkAvailability(int subId, String callingPackage,
+ String callingFeatureId, Uri contactNumber, IRcsUceControllerCallback c) {
+ enforceReadPrivilegedPermission("requestNetworkAvailability");
+ if (!isUceSettingEnabled(subId, callingPackage, callingFeatureId)) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "The user has not enabled UCE for this subscription.");
+ }
final long token = Binder.clearCallingIdentity();
try {
- UserCapabilityExchangeImpl uce = getRcsFeatureController(subId).getFeature(
- UserCapabilityExchangeImpl.class);
- if (uce == null) {
+ UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
+ UceControllerManager.class);
+ if (uceCtrlManager == null) {
throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
"This subscription does not support UCE.");
}
- return uce.getUcePublishState();
+ uceCtrlManager.requestNetworkAvailability(contactNumber, c);
+ } catch (ImsException e) {
+ throw new ServiceSpecificException(e.getCode(), e.getMessage());
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public @PublishState int getUcePublishState(int subId) {
+ enforceReadPrivilegedPermission("getUcePublishState");
+ final long token = Binder.clearCallingIdentity();
+ try {
+ UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
+ UceControllerManager.class);
+ if (uceCtrlManager == null) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "This subscription does not support UCE.");
+ }
+ return uceCtrlManager.getUcePublishState();
+ } catch (ImsException e) {
+ throw new ServiceSpecificException(e.getCode(), e.getMessage());
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void registerUcePublishStateCallback(int subId, IRcsUcePublishStateCallback c) {
+ enforceReadPrivilegedPermission("registerUcePublishStateCallback");
+ final long token = Binder.clearCallingIdentity();
+ try {
+ UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
+ UceControllerManager.class);
+ if (uceCtrlManager == null) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "This subscription does not support UCE.");
+ }
+ uceCtrlManager.registerPublishStateCallback(c);
+ } catch (ImsException e) {
+ throw new ServiceSpecificException(e.getCode(), e.getMessage());
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void unregisterUcePublishStateCallback(int subId, IRcsUcePublishStateCallback c) {
+ enforceReadPrivilegedPermission("unregisterUcePublishStateCallback");
+ final long token = Binder.clearCallingIdentity();
+ try {
+ UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
+ UceControllerManager.class);
+ if (uceCtrlManager == null) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "This subscription does not support UCE.");
+ }
+ uceCtrlManager.unregisterPublishStateCallback(c);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -313,6 +391,135 @@
}
}
+ @Override
+ public boolean isSipDelegateSupported(int subId) {
+ enforceReadPrivilegedPermission("isSipDelegateSupported");
+ final long token = Binder.clearCallingIdentity();
+ try {
+ SipTransportController transport = getRcsFeatureController(subId).getFeature(
+ SipTransportController.class);
+ if (transport == null) {
+ return false;
+ }
+ return transport.isSupported(subId);
+ } catch (ImsException e) {
+ throw new ServiceSpecificException(e.getCode(), e.getMessage());
+ } catch (ServiceSpecificException e) {
+ if (e.errorCode == ImsException.CODE_ERROR_UNSUPPORTED_OPERATION) {
+ return false;
+ }
+ throw e;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void createSipDelegate(int subId, DelegateRequest request, String packageName,
+ ISipDelegateConnectionStateCallback delegateState,
+ ISipDelegateMessageCallback delegateMessage) {
+ enforceModifyPermission();
+ if (!UserHandle.getUserHandleForUid(Binder.getCallingUid()).isSystem()) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "SipDelegate creation is only available to primary user.");
+ }
+ try {
+ int remoteUid = mApp.getPackageManager().getPackageUid(packageName, 0 /*flags*/);
+ if (Binder.getCallingUid() != remoteUid) {
+ throw new SecurityException("passed in packageName does not match the caller");
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new SecurityException("Passed in PackageName can not be found on device");
+ }
+
+ final long identity = Binder.clearCallingIdentity();
+ SipTransportController transport = getRcsFeatureController(subId).getFeature(
+ SipTransportController.class);
+ if (transport == null) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "This subscription does not support the creation of SIP delegates");
+ }
+ try {
+ transport.createSipDelegate(subId, request, packageName, delegateState,
+ delegateMessage);
+ } catch (ImsException e) {
+ throw new ServiceSpecificException(e.getCode(), e.getMessage());
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void destroySipDelegate(int subId, ISipDelegate connection, int reason) {
+ enforceModifyPermission();
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ SipTransportController transport = getRcsFeatureController(subId).getFeature(
+ SipTransportController.class);
+ if (transport == null) {
+ return;
+ }
+ transport.destroySipDelegate(subId, connection, reason);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void triggerNetworkRegistration(int subId, ISipDelegate connection, int sipCode,
+ String sipReason) {
+ enforceModifyPermission();
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ SipTransportController transport = getRcsFeatureController(subId).getFeature(
+ SipTransportController.class);
+ if (transport == null) {
+ return;
+ }
+ transport.triggerFullNetworkRegistration(subId, connection, sipCode, sipReason);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Registers for updates to the RcsFeature connection through the IImsServiceFeatureCallback
+ * callback.
+ */
+ @Override
+ public void registerRcsFeatureCallback(int slotId, IImsServiceFeatureCallback callback) {
+ enforceModifyPermission();
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (mImsResolver == null) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "Device does not support IMS");
+ }
+ mImsResolver.listenForFeature(slotId, ImsFeature.FEATURE_RCS, callback);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Unregister a previously registered IImsServiceFeatureCallback associated with an ImsFeature.
+ */
+ @Override
+ public void unregisterImsFeatureCallback(IImsServiceFeatureCallback callback) {
+ enforceModifyPermission();
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (mImsResolver == null) return;
+ mImsResolver.unregisterImsFeatureCallback(callback);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
/**
* Make sure either called from same process as self (phone) or IPC caller has read privilege.
*
diff --git a/src/com/android/phone/ImsUtil.java b/src/com/android/phone/ImsUtil.java
index 38936ec..0825cfb 100644
--- a/src/com/android/phone/ImsUtil.java
+++ b/src/com/android/phone/ImsUtil.java
@@ -25,6 +25,8 @@
import com.android.ims.ImsConfig;
import com.android.ims.ImsManager;
+import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.imsphone.ImsPhone;
public class ImsUtil {
private static final String LOG_TAG = ImsUtil.class.getSimpleName();
@@ -128,6 +130,13 @@
return false;
}
+ // Do not promote WFC if in roaming and WFC roaming not allowed.
+ // WFC roaming setting is not modifiable, so its value is decided by the default value
+ // chosen by the carrier, hence it really means if the carrier supports WFC roaming.
+ if (getLastKnownRoamingState(phoneId) && !imsManager.isWfcRoamingEnabledByUser()) {
+ return false;
+ }
+
ConnectivityManager cm =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm != null) {
@@ -152,4 +161,13 @@
}
return subId;
}
+
+ private static boolean getLastKnownRoamingState(int phoneId) {
+ try {
+ ImsPhone imsPhone = (ImsPhone) (PhoneFactory.getPhone(phoneId).getImsPhone());
+ return imsPhone.getRoamingState();
+ } catch (NullPointerException | ClassCastException e) {
+ return false;
+ }
+ }
}
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index 1be7273..4fb61f0 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -546,7 +546,11 @@
int slotId = SubscriptionManager.getSlotIndex(subId);
resId = (slotId == 0) ? R.drawable.stat_sys_phone_call_forward_sub1
: R.drawable.stat_sys_phone_call_forward_sub2;
- notificationTitle = subInfo.getDisplayName().toString();
+ if (subInfo.getDisplayName() != null) {
+ notificationTitle = subInfo.getDisplayName().toString();
+ } else {
+ notificationTitle = mContext.getString(R.string.labelCF);
+ }
} else {
notificationTitle = mContext.getString(R.string.labelCF);
}
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 0971754..03d5afe 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -55,6 +55,7 @@
import android.util.Log;
import android.widget.Toast;
+import com.android.ims.ImsFeatureBinderRepository;
import com.android.internal.telephony.CallManager;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.MmiCode;
@@ -267,7 +268,9 @@
// process.
EventSimStateChangedBag bag = (EventSimStateChangedBag)msg.obj;
if (IccCardConstants.INTENT_VALUE_ICC_READY.equals(bag.mIccStatus)
- || IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(bag.mIccStatus)) {
+ || IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(bag.mIccStatus)
+ || IccCardConstants.INTENT_VALUE_ICC_NOT_READY.equals(bag.mIccStatus)
+ || IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(bag.mIccStatus)) {
// when the right event is triggered and there
// are UI objects in the foreground, we close
// them to display the lock panel.
@@ -281,7 +284,7 @@
mPUKEntryProgressDialog.dismiss();
mPUKEntryProgressDialog = null;
}
- Log.i(LOG_TAG, "Dismissing depersonal panel");
+ Log.i(LOG_TAG, "Dismissing depersonal panel" + (bag.mIccStatus));
IccNetworkDepersonalizationPanel.dialogDismiss(bag.mPhoneId);
}
break;
@@ -354,7 +357,8 @@
String defaultImsRcsPackage = getResources().getString(
R.string.config_ims_rcs_package);
mImsResolver = new ImsResolver(this, defaultImsMmtelPackage,
- defaultImsRcsPackage, PhoneFactory.getPhones().length);
+ defaultImsRcsPackage, PhoneFactory.getPhones().length,
+ new ImsFeatureBinderRepository());
mImsResolver.initialize();
}
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 8bf31c1..a28afbc 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -31,7 +31,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
-import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@@ -64,7 +63,9 @@
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.Annotation.ApnType;
+import android.telephony.Annotation.ThermalMitigationResult;
import android.telephony.CallForwardingInfo;
+import android.telephony.CarrierBandwidth;
import android.telephony.CarrierConfigManager;
import android.telephony.CarrierRestrictionRules;
import android.telephony.CellIdentity;
@@ -74,6 +75,8 @@
import android.telephony.CellInfoGsm;
import android.telephony.CellInfoWcdma;
import android.telephony.ClientRequestStats;
+import android.telephony.DataThrottlingRequest;
+import android.telephony.IBootstrapAuthenticationCallback;
import android.telephony.ICellInfoCallback;
import android.telephony.IccOpenLogicalChannelResponse;
import android.telephony.LocationAccessPolicy;
@@ -92,20 +95,21 @@
import android.telephony.TelephonyHistogram;
import android.telephony.TelephonyManager;
import android.telephony.TelephonyScanManager;
+import android.telephony.ThermalMitigationRequest;
import android.telephony.UiccCardInfo;
import android.telephony.UiccSlotInfo;
import android.telephony.UssdResponse;
import android.telephony.VisualVoicemailSmsFilterSettings;
import android.telephony.data.ApnSetting;
import android.telephony.emergency.EmergencyNumber;
+import android.telephony.gba.GbaAuthRequest;
+import android.telephony.gba.UaSecurityProtocolIdentifier;
import android.telephony.ims.ImsException;
import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.RegistrationManager;
import android.telephony.ims.aidl.IImsCapabilityCallback;
import android.telephony.ims.aidl.IImsConfig;
import android.telephony.ims.aidl.IImsConfigCallback;
-import android.telephony.ims.aidl.IImsMmTelFeature;
-import android.telephony.ims.aidl.IImsRcsFeature;
import android.telephony.ims.aidl.IImsRegistration;
import android.telephony.ims.aidl.IImsRegistrationCallback;
import android.telephony.ims.feature.ImsFeature;
@@ -130,8 +134,10 @@
import com.android.internal.telephony.CommandException;
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.DefaultPhoneNotifier;
+import com.android.internal.telephony.GbaManager;
import com.android.internal.telephony.HalVersion;
import com.android.internal.telephony.IBooleanConsumer;
+import com.android.internal.telephony.ICallForwardingInfoCallback;
import com.android.internal.telephony.IIntegerConsumer;
import com.android.internal.telephony.INumberVerificationCallback;
import com.android.internal.telephony.ITelephony;
@@ -172,12 +178,15 @@
import com.android.internal.telephony.uicc.UiccSlot;
import com.android.internal.telephony.util.LocaleUtils;
import com.android.internal.telephony.util.VoicemailNotificationSettingsUtil;
+import com.android.internal.util.FunctionalUtils;
import com.android.internal.util.HexDump;
import com.android.phone.settings.PickSmsSubscriptionActivity;
import com.android.phone.vvm.PhoneAccountHandleConverter;
import com.android.phone.vvm.RemoteVvmTaskManager;
import com.android.phone.vvm.VisualVoicemailSettingsUtil;
import com.android.phone.vvm.VisualVoicemailSmsFilterConfig;
+import com.android.services.telephony.TelecomAccountRegistry;
+import com.android.services.telephony.TelephonyConnectionService;
import com.android.telephony.Rlog;
import java.io.FileDescriptor;
@@ -289,6 +298,18 @@
private static final int EVENT_GET_CALL_WAITING_DONE = 88;
private static final int CMD_SET_CALL_WAITING = 89;
private static final int EVENT_SET_CALL_WAITING_DONE = 90;
+ private static final int CMD_ENABLE_NR_DUAL_CONNECTIVITY = 91;
+ private static final int EVENT_ENABLE_NR_DUAL_CONNECTIVITY_DONE = 92;
+ private static final int CMD_IS_NR_DUAL_CONNECTIVITY_ENABLED = 93;
+ private static final int EVENT_IS_NR_DUAL_CONNECTIVITY_ENABLED_DONE = 94;
+ private static final int CMD_GET_CDMA_SUBSCRIPTION_MODE = 95;
+ private static final int EVENT_GET_CDMA_SUBSCRIPTION_MODE_DONE = 96;
+ private static final int CMD_GET_SYSTEM_SELECTION_CHANNELS = 97;
+ private static final int EVENT_GET_SYSTEM_SELECTION_CHANNELS_DONE = 98;
+ private static final int CMD_SET_DATA_THROTTLING = 99;
+ private static final int EVENT_SET_DATA_THROTTLING_DONE = 100;
+ private static final int CMD_SET_SIM_POWER = 101;
+ private static final int EVENT_SET_SIM_POWER_DONE = 102;
// Parameters of select command.
private static final int SELECT_COMMAND = 0xA4;
@@ -313,6 +334,8 @@
private AtomicBoolean mNotifyUserActivity;
private static final int USER_ACTIVITY_NOTIFICATION_DELAY = 200;
+ private Set<Integer> mCarrierPrivilegeTestOverrideSubIds = new ArraySet<>();
+
private static final String PREF_CARRIERS_ALPHATAG_PREFIX = "carrier_alphtag_";
private static final String PREF_CARRIERS_NUMBER_PREFIX = "carrier_number_";
private static final String PREF_CARRIERS_SUBSCRIBER_PREFIX = "carrier_subscriber_";
@@ -329,6 +352,8 @@
private static final int TYPE_ALLOCATION_CODE_LENGTH = 8;
private static final int MANUFACTURER_CODE_LENGTH = 8;
+ private static final int SET_DATA_THROTTLING_MODEM_THREW_INVALID_PARAMS = -1;
+
/**
* Experiment flag to enable erase modem config on reset network, default value is false
*/
@@ -749,6 +774,90 @@
handleNullReturnEvent(msg, "resetModemConfig");
break;
+ case CMD_IS_NR_DUAL_CONNECTIVITY_ENABLED: {
+ request = (MainThreadRequest) msg.obj;
+ onCompleted = obtainMessage(EVENT_IS_NR_DUAL_CONNECTIVITY_ENABLED_DONE,
+ request);
+ Phone phone = getPhoneFromRequest(request);
+ if (phone != null) {
+ phone.isNrDualConnectivityEnabled(onCompleted, request.workSource);
+ } else {
+ loge("isNRDualConnectivityEnabled: No phone object");
+ request.result = false;
+ notifyRequester(request);
+ }
+ break;
+ }
+
+ case EVENT_IS_NR_DUAL_CONNECTIVITY_ENABLED_DONE:
+ ar = (AsyncResult) msg.obj;
+ request = (MainThreadRequest) ar.userObj;
+ if (ar.exception == null && ar.result != null) {
+ request.result = ar.result;
+ } else {
+ // request.result must be set to something non-null
+ // for the calling thread to unblock
+ if (request.result != null) {
+ request.result = ar.result;
+ } else {
+ request.result = false;
+ }
+ if (ar.result == null) {
+ loge("isNRDualConnectivityEnabled: Empty response");
+ } else if (ar.exception instanceof CommandException) {
+ loge("isNRDualConnectivityEnabled: CommandException: "
+ + ar.exception);
+ } else {
+ loge("isNRDualConnectivityEnabled: Unknown exception");
+ }
+ }
+ notifyRequester(request);
+ break;
+
+ case CMD_ENABLE_NR_DUAL_CONNECTIVITY: {
+ request = (MainThreadRequest) msg.obj;
+ onCompleted = obtainMessage(EVENT_ENABLE_NR_DUAL_CONNECTIVITY_DONE, request);
+ Phone phone = getPhoneFromRequest(request);
+ if (phone != null) {
+ phone.setNrDualConnectivityState((int) request.argument, onCompleted,
+ request.workSource);
+ } else {
+ loge("enableNrDualConnectivity: No phone object");
+ request.result =
+ TelephonyManager.ENABLE_NR_DUAL_CONNECTIVITY_RADIO_NOT_AVAILABLE;
+ notifyRequester(request);
+ }
+ break;
+ }
+
+ case EVENT_ENABLE_NR_DUAL_CONNECTIVITY_DONE: {
+ ar = (AsyncResult) msg.obj;
+ request = (MainThreadRequest) ar.userObj;
+ if (ar.exception == null) {
+ request.result =
+ TelephonyManager.ENABLE_NR_DUAL_CONNECTIVITY_SUCCESS;
+ } else {
+ request.result =
+ TelephonyManager
+ .ENABLE_NR_DUAL_CONNECTIVITY_RADIO_ERROR;
+ if (ar.exception instanceof CommandException) {
+ CommandException.Error error =
+ ((CommandException) (ar.exception)).getCommandError();
+ if (error == CommandException.Error.RADIO_NOT_AVAILABLE) {
+ request.result =
+ TelephonyManager
+ .ENABLE_NR_DUAL_CONNECTIVITY_RADIO_NOT_AVAILABLE;
+ }
+ loge("enableNrDualConnectivity" + ": CommandException: "
+ + ar.exception);
+ } else {
+ loge("enableNrDualConnectivity" + ": Unknown exception");
+ }
+ }
+ notifyRequester(request);
+ break;
+ }
+
case CMD_GET_PREFERRED_NETWORK_TYPE:
request = (MainThreadRequest) msg.obj;
onCompleted = obtainMessage(EVENT_GET_PREFERRED_NETWORK_TYPE_DONE, request);
@@ -761,7 +870,9 @@
if (ar.exception == null && ar.result != null) {
request.result = ar.result; // Integer
} else {
- request.result = null;
+ // request.result must be set to something non-null
+ // for the calling thread to unblock
+ request.result = new int[]{-1};
if (ar.result == null) {
loge("getPreferredNetworkType: Empty response");
} else if (ar.exception instanceof CommandException) {
@@ -827,38 +938,43 @@
getPhoneFromRequest(request).getAvailableNetworks(onCompleted);
break;
- case CMD_GET_CALL_FORWARDING:
+ case CMD_GET_CALL_FORWARDING: {
request = (MainThreadRequest) msg.obj;
onCompleted = obtainMessage(EVENT_GET_CALL_FORWARDING_DONE, request);
- int callForwardingReason = (Integer) request.argument;
- getPhoneFromRequest(request).getCallForwardingOption(
- callForwardingReason, onCompleted);
+ Pair<Integer, TelephonyManager.CallForwardingInfoCallback> args =
+ (Pair<Integer, TelephonyManager.CallForwardingInfoCallback>)
+ request.argument;
+ int callForwardingReason = args.first;
+ request.phone.getCallForwardingOption(callForwardingReason, onCompleted);
break;
-
- case EVENT_GET_CALL_FORWARDING_DONE:
+ }
+ case EVENT_GET_CALL_FORWARDING_DONE: {
ar = (AsyncResult) msg.obj;
request = (MainThreadRequest) ar.userObj;
- CallForwardingInfo callForwardingInfo = null;
+ TelephonyManager.CallForwardingInfoCallback callback =
+ ((Pair<Integer, TelephonyManager.CallForwardingInfoCallback>)
+ request.argument).second;
if (ar.exception == null && ar.result != null) {
+ CallForwardingInfo callForwardingInfo = null;
CallForwardInfo[] callForwardInfos = (CallForwardInfo[]) ar.result;
for (CallForwardInfo callForwardInfo : callForwardInfos) {
// Service Class is a bit mask per 3gpp 27.007. Search for
// any service for voice call.
if ((callForwardInfo.serviceClass
& CommandsInterface.SERVICE_CLASS_VOICE) > 0) {
- callForwardingInfo = new CallForwardingInfo(
- callForwardInfo.serviceClass, callForwardInfo.reason,
- callForwardInfo.number,
- callForwardInfo.timeSeconds);
+ callForwardingInfo = new CallForwardingInfo(true,
+ callForwardInfo.reason,
+ callForwardInfo.number,
+ callForwardInfo.timeSeconds);
break;
}
}
// Didn't find a call forward info for voice call.
if (callForwardingInfo == null) {
- callForwardingInfo = new CallForwardingInfo(
- CallForwardingInfo.STATUS_UNKNOWN_ERROR,
- 0 /* reason */, null /* number */, 0 /* timeout */);
+ callForwardingInfo = new CallForwardingInfo(false /* enabled */,
+ 0 /* reason */, null /* number */, 0 /* timeout */);
}
+ callback.onCallForwardingInfoAvailable(callForwardingInfo);
} else {
if (ar.result == null) {
loge("EVENT_GET_CALL_FORWARDING_DONE: Empty response");
@@ -866,56 +982,80 @@
if (ar.exception != null) {
loge("EVENT_GET_CALL_FORWARDING_DONE: Exception: " + ar.exception);
}
- int errorCode = CallForwardingInfo.STATUS_UNKNOWN_ERROR;
+ int errorCode = TelephonyManager
+ .CallForwardingInfoCallback.RESULT_ERROR_UNKNOWN;
if (ar.exception instanceof CommandException) {
CommandException.Error error =
((CommandException) (ar.exception)).getCommandError();
if (error == CommandException.Error.FDN_CHECK_FAILURE) {
- errorCode = CallForwardingInfo.STATUS_FDN_CHECK_FAILURE;
+ errorCode = TelephonyManager
+ .CallForwardingInfoCallback.RESULT_ERROR_FDN_CHECK_FAILURE;
} else if (error == CommandException.Error.REQUEST_NOT_SUPPORTED) {
- errorCode = CallForwardingInfo.STATUS_NOT_SUPPORTED;
+ errorCode = TelephonyManager
+ .CallForwardingInfoCallback.RESULT_ERROR_NOT_SUPPORTED;
}
}
- callForwardingInfo = new CallForwardingInfo(
- errorCode, 0 /* reason */, null /* number */, 0 /* timeout */);
+ callback.onError(errorCode);
}
- request.result = callForwardingInfo;
- notifyRequester(request);
break;
+ }
- case CMD_SET_CALL_FORWARDING:
+ case CMD_SET_CALL_FORWARDING: {
request = (MainThreadRequest) msg.obj;
onCompleted = obtainMessage(EVENT_SET_CALL_FORWARDING_DONE, request);
+ request = (MainThreadRequest) msg.obj;
CallForwardingInfo callForwardingInfoToSet =
- (CallForwardingInfo) request.argument;
- getPhoneFromRequest(request).setCallForwardingOption(
- callForwardingInfoToSet.getStatus(),
+ ((Pair<CallForwardingInfo, Consumer<Integer>>)
+ request.argument).first;
+ request.phone.setCallForwardingOption(
+ callForwardingInfoToSet.isEnabled()
+ ? CommandsInterface.CF_ACTION_ENABLE
+ : CommandsInterface.CF_ACTION_DISABLE,
callForwardingInfoToSet.getReason(),
callForwardingInfoToSet.getNumber(),
callForwardingInfoToSet.getTimeoutSeconds(), onCompleted);
break;
+ }
- case EVENT_SET_CALL_FORWARDING_DONE:
+ case EVENT_SET_CALL_FORWARDING_DONE: {
ar = (AsyncResult) msg.obj;
request = (MainThreadRequest) ar.userObj;
- if (ar.exception == null) {
- request.result = true;
- } else {
- request.result = false;
+ Consumer<Integer> callback =
+ ((Pair<CallForwardingInfo, Consumer<Integer>>)
+ request.argument).second;
+ if (ar.exception != null) {
loge("setCallForwarding exception: " + ar.exception);
+ int errorCode = TelephonyManager.CallForwardingInfoCallback
+ .RESULT_ERROR_UNKNOWN;
+ if (ar.exception instanceof CommandException) {
+ CommandException.Error error =
+ ((CommandException) (ar.exception)).getCommandError();
+ if (error == CommandException.Error.FDN_CHECK_FAILURE) {
+ errorCode = TelephonyManager.CallForwardingInfoCallback
+ .RESULT_ERROR_FDN_CHECK_FAILURE;
+ } else if (error == CommandException.Error.REQUEST_NOT_SUPPORTED) {
+ errorCode = TelephonyManager.CallForwardingInfoCallback
+ .RESULT_ERROR_NOT_SUPPORTED;
+ }
+ }
+ callback.accept(errorCode);
+ } else {
+ callback.accept(TelephonyManager.CallForwardingInfoCallback.RESULT_SUCCESS);
}
- notifyRequester(request);
break;
+ }
- case CMD_GET_CALL_WAITING:
+ case CMD_GET_CALL_WAITING: {
request = (MainThreadRequest) msg.obj;
onCompleted = obtainMessage(EVENT_GET_CALL_WAITING_DONE, request);
getPhoneFromRequest(request).getCallWaiting(onCompleted);
break;
+ }
- case EVENT_GET_CALL_WAITING_DONE:
+ case EVENT_GET_CALL_WAITING_DONE: {
ar = (AsyncResult) msg.obj;
request = (MainThreadRequest) ar.userObj;
+ Consumer<Integer> callback = (Consumer<Integer>) request.argument;
int callForwardingStatus = TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR;
if (ar.exception == null && ar.result != null) {
int[] callForwardResults = (int[]) ar.result;
@@ -923,12 +1063,12 @@
// Search for any service for voice call.
if (callForwardResults.length > 1
&& ((callForwardResults[1]
- & CommandsInterface.SERVICE_CLASS_VOICE) > 0)) {
+ & CommandsInterface.SERVICE_CLASS_VOICE) > 0)) {
callForwardingStatus = callForwardResults[0] == 0
- ? TelephonyManager.CALL_WAITING_STATUS_INACTIVE
- : TelephonyManager.CALL_WAITING_STATUS_ACTIVE;
+ ? TelephonyManager.CALL_WAITING_STATUS_DISABLED
+ : TelephonyManager.CALL_WAITING_STATUS_ENABLED;
} else {
- callForwardingStatus = TelephonyManager.CALL_WAITING_STATUS_INACTIVE;
+ callForwardingStatus = TelephonyManager.CALL_WAITING_STATUS_DISABLED;
}
} else {
if (ar.result == null) {
@@ -946,28 +1086,43 @@
}
}
}
- request.result = callForwardingStatus;
- notifyRequester(request);
+ callback.accept(callForwardingStatus);
break;
+ }
- case CMD_SET_CALL_WAITING:
+ case CMD_SET_CALL_WAITING: {
request = (MainThreadRequest) msg.obj;
onCompleted = obtainMessage(EVENT_SET_CALL_WAITING_DONE, request);
- boolean isEnable = (Boolean) request.argument;
- getPhoneFromRequest(request).setCallWaiting(isEnable, onCompleted);
+ boolean enable = ((Pair<Boolean, Consumer<Integer>>) request.argument).first;
+ getPhoneFromRequest(request).setCallWaiting(enable, onCompleted);
break;
+ }
- case EVENT_SET_CALL_WAITING_DONE:
+ case EVENT_SET_CALL_WAITING_DONE: {
ar = (AsyncResult) msg.obj;
request = (MainThreadRequest) ar.userObj;
- if (ar.exception == null) {
- request.result = true;
- } else {
- request.result = false;
+ boolean enable = ((Pair<Boolean, Consumer<Integer>>) request.argument).first;
+ Consumer<Integer> callback =
+ ((Pair<Boolean, Consumer<Integer>>) request.argument).second;
+ if (ar.exception != null) {
loge("setCallWaiting exception: " + ar.exception);
+ if (ar.exception instanceof CommandException) {
+ CommandException.Error error =
+ ((CommandException) (ar.exception)).getCommandError();
+ if (error == CommandException.Error.REQUEST_NOT_SUPPORTED) {
+ callback.accept(TelephonyManager.CALL_WAITING_STATUS_NOT_SUPPORTED);
+ } else {
+ callback.accept(TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR);
+ }
+ } else {
+ callback.accept(TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR);
+ }
+ } else {
+ callback.accept(enable ? TelephonyManager.CALL_WAITING_STATUS_ENABLED
+ : TelephonyManager.CALL_WAITING_STATUS_DISABLED);
}
- notifyRequester(request);
break;
+ }
case EVENT_PERFORM_NETWORK_SCAN_DONE:
ar = (AsyncResult) msg.obj;
@@ -1246,11 +1401,27 @@
request.result = ar.exception == null;
notifyRequester(request);
break;
+ case CMD_GET_CDMA_SUBSCRIPTION_MODE:
+ request = (MainThreadRequest) msg.obj;
+ onCompleted = obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_MODE_DONE, request);
+ getPhoneFromRequest(request).queryCdmaSubscriptionMode(onCompleted);
+ break;
+ case EVENT_GET_CDMA_SUBSCRIPTION_MODE_DONE:
+ ar = (AsyncResult) msg.obj;
+ request = (MainThreadRequest) ar.userObj;
+ if (ar.exception != null) {
+ request.result = TelephonyManager.CDMA_SUBSCRIPTION_RUIM_SIM;
+ } else {
+ request.result = ((int[]) ar.result)[0];
+ }
+ notifyRequester(request);
+ break;
case CMD_SET_CDMA_SUBSCRIPTION_MODE:
request = (MainThreadRequest) msg.obj;
onCompleted = obtainMessage(EVENT_SET_CDMA_SUBSCRIPTION_MODE_DONE, request);
int subscriptionMode = (int) request.argument;
- getPhoneFromRequest(request).setCdmaSubscription(subscriptionMode, onCompleted);
+ getPhoneFromRequest(request).setCdmaSubscriptionMode(
+ subscriptionMode, onCompleted);
break;
case EVENT_SET_CDMA_SUBSCRIPTION_MODE_DONE:
ar = (AsyncResult) msg.obj;
@@ -1300,19 +1471,20 @@
Log.w(LOG_TAG, "Discarded CellInfo due to Callback RemoteException");
}
break;
- case CMD_GET_CELL_LOCATION:
+ case CMD_GET_CELL_LOCATION: {
request = (MainThreadRequest) msg.obj;
WorkSource ws = (WorkSource) request.argument;
Phone phone = getPhoneFromRequest(request);
phone.getCellIdentity(ws, obtainMessage(EVENT_GET_CELL_LOCATION_DONE, request));
break;
- case EVENT_GET_CELL_LOCATION_DONE:
+ }
+ case EVENT_GET_CELL_LOCATION_DONE: {
ar = (AsyncResult) msg.obj;
request = (MainThreadRequest) ar.userObj;
if (ar.exception == null) {
request.result = ar.result;
} else {
- phone = getPhoneFromRequest(request);
+ Phone phone = getPhoneFromRequest(request);
request.result = (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA)
? new CellIdentityCdma() : new CellIdentityGsm();
}
@@ -1321,6 +1493,7 @@
request.notifyAll();
}
break;
+ }
case CMD_MODEM_REBOOT:
request = (MainThreadRequest) msg.obj;
onCompleted = obtainMessage(EVENT_RESET_MODEM_CONFIG_DONE, request);
@@ -1396,6 +1569,35 @@
notifyRequester(request);
break;
}
+ case CMD_GET_SYSTEM_SELECTION_CHANNELS: {
+ request = (MainThreadRequest) msg.obj;
+ onCompleted = obtainMessage(EVENT_GET_SYSTEM_SELECTION_CHANNELS_DONE, request);
+ Phone phone = getPhoneFromRequest(request);
+ if (phone != null) {
+ phone.getSystemSelectionChannels(onCompleted);
+ } else {
+ loge("getSystemSelectionChannels: No phone object");
+ request.result = new ArrayList<RadioAccessSpecifier>();
+ notifyRequester(request);
+ }
+ break;
+ }
+ case EVENT_GET_SYSTEM_SELECTION_CHANNELS_DONE:
+ ar = (AsyncResult) msg.obj;
+ request = (MainThreadRequest) ar.userObj;
+ if (ar.exception == null && ar.result != null) {
+ request.result = ar.result;
+ } else {
+ request.result = new IllegalArgumentException(
+ "Failed to retrieve system selection channels");
+ if (ar.result == null) {
+ loge("getSystemSelectionChannels: Empty response");
+ } else {
+ loge("getSystemSelectionChannels: Unknown exception");
+ }
+ }
+ notifyRequester(request);
+ break;
case EVENT_SET_FORBIDDEN_PLMNS_DONE:
ar = (AsyncResult) msg.obj;
request = (MainThreadRequest) ar.userObj;
@@ -1492,6 +1694,102 @@
getDefaultPhone().getContext().sendBroadcastAsUser(
intent, UserHandle.ALL, permission.USER_ACTIVITY);
break;
+
+ case CMD_SET_DATA_THROTTLING: {
+ request = (MainThreadRequest) msg.obj;
+ onCompleted = obtainMessage(EVENT_SET_DATA_THROTTLING_DONE, request);
+ DataThrottlingRequest dataThrottlingRequest =
+ (DataThrottlingRequest) request.argument;
+ Phone phone = getPhoneFromRequest(request);
+ if (phone != null) {
+ phone.setDataThrottling(onCompleted,
+ request.workSource, dataThrottlingRequest.getDataThrottlingAction(),
+ dataThrottlingRequest.getCompletionDurationMillis());
+ } else {
+ loge("setDataThrottling: No phone object");
+ request.result =
+ TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE;
+ notifyRequester(request);
+ }
+
+ break;
+ }
+ case EVENT_SET_DATA_THROTTLING_DONE:
+ ar = (AsyncResult) msg.obj;
+ request = (MainThreadRequest) ar.userObj;
+
+ if (ar.exception == null) {
+ request.result = TelephonyManager.THERMAL_MITIGATION_RESULT_SUCCESS;
+ } else if (ar.exception instanceof CommandException) {
+ loge("setDataThrottling: CommandException: " + ar.exception);
+ CommandException.Error error =
+ ((CommandException) (ar.exception)).getCommandError();
+
+ if (error == CommandException.Error.RADIO_NOT_AVAILABLE) {
+ request.result = TelephonyManager
+ .THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE;
+ } else if (error == CommandException.Error.INVALID_ARGUMENTS) {
+ request.result = SET_DATA_THROTTLING_MODEM_THREW_INVALID_PARAMS;
+ } else {
+ request.result =
+ TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_ERROR;
+ }
+ } else {
+ request.result = TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_ERROR;
+ }
+ Log.w(LOG_TAG, "DataThrottlingResult = " + request.result);
+ notifyRequester(request);
+ break;
+
+ case CMD_SET_SIM_POWER: {
+ request = (MainThreadRequest) msg.obj;
+ onCompleted = obtainMessage(EVENT_SET_SIM_POWER_DONE, request);
+ request = (MainThreadRequest) msg.obj;
+ int stateToSet =
+ ((Pair<Integer, IIntegerConsumer>)
+ request.argument).first;
+ request.phone.setSimPowerState(stateToSet, onCompleted, request.workSource);
+ break;
+ }
+ case EVENT_SET_SIM_POWER_DONE: {
+ ar = (AsyncResult) msg.obj;
+ request = (MainThreadRequest) ar.userObj;
+ IIntegerConsumer callback =
+ ((Pair<Integer, IIntegerConsumer>) request.argument).second;
+ if (ar.exception != null) {
+ loge("setSimPower exception: " + ar.exception);
+ int errorCode = TelephonyManager.CallForwardingInfoCallback
+ .RESULT_ERROR_UNKNOWN;
+ if (ar.exception instanceof CommandException) {
+ CommandException.Error error =
+ ((CommandException) (ar.exception)).getCommandError();
+ if (error == CommandException.Error.SIM_ERR) {
+ errorCode = TelephonyManager.SET_SIM_POWER_STATE_SIM_ERROR;
+ } else if (error == CommandException.Error.INVALID_ARGUMENTS) {
+ errorCode = TelephonyManager.SET_SIM_POWER_STATE_ALREADY_IN_STATE;
+ } else if (error == CommandException.Error.REQUEST_NOT_SUPPORTED) {
+ errorCode = TelephonyManager.SET_SIM_POWER_STATE_NOT_SUPPORTED;
+ } else {
+ errorCode = TelephonyManager.SET_SIM_POWER_STATE_MODEM_ERROR;
+ }
+ }
+ try {
+ callback.accept(errorCode);
+ } catch (RemoteException e) {
+ // Ignore if the remote process is no longer available to call back.
+ Log.w(LOG_TAG, "setSimPower: callback not available.");
+ }
+ } else {
+ try {
+ callback.accept(TelephonyManager.SET_SIM_POWER_STATE_SUCCESS);
+ } catch (RemoteException e) {
+ // Ignore if the remote process is no longer available to call back.
+ Log.w(LOG_TAG, "setSimPower: callback not available.");
+ }
+ }
+ break;
+ }
+
default:
Log.w(LOG_TAG, "MainThreadHandler: unexpected message code: " + msg.what);
break;
@@ -1881,6 +2179,11 @@
((CommandException)(ar.exception)).getCommandError()
== CommandException.Error.PASSWORD_INCORRECT) {
mResult = PhoneConstants.PIN_PASSWORD_INCORRECT;
+ } //When UiccCardApp dispose,handle message and return exception
+ else if (ar.exception instanceof CommandException &&
+ ((CommandException) (ar.exception)).getCommandError()
+ == CommandException.Error.ABORTED) {
+ mResult = PhoneConstants.PIN_OPERATION_ABORTED;
} else {
mResult = PhoneConstants.PIN_GENERAL_FAILURE;
}
@@ -1940,20 +2243,52 @@
}
}
+ /**
+ * This method has been removed due to privacy and stability concerns.
+ */
+ @Override
public void updateServiceLocation() {
- updateServiceLocationForSubscriber(getDefaultSubscription());
-
+ Log.e(LOG_TAG, "Call to unsupported method updateServiceLocation()");
+ return;
}
- public void updateServiceLocationForSubscriber(int subId) {
- // No permission check needed here: this call is harmless, and it's
- // needed for the ServiceState.requestStateUpdate() call (which is
- // already intentionally exposed to 3rd parties.)
+ @Override
+ public void updateServiceLocationWithPackageName(String callingPackage) {
+ mApp.getSystemService(AppOpsManager.class)
+ .checkPackage(Binder.getCallingUid(), callingPackage);
+
+ final int targetSdk = TelephonyPermissions.getTargetSdk(mApp, callingPackage);
+ if (targetSdk > android.os.Build.VERSION_CODES.R) {
+ // Callers targeting S have no business invoking this method.
+ return;
+ }
+
+ LocationAccessPolicy.LocationPermissionResult locationResult =
+ LocationAccessPolicy.checkLocationPermission(mApp,
+ new LocationAccessPolicy.LocationPermissionQuery.Builder()
+ .setCallingPackage(callingPackage)
+ .setCallingFeatureId(null)
+ .setCallingPid(Binder.getCallingPid())
+ .setCallingUid(Binder.getCallingUid())
+ .setMethod("updateServiceLocation")
+ .setMinSdkVersionForCoarse(Build.VERSION_CODES.BASE)
+ .setMinSdkVersionForFine(Build.VERSION_CODES.Q)
+ .build());
+ // Apps that lack location permission have no business calling this method;
+ // however, because no permission was declared in the public API, denials must
+ // all be "soft".
+ switch (locationResult) {
+ case DENIED_HARD: /* fall through */
+ case DENIED_SOFT:
+ return;
+ }
+
+ WorkSource workSource = getWorkSource(Binder.getCallingUid());
final long identity = Binder.clearCallingIdentity();
try {
- final Phone phone = getPhone(subId);
+ final Phone phone = getPhone(getDefaultSubscription());
if (phone != null) {
- phone.updateServiceLocation();
+ phone.updateServiceLocation(workSource);
}
} finally {
Binder.restoreCallingIdentity(identity);
@@ -2135,7 +2470,8 @@
int subId = mSubscriptionController.getDefaultDataSubId();
final Phone phone = getPhone(subId);
if (phone != null) {
- phone.getDataEnabledSettings().setUserDataEnabled(true);
+ phone.getDataEnabledSettings().setDataEnabled(
+ TelephonyManager.DATA_ENABLED_REASON_USER, true);
return true;
} else {
return false;
@@ -2155,7 +2491,8 @@
int subId = mSubscriptionController.getDefaultDataSubId();
final Phone phone = getPhone(subId);
if (phone != null) {
- phone.getDataEnabledSettings().setUserDataEnabled(false);
+ phone.getDataEnabledSettings().setDataEnabled(
+ TelephonyManager.DATA_ENABLED_REASON_USER, false);
return true;
} else {
return false;
@@ -2329,72 +2666,37 @@
}
}
+ /**
+ * This method was removed due to potential issues caused by performing partial
+ * updates of service state, and lack of a credible use case.
+ *
+ * This has the ability to break the telephony implementation by disabling notification of
+ * changes in device connectivity. DO NOT USE THIS!
+ */
@Override
public void enableLocationUpdates() {
- enableLocationUpdatesForSubscriber(getDefaultSubscription());
- }
-
- @Override
- public void enableLocationUpdatesForSubscriber(int subId) {
mApp.enforceCallingOrSelfPermission(
android.Manifest.permission.CONTROL_LOCATION_UPDATES, null);
-
- final long identity = Binder.clearCallingIdentity();
- try {
- final Phone phone = getPhone(subId);
- if (phone != null) {
- phone.enableLocationUpdates();
- }
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-
- @Override
- public void disableLocationUpdates() {
- disableLocationUpdatesForSubscriber(getDefaultSubscription());
- }
-
- @Override
- public void disableLocationUpdatesForSubscriber(int subId) {
- mApp.enforceCallingOrSelfPermission(
- android.Manifest.permission.CONTROL_LOCATION_UPDATES, null);
-
- final long identity = Binder.clearCallingIdentity();
- try {
- final Phone phone = getPhone(subId);
- if (phone != null) {
- phone.disableLocationUpdates();
- }
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
}
/**
- * Returns the target SDK version number for a given package name.
+ * This method was removed due to potential issues caused by performing partial
+ * updates of service state, and lack of a credible use case.
*
- * This call MUST be invoked before clearing the calling UID.
- *
- * @return target SDK if the package is found or INT_MAX.
+ * This has the ability to break the telephony implementation by disabling notification of
+ * changes in device connectivity. DO NOT USE THIS!
*/
- private int getTargetSdk(String packageName) {
- try {
- final ApplicationInfo ai = mApp.getPackageManager().getApplicationInfoAsUser(
- packageName, 0, UserHandle.getUserHandleForUid(Binder.getCallingUid()));
- if (ai != null) return ai.targetSdkVersion;
- } catch (PackageManager.NameNotFoundException unexpected) {
- loge("Failed to get package info for pkg="
- + packageName + ", uid=" + Binder.getCallingUid());
- }
- return Integer.MAX_VALUE;
+ @Override
+ public void disableLocationUpdates() {
+ mApp.enforceCallingOrSelfPermission(
+ android.Manifest.permission.CONTROL_LOCATION_UPDATES, null);
}
@Override
@SuppressWarnings("unchecked")
public List<NeighboringCellInfo> getNeighboringCellInfo(String callingPackage,
String callingFeatureId) {
- final int targetSdk = getTargetSdk(callingPackage);
+ final int targetSdk = TelephonyPermissions.getTargetSdk(mApp, callingPackage);
if (targetSdk >= android.os.Build.VERSION_CODES.Q) {
throw new SecurityException(
"getNeighboringCellInfo() is unavailable to callers targeting Q+ SDK levels.");
@@ -2453,7 +2755,7 @@
return new ArrayList<>();
}
- final int targetSdk = getTargetSdk(callingPackage);
+ final int targetSdk = TelephonyPermissions.getTargetSdk(mApp, callingPackage);
if (targetSdk >= android.os.Build.VERSION_CODES.Q) {
return getCachedCellInfo();
}
@@ -2506,13 +2808,15 @@
.build());
switch (locationResult) {
case DENIED_HARD:
- if (getTargetSdk(callingPackage) < Build.VERSION_CODES.Q) {
+ if (TelephonyPermissions
+ .getTargetSdk(mApp, callingPackage) < Build.VERSION_CODES.Q) {
// Safetynet logging for b/154934934
EventLog.writeEvent(0x534e4554, "154934934", Binder.getCallingUid());
}
throw new SecurityException("Not allowed to access cell info");
case DENIED_SOFT:
- if (getTargetSdk(callingPackage) < Build.VERSION_CODES.Q) {
+ if (TelephonyPermissions
+ .getTargetSdk(mApp, callingPackage) < Build.VERSION_CODES.Q) {
// Safetynet logging for b/154934934
EventLog.writeEvent(0x534e4554, "154934934", Binder.getCallingUid());
}
@@ -4237,7 +4541,7 @@
@Override
public int getNetworkTypeForSubscriber(int subId, String callingPackage,
String callingFeatureId) {
- final int targetSdk = getTargetSdk(callingPackage);
+ final int targetSdk = TelephonyPermissions.getTargetSdk(mApp, callingPackage);
if (targetSdk > android.os.Build.VERSION_CODES.Q) {
return getDataNetworkTypeForSubscriber(subId, callingPackage, callingFeatureId);
} else if (targetSdk == android.os.Build.VERSION_CODES.Q
@@ -4376,7 +4680,8 @@
if (phone == null) {
return PhoneConstants.LTE_ON_CDMA_UNKNOWN;
} else {
- return phone.getLteOnCdmaMode();
+ return TelephonyProperties.lte_on_cdma_device()
+ .orElse(PhoneConstants.LTE_ON_CDMA_FALSE);
}
} finally {
Binder.restoreCallingIdentity(identity);
@@ -4983,58 +5288,35 @@
}
/**
- * Returns the {@link IImsMmTelFeature} that corresponds to the given slot Id for the MMTel
- * feature or {@link null} if the service is not available. If the feature is available, the
- * {@link IImsServiceFeatureCallback} callback is registered as a listener for feature updates.
+ * Registers for updates to the MmTelFeature connection through the IImsServiceFeatureCallback
+ * callback.
*/
- public IImsMmTelFeature getMmTelFeatureAndListen(int slotId,
- IImsServiceFeatureCallback callback) {
+ @Override
+ public void registerMmTelFeatureCallback(int slotId, IImsServiceFeatureCallback callback) {
enforceModifyPermission();
final long identity = Binder.clearCallingIdentity();
try {
if (mImsResolver == null) {
- // may happen if the device does not support IMS.
- return null;
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "Device does not support IMS");
}
- return mImsResolver.getMmTelFeatureAndListen(slotId, callback);
+ mImsResolver.listenForFeature(slotId, ImsFeature.FEATURE_MMTEL, callback);
} finally {
Binder.restoreCallingIdentity(identity);
}
}
-
- /**
- * Returns the {@link IImsRcsFeature} that corresponds to the given slot Id for the RCS
- * feature during emergency calling or {@link null} if the service is not available. If the
- * feature is available, the {@link IImsServiceFeatureCallback} callback is registered as a
- * listener for feature updates.
- */
- public IImsRcsFeature getRcsFeatureAndListen(int slotId, IImsServiceFeatureCallback callback) {
- enforceModifyPermission();
-
- final long identity = Binder.clearCallingIdentity();
- try {
- if (mImsResolver == null) {
- // may happen if the device does not support IMS.
- return null;
- }
- return mImsResolver.getRcsFeatureAndListen(slotId, callback);
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-
/**
* Unregister a previously registered IImsServiceFeatureCallback associated with an ImsFeature.
*/
- public void unregisterImsFeatureCallback(int slotId, int featureType,
- IImsServiceFeatureCallback callback) {
+ @Override
+ public void unregisterImsFeatureCallback(IImsServiceFeatureCallback callback) {
enforceModifyPermission();
final long identity = Binder.clearCallingIdentity();
try {
if (mImsResolver == null) return;
- mImsResolver.unregisterImsFeatureCallback(slotId, featureType, callback);
+ mImsResolver.unregisterImsFeatureCallback(callback);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -5115,6 +5397,36 @@
}
/**
+ * Clears any carrier ImsService overrides for the slot index specified that were previously
+ * set with {@link #setBoundImsServiceOverride(int, boolean, int[], String)}.
+ *
+ * This should only be used for testing.
+ *
+ * @param slotIndex the slot ID that the ImsService should bind for.
+ * @return true if clearing the carrier ImsService override succeeded or false if it did not.
+ */
+ @Override
+ public boolean clearCarrierImsServiceOverride(int slotIndex) {
+ int[] subIds = SubscriptionManager.getSubId(slotIndex);
+ TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(),
+ "clearCarrierImsServiceOverride");
+ TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(mApp,
+ (subIds != null ? subIds[0] : SubscriptionManager.INVALID_SUBSCRIPTION_ID),
+ "clearCarrierImsServiceOverride");
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (mImsResolver == null) {
+ // may happen if the device does not support IMS.
+ return false;
+ }
+ return mImsResolver.clearCarrierImsServiceConfiguration(slotIndex);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
* Return the package name of the currently bound ImsService.
*
* @param slotId The slot that the ImsService is associated with.
@@ -5211,7 +5523,7 @@
}
}
- /**
+ /**
* Ask the radio to connect to the input network and change selection mode to manual.
*
* @param subId the id of the subscription.
@@ -5315,7 +5627,8 @@
* Get the call forwarding info, given the call forwarding reason.
*/
@Override
- public CallForwardingInfo getCallForwarding(int subId, int callForwardingReason) {
+ public void getCallForwarding(int subId, int callForwardingReason,
+ ICallForwardingInfoCallback callback) {
enforceReadPrivilegedPermission("getCallForwarding");
long identity = Binder.clearCallingIdentity();
try {
@@ -5323,8 +5636,39 @@
log("getCallForwarding: subId " + subId
+ " callForwardingReason" + callForwardingReason);
}
- return (CallForwardingInfo) sendRequest(
- CMD_GET_CALL_FORWARDING, callForwardingReason, subId);
+
+ Phone phone = getPhone(subId);
+ if (phone == null) {
+ try {
+ callback.onError(
+ TelephonyManager.CallForwardingInfoCallback.RESULT_ERROR_UNKNOWN);
+ } catch (RemoteException e) {
+ // ignore
+ }
+ return;
+ }
+
+ Pair<Integer, TelephonyManager.CallForwardingInfoCallback> argument = Pair.create(
+ callForwardingReason, new TelephonyManager.CallForwardingInfoCallback() {
+ @Override
+ public void onCallForwardingInfoAvailable(CallForwardingInfo info) {
+ try {
+ callback.onCallForwardingInfoAvailable(info);
+ } catch (RemoteException e) {
+ // ignore
+ }
+ }
+
+ @Override
+ public void onError(int error) {
+ try {
+ callback.onError(error);
+ } catch (RemoteException e) {
+ // ignore
+ }
+ }
+ });
+ sendRequestAsync(CMD_GET_CALL_FORWARDING, argument, phone, null);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -5335,7 +5679,8 @@
* reason, the number to forward, and the timeout before the forwarding is attempted.
*/
@Override
- public boolean setCallForwarding(int subId, CallForwardingInfo callForwardingInfo) {
+ public void setCallForwarding(int subId, CallForwardingInfo callForwardingInfo,
+ IIntegerConsumer callback) {
enforceModifyPermission();
long identity = Binder.clearCallingIdentity();
try {
@@ -5343,38 +5688,79 @@
log("setCallForwarding: subId " + subId
+ " callForwardingInfo" + callForwardingInfo);
}
- return (Boolean) sendRequest(CMD_SET_CALL_FORWARDING, callForwardingInfo, subId);
+
+ Phone phone = getPhone(subId);
+ if (phone == null) {
+ try {
+ callback.accept(
+ TelephonyManager.CallForwardingInfoCallback.RESULT_ERROR_UNKNOWN);
+ } catch (RemoteException e) {
+ // ignore
+ }
+ return;
+ }
+
+ Pair<CallForwardingInfo, Consumer<Integer>> arguments = Pair.create(callForwardingInfo,
+ FunctionalUtils.ignoreRemoteException(callback::accept));
+
+ sendRequestAsync(CMD_SET_CALL_FORWARDING, arguments, phone, null);
} finally {
Binder.restoreCallingIdentity(identity);
}
}
/**
- * Get the call forwarding info, given the call forwarding reason.
+ * Get the call waiting status for a subId.
*/
@Override
- public int getCallWaitingStatus(int subId) {
+ public void getCallWaitingStatus(int subId, IIntegerConsumer callback) {
enforceReadPrivilegedPermission("getCallForwarding");
long identity = Binder.clearCallingIdentity();
try {
+
+ Phone phone = getPhone(subId);
+ if (phone == null) {
+ try {
+ callback.accept(TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR);
+ } catch (RemoteException e) {
+ // ignore
+ }
+ return;
+ }
+
+ Consumer<Integer> argument = FunctionalUtils.ignoreRemoteException(callback::accept);
+
if (DBG) log("getCallWaitingStatus: subId " + subId);
- return (Integer) sendRequest(CMD_GET_CALL_WAITING, null, subId);
+ sendRequestAsync(CMD_GET_CALL_WAITING, argument, phone, null);
} finally {
Binder.restoreCallingIdentity(identity);
}
}
/**
- * Sets the voice call forwarding info including status (enable/disable), call forwarding
- * reason, the number to forward, and the timeout before the forwarding is attempted.
+ * Sets whether call waiting is enabled for a given subId.
*/
@Override
- public boolean setCallWaitingStatus(int subId, boolean isEnable) {
+ public void setCallWaitingStatus(int subId, boolean enable, IIntegerConsumer callback) {
enforceModifyPermission();
long identity = Binder.clearCallingIdentity();
try {
- if (DBG) log("setCallWaitingStatus: subId " + subId + " isEnable: " + isEnable);
- return (Boolean) sendRequest(CMD_SET_CALL_WAITING, isEnable, subId);
+ if (DBG) log("setCallWaitingStatus: subId " + subId + " enable: " + enable);
+
+ Phone phone = getPhone(subId);
+ if (phone == null) {
+ try {
+ callback.accept(TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR);
+ } catch (RemoteException e) {
+ // ignore
+ }
+ return;
+ }
+
+ Pair<Boolean, Consumer<Integer>> arguments = Pair.create(enable,
+ FunctionalUtils.ignoreRemoteException(callback::accept));
+
+ sendRequestAsync(CMD_SET_CALL_WAITING, arguments, phone, null);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -5612,6 +5998,80 @@
}
/**
+ * Enable/Disable E-UTRA-NR Dual Connectivity
+ * @param subId subscription id of the sim card
+ * @param nrDualConnectivityState expected NR dual connectivity state
+ * This can be passed following states
+ * <ol>
+ * <li>Enable NR dual connectivity {@link TelephonyManager#NR_DUAL_CONNECTIVITY_ENABLE}
+ * <li>Disable NR dual connectivity {@link TelephonyManager#NR_DUAL_CONNECTIVITY_DISABLE}
+ * <li>Disable NR dual connectivity and force secondary cell to be released
+ * {@link TelephonyManager#NR_DUAL_CONNECTIVITY_DISABLE_IMMEDIATE}
+ * </ol>
+ * @return operation result.
+ */
+ @Override
+ public int setNrDualConnectivityState(int subId,
+ @TelephonyManager.NrDualConnectivityState int nrDualConnectivityState) {
+ TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+ mApp, subId, "enableNRDualConnectivity");
+ WorkSource workSource = getWorkSource(Binder.getCallingUid());
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ int result = (int) sendRequest(CMD_ENABLE_NR_DUAL_CONNECTIVITY,
+ nrDualConnectivityState, subId,
+ workSource);
+ if (DBG) log("enableNRDualConnectivity result: " + result);
+ return result;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Is E-UTRA-NR Dual Connectivity enabled
+ * @return true if dual connectivity is enabled else false
+ */
+ @Override
+ public boolean isNrDualConnectivityEnabled(int subId) {
+ TelephonyPermissions
+ .enforeceCallingOrSelfReadPrivilegedPhoneStatePermissionOrCarrierPrivilege(
+ mApp, subId, "isNRDualConnectivityEnabled");
+ WorkSource workSource = getWorkSource(Binder.getCallingUid());
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ boolean isEnabled = (boolean) sendRequest(CMD_IS_NR_DUAL_CONNECTIVITY_ENABLED,
+ null, subId, workSource);
+ if (DBG) log("isNRDualConnectivityEnabled: " + isEnabled);
+ return isEnabled;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * get carrier bandwidth per primary and secondary carrier
+ * @param subId subscription id of the sim card
+ * @return CarrierBandwidth with bandwidth of both primary and secondary carrier..
+ */
+ @Override
+ public CarrierBandwidth getCarrierBandwidth(int subId) {
+ TelephonyPermissions
+ .enforeceCallingOrSelfReadPrivilegedPhoneStatePermissionOrCarrierPrivilege(
+ mApp, subId, "isNRDualConnectivityEnabled");
+ WorkSource workSource = getWorkSource(Binder.getCallingUid());
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ CarrierBandwidth carrierBandwidth =
+ getPhoneFromSubId(subId).getCarrierBandwidth();
+ if (DBG) log("getCarrierBandwidth: " + carrierBandwidth);
+ return carrierBandwidth;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
* Get the effective allowed network types on the device.
* This API will return an intersection of allowed network types for all reasons,
* including the configuration done through setAllowedNetworkTypes
@@ -5682,33 +6142,6 @@
}
/**
- * Set mobile data enabled
- * Used by the user through settings etc to turn on/off mobile data
- *
- * @param enable {@code true} turn turn data on, else {@code false}
- */
- @Override
- public void setUserDataEnabled(int subId, boolean enable) {
- TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
- mApp, subId, "setUserDataEnabled");
-
- final long identity = Binder.clearCallingIdentity();
- try {
- int phoneId = mSubscriptionController.getPhoneId(subId);
- if (DBG) log("setUserDataEnabled: subId=" + subId + " phoneId=" + phoneId);
- Phone phone = PhoneFactory.getPhone(phoneId);
- if (phone != null) {
- if (DBG) log("setUserDataEnabled: subId=" + subId + " enable=" + enable);
- phone.getDataEnabledSettings().setUserDataEnabled(enable);
- } else {
- loge("setUserDataEnabled: no phone found. Invalid subId=" + subId);
- }
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-
- /**
* Enable or disable always reporting signal strength changes from radio.
*
* @param isEnable {@code true} for enabling; {@code false} for disabling.
@@ -5798,7 +6231,18 @@
*/
@Override
public boolean isDataEnabled(int subId) {
- enforceReadPrivilegedPermission("isDataEnabled");
+ try {
+ try {
+ mApp.enforceCallingOrSelfPermission(
+ android.Manifest.permission.ACCESS_NETWORK_STATE,
+ null);
+ } catch (Exception e) {
+ mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE,
+ "isDataEnabled");
+ }
+ } catch (Exception e) {
+ enforceReadPrivilegedPermission("isDataEnabled");
+ }
final long identity = Binder.clearCallingIdentity();
try {
@@ -5818,6 +6262,53 @@
}
}
+ /**
+ * Check if data is enabled for a specific reason
+ * @param subId Subscription index
+ * @param reason the reason the data enable change is taking place
+ * @return {@code true} if the overall data is enabled; {@code false} if not.
+ */
+ @Override
+ public boolean isDataEnabledForReason(int subId,
+ @TelephonyManager.DataEnabledReason int reason) {
+ try {
+ mApp.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_NETWORK_STATE,
+ null);
+ } catch (Exception e) {
+ mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE,
+ "isDataEnabledForReason");
+ }
+
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ int phoneId = mSubscriptionController.getPhoneId(subId);
+ if (DBG) {
+ log("isDataEnabledForReason: subId=" + subId + " phoneId=" + phoneId
+ + " reason=" + reason);
+ }
+ Phone phone = PhoneFactory.getPhone(phoneId);
+ if (phone != null) {
+ boolean retVal;
+ if (reason == TelephonyManager.DATA_ENABLED_REASON_USER) {
+ retVal = phone.isUserDataEnabled();
+ } else {
+ retVal = phone.getDataEnabledSettings().isDataEnabledForReason(reason);
+ }
+ if (DBG) log("isDataEnabledForReason: retVal=" + retVal);
+ return retVal;
+ } else {
+ if (DBG) {
+ loge("isDataEnabledForReason: no phone subId="
+ + subId + " retVal=false");
+ }
+ return false;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
private int getCarrierPrivilegeStatusFromCarrierConfigRules(int privilegeFromSim, int uid,
Phone phone) {
if (uid == Process.SYSTEM_UID || uid == Process.PHONE_UID) {
@@ -5835,7 +6326,13 @@
final long identity = Binder.clearCallingIdentity();
try {
- SubscriptionInfo subInfo = subController.getSubscriptionInfo(phone.getSubId());
+ int subId = phone.getSubId();
+ if (mCarrierPrivilegeTestOverrideSubIds.contains(subId)) {
+ // A test override is in place for the privileges for this subId, so don't try to
+ // read the subscription privileges.
+ return privilegeFromSim;
+ }
+ SubscriptionInfo subInfo = subController.getSubscriptionInfo(subId);
SubscriptionManager subManager = (SubscriptionManager)
phone.getContext().getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
for (String pkg : packages) {
@@ -5858,7 +6355,13 @@
final long identity = Binder.clearCallingIdentity();
try {
- SubscriptionInfo subInfo = subController.getSubscriptionInfo(phone.getSubId());
+ int subId = phone.getSubId();
+ if (mCarrierPrivilegeTestOverrideSubIds.contains(subId)) {
+ // A test override is in place for the privileges for this subId, so don't try to
+ // read the subscription privileges.
+ return privilegeFromSim;
+ }
+ SubscriptionInfo subInfo = subController.getSubscriptionInfo(subId);
SubscriptionManager subManager = (SubscriptionManager)
phone.getContext().getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
return subManager.canManageSubscription(subInfo, pkgName)
@@ -6010,12 +6513,10 @@
final Phone phone = getPhone(subId);
UiccCard card = phone == null ? null : phone.getUiccCard();
if (card == null) {
- loge("getIccId: No UICC");
return null;
}
String iccId = card.getIccId();
if (TextUtils.isEmpty(iccId)) {
- loge("getIccId: ICC ID is null or empty.");
return null;
}
return iccId;
@@ -6564,6 +7065,8 @@
@Override
public @Nullable PhoneAccountHandle getPhoneAccountHandleForSubscriptionId(int subscriptionId) {
+ enforceReadPrivilegedPermission("getPhoneAccountHandleForSubscriptionId, "
+ + "subscriptionId: " + subscriptionId);
final long identity = Binder.clearCallingIdentity();
try {
Phone phone = getPhone(subscriptionId);
@@ -6640,7 +7143,8 @@
try {
if (SubscriptionManager.isUsableSubIdValue(subId) && !mUserManager.hasUserRestriction(
UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
- setUserDataEnabled(subId, getDefaultDataEnabled());
+ setDataEnabledForReason(subId, TelephonyManager.DATA_ENABLED_REASON_USER,
+ getDefaultDataEnabled());
setNetworkSelectionModeAutomatic(subId);
setPreferredNetworkType(subId, getDefaultNetworkType(subId));
setDataRoamingEnabled(subId, getDefaultDataRoamingEnabled(subId));
@@ -7167,31 +7671,6 @@
}
/**
- * Action set from carrier signalling broadcast receivers to enable/disable metered apns
- * @param subId the subscription ID that this action applies to.
- * @param enabled control enable or disable metered apns.
- * {@hide}
- */
- @Override
- public void carrierActionSetMeteredApnsEnabled(int subId, boolean enabled) {
- enforceModifyPermission();
- final Phone phone = getPhone(subId);
-
- final long identity = Binder.clearCallingIdentity();
- if (phone == null) {
- loge("carrierAction: SetMeteredApnsEnabled fails with invalid subId: " + subId);
- return;
- }
- try {
- phone.carrierActionSetMeteredApnsEnabled(enabled);
- } catch (Exception e) {
- Log.e(LOG_TAG, "carrierAction: SetMeteredApnsEnabled fails. Exception ex=" + e);
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-
- /**
* Action set from carrier signalling broadcast receivers to enable/disable radio
* @param subId the subscription ID that this action applies to.
* @param enabled control enable or disable radio.
@@ -7292,20 +7771,36 @@
}
/**
- * Policy control of data connection. Usually used when data limit is passed.
- * @param enabled True if enabling the data, otherwise disabling.
+ * Policy control of data connection with reason {@@TelephonyManager.DataEnabledReason}
* @param subId Subscription index
- * {@hide}
+ * @param reason the reason the data enable change is taking place
+ * @param enabled True if enabling the data, otherwise disabling.
+ * @hide
*/
@Override
- public void setPolicyDataEnabled(boolean enabled, int subId) {
- enforceModifyPermission();
+ public void setDataEnabledForReason(int subId, @TelephonyManager.DataEnabledReason int reason,
+ boolean enabled) {
+ if (reason == TelephonyManager.DATA_ENABLED_REASON_USER
+ || reason == TelephonyManager.DATA_ENABLED_REASON_CARRIER) {
+ try {
+ TelephonyPermissions.enforceCallingOrSelfCarrierPrivilege(
+ mApp, subId, "setDataEnabledForReason");
+ } catch (SecurityException se) {
+ enforceModifyPermission();
+ }
+ } else {
+ enforceModifyPermission();
+ }
final long identity = Binder.clearCallingIdentity();
try {
Phone phone = getPhone(subId);
if (phone != null) {
- phone.getDataEnabledSettings().setPolicyDataEnabled(enabled);
+ if (reason == TelephonyManager.DATA_ENABLED_REASON_CARRIER) {
+ phone.carrierActionSetMeteredApnsEnabled(enabled);
+ } else {
+ phone.getDataEnabledSettings().setDataEnabled(reason, enabled);
+ }
}
} finally {
Binder.restoreCallingIdentity(identity);
@@ -7363,7 +7858,37 @@
final long identity = Binder.clearCallingIdentity();
try {
if (phone != null) {
- phone.setSimPowerState(state, workSource);
+ phone.setSimPowerState(state, null, workSource);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Set SIM card power state.
+ *
+ * @param slotIndex SIM slot id.
+ * @param state State of SIM (power down, power up, pass through)
+ * @param callback callback to trigger after success or failure
+ * - {@link android.telephony.TelephonyManager#CARD_POWER_DOWN}
+ * - {@link android.telephony.TelephonyManager#CARD_POWER_UP}
+ * - {@link android.telephony.TelephonyManager#CARD_POWER_UP_PASS_THROUGH}
+ *
+ **/
+ @Override
+ public void setSimPowerStateForSlotWithCallback(int slotIndex, int state,
+ IIntegerConsumer callback) {
+ enforceModifyPermission();
+ Phone phone = PhoneFactory.getPhone(slotIndex);
+
+ WorkSource workSource = getWorkSource(Binder.getCallingUid());
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (phone != null) {
+ Pair<Integer, IIntegerConsumer> arguments = Pair.create(state, callback);
+ sendRequestAsync(CMD_SET_SIM_POWER, arguments, phone, workSource);
}
} finally {
Binder.restoreCallingIdentity(identity);
@@ -7468,17 +7993,19 @@
*/
@Override
public boolean isDataRoamingEnabled(int subId) {
- mApp.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_NETWORK_STATE,
- null /* message */);
+ try {
+ mApp.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_NETWORK_STATE,
+ null);
+ } catch (Exception e) {
+ TelephonyPermissions.enforeceCallingOrSelfReadPhoneStatePermissionOrCarrierPrivilege(
+ mApp, subId, "isDataRoamingEnabled");
+ }
boolean isEnabled = false;
final long identity = Binder.clearCallingIdentity();
try {
Phone phone = getPhone(subId);
isEnabled = phone != null ? phone.getDataRoamingEnabled() : false;
- } catch (Exception e) {
- TelephonyPermissions.enforeceCallingOrSelfReadPhoneStatePermissionOrCarrierPrivilege(
- mApp, subId, "isDataRoamingEnabled");
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -7754,6 +8281,11 @@
}
phone.setCarrierTestOverride(mccmnc, imsi, iccid, gid1, gid2, plmn, spn,
carrierPrivilegeRules, apn);
+ if (carrierPrivilegeRules == null) {
+ mCarrierPrivilegeTestOverrideSubIds.remove(subId);
+ } else {
+ mCarrierPrivilegeTestOverrideSubIds.add(subId);
+ }
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -7821,6 +8353,20 @@
}
@Override
+ public int getCdmaSubscriptionMode(int subId) {
+ TelephonyPermissions
+ .enforeceCallingOrSelfReadPrivilegedPhoneStatePermissionOrCarrierPrivilege(
+ mApp, subId, "getCdmaSubscriptionMode");
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return (int) sendRequest(CMD_GET_CDMA_SUBSCRIPTION_MODE, null /* argument */, subId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
public boolean setCdmaSubscriptionMode(int subId, int mode) {
TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
mApp, subId, "setCdmaSubscriptionMode");
@@ -7870,11 +8416,9 @@
try {
for (Phone phone: PhoneFactory.getPhones()) {
if (phone.getEmergencyNumberTracker() != null
- && phone.getEmergencyNumberTracker() != null) {
- if (phone.getEmergencyNumberTracker().isEmergencyNumber(
- number, exactMatch)) {
- return true;
- }
+ && phone.getEmergencyNumberTracker()
+ .isEmergencyNumber(number, exactMatch)) {
+ return true;
}
}
return false;
@@ -8255,7 +8799,7 @@
* 1) user data is turned on, or
* 2) APN is un-metered for this subscription, or
* 3) APN type is whitelisted. E.g. MMS is whitelisted if
- * {@link TelephonyManager#setAlwaysAllowMmsData} is turned on.
+ * {@link TelephonyManager#MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED} is enabled.
*
* @return whether data is allowed for a apn type.
*
@@ -8329,6 +8873,24 @@
}
@Override
+ public List<RadioAccessSpecifier> getSystemSelectionChannels(int subId) {
+ TelephonyPermissions
+ .enforeceCallingOrSelfReadPrivilegedPhoneStatePermissionOrCarrierPrivilege(
+ mApp, subId, "getSystemSelectionChannels");
+ WorkSource workSource = getWorkSource(Binder.getCallingUid());
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ List<RadioAccessSpecifier> specifiers =
+ (List<RadioAccessSpecifier>) sendRequest(CMD_GET_SYSTEM_SELECTION_CHANNELS,
+ null, subId, workSource);
+ if (DBG) log("getSystemSelectionChannels: " + specifiers);
+ return specifiers;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
public boolean isMvnoMatched(int subId, int mvnoType, @NonNull String mvnoMatchData) {
enforceReadPrivilegedPermission("isMvnoMatched");
IccRecords iccRecords = UiccController.getInstance().getIccRecords(
@@ -8367,6 +8929,11 @@
//TODO investigate if this API should require proper permission check in R b/133791609
final long identity = Binder.clearCallingIdentity();
try {
+ String carrierUAProfUrl = mApp.getCarrierConfigForSubId(subId).getString(
+ CarrierConfigManager.KEY_MMS_UA_PROF_URL_STRING);
+ if (!TextUtils.isEmpty(carrierUAProfUrl)) {
+ return carrierUAProfUrl;
+ }
return SubscriptionManager.getResourcesForSubId(getDefaultPhone().getContext(), subId)
.getString(com.android.internal.R.string.config_mms_user_agent_profile_url);
} finally {
@@ -8379,6 +8946,11 @@
//TODO investigate if this API should require proper permission check in R b/133791609
final long identity = Binder.clearCallingIdentity();
try {
+ String carrierUserAgent = mApp.getCarrierConfigForSubId(subId).getString(
+ CarrierConfigManager.KEY_MMS_USER_AGENT_STRING);
+ if (!TextUtils.isEmpty(carrierUserAgent)) {
+ return carrierUserAgent;
+ }
return SubscriptionManager.getResourcesForSubId(getDefaultPhone().getContext(), subId)
.getString(com.android.internal.R.string.config_mms_user_agent);
} finally {
@@ -8387,55 +8959,54 @@
}
@Override
- public boolean setDataAllowedDuringVoiceCall(int subId, boolean allow) {
- enforceModifyPermission();
+ public boolean isMobileDataPolicyEnabled(int subscriptionId, int policy) {
+ enforceReadPrivilegedPermission("isMobileDataPolicyEnabled");
- // Now that all security checks passes, perform the operation as ourselves.
final long identity = Binder.clearCallingIdentity();
try {
- Phone phone = getPhone(subId);
+ Phone phone = getPhone(subscriptionId);
if (phone == null) return false;
- return phone.getDataEnabledSettings().setAllowDataDuringVoiceCall(allow);
+ switch (policy) {
+ case TelephonyManager.MOBILE_DATA_POLICY_DATA_ON_NON_DEFAULT_DURING_VOICE_CALL:
+ return phone.getDataEnabledSettings().isDataAllowedInVoiceCall();
+ case TelephonyManager.MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED:
+ return phone.getDataEnabledSettings().isMmsAlwaysAllowed();
+ default:
+ throw new IllegalArgumentException(policy + " is not a valid policy");
+ }
} finally {
Binder.restoreCallingIdentity(identity);
}
}
@Override
- public boolean isDataAllowedInVoiceCall(int subId) {
- enforceReadPrivilegedPermission("isDataAllowedInVoiceCall");
-
- // Now that all security checks passes, perform the operation as ourselves.
- final long identity = Binder.clearCallingIdentity();
- try {
- Phone phone = getPhone(subId);
- if (phone == null) return false;
-
- return phone.getDataEnabledSettings().isDataAllowedInVoiceCall();
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-
- @Override
- public boolean setAlwaysAllowMmsData(int subId, boolean alwaysAllow) {
+ public void setMobileDataPolicyEnabledStatus(int subscriptionId, int policy,
+ boolean enabled) {
enforceModifyPermission();
- // Now that all security checks passes, perform the operation as ourselves.
final long identity = Binder.clearCallingIdentity();
try {
- Phone phone = getPhone(subId);
- if (phone == null) return false;
+ Phone phone = getPhone(subscriptionId);
+ if (phone == null) return;
- return phone.getDataEnabledSettings().setAlwaysAllowMmsData(alwaysAllow);
+ switch (policy) {
+ case TelephonyManager.MOBILE_DATA_POLICY_DATA_ON_NON_DEFAULT_DURING_VOICE_CALL:
+ phone.getDataEnabledSettings().setAllowDataDuringVoiceCall(enabled);
+ break;
+ case TelephonyManager.MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED:
+ phone.getDataEnabledSettings().setAlwaysAllowMmsData(enabled);
+ break;
+ default:
+ throw new IllegalArgumentException(policy + " is not a valid policy");
+ }
} finally {
Binder.restoreCallingIdentity(identity);
}
}
/**
- * Updates whether conference event pacakge handling is enabled.
+ * Updates whether conference event package handling is enabled.
* @param isCepEnabled {@code true} if CEP handling is enabled (default), or {@code false}
* otherwise.
*/
@@ -8612,4 +9183,300 @@
public boolean canConnectTo5GInDsdsMode() {
return mApp.getResources().getBoolean(R.bool.config_5g_connection_in_dsds_mode);
}
+
+ @Override
+ public @NonNull List<String> getEquivalentHomePlmns(int subId, String callingPackage,
+ String callingFeatureId) {
+ if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+ mApp, subId, callingPackage, callingFeatureId, "getEquivalentHomePlmns")) {
+ throw new SecurityException("Requires READ_PHONE_STATE permission.");
+ }
+
+ Phone phone = getPhone(subId);
+ if (phone == null) {
+ throw new RuntimeException("phone is not available");
+ }
+ // Now that all security checks passes, perform the operation as ourselves.
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return phone.getEquivalentHomePlmns();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void bootstrapAuthenticationRequest(int subId, int appType, Uri nafUrl,
+ UaSecurityProtocolIdentifier securityProtocol,
+ boolean forceBootStrapping, IBootstrapAuthenticationCallback callback)
+ throws RemoteException {
+ enforceModifyPermission();
+ if (DBG) {
+ log("bootstrapAuthenticationRequest, subId:" + subId + ", appType:"
+ + appType + ", NAF:" + nafUrl + ", sp:" + securityProtocol
+ + ", forceBootStrapping:" + forceBootStrapping + ", callback:" + callback);
+ }
+
+ if (!SubscriptionManager.isValidSubscriptionId(subId)
+ || appType < TelephonyManager.APPTYPE_UNKNOWN
+ || appType > TelephonyManager.APPTYPE_ISIM
+ || nafUrl == null || securityProtocol == null || callback == null) {
+ Log.d(LOG_TAG, "bootstrapAuthenticationRequest failed due to invalid parameters");
+ if (callback != null) {
+ try {
+ callback.onAuthenticationFailure(
+ 0, TelephonyManager.GBA_FAILURE_REASON_FEATURE_NOT_SUPPORTED);
+ } catch (RemoteException exception) {
+ log("Fail to notify onAuthenticationFailure due to " + exception);
+ }
+ return;
+ }
+ }
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ getGbaManager(subId).bootstrapAuthenticationRequest(
+ new GbaAuthRequest(subId, appType, nafUrl, securityProtocol.toByteArray(),
+ forceBootStrapping, callback));
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ /**
+ * Attempts to set the radio power state for thermal reason. This does not guarantee that the
+ * requested radio power state will actually be set. See {@link
+ * PhoneInternalInterface#setRadioPowerForReason} for more details.
+ *
+ * @param subId the subscription ID of the phone requesting to set the radio power state.
+ * @param enable {@code true} if trying to turn radio on.
+ * @return {@code true} if phone setRadioPowerForReason was called. Otherwise, returns {@code
+ * false}.
+ */
+ private boolean setRadioPowerForThermal(int subId, boolean enable) {
+ Phone phone = getPhone(subId);
+ if (phone != null) {
+ phone.setRadioPowerForReason(enable, Phone.RADIO_POWER_REASON_THERMAL);
+ return true;
+ }
+ return false;
+ }
+
+ private int handleDataThrottlingRequest(int subId,
+ DataThrottlingRequest dataThrottlingRequest) {
+ // Ensure that radio is on. If not able to power on due to phone being unavailable, return
+ // THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE.
+ if (!setRadioPowerForThermal(subId, true)) {
+ return TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE;
+ }
+
+ setDataEnabledForReason(subId, TelephonyManager.DATA_ENABLED_REASON_THERMAL, true);
+
+ int thermalMitigationResult =
+ (int) sendRequest(CMD_SET_DATA_THROTTLING, dataThrottlingRequest, subId);
+ if (thermalMitigationResult == SET_DATA_THROTTLING_MODEM_THREW_INVALID_PARAMS) {
+ throw new IllegalArgumentException("modem returned INVALID_ARGUMENTS");
+ }
+ return thermalMitigationResult;
+ }
+
+ /**
+ * Thermal mitigation request to control functionalities at modem.
+ *
+ * @param subId the id of the subscription.
+ * @param thermalMitigationRequest holds all necessary information to be passed down to modem.
+ *
+ * @return thermalMitigationResult enum as defined in android.telephony.Annotation.
+ */
+ @Override
+ @ThermalMitigationResult
+ public int sendThermalMitigationRequest(
+ int subId,
+ ThermalMitigationRequest thermalMitigationRequest) throws IllegalArgumentException {
+ enforceModifyPermission();
+
+ WorkSource workSource = getWorkSource(Binder.getCallingUid());
+ final long identity = Binder.clearCallingIdentity();
+
+ int thermalMitigationResult = TelephonyManager.THERMAL_MITIGATION_RESULT_UNKNOWN_ERROR;
+ try {
+ int thermalMitigationAction = thermalMitigationRequest.getThermalMitigationAction();
+ switch (thermalMitigationAction) {
+ case ThermalMitigationRequest.THERMAL_MITIGATION_ACTION_DATA_THROTTLING:
+ thermalMitigationResult =
+ handleDataThrottlingRequest(subId,
+ thermalMitigationRequest.getDataThrottlingRequest());
+ break;
+ case ThermalMitigationRequest.THERMAL_MITIGATION_ACTION_VOICE_ONLY:
+ if (thermalMitigationRequest.getDataThrottlingRequest() != null) {
+ throw new IllegalArgumentException("dataThrottlingRequest must be null for "
+ + "ThermalMitigationRequest.THERMAL_MITIGATION_ACTION_VOICE_ONLY");
+ }
+
+ // Ensure that radio is on. If not able to power on due to phone being
+ // unavailable, return THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE.
+ if (!setRadioPowerForThermal(subId, true)) {
+ thermalMitigationResult =
+ TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE;
+ break;
+ }
+
+ setDataEnabledForReason(subId, TelephonyManager.DATA_ENABLED_REASON_THERMAL,
+ false);
+ thermalMitigationResult = TelephonyManager.THERMAL_MITIGATION_RESULT_SUCCESS;
+ break;
+ case ThermalMitigationRequest.THERMAL_MITIGATION_ACTION_RADIO_OFF:
+ if (thermalMitigationRequest.getDataThrottlingRequest() != null) {
+ throw new IllegalArgumentException("dataThrottlingRequest must be null for"
+ + " ThermalMitigationRequest.THERMAL_MITIGATION_ACTION_RADIO_OFF");
+ }
+
+ TelecomAccountRegistry registry = TelecomAccountRegistry.getInstance(null);
+ if (registry != null) {
+ TelephonyConnectionService service =
+ registry.getTelephonyConnectionService();
+ Phone phone = getPhone(subId);
+ if (phone == null) {
+ thermalMitigationResult =
+ TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE;
+ break;
+ }
+
+ if (PhoneConstantConversions.convertCallState(phone.getState())
+ != TelephonyManager.CALL_STATE_IDLE
+ || phone.isInEmergencySmsMode() || phone.isInEcm()
+ || (service != null && service.isEmergencyCallPending())) {
+ String errorMessage = "Phone state is not valid. call state = "
+ + PhoneConstantConversions.convertCallState(phone.getState())
+ + " isInEmergencySmsMode = " + phone.isInEmergencySmsMode()
+ + " isInEmergencyCallbackMode = " + phone.isInEcm();
+ errorMessage += service == null
+ ? " TelephonyConnectionService is null"
+ : " isEmergencyCallPending = "
+ + service.isEmergencyCallPending();
+ Log.e(LOG_TAG, errorMessage);
+ thermalMitigationResult =
+ TelephonyManager.THERMAL_MITIGATION_RESULT_INVALID_STATE;
+ break;
+ }
+ } else {
+ thermalMitigationResult =
+ TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE;
+ break;
+ }
+
+ // Turn radio off. If not able to power off due to phone being unavailable,
+ // return THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE.
+ if (!setRadioPowerForThermal(subId, false)) {
+ thermalMitigationResult =
+ TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE;
+ break;
+ }
+ thermalMitigationResult =
+ TelephonyManager.THERMAL_MITIGATION_RESULT_SUCCESS;
+ break;
+ default:
+ throw new IllegalArgumentException("the requested thermalMitigationAction does "
+ + "not exist. Requested action: " + thermalMitigationAction);
+ }
+ } catch (IllegalArgumentException e) {
+ throw e;
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "thermalMitigationRequest. Exception e =" + e);
+ thermalMitigationResult = TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_ERROR;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+
+ if (DBG) {
+ log("thermalMitigationRequest returning with thermalMitigationResult: "
+ + thermalMitigationResult);
+ }
+
+ return thermalMitigationResult;
+ }
+
+ /**
+ * Set the GbaService Package Name that Telephony will bind to.
+ *
+ * @param subId The sim that the GbaService is associated with.
+ * @param packageName The name of the package to be replaced with.
+ * @return true if setting the GbaService to bind to succeeded, false if it did not.
+ */
+ @Override
+ public boolean setBoundGbaServiceOverride(int subId, String packageName) {
+ enforceModifyPermission();
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return getGbaManager(subId).overrideServicePackage(packageName);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Return the package name of the currently bound GbaService.
+ *
+ * @param subId The sim that the GbaService is associated with.
+ * @return the package name of the GbaService configuration, null if GBA is not supported.
+ */
+ @Override
+ public String getBoundGbaService(int subId) {
+ enforceReadPrivilegedPermission("getBoundGbaServicePackage");
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return getGbaManager(subId).getServicePackage();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Set the release time for telephony to unbind GbaService.
+ *
+ * @param subId The sim that the GbaService is associated with.
+ * @param interval The release time to unbind GbaService by millisecond.
+ * @return true if setting the GbaService to bind to succeeded, false if it did not.
+ */
+ @Override
+ public boolean setGbaReleaseTimeOverride(int subId, int interval) {
+ enforceModifyPermission();
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return getGbaManager(subId).overrideReleaseTime(interval);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Return the release time for telephony to unbind GbaService.
+ *
+ * @param subId The sim that the GbaService is associated with.
+ * @return The release time to unbind GbaService by millisecond.
+ */
+ @Override
+ public int getGbaReleaseTime(int subId) {
+ enforceReadPrivilegedPermission("getGbaReleaseTime");
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return getGbaManager(subId).getReleaseTime();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ private GbaManager getGbaManager(int subId) {
+ GbaManager instance = GbaManager.getInstance(subId);
+ if (instance == null) {
+ String packageName = mApp.getResources().getString(R.string.config_gba_package);
+ int releaseTime = mApp.getResources().getInteger(R.integer.config_gba_release_time);
+ instance = GbaManager.make(mApp, subId, packageName, releaseTime);
+ }
+ return instance;
+ }
}
diff --git a/src/com/android/phone/TelephonyShellCommand.java b/src/com/android/phone/TelephonyShellCommand.java
index d24b4e3..8d67092 100644
--- a/src/com/android/phone/TelephonyShellCommand.java
+++ b/src/com/android/phone/TelephonyShellCommand.java
@@ -17,7 +17,6 @@
package com.android.phone;
import android.content.Context;
-import android.os.BasicShellCommandHandler;
import android.os.Binder;
import android.os.PersistableBundle;
import android.os.Process;
@@ -34,6 +33,7 @@
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.emergency.EmergencyNumberTracker;
import com.android.internal.telephony.util.TelephonyUtils;
+import com.android.modules.utils.BasicShellCommandHandler;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -64,8 +64,9 @@
private static final String DATA_ENABLE = "enable";
private static final String DATA_DISABLE = "disable";
- private static final String IMS_SET_CARRIER_SERVICE = "set-ims-service";
- private static final String IMS_GET_CARRIER_SERVICE = "get-ims-service";
+ private static final String IMS_SET_IMS_SERVICE = "set-ims-service";
+ private static final String IMS_GET_IMS_SERVICE = "get-ims-service";
+ private static final String IMS_CLEAR_SERVICE_OVERRIDE = "clear-ims-service-override";
private static final String IMS_ENABLE = "enable";
private static final String IMS_DISABLE = "disable";
// Used to disable or enable processing of conference event package data from the network.
@@ -80,6 +81,12 @@
private static final String CC_SET_VALUE = "set-value";
private static final String CC_CLEAR_VALUES = "clear-values";
+ private static final String GBA_SUBCOMMAND = "gba";
+ private static final String GBA_SET_SERVICE = "set-service";
+ private static final String GBA_GET_SERVICE = "get-service";
+ private static final String GBA_SET_RELEASE_TIME = "set-release";
+ private static final String GBA_GET_RELEASE_TIME = "get-release";
+
// Take advantage of existing methods that already contain permissions checks when possible.
private final ITelephony mInterface;
@@ -160,6 +167,8 @@
return handleDataTestModeCommand();
case END_BLOCK_SUPPRESSION:
return handleEndBlockSuppressionCommand();
+ case GBA_SUBCOMMAND:
+ return handleGbaCommand();
default: {
return handleDefaultCommands(cmd);
}
@@ -182,11 +191,14 @@
pw.println(" Data Test Mode Commands.");
pw.println(" cc");
pw.println(" Carrier Config Commands.");
+ pw.println(" gba");
+ pw.println(" GBA Commands.");
onHelpIms();
onHelpEmergencyNumber();
onHelpEndBlockSupperssion();
onHelpDataTestMode();
onHelpCc();
+ onHelpGba();
}
private void onHelpIms() {
@@ -207,9 +219,14 @@
pw.println(" -s: The SIM slot ID for the registered ImsService. If no option");
pw.println(" is specified, it will choose the default voice SIM slot.");
pw.println(" -c: The ImsService defined as the carrier configured ImsService.");
- pw.println(" -c: The ImsService defined as the device default ImsService.");
+ pw.println(" -d: The ImsService defined as the device default ImsService.");
pw.println(" -f: The feature type that the query will be requested for. If none is");
pw.println(" specified, the returned package name will correspond to MMTEL.");
+ pw.println(" ims clear-ims-service-override [-s SLOT_ID]");
+ pw.println(" Clear all carrier ImsService overrides. This does not work for device ");
+ pw.println(" configuration overrides. Options are:");
+ pw.println(" -s: The SIM slot ID for the registered ImsService. If no option");
+ pw.println(" is specified, it will choose the default voice SIM slot.");
pw.println(" ims enable [-s SLOT_ID]");
pw.println(" enables IMS for the SIM slot specified, or for the default voice SIM slot");
pw.println(" if none is specified.");
@@ -287,6 +304,32 @@
pw.println(" is specified, it will choose the default voice SIM slot.");
}
+ private void onHelpGba() {
+ PrintWriter pw = getOutPrintWriter();
+ pw.println("Gba Commands:");
+ pw.println(" gba set-service [-s SLOT_ID] PACKAGE_NAME");
+ pw.println(" Sets the GbaService defined in PACKAGE_NAME to to be the bound.");
+ pw.println(" Options are:");
+ pw.println(" -s: The SIM slot ID to read carrier config value for. If no option");
+ pw.println(" is specified, it will choose the default voice SIM slot.");
+ pw.println(" gba get-service [-s SLOT_ID]");
+ pw.println(" Gets the package name of the currently defined GbaService.");
+ pw.println(" Options are:");
+ pw.println(" -s: The SIM slot ID to read carrier config value for. If no option");
+ pw.println(" is specified, it will choose the default voice SIM slot.");
+ pw.println(" gba set-release [-s SLOT_ID] n");
+ pw.println(" Sets the time to release/unbind GbaService in n milli-second.");
+ pw.println(" Do not release/unbind if n is -1.");
+ pw.println(" Options are:");
+ pw.println(" -s: The SIM slot ID to read carrier config value for. If no option");
+ pw.println(" is specified, it will choose the default voice SIM slot.");
+ pw.println(" gba get-release [-s SLOT_ID]");
+ pw.println(" Gets the time to release/unbind GbaService in n milli-sencond.");
+ pw.println(" Options are:");
+ pw.println(" -s: The SIM slot ID to read carrier config value for. If no option");
+ pw.println(" is specified, it will choose the default voice SIM slot.");
+ }
+
private int handleImsCommand() {
String arg = getNextArg();
if (arg == null) {
@@ -295,12 +338,15 @@
}
switch (arg) {
- case IMS_SET_CARRIER_SERVICE: {
+ case IMS_SET_IMS_SERVICE: {
return handleImsSetServiceCommand();
}
- case IMS_GET_CARRIER_SERVICE: {
+ case IMS_GET_IMS_SERVICE: {
return handleImsGetServiceCommand();
}
+ case IMS_CLEAR_SERVICE_OVERRIDE: {
+ return handleImsClearCarrierServiceCommand();
+ }
case IMS_ENABLE: {
return handleEnableIms();
}
@@ -547,6 +593,42 @@
return 0;
}
+ // ims clear-ims-service-override
+ private int handleImsClearCarrierServiceCommand() {
+ PrintWriter errPw = getErrPrintWriter();
+ int slotId = getDefaultSlot();
+
+ String opt;
+ while ((opt = getNextOption()) != null) {
+ switch (opt) {
+ case "-s": {
+ try {
+ slotId = Integer.parseInt(getNextArgRequired());
+ } catch (NumberFormatException e) {
+ errPw.println("ims set-ims-service requires an integer as a SLOT_ID.");
+ return -1;
+ }
+ break;
+ }
+ }
+ }
+
+ try {
+ boolean result = mInterface.clearCarrierImsServiceOverride(slotId);
+ if (VDBG) {
+ Log.v(LOG_TAG, "ims clear-ims-service-override -s " + slotId
+ + ", result=" + result);
+ }
+ getOutPrintWriter().println(result);
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, "ims clear-ims-service-override -s " + slotId
+ + ", error" + e.getMessage());
+ errPw.println("Exception: " + e.getMessage());
+ return -1;
+ }
+ return 0;
+ }
+
// ims get-ims-service
private int handleImsGetServiceCommand() {
PrintWriter errPw = getErrPrintWriter();
@@ -1201,4 +1283,139 @@
}
return 0;
}
+
+ private int handleGbaCommand() {
+ String arg = getNextArg();
+ if (arg == null) {
+ onHelpGba();
+ return 0;
+ }
+
+ switch (arg) {
+ case GBA_SET_SERVICE: {
+ return handleGbaSetServiceCommand();
+ }
+ case GBA_GET_SERVICE: {
+ return handleGbaGetServiceCommand();
+ }
+ case GBA_SET_RELEASE_TIME: {
+ return handleGbaSetReleaseCommand();
+ }
+ case GBA_GET_RELEASE_TIME: {
+ return handleGbaGetReleaseCommand();
+ }
+ }
+
+ return -1;
+ }
+
+ private int getSubId(String cmd) {
+ int slotId = getDefaultSlot();
+ String opt = getNextOption();
+ if (opt != null && opt.equals("-s")) {
+ try {
+ slotId = Integer.parseInt(getNextArgRequired());
+ } catch (NumberFormatException e) {
+ getErrPrintWriter().println(cmd + " requires an integer as a SLOT_ID.");
+ return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+ }
+ }
+ int[] subIds = SubscriptionManager.getSubId(slotId);
+ return subIds[0];
+ }
+
+ private int handleGbaSetServiceCommand() {
+ int subId = getSubId("gba set-service");
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return -1;
+ }
+
+ String packageName = getNextArg();
+ try {
+ if (packageName == null) {
+ packageName = "";
+ }
+ boolean result = mInterface.setBoundGbaServiceOverride(subId, packageName);
+ if (VDBG) {
+ Log.v(LOG_TAG, "gba set-service -s " + subId + " "
+ + packageName + ", result=" + result);
+ }
+ getOutPrintWriter().println(result);
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, "gba set-service " + subId + " "
+ + packageName + ", error" + e.getMessage());
+ getErrPrintWriter().println("Exception: " + e.getMessage());
+ return -1;
+ }
+ return 0;
+ }
+
+ private int handleGbaGetServiceCommand() {
+ String result;
+
+ int subId = getSubId("gba get-service");
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return -1;
+ }
+
+ try {
+ result = mInterface.getBoundGbaService(subId);
+ } catch (RemoteException e) {
+ return -1;
+ }
+ if (VDBG) {
+ Log.v(LOG_TAG, "gba get-service -s " + subId + ", returned: " + result);
+ }
+ getOutPrintWriter().println(result);
+ return 0;
+ }
+
+ private int handleGbaSetReleaseCommand() {
+ //the release time value could be -1
+ int subId = getRemainingArgsCount() > 1 ? getSubId("gba set-release")
+ : SubscriptionManager.getDefaultSubscriptionId();
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return -1;
+ }
+
+ String intervalStr = getNextArg();
+ if (intervalStr == null) {
+ return -1;
+ }
+
+ try {
+ int interval = Integer.parseInt(intervalStr);
+ boolean result = mInterface.setGbaReleaseTimeOverride(subId, interval);
+ if (VDBG) {
+ Log.v(LOG_TAG, "gba set-release -s " + subId + " "
+ + intervalStr + ", result=" + result);
+ }
+ getOutPrintWriter().println(result);
+ } catch (NumberFormatException | RemoteException e) {
+ Log.w(LOG_TAG, "gba set-release -s " + subId + " "
+ + intervalStr + ", error" + e.getMessage());
+ getErrPrintWriter().println("Exception: " + e.getMessage());
+ return -1;
+ }
+ return 0;
+ }
+
+ private int handleGbaGetReleaseCommand() {
+ int subId = getSubId("gba get-release");
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return -1;
+ }
+
+ int result = 0;
+ try {
+ result = mInterface.getGbaReleaseTime(subId);
+ } catch (RemoteException e) {
+ return -1;
+ }
+ if (VDBG) {
+ Log.v(LOG_TAG, "gba get-release -s " + subId + ", returned: " + result);
+ }
+ getOutPrintWriter().println(result);
+ return 0;
+ }
}
diff --git a/src/com/android/phone/TimeConsumingPreferenceActivity.java b/src/com/android/phone/TimeConsumingPreferenceActivity.java
index 3b5fe21..8c5ae6d 100644
--- a/src/com/android/phone/TimeConsumingPreferenceActivity.java
+++ b/src/com/android/phone/TimeConsumingPreferenceActivity.java
@@ -187,11 +187,6 @@
@Override
public void onError(Preference preference, int error) {
if (DBG) dumpState();
- if (!preference.isEnabled()) {
- Log.i(LOG_TAG, "onError, skipped duplicated error popup");
- return;
- }
-
Log.i(LOG_TAG, "onError, preference=" + preference.getKey() + ", error=" + error);
if (mIsForeground) {
diff --git a/src/com/android/phone/settings/RadioInfo.java b/src/com/android/phone/settings/RadioInfo.java
index 568adb8..b774ac6 100644
--- a/src/com/android/phone/settings/RadioInfo.java
+++ b/src/com/android/phone/settings/RadioInfo.java
@@ -38,6 +38,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import android.os.PersistableBundle;
import android.os.SystemProperties;
import android.provider.Settings;
import android.telephony.AccessNetworkConstants;
@@ -51,7 +52,6 @@
import android.telephony.CellInfoGsm;
import android.telephony.CellInfoLte;
import android.telephony.CellInfoWcdma;
-import android.telephony.CellLocation;
import android.telephony.CellSignalStrengthCdma;
import android.telephony.CellSignalStrengthGsm;
import android.telephony.CellSignalStrengthLte;
@@ -65,8 +65,6 @@
import android.telephony.SignalStrength;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
-import android.telephony.cdma.CdmaCellLocation;
-import android.telephony.gsm.GsmCellLocation;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
@@ -231,7 +229,6 @@
private TextView mDBm;
private TextView mMwi;
private TextView mCfi;
- private TextView mLocation;
private TextView mCellInfo;
private TextView mSent;
private TextView mReceived;
@@ -283,7 +280,6 @@
private boolean mCfiValue = false;
private List<CellInfo> mCellInfoResult = null;
- private CellLocation mCellLocationResult = null;
private int mPreferredNetworkTypeResult;
private int mCellInfoRefreshRateIndex;
@@ -328,11 +324,6 @@
}
@Override
- public void onCellLocationChanged(CellLocation location) {
- updateLocation(location);
- }
-
- @Override
public void onMessageWaitingIndicatorChanged(boolean mwi) {
mMwiValue = mwi;
updateMessageWaiting();
@@ -474,12 +465,12 @@
mQueuedWork = new ThreadPoolExecutor(1, 1, RUNNABLE_TIMEOUT_MS, TimeUnit.MICROSECONDS,
new LinkedBlockingDeque<Runnable>());
- mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
mConnectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
mPhone = PhoneFactory.getDefaultPhone();
+ mTelephonyManager = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
+ .createForSubscriptionId(mPhone.getSubId());
- mImsManager = ImsManager.getInstance(getApplicationContext(),
- SubscriptionManager.getDefaultVoicePhoneId());
+ mImsManager = ImsManager.getInstance(getApplicationContext(), mPhone.getPhoneId());
sPhoneIndexLabels = getPhoneIndexLabels(mTelephonyManager);
@@ -498,7 +489,6 @@
mDBm = (TextView) findViewById(R.id.dbm);
mMwi = (TextView) findViewById(R.id.mwi);
mCfi = (TextView) findViewById(R.id.cfi);
- mLocation = (TextView) findViewById(R.id.location);
mCellInfo = (TextView) findViewById(R.id.cellinfo);
mCellInfo.setTypeface(Typeface.MONOSPACE);
@@ -654,7 +644,6 @@
updateNetworkType();
updateNrStats(null);
- updateLocation(mCellLocationResult);
updateCellInfo(mCellInfoResult);
updateSubscriptionIds();
@@ -814,7 +803,6 @@
mSent.setText("");
mReceived.setText("");
mCallState.setText("");
- mLocation.setText("");
mMwiValue = false;
mMwi.setText("");
mCfiValue = false;
@@ -872,45 +860,6 @@
+ r.getString(R.string.radioInfo_display_asu));
}
- private void updateLocation(CellLocation location) {
- Resources r = getResources();
- if (location instanceof GsmCellLocation) {
- GsmCellLocation loc = (GsmCellLocation) location;
- int lac = loc.getLac();
- int cid = loc.getCid();
- mLocation.setText(r.getString(R.string.radioInfo_lac) + " = "
- + ((lac == -1) ? "unknown" : Integer.toHexString(lac))
- + " "
- + r.getString(R.string.radioInfo_cid) + " = "
- + ((cid == -1) ? "unknown" : Integer.toHexString(cid)));
- } else if (location instanceof CdmaCellLocation) {
- CdmaCellLocation loc = (CdmaCellLocation) location;
- int bid = loc.getBaseStationId();
- int sid = loc.getSystemId();
- int nid = loc.getNetworkId();
- int lat = loc.getBaseStationLatitude();
- int lon = loc.getBaseStationLongitude();
- mLocation.setText("BID = "
- + ((bid == -1) ? "unknown" : Integer.toHexString(bid))
- + " "
- + "SID = "
- + ((sid == -1) ? "unknown" : Integer.toHexString(sid))
- + " "
- + "NID = "
- + ((nid == -1) ? "unknown" : Integer.toHexString(nid))
- + "\n"
- + "LAT = "
- + ((lat == -1) ? "unknown" : Integer.toHexString(lat))
- + " "
- + "LONG = "
- + ((lon == -1) ? "unknown" : Integer.toHexString(lon)));
- } else {
- mLocation.setText("unknown");
- }
-
-
- }
-
private String getCellInfoDisplayString(int i) {
return (i != Integer.MAX_VALUE) ? Integer.toString(i) : "";
}
@@ -1286,11 +1235,9 @@
private void updateAllCellInfo() {
mCellInfo.setText("");
- mLocation.setText("");
final Runnable updateAllCellInfoResults = new Runnable() {
public void run() {
- updateLocation(mCellLocationResult);
updateCellInfo(mCellInfoResult);
}
};
@@ -1299,7 +1246,6 @@
@Override
public void run() {
mCellInfoResult = mTelephonyManager.getAllCellInfo();
- mCellLocationResult = mTelephonyManager.getCellLocation();
mHandler.post(updateAllCellInfoResults);
}
@@ -1520,9 +1466,9 @@
};
private boolean isImsVolteProvisioned() {
- if (mPhone != null && mImsManager != null) {
- return mImsManager.isVolteEnabledByPlatform(mPhone.getContext())
- && mImsManager.isVolteProvisionedOnDevice(mPhone.getContext());
+ if (mImsManager != null) {
+ return mImsManager.isVolteEnabledByPlatform()
+ && mImsManager.isVolteProvisionedOnDevice();
}
return false;
}
@@ -1535,9 +1481,9 @@
};
private boolean isImsVtProvisioned() {
- if (mPhone != null && mImsManager != null) {
- return mImsManager.isVtEnabledByPlatform(mPhone.getContext())
- && mImsManager.isVtProvisionedOnDevice(mPhone.getContext());
+ if (mImsManager != null) {
+ return mImsManager.isVtEnabledByPlatform()
+ && mImsManager.isVtProvisionedOnDevice();
}
return false;
}
@@ -1550,9 +1496,9 @@
};
private boolean isImsWfcProvisioned() {
- if (mPhone != null && mImsManager != null) {
- return mImsManager.isWfcEnabledByPlatform(mPhone.getContext())
- && mImsManager.isWfcProvisionedOnDevice(mPhone.getContext());
+ if (mImsManager != null) {
+ return mImsManager.isWfcEnabledByPlatform()
+ && mImsManager.isWfcProvisionedOnDevice();
}
return false;
}
@@ -1594,13 +1540,14 @@
return provisioned;
}
- private static boolean isEabEnabledByPlatform(Context context) {
- if (context != null) {
+ private boolean isEabEnabledByPlatform() {
+ if (mPhone != null) {
CarrierConfigManager configManager = (CarrierConfigManager)
- context.getSystemService(Context.CARRIER_CONFIG_SERVICE);
- if (configManager != null && configManager.getConfig().getBoolean(
- CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL)) {
- return true;
+ mPhone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
+ PersistableBundle b = configManager.getConfigForSubId(mPhone.getSubId());
+ if (b != null) {
+ return b.getBoolean(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL,
+ false);
}
}
return false;
@@ -1617,25 +1564,25 @@
mImsVolteProvisionedSwitch.setChecked(isImsVolteProvisioned());
mImsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
mImsVolteProvisionedSwitch.setEnabled(!IS_USER_BUILD
- && mImsManager.isVolteEnabledByPlatform(mPhone.getContext()));
+ && mImsManager.isVolteEnabledByPlatform());
mImsVtProvisionedSwitch.setOnCheckedChangeListener(null);
mImsVtProvisionedSwitch.setChecked(isImsVtProvisioned());
mImsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
mImsVtProvisionedSwitch.setEnabled(!IS_USER_BUILD
- && mImsManager.isVtEnabledByPlatform(mPhone.getContext()));
+ && mImsManager.isVtEnabledByPlatform());
mImsWfcProvisionedSwitch.setOnCheckedChangeListener(null);
mImsWfcProvisionedSwitch.setChecked(isImsWfcProvisioned());
mImsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
mImsWfcProvisionedSwitch.setEnabled(!IS_USER_BUILD
- && mImsManager.isWfcEnabledByPlatform(mPhone.getContext()));
+ && mImsManager.isWfcEnabledByPlatform());
mEabProvisionedSwitch.setOnCheckedChangeListener(null);
mEabProvisionedSwitch.setChecked(isEabProvisioned());
mEabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
mEabProvisionedSwitch.setEnabled(!IS_USER_BUILD
- && isEabEnabledByPlatform(mPhone.getContext()));
+ && isEabEnabledByPlatform());
}
OnClickListener mDnsCheckButtonHandler = new OnClickListener() {
diff --git a/src/com/android/phone/settings/SuppServicesUiUtil.java b/src/com/android/phone/settings/SuppServicesUiUtil.java
index 4e9841f..4f1a79f 100644
--- a/src/com/android/phone/settings/SuppServicesUiUtil.java
+++ b/src/com/android/phone/settings/SuppServicesUiUtil.java
@@ -84,7 +84,7 @@
.create();
}
- private static String makeMessage(Context context, String preferenceKey, Phone phone) {
+ public static String makeMessage(Context context, String preferenceKey, Phone phone) {
String message = "";
int simSlot = (phone.getPhoneId() == 0) ? 1 : 2;
String suppServiceName = getSuppServiceName(context, preferenceKey);
diff --git a/src/com/android/phone/settings/VoicemailSettingsActivity.java b/src/com/android/phone/settings/VoicemailSettingsActivity.java
index 66b1af9..2bd5306 100644
--- a/src/com/android/phone/settings/VoicemailSettingsActivity.java
+++ b/src/com/android/phone/settings/VoicemailSettingsActivity.java
@@ -238,6 +238,10 @@
mVoicemailNotificationPreference =
findPreference(getString(R.string.voicemail_notifications_key));
+ if (mSubMenuVoicemailSettings == null) {
+ mSubMenuVoicemailSettings =
+ (EditPhoneNumberPreference) findPreference(BUTTON_VOICEMAIL_KEY);
+ }
final Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_CHANNEL_ID,
NotificationChannelController.CHANNEL_ID_VOICE_MAIL);
@@ -250,12 +254,6 @@
super.onResume();
mForeground = true;
- PreferenceScreen prefSet = getPreferenceScreen();
-
- if (mSubMenuVoicemailSettings == null) {
- mSubMenuVoicemailSettings =
- (EditPhoneNumberPreference) findPreference(BUTTON_VOICEMAIL_KEY);
- }
if (mSubMenuVoicemailSettings != null) {
mSubMenuVoicemailSettings.setParentActivity(this, VOICEMAIL_PREF_ID, this);
mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
diff --git a/src/com/android/phone/settings/fdn/DeleteFdnContactScreen.java b/src/com/android/phone/settings/fdn/DeleteFdnContactScreen.java
index 92baa97..8b17cfb 100644
--- a/src/com/android/phone/settings/fdn/DeleteFdnContactScreen.java
+++ b/src/com/android/phone/settings/fdn/DeleteFdnContactScreen.java
@@ -64,7 +64,8 @@
resolveIntent();
- authenticatePin2();
+ // Starts PIN2 authentication only for the first time.
+ if (icicle == null) authenticatePin2();
getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.delete_fdn_contact_screen);
diff --git a/src/com/android/services/telephony/CdmaConnection.java b/src/com/android/services/telephony/CdmaConnection.java
index 90e7663..c7b324d 100644
--- a/src/com/android/services/telephony/CdmaConnection.java
+++ b/src/com/android/services/telephony/CdmaConnection.java
@@ -16,11 +16,12 @@
package com.android.services.telephony;
+import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.telephony.DisconnectCause;
-import android.telephony.PhoneNumberUtils;
+import android.telephony.TelephonyManager;
import com.android.internal.telephony.Call;
import com.android.internal.telephony.CallStateException;
@@ -284,8 +285,14 @@
private boolean isEmergency() {
Phone phone = getPhone();
- return phone != null && getAddress() != null && PhoneNumberUtils.isLocalEmergencyNumber(
- phone.getContext(), getAddress().getSchemeSpecificPart());
+ if (phone != null && getAddress() != null) {
+ TelephonyManager tm = (TelephonyManager) phone.getContext()
+ .getSystemService(Context.TELEPHONY_SERVICE);
+ if (tm != null) {
+ return tm.isEmergencyNumber(getAddress().getSchemeSpecificPart());
+ }
+ }
+ return false;
}
/**
diff --git a/src/com/android/services/telephony/ImsConference.java b/src/com/android/services/telephony/ImsConference.java
index 82a393d..c9f762b 100644
--- a/src/com/android/services/telephony/ImsConference.java
+++ b/src/com/android/services/telephony/ImsConference.java
@@ -867,6 +867,16 @@
mConferenceHostAddress = new Uri[hostAddresses.size()];
mConferenceHostAddress = hostAddresses.toArray(mConferenceHostAddress);
+ Log.i(this, "setConferenceHost: temp log hosts are "
+ + Arrays.stream(mConferenceHostAddress)
+ .map(Uri::toString)
+ .collect(Collectors.joining(", ")));
+
+ Log.i(this, "setConferenceHost: hosts are "
+ + Arrays.stream(mConferenceHostAddress)
+ .map(Uri::getSchemeSpecificPart)
+ .map(ssp -> Rlog.pii(LOG_TAG, ssp))
+ .collect(Collectors.joining(", ")));
Log.i(this, "setConferenceHost: hosts are "
+ Arrays.stream(mConferenceHostAddress)
@@ -1383,9 +1393,12 @@
}
if (mConferenceHost.getPhone().getPhoneType() == PhoneConstants.PHONE_TYPE_GSM) {
- Log.i(this,"handleOriginalConnectionChange : SRVCC to GSM");
GsmConnection c = new GsmConnection(originalConnection, getTelecomCallId(),
mConferenceHost.getCallDirection());
+ Log.i(this, "handleOriginalConnectionChange : SRVCC to GSM."
+ + " Created new GsmConnection with objId=" + System.identityHashCode(c)
+ + " and originalConnection objId="
+ + System.identityHashCode(originalConnection));
// This is a newly created conference connection as a result of SRVCC
c.setConferenceSupported(true);
c.setTelephonyConnectionProperties(
diff --git a/src/com/android/services/telephony/MmiCodeUtil.java b/src/com/android/services/telephony/MmiCodeUtil.java
new file mode 100644
index 0000000..d208ec3
--- /dev/null
+++ b/src/com/android/services/telephony/MmiCodeUtil.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public final class MmiCodeUtil {
+ //***** Constants
+
+ // Supp Service codes from TS 22.030 Annex B
+
+ //Called line presentation
+ static final String SC_CLIP = "30";
+ static final String SC_CLIR = "31";
+
+ // Call Forwarding
+ static final String SC_CFU = "21";
+ static final String SC_CFB = "67";
+ static final String SC_CFNRy = "61";
+ static final String SC_CFNR = "62";
+
+ static final String SC_CF_All = "002";
+ static final String SC_CF_All_Conditional = "004";
+
+ // Call Waiting
+ static final String SC_WAIT = "43";
+
+ // Call Barring
+ static final String SC_BAOC = "33";
+ static final String SC_BAOIC = "331";
+ static final String SC_BAOICxH = "332";
+ static final String SC_BAIC = "35";
+ static final String SC_BAICr = "351";
+
+ static final String SC_BA_ALL = "330";
+ static final String SC_BA_MO = "333";
+ static final String SC_BA_MT = "353";
+
+ // Supp Service Password registration
+ static final String SC_PWD = "03";
+
+ // PIN/PIN2/PUK/PUK2
+ static final String SC_PIN = "04";
+ static final String SC_PIN2 = "042";
+ static final String SC_PUK = "05";
+ static final String SC_PUK2 = "052";
+
+ // See TS 22.030 6.5.2 "Structure of the MMI"
+
+ static Pattern sPatternSuppService = Pattern.compile(
+ "((\\*|#|\\*#|\\*\\*|##)(\\d{2,3})(\\*([^*#]*)(\\*([^*#]*)(\\*([^*#]*)(\\*([^*#]*))?)?)?)?#)(.*)");
+/* 1 2 3 4 5 6 7 8 9 10 11 12
+
+ 1 = Full string up to and including #
+ 2 = action (activation/interrogation/registration/erasure)
+ 3 = service code
+ 5 = SIA
+ 7 = SIB
+ 9 = SIC
+ 10 = dialing number
+*/
+
+ static final int MATCH_GROUP_SERVICE_CODE = 3;
+
+ public static final String BUTTON_CLIR_KEY = "button_clir_key";
+ public static final String BUTTON_CW_KEY = "button_cw_key";
+ public static final String CALL_FORWARDING_KEY = "call_forwarding_key";
+ public static final String CALL_BARRING_KEY = "call_barring_key";
+
+ //***** Public Class methods
+ public static String getMmiServiceCode(String dialString) {
+ Matcher m;
+ String ret = null;
+
+ m = sPatternSuppService.matcher(dialString);
+
+ if (m.matches()) {
+ ret = makeEmptyNull(m.group(MATCH_GROUP_SERVICE_CODE));
+ }
+
+ return ret;
+ }
+
+ private static String makeEmptyNull(String s) {
+ if (s != null && s.length() == 0) return null;
+
+ return s;
+ }
+
+ static boolean isServiceCodeCallForwarding(String sc) {
+ return sc != null &&
+ (sc.equals(SC_CFU)
+ || sc.equals(SC_CFB) || sc.equals(SC_CFNRy)
+ || sc.equals(SC_CFNR) || sc.equals(SC_CF_All)
+ || sc.equals(SC_CF_All_Conditional));
+ }
+
+ static boolean isServiceCodeCallBarring(String sc) {
+ return sc != null &&
+ (sc.equals(SC_BAOC)
+ || sc.equals(SC_BAOIC) || sc.equals(SC_BAOICxH)
+ || sc.equals(SC_BAIC) || sc.equals(SC_BAICr)
+ || sc.equals(SC_BA_ALL) || sc.equals(SC_BA_MO)
+ || sc.equals(SC_BA_MT));
+ }
+
+ static boolean isPinPukCommand(String sc) {
+ return sc != null && (sc.equals(SC_PIN) || sc.equals(SC_PIN2)
+ || sc.equals(SC_PUK) || sc.equals(SC_PUK2));
+ }
+
+ public static String getSuppServiceKey(String dialString) {
+ String sc = getMmiServiceCode(dialString);
+ if (sc != null && sc.equals(SC_CLIP)) {
+ return "";
+ } else if (sc != null && sc.equals(SC_CLIR)) {
+ return BUTTON_CLIR_KEY;
+ } else if (isServiceCodeCallForwarding(sc)) {
+ return CALL_FORWARDING_KEY;
+ } else if (isServiceCodeCallBarring(sc)) {
+ return CALL_BARRING_KEY;
+ } else if (sc != null && sc.equals(SC_PWD)) {
+ return "";
+ } else if (sc != null && sc.equals(SC_WAIT)) {
+ return BUTTON_CW_KEY;
+ } else if (isPinPukCommand(sc)) {
+ return "";
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/src/com/android/services/telephony/PstnIncomingCallNotifier.java b/src/com/android/services/telephony/PstnIncomingCallNotifier.java
index 76898bd..b6d5d3e 100644
--- a/src/com/android/services/telephony/PstnIncomingCallNotifier.java
+++ b/src/com/android/services/telephony/PstnIncomingCallNotifier.java
@@ -65,6 +65,12 @@
*/
private static final int MAX_NUMBER_VERIFICATION_HANGUP_DELAY_MILLIS = 10000;
+ /**
+ * Hardcoded extra for a call that's used to provide metrics information to the dialer app.
+ */
+ private static final String EXTRA_CALL_CREATED_TIME_MILLIS =
+ "android.telecom.extra.CALL_CREATED_TIME_MILLIS";
+
/** The phone object to listen to. */
private final Phone mPhone;
@@ -216,6 +222,9 @@
Call call = connection.getCall();
if (call != null && call.getState().isAlive()) {
addNewUnknownCall(connection);
+ } else {
+ Log.i(this, "Skipping new unknown connection because its call is null or dead."
+ + " connection=" + connection);
}
}
}
@@ -242,8 +251,7 @@
}
// Specifies the time the call was added. This is used by the dialer for analytics.
- extras.putLong(TelecomManager.EXTRA_CALL_CREATED_TIME_MILLIS,
- SystemClock.elapsedRealtime());
+ extras.putLong(EXTRA_CALL_CREATED_TIME_MILLIS, SystemClock.elapsedRealtime());
PhoneAccountHandle handle = findCorrectPhoneAccountHandle();
if (handle == null) {
@@ -273,8 +281,7 @@
}
// Specifies the time the call was added. This is used by the dialer for analytics.
- extras.putLong(TelecomManager.EXTRA_CALL_CREATED_TIME_MILLIS,
- SystemClock.elapsedRealtime());
+ extras.putLong(EXTRA_CALL_CREATED_TIME_MILLIS, SystemClock.elapsedRealtime());
if (connection.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS) {
if (((ImsPhoneConnection) connection).isRttEnabledForCall()) {
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 4edd36d..4fe5fb9 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -106,6 +106,13 @@
*/
private static final int LISTENER_STATE_REGISTERED = 3;
+ /**
+ * Copy-pasted from android.telecom.PhoneAccount -- hidden constant which is unfortunately being
+ * used by some 1P apps, so we're keeping it here until we can remove it.
+ */
+ private static final String EXTRA_SUPPORTS_VIDEO_CALLING_FALLBACK =
+ "android.telecom.extra.SUPPORTS_VIDEO_CALLING_FALLBACK";
+
final class AccountEntry implements PstnPhoneCapabilitiesNotifier.Listener {
private final Phone mPhone;
private PhoneAccount mAccount;
@@ -119,7 +126,7 @@
private ImsMmTelManager.CapabilityCallback mMmtelCapabilityCallback;
private RegistrationManager.RegistrationCallback mImsRegistrationCallback;
private ImsMmTelManager mMmTelManager;
- private final boolean mIsDummy;
+ private final boolean mIsTestAccount;
private boolean mIsVideoCapable;
private boolean mIsVideoPresenceSupported;
private boolean mIsVideoPauseSupported;
@@ -131,20 +138,20 @@
private boolean mIsUsingSimCallManager;
private boolean mIsShowPreciseFailedCause;
- AccountEntry(Phone phone, boolean isEmergency, boolean isDummy) {
+ AccountEntry(Phone phone, boolean isEmergency, boolean isTest) {
mPhone = phone;
mIsEmergency = isEmergency;
- mIsDummy = isDummy;
+ mIsTestAccount = isTest;
mIsAdhocConfCapable = mPhone.isImsRegistered();
- mAccount = registerPstnPhoneAccount(isEmergency, isDummy);
+ mAccount = registerPstnPhoneAccount(isEmergency, isTest);
Log.i(this, "Registered phoneAccount: %s with handle: %s",
mAccount, mAccount.getAccountHandle());
mIncomingCallNotifier = new PstnIncomingCallNotifier((Phone) mPhone);
mPhoneCapabilitiesNotifier = new PstnPhoneCapabilitiesNotifier((Phone) mPhone,
this);
- if (mIsDummy || isEmergency) {
- // For dummy and emergency entries, there is no sub ID that can be assigned, so do
+ if (mIsTestAccount || isEmergency) {
+ // For test and emergency entries, there is no sub ID that can be assigned, so do
// not register for capabilities callbacks.
return;
}
@@ -247,7 +254,7 @@
* Trigger re-registration of this account.
*/
public void reRegisterPstnPhoneAccount() {
- PhoneAccount newAccount = buildPstnPhoneAccount(mIsEmergency, mIsDummy);
+ PhoneAccount newAccount = buildPstnPhoneAccount(mIsEmergency, mIsTestAccount);
if (!newAccount.equals(mAccount)) {
Log.i(this, "reRegisterPstnPhoneAccount: subId: " + getSubId()
+ " - re-register due to account change.");
@@ -258,8 +265,8 @@
}
}
- private PhoneAccount registerPstnPhoneAccount(boolean isEmergency, boolean isDummyAccount) {
- PhoneAccount account = buildPstnPhoneAccount(mIsEmergency, mIsDummy);
+ private PhoneAccount registerPstnPhoneAccount(boolean isEmergency, boolean isTestAccount) {
+ PhoneAccount account = buildPstnPhoneAccount(mIsEmergency, mIsTestAccount);
// Register with Telecom and put into the account entry.
mTelecomManager.registerPhoneAccount(account);
return account;
@@ -268,13 +275,13 @@
/**
* Registers the specified account with Telecom as a PhoneAccountHandle.
*/
- private PhoneAccount buildPstnPhoneAccount(boolean isEmergency, boolean isDummyAccount) {
- String dummyPrefix = isDummyAccount ? "Dummy " : "";
+ private PhoneAccount buildPstnPhoneAccount(boolean isEmergency, boolean isTestAccount) {
+ String testPrefix = isTestAccount ? "Test " : "";
// Build the Phone account handle.
PhoneAccountHandle phoneAccountHandle =
PhoneUtils.makePstnPhoneAccountHandleWithPrefix(
- mPhone, dummyPrefix, isEmergency);
+ mPhone, testPrefix, isEmergency);
// Populate the phone account data.
int subId = mPhone.getSubId();
@@ -334,8 +341,8 @@
// The label is user-visible so let's use the display name that the user may
// have set in Settings->Sim cards.
- label = dummyPrefix + subDisplayName;
- description = dummyPrefix + mContext.getResources().getString(
+ label = testPrefix + subDisplayName;
+ description = testPrefix + mContext.getResources().getString(
R.string.sim_description_default, slotIdString);
}
@@ -416,13 +423,12 @@
extras.putBoolean(PhoneAccount.EXTRA_PLAY_CALL_RECORDING_TONE, true);
}
- extras.putBoolean(PhoneAccount.EXTRA_SUPPORTS_VIDEO_CALLING_FALLBACK,
+ extras.putBoolean(EXTRA_SUPPORTS_VIDEO_CALLING_FALLBACK,
mContext.getResources()
.getBoolean(R.bool.config_support_video_calling_fallback));
if (slotId != SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
- extras.putString(PhoneAccount.EXTRA_SORT_ORDER,
- String.valueOf(slotId));
+ extras.putInt(PhoneAccount.EXTRA_SORT_ORDER, slotId);
}
mIsMergeCallSupported = isCarrierMergeCallSupported();
@@ -767,7 +773,7 @@
// time we get here, the original phone account could have been torn down.
return;
}
- mAccount = registerPstnPhoneAccount(mIsEmergency, mIsDummy);
+ mAccount = registerPstnPhoneAccount(mIsEmergency, mIsTestAccount);
}
}
@@ -786,7 +792,7 @@
Log.i(this, "updateAdhocConfCapability - changed, new value: "
+ isAdhocConfCapable);
mIsAdhocConfCapable = isAdhocConfCapable;
- mAccount = registerPstnPhoneAccount(mIsEmergency, mIsDummy);
+ mAccount = registerPstnPhoneAccount(mIsEmergency, mIsTestAccount);
}
}
}
@@ -805,7 +811,7 @@
if (mIsVideoPresenceSupported != isVideoPresenceSupported) {
Log.i(this, "updateVideoPresenceCapability for subId=" + mPhone.getSubId()
+ ", new value= " + isVideoPresenceSupported);
- mAccount = registerPstnPhoneAccount(mIsEmergency, mIsDummy);
+ mAccount = registerPstnPhoneAccount(mIsEmergency, mIsTestAccount);
}
}
}
@@ -814,7 +820,7 @@
boolean isRttEnabled = isRttCurrentlySupported();
if (isRttEnabled != mIsRttCapable) {
Log.i(this, "updateRttCapability - changed, new value: " + isRttEnabled);
- mAccount = registerPstnPhoneAccount(mIsEmergency, mIsDummy);
+ mAccount = registerPstnPhoneAccount(mIsEmergency, mIsTestAccount);
}
}
@@ -823,7 +829,7 @@
activeDataSubId);
if (isEmergencyPreferred != mIsEmergencyPreferred) {
Log.i(this, "updateDefaultDataSubId - changed, new value: " + isEmergencyPreferred);
- mAccount = registerPstnPhoneAccount(mIsEmergency, mIsDummy);
+ mAccount = registerPstnPhoneAccount(mIsEmergency, mIsTestAccount);
}
}
@@ -1128,7 +1134,7 @@
this.mTelephonyConnectionService = telephonyConnectionService;
}
- TelephonyConnectionService getTelephonyConnectionService() {
+ public TelephonyConnectionService getTelephonyConnectionService() {
return mTelephonyConnectionService;
}
@@ -1406,6 +1412,17 @@
return false;
}
+ PhoneAccountHandle getPhoneAccountHandleForSubId(int subId) {
+ synchronized (mAccountsLock) {
+ for (AccountEntry entry : mAccounts) {
+ if (entry.getSubId() == subId) {
+ return entry.getPhoneAccountHandle();
+ }
+ }
+ }
+ return null;
+ }
+
/**
* Un-registers any {@link PhoneAccount}s which are no longer present in the list
* {@code AccountEntry}(s).
@@ -1463,7 +1480,7 @@
}
mAccounts.add(new AccountEntry(phone, false /* emergency */,
- false /* isDummy */));
+ false /* isTest */));
}
}
} finally {
@@ -1474,14 +1491,14 @@
Log.i(this, "setupAccounts: adding default");
mAccounts.add(
new AccountEntry(PhoneFactory.getDefaultPhone(), true /* emergency */,
- false /* isDummy */));
+ false /* isTest */));
}
}
// Add a fake account entry.
- if (DBG && phones.length > 0 && "TRUE".equals(System.getProperty("dummy_sim"))) {
+ if (DBG && phones.length > 0 && "TRUE".equals(System.getProperty("test_sim"))) {
mAccounts.add(new AccountEntry(phones[0], false /* emergency */,
- true /* isDummy */));
+ true /* isTest */));
}
}
diff --git a/src/com/android/services/telephony/TelephonyConferenceController.java b/src/com/android/services/telephony/TelephonyConferenceController.java
index 95281b3..fd16d4b 100644
--- a/src/com/android/services/telephony/TelephonyConferenceController.java
+++ b/src/com/android/services/telephony/TelephonyConferenceController.java
@@ -260,6 +260,8 @@
}
mTelephonyConference = new TelephonyConference(phoneAccountHandle);
+ Log.i(this, "Creating new TelephonyConference to hold conferenced connections."
+ + " conference=" + mTelephonyConference);
for (Connection connection : conferencedConnections) {
Log.d(this, "Adding a connection to a conference call: %s %s",
mTelephonyConference, connection);
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index b4dd050..3e7f29c 100755
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -96,6 +96,9 @@
private static final int MSG_CONFERENCE_MERGE_FAILED = 6;
private static final int MSG_SUPP_SERVICE_NOTIFY = 7;
+ // the threshold used to compare mAudioCodecBitrateKbps and mAudioCodecBandwidth.
+ private static final float THRESHOLD = 0.01f;
+
/**
* Mappings from {@link com.android.internal.telephony.Connection} extras keys to their
* equivalents defined in {@link android.telecom.Connection}.
@@ -117,6 +120,9 @@
private static final int MSG_REDIAL_CONNECTION_CHANGED = 20;
private static final int MSG_REJECT = 21;
+ private static final String JAPAN_COUNTRY_CODE_WITH_PLUS_SIGN = "+81";
+ private static final String JAPAN_ISO_COUNTRY_CODE = "JP";
+
private List<Uri> mParticipants;
private boolean mIsAdhocConferenceCall;
@@ -149,15 +155,18 @@
mOriginalConnection.getAddress() != null &&
mOriginalConnection.getAddress().equals(connection.getAddress())) ||
connection.getState() == mOriginalConnection.getStateBeforeHandover())) {
- Log.d(TelephonyConnection.this,
- "SettingOriginalConnection " + mOriginalConnection.toString()
- + " with " + connection.toString());
+ Log.d(TelephonyConnection.this, "Setting original connection after"
+ + " handover or redial, current original connection="
+ + mOriginalConnection.toString()
+ + ", new original connection="
+ + connection.toString());
setOriginalConnection(connection);
mWasImsConnection = false;
}
} else {
Log.w(TelephonyConnection.this,
- what + ": mOriginalConnection==null - invalid state (not cleaned up)");
+ what + ": mOriginalConnection==null --"
+ + " invalid state (not cleaned up)");
}
break;
case MSG_RINGBACK_TONE:
@@ -1295,6 +1304,9 @@
if (isShowingOriginalDialString()
&& mOriginalConnection.getOrigDialString() != null) {
address = getAddressFromNumber(mOriginalConnection.getOrigDialString());
+ } else if (isNeededToFormatIncomingNumberForJp()) {
+ address = getAddressFromNumber(
+ formatIncomingNumberForJp(mOriginalConnection.getAddress()));
} else {
address = getAddressFromNumber(mOriginalConnection.getAddress());
}
@@ -1316,7 +1328,9 @@
setCallerDisplayName(name, namePresentation);
}
- if (PhoneNumberUtils.isEmergencyNumber(mOriginalConnection.getAddress())) {
+ TelephonyManager tm = (TelephonyManager) getPhone().getContext()
+ .getSystemService(Context.TELEPHONY_SERVICE);
+ if (tm.isEmergencyNumber(mOriginalConnection.getAddress())) {
mTreatAsEmergencyCall = true;
}
@@ -1379,7 +1393,9 @@
mHandler.obtainMessage(MSG_CONNECTION_EXTRAS_CHANGED, connExtras == null ? null :
new Bundle(connExtras)).sendToTarget();
- if (PhoneNumberUtils.isEmergencyNumber(mOriginalConnection.getAddress())) {
+ TelephonyManager tm = (TelephonyManager) getPhone().getContext()
+ .getSystemService(Context.TELEPHONY_SERVICE);
+ if (tm.isEmergencyNumber(mOriginalConnection.getAddress())) {
mTreatAsEmergencyCall = true;
}
// Propagate VERSTAT for IMS calls.
@@ -1403,6 +1419,15 @@
} else {
extrasToRemove.add(Connection.EXTRA_DISABLE_ADD_CALL);
}
+
+ if (mOriginalConnection != null) {
+ ArrayList<String> forwardedNumber = mOriginalConnection.getForwardedNumber();
+ if (forwardedNumber != null) {
+ extrasToPut.putStringArrayList(Connection.EXTRA_LAST_FORWARDED_NUMBER,
+ forwardedNumber);
+ }
+ }
+
putTelephonyExtras(extrasToPut);
removeTelephonyExtras(extrasToRemove);
@@ -1483,7 +1508,8 @@
}
}
- private void refreshCodecType() {
+ private void refreshCodec() {
+ boolean changed = false;
Bundle newExtras = getExtras();
if (newExtras == null) {
newExtras = new Bundle();
@@ -1499,6 +1525,31 @@
Connection.AUDIO_CODEC_NONE);
if (newCodecType != oldCodecType) {
newExtras.putInt(Connection.EXTRA_AUDIO_CODEC, newCodecType);
+ changed = true;
+ }
+ if (isImsConnection()) {
+ float newBitrate = getOriginalConnection().getAudioCodecBitrateKbps();
+ float oldBitrate = newExtras.getFloat(Connection.EXTRA_AUDIO_CODEC_BITRATE_KBPS, 0.0f);
+ if (Math.abs(newBitrate - oldBitrate) > THRESHOLD) {
+ newExtras.putFloat(Connection.EXTRA_AUDIO_CODEC_BITRATE_KBPS, newBitrate);
+ changed = true;
+ }
+
+ float newBandwidth = getOriginalConnection().getAudioCodecBandwidthKhz();
+ float oldBandwidth = newExtras.getFloat(Connection.EXTRA_AUDIO_CODEC_BANDWIDTH_KHZ,
+ 0.0f);
+ if (Math.abs(newBandwidth - oldBandwidth) > THRESHOLD) {
+ newExtras.putFloat(Connection.EXTRA_AUDIO_CODEC_BANDWIDTH_KHZ, newBandwidth);
+ changed = true;
+ }
+ } else {
+ ArrayList<String> toRemove = new ArrayList<>();
+ toRemove.add(Connection.EXTRA_AUDIO_CODEC_BITRATE_KBPS);
+ toRemove.add(Connection.EXTRA_AUDIO_CODEC_BANDWIDTH_KHZ);
+ removeTelephonyExtras(toRemove);
+ }
+
+ if (changed) {
putTelephonyExtras(newExtras);
}
}
@@ -1577,7 +1628,7 @@
}
}
- isVowifiEnabled = ImsUtil.isWfcEnabled(phone.getContext(), phone.getPhoneId());
+ isVowifiEnabled = isWfcEnabled(phone);
}
if (isCurrentVideoCall) {
@@ -2182,7 +2233,7 @@
updateAddress();
updateMultiparty();
refreshDisableAddCall();
- refreshCodecType();
+ refreshCodec();
}
/**
@@ -2713,7 +2764,7 @@
boolean isIms = phone.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS;
boolean isVoWifiEnabled = false;
if (isIms) {
- isVoWifiEnabled = ImsUtil.isWfcEnabled(phone.getContext(), phone.getPhoneId());
+ isVoWifiEnabled = isWfcEnabled(phone);
}
boolean isRttMergeSupported = getCarrierConfig()
.getBoolean(CarrierConfigManager.KEY_ALLOW_MERGING_RTT_CALLS_BOOL);
@@ -2763,6 +2814,12 @@
notifyConferenceSupportedChanged(isConferenceSupported);
}
}
+
+ @VisibleForTesting
+ boolean isWfcEnabled(Phone phone) {
+ return ImsUtil.isWfcEnabled(phone.getContext(), phone.getPhoneId());
+ }
+
/**
* Provides a mapping from extras keys which may be found in the
* {@link com.android.internal.telephony.Connection} to their equivalents defined in
@@ -3201,4 +3258,29 @@
listener.onStatusHintsChanged(this, statusHints);
}
}
+
+ /**
+ * Whether the incoming call number should be formatted to national number for Japan.
+ * @return {@code true} should be convert to the national format, {@code false} otherwise.
+ */
+ private boolean isNeededToFormatIncomingNumberForJp() {
+ if (mOriginalConnection.isIncoming()
+ && !TextUtils.isEmpty(mOriginalConnection.getAddress())
+ && mOriginalConnection.getAddress().startsWith(JAPAN_COUNTRY_CODE_WITH_PLUS_SIGN)) {
+ PersistableBundle b = getCarrierConfig();
+ return b != null && b.getBoolean(
+ CarrierConfigManager.KEY_FORMAT_INCOMING_NUMBER_TO_NATIONAL_FOR_JP_BOOL);
+ }
+ return false;
+ }
+
+ /**
+ * Format the incoming call number to national number for Japan.
+ * @param number
+ * @return the formatted phone number (e.g, "+819012345678" -> "09012345678")
+ */
+ private String formatIncomingNumberForJp(String number) {
+ return PhoneNumberUtils.stripSeparators(
+ PhoneNumberUtils.formatNumber(number, JAPAN_ISO_COUNTRY_CODE));
+ }
}
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 290b4e1..11d7044 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -17,10 +17,13 @@
package com.android.services.telephony;
import android.annotation.NonNull;
+import android.app.AlertDialog;
+import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
@@ -46,6 +49,7 @@
import android.telephony.emergency.EmergencyNumber;
import android.text.TextUtils;
import android.util.Pair;
+import android.view.WindowManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Call;
@@ -65,6 +69,7 @@
import com.android.phone.MMIDialogActivity;
import com.android.phone.PhoneUtils;
import com.android.phone.R;
+import com.android.phone.settings.SuppServicesUiUtil;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@@ -155,6 +160,9 @@
private EmergencyTonePlayer mEmergencyTonePlayer;
private HoldTracker mHoldTracker;
private boolean mIsTtyEnabled;
+ /** Set to true when there is an emergency call pending which will potential trigger a dial.
+ * This must be set to false when the call is dialed. */
+ private volatile boolean mIsEmergencyCallPending;
// Contains one TelephonyConnection that has placed a call and a memory of which Phones it has
// already tried to connect with. There should be only one TelephonyConnection trying to place a
@@ -795,6 +803,10 @@
if (mRadioOnHelper == null) {
mRadioOnHelper = new RadioOnHelper(this);
}
+
+ if (isEmergencyNumber) {
+ mIsEmergencyCallPending = true;
+ }
mRadioOnHelper.triggerRadioOnAndListen(new RadioOnStateListener.Callback() {
@Override
public void onComplete(RadioOnStateListener listener, boolean isRadioReady) {
@@ -907,6 +919,14 @@
}
/**
+ * @return whether radio has recently been turned on for emergency call but hasn't actually
+ * dialed the call yet.
+ */
+ public boolean isEmergencyCallPending() {
+ return mIsEmergencyCallPending;
+ }
+
+ /**
* Whether the cellular radio is power off because the device is on Bluetooth.
*/
private boolean isRadioPowerDownOnBluetooth() {
@@ -931,6 +951,7 @@
for (Phone curPhone : mPhoneFactoryProxy.getPhones()) {
curPhone.setRadioPower(true, false, false, true);
}
+ mIsEmergencyCallPending = false;
}
return;
}
@@ -946,6 +967,7 @@
Log.i(this, "handleOnComplete - delayDialForDdsSwitch result = " + result);
adjustAndPlaceOutgoingConnection(phone, originalConnection, request,
numberToDial, handle, originalPhoneType, true);
+ mIsEmergencyCallPending = false;
}
});
}
@@ -956,6 +978,7 @@
mDisconnectCauseFactory.toTelecomDisconnectCause(
android.telephony.DisconnectCause.POWER_OFF,
"Failed to turn on radio."));
+ mIsEmergencyCallPending = false;
}
}
@@ -1139,9 +1162,9 @@
phone.getPhoneId()));
}
-
+ PhoneAccountHandle accountHandle = adjustAccountHandle(phone, request.getAccountHandle());
final TelephonyConnection connection =
- createConnectionFor(phone, null, true /* isOutgoing */, request.getAccountHandle(),
+ createConnectionFor(phone, null, true /* isOutgoing */, accountHandle,
request.getTelecomCallId(), request.isAdhocConferenceCall());
if (connection == null) {
return Connection.createFailedConnection(
@@ -1678,13 +1701,18 @@
? connection.getAddress().getSchemeSpecificPart()
: "";
+ if (showDataDialog(phone, number)) {
+ connection.setDisconnected(DisconnectCauseUtil.toTelecomDisconnectCause(
+ android.telephony.DisconnectCause.DIALED_MMI, "UT is not available"));
+ return;
+ }
+
com.android.internal.telephony.Connection originalConnection = null;
try {
if (phone != null) {
EmergencyNumber emergencyNumber =
phone.getEmergencyNumberTracker().getEmergencyNumber(number);
if (emergencyNumber != null) {
- phone.notifyOutgoingEmergencyCall(emergencyNumber);
if (!getAllConnections().isEmpty()) {
if (!shouldHoldForEmergencyCall(phone)) {
// If we do not support holding ongoing calls for an outgoing
@@ -1736,7 +1764,8 @@
if (originalConnection == null) {
int telephonyDisconnectCause = android.telephony.DisconnectCause.OUTGOING_FAILURE;
// On GSM phones, null connection means that we dialed an MMI code
- if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM) {
+ if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM ||
+ phone.isUtEnabled()) {
Log.d(this, "dialed MMI code");
int subId = phone.getSubId();
Log.d(this, "subId: "+subId);
@@ -2381,6 +2410,78 @@
}
}
+ private boolean showDataDialog(Phone phone, String number) {
+ boolean ret = false;
+ final Context context = getApplicationContext();
+ String suppKey = MmiCodeUtil.getSuppServiceKey(number);
+ if (suppKey != null) {
+ boolean clirOverUtPrecautions = false;
+ boolean cfOverUtPrecautions = false;
+ boolean cbOverUtPrecautions = false;
+ boolean cwOverUtPrecautions = false;
+
+ CarrierConfigManager cfgManager = (CarrierConfigManager)
+ phone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
+ if (cfgManager != null) {
+ clirOverUtPrecautions = cfgManager.getConfigForSubId(phone.getSubId())
+ .getBoolean(CarrierConfigManager.KEY_CALLER_ID_OVER_UT_WARNING_BOOL);
+ cfOverUtPrecautions = cfgManager.getConfigForSubId(phone.getSubId())
+ .getBoolean(CarrierConfigManager.KEY_CALL_FORWARDING_OVER_UT_WARNING_BOOL);
+ cbOverUtPrecautions = cfgManager.getConfigForSubId(phone.getSubId())
+ .getBoolean(CarrierConfigManager.KEY_CALL_BARRING_OVER_UT_WARNING_BOOL);
+ cwOverUtPrecautions = cfgManager.getConfigForSubId(phone.getSubId())
+ .getBoolean(CarrierConfigManager.KEY_CALL_WAITING_OVER_UT_WARNING_BOOL);
+ }
+
+ boolean isSsOverUtPrecautions = SuppServicesUiUtil
+ .isSsOverUtPrecautions(context, phone);
+ if (isSsOverUtPrecautions) {
+ boolean showDialog = false;
+ if (suppKey == MmiCodeUtil.BUTTON_CLIR_KEY && clirOverUtPrecautions) {
+ showDialog = true;
+ } else if (suppKey == MmiCodeUtil.CALL_FORWARDING_KEY && cfOverUtPrecautions) {
+ showDialog = true;
+ } else if (suppKey == MmiCodeUtil.CALL_BARRING_KEY && cbOverUtPrecautions) {
+ showDialog = true;
+ } else if (suppKey == MmiCodeUtil.BUTTON_CW_KEY && cwOverUtPrecautions) {
+ showDialog = true;
+ }
+
+ if (showDialog) {
+ Log.d(this, "Creating UT Data enable dialog");
+ String message = SuppServicesUiUtil.makeMessage(context, suppKey, phone);
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+ DialogInterface.OnClickListener networkSettingsClickListener =
+ new Dialog.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ ComponentName mobileNetworkSettingsComponent
+ = new ComponentName(
+ context.getString(
+ R.string.mobile_network_settings_package),
+ context.getString(
+ R.string.mobile_network_settings_class));
+ intent.setComponent(mobileNetworkSettingsComponent);
+ context.startActivity(intent);
+ }
+ };
+ Dialog dialog = builder.setMessage(message)
+ .setNeutralButton(context.getResources().getString(
+ R.string.settings_label),
+ networkSettingsClickListener)
+ .setPositiveButton(context.getResources().getString(
+ R.string.supp_service_over_ut_precautions_dialog_dismiss), null)
+ .create();
+ dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+ dialog.show();
+ ret = true;
+ }
+ }
+ }
+ return ret;
+ }
+
/**
* Adds a {@link Conference} to the telephony ConnectionService and registers a listener for
* changes to the conference. Should be used instead of {@link #addConference(Conference)}.
@@ -2390,4 +2491,20 @@
addConference(conference);
conference.addTelephonyConferenceListener(mTelephonyConferenceListener);
}
+
+ private PhoneAccountHandle adjustAccountHandle(Phone phone,
+ PhoneAccountHandle origAccountHandle) {
+ int origSubId = PhoneUtils.getSubIdForPhoneAccountHandle(origAccountHandle);
+ int subId = phone.getSubId();
+ if (origSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ && subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ && origSubId != subId) {
+ PhoneAccountHandle handle = TelecomAccountRegistry.getInstance(this)
+ .getPhoneAccountHandleForSubId(subId);
+ if (handle != null) {
+ return handle;
+ }
+ }
+ return origAccountHandle;
+ }
}
diff --git a/src/com/android/services/telephony/rcs/DelegateBinderStateManager.java b/src/com/android/services/telephony/rcs/DelegateBinderStateManager.java
new file mode 100644
index 0000000..9d2c5d6
--- /dev/null
+++ b/src/com/android/services/telephony/rcs/DelegateBinderStateManager.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.DelegateRequest;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateConnection;
+import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+/**
+ * Defines the interface to be used to manage the state of a SipDelegate on the ImsService side.
+ */
+public interface DelegateBinderStateManager {
+
+ /**
+ * Callback interface that allows listeners to listen to changes in registration or
+ * configuration state.
+ */
+ interface StateCallback {
+ /**
+ * The SipDelegate has notified telephony that the registration state has changed.
+ */
+ void onRegistrationStateChanged(DelegateRegistrationState registrationState);
+
+ /**
+ * The SipDelegate has notified telephony that the IMS configuration has changed.
+ */
+ void onImsConfigurationChanged(SipDelegateImsConfiguration config);
+ }
+
+ /** Allow for mocks to be created for testing. */
+ @VisibleForTesting
+ interface Factory {
+ /**
+ * Create a new instance of this interface, which may change depending on the tags being
+ * denied. See {@link SipDelegateBinderConnectionStub} and
+ * {@link SipDelegateBinderConnection}
+ */
+ DelegateBinderStateManager create(int subId, DelegateRequest requestedConfig,
+ Set<FeatureTagState> transportDeniedTags,
+ Executor executor, List<StateCallback> stateCallbacks);
+ }
+
+ /**
+ * Start the process to create a SipDelegate on the ImsService.
+ * @param cb The Binder interface that the SipDelegate should use to notify new incoming SIP
+ * messages as well as acknowledge whether or not an outgoing SIP message was
+ * successfully sent.
+ * @param createdConsumer The consumer that will be notified when the creation process has
+ * completed. Contains the ISipDelegate interface to communicate with the SipDelegate
+ * and the feature tags the SipDelegate itself denied.
+ * @return true if the creation process started, false if the remote process died. If false, the
+ * consumers will not be notified.
+ */
+ boolean create(ISipDelegateMessageCallback cb,
+ BiConsumer<ISipDelegate, Set<FeatureTagState>> createdConsumer);
+
+ /**
+ * Destroy the existing SipDelegate managed by this object.
+ * <p>
+ * This instance should be cleaned up after this call.
+ * @param reason The reason for why this delegate is being destroyed.
+ * @param destroyedConsumer The consumer that will be notified when this operation completes.
+ * Contains the reason the SipDelegate reported it was destroyed.
+ */
+ void destroy(int reason, Consumer<Integer> destroyedConsumer);
+
+ /**
+ * Called by IMS application, see
+ * {@link SipDelegateManager#triggerFullNetworkRegistration(SipDelegateConnection, int, String)}
+ * for more information about when this is called.
+ */
+ void triggerFullNetworkRegistration(int sipCode, String sipReason);
+}
diff --git a/src/com/android/services/telephony/rcs/DelegateStateTracker.java b/src/com/android/services/telephony/rcs/DelegateStateTracker.java
new file mode 100644
index 0000000..1d8fa3b
--- /dev/null
+++ b/src/com/android/services/telephony/rcs/DelegateStateTracker.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import android.os.RemoteException;
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateConnectionStateCallback;
+import android.telephony.ims.stub.DelegateConnectionStateCallback;
+import android.util.LocalLog;
+import android.util.Log;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Manages the events sent back to the remote IMS application using the AIDL backing for the
+ * {@link DelegateConnectionStateCallback} interface.
+ */
+public class DelegateStateTracker implements DelegateBinderStateManager.StateCallback {
+ private static final String LOG_TAG = "DelegateST";
+
+ private final int mSubId;
+ private final ISipDelegateConnectionStateCallback mAppStateCallback;
+ private final ISipDelegate mLocalDelegateImpl;
+
+ private final LocalLog mLocalLog = new LocalLog(SipTransportController.LOG_SIZE);
+
+ private List<FeatureTagState> mDelegateDeniedTags;
+ private DelegateRegistrationState mLastRegState;
+ private boolean mCreatedCalled = false;
+ private int mRegistrationStateOverride = -1;
+
+ public DelegateStateTracker(int subId, ISipDelegateConnectionStateCallback appStateCallback,
+ ISipDelegate localDelegateImpl) {
+ mSubId = subId;
+ mAppStateCallback = appStateCallback;
+ mLocalDelegateImpl = localDelegateImpl;
+ }
+
+ /**
+ * Notify this state tracker that a new internal SipDelegate has been connected.
+ *
+ * Registration and state updates will be send via the
+ * {@link SipDelegateBinderConnection.StateCallback} callback implemented by this class as they
+ * arrive.
+ * @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) {
+ 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
+ // SipDelegates may be changing underneath.
+ if (!mCreatedCalled) {
+ mCreatedCalled = true;
+ notifySipDelegateCreated();
+ }
+ mRegistrationStateOverride = -1;
+ mDelegateDeniedTags = new ArrayList<>(deniedTags);
+ }
+
+ /**
+ * The underlying SipDelegate is changing due to a state change in the SipDelegateController.
+ *
+ * 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.
+ * @param deregisteringReason The new deregistering reason that all feature tags in the
+ * registered state should now report.
+ */
+ public void sipDelegateChanging(int deregisteringReason) {
+ logi("SipDelegate Changing");
+ mRegistrationStateOverride = deregisteringReason;
+ if (mLastRegState == null) {
+ logw("sipDelegateChanging: invalid state, onRegistrationStateChanged never called.");
+ mLastRegState = new DelegateRegistrationState.Builder().build();
+ }
+ onRegistrationStateChanged(mLastRegState);
+ }
+
+ /**
+ * The underlying SipDelegate has been destroyed.
+ *
+ * This should only be called when the entire {@link SipDelegateController} is going down
+ * because the application has requested that the SipDelegate be destroyed.
+ *
+ * This can also be called in error conditions where the IMS application or ImsService has
+ * crashed.
+ * @param reason The reason that will be sent to the IMS application for why the SipDelegate
+ * is being destroyed.
+ */
+ public void sipDelegateDestroyed(int reason) {
+ logi("SipDelegate destroyed:" + reason);
+ mRegistrationStateOverride = -1;
+ try {
+ mAppStateCallback.onDestroyed(reason);
+ } catch (RemoteException e) {
+ logw("sipDelegateDestroyed: IMS application is dead: " + e);
+ }
+ }
+
+ /**
+ * The underlying SipDelegate has reported that its registration state has changed.
+ * @param registrationState The RegistrationState reported by the SipDelegate to be sent to the
+ * IMS application.
+ */
+ @Override
+ public void onRegistrationStateChanged(DelegateRegistrationState registrationState) {
+ if (mRegistrationStateOverride > DelegateRegistrationState.DEREGISTERED_REASON_UNKNOWN) {
+ logi("onRegistrationStateChanged: overriding registered state to "
+ + mRegistrationStateOverride);
+ registrationState = overrideRegistrationForDelegateChange(mRegistrationStateOverride,
+ registrationState);
+ }
+ if (registrationState.equals(mLastRegState)) {
+ logi("onRegistrationStateChanged: skipping notification, state is the same.");
+ return;
+ }
+ mLastRegState = registrationState;
+ logi("onRegistrationStateChanged: sending reg state " + registrationState);
+ try {
+ mAppStateCallback.onFeatureTagStatusChanged(registrationState, mDelegateDeniedTags);
+ } catch (RemoteException e) {
+ logw("onRegistrationStateChanged: IMS application is dead: " + e);
+ }
+ }
+
+ /**
+ * THe underlying SipDelegate has reported that the IMS configuration has changed.
+ * @param config The config to be sent to the IMS application.
+ */
+ @Override
+ public void onImsConfigurationChanged(SipDelegateImsConfiguration config) {
+ logi("onImsConfigurationChanged: Sending new IMS configuration.");
+ try {
+ mAppStateCallback.onImsConfigurationChanged(config);
+ } catch (RemoteException e) {
+ logw("onImsConfigurationChanged: IMS application is dead: " + e);
+ }
+ }
+
+ /** Write state about this tracker into the PrintWriter to be included in the dumpsys */
+ public void dump(PrintWriter printWriter) {
+ printWriter.println("Last reg state: " + mLastRegState);
+ printWriter.println("Denied tags: " + mDelegateDeniedTags);
+ printWriter.println("Most recent logs: ");
+ printWriter.println();
+ mLocalLog.dump(printWriter);
+ }
+
+ private DelegateRegistrationState overrideRegistrationForDelegateChange(
+ int registerOverrideReason, DelegateRegistrationState state) {
+ Set<String> registeredFeatures = state.getRegisteredFeatureTags();
+ DelegateRegistrationState.Builder overriddenState = new DelegateRegistrationState.Builder();
+ // keep other deregistering/deregistered tags the same.
+ for (FeatureTagState dereging : state.getDeregisteringFeatureTags()) {
+ overriddenState.addDeregisteringFeatureTag(dereging.getFeatureTag(),
+ dereging.getState());
+ }
+ for (FeatureTagState dereged : state.getDeregisteredFeatureTags()) {
+ overriddenState.addDeregisteredFeatureTag(dereged.getFeatureTag(),
+ dereged.getState());
+ }
+ // Override REGISTERED only
+ for (String ft : registeredFeatures) {
+ overriddenState.addDeregisteringFeatureTag(ft, registerOverrideReason);
+ }
+ return overriddenState.build();
+ }
+
+ private void notifySipDelegateCreated() {
+ try {
+ mAppStateCallback.onCreated(mLocalDelegateImpl);
+ } catch (RemoteException e) {
+ logw("notifySipDelegateCreated: IMS application is dead: " + e);
+ }
+ }
+
+ private void logi(String log) {
+ Log.i(SipTransportController.LOG_TAG, LOG_TAG + "[" + mSubId + "] " + log);
+ mLocalLog.log("[I] " + log);
+ }
+ private void logw(String log) {
+ Log.w(SipTransportController.LOG_TAG, LOG_TAG + "[" + mSubId + "] " + log);
+ mLocalLog.log("[W] " + log);
+ }
+}
diff --git a/src/com/android/services/telephony/rcs/MessageTransportStateTracker.java b/src/com/android/services/telephony/rcs/MessageTransportStateTracker.java
new file mode 100644
index 0000000..0691ae5
--- /dev/null
+++ b/src/com/android/services/telephony/rcs/MessageTransportStateTracker.java
@@ -0,0 +1,478 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import android.os.Binder;
+import android.os.RemoteException;
+import android.telephony.ims.DelegateMessageCallback;
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.SipMessage;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.telephony.ims.stub.SipDelegate;
+import android.util.LocalLog;
+import android.util.Log;
+
+import java.io.PrintWriter;
+import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+
+/**
+ * Tracks the SIP message path both from the IMS application to the SipDelegate and from the
+ * SipDelegate back to the IMS Application.
+ * <p>
+ * Responsibilities include:
+ * 1) Queue incoming and outgoing SIP messages and deliver to IMS application and SipDelegate in
+ * order. If there is an error delivering the message, notify the caller.
+ * 2) TODO Perform basic validation of outgoing messages.
+ * 3) TODO Record the status of ongoing SIP Dialogs and trigger the completion of pending
+ * consumers when they are finished or call closeDialog to clean up the SIP
+ * dialogs that did not complete within the allotted timeout time.
+ * <p>
+ * Note: This handles incoming binder calls, so all calls from other processes should be handled on
+ * the provided Executor.
+ */
+public class MessageTransportStateTracker implements DelegateBinderStateManager.StateCallback {
+ private static final String TAG = "MessageST";
+
+ /**
+ * Communicates the result of verifying whether a SIP message should be sent based on the
+ * contents of the SIP message as well as if the transport is in an available state for the
+ * intended recipient of the message.
+ */
+ private static class VerificationResult {
+ public static final VerificationResult SUCCESS = new VerificationResult();
+
+ /**
+ * If {@code true}, the requested SIP message has been verified to be sent to the remote. If
+ * {@code false}, the SIP message has failed verification and should not be sent to the
+ * result. The {@link #restrictedReason} field will contain the reason for the verification
+ * failure.
+ */
+ public final boolean isVerified;
+
+ /**
+ * The reason associated with why the SIP message was not verified and generated a
+ * {@code false} result for {@link #isVerified}.
+ */
+ public final int restrictedReason;
+
+ /**
+ * Communicates a verified result of success. Use {@link #SUCCESS} instead.
+ */
+ private VerificationResult() {
+ isVerified = true;
+ restrictedReason = SipDelegateManager.MESSAGE_FAILURE_REASON_UNKNOWN;
+ }
+
+ /**
+ * The result of verifying that the SIP Message should be sent.
+ * @param reason The reason associated with why the SIP message was not verified and
+ * generated a {@code false} result for {@link #isVerified}.
+ */
+ VerificationResult(@SipDelegateManager.MessageFailureReason int reason) {
+ isVerified = false;
+ restrictedReason = reason;
+ }
+ }
+
+ // SipDelegateConnection(IMS Application) -> SipDelegate(ImsService)
+ private final ISipDelegate.Stub mSipDelegateConnection = new ISipDelegate.Stub() {
+ /**
+ * The IMS application is acknowledging that it has successfully received and processed an
+ * incoming SIP message sent by the SipDelegate in
+ * {@link ISipDelegateMessageCallback#onMessageReceived(SipMessage)}.
+ */
+ @Override
+ public void notifyMessageReceived(String viaTransactionId) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> {
+ if (mSipDelegate == null) {
+ logw("notifyMessageReceived called when SipDelegate is not associated for "
+ + "transaction id: " + viaTransactionId);
+ return;
+ }
+ try {
+ // TODO track the SIP Dialogs created/destroyed on the associated
+ // SipDelegate.
+ mSipDelegate.notifyMessageReceived(viaTransactionId);
+ } catch (RemoteException e) {
+ logw("SipDelegate not available when notifyMessageReceived was called "
+ + "for transaction id: " + viaTransactionId);
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ /**
+ * The IMS application is acknowledging that it received an incoming SIP message sent by the
+ * SipDelegate in {@link ISipDelegateMessageCallback#onMessageReceived(SipMessage)} but it
+ * was unable to process it.
+ */
+ @Override
+ public void notifyMessageReceiveError(String viaTransactionId, int reason) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> {
+ if (mSipDelegate == null) {
+ logw("notifyMessageReceiveError called when SipDelegate is not associated "
+ + "for transaction id: " + viaTransactionId);
+ return;
+ }
+ try {
+ // TODO track the SIP Dialogs created/destroyed on the associated
+ // SipDelegate.
+ mSipDelegate.notifyMessageReceiveError(viaTransactionId, reason);
+ } catch (RemoteException e) {
+ logw("SipDelegate not available when notifyMessageReceiveError was called "
+ + "for transaction id: " + viaTransactionId);
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ /**
+ * The IMS application is sending an outgoing SIP message to the SipDelegate to be processed
+ * and sent over the network.
+ */
+ @Override
+ public void sendMessage(SipMessage sipMessage, long configVersion) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> {
+ VerificationResult result = verifyOutgoingMessage(sipMessage);
+ if (!result.isVerified) {
+ notifyDelegateSendError("Outgoing messages restricted", sipMessage,
+ result.restrictedReason);
+ return;
+ }
+ try {
+ // TODO track the SIP Dialogs created/destroyed on the associated
+ // SipDelegate.
+ mSipDelegate.sendMessage(sipMessage, configVersion);
+ logi("sendMessage: message sent - " + sipMessage + ", configVersion: "
+ + configVersion);
+ } catch (RemoteException e) {
+ notifyDelegateSendError("RemoteException: " + e, sipMessage,
+ SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_DEAD);
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ /**
+ * The SipDelegateConnection is requesting that the resources associated with an ongoing SIP
+ * dialog be released as the SIP dialog is now closed.
+ */
+ @Override
+ public void closeDialog(String callId) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> {
+ if (mSipDelegate == null) {
+ logw("closeDialog called when SipDelegate is not associated, callId: "
+ + callId);
+ return;
+ }
+ try {
+ // TODO track the SIP Dialogs created/destroyed on the associated
+ // SipDelegate.
+ mSipDelegate.closeDialog(callId);
+ } catch (RemoteException e) {
+ logw("SipDelegate not available when closeDialog was called "
+ + "for call id: " + callId);
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+ };
+
+ // SipDelegate(ImsService) -> SipDelegateConnection(IMS Application)
+ private final ISipDelegateMessageCallback.Stub mDelegateConnectionMessageCallback =
+ new ISipDelegateMessageCallback.Stub() {
+ /**
+ * An Incoming SIP Message has been received by the SipDelegate and is being routed
+ * to the IMS application for processing.
+ * <p>
+ * IMS application will call {@link ISipDelegate#notifyMessageReceived(String)} to
+ * acknowledge receipt of this incoming message.
+ */
+ @Override
+ public void onMessageReceived(SipMessage message) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> {
+ VerificationResult result = verifyIncomingMessage(message);
+ if (!result.isVerified) {
+ notifyAppReceiveError("Incoming messages restricted", message,
+ result.restrictedReason);
+ return;
+ }
+ try {
+ // TODO track the SIP Dialogs created/destroyed on the associated
+ // SipDelegate.
+ mAppCallback.onMessageReceived(message);
+ logi("onMessageReceived: received " + message);
+ } catch (RemoteException e) {
+ notifyAppReceiveError("RemoteException: " + e, message,
+ SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_DEAD);
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ /**
+ * An outgoing SIP message sent previously by the SipDelegateConnection to the SipDelegate
+ * using {@link ISipDelegate#sendMessage(SipMessage, int)} as been successfully sent.
+ */
+ @Override
+ public void onMessageSent(String viaTransactionId) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> {
+ if (mSipDelegate == null) {
+ logw("Unexpected state, onMessageSent called when SipDelegate is not "
+ + "associated");
+ }
+ try {
+ mAppCallback.onMessageSent(viaTransactionId);
+ } catch (RemoteException e) {
+ logw("Error sending onMessageSent to SipDelegateConnection, remote not"
+ + "available for transaction ID: " + viaTransactionId);
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ /**
+ * An outgoing SIP message sent previously by the SipDelegateConnection to the SipDelegate
+ * using {@link ISipDelegate#sendMessage(SipMessage, int)} failed to be sent.
+ */
+ @Override
+ public void onMessageSendFailure(String viaTransactionId, int reason) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> {
+ if (mSipDelegate == null) {
+ logw("Unexpected state, onMessageSendFailure called when SipDelegate is not"
+ + "associated");
+ }
+ try {
+ mAppCallback.onMessageSendFailure(viaTransactionId, reason);
+ } catch (RemoteException e) {
+ logw("Error sending onMessageSendFailure to SipDelegateConnection, remote"
+ + " not available for transaction ID: " + viaTransactionId);
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+ };
+
+ private final ISipDelegateMessageCallback mAppCallback;
+ private final Executor mExecutor;
+ private final int mSubId;
+ private final LocalLog mLocalLog = new LocalLog(SipTransportController.LOG_SIZE);
+
+ private ISipDelegate mSipDelegate;
+ private Consumer<Boolean> mPendingClosedConsumer;
+ private int mDelegateClosingReason = -1;
+ private int mDelegateClosedReason = -1;
+
+ public MessageTransportStateTracker(int subId, Executor executor,
+ ISipDelegateMessageCallback appMessageCallback) {
+ mSubId = subId;
+ mAppCallback = appMessageCallback;
+ mExecutor = executor;
+ }
+
+ @Override
+ public void onRegistrationStateChanged(DelegateRegistrationState registrationState) {
+ // TODO: integrate registration changes to SipMessage verification checks.
+ }
+
+ @Override
+ public void onImsConfigurationChanged(SipDelegateImsConfiguration config) {
+ // Not needed for this Tracker
+ }
+
+ /**
+ * Open the transport and allow SIP messages to be sent/received on the delegate specified.
+ * @param delegate The delegate connection to send SIP messages to on the ImsService.
+ * @param deniedFeatureTags Feature tags that have been denied. Outgoing SIP messages relating
+ * to these tags will be denied.
+ */
+ public void openTransport(ISipDelegate delegate, Set<FeatureTagState> deniedFeatureTags) {
+ mSipDelegate = delegate;
+ mDelegateClosingReason = -1;
+ mDelegateClosedReason = -1;
+ // TODO: integrate denied tags to SipMessage verification checks.
+ }
+
+ /** Dump state about this tracker that should be included in the dumpsys */
+ public void dump(PrintWriter printWriter) {
+ mLocalLog.dump(printWriter);
+ }
+
+ /**
+ * @return SipDelegate implementation to be sent to IMS application.
+ */
+ public ISipDelegate getDelegateConnection() {
+ return mSipDelegateConnection;
+ }
+
+ /**
+ * @return MessageCallback implementation to be sent to the ImsService.
+ */
+ public ISipDelegateMessageCallback getMessageCallback() {
+ return mDelegateConnectionMessageCallback;
+ }
+
+ /**
+ * Gradually close all SIP Dialogs by:
+ * 1) denying all new outgoing SIP Dialog requests with the reason specified and
+ * 2) only allowing existing SIP Dialogs to continue.
+ * <p>
+ * This will allow traffic to continue on existing SIP Dialogs until a BYE is sent and the
+ * SIP Dialogs are closed or a timeout is hit and {@link SipDelegate#closeDialog(String)} is
+ * forcefully called on all open SIP Dialogs.
+ * <p>
+ * Any outgoing out-of-dialog traffic on this transport will be denied with the provided reason.
+ * <p>
+ * Incoming out-of-dialog traffic will continue to be set up until the SipDelegate is fully
+ * closed.
+ * @param delegateClosingReason The reason code to return to
+ * {@link DelegateMessageCallback#onMessageSendFailure(String, int)} if a new out-of-dialog SIP
+ * message is received while waiting for existing Dialogs.
+ * @param closedReason reason to return to new outgoing SIP messages via
+ * {@link SipDelegate#notifyMessageReceiveError(String, int)} once the transport
+ * transitions to the fully closed state.
+ * @param resultConsumer The consumer called when the message transport has been closed. It will
+ * return {@code true} if the procedure completed successfully or {@link false} if the
+ * transport needed to be closed forcefully due to the application not responding before
+ * a timeout occurred.
+ */
+ public void closeGracefully(int delegateClosingReason, int closedReason,
+ Consumer<Boolean> resultConsumer) {
+ mDelegateClosingReason = delegateClosingReason;
+ mPendingClosedConsumer = resultConsumer;
+ mExecutor.execute(() -> {
+ // TODO: Track SIP Dialogs and complete when there are no SIP dialogs open anymore or
+ // the timeout occurs.
+ mPendingClosedConsumer.accept(true);
+ mPendingClosedConsumer = null;
+ closeTransport(closedReason);
+ });
+ }
+
+ /**
+ * Close all ongoing SIP Dialogs immediately and respond to any incoming/outgoing messages with
+ * the provided reason.
+ * @param closedReason The failure reason to provide to incoming/outgoing SIP messages
+ * if an attempt is made to send/receive a message after this method is called.
+ */
+ public void close(int closedReason) {
+ closeTransport(closedReason);
+ }
+
+ // Clean up all state related to the existing SipDelegate immediately.
+ private void closeTransport(int closedReason) {
+ // TODO: add logic to forcefully close open SIP dialogs once they are being tracked.
+ mSipDelegate = null;
+ if (mPendingClosedConsumer != null) {
+ mExecutor.execute(() -> {
+ logw("closeTransport: transport close forced with pending consumer.");
+ mPendingClosedConsumer.accept(false /*closedGracefully*/);
+ mPendingClosedConsumer = null;
+ });
+ }
+ mDelegateClosingReason = -1;
+ mDelegateClosedReason = closedReason;
+ }
+
+ private VerificationResult verifyOutgoingMessage(SipMessage message) {
+ if (mDelegateClosingReason > -1) {
+ return new VerificationResult(mDelegateClosingReason);
+ }
+ if (mDelegateClosedReason > -1) {
+ return new VerificationResult(mDelegateClosedReason);
+ }
+ if (mSipDelegate == null) {
+ logw("sendMessage called when SipDelegate is not associated." + message);
+ return new VerificationResult(SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_DEAD);
+ }
+ return VerificationResult.SUCCESS;
+ }
+
+ private VerificationResult verifyIncomingMessage(SipMessage message) {
+ // Do not restrict incoming based on closing reason.
+ if (mDelegateClosedReason > -1) {
+ return new VerificationResult(mDelegateClosedReason);
+ }
+ return VerificationResult.SUCCESS;
+ }
+
+ private void notifyDelegateSendError(String logReason, SipMessage message, int reasonCode) {
+ // TODO parse SipMessage header for viaTransactionId.
+ logw("Error sending SipMessage[id: " + null + ", code: " + reasonCode + "] -> SipDelegate "
+ + "for reason: " + logReason);
+ try {
+ mAppCallback.onMessageSendFailure(null, reasonCode);
+ } catch (RemoteException e) {
+ logw("notifyDelegateSendError, SipDelegate is not available: " + e);
+ }
+ }
+
+ private void notifyAppReceiveError(String logReason, SipMessage message, int reasonCode) {
+ // TODO parse SipMessage header for viaTransactionId.
+ logw("Error sending SipMessage[id: " + null + ", code: " + reasonCode + "] -> "
+ + "SipDelegateConnection for reason: " + logReason);
+ try {
+ mSipDelegate.notifyMessageReceiveError(null, reasonCode);
+ } catch (RemoteException e) {
+ logw("notifyAppReceiveError, SipDelegate is not available: " + e);
+ }
+ }
+
+ private void logi(String log) {
+ Log.w(SipTransportController.LOG_TAG, TAG + "[" + mSubId + "] " + log);
+ mLocalLog.log("[I] " + log);
+ }
+
+ private void logw(String log) {
+ Log.w(SipTransportController.LOG_TAG, TAG + "[" + mSubId + "] " + log);
+ mLocalLog.log("[W] " + log);
+ }
+}
diff --git a/src/com/android/services/telephony/rcs/RcsFeatureController.java b/src/com/android/services/telephony/rcs/RcsFeatureController.java
index 5094c57..304a74d 100644
--- a/src/com/android/services/telephony/rcs/RcsFeatureController.java
+++ b/src/com/android/services/telephony/rcs/RcsFeatureController.java
@@ -30,7 +30,7 @@
import android.util.Log;
import com.android.ims.FeatureConnector;
-import com.android.ims.IFeatureConnector;
+import com.android.ims.FeatureUpdates;
import com.android.ims.RcsFeatureManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.imsphone.ImsRegistrationCallbackHelper;
@@ -74,19 +74,25 @@
* Called when the feature should be destroyed.
*/
void onDestroy();
+
+ /**
+ * Called when a dumpsys is being generated for this RcsFeatureController for all Features
+ * to report their status.
+ */
+ void dump(PrintWriter pw);
}
/**
* Used to inject FeatureConnector instances for testing.
*/
@VisibleForTesting
- public interface FeatureConnectorFactory<T extends IFeatureConnector> {
+ public interface FeatureConnectorFactory<U extends FeatureUpdates> {
/**
- * @return a {@link FeatureConnector} associated for the given {@link IFeatureConnector}
- * and slot id.
+ * @return a {@link FeatureConnector} associated for the given {@link FeatureUpdates}
+ * and slot index.
*/
- FeatureConnector<T> create(Context context, int slotId,
- FeatureConnector.Listener<T> listener, Executor executor, String tag);
+ FeatureConnector<U> create(Context context, int slotIndex,
+ FeatureConnector.Listener<U> listener, Executor executor, String logPrefix);
}
/**
@@ -102,7 +108,8 @@
ImsRegistrationCallbackHelper.ImsRegistrationUpdate cb, Executor executor);
}
- private FeatureConnectorFactory<RcsFeatureManager> mFeatureFactory = FeatureConnector::new;
+ private FeatureConnectorFactory<RcsFeatureManager> mFeatureFactory =
+ RcsFeatureManager::getConnector;
private RegistrationHelperFactory mRegistrationHelperFactory =
ImsRegistrationCallbackHelper::new;
@@ -117,11 +124,6 @@
private FeatureConnector.Listener<RcsFeatureManager> mFeatureConnectorListener =
new FeatureConnector.Listener<RcsFeatureManager>() {
@Override
- public RcsFeatureManager getFeatureManager() {
- return new RcsFeatureManager(mContext, mSlotId);
- }
-
- @Override
public void connectionReady(RcsFeatureManager manager)
throws com.android.ims.ImsException {
if (manager == null) {
@@ -131,17 +133,21 @@
try {
// May throw ImsException if for some reason the connection to the
// ImsService is gone.
+ updateConnectionStatus(manager);
setupConnectionToService(manager);
} catch (ImsException e) {
+ updateConnectionStatus(null /*manager*/);
// Use deprecated Exception for compatibility.
throw new com.android.ims.ImsException(e.getMessage(),
ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
}
- updateConnectionStatus(manager);
}
@Override
- public void connectionUnavailable() {
+ public void connectionUnavailable(int reason) {
+ if (reason == FeatureConnector.UNAVAILABLE_REASON_SERVER_UNAVAILABLE) {
+ loge("unexpected - connectionUnavailable due to server unavailable");
+ }
// Call before disabling connection to manager.
removeConnectionToService();
updateConnectionStatus(null /*manager*/);
@@ -280,7 +286,7 @@
}
@VisibleForTesting
- public void setFeatureConnectorFactory(FeatureConnectorFactory factory) {
+ public void setFeatureConnectorFactory(FeatureConnectorFactory<RcsFeatureManager> factory) {
mFeatureFactory = factory;
}
@@ -427,6 +433,14 @@
pw.print("connected=");
synchronized (mLock) {
pw.println(mFeatureManager != null);
+ pw.println();
+ pw.println("RcsFeatureControllers:");
+ pw.increaseIndent();
+ for (Feature f : mFeatures.values()) {
+ f.dump(pw);
+ pw.println();
+ }
+ pw.decreaseIndent();
}
}
@@ -434,6 +448,10 @@
Log.w(LOG_TAG, getLogPrefix().append(log).toString());
}
+ private void loge(String log) {
+ Log.e(LOG_TAG, getLogPrefix().append(log).toString());
+ }
+
private StringBuilder getLogPrefix() {
StringBuilder sb = new StringBuilder("[");
sb.append(mSlotId);
diff --git a/src/com/android/services/telephony/rcs/SipDelegateBinderConnection.java b/src/com/android/services/telephony/rcs/SipDelegateBinderConnection.java
new file mode 100644
index 0000000..3f6f269
--- /dev/null
+++ b/src/com/android/services/telephony/rcs/SipDelegateBinderConnection.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.DelegateRequest;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.IImsRegistration;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.telephony.ims.aidl.ISipDelegateStateCallback;
+import android.telephony.ims.aidl.ISipTransport;
+import android.telephony.ims.stub.SipDelegate;
+import android.util.LocalLog;
+import android.util.Log;
+
+import java.io.PrintWriter;
+import java.util.Collections;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+/**
+ * Container for the active connection to the {@link SipDelegate} active on the ImsService.
+ * <p>
+ * New instances of this class will be created and destroyed new {@link SipDelegate}s are created
+ * and destroyed by the {@link SipDelegateController}.
+ */
+public class SipDelegateBinderConnection implements DelegateBinderStateManager,
+ IBinder.DeathRecipient {
+ private static final String LOG_TAG = "BinderConn";
+
+ protected final int mSubId;
+ protected final Set<FeatureTagState> mDeniedTags;
+ protected final Executor mExecutor;
+ protected final List<StateCallback> mStateCallbacks;
+
+ private final LocalLog mLocalLog = new LocalLog(SipTransportController.LOG_SIZE);
+
+ // Callback interface from ImsService to this Connection. State Events will be forwarded to IMS
+ // application through DelegateStateTracker.
+ private final ISipDelegateStateCallback mSipDelegateStateCallback =
+ new ISipDelegateStateCallback.Stub() {
+ @Override
+ public void onCreated(ISipDelegate delegate,
+ List<FeatureTagState> deniedFeatureTags) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() ->
+ notifySipDelegateCreated(delegate, deniedFeatureTags));
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void onFeatureTagRegistrationChanged(
+ DelegateRegistrationState registrationState) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> {
+ logi("onFeatureTagRegistrationChanged:" + registrationState);
+ for (StateCallback c : mStateCallbacks) {
+ c.onRegistrationStateChanged(registrationState);
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void onImsConfigurationChanged(
+ SipDelegateImsConfiguration registeredSipConfig) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> {
+ logi("onImsConfigurationChanged");
+ for (StateCallback c : mStateCallbacks) {
+ c.onImsConfigurationChanged(registeredSipConfig);
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void onDestroyed(int reason) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> notifySipDelegateDestroyed(reason));
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+ };
+
+ private final ISipTransport mSipTransport;
+ private final IImsRegistration mImsRegistration;
+ private final DelegateRequest mRequestedConfig;
+
+ private ISipDelegate mDelegateBinder;
+ private BiConsumer<ISipDelegate, Set<FeatureTagState>> mPendingCreatedConsumer;
+ private Consumer<Integer> mPendingDestroyedConsumer;
+
+ /**
+ * Create a new Connection object to manage the creation and destruction of a
+ * {@link SipDelegate}.
+ * @param subId The subid that this SipDelegate is being created for.
+ * @param sipTransport The SipTransport implementation that will be used to manage SipDelegates.
+ * @param registrationImpl The ImsRegistration implementation that will be used to manage
+ * registration changes in relation to the SipDelegates.
+ * @param requestedConfig The DelegateRequest to be sent to the ImsService.
+ * @param transportDeniedTags The feature tags that have already been denied by the
+ * SipTransportController and should not be requested.
+ * @param executor The Executor that all binder calls from the remote process will be executed
+ * on.
+ * @param stateCallbacks A list of callbacks that will each be called when the state of the
+ * SipDelegate changes. This will be called on the supplied executor.
+ */
+ public SipDelegateBinderConnection(int subId, ISipTransport sipTransport,
+ IImsRegistration registrationImpl, DelegateRequest requestedConfig,
+ Set<FeatureTagState> transportDeniedTags, Executor executor,
+ List<StateCallback> stateCallbacks) {
+ mSubId = subId;
+ mSipTransport = sipTransport;
+ mImsRegistration = registrationImpl;
+ mRequestedConfig = requestedConfig;
+ mDeniedTags = transportDeniedTags;
+ mExecutor = executor;
+ mStateCallbacks = stateCallbacks;
+ }
+
+ @Override
+ public boolean create(ISipDelegateMessageCallback cb,
+ BiConsumer<ISipDelegate, Set<FeatureTagState>> createdConsumer) {
+ try {
+ mSipTransport.createSipDelegate(mSubId, mRequestedConfig, mSipDelegateStateCallback,
+ cb);
+ mSipTransport.asBinder().linkToDeath(this, 0);
+ } catch (RemoteException e) {
+ logw("create called on unreachable SipTransport:" + e);
+ return false;
+ }
+ mPendingCreatedConsumer = createdConsumer;
+ return true;
+ }
+
+ @Override
+ public void destroy(int reason, Consumer<Integer> destroyedConsumer) {
+ mPendingDestroyedConsumer = destroyedConsumer;
+ try {
+ if (mDelegateBinder != null) {
+ mSipTransport.destroySipDelegate(mDelegateBinder, reason);
+ } else {
+ mExecutor.execute(() -> notifySipDelegateDestroyed(reason));
+ }
+ mStateCallbacks.clear();
+ } catch (RemoteException e) {
+ logw("destroy called on unreachable SipTransport:" + e);
+ mExecutor.execute(() -> notifySipDelegateDestroyed(reason));
+ }
+ try {
+ mSipTransport.asBinder().unlinkToDeath(this, 0);
+ } catch (NoSuchElementException e) {
+ logw("unlinkToDeath called on already unlinked binder" + e);
+ }
+ }
+
+ @Override
+ public void triggerFullNetworkRegistration(int sipCode, String sipReason) {
+ try {
+ mImsRegistration.triggerFullNetworkRegistration(sipCode, sipReason);
+ } catch (RemoteException e) {
+ logw("triggerFullNetworkRegistration called on unreachable ImsRegistration:" + e);
+ }
+ }
+
+ private void notifySipDelegateCreated(ISipDelegate delegate,
+ List<FeatureTagState> deniedFeatureTags) {
+ logi("Delegate Created: " + delegate + ", deniedTags:" + deniedFeatureTags);
+ if (delegate == null) {
+ logw("Invalid null delegate returned!");
+ }
+ mDelegateBinder = delegate;
+ // Add denied feature tags from SipDelegate to the ones denied by the transport
+ if (deniedFeatureTags != null) {
+ mDeniedTags.addAll(deniedFeatureTags);
+ }
+ if (mPendingCreatedConsumer == null) return;
+ mPendingCreatedConsumer.accept(delegate, mDeniedTags);
+ mPendingCreatedConsumer = null;
+ }
+
+ private void notifySipDelegateDestroyed(int reason) {
+ logi("Delegate Destroyed, reason: " + reason);
+ mDelegateBinder = null;
+ if (mPendingDestroyedConsumer == null) return;
+ mPendingDestroyedConsumer.accept(reason);
+ mPendingDestroyedConsumer = null;
+ }
+
+ /** Dump state about this binder connection that should be included in the dumpsys. */
+ public void dump(PrintWriter printWriter) {
+ mLocalLog.dump(printWriter);
+ }
+
+ protected final void logi(String log) {
+ Log.i(SipTransportController.LOG_TAG, LOG_TAG + "[" + mSubId + "] " + log);
+ mLocalLog.log("[I] " + log);
+ }
+
+ protected final void logw(String log) {
+ Log.w(SipTransportController.LOG_TAG, LOG_TAG + "[" + mSubId + "] " + log);
+ mLocalLog.log("[W] " + log);
+ }
+
+ @Override
+ public void binderDied() {
+ mExecutor.execute(() -> {
+ logw("binderDied!");
+ // Unblock any pending create/destroy operations.
+ // SipTransportController will handle the overall destruction/teardown.
+ notifySipDelegateCreated(null, Collections.emptyList());
+ notifySipDelegateDestroyed(SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD);
+ });
+ }
+}
diff --git a/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionStub.java b/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionStub.java
new file mode 100644
index 0000000..ef12eb8
--- /dev/null
+++ b/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionStub.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.telephony.ims.stub.SipDelegate;
+
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+/**
+ * Stub implementation used when a SipDelegate needs to be set up in specific cases, but there
+ * is no underlying implementation in the ImsService.
+ *
+ * This is used in cases where all of the requested feature tags were denied for various reasons
+ * from the SipTransportController. In this case, we will "connect", send a update to include the
+ * denied feature tags, and then do nothing until this stub is torn down.
+ */
+public class SipDelegateBinderConnectionStub implements DelegateBinderStateManager {
+ protected final Set<FeatureTagState> mDeniedTags;
+ protected final Executor mExecutor;
+ protected final List<StateCallback> mStateCallbacks;
+
+ /**
+ * Create a new Connection object to manage the creation and destruction of a
+ * {@link SipDelegate}.
+ * @param transportDeniedTags The feature tags that have already been denied by the
+ * SipTransportController and should not be requested.
+ * @param executor The Executor that all binder calls from the remote process will be executed
+ * on.
+ * @param stateCallbacks A list of callbacks that will each be called when the state of the
+ * SipDelegate changes. This will be called on the supplied executor.
+ */
+ public SipDelegateBinderConnectionStub(Set<FeatureTagState> transportDeniedTags,
+ Executor executor, List<StateCallback> stateCallbacks) {
+ mDeniedTags = transportDeniedTags;
+ mExecutor = executor;
+ mStateCallbacks = stateCallbacks;
+ }
+
+ @Override
+ public boolean create(ISipDelegateMessageCallback cb,
+ BiConsumer<ISipDelegate, Set<FeatureTagState>> createdConsumer) {
+ mExecutor.execute(() -> {
+ createdConsumer.accept(null, (mDeniedTags));
+ for (SipDelegateBinderConnection.StateCallback c: mStateCallbacks) {
+ c.onRegistrationStateChanged(new DelegateRegistrationState.Builder().build());
+ }
+ });
+ return true;
+ }
+
+ @Override
+ public void destroy(int reason, Consumer<Integer> destroyedConsumer) {
+ mExecutor.execute(() -> {
+ mStateCallbacks.clear();
+ destroyedConsumer.accept(reason);
+ });
+ }
+
+ @Override
+ public void triggerFullNetworkRegistration(int sipCode, String sipReason) {
+ // This stub is not connected to an ImsService, so this method is intentionally not
+ // implemented.
+ }
+}
diff --git a/src/com/android/services/telephony/rcs/SipDelegateController.java b/src/com/android/services/telephony/rcs/SipDelegateController.java
new file mode 100644
index 0000000..4b3176a
--- /dev/null
+++ b/src/com/android/services/telephony/rcs/SipDelegateController.java
@@ -0,0 +1,399 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.DelegateRequest;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateConnection;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.IImsRegistration;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateConnectionStateCallback;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.telephony.ims.aidl.ISipTransport;
+import android.telephony.ims.stub.DelegateConnectionStateCallback;
+import android.telephony.ims.stub.SipDelegate;
+import android.util.LocalLog;
+import android.util.Log;
+import android.util.Pair;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ScheduledExecutorService;
+
+/**
+ * Created when an IMS application wishes to open up a {@link SipDelegateConnection} and manages the
+ * resulting {@link SipDelegate} that may be created on the ImsService side.
+ */
+public class SipDelegateController {
+ static final String LOG_TAG = "SipDelegateC";
+
+ private class BinderConnectionFactory implements DelegateBinderStateManager.Factory {
+
+ private final ISipTransport mSipTransportImpl;
+ private final IImsRegistration mImsRegistrationImpl;
+
+ BinderConnectionFactory(ISipTransport transport, IImsRegistration registration) {
+ mSipTransportImpl = transport;
+ mImsRegistrationImpl = registration;
+ }
+
+ @Override
+ public DelegateBinderStateManager create(int subId,
+ DelegateRequest requestedConfig, Set<FeatureTagState> transportDeniedTags,
+ Executor executor, List<DelegateBinderStateManager.StateCallback> stateCallbacks) {
+ // We should not actually create a SipDelegate in this case.
+ if (requestedConfig.getFeatureTags().isEmpty()) {
+ return new SipDelegateBinderConnectionStub(transportDeniedTags, executor,
+ stateCallbacks);
+ }
+ return new SipDelegateBinderConnection(mSubId, mSipTransportImpl, mImsRegistrationImpl,
+ requestedConfig, transportDeniedTags, mExecutorService, stateCallbacks);
+ }
+ }
+
+ private final int mSubId;
+ private final String mPackageName;
+ private final DelegateRequest mInitialRequest;
+ private final ScheduledExecutorService mExecutorService;
+ private final MessageTransportStateTracker mMessageTransportStateTracker;
+ private final DelegateStateTracker mDelegateStateTracker;
+ private final DelegateBinderStateManager.Factory mBinderConnectionFactory;
+ private final LocalLog mLocalLog = new LocalLog(SipTransportController.LOG_SIZE);
+
+ private DelegateBinderStateManager mBinderConnection;
+ private Set<String> mTrackedFeatureTags;
+
+ public SipDelegateController(int subId, DelegateRequest initialRequest, String packageName,
+ ISipTransport transportImpl, IImsRegistration registrationImpl,
+ ScheduledExecutorService executorService,
+ ISipDelegateConnectionStateCallback stateCallback,
+ ISipDelegateMessageCallback messageCallback) {
+ mSubId = subId;
+ mPackageName = packageName;
+ mInitialRequest = initialRequest;
+ mExecutorService = executorService;
+ mBinderConnectionFactory = new BinderConnectionFactory(transportImpl, registrationImpl);
+
+ mMessageTransportStateTracker = new MessageTransportStateTracker(mSubId, executorService,
+ messageCallback);
+ mDelegateStateTracker = new DelegateStateTracker(mSubId, stateCallback,
+ mMessageTransportStateTracker.getDelegateConnection());
+ }
+
+ /**
+ * Inject dependencies for testing only.
+ */
+ @VisibleForTesting
+ public SipDelegateController(int subId, DelegateRequest initialRequest, String packageName,
+ ScheduledExecutorService executorService,
+ MessageTransportStateTracker messageTransportStateTracker,
+ DelegateStateTracker delegateStateTracker,
+ DelegateBinderStateManager.Factory connectionFactory) {
+ mSubId = subId;
+ mInitialRequest = initialRequest;
+ mPackageName = packageName;
+ mExecutorService = executorService;
+ mMessageTransportStateTracker = messageTransportStateTracker;
+ mDelegateStateTracker = delegateStateTracker;
+ mBinderConnectionFactory = connectionFactory;
+ }
+
+ /**
+ * @return The InitialRequest from the IMS application. The feature tags that are actually set
+ * up may differ from this request based on the state of this controller.
+ */
+ public DelegateRequest getInitialRequest() {
+ return mInitialRequest;
+ }
+
+ /**
+ * @return The package name of the IMS application associated with this SipDelegateController.
+ */
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ public ISipDelegate getSipDelegateInterface() {
+ return mMessageTransportStateTracker.getDelegateConnection();
+ }
+
+ /**
+ * Create the underlying SipDelegate.
+ * <p>
+ * This may not happen instantly, The CompletableFuture returned will not complete until
+ * {@link DelegateConnectionStateCallback#onCreated(SipDelegateConnection)} is called by the
+ * SipDelegate or DelegateStateTracker state is updated in the case that all requested features
+ * were denied.
+ * @return A CompletableFuture that will complete once the SipDelegate has been created. If true
+ * is returned, the SipDelegate has been created successfully. If false, the ImsService is not
+ * reachable and the process should be aborted.
+ */
+ public CompletableFuture<Boolean> create(Set<String> supportedSet,
+ Set<FeatureTagState> deniedSet) {
+ logi("create, supported: " + supportedSet + ", denied: " + deniedSet);
+ mTrackedFeatureTags = supportedSet;
+ DelegateBinderStateManager connection =
+ createBinderConnection(supportedSet, deniedSet);
+ CompletableFuture<Pair<ISipDelegate, Set<FeatureTagState>>> pendingCreate =
+ createSipDelegate(connection);
+ // May need to implement special case handling where SipDelegate denies all in supportedSet,
+ // however that should be a very rare case. For now, if that happens, just keep the
+ // SipDelegate bound.
+ // use thenApply here because we need this to happen on the same thread that it was called
+ // on in order to ensure ordering of onCreated being called, followed by registration
+ // state changed. If not, this is subject to race conditions where registered is queued
+ // before the async processing of this future.
+ return pendingCreate.thenApply((resultPair) -> {
+ if (resultPair == null) {
+ logw("create: resultPair returned null");
+ return false;
+ }
+ mBinderConnection = connection;
+ logi("create: created, delegate denied: " + resultPair.second);
+ mMessageTransportStateTracker.openTransport(resultPair.first, resultPair.second);
+ mDelegateStateTracker.sipDelegateConnected(resultPair.second);
+ return true;
+ });
+ }
+
+ /**
+ * Modify the SipTransport to reflect the new Feature Tag set that the IMS application has
+ * access to.
+ * <p>
+ * This involves the following operations if the new supported tag set does not match the
+ * the existing set:
+ * 1) destroy the existing underlying SipDelegate. If there are SIP Dialogs that are active
+ * on the SipDelegate that is pending to be destroyed, we must move the feature tags into a
+ * deregistering state via
+ * {@link DelegateRegistrationState#DEREGISTERING_REASON_FEATURE_TAGS_CHANGING} to signal to the
+ * IMS application to close all dialogs before the operation can proceed. If any outgoing
+ * out-of-dialog messages are sent at this time, they will also fail with reason
+ * {@link SipDelegateManager#MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION}.
+ * 2) create a new underlying SipDelegate and notify trackers, allowing the transport to
+ * re-open.
+ * @param newSupportedSet The new supported set of feature tags that the SipDelegate should
+ * be opened for.
+ * @param deniedSet The new set of tags that have been denied as well as the reason for the
+ * denial to be reported back to the IMS Application.
+ * @return A CompletableFuture containing the pending operation that will change the supported
+ * feature tags. Any operations to change the supported feature tags of the associated
+ * SipDelegate after this should not happen until this pending operation completes. Will
+ * complete with {@code true} if the operation was successful or {@code false} if the
+ * IMS service was unreachable.
+ */
+ public CompletableFuture<Boolean> changeSupportedFeatureTags(Set<String> newSupportedSet,
+ Set<FeatureTagState> deniedSet) {
+ logi("Received feature tag set change, old: [" + mTrackedFeatureTags + "], new: "
+ + newSupportedSet + ",denied: [" + deniedSet + "]");
+ if (mTrackedFeatureTags != null && mTrackedFeatureTags.equals(newSupportedSet)) {
+ logi("changeSupportedFeatureTags: no change, returning");
+ return CompletableFuture.completedFuture(true);
+ }
+
+ mTrackedFeatureTags = newSupportedSet;
+ // Next perform the destroy operation.
+ CompletableFuture<Integer> pendingDestroy = destroySipDelegate(false/*force*/,
+ SipDelegateManager.MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION,
+ SipDelegateManager.MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION,
+ DelegateRegistrationState.DEREGISTERING_REASON_FEATURE_TAGS_CHANGING,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+
+ // Next perform the create operation with the new set of supported feature tags.
+ return pendingDestroy.thenComposeAsync((reasonFromService) -> {
+ logi("changeSupportedFeatureTags: destroy stage complete, reason reported: "
+ + reasonFromService);
+ return create(newSupportedSet, deniedSet);
+ }, mExecutorService);
+ }
+
+ /**
+ * Destroy this SipDelegate. This controller should be disposed of after this method is
+ * called.
+ * <p>
+ * This may not happen instantly if there are SIP Dialogs that are active on this SipDelegate.
+ * In this case, the CompletableFuture will not complete until
+ * {@link DelegateConnectionStateCallback#onDestroyed(int)} is called by the SipDelegate.
+ * @param force If set true, we will close the transport immediately and call
+ * {@link SipDelegate#closeDialog(String)} on any open dialogs. If false, we will wait for the
+ * SIP Dialogs to close or the close timer to timeout before destroying the underlying
+ * SipDelegate.
+ * @param destroyReason The reason for why this SipDelegate is being destroyed.
+ * @return A CompletableFuture that will complete once the SipDelegate has been destroyed.
+ */
+ public CompletableFuture<Integer> destroy(boolean force, int destroyReason) {
+ logi("destroy, forced " + force + ", destroyReason: " + destroyReason);
+
+ CompletableFuture<Integer> pendingOperationComplete =
+ destroySipDelegate(force, SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_CLOSED,
+ getMessageFailReasonFromDestroyReason(destroyReason),
+ DelegateRegistrationState.DEREGISTERING_REASON_DESTROY_PENDING,
+ destroyReason);
+ return pendingOperationComplete.thenApplyAsync((reasonFromDelegate) -> {
+ logi("destroy, operation complete, notifying trackers, reason" + reasonFromDelegate);
+ mDelegateStateTracker.sipDelegateDestroyed(reasonFromDelegate);
+ return reasonFromDelegate;
+ }, mExecutorService);
+ };
+
+ /**
+ * The IMS application is notifying the ImsService that it has received a response to a request
+ * that will require that the IMS registration be torn down and brought back up.
+ *<p>
+ * See {@link SipDelegateManager#triggerFullNetworkRegistration} for more information.
+ */
+ public void triggerFullNetworkRegistration(int sipCode, String sipReason) {
+ logi("triggerFullNetworkRegistration, code=" + sipCode + ", reason=" + sipReason);
+ if (mBinderConnection != null) {
+ mBinderConnection.triggerFullNetworkRegistration(sipCode, sipReason);
+ } else {
+ logw("triggerFullNetworkRegistration called when binder connection is null");
+ }
+ }
+
+ private static int getMessageFailReasonFromDestroyReason(int destroyReason) {
+ switch (destroyReason) {
+ case SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD:
+ return SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_DEAD;
+ case SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP:
+ case SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_USER_DISABLED_RCS:
+ return SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_CLOSED;
+ default:
+ return SipDelegateManager.MESSAGE_FAILURE_REASON_UNKNOWN;
+ }
+ }
+
+ /**
+ * @param force If set true, we will close the transport immediately and call
+ * {@link SipDelegate#closeDialog(String)} on any open dialogs. If false, we will wait for the
+ * SIP Dialogs to close or the close timer to timeout before destroying the underlying
+ * SipDelegate.
+ * @param messageDestroyingReason The reason to send back to the IMS application in the case
+ * that a new outgoing SIP message is sent that is out-of-dialog while the message
+ * transport is closing.
+ * @param messageDestroyedReason The reason to send back to the IMS application in the case
+ * that a new outgoing SIP message is sent once the underlying transport is closed.
+ * @param deregisteringReason The deregistering state reported to the IMS application for all
+ * registered feature tags.
+ * @param delegateDestroyedReason The reason to send to the underlying SipDelegate that is being
+ * destroyed.
+ * @return A CompletableFuture containing the reason from the SipDelegate for why it was
+ * destroyed.
+ */
+ private CompletableFuture<Integer> destroySipDelegate(boolean force,
+ int messageDestroyingReason, int messageDestroyedReason, int deregisteringReason,
+ int delegateDestroyedReason) {
+ if (mBinderConnection == null) {
+ logi("destroySipDelegate, called when binder connection is already null");
+ return CompletableFuture.completedFuture(delegateDestroyedReason);
+ }
+ // First, bring down the message transport.
+ CompletableFuture<Boolean> pendingTransportClosed = new CompletableFuture<>();
+ if (force) {
+ logi("destroySipDelegate, forced");
+ mMessageTransportStateTracker.close(messageDestroyedReason);
+ pendingTransportClosed.complete(true);
+ } else {
+ mMessageTransportStateTracker.closeGracefully(messageDestroyingReason,
+ messageDestroyedReason, pendingTransportClosed::complete);
+ }
+
+ // Do not send an intermediate pending state to app if there are no open SIP dialogs to
+ // worry about.
+ if (!pendingTransportClosed.isDone()) {
+ mDelegateStateTracker.sipDelegateChanging(deregisteringReason);
+ } else {
+ logi("destroySipDelegate, skip DEREGISTERING_REASON_DESTROY_PENDING");
+ }
+
+ // Next, destroy the SipDelegate.
+ return pendingTransportClosed.thenComposeAsync((wasGraceful) -> {
+ logi("destroySipDelegate, transport gracefully closed = " + wasGraceful);
+ CompletableFuture<Integer> pendingDestroy = new CompletableFuture<>();
+ mBinderConnection.destroy(delegateDestroyedReason, pendingDestroy::complete);
+ return pendingDestroy;
+ }, mExecutorService);
+ }
+
+ /**
+ * @return a CompletableFuture that returns a Pair containing SipDelegate Binder interface as
+ * well as rejected feature tags or a {@code null} Pair instance if the ImsService is not
+ * available.
+ */
+ private CompletableFuture<Pair<ISipDelegate, Set<FeatureTagState>>> createSipDelegate(
+ DelegateBinderStateManager connection) {
+ CompletableFuture<Pair<ISipDelegate, Set<FeatureTagState>>> createdFuture =
+ new CompletableFuture<>();
+ boolean isStarted = connection.create(mMessageTransportStateTracker.getMessageCallback(),
+ (delegate, delegateDeniedTags) ->
+ createdFuture.complete(new Pair<>(delegate, delegateDeniedTags)));
+ if (!isStarted) {
+ logw("Couldn't create binder connection, ImsService is not available.");
+ connection.destroy(SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD, null);
+ return CompletableFuture.completedFuture(null);
+ }
+ return createdFuture;
+ }
+
+ private DelegateBinderStateManager createBinderConnection(Set<String> supportedSet,
+ Set<FeatureTagState> deniedSet) {
+
+ List<DelegateBinderStateManager.StateCallback> stateCallbacks = new ArrayList<>(2);
+ stateCallbacks.add(mDelegateStateTracker);
+ stateCallbacks.add(mMessageTransportStateTracker);
+
+ return mBinderConnectionFactory.create(mSubId,
+ new DelegateRequest(supportedSet), deniedSet, mExecutorService, stateCallbacks);
+ }
+
+ /**
+ * Write the current state of this controller in String format using the PrintWriter provided
+ * for dumpsys.
+ */
+ public void dump(PrintWriter printWriter) {
+ IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, " ");
+ pw.println("SipDelegateController" + "[" + mSubId + "]:");
+ pw.increaseIndent();
+ pw.println("DelegateStateTracker:");
+ pw.increaseIndent();
+ mDelegateStateTracker.dump(printWriter);
+ pw.decreaseIndent();
+ pw.println("MessageStateTracker:");
+ pw.increaseIndent();
+ mMessageTransportStateTracker.dump(printWriter);
+ pw.decreaseIndent();
+ pw.decreaseIndent();
+ }
+
+ private void logi(String log) {
+ Log.w(SipTransportController.LOG_TAG, LOG_TAG + "[" + mSubId + "] " + log);
+ mLocalLog.log("[I] " + log);
+ }
+
+ private void logw(String log) {
+ Log.w(SipTransportController.LOG_TAG, LOG_TAG + "[" + mSubId + "] " + log);
+ mLocalLog.log("[W] " + log);
+ }
+}
diff --git a/src/com/android/services/telephony/rcs/SipTransportController.java b/src/com/android/services/telephony/rcs/SipTransportController.java
new file mode 100644
index 0000000..028e49f
--- /dev/null
+++ b/src/com/android/services/telephony/rcs/SipTransportController.java
@@ -0,0 +1,972 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import android.app.role.OnRoleHoldersChangedListener;
+import android.app.role.RoleManager;
+import android.content.Context;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.telephony.ims.DelegateRequest;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.ImsService;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.IImsRegistration;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateConnectionStateCallback;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.telephony.ims.aidl.ISipTransport;
+import android.telephony.ims.stub.DelegateConnectionMessageCallback;
+import android.telephony.ims.stub.DelegateConnectionStateCallback;
+import android.telephony.ims.stub.SipDelegate;
+import android.text.TextUtils;
+import android.util.ArraySet;
+import android.util.LocalLog;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.android.ims.RcsFeatureManager;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
+
+import com.google.common.base.Objects;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+/**
+ * Manages the creation and destruction of SipDelegates in response to an IMS application requesting
+ * a SipDelegateConnection registered to one or more IMS feature tags.
+ * <p>
+ * This allows an IMS application to forward traffic related to those feature tags over the existing
+ * IMS registration managed by the {@link ImsService} associated with this cellular subscription
+ * instead of requiring that the IMS application manage its own IMS registration over-the-top. This
+ * is required for some cellular carriers, which mandate that all IMS SIP traffic must be sent
+ * through a single IMS registration managed by the system IMS service.
+ *
+ * //TODO: Support other roles besides SMS
+ * //TODO: Bring in carrier provisioning to influence features that can be created.
+ * //TODO: Generate registration change events.
+ */
+public class SipTransportController implements RcsFeatureController.Feature,
+ OnRoleHoldersChangedListener {
+ static final int LOG_SIZE = 50;
+ static final String LOG_TAG = "SipTransportC";
+
+ /**See {@link TimerAdapter#getReevaluateThrottleTimerMilliseconds()}.*/
+ private static final int REEVALUATE_THROTTLE_DEFAULT_MS = 1000;
+ /**See {@link TimerAdapter#getUpdateRegistrationDelayMilliseconds()}.*/
+ private static final int TRIGGER_UPDATE_REGISTRATION_DELAY_DEFAULT_MS = 1000;
+
+ /**
+ * {@link RoleManager} is final so we have to wrap the implementation for testing.
+ */
+ @VisibleForTesting
+ public interface RoleManagerAdapter {
+ /** See {@link RoleManager#getRoleHolders(String)} */
+ List<String> getRoleHolders(String roleName);
+ /** See {@link RoleManager#addOnRoleHoldersChangedListenerAsUser} */
+ void addOnRoleHoldersChangedListenerAsUser(Executor executor,
+ OnRoleHoldersChangedListener listener, UserHandle user);
+ /** See {@link RoleManager#removeOnRoleHoldersChangedListenerAsUser} */
+ void removeOnRoleHoldersChangedListenerAsUser(OnRoleHoldersChangedListener listener,
+ UserHandle user);
+ }
+
+ /**
+ * Adapter for timers related to this class so they can be modified during testing.
+ */
+ @VisibleForTesting
+ public interface TimerAdapter {
+ /**
+ * Time we will delay after a {@link #createSipDelegate} or {@link #destroySipDelegate}
+ * command to re-evaluate and apply any changes to the list of tracked
+ * SipDelegateControllers.
+ * <p>
+ * Another create/destroy request sent during this time will not postpone re-evaluation
+ * again.
+ */
+ int getReevaluateThrottleTimerMilliseconds();
+
+ /**
+ * Time after re-evaluate we will wait to trigger the update of IMS registration.
+ * <p>
+ * Another re-evaluate while waiting to trigger a registration update will cause this
+ * controller to cancel and reschedule the event again, further delaying the trigger to send
+ * a registration update.
+ */
+ int getUpdateRegistrationDelayMilliseconds();
+ }
+
+ private static class TimerAdapterImpl implements TimerAdapter {
+
+ @Override
+ public int getReevaluateThrottleTimerMilliseconds() {
+ return REEVALUATE_THROTTLE_DEFAULT_MS;
+ }
+
+ @Override
+ public int getUpdateRegistrationDelayMilliseconds() {
+ return TRIGGER_UPDATE_REGISTRATION_DELAY_DEFAULT_MS;
+ }
+ }
+
+ private static class RoleManagerAdapterImpl implements RoleManagerAdapter {
+
+ private final RoleManager mRoleManager;
+
+ private RoleManagerAdapterImpl(Context context) {
+ mRoleManager = context.getSystemService(RoleManager.class);
+ }
+
+ @Override
+ public List<String> getRoleHolders(String roleName) {
+ return mRoleManager.getRoleHolders(roleName);
+ }
+
+ @Override
+ public void addOnRoleHoldersChangedListenerAsUser(Executor executor,
+ OnRoleHoldersChangedListener listener, UserHandle user) {
+ mRoleManager.addOnRoleHoldersChangedListenerAsUser(executor, listener, user);
+ }
+
+ @Override
+ public void removeOnRoleHoldersChangedListenerAsUser(OnRoleHoldersChangedListener listener,
+ UserHandle user) {
+ mRoleManager.removeOnRoleHoldersChangedListenerAsUser(listener, user);
+ }
+ }
+
+ /**
+ * Used in {@link #destroySipDelegate(int, ISipDelegate, int)} to store pending destroy
+ * requests.
+ */
+ private static final class DestroyRequest {
+ public final SipDelegateController controller;
+ public final int reason;
+
+ DestroyRequest(SipDelegateController c, int r) {
+ controller = c;
+ reason = r;
+ }
+
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ DestroyRequest that = (DestroyRequest) o;
+ return reason == that.reason
+ && controller.equals(that.controller);
+ }
+
+ @Override
+ public int hashCode() {
+ return java.util.Objects.hash(controller, reason);
+ }
+
+ @Override
+ public String toString() {
+ return "DestroyRequest{" + "controller=" + controller + ", reason=" + reason + '}';
+ }
+ }
+
+ /**
+ * Allow the ability for tests to easily mock out the SipDelegateController for testing.
+ */
+ @VisibleForTesting
+ public interface SipDelegateControllerFactory {
+ /** See {@link SipDelegateController} */
+ SipDelegateController create(int subId, DelegateRequest initialRequest, String packageName,
+ ISipTransport sipTransportImpl, IImsRegistration registrationImpl,
+ ScheduledExecutorService executorService,
+ ISipDelegateConnectionStateCallback stateCallback,
+ ISipDelegateMessageCallback messageCallback);
+ }
+
+ private SipDelegateControllerFactory mDelegateControllerFactory = SipDelegateController::new;
+ private final int mSlotId;
+ private final ScheduledExecutorService mExecutorService;
+ private final RoleManagerAdapter mRoleManagerAdapter;
+ private final TimerAdapter mTimerAdapter;
+ private final LocalLog mLocalLog = new LocalLog(LOG_SIZE);
+
+ // A priority queue of active SipDelegateControllers, where the oldest SipDelegate gets
+ // access to the feature tag if multiple apps are allowed to request the same feature tag.
+ private final List<SipDelegateController> mDelegatePriorityQueue = new ArrayList<>();
+ // SipDelegateControllers who have been created and are pending to be added to the priority
+ // queue. Will be added into the queue in the same order as they were added here.
+ private final List<SipDelegateController> mDelegatePendingCreate = new ArrayList<>();
+ // SipDelegateControllers that are pending to be destroyed.
+ private final List<DestroyRequest> mDelegatePendingDestroy = new ArrayList<>();
+
+ // Future scheduled for operations that require the list of SipDelegateControllers to
+ // be evaluated. When the timer expires and triggers the reevaluate method, this controller
+ // will iterate through mDelegatePriorityQueue and assign Feature Tags based on role+priority.
+ private ScheduledFuture<?> mScheduledEvaluateFuture;
+ // mPendingEvaluateFTFuture creates this CompletableFuture, exposed in order to stop other
+ // evaluates from occurring while another is waiting for a result on other threads.
+ private CompletableFuture<Void> mEvaluateCompleteFuture;
+ // Future scheduled that will trigger the ImsService to update the IMS registration for the
+ // SipDelegate configuration. Will be scheduled TRIGGER_UPDATE_REGISTRATION_DELAY_MS
+ // milliseconds after a pending evaluate completes.
+ private ScheduledFuture<?> mPendingUpdateRegistrationFuture;
+ // Subscription id will change as new subscriptions are loaded on the slot.
+ private int mSubId;
+ // Will go up/down as the ImsService associated with this slotId goes up/down.
+ private RcsFeatureManager mRcsManager;
+ // Cached package name of the app that is considered the default SMS app.
+ private String mCachedSmsRolePackageName = "";
+
+ /**
+ * Create an instance of SipTransportController.
+ * @param context The Context associated with this controller.
+ * @param slotId The slot index associated with this controller.
+ * @param subId The subscription ID associated with this controller when it was first created.
+ */
+ public SipTransportController(Context context, int slotId, int subId) {
+ mSlotId = slotId;
+ mSubId = subId;
+
+ mRoleManagerAdapter = new RoleManagerAdapterImpl(context);
+ mTimerAdapter = new TimerAdapterImpl();
+ mExecutorService = Executors.newSingleThreadScheduledExecutor();
+ }
+
+ /**
+ * Constructor to inject dependencies for testing.
+ */
+ @VisibleForTesting
+ public SipTransportController(Context context, int slotId, int subId,
+ SipDelegateControllerFactory delegateFactory, RoleManagerAdapter roleManagerAdapter,
+ TimerAdapter timerAdapter, ScheduledExecutorService executor) {
+ mSlotId = slotId;
+ mSubId = subId;
+
+ mRoleManagerAdapter = roleManagerAdapter;
+ mTimerAdapter = timerAdapter;
+ mDelegateControllerFactory = delegateFactory;
+ mExecutorService = executor;
+ logi("created");
+ }
+
+ @Override
+ public void onRcsConnected(RcsFeatureManager manager) {
+ mExecutorService.submit(() -> onRcsManagerChanged(manager));
+ }
+
+ @Override
+ public void onRcsDisconnected() {
+ mExecutorService.submit(() -> onRcsManagerChanged(null));
+ }
+
+ @Override
+ public void onAssociatedSubscriptionUpdated(int subId) {
+ mExecutorService.submit(()-> onSubIdChanged(subId));
+ }
+
+ @Override
+ public void onDestroy() {
+ mExecutorService.submit(()-> {
+ // Ensure new create/destroy requests are denied.
+ mSubId = -1;
+ triggerDeregistrationEvent();
+ scheduleDestroyDelegates(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN)
+ .thenRun(mExecutorService::shutdown);
+ });
+ }
+
+ /**
+ * Optionally create a new {@link SipDelegate} based off of the {@link DelegateRequest} given
+ * based on the state of this controller and associate it with the given callbacks.
+ * <p>
+ * Once the {@link SipDelegate} has been created,
+ * {@link ISipDelegateConnectionStateCallback#onCreated(ISipDelegate)} must be called with
+ * the AIDL instance corresponding to the remote {@link SipDelegate}.
+ * @param subId the subId associated with the request.
+ * @param request The request parameters used to create the {@link SipDelegate}.
+ * @param delegateState The {@link DelegateConnectionStateCallback} Binder connection.
+ * @param delegateMessage The {@link DelegateConnectionMessageCallback} Binder Connection
+ * @throws ImsException if the request to create the {@link SipDelegate} did not complete.
+ */
+ public void createSipDelegate(int subId, DelegateRequest request, String packageName,
+ ISipDelegateConnectionStateCallback delegateState,
+ ISipDelegateMessageCallback delegateMessage) throws ImsException {
+ logi("createSipDelegate: request= " + request + ", packageName= " + packageName);
+ CompletableFuture<ImsException> result = new CompletableFuture<>();
+ mExecutorService.submit(() -> createSipDelegateInternal(subId, request, packageName,
+ delegateState,
+ // Capture any ImsExceptions generated during the process.
+ delegateMessage, result::complete));
+ try {
+ ImsException e = result.get();
+ logi("createSipDelegate: request finished");
+ if (e != null) {
+ throw e;
+ }
+ } catch (InterruptedException | ExecutionException e) {
+ logw("createSipDelegate: exception completing future: " + e);
+ }
+ }
+
+ /**
+ * The remote IMS application has requested the destruction of an existing {@link SipDelegate}.
+ * @param subId The subId associated with the request.
+ * @param connection The internal Binder connection associated with the {@link SipDelegate}.
+ * @param reason The reason for why the {@link SipDelegate} was destroyed.
+ */
+ public void destroySipDelegate(int subId, ISipDelegate connection, int reason) {
+ mExecutorService.execute(() -> destroySipDelegateInternal(subId, connection, reason));
+ }
+
+ /**
+ * The remote IMS application has requested that the ImsService tear down and re-register for
+ * IMS features due to an error it received on the network in response to a SIP request.
+ */
+ public void triggerFullNetworkRegistration(int subId, ISipDelegate connection, int sipCode,
+ String sipReason) {
+ mExecutorService.execute(() -> triggerFullNetworkRegistrationInternal(subId, connection,
+ sipCode, sipReason));
+ }
+
+ /**
+ * @return Whether or not SipTransports are supported on the connected ImsService. This can
+ * change based on the capabilities of the ImsService.
+ * @throws ImsException if the ImsService connected to this controller is currently down.
+ */
+ public boolean isSupported(int subId) throws ImsException {
+ Boolean result = waitForMethodToComplete(() -> isSupportedInternal(subId));
+ if (result == null) {
+ logw("isSupported, unexpected null result, returning false");
+ return false;
+ }
+ return result;
+ }
+
+ private void createSipDelegateInternal(int subId, DelegateRequest request, String packageName,
+ ISipDelegateConnectionStateCallback delegateState,
+ ISipDelegateMessageCallback delegateMessage,
+ Consumer<ImsException> startedErrorConsumer) {
+ ISipTransport transport;
+ IImsRegistration registration;
+ // Send back any errors via Consumer early in creation process if it is clear that the
+ // SipDelegate will never be created.
+ try {
+ checkStateOfController(subId);
+ transport = mRcsManager.getSipTransport();
+ registration = mRcsManager.getImsRegistration();
+ if (transport == null) {
+ logw("createSipDelegateInternal, transport null during request.");
+ startedErrorConsumer.accept(new ImsException("SipTransport not supported",
+ ImsException.CODE_ERROR_UNSUPPORTED_OPERATION));
+ return;
+ } else {
+ // Release the binder thread as there were no issues processing the initial request.
+ startedErrorConsumer.accept(null);
+ }
+ } catch (ImsException e) {
+ logw("createSipDelegateInternal, ImsException during create: " + e);
+ startedErrorConsumer.accept(e);
+ return;
+ }
+
+ SipDelegateController c = mDelegateControllerFactory.create(subId, request, packageName,
+ transport, registration, mExecutorService, delegateState, delegateMessage);
+ logi("createSipDelegateInternal: request= " + request + ", packageName= " + packageName
+ + ", controller created: " + c);
+ addPendingCreateAndEvaluate(c);
+ }
+
+ private void destroySipDelegateInternal(int subId, ISipDelegate connection, int reason) {
+ if (subId != mSubId) {
+ logw("destroySipDelegateInternal: ignoring destroy, as this is about to be destroyed "
+ + "anyway due to subId change, delegate=" + connection);
+ return;
+ }
+ if (connection == null) {
+ logw("destroySipDelegateInternal: ignoring destroy, null connection binder.");
+ return;
+ }
+ SipDelegateController match = null;
+ for (SipDelegateController controller : mDelegatePriorityQueue) {
+ if (Objects.equal(connection.asBinder(),
+ controller.getSipDelegateInterface().asBinder())) {
+ match = controller;
+ break;
+ }
+ }
+ if (match == null) {
+ logw("destroySipDelegateInternal: could not find matching connection=" + connection);
+ return;
+ }
+
+ logi("destroySipDelegateInternal: destroy queued for connection= " + connection);
+ addPendingDestroyAndEvaluate(match, reason);
+ }
+
+ private void triggerFullNetworkRegistrationInternal(int subId, ISipDelegate connection,
+ int sipCode, String sipReason) {
+ if (subId != mSubId) {
+ logw("triggerFullNetworkRegistrationInternal: ignoring network reg request, as this is"
+ + "about to be destroyed anyway due to subId change, delegate=" + connection);
+ return;
+ }
+ if (connection == null) {
+ logw("triggerFullNetworkRegistrationInternal: ignoring, null connection binder.");
+ return;
+ }
+ // Ensure the requester has a valid SipDelegate registered.
+ SipDelegateController match = null;
+ for (SipDelegateController controller : mDelegatePriorityQueue) {
+ if (Objects.equal(connection.asBinder(),
+ controller.getSipDelegateInterface().asBinder())) {
+ match = controller;
+ break;
+ }
+ }
+ if (match == null) {
+ logw("triggerFullNetworkRegistrationInternal: could not find matching connection, "
+ + "ignoring");
+ return;
+ }
+
+ match.triggerFullNetworkRegistration(sipCode, sipReason);
+ }
+
+ /**
+ * Cancel pending update IMS registration events if they exist and instead send a deregister
+ * event.
+ */
+ private void triggerDeregistrationEvent() {
+ logi("triggerDeregistrationEvent: Sending deregister event to ImsService");
+ cancelPendingUpdateRegistration();
+
+ IImsRegistration registrationImpl = mRcsManager.getImsRegistration();
+ if (registrationImpl != null) {
+ try {
+ registrationImpl.triggerSipDelegateDeregistration();
+ } catch (RemoteException e) {
+ logi("triggerDeregistrationEvent: received RemoteException: " + e);
+ }
+ }
+ }
+
+ /**
+ * Schedule an update to the IMS registration. If there is an existing update scheduled, cancel
+ * it and reschedule.
+ * <p>
+ * We want to wait because this can directly result in changes to the IMS registration on the
+ * network, so we need to wait for a steady state where all changes have been made before
+ * triggering an update to the network registration.
+ */
+ private void scheduleUpdateRegistration() {
+ cancelPendingUpdateRegistration();
+
+ ScheduledFuture<?> f = mExecutorService.schedule(this::triggerUpdateRegistrationEvent,
+ mTimerAdapter.getUpdateRegistrationDelayMilliseconds(), TimeUnit.MILLISECONDS);
+ logi("scheduleUpdateRegistration: scheduling new event: " + f);
+ mPendingUpdateRegistrationFuture = f;
+ }
+
+ /**
+ * Cancel an existing pending task to update the IMS registration associated with SIP delegates.
+ */
+ private void cancelPendingUpdateRegistration() {
+ if (mPendingUpdateRegistrationFuture == null
+ || mPendingUpdateRegistrationFuture.isDone()) {
+ return;
+ }
+ // Cancel the old pending operation and reschedule again.
+ mPendingUpdateRegistrationFuture.cancel(false);
+ logi("scheduleUpdateRegistration: cancelling existing reg update event: "
+ + mPendingUpdateRegistrationFuture);
+ }
+
+ /**
+ * Triggers an event to update the IMS registration of the ImsService. Should only be called
+ * from {@link #scheduleUpdateRegistration()}.
+ */
+ private void triggerUpdateRegistrationEvent() {
+ logi("triggerUpdateRegistrationEvent: Sending update registration event to ImsService");
+ IImsRegistration registrationImpl = mRcsManager.getImsRegistration();
+ if (registrationImpl != null) {
+ try {
+ registrationImpl.triggerUpdateSipDelegateRegistration();
+ } catch (RemoteException e) {
+ logi("triggerUpdateRegistrationEvent: received RemoteException: " + e);
+ }
+ }
+ }
+
+ /**
+ * Returns whether or not the ImsService implementation associated with the supplied subId
+ * supports the SipTransport APIs.
+ * <p>
+ * This should only be called on the ExecutorService.
+ * @return true if SipTransport is supported on this subscription, false otherwise.
+ * @throws ImsException thrown if there was an error determining the state of the ImsService.
+ */
+ private boolean isSupportedInternal(int subId) throws ImsException {
+ checkStateOfController(subId);
+ return (mRcsManager.getSipTransport() != null);
+ }
+
+ private boolean addPendingDestroy(SipDelegateController c, int reason) {
+ DestroyRequest request = new DestroyRequest(c, reason);
+ if (!mDelegatePendingDestroy.contains(request)) {
+ return mDelegatePendingDestroy.add(request);
+ }
+ return false;
+ }
+
+ /**
+ * The supplied SipDelegateController has been destroyed and associated feature tags have been
+ * released. Trigger the re-evaluation of the priority queue with the new configuration.
+ */
+ private void addPendingDestroyAndEvaluate(SipDelegateController c, int reason) {
+ if (addPendingDestroy(c, reason)) {
+ scheduleThrottledReevaluate();
+ }
+ }
+
+ /**
+ * A new SipDelegateController has been created, add to the back of the priority queue and
+ * trigger the re-evaluation of the priority queue with the new configuration.
+ */
+ private void addPendingCreateAndEvaluate(SipDelegateController c) {
+ mDelegatePendingCreate.add(c);
+ scheduleThrottledReevaluate();
+ }
+
+ /**
+ * The priority queue has changed, which will cause a re-evaluation of the feature tags granted
+ * to each SipDelegate.
+ * <p>
+ * Note: re-evaluations are throttled to happen at a minimum to occur every
+ * REEVALUATE_THROTTLE_MS seconds. We also do not reevaluate while another reevaluate operation
+ * is in progress, so in this case, defer schedule itself.
+ */
+ private void scheduleThrottledReevaluate() {
+ if (isEvaluatePendingAndNotInProgress()) {
+ logi("scheduleThrottledReevaluate: throttling reevaluate, eval already pending: "
+ + mScheduledEvaluateFuture);
+ } else {
+ mScheduledEvaluateFuture = mExecutorService.schedule(this::reevaluateDelegates,
+ mTimerAdapter.getReevaluateThrottleTimerMilliseconds(), TimeUnit.MILLISECONDS);
+ logi("scheduleThrottledReevaluate: new reevaluate scheduled: "
+ + mScheduledEvaluateFuture);
+ }
+ }
+
+ /**
+ * @return true if there is a evaluate pending, false if there is not. If evaluate has already
+ * begun, but we are waiting for it to complete, this will also return false.
+ */
+ private boolean isEvaluatePendingAndNotInProgress() {
+ boolean isEvalScheduled = mScheduledEvaluateFuture != null
+ && !mScheduledEvaluateFuture.isDone();
+ boolean isEvalInProgress = mEvaluateCompleteFuture != null
+ && !mEvaluateCompleteFuture.isDone();
+ return isEvalScheduled && !isEvalInProgress;
+ }
+
+ /**
+ * Cancel any pending re-evaluates and perform it as soon as possible. This is done in the case
+ * where we need to do something like tear down this controller or change subId.
+ */
+ private void scheduleReevaluateNow(CompletableFuture<Void> onDoneFuture) {
+ if (isEvaluatePendingAndNotInProgress()) {
+ mScheduledEvaluateFuture.cancel(false /*interrupt*/);
+ logi("scheduleReevaluateNow: cancelling pending reevaluate: "
+ + mScheduledEvaluateFuture);
+ }
+ // we have tasks that depend on this potentially, so once the last reevaluate is done,
+ // schedule a new one right away.
+ if (mEvaluateCompleteFuture != null && !mEvaluateCompleteFuture.isDone()) {
+ mEvaluateCompleteFuture.thenRunAsync(
+ () -> scheduleReevaluateNow(onDoneFuture), mExecutorService);
+ return;
+ }
+
+ reevaluateDelegates();
+ mEvaluateCompleteFuture.thenAccept(onDoneFuture::complete);
+ }
+
+ /**
+ * Apply all operations that have been pending by collecting pending create/destroy operations
+ * and batch applying them to the mDelegatePriorityQueue.
+ *
+ * First perform the operation of destroying all SipDelegateConnections that have been pending
+ * destroy. Next, add all pending new SipDelegateControllers to the end of
+ * mDelegatePriorityQueue and loop through all in the queue, applying feature tags to the
+ * appropriate SipDelegateController if they pass role checks and have not already been claimed
+ * by another delegate higher in the priority queue.
+ */
+ private void reevaluateDelegates() {
+ // We need to cancel the pending update now and reschedule IMS registration update for
+ // after the reevaluate is complete.
+ cancelPendingUpdateRegistration();
+ if (mEvaluateCompleteFuture != null && !mEvaluateCompleteFuture.isDone()) {
+ logw("reevaluateDelegates: last evaluate not done, deferring new request");
+ // Defer re-evaluate until after the pending re-evaluate is complete.
+ mEvaluateCompleteFuture.thenRunAsync(this::scheduleThrottledReevaluate,
+ mExecutorService);
+ return;
+ }
+
+ // Destroy all pending destroy delegates first. Order doesn't matter.
+ List<CompletableFuture<Void>> pendingDestroyList = mDelegatePendingDestroy.stream()
+ .map(d -> triggerDestroy(d.controller, d.reason)).collect(
+ Collectors.toList());
+ CompletableFuture<Void> pendingDestroy = CompletableFuture.allOf(
+ pendingDestroyList.toArray(new CompletableFuture[mDelegatePendingDestroy.size()]));
+ mDelegatePriorityQueue.removeAll(mDelegatePendingDestroy.stream().map(d -> d.controller)
+ .collect(Collectors.toList()));
+ mDelegatePendingDestroy.clear();
+
+ // Add newly created SipDelegates to end of queue before evaluating associated features.
+ mDelegatePriorityQueue.addAll(mDelegatePendingCreate);
+ for (SipDelegateController c : mDelegatePendingCreate) {
+ logi("reevaluateDelegates: pending create: " + c);
+ }
+ mDelegatePendingCreate.clear();
+
+ // Wait for destroy stages to complete, then loop from oldest to most recent and associate
+ // feature tags that the app has requested to the SipDelegate.
+ // Each feature tag can only be associated with one SipDelegate, so as feature tags are
+ // taken, do not allow other SipDelegates to be associated with those tags as well. Each
+ // stage of the CompletableFuture chain passes the previously claimed feature tags into the
+ // next stage so that those feature tags can be denied if already claimed.
+ // Executor doesn't matter here, just composing here to transform to the next stage.
+ CompletableFuture<Set<String>> pendingChange = pendingDestroy.thenCompose((ignore) -> {
+ logi("reevaluateDelegates: destroy phase complete");
+ return CompletableFuture.completedFuture(new ArraySet<>());
+ });
+ final String cachedSmsRolePackage = mCachedSmsRolePackageName;
+ for (SipDelegateController c : mDelegatePriorityQueue) {
+ logi("reevaluateDelegates: pending reeval: " + c);
+ pendingChange = pendingChange.thenComposeAsync((takenTags) -> {
+ logi("reevaluateDelegates: last stage completed with result:" + takenTags);
+ if (takenTags == null) {
+ // return early, the ImsService is no longer available. This will eventually be
+ // destroyed.
+ return CompletableFuture.completedFuture(null /*failed*/);
+ }
+ return changeSupportedFeatureTags(c, cachedSmsRolePackage, takenTags);
+ }, mExecutorService);
+ }
+
+ // Executor doesn't matter here, schedule an event to update the IMS registration.
+ mEvaluateCompleteFuture = pendingChange
+ .thenAccept((associatedFeatures) -> {
+ logi("reevaluateDelegates: reevaluate complete," + " feature tags associated: "
+ + associatedFeatures);
+ scheduleUpdateRegistration();
+ });
+ logi("reevaluateDelegates: future created.");
+ }
+
+ private CompletableFuture<Void> triggerDestroy(SipDelegateController c, int reason) {
+ return c.destroy(isForcedFromReason(reason), reason)
+ // Executor doesn't matter here, just for logging.
+ .thenAccept((delegateReason) -> logi("destroy triggered with " + reason
+ + " and finished with reason= " + delegateReason));
+ }
+
+ private boolean isForcedFromReason(int reason) {
+ switch (reason) {
+ case SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_UNKNOWN:
+ logw("isForcedFromReason, unknown reason");
+ /*intentional fallthrough*/
+ case SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP:
+ /*intentional fallthrough*/
+ case SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_USER_DISABLED_RCS:
+ return false;
+ case SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD:
+ /*intentional fallthrough*/
+ case SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN:
+ return true;
+ }
+ logw("isForcedFromReason, unexpected reason: " + reason);
+ return false;
+ }
+
+ /**
+ * Called by RoleManager when a role has changed so that we can query the new role holder.
+ * @param roleName the name of the role whose holders are changed
+ * @param user the user for this role holder change
+ */
+ // Called on mExecutorThread
+ @Override
+ public void onRoleHoldersChanged(@NonNull String roleName, @NonNull UserHandle user) {
+ logi("onRoleHoldersChanged, roleName= " + roleName + ", user= " + user);
+ // Only monitor changes on the system
+ if (!UserHandle.SYSTEM.equals(user)) {
+ return;
+ }
+
+ if (!RoleManager.ROLE_SMS.equals(roleName)) {
+ logi("onRoleHoldersChanged, ignoring non SMS role change");
+ // TODO: only target default sms app for now and add new roles later using
+ // CarrierConfigManager
+ return;
+ }
+ boolean roleChanged = updateRoleCache();
+ if (roleChanged) {
+ triggerDeregistrationEvent();
+ // new denied tags will be picked up when reevaluate completes.
+ scheduleThrottledReevaluate();
+ }
+ }
+
+
+ /**
+ * @return true, if the role cache has changed, false otherwise.
+ */
+ private boolean updateRoleCache() {
+ String newSmsRolePackageName = "";
+ try {
+ // Only one app can fulfill the SMS role.
+ newSmsRolePackageName = mRoleManagerAdapter.getRoleHolders(RoleManager.ROLE_SMS)
+ .stream().findFirst().orElse("");
+ } catch (Exception e) {
+ logi("updateRoleCache: exception=" + e);
+ }
+
+ logi("updateRoleCache: new packageName=" + newSmsRolePackageName);
+ if (TextUtils.equals(mCachedSmsRolePackageName, newSmsRolePackageName)) {
+ logi("updateRoleCache, skipping, role did not change");
+ return false;
+ }
+ mCachedSmsRolePackageName = newSmsRolePackageName;
+ return true;
+ }
+
+ /**
+ * Check the requested roles for the specified package name and return the tags that were
+ * applied to that SipDelegateController.
+ * @param controller Controller to attribute feature tags to.
+ * @param alreadyRequestedTags The feature tags that were already granted to other SipDelegates.
+ * @return Once complete, contains the set of feature tags that the SipDelegate now has
+ * associated with it along with the feature tags that previous SipDelegates had.
+ *
+ * // TODO: we currently only track SMS role, extend to support other roles as well.
+ */
+ private CompletableFuture<Set<String>> changeSupportedFeatureTags(
+ SipDelegateController controller, String smsRolePackageName,
+ Set<String> alreadyRequestedTags) {
+ Set<String> requestedFeatureTags = controller.getInitialRequest().getFeatureTags();
+ String packageName = controller.getPackageName();
+ if (!smsRolePackageName.equals(packageName)) {
+ // Deny all tags.
+ Set<FeatureTagState> deniedTags = new ArraySet<>();
+ for (String s : requestedFeatureTags) {
+ deniedTags.add(new FeatureTagState(s,
+ SipDelegateManager.DENIED_REASON_NOT_ALLOWED));
+ }
+ CompletableFuture<Boolean> pendingDeny = controller.changeSupportedFeatureTags(
+ Collections.emptySet(), deniedTags);
+ logi("changeSupportedFeatureTags pendingDeny=" + pendingDeny);
+ // do not worry about executor used here, this stage used to interpret result + add log.
+ return pendingDeny.thenApply((completedSuccessfully) -> {
+ logi("changeSupportedFeatureTags: deny completed: " + completedSuccessfully);
+ if (!completedSuccessfully) return null;
+ // Return back the previous list of requested tags, as we did not add any more.
+ return alreadyRequestedTags;
+ });
+ }
+
+ ArraySet<String> previouslyGrantedTags = new ArraySet<>(alreadyRequestedTags);
+ // deny tags already used by other delegates
+ Set<FeatureTagState> deniedTags = new ArraySet<>();
+ for (String s : requestedFeatureTags) {
+ if (previouslyGrantedTags.contains(s)) {
+ deniedTags.add(new FeatureTagState(s,
+ SipDelegateManager.DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE));
+ }
+ }
+ Set<String> nonDeniedTags = requestedFeatureTags.stream()
+ .filter(r -> !previouslyGrantedTags.contains(r))
+ .collect(Collectors.toSet());
+ // Add newly granted tags to the already requested tags list.
+ previouslyGrantedTags.addAll(nonDeniedTags);
+ CompletableFuture<Boolean> pendingChange = controller.changeSupportedFeatureTags(
+ nonDeniedTags, deniedTags);
+ logi("changeSupportedFeatureTags pendingChange=" + pendingChange);
+ // do not worry about executor used here, this stage used to interpret result + add log.
+ return pendingChange.thenApply((completedSuccessfully) -> {
+ logi("changeSupportedFeatureTags: change completed: " + completedSuccessfully);
+ if (!completedSuccessfully) return null;
+ return previouslyGrantedTags;
+ });
+ }
+
+ /**
+ * Run a Callable on the ExecutorService Thread and wait for the result.
+ * If an ImsException is thrown, catch it and rethrow it to caller.
+ */
+ private <T> T waitForMethodToComplete(Callable<T> callable) throws ImsException {
+ Future<T> r = mExecutorService.submit(callable);
+ T result;
+ try {
+ result = r.get();
+ } catch (InterruptedException e) {
+ result = null;
+ } catch (ExecutionException e) {
+ Throwable cause = e.getCause();
+ if (cause instanceof ImsException) {
+ // Rethrow the exception
+ throw (ImsException) cause;
+ }
+ logw("Unexpected Exception, returning null: " + cause);
+ result = null;
+ }
+ return result;
+ }
+
+ /**
+ * Throw an ImsException for common scenarios where the state of the controller is not ready
+ * for communication.
+ * <p>
+ * This should only be called while running on the on the ExecutorService.
+ */
+ private void checkStateOfController(int subId) throws ImsException {
+ if (mSubId != subId) {
+ // sub ID has changed while this was in the queue.
+ throw new ImsException("subId is no longer valid for this request.",
+ ImsException.CODE_ERROR_INVALID_SUBSCRIPTION);
+ }
+ if (mRcsManager == null) {
+ throw new ImsException("Connection to ImsService is not available",
+ ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
+ }
+
+ private void onRcsManagerChanged(RcsFeatureManager m) {
+ logi("manager changed, " + mRcsManager + "->" + m);
+ if (mRcsManager == m) return;
+ mRcsManager = m;
+ if (mRcsManager == null) {
+ logi("onRcsManagerChanged: lost connection to ImsService, tearing down...");
+ unregisterListeners();
+ scheduleDestroyDelegates(SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD);
+ } else {
+ logi("onRcsManagerChanged: registering listeners/updating role cache...");
+ registerListeners();
+ updateRoleCache();
+ }
+ }
+
+ private void registerListeners() {
+ try {
+ mRoleManagerAdapter.addOnRoleHoldersChangedListenerAsUser(mExecutorService, this,
+ UserHandle.SYSTEM);
+ } catch (Exception e) {
+ logi("registerListeners: exception=" + e);
+ }
+ }
+
+ private void unregisterListeners() {
+ mCachedSmsRolePackageName = "";
+ mRoleManagerAdapter.removeOnRoleHoldersChangedListenerAsUser(this, UserHandle.SYSTEM);
+ }
+
+ /**
+ * Called when either the sub ID associated with the slot has changed or the carrier
+ * configuration associated with the same subId has changed.
+ */
+ private void onSubIdChanged(int newSubId) {
+ logi("subId changed, " + mSubId + "->" + newSubId);
+ if (mSubId != newSubId) {
+ // Swap subId, any pending create/destroy on old subId will be denied.
+ mSubId = newSubId;
+ scheduleDestroyDelegates(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN);
+ return;
+ }
+ // TODO: if subId hasn't changed this means that we should load in any new carrier configs
+ // that we care about and apply.
+ }
+
+ /**
+ * Destroy all tracked SipDelegateConnections due to the subscription being torn down.
+ * @return A CompletableFuture that will complete when all SipDelegates have been torn down.
+ */
+ private CompletableFuture<Void> scheduleDestroyDelegates(int reason) {
+ boolean addedDestroy = false;
+ for (SipDelegateController c : mDelegatePriorityQueue) {
+ logi("scheduleDestroyDelegates: Controller pending destroy: " + c);
+ addedDestroy |= addPendingDestroy(c, reason);
+ }
+ if (addedDestroy) {
+ CompletableFuture<Void> pendingDestroy = new CompletableFuture<>();
+ scheduleReevaluateNow(pendingDestroy);
+ return pendingDestroy;
+ } else {
+ return CompletableFuture.completedFuture(null);
+ }
+ }
+
+ @Override
+ public void dump(PrintWriter printWriter) {
+ IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, " ");
+ pw.println("SipTransportController" + "[" + mSlotId + "->" + mSubId + "]:");
+ pw.increaseIndent();
+ pw.println("LocalLog:");
+ pw.increaseIndent();
+ mLocalLog.dump(pw);
+ pw.decreaseIndent();
+ pw.println("SipDelegateControllers (in priority order):");
+ pw.increaseIndent();
+ if (mDelegatePriorityQueue.isEmpty()) {
+ pw.println("[NONE]");
+ } else {
+ for (SipDelegateController c : mDelegatePriorityQueue) {
+ c.dump(pw);
+ }
+ }
+ pw.decreaseIndent();
+ pw.decreaseIndent();
+ }
+
+ private void logi(String log) {
+ Log.w(LOG_TAG, "[" + mSlotId + "->" + mSubId + "] " + log);
+ mLocalLog.log("[I] " + log);
+ }
+
+ private void logw(String log) {
+ Log.w(LOG_TAG, "[" + mSlotId + "->" + mSubId + "] " + log);
+ mLocalLog.log("[W] " + log);
+ }
+}
diff --git a/src/com/android/services/telephony/rcs/TelephonyRcsService.java b/src/com/android/services/telephony/rcs/TelephonyRcsService.java
index c85e9a9..941a6a8 100644
--- a/src/com/android/services/telephony/rcs/TelephonyRcsService.java
+++ b/src/com/android/services/telephony/rcs/TelephonyRcsService.java
@@ -47,21 +47,25 @@
private static final String LOG_TAG = "TelephonyRcsService";
/**
- * Used to inject RcsFeatureController and UserCapabilityExchangeImpl instances for testing.
+ * Used to inject RcsFeatureController and UceController instances for testing.
*/
@VisibleForTesting
public interface FeatureFactory {
/**
- * @return an {@link RcsFeatureController} assoicated with the slot specified.
+ * @return an {@link RcsFeatureController} associated with the slot specified.
*/
RcsFeatureController createController(Context context, int slotId);
/**
- * @return an instance of {@link UserCapabilityExchangeImpl} associated with the slot
+ * @return an instance of {@link UceControllerManager} associated with the slot specified.
+ */
+ UceControllerManager createUceControllerManager(Context context, int slotId, int subId);
+
+ /**
+ * @return an instance of {@link SipTransportController} for the slot and subscription
* specified.
*/
- UserCapabilityExchangeImpl createUserCapabilityExchange(Context context, int slotId,
- int subId);
+ SipTransportController createSipTransportController(Context context, int slotId, int subId);
}
private FeatureFactory mFeatureFactory = new FeatureFactory() {
@@ -71,9 +75,15 @@
}
@Override
- public UserCapabilityExchangeImpl createUserCapabilityExchange(Context context, int slotId,
+ public UceControllerManager createUceControllerManager(Context context, int slotId,
int subId) {
- return new UserCapabilityExchangeImpl(context, slotId, subId);
+ return new UceControllerManager(context, slotId, subId);
+ }
+
+ @Override
+ public SipTransportController createSipTransportController(Context context, int slotId,
+ int subId) {
+ return new SipTransportController(context, slotId, subId);
}
};
@@ -225,13 +235,24 @@
private void updateSupportedFeatures(RcsFeatureController c, int slotId, int subId) {
if (doesSubscriptionSupportPresence(subId)) {
- if (c.getFeature(UserCapabilityExchangeImpl.class) == null) {
- c.addFeature(mFeatureFactory.createUserCapabilityExchange(mContext, slotId, subId),
- UserCapabilityExchangeImpl.class);
+ if (c.getFeature(UceControllerManager.class) == null) {
+ c.addFeature(mFeatureFactory.createUceControllerManager(mContext, slotId, subId),
+ UceControllerManager.class);
}
} else {
- if (c.getFeature(UserCapabilityExchangeImpl.class) != null) {
- c.removeFeature(UserCapabilityExchangeImpl.class);
+ if (c.getFeature(UceControllerManager.class) != null) {
+ c.removeFeature(UceControllerManager.class);
+ }
+ }
+
+ if (doesSubscriptionSupportSingleRegistration(subId)) {
+ if (c.getFeature(SipTransportController.class) == null) {
+ c.addFeature(mFeatureFactory.createSipTransportController(mContext, slotId, subId),
+ SipTransportController.class);
+ }
+ } else {
+ if (c.getFeature(SipTransportController.class) != null) {
+ c.removeFeature(SipTransportController.class);
}
}
// Only start the connection procedure if we have active features.
@@ -250,6 +271,14 @@
return supportsUce;
}
+ private boolean doesSubscriptionSupportSingleRegistration(int subId) {
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) return false;
+ CarrierConfigManager carrierConfigManager =
+ mContext.getSystemService(CarrierConfigManager.class);
+ if (carrierConfigManager == null) return false;
+ return carrierConfigManager.getConfigForSubId(subId).getBoolean(
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL);
+ }
private int getSubscriptionFromSlot(int slotId) {
SubscriptionManager manager = mContext.getSystemService(SubscriptionManager.class);
@@ -274,6 +303,7 @@
synchronized (mLock) {
for (int i = 0; i < mNumSlots; i++) {
RcsFeatureController f = mFeatureControllers.get(i);
+ if (f == null) continue;
pw.increaseIndent();
f.dump(fd, printWriter, args);
pw.decreaseIndent();
diff --git a/src/com/android/services/telephony/rcs/UceControllerManager.java b/src/com/android/services/telephony/rcs/UceControllerManager.java
new file mode 100644
index 0000000..d1f91d1
--- /dev/null
+++ b/src/com/android/services/telephony/rcs/UceControllerManager.java
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import android.content.Context;
+import android.net.Uri;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.RcsUceAdapter;
+import android.telephony.ims.RcsUceAdapter.PublishState;
+import android.telephony.ims.aidl.IRcsUceControllerCallback;
+import android.telephony.ims.aidl.IRcsUcePublishStateCallback;
+import android.util.Log;
+
+import com.android.ims.RcsFeatureManager;
+import com.android.ims.rcs.uce.UceController;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
+
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+/**
+ * Responsible for managing the creation and destruction of UceController. It also received the
+ * requests from {@link com.android.phone.ImsRcsController} and pass these requests to
+ * {@link UceController}
+ */
+public class UceControllerManager implements RcsFeatureController.Feature {
+
+ private static final String LOG_TAG = "UceControllerManager";
+
+ private final int mSlotId;
+ private final Context mContext;
+ private final ExecutorService mExecutorService;
+
+ private volatile UceController mUceController;
+
+ public UceControllerManager(Context context, int slotId, int subId) {
+ Log.d(LOG_TAG, "create: slotId=" + slotId + ", subId=" + subId);
+
+ mSlotId = slotId;
+ mContext = context;
+ mExecutorService = Executors.newSingleThreadExecutor();
+ mUceController = new UceController(mContext, subId);
+ }
+
+ /**
+ * Constructor to inject dependencies for testing.
+ */
+ @VisibleForTesting
+ public UceControllerManager(Context context, int slotId, int subId, ExecutorService executor) {
+ mSlotId = slotId;
+ mContext = context;
+ mExecutorService = executor;
+ mUceController = new UceController(mContext, subId);
+ }
+
+ @Override
+ public void onRcsConnected(RcsFeatureManager manager) {
+ mExecutorService.submit(() -> mUceController.onRcsConnected(manager));
+ }
+
+ @Override
+ public void onRcsDisconnected() {
+ mExecutorService.submit(() -> mUceController.onRcsDisconnected());
+ }
+
+ @Override
+ public void onDestroy() {
+ Log.d(LOG_TAG, "onDestroy");
+ mExecutorService.submit(() -> mUceController.onDestroy());
+ // When the shutdown is called, it will refuse any new tasks and let existing tasks finish.
+ mExecutorService.shutdown();
+ }
+
+ /**
+ * This method will be called when either the subscription ID associated with the slot has
+ * changed or the carrier configuration associated with the same subId has changed.
+ */
+ @Override
+ public void onAssociatedSubscriptionUpdated(int subId) {
+ mExecutorService.submit(() -> {
+ Log.i(LOG_TAG, "onAssociatedSubscriptionUpdated: slotId=" + mSlotId
+ + ", subId=" + subId);
+
+ // Destroy existing UceController and create a new one.
+ mUceController.onDestroy();
+ mUceController = new UceController(mContext, subId);
+ });
+ }
+
+ @VisibleForTesting
+ public void setUceController(UceController uceController) {
+ mUceController = uceController;
+ }
+
+ /**
+ * Request the capabilities for contacts.
+ *
+ * @param contactNumbers A list of numbers that the capabilities are being requested for.
+ * @param c A callback for when the request for capabilities completes.
+ * @throws ImsException if the ImsService connected to this controller is currently down.
+ */
+ public void requestCapabilities(List<Uri> contactNumbers, IRcsUceControllerCallback c)
+ throws ImsException {
+ Future future = mExecutorService.submit(() -> {
+ checkUceControllerState();
+ mUceController.requestCapabilities(contactNumbers, c);
+ return true;
+ });
+
+ try {
+ future.get();
+ } catch (ExecutionException | InterruptedException e) {
+ Log.w(LOG_TAG, "requestCapabilities: " + e);
+ Throwable cause = e.getCause();
+ if (cause instanceof ImsException) {
+ throw (ImsException) cause;
+ }
+ }
+ }
+
+ /**
+ * Request the capabilities for the given contact.
+ * @param contactNumber The contact of the capabilities are being requested for.
+ * @param c A callback for when the request for capabilities completes.
+ * @throws ImsException if the ImsService connected to this controller is currently down.
+ */
+ public void requestNetworkAvailability(Uri contactNumber, IRcsUceControllerCallback c)
+ throws ImsException {
+ Future future = mExecutorService.submit(() -> {
+ checkUceControllerState();
+ mUceController.requestAvailability(contactNumber, c);
+ return true;
+ });
+
+ try {
+ future.get();
+ } catch (ExecutionException | InterruptedException e) {
+ Log.w(LOG_TAG, "requestNetworkAvailability exception: " + e);
+ Throwable cause = e.getCause();
+ if (cause instanceof ImsException) {
+ throw (ImsException) cause;
+ }
+ }
+ }
+
+ /**
+ * Get the UCE publish state.
+ *
+ * @throws ImsException if the ImsService connected to this controller is currently down.
+ */
+ public @PublishState int getUcePublishState() throws ImsException {
+ Future future = mExecutorService.submit(() -> {
+ checkUceControllerState();
+ return mUceController.getUcePublishState();
+ });
+
+ try {
+ return (Integer) future.get();
+ } catch (ExecutionException | InterruptedException e) {
+ Log.w(LOG_TAG, "requestNetworkAvailability exception: " + e);
+ Throwable cause = e.getCause();
+ if (cause instanceof ImsException) {
+ throw (ImsException) cause;
+ }
+ return RcsUceAdapter.PUBLISH_STATE_OTHER_ERROR;
+ }
+ }
+
+ /**
+ * Register the Publish state changed callback.
+ *
+ * @throws ImsException if the ImsService connected to this controller is currently down.
+ */
+ public void registerPublishStateCallback(IRcsUcePublishStateCallback c) throws ImsException {
+ Future future = mExecutorService.submit(() -> {
+ checkUceControllerState();
+ mUceController.registerPublishStateCallback(c);
+ return true;
+ });
+
+ try {
+ future.get();
+ } catch (ExecutionException | InterruptedException e) {
+ Log.w(LOG_TAG, "registerPublishStateCallback exception: " + e);
+ Throwable cause = e.getCause();
+ if (cause instanceof ImsException) {
+ throw (ImsException) cause;
+ }
+ }
+ }
+
+ /**
+ * Unregister the existing publish state changed callback.
+ */
+ public void unregisterPublishStateCallback(IRcsUcePublishStateCallback c) {
+ Future future = mExecutorService.submit(() -> {
+ if (checkUceControllerState()) {
+ mUceController.unregisterPublishStateCallback(c);
+ }
+ return true;
+ });
+
+ try {
+ future.get();
+ } catch (ExecutionException | InterruptedException e) {
+ Log.w(LOG_TAG, "unregisterPublishStateCallback exception: " + e);
+ }
+ }
+
+ private boolean checkUceControllerState() throws ImsException {
+ if (mUceController == null || mUceController.isUnavailable()) {
+ throw new ImsException("UCE controller is unavailable",
+ ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
+ return true;
+ }
+
+
+ @Override
+ public void dump(PrintWriter printWriter) {
+ IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, " ");
+ pw.println("UceControllerManager" + "[" + mSlotId + "]:");
+ pw.increaseIndent();
+ pw.println("UceController available = " + mUceController != null);
+ //TODO: Add dump for UceController
+ pw.decreaseIndent();
+ }
+}
diff --git a/src/com/android/services/telephony/rcs/UserCapabilityExchangeImpl.java b/src/com/android/services/telephony/rcs/UserCapabilityExchangeImpl.java
deleted file mode 100644
index ac8f9bf..0000000
--- a/src/com/android/services/telephony/rcs/UserCapabilityExchangeImpl.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.services.telephony.rcs;
-
-import android.content.Context;
-import android.net.Uri;
-import android.os.RemoteException;
-import android.telephony.ims.RcsContactUceCapability;
-import android.telephony.ims.RcsUceAdapter;
-import android.telephony.ims.aidl.IRcsUceControllerCallback;
-import android.util.Log;
-
-import com.android.ims.RcsFeatureManager;
-import com.android.ims.ResultCode;
-import com.android.phone.R;
-import com.android.service.ims.presence.ContactCapabilityResponse;
-import com.android.service.ims.presence.PresenceBase;
-import com.android.service.ims.presence.PresencePublication;
-import com.android.service.ims.presence.PresencePublisher;
-import com.android.service.ims.presence.PresenceSubscriber;
-import com.android.service.ims.presence.SubscribePublisher;
-
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
-
-/**
- * Implements User Capability Exchange using Presence.
- */
-public class UserCapabilityExchangeImpl implements RcsFeatureController.Feature, SubscribePublisher,
- PresencePublisher {
-
- private static final String LOG_TAG = "RcsUceImpl";
-
- private int mSlotId;
- private int mSubId;
-
- private final PresencePublication mPresencePublication;
- private final PresenceSubscriber mPresenceSubscriber;
-
- private final ConcurrentHashMap<Integer, IRcsUceControllerCallback> mPendingCapabilityRequests =
- new ConcurrentHashMap<>();
-
- UserCapabilityExchangeImpl(Context context, int slotId, int subId) {
- mSlotId = slotId;
- mSubId = subId;
- logi("created");
-
- String[] volteError = context.getResources().getStringArray(
- R.array.config_volte_provision_error_on_publish_response);
- String[] rcsError = context.getResources().getStringArray(
- R.array.config_rcs_provision_error_on_publish_response);
-
- // Initialize PresencePublication
- mPresencePublication = new PresencePublication(null /*PresencePublisher*/, context,
- volteError, rcsError);
- // Initialize PresenceSubscriber
- mPresenceSubscriber = new PresenceSubscriber(null /*SubscribePublisher*/, context,
- volteError, rcsError);
-
- onAssociatedSubscriptionUpdated(mSubId);
- }
-
-
- // Runs on main thread.
- @Override
- public void onRcsConnected(RcsFeatureManager rcsFeatureManager) {
- logi("onRcsConnected");
- mPresencePublication.updatePresencePublisher(this);
- mPresenceSubscriber.updatePresenceSubscriber(this);
- }
-
- // Runs on main thread.
- @Override
- public void onRcsDisconnected() {
- logi("onRcsDisconnected");
- mPresencePublication.removePresencePublisher();
- mPresenceSubscriber.removePresenceSubscriber();
- }
-
- // Runs on main thread.
- @Override
- public void onAssociatedSubscriptionUpdated(int subId) {
- mPresencePublication.handleAssociatedSubscriptionChanged(subId);
- mPresenceSubscriber.handleAssociatedSubscriptionChanged(subId);
- }
-
- /**
- * Should be called before destroying this instance.
- * This instance is not usable after this method is called.
- */
- // Called on main thread.
- public void onDestroy() {
- onRcsDisconnected();
- }
-
- /**
- * @return the UCE Publish state.
- */
- // May happen on a Binder thread, PresencePublication locks to get result.
- public int getUcePublishState() {
- int publishState = mPresencePublication.getPublishState();
- return toUcePublishState(publishState);
- }
-
- /**
- * Perform a capabilities request and call {@link IRcsUceControllerCallback} with the result.
- */
- // May happen on a Binder thread, PresenceSubscriber locks when requesting Capabilities.
- public void requestCapabilities(List<Uri> contactNumbers, IRcsUceControllerCallback c) {
- List<String> numbers = contactNumbers.stream()
- .map(UserCapabilityExchangeImpl::getNumberFromUri).collect(Collectors.toList());
- int taskId = mPresenceSubscriber.requestCapability(numbers,
- new ContactCapabilityResponse() {
- @Override
- public void onSuccess(int reqId) {
- logi("onSuccess called for reqId:" + reqId);
- }
-
- @Override
- public void onError(int reqId, int resultCode) {
- IRcsUceControllerCallback c = mPendingCapabilityRequests.remove(reqId);
- try {
- if (c != null) {
- c.onError(toUceError(resultCode));
- } else {
- logw("onError called for unknown reqId:" + reqId);
- }
- } catch (RemoteException e) {
- logi("Calling back to dead service");
- }
- }
-
- @Override
- public void onFinish(int reqId) {
- logi("onFinish called for reqId:" + reqId);
- }
-
- @Override
- public void onTimeout(int reqId) {
- IRcsUceControllerCallback c = mPendingCapabilityRequests.remove(reqId);
- try {
- if (c != null) {
- c.onError(RcsUceAdapter.ERROR_REQUEST_TIMEOUT);
- } else {
- logw("onTimeout called for unknown reqId:" + reqId);
- }
- } catch (RemoteException e) {
- logi("Calling back to dead service");
- }
- }
-
- @Override
- public void onCapabilitiesUpdated(int reqId,
- List<RcsContactUceCapability> contactCapabilities,
- boolean updateLastTimestamp) {
- IRcsUceControllerCallback c = mPendingCapabilityRequests.remove(reqId);
- try {
- if (c != null) {
- c.onCapabilitiesReceived(contactCapabilities);
- } else {
- logw("onCapabilitiesUpdated, unknown reqId:" + reqId);
- }
- } catch (RemoteException e) {
- logw("onCapabilitiesUpdated on dead service");
- }
- }
- });
- if (taskId < 0) {
- try {
- c.onError(toUceError(taskId));
- return;
- } catch (RemoteException e) {
- logi("Calling back to dead service");
- }
- }
- mPendingCapabilityRequests.put(taskId, c);
- }
-
- @Override
- public int getPublisherState() {
- return 0;
- }
-
- @Override
- public int requestPublication(RcsContactUceCapability capabilities, String contactUri,
- int taskId) {
- return 0;
- }
-
- @Override
- public int requestCapability(String[] formatedContacts, int taskId) {
- return 0;
- }
-
- @Override
- public int requestAvailability(String formattedContact, int taskId) {
- return 0;
- }
-
- @Override
- public int getStackStatusForCapabilityRequest() {
- return 0;
- }
-
- @Override
- public void updatePublisherState(int publishState) {
-
- }
-
- private static String getNumberFromUri(Uri uri) {
- String number = uri.getSchemeSpecificPart();
- String[] numberParts = number.split("[@;:]");
-
- if (numberParts.length == 0) {
- return null;
- }
- return numberParts[0];
- }
-
- private static int toUcePublishState(int publishState) {
- switch (publishState) {
- case PresenceBase.PUBLISH_STATE_200_OK:
- return RcsUceAdapter.PUBLISH_STATE_OK;
- case PresenceBase.PUBLISH_STATE_NOT_PUBLISHED:
- return RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED;
- case PresenceBase.PUBLISH_STATE_VOLTE_PROVISION_ERROR:
- return RcsUceAdapter.PUBLISH_STATE_VOLTE_PROVISION_ERROR;
- case PresenceBase.PUBLISH_STATE_RCS_PROVISION_ERROR:
- return RcsUceAdapter.PUBLISH_STATE_RCS_PROVISION_ERROR;
- case PresenceBase.PUBLISH_STATE_REQUEST_TIMEOUT:
- return RcsUceAdapter.PUBLISH_STATE_REQUEST_TIMEOUT;
- case PresenceBase.PUBLISH_STATE_OTHER_ERROR:
- return RcsUceAdapter.PUBLISH_STATE_OTHER_ERROR;
- default:
- return RcsUceAdapter.PUBLISH_STATE_OTHER_ERROR;
- }
- }
-
- private static int toUceError(int resultCode) {
- switch (resultCode) {
- case ResultCode.SUBSCRIBE_NOT_REGISTERED:
- return RcsUceAdapter.ERROR_NOT_REGISTERED;
- case ResultCode.SUBSCRIBE_REQUEST_TIMEOUT:
- return RcsUceAdapter.ERROR_REQUEST_TIMEOUT;
- case ResultCode.SUBSCRIBE_FORBIDDEN:
- return RcsUceAdapter.ERROR_FORBIDDEN;
- case ResultCode.SUBSCRIBE_NOT_FOUND:
- return RcsUceAdapter.ERROR_NOT_FOUND;
- case ResultCode.SUBSCRIBE_TOO_LARGE:
- return RcsUceAdapter.ERROR_REQUEST_TOO_LARGE;
- case ResultCode.SUBSCRIBE_INSUFFICIENT_MEMORY:
- return RcsUceAdapter.ERROR_INSUFFICIENT_MEMORY;
- case ResultCode.SUBSCRIBE_LOST_NETWORK:
- return RcsUceAdapter.ERROR_LOST_NETWORK;
- case ResultCode.SUBSCRIBE_ALREADY_IN_QUEUE:
- return RcsUceAdapter.ERROR_ALREADY_IN_QUEUE;
- default:
- return RcsUceAdapter.ERROR_GENERIC_FAILURE;
- }
- }
-
- private void logi(String log) {
- Log.i(LOG_TAG, getLogPrefix().append(log).toString());
- }
-
- private void logw(String log) {
- Log.w(LOG_TAG, getLogPrefix().append(log).toString());
- }
-
- private StringBuilder getLogPrefix() {
- StringBuilder builder = new StringBuilder("[");
- builder.append(mSlotId);
- builder.append("->");
- builder.append(mSubId);
- builder.append("] ");
- return builder;
- }
-}
diff --git a/testapps/EmbmsServiceTestApp/AndroidManifest.xml b/testapps/EmbmsServiceTestApp/AndroidManifest.xml
index 91d8508..943fc78 100644
--- a/testapps/EmbmsServiceTestApp/AndroidManifest.xml
+++ b/testapps/EmbmsServiceTestApp/AndroidManifest.xml
@@ -15,30 +15,31 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
- package="com.android.phone.testapps.embmsmw"
- coreApp="true">
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ package="com.android.phone.testapps.embmsmw"
+ coreApp="true">
<uses-permission android:name="android.permission.SEND_EMBMS_INTENTS"/>
<application android:label="EmbmsTestMiddleware">
<service android:name="com.android.phone.testapps.embmsmw.EmbmsTestStreamingService"
- android:launchMode="singleInstance"
- androidprv:systemUserOnly="true">
+ android:launchMode="singleInstance"
+ androidprv:systemUserOnly="true"
+ android:exported="true">
<intent-filter>
- <action android:name="android.telephony.action.EmbmsStreaming" />
+ <action android:name="android.telephony.action.EmbmsStreaming"/>
</intent-filter>
</service>
<service android:name="com.android.phone.testapps.embmsmw.EmbmsSampleDownloadService"
- android:launchMode="singleInstance"
- androidprv:systemUserOnly="true">
+ android:launchMode="singleInstance"
+ androidprv:systemUserOnly="true"
+ android:exported="true">
<intent-filter>
- <action android:name="android.telephony.action.EmbmsDownload" />
+ <action android:name="android.telephony.action.EmbmsDownload"/>
</intent-filter>
</service>
<receiver android:name="com.android.phone.testapps.embmsmw.SideChannelReceiver"
- android:enabled="true"
- android:exported="true"/>
+ android:enabled="true"
+ android:exported="true"/>
</application>
</manifest>
-
diff --git a/testapps/EmbmsTestDownloadApp/AndroidManifest.xml b/testapps/EmbmsTestDownloadApp/AndroidManifest.xml
index e93cd19..640fcd1 100644
--- a/testapps/EmbmsTestDownloadApp/AndroidManifest.xml
+++ b/testapps/EmbmsTestDownloadApp/AndroidManifest.xml
@@ -15,57 +15,54 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.phone.testapps.embmsdownload">
+ package="com.android.phone.testapps.embmsdownload">
<application android:label="EmbmsTestDownloadApp">
- <activity
- android:name=".EmbmsTestDownloadApp"
- android:label="EmbmsDownloadFrontend">
+ <activity android:name=".EmbmsTestDownloadApp"
+ android:label="EmbmsDownloadFrontend"
+ android:exported="true">
<intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.LAUNCHER" />
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- This is the receiver defined by the MBMS api. -->
- <receiver
- android:name="android.telephony.mbms.MbmsDownloadReceiver"
- android:permission="android.permission.SEND_EMBMS_INTENTS"
- android:enabled="true"
- android:exported="true">
+ <receiver android:name="android.telephony.mbms.MbmsDownloadReceiver"
+ android:permission="android.permission.SEND_EMBMS_INTENTS"
+ android:enabled="true"
+ android:exported="true">
</receiver>
<!-- This is the receiver defined by app to receive the download-done intent that was
passed into DownloadRequest. -->
- <receiver
- android:name="com.android.phone.testapps.embmsdownload.DownloadCompletionReceiver"
- android:enabled="true">
+ <receiver android:name="com.android.phone.testapps.embmsdownload.DownloadCompletionReceiver"
+ android:enabled="true">
</receiver>
<!-- This is the provider that apps must declare in their manifest. It allows the
middleware to obtain file descriptors to temp files in the app's file space -->
<!-- grantUriPermissions must be set to true -->
- <provider
- android:name="android.telephony.mbms.MbmsTempFileProvider"
- android:authorities="com.android.phone.testapps.embmsdownload"
- android:exported="false"
- android:grantUriPermissions="true">
+ <provider android:name="android.telephony.mbms.MbmsTempFileProvider"
+ android:authorities="com.android.phone.testapps.embmsdownload"
+ android:exported="false"
+ android:grantUriPermissions="true">
<!-- This is a mandatory piece of metadata that contains the directory where temp
files should be put. It should be a relative path from Context.getFilesDir() or from
Context.getExternalStorageDir(null), depending on the value of the
use-external-storage metadata. -->
- <meta-data android:name="temp-file-path" android:value="/mbms-temp/"/>
+ <meta-data android:name="temp-file-path"
+ android:value="/mbms-temp/"/>
<!-- This tells the provider whether to use the sdcard partition for the temp files or
not. -->
- <meta-data android:name="use-external-storage" android:value="false"/>
+ <meta-data android:name="use-external-storage"
+ android:value="false"/>
</provider>
<!-- This is a mandatory piece of metadata that contains the authority string for the
provider declared above -->
- <meta-data
- android:name="mbms-file-provider-authority"
- android:value="com.android.phone.testapps.embmsdownload"/>
+ <meta-data android:name="mbms-file-provider-authority"
+ android:value="com.android.phone.testapps.embmsdownload"/>
</application>
</manifest>
-
diff --git a/testapps/EmbmsTestStreamingApp/AndroidManifest.xml b/testapps/EmbmsTestStreamingApp/AndroidManifest.xml
index d13425d..9cb83f2 100644
--- a/testapps/EmbmsTestStreamingApp/AndroidManifest.xml
+++ b/testapps/EmbmsTestStreamingApp/AndroidManifest.xml
@@ -15,17 +15,16 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.phone.testapps.embmsfrontend">
+ package="com.android.phone.testapps.embmsfrontend">
<application android:label="EmbmsTestStreamingApp">
- <activity
- android:name=".EmbmsTestStreamingApp"
- android:label="EmbmsStreamingFrontend">
+ <activity android:name=".EmbmsTestStreamingApp"
+ android:label="EmbmsStreamingFrontend"
+ android:exported="true">
<intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.LAUNCHER" />
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
-
diff --git a/testapps/GbaTestApp/Android.bp b/testapps/GbaTestApp/Android.bp
new file mode 100644
index 0000000..cb6df4e
--- /dev/null
+++ b/testapps/GbaTestApp/Android.bp
@@ -0,0 +1,26 @@
+// Copyright 2020 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+android_test {
+ name: "GbaTestApp",
+ static_libs: [
+ "androidx.appcompat_appcompat",
+ "androidx-constraintlayout_constraintlayout",
+ "ub-uiautomator",
+ ],
+ srcs: ["src/**/*.java"],
+ javacflags: ["-parameters"],
+ platform_apis: true,
+ certificate: "platform",
+}
diff --git a/testapps/GbaTestApp/AndroidManifest.xml b/testapps/GbaTestApp/AndroidManifest.xml
new file mode 100644
index 0000000..8554461
--- /dev/null
+++ b/testapps/GbaTestApp/AndroidManifest.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.phone.testapps.gbatestapp">
+
+ <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
+ <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
+ <uses-permission android:name="android.permission.BIND_GBA_SERVICE" />
+
+ <application
+ android:allowBackup="true"
+ android:label="@string/app_name"
+ android:theme="@style/Theme.AppCompat"
+ android:supportsRtl="true">
+ <service
+ android:name=".TestGbaService"
+ android:directBootAware="true"
+ android:permission="android.permission.BIND_GBA_SERVICE"
+ android:enabled="true"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.telephony.gba.GbaService"/>
+ </intent-filter>
+ </service>
+
+ <activity android:name=".MainActivity"
+ android:enabled="true"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/testapps/GbaTestApp/res/layout/fragment_carrier_config.xml b/testapps/GbaTestApp/res/layout/fragment_carrier_config.xml
new file mode 100644
index 0000000..f15fa2a
--- /dev/null
+++ b/testapps/GbaTestApp/res/layout/fragment_carrier_config.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/black"
+ tools:context=".ui.main.CarrierConfigFragment">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/service_package_name" />
+
+ <EditText
+ android:id="@+id/editServicePackageName"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:ems="10"
+ android:gravity="start|top"
+ android:inputType="textMultiLine" />
+
+ <TextView
+ android:id="@+id/textTestLabel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/service_release_time" />
+
+ <EditText
+ android:id="@+id/editServiceReleaseTime"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="numberSigned" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/layout_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:orientation="vertical">
+
+ <Button
+ android:id="@+id/carrier_config_clear"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_clear" />
+
+ <Button
+ android:id="@+id/carrier_config_done"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_done" />
+ </LinearLayout>
+
+</FrameLayout>
diff --git a/testapps/GbaTestApp/res/layout/fragment_service_config.xml b/testapps/GbaTestApp/res/layout/fragment_service_config.xml
new file mode 100644
index 0000000..50090c2
--- /dev/null
+++ b/testapps/GbaTestApp/res/layout/fragment_service_config.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/black"
+ tools:context=".ui.main.ServiceConfigFragment">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_above="@id/layout_buttons"
+ android:orientation="vertical">
+
+ <CheckBox
+ android:id="@+id/checkBoxResult"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/response_success" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/response_key" />
+
+ <EditText
+ android:id="@+id/editKey"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="textPersonName" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:editable="false"
+ android:text="@string/response_btid" />
+
+ <EditText
+ android:id="@+id/editBTid"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="textPersonName" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/response_fail_reason" />
+
+ <EditText
+ android:id="@+id/editFailReason"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="numberSigned" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/layout_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_gravity="bottom"
+ android:orientation="vertical">
+
+ <Button
+ android:id="@+id/service_config_clear"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_clear" />
+
+ <Button
+ android:id="@+id/service_config_done"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_done" />
+ </LinearLayout>
+
+</FrameLayout>
diff --git a/testapps/GbaTestApp/res/layout/fragment_test_config.xml b/testapps/GbaTestApp/res/layout/fragment_test_config.xml
new file mode 100644
index 0000000..d8016f0
--- /dev/null
+++ b/testapps/GbaTestApp/res/layout/fragment_test_config.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/black"
+ tools:context=".ui.main.TestConfigFragment">
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_marginBottom="8dp"
+ android:scrollbarStyle="outsideInset"
+ app:layout_constraintBottom_toTopOf="@id/layout_buttons"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/request_app_type" />
+
+ <EditText
+ android:id="@+id/editAppType"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="numberSigned" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/request_naf_url" />
+
+ <EditText
+ android:id="@+id/editUrl"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="textUri" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/request_org" />
+
+ <EditText
+ android:id="@+id/editOrg"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="numberSigned" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/request_security_protocol" />
+
+ <EditText
+ android:id="@+id/editSpId"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="numberSigned" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/request_tls_cipher_suite" />
+
+ <EditText
+ android:id="@+id/editTlsCs"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="numberSigned" />
+
+ <CheckBox
+ android:id="@+id/checkBoxForce"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/request_force_bootstrapping" />
+
+ </LinearLayout>
+ </ScrollView>
+
+ <LinearLayout
+ android:id="@+id/layout_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="false"
+ android:layout_gravity="bottom"
+ android:orientation="vertical"
+ app:layout_constraintBottom_toBottomOf="parent">
+
+ <Button
+ android:id="@+id/client_config_clear"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_clear" />
+
+ <Button
+ android:id="@+id/client_config_done"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_done" />
+ </LinearLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/testapps/GbaTestApp/res/layout/main_activity.xml b/testapps/GbaTestApp/res/layout/main_activity.xml
new file mode 100644
index 0000000..1dfb73b
--- /dev/null
+++ b/testapps/GbaTestApp/res/layout/main_activity.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".MainActivity" />
\ No newline at end of file
diff --git a/testapps/GbaTestApp/res/layout/main_fragment.xml b/testapps/GbaTestApp/res/layout/main_fragment.xml
new file mode 100644
index 0000000..33bb6e1
--- /dev/null
+++ b/testapps/GbaTestApp/res/layout/main_fragment.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/main"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".ui.main.MainFragment">
+
+ <LinearLayout
+ android:id="@+id/layout_config"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:orientation="vertical"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/label_settings" />
+
+ <Button
+ android:id="@+id/carrier_config_change_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/label_carrier" />
+
+ <Button
+ android:id="@+id/service_config"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/label_service" />
+
+ <Button
+ android:id="@+id/client_config"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/label_test" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/layout_test"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:orientation="vertical"
+ app:layout_constraintBottom_toTopOf="@id/layout_exit"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/layout_config">
+
+ <Button
+ android:id="@+id/send_request"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_running" />
+
+ <TextView
+ android:id="@+id/textTestLabel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/label_test_result" />
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/viewTestOutput"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+ </LinearLayout>
+ </ScrollView>
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/layout_exit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_gravity="bottom"
+ android:orientation="vertical"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent">
+
+ <Button
+ android:id="@+id/test_exit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_exit" />
+ </LinearLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/testapps/GbaTestApp/res/values/colors.xml b/testapps/GbaTestApp/res/values/colors.xml
new file mode 100644
index 0000000..f8c6127
--- /dev/null
+++ b/testapps/GbaTestApp/res/values/colors.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <color name="purple_200">#FFBB86FC</color>
+ <color name="purple_500">#FF6200EE</color>
+ <color name="purple_700">#FF3700B3</color>
+ <color name="teal_200">#FF03DAC5</color>
+ <color name="teal_700">#FF018786</color>
+ <color name="black">#FF000000</color>
+ <color name="white">#FFFFFFFF</color>
+</resources>
\ No newline at end of file
diff --git a/testapps/GbaTestApp/res/values/strings.xml b/testapps/GbaTestApp/res/values/strings.xml
new file mode 100644
index 0000000..e74c181
--- /dev/null
+++ b/testapps/GbaTestApp/res/values/strings.xml
@@ -0,0 +1,30 @@
+<resources>
+ <string name="app_name">GbaTestApp</string>
+ <string name="label_settings">Settings</string>
+ <string name="label_carrier">Carrier Config</string>
+ <string name="label_service">Service Config</string>
+ <string name="label_test">Test Config</string>
+ <string name="button_name_running">Running</string>
+ <string name="button_name_exit">Exit</string>
+ <string name="label_test_result">Test Result</string>
+ <string name="button_name_clear">Reset</string>
+ <string name="button_name_done">Done</string>
+ <string name="title_activity_carrier_config">CarrierConfigActivity</string>
+ <string name="title_activity_service_config">ServiceConfigActivity</string>
+ <string name="title_activity_test_config">TestConfigActivity</string>
+ <string name="service_package_name">Package name of GBA service</string>
+ <string name="service_release_time">How long to release service after calling</string>
+ <string name="request_app_type">UICC App Type</string>
+ <string name="request_naf_url">Network application function (NAF) URL</string>
+ <string name="request_force_bootstrapping">Force Bootstrapping?</string>
+ <string name="request_org">Organization Code</string>
+ <string name="request_security_protocol">UA Security Protocol ID</string>
+ <string name="request_tls_cipher_suite">TLS Cipher Suite ID</string>
+ <string name="response_success">GBA Auth Success?</string>
+ <string name="response_fail_reason">Fail Reason ID</string>
+ <string name="response_key">GBA Key (CK + IK)</string>
+ <string name="response_btid">Bootstrapping Transaction Identifier (B-TID)</string>
+ <string name="sample_naf">3GPP-bootstrapping@naf1.operator.com</string>
+ <string name="sample_btid">(B-TID)</string>
+ <string name="sample_key">6629fae49393a05397450978507c4ef1</string>
+</resources>
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/MainActivity.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/MainActivity.java
new file mode 100644
index 0000000..72cbf5c
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/MainActivity.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp;
+
+import android.os.Bundle;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.android.phone.testapps.gbatestapp.ui.main.MainFragment;
+
+/** main activity of the gba test app */
+public class MainActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main_activity);
+ if (savedInstanceState == null) {
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.container, MainFragment.newInstance())
+ .commitNow();
+ }
+ }
+}
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/Settings.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/Settings.java
new file mode 100644
index 0000000..eaa424a
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/Settings.java
@@ -0,0 +1,309 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.RemoteException;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyFrameworkInitializer;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.telephony.ITelephony;
+
+import java.util.Locale;
+
+/** class to load and save the settings */
+public class Settings {
+
+ private static final String TAG = "SETTINGS";
+
+ private static final String PREF_CARRIER_CONFIG = "pref_carrier_config";
+ private static final String KEY_SERVICE_PACKAGE = "key_service_package";
+ private static final String KEY_RELEASE_TIME = "key_release_time";
+
+ private static final String PREF_TEST_CONFIG = "pref_test_config";
+ private static final String KEY_APP_TYPE = "key_app_type";
+ private static final String KEY_NAF_URL = "key_naf_url";
+ private static final String KEY_FORCE_BT = "key_force_bt";
+ private static final String KEY_ORG = "org";
+ private static final String KEY_SP_ID = "key_sp_id";
+ private static final String KEY_TLS_CS = "key_tls_cs";
+
+ private static final String PREF_SERVICE_CONFIG = "pref_carrier_config";
+ private static final String KEY_AUTH_RESULT = "key_auth_result";
+ private static final String KEY_GBA_KEY = "key_gba_key";
+ private static final String KEY_B_TID = "key_b_tid";
+ private static final String KEY_FAIL_REASON = "key_fail_reason";
+
+ private ITelephony mTelephony;
+ private int mSubId;
+ private String mServicePackageName;
+ private int mReleaseTime;
+ private int mAppType;
+ private String mNafUrl;
+ private boolean mForceBootstrap;
+ private int mOrg;
+ private int mSpId;
+ private int mTlsCs;
+ private boolean mIsAuthSuccess;
+ private String mGbaKey;
+ private String mBTid;
+ private int mFailReason;
+
+ private static Settings sInstance;
+
+ private Settings(Context cxt) {
+ mTelephony = ITelephony.Stub.asInterface(TelephonyFrameworkInitializer
+ .getTelephonyServiceManager().getTelephonyServiceRegisterer().get());
+ mSubId = SubscriptionManager.getDefaultSubscriptionId();
+ SharedPreferences sharedPref = cxt.getSharedPreferences(
+ PREF_CARRIER_CONFIG, Context.MODE_PRIVATE);
+ mServicePackageName = loadServicePackageName(mSubId, sharedPref);
+ mReleaseTime = loadReleaseTime(mSubId, sharedPref);
+
+ sharedPref = cxt.getSharedPreferences(PREF_TEST_CONFIG, Context.MODE_PRIVATE);
+ mAppType = sharedPref.getInt(KEY_APP_TYPE, TelephonyManager.APPTYPE_SIM);
+ mNafUrl = sharedPref.getString(KEY_NAF_URL, null);
+ mForceBootstrap = sharedPref.getBoolean(KEY_FORCE_BT, false);
+ mOrg = sharedPref.getInt(KEY_ORG, 0);
+ mSpId = sharedPref.getInt(KEY_SP_ID, 0);
+ mTlsCs = sharedPref.getInt(KEY_TLS_CS, 0);
+
+ sharedPref = cxt.getSharedPreferences(PREF_SERVICE_CONFIG, Context.MODE_PRIVATE);
+ mIsAuthSuccess = sharedPref.getBoolean(KEY_AUTH_RESULT, false);
+ mFailReason = sharedPref.getInt(KEY_FAIL_REASON, 0);
+ mGbaKey = sharedPref.getString(KEY_GBA_KEY, null);
+ mBTid = sharedPref.getString(KEY_B_TID, null);
+ }
+
+ /** Get the instance of Settings*/
+ public static Settings getSettings(Context cxt) {
+ if (sInstance == null) {
+ sInstance = new Settings(cxt);
+ }
+
+ return sInstance;
+ }
+
+ /** update carrier config settings */
+ public void updateCarrierConfig(Context cxt, String packageName, int releaseTime) {
+ new Thread(() -> {
+ synchronized (PREF_CARRIER_CONFIG) {
+
+ if (TextUtils.equals(mServicePackageName, packageName)
+ && (mReleaseTime == releaseTime)) {
+ return;
+ }
+
+ if (!TextUtils.equals(mServicePackageName, packageName)) {
+ mServicePackageName = packageName;
+
+ try {
+ mTelephony.setBoundGbaServiceOverride(mSubId, packageName);
+ } catch (RemoteException e) {
+ Log.e(TAG, "fail to set package name due to " + e);
+ }
+
+ }
+
+ if (mReleaseTime != releaseTime) {
+ mReleaseTime = releaseTime;
+
+ try {
+ mTelephony.setGbaReleaseTimeOverride(mSubId, releaseTime);
+ } catch (RemoteException e) {
+ Log.e(TAG, "fail to set release time due to " + e);
+ }
+ }
+
+ SharedPreferences sharedPref = cxt.getSharedPreferences(
+ PREF_CARRIER_CONFIG, Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sharedPref.edit();
+ editor.putString(KEY_SERVICE_PACKAGE, packageName);
+ editor.putInt(KEY_RELEASE_TIME, releaseTime);
+ editor.commit();
+ }
+ }).start();
+ }
+
+ /** get the config of gba service package name */
+ public String getServicePackageName() {
+ synchronized (PREF_CARRIER_CONFIG) {
+ return mServicePackageName;
+ }
+ }
+
+ /** get the config of gba release time */
+ public int getReleaseTime() {
+ synchronized (PREF_CARRIER_CONFIG) {
+ return mReleaseTime;
+ }
+ }
+
+ /** get the config of gba service package name used for now*/
+ public String loadServicePackageName(int subId, SharedPreferences sharedPref) {
+ try {
+ return mTelephony.getBoundGbaService(subId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "fail to get package name due to " + e);
+ }
+ return sharedPref != null ? sharedPref.getString(KEY_SERVICE_PACKAGE, null) : null;
+ }
+
+ /** get the config of gba release time used for now */
+ public int loadReleaseTime(int subId, SharedPreferences sharedPref) {
+ try {
+ return mTelephony.getGbaReleaseTime(subId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "fail to get package name due to " + e);
+ }
+ return sharedPref != null ? sharedPref.getInt(KEY_RELEASE_TIME, 0) : 0;
+ }
+
+ /** update the config of test gba service */
+ public void updateServiceConfig(Context cxt, boolean success, int reason,
+ String key, String btId) {
+ new Thread(() -> {
+ synchronized (PREF_SERVICE_CONFIG) {
+ mIsAuthSuccess = success;
+ mFailReason = reason;
+ mGbaKey = key;
+ mBTid = btId;
+ SharedPreferences sharedPref = cxt.getSharedPreferences(
+ PREF_SERVICE_CONFIG, Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sharedPref.edit();
+ editor.putBoolean(KEY_AUTH_RESULT, success);
+ editor.putInt(KEY_FAIL_REASON, reason);
+ editor.putString(KEY_GBA_KEY, key);
+ editor.putString(KEY_B_TID, btId);
+ editor.commit();
+ }
+ }).start();
+ }
+
+ /** get the config of the authentication result */
+ public boolean getAuthResult() {
+ synchronized (PREF_SERVICE_CONFIG) {
+ return mIsAuthSuccess;
+ }
+ }
+
+ /** get the config of authentication fail cause */
+ public int getFailReason() {
+ synchronized (PREF_SERVICE_CONFIG) {
+ return mFailReason;
+ }
+ }
+
+ /** get the config of GBA key */
+ public String getGbaKey() {
+ synchronized (PREF_SERVICE_CONFIG) {
+ return mGbaKey;
+ }
+ }
+
+ /** get the config of B-Tid */
+ public String getBTid() {
+ synchronized (PREF_SERVICE_CONFIG) {
+ return mBTid;
+ }
+ }
+
+ /** update the config of the test */
+ public void updateTestConfig(Context cxt, int appType, String url,
+ boolean force, int org, int spId, int tlsCs) {
+ new Thread(() -> {
+ synchronized (PREF_TEST_CONFIG) {
+ mAppType = appType;
+ mNafUrl = url;
+ mForceBootstrap = force;
+ mOrg = org;
+ mSpId = spId;
+ mTlsCs = tlsCs;
+
+ SharedPreferences sharedPref = cxt.getSharedPreferences(
+ PREF_TEST_CONFIG, Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sharedPref.edit();
+ editor.putInt(KEY_APP_TYPE, appType);
+ editor.putString(KEY_NAF_URL, url);
+ editor.putBoolean(KEY_FORCE_BT, force);
+ editor.putInt(KEY_ORG, org);
+ editor.putInt(KEY_SP_ID, spId);
+ editor.putInt(KEY_TLS_CS, tlsCs);
+ editor.commit();
+ }
+ }).start();
+ }
+
+ /** get the config of the uicc application type*/
+ public int getAppType() {
+ synchronized (PREF_TEST_CONFIG) {
+ return mAppType;
+ }
+ }
+
+ /** get the config of NAF url */
+ public String getNafUrl() {
+ synchronized (PREF_TEST_CONFIG) {
+ return mNafUrl;
+ }
+ }
+
+ /** get the config if bootstrap is forced */
+ public boolean isForceBootstrap() {
+ synchronized (PREF_TEST_CONFIG) {
+ return mForceBootstrap;
+ }
+ }
+
+ /** get the config of the organization code */
+ public int getOrg() {
+ synchronized (PREF_TEST_CONFIG) {
+ return mOrg;
+ }
+ }
+
+ /** get the config of the security protocol id */
+ public int getSpId() {
+ synchronized (PREF_TEST_CONFIG) {
+ return mSpId;
+ }
+ }
+
+ /** get the config of the tls ciper suite id */
+ public int getTlsCs() {
+ synchronized (PREF_TEST_CONFIG) {
+ return mTlsCs;
+ }
+ }
+
+ /** convert byte arry to hex string */
+ public static String byteArrayToHexString(byte[] data) {
+ if (data == null || data.length == 0) {
+ return "";
+ }
+
+ StringBuilder sb = new StringBuilder();
+ for (byte b : data) {
+ sb.append(String.format(Locale.US, "%02X", b));
+ }
+ return sb.toString();
+ }
+}
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/TestGbaService.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/TestGbaService.java
new file mode 100644
index 0000000..4b0636c
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/TestGbaService.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp;
+
+import android.annotation.NonNull;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.IBinder;
+import android.telephony.gba.GbaService;
+import android.util.Log;
+
+/** test GbaService to be used for Gba api test */
+public class TestGbaService extends GbaService {
+
+ private static final String TAG = "TestGbaService";
+
+ private Settings mSettings;
+
+ @Override
+ public void onCreate() {
+ Log.i(TAG, "TestGbaService: onCreate");
+ mSettings = Settings.getSettings(getApplicationContext());
+ }
+
+ @Override
+ public void onAuthenticationRequest(int subId, int token, int appType,
+ @NonNull Uri nafUrl, @NonNull byte[] securityProtocol, boolean forceBootStrapping) {
+ boolean isSuccess = mSettings.getAuthResult();
+ int reason = mSettings.getFailReason();
+ String key = mSettings.getGbaKey();
+ String btid = mSettings.getBTid();
+
+ if (isSuccess) {
+ reportKeysAvailable(token, key.getBytes(), btid);
+ } else {
+ reportAuthenticationFailure(token, reason);
+ }
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ Log.d(TAG, "onBind intent:" + intent);
+ return super.onBind(intent);
+ }
+
+ @Override
+ public void onDestroy() {
+ Log.d(TAG, "onDestroy!");
+ super.onDestroy();
+ }
+}
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/CarrierConfigFragment.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/CarrierConfigFragment.java
new file mode 100644
index 0000000..b0bfc32
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/CarrierConfigFragment.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp.ui.main;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.phone.testapps.gbatestapp.R;
+import com.android.phone.testapps.gbatestapp.Settings;
+import com.android.phone.testapps.gbatestapp.TestGbaService;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Use the {@link CarrierConfigFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class CarrierConfigFragment extends Fragment {
+ private static final String TAG = "CARRIER";
+
+ private static CarrierConfigFragment sInstance;
+
+ private Settings mSettings;
+ private EditText mEditPackageName;
+ private EditText mEditReleaseTime;
+
+ /** get the instance of CarrierConfigFragment */
+ public static CarrierConfigFragment newInstance() {
+ if (sInstance == null) {
+ Log.d(TAG, "new instance:");
+ sInstance = new CarrierConfigFragment();
+ }
+ return sInstance;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mSettings = Settings.getSettings(getActivity());
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ // Inflate the layout for this fragment
+ View viewHierarchy = inflater.inflate(R.layout.fragment_carrier_config, container, false);
+ mEditPackageName = viewHierarchy.findViewById(R.id.editServicePackageName);
+ mEditReleaseTime = viewHierarchy.findViewById(R.id.editServiceReleaseTime);
+ getConfig(false);
+
+ Button buttonDone = viewHierarchy.findViewById(R.id.carrier_config_done);
+ buttonDone.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mSettings.updateCarrierConfig(getActivity(),
+ mEditPackageName.getText().toString(),
+ Integer.parseInt(mEditReleaseTime.getText().toString()));
+ getFragmentManager().beginTransaction().remove(
+ CarrierConfigFragment.this).commitNow();
+ }
+ }
+ );
+
+ Button buttonClear = viewHierarchy.findViewById(R.id.carrier_config_clear);
+ buttonClear.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getConfig(true);
+ }
+ }
+ );
+ return viewHierarchy;
+ }
+
+ private void getConfig(boolean isDefault) {
+ String packagename = mSettings.getServicePackageName();
+ if (isDefault || packagename == null) {
+ packagename = TestGbaService.class.getPackage().getName();
+ }
+ mEditPackageName.setText(packagename);
+ mEditReleaseTime.setText(isDefault ? "0" : Integer.toString(mSettings.getReleaseTime()));
+ }
+}
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/MainFragment.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/MainFragment.java
new file mode 100644
index 0000000..ff50f5c
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/MainFragment.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp.ui.main;
+
+import android.content.Context;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.telephony.TelephonyManager;
+import android.telephony.gba.UaSecurityProtocolIdentifier;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.phone.testapps.gbatestapp.R;
+import com.android.phone.testapps.gbatestapp.Settings;
+
+/** main fragent to update settings and run the test */
+public class MainFragment extends Fragment {
+
+ private static final String TAG = "GBATestApp";
+ private static final String TAG_CARRIER = "carrier";
+ private static final String TAG_SERVICE = "service";
+ private static final String TAG_CLIENT = "client";
+
+ private static MainFragment sInstance;
+
+ private Settings mSettings;
+ private TelephonyManager mTelephonyManager;
+
+ /** Get the instance of MainFragment*/
+ public static MainFragment newInstance() {
+ if (sInstance == null) {
+ sInstance = new MainFragment();
+ }
+ return sInstance;
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ View viewHierarchy = inflater.inflate(R.layout.main_fragment, container, false);
+
+ Button buttonCarrier = viewHierarchy.findViewById(R.id.carrier_config_change_button);
+ buttonCarrier.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Fragment carrierFrag = getChildFragmentManager()
+ .findFragmentByTag(TAG_CARRIER);
+ if (carrierFrag == null) {
+ carrierFrag = CarrierConfigFragment.newInstance();
+ }
+ getChildFragmentManager()
+ .beginTransaction()
+ .replace(R.id.main, carrierFrag, TAG_CARRIER)
+ .commitNow();
+ }
+ }
+ );
+
+ Button buttonService = viewHierarchy.findViewById(R.id.service_config);
+ buttonService.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Fragment serviceFrag = getChildFragmentManager()
+ .findFragmentByTag(TAG_SERVICE);
+ if (serviceFrag == null) {
+ serviceFrag = ServiceConfigFragment.newInstance();
+ }
+ getChildFragmentManager()
+ .beginTransaction()
+ .replace(R.id.main, serviceFrag, TAG_SERVICE)
+ .commitNow();
+ }
+ }
+ );
+
+ Button buttonClient = viewHierarchy.findViewById(R.id.client_config);
+ buttonClient.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Fragment testFrag = getChildFragmentManager()
+ .findFragmentByTag(TAG_CLIENT);
+ if (testFrag == null) {
+ testFrag = TestConfigFragment.newInstance();
+ }
+
+ getChildFragmentManager()
+ .beginTransaction()
+ .replace(R.id.main, testFrag, TAG_CLIENT)
+ .commitNow();
+ }
+ }
+ );
+
+ Button buttonExit = viewHierarchy.findViewById(R.id.test_exit);
+ buttonExit.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getActivity().finish();
+ }
+ }
+ );
+
+ Button buttonRunning = viewHierarchy.findViewById(R.id.send_request);
+ buttonRunning.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Log.d(TAG, "starting test...");
+ TelephonyManager.BootstrapAuthenticationCallback cb = new
+ TelephonyManager.BootstrapAuthenticationCallback() {
+ @Override
+ public void onKeysAvailable(byte[] gbaKey, String btId) {
+ String result = "onKeysAvailable, key:"
+ + Settings.byteArrayToHexString(gbaKey)
+ + ", btid:" + btId;
+ Log.d(TAG, result);
+ getActivity().runOnUiThread(()-> {
+ mTestLog.append(result + "\n");
+ });
+ }
+
+ @Override
+ public void onAuthenticationFailure(int reason) {
+ String result = "onAuthFailure, cause:" + reason;
+ Log.d(TAG, result);
+ getActivity().runOnUiThread(
+ () -> mTestLog.append(result + "\n"));
+ }
+ };
+ UaSecurityProtocolIdentifier.Builder builder =
+ new UaSecurityProtocolIdentifier.Builder();
+ try {
+ if (mSettings.getOrg() != 0 || mSettings.getSpId() != 0
+ || mSettings.getTlsCs() != 0) {
+ builder.setOrg(mSettings.getOrg())
+ .setProtocol(mSettings.getSpId())
+ .setTlsCipherSuite(mSettings.getTlsCs());
+ }
+ } catch (IllegalArgumentException e) {
+ getActivity().runOnUiThread(() -> mTestLog.append(
+ "Fail to create UaSecurityProtocolIdentifier " + e + "\n"));
+ return;
+ }
+
+ UaSecurityProtocolIdentifier spId = builder.build();
+ Log.d(TAG, "bootstrapAuthenticationRequest with parameters [appType:"
+ + mSettings.getAppType() + ", NAF:" + mSettings.getNafUrl()
+ + ", spId:" + spId + ", isForceBootstrap:"
+ + mSettings.isForceBootstrap() + "]");
+ try {
+ mTelephonyManager.bootstrapAuthenticationRequest(
+ mSettings.getAppType(), Uri.parse(mSettings.getNafUrl()),
+ spId, mSettings.isForceBootstrap(),
+ AsyncTask.SERIAL_EXECUTOR, cb);
+ } catch (NullPointerException e) {
+ getActivity().runOnUiThread(() -> mTestLog.append(
+ "Invalid parameters, please check!" + "\n"));
+ }
+ }
+ }
+ );
+
+ return viewHierarchy;
+ }
+
+ TextView mTestLog;
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ mTelephonyManager = (TelephonyManager)
+ getContext().getSystemService(Context.TELEPHONY_SERVICE);
+ mSettings = Settings.getSettings(getContext());
+ mTestLog = getActivity().findViewById(R.id.viewTestOutput);
+ }
+
+}
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/ServiceConfigFragment.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/ServiceConfigFragment.java
new file mode 100644
index 0000000..5e7f2fa
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/ServiceConfigFragment.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp.ui.main;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.phone.testapps.gbatestapp.R;
+import com.android.phone.testapps.gbatestapp.Settings;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Use the {@link ServiceConfigFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class ServiceConfigFragment extends Fragment {
+
+ private static final String TAG = "SERVICE";
+
+ private static ServiceConfigFragment sInstance;
+
+ private Settings mSettings;
+
+ private CheckBox mAuthResult;
+ private EditText mGbaKey;
+ private EditText mBTid;
+ private EditText mFailReason;
+
+ /** get the instance of ServiceConfigFragment */
+ public static ServiceConfigFragment newInstance() {
+ if (sInstance == null) {
+ sInstance = new ServiceConfigFragment();
+ }
+ return sInstance;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mSettings = Settings.getSettings(getActivity());
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View viewHierarchy = inflater.inflate(R.layout.fragment_service_config, container, false);
+
+ mAuthResult = viewHierarchy.findViewById(R.id.checkBoxResult);
+ mFailReason = viewHierarchy.findViewById(R.id.editFailReason);
+ mGbaKey = viewHierarchy.findViewById(R.id.editKey);
+ mBTid = viewHierarchy.findViewById(R.id.editBTid);
+
+ setDefault();
+
+ Button buttonDone = viewHierarchy.findViewById(R.id.service_config_done);
+ buttonDone.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mSettings.updateServiceConfig(getActivity(), mAuthResult.isChecked(),
+ Integer.parseInt(mFailReason.getText().toString()),
+ mGbaKey.getText().toString(), mBTid.getText().toString());
+ getFragmentManager().beginTransaction()
+ .remove(ServiceConfigFragment.this).commitNow();
+ }
+ }
+ );
+
+ Button buttonClear = viewHierarchy.findViewById(R.id.service_config_clear);
+ buttonClear.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ setDefault();
+ }
+ }
+ );
+
+ return viewHierarchy;
+ }
+
+ private void setDefault() {
+ mAuthResult.setChecked(mSettings.getAuthResult());
+ String key = mSettings.getGbaKey();
+ if (key == null || key.isEmpty()) {
+ key = getString(R.string.sample_key);
+ }
+ mGbaKey.setText(key);
+ String id = mSettings.getBTid();
+ if (id == null || id.isEmpty()) {
+ id = getString(R.string.sample_btid);
+ }
+ mBTid.setText(id);
+ mFailReason.setText(Integer.toString(mSettings.getFailReason()));
+ }
+}
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/TestConfigFragment.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/TestConfigFragment.java
new file mode 100644
index 0000000..4049082
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/TestConfigFragment.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp.ui.main;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.phone.testapps.gbatestapp.R;
+import com.android.phone.testapps.gbatestapp.Settings;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Use the {@link TestConfigFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class TestConfigFragment extends Fragment {
+
+ private static final String TAG = "TEST_CONFIG";
+
+ private static TestConfigFragment sInstance;
+
+ private Settings mSettings;
+
+ private EditText mAppType;
+ private EditText mUrl;
+ private EditText mOrg;
+ private EditText mSpId;
+ private EditText mTlsCs;
+ private CheckBox mForce;
+
+ /** get the instance of TestConfigFragment */
+ public static TestConfigFragment newInstance() {
+ if (sInstance == null) {
+ sInstance = new TestConfigFragment();
+ }
+ return sInstance;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mSettings = Settings.getSettings(getActivity());
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View viewHierarchy = inflater.inflate(R.layout.fragment_test_config, container, false);
+ mAppType = viewHierarchy.findViewById(R.id.editAppType);
+ mUrl = viewHierarchy.findViewById(R.id.editUrl);
+ mOrg = viewHierarchy.findViewById(R.id.editOrg);
+ mSpId = viewHierarchy.findViewById(R.id.editSpId);
+ mTlsCs = viewHierarchy.findViewById(R.id.editTlsCs);
+ mForce = viewHierarchy.findViewById(R.id.checkBoxForce);
+
+ setDefault();
+
+ Button buttonDone = viewHierarchy.findViewById(R.id.client_config_done);
+ buttonDone.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Log.d(TAG, "updateTestConfig");
+ mSettings.updateTestConfig(getActivity(),
+ Integer.parseInt(mAppType.getText().toString()),
+ mUrl.getText().toString(),
+ mForce.isChecked(),
+ Integer.parseInt(mOrg.getText().toString()),
+ Integer.parseInt(mSpId.getText().toString()),
+ Integer.parseInt(mTlsCs.getText().toString()));
+ getFragmentManager().beginTransaction().remove(
+ TestConfigFragment.this).commitNow();
+ }
+ }
+ );
+
+ Button buttonClear = viewHierarchy.findViewById(R.id.client_config_clear);
+ buttonClear.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ setDefault();
+ }
+ }
+ );
+
+ return viewHierarchy;
+ }
+
+ void setDefault() {
+ Log.d(TAG, "setDefault");
+ mAppType.setText(Integer.toString(mSettings.getAppType()));
+ String naf = mSettings.getNafUrl();
+ if (naf == null || naf.isEmpty()) {
+ naf = getString(R.string.sample_naf);
+ }
+ mUrl.setText(naf);
+ mOrg.setText(Integer.toString(mSettings.getOrg()));
+ mSpId.setText(Integer.toString(mSettings.getSpId()));
+ mTlsCs.setText(Integer.toString(mSettings.getTlsCs()));
+ mForce.setChecked(mSettings.isForceBootstrap());
+ }
+}
diff --git a/testapps/ImsTestService/AndroidManifest.xml b/testapps/ImsTestService/AndroidManifest.xml
index eea54b8..6177e73 100644
--- a/testapps/ImsTestService/AndroidManifest.xml
+++ b/testapps/ImsTestService/AndroidManifest.xml
@@ -16,40 +16,42 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- coreApp="true"
- package="com.android.phone.testapps.imstestapp">
+ coreApp="true"
+ package="com.android.phone.testapps.imstestapp">
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--Beware, declaring the below permission will cause the device to not boot unless you add
this app and permission to frameworks/base/data/etc/privapp-permissions-platform.xml-->
- <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
- <application
- android:label="ImsTestService"
- android:directBootAware="true">
- <activity
- android:name=".ImsTestServiceApp"
- android:label="ImsTestService">
+ <!--uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/-->
+ <application android:label="ImsTestService"
+ android:directBootAware="true">
+ <activity android:name=".ImsTestServiceApp"
+ android:label="ImsTestService"
+ android:exported="true">
<intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.LAUNCHER" />
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
- <activity android:name=".ImsRegistrationActivity" android:label="IMS Registration" />
- <activity android:name=".ImsCallingActivity" android:label="IMS Calling" />
- <activity android:name=".ImsConfigActivity" android:label="IMS Config" />
+ <activity android:name=".ImsRegistrationActivity"
+ android:label="IMS Registration"/>
+ <activity android:name=".ImsCallingActivity"
+ android:label="IMS Calling"/>
+ <activity android:name=".ImsConfigActivity"
+ android:label="IMS Config"/>
<service android:name=".TestImsService"
- android:exported="true"
- android:enabled="true"
- android:persistent="true"
- android:permission="android.permission.BIND_IMS_SERVICE">
- <!--meta-data android:name="android.telephony.ims.MMTEL_FEATURE" android:value="true"/-->
+ android:exported="true"
+ android:enabled="true"
+ android:persistent="true"
+ android:permission="android.permission.BIND_IMS_SERVICE">
+ <!--meta-data android:name="android.telephony.ims.MMTEL_FEATURE"
+ android:value="true"/-->
<!-- No features means we will get queried for dynamic config. -->
<intent-filter>
- <action android:name="android.telephony.ims.ImsService" />
+ <action android:name="android.telephony.ims.ImsService"/>
</intent-filter>
</service>
</application>
</manifest>
-
diff --git a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/SipTransportImpl.java b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/SipTransportImpl.java
new file mode 100644
index 0000000..1ae2594
--- /dev/null
+++ b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/SipTransportImpl.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.imstestapp;
+
+import android.telephony.ims.stub.SipTransportImplBase;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Test stub implementation of SipTransport.
+ */
+public class SipTransportImpl extends SipTransportImplBase {
+
+ private static SipTransportImpl sSipTransportInstance;
+
+ public static SipTransportImpl getInstance(Executor e) {
+ if (sSipTransportInstance == null) {
+ sSipTransportInstance = new SipTransportImpl(e);
+ }
+ return sSipTransportInstance;
+ };
+
+ public SipTransportImpl(Executor e) {
+ super(e);
+ }
+}
diff --git a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsService.java b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsService.java
index 71323d8..477c638 100644
--- a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsService.java
+++ b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsService.java
@@ -39,6 +39,7 @@
public TestMmTelFeatureImpl mTestMmTelFeature;
public TestRcsFeatureImpl mTestRcsFeature;
public TestImsConfigImpl mTestImsConfig;
+ public SipTransportImpl mSipTransportImpl;
public static TestImsService getInstance() {
return mInstance;
@@ -51,7 +52,8 @@
mTestMmTelFeature = TestMmTelFeatureImpl.getInstance();
mTestRcsFeature = new TestRcsFeatureImpl();
mTestImsConfig = TestImsConfigImpl.getInstance();
-
+ mSipTransportImpl = SipTransportImpl.getInstance(
+ getApplicationContext().getMainExecutor());
mInstance = this;
}
@@ -60,10 +62,16 @@
return new ImsFeatureConfiguration.Builder()
.addFeature(0, ImsFeature.FEATURE_EMERGENCY_MMTEL)
.addFeature(0, ImsFeature.FEATURE_MMTEL)
+ .addFeature(0, ImsFeature.FEATURE_RCS)
.build();
}
@Override
+ public long getImsServiceCapabilities() {
+ return CAPABILITY_SIP_DELEGATE_CREATION;
+ }
+
+ @Override
public MmTelFeature createMmTelFeature(int slotId) {
Log.i(LOG_TAG, "TestImsService: onCreateMmTelImsFeature");
return mTestMmTelFeature;
@@ -84,4 +92,9 @@
public ImsConfigImplBase getConfig(int slotId) {
return mTestImsConfig;
}
+
+ @Override
+ public SipTransportImpl getSipTransport(int slotId) {
+ return mSipTransportImpl;
+ }
}
diff --git a/testapps/SmsManagerTestApp/AndroidManifest.xml b/testapps/SmsManagerTestApp/AndroidManifest.xml
index c5f4621..7dc717f 100644
--- a/testapps/SmsManagerTestApp/AndroidManifest.xml
+++ b/testapps/SmsManagerTestApp/AndroidManifest.xml
@@ -16,29 +16,86 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.phone.testapps.smsmanagertestapp">
- <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="29" />
+ package="com.android.phone.testapps.smsmanagertestapp">
+ <uses-sdk android:minSdkVersion="24"
+ android:targetSdkVersion="29"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<application android:label="SmsManagerTestApp">
- <activity
- android:name=".SmsManagerTestApp"
- android:label="SmsManagerTestApp">
+ <activity android:name=".SmsManagerTestApp"
+ android:label="SmsManagerTestApp"
+ android:exported="true">
<intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.LAUNCHER" />
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
- <service android:name=".SmsManagerTestService" android:exported="false" />
+ <service android:name=".SmsManagerTestService"
+ android:exported="false"/>
<receiver android:name=".SendStatusReceiver"
- android:exported="false">
+ android:exported="false">
<intent-filter>
- <action android:name="com.android.phone.testapps.smsmanagertestapp.message_sent_action" />
- <data android:scheme="content" />
+ <action android:name="com.android.phone.testapps.smsmanagertestapp.message_sent_action"/>
+ <data android:scheme="content"/>
+ </intent-filter>
+ </receiver>
+ <service android:name=".PersistentService"
+ android:exported="false"
+ android:process=":persistent"
+ android:permission="android.permission.BIND_CARRIER_MESSAGING_CLIENT_SERVICE">
+ <intent-filter>
+ <action android:name="android.telephony.action.CARRIER_MESSAGING_CLIENT_SERVICE" />
+ </intent-filter>
+ </service>
+
+ <!-- Stuff required to become the default messaging app defined below, doesn't actually do
+ anything useful for now. -->
+
+ <!-- Fake BroadcastReceiver that listens for incoming SMS messages -->
+ <receiver android:name=".SmsReceiver"
+ android:permission="android.permission.BROADCAST_SMS">
+ <intent-filter>
+ <action android:name="android.provider.Telephony.SMS_DELIVER" />
</intent-filter>
</receiver>
+ <!-- Fake BroadcastReceiver that listens for incoming MMS messages -->
+ <receiver android:name=".MmsReceiver"
+ android:permission="android.permission.BROADCAST_WAP_PUSH">
+ <intent-filter>
+ <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
+ <data android:mimeType="application/vnd.wap.mms-message" />
+ </intent-filter>
+ </receiver>
+
+ <!-- Fake Activity that allows the user to send new SMS/MMS messages -->
+ <activity android:name=".ComposeSmsActivity" >
+ <intent-filter>
+ <action android:name="android.intent.action.SEND" />
+ <action android:name="android.intent.action.SENDTO" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="sms" />
+ <data android:scheme="smsto" />
+ <data android:scheme="mms" />
+ <data android:scheme="mmsto" />
+ </intent-filter>
+ </activity>
+
+ <!-- Fake Service that delivers messages from the phone "quick response" -->
+ <service android:name=".HeadlessSmsSendService"
+ android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
+ android:exported="true" >
+ <intent-filter>
+ <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="sms" />
+ <data android:scheme="smsto" />
+ <data android:scheme="mms" />
+ <data android:scheme="mmsto" />
+ </intent-filter>
+ </service>
+
</application>
</manifest>
-
diff --git a/testapps/SmsManagerTestApp/res/layout/activity_main.xml b/testapps/SmsManagerTestApp/res/layout/activity_main.xml
index 39fb6c6..185e0e2 100644
--- a/testapps/SmsManagerTestApp/res/layout/activity_main.xml
+++ b/testapps/SmsManagerTestApp/res/layout/activity_main.xml
@@ -63,5 +63,17 @@
android:layout_height="wrap_content"
android:paddingRight="4dp"
android:text="@string/get_sub_for_result_button"/>
+ <Button
+ android:id="@+id/enable_persistent_service"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingRight="4dp"
+ android:text="@string/enable_persistent_service"/>
+ <Button
+ android:id="@+id/disable_persistent_service"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingRight="4dp"
+ android:text="@string/disable_persistent_service"/>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
diff --git a/testapps/SmsManagerTestApp/res/values/donottranslate_strings.xml b/testapps/SmsManagerTestApp/res/values/donottranslate_strings.xml
index d6497a3..c8b9f91 100644
--- a/testapps/SmsManagerTestApp/res/values/donottranslate_strings.xml
+++ b/testapps/SmsManagerTestApp/res/values/donottranslate_strings.xml
@@ -19,4 +19,6 @@
<string name="send_text_button">Send Outgoing Text Now.</string>
<string name="send_text_service_button">Send Outgoing Text after 5 sec.</string>
<string name="get_sub_for_result_button">Ask user for sub id.</string>
+ <string name="enable_persistent_service">Enable Persistent Service</string>
+ <string name="disable_persistent_service">Disable Persistent Service</string>
</resources>
\ No newline at end of file
diff --git a/testapps/SmsManagerTestApp/src/com/android/phone/testapps/smsmanagertestapp/PersistentService.java b/testapps/SmsManagerTestApp/src/com/android/phone/testapps/smsmanagertestapp/PersistentService.java
new file mode 100644
index 0000000..16b7ecd
--- /dev/null
+++ b/testapps/SmsManagerTestApp/src/com/android/phone/testapps/smsmanagertestapp/PersistentService.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.smsmanagertestapp;
+
+import android.content.Intent;
+import android.service.carrier.CarrierMessagingClientService;
+import android.util.Log;
+
+/**
+ * A test persistent service that should be started by the framework when this app becomes the
+ * default SMS app and destroyed when it is removed. See {@link CarrierMessagingClientService} for
+ * more information.
+ */
+public class PersistentService extends CarrierMessagingClientService {
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ Log.i("SmsTestApp", "onCreate");
+ }
+
+ @Override
+ public void onDestroy() {
+ Log.i("SmsTestApp", "onDestroy");
+ }
+
+ @Override
+ public boolean onUnbind(Intent intent) {
+ Log.i("SmsTestApp", "onUnbind");
+ return false;
+ }
+}
diff --git a/testapps/SmsManagerTestApp/src/com/android/phone/testapps/smsmanagertestapp/SmsManagerTestApp.java b/testapps/SmsManagerTestApp/src/com/android/phone/testapps/smsmanagertestapp/SmsManagerTestApp.java
index 75536f3..785fe3f 100644
--- a/testapps/SmsManagerTestApp/src/com/android/phone/testapps/smsmanagertestapp/SmsManagerTestApp.java
+++ b/testapps/SmsManagerTestApp/src/com/android/phone/testapps/smsmanagertestapp/SmsManagerTestApp.java
@@ -66,6 +66,10 @@
findViewById(R.id.send_text_button_service)
.setOnClickListener(this::sendOutgoingSmsService);
findViewById(R.id.get_sub_for_result_button).setOnClickListener(this::getSubIdForResult);
+ findViewById(R.id.enable_persistent_service)
+ .setOnClickListener(this::setPersistentServiceComponentEnabled);
+ findViewById(R.id.disable_persistent_service)
+ .setOnClickListener(this::setPersistentServiceComponentDisabled);
mPhoneNumber = (EditText) findViewById(R.id.phone_number_text);
}
@@ -183,6 +187,21 @@
}
}
+ private void setPersistentServiceComponentEnabled(View view) {
+ getPackageManager().setComponentEnabledSetting(
+ new ComponentName(this, PersistentService.class),
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ PackageManager.DONT_KILL_APP);
+ }
+
+ private void setPersistentServiceComponentDisabled(View view) {
+ getPackageManager().setComponentEnabledSetting(
+ new ComponentName(this, PersistentService.class),
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ PackageManager.DONT_KILL_APP);
+ }
+
+
private Intent getSendStatusIntent() {
// Encode requestId in intent data
return new Intent(SendStatusReceiver.MESSAGE_SENT_ACTION, null, this,
diff --git a/testapps/TelephonyManagerTestApp/AndroidManifest.xml b/testapps/TelephonyManagerTestApp/AndroidManifest.xml
index 044d0b2..40fc549 100644
--- a/testapps/TelephonyManagerTestApp/AndroidManifest.xml
+++ b/testapps/TelephonyManagerTestApp/AndroidManifest.xml
@@ -15,7 +15,7 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.phone.testapps.telephonymanagertestapp">
+ package="com.android.phone.testapps.telephonymanagertestapp">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
@@ -26,31 +26,29 @@
<uses-permission android:name="android.permission.CALL_PRIVILEGED"/>
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
- android.Manifest.permission.ACCESS_FINE_LOCATION
+ android.Manifest.permission.ACCESS_FINE_LOCATION
<application android:label="TelephonyManagerTestApp">
- <activity
- android:name=".TelephonyManagerTestApp"
- android:label="TelephonyManagerTestApp">
+ <activity android:name=".TelephonyManagerTestApp"
+ android:label="TelephonyManagerTestApp"
+ android:exported="true">
<intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <action android:name="android.intent.action.SEARCH" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.LAUNCHER" />
+ <action android:name="android.intent.action.MAIN"/>
+ <action android:name="android.intent.action.SEARCH"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
- <meta-data
- android:name="android.app.searchable"
- android:resource="@xml/searchable">
+ <meta-data android:name="android.app.searchable"
+ android:resource="@xml/searchable">
</meta-data>
</activity>
- <activity
- android:name=".CallingMethodActivity"
- android:label="CallingMethodActivity">
+ <activity android:name=".CallingMethodActivity"
+ android:label="CallingMethodActivity"
+ android:exported="true">
<intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application>
</manifest>
-
diff --git a/testapps/TelephonyRegistryTestApp/AndroidManifest.xml b/testapps/TelephonyRegistryTestApp/AndroidManifest.xml
index 550c9f0..7432156 100644
--- a/testapps/TelephonyRegistryTestApp/AndroidManifest.xml
+++ b/testapps/TelephonyRegistryTestApp/AndroidManifest.xml
@@ -15,24 +15,23 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.phone.testapps.telephonyregistry">
+ package="com.android.phone.testapps.telephonyregistry">
<uses-sdk android:minSdkVersion="25"
- android:targetSdkVersion="25"/>
+ android:targetSdkVersion="25"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_PRECISE_PHONE_STATE"/>
<application android:label="TelephonyRegistryTestApp">
- <activity
- android:name=".TelephonyRegistryTestApp"
- android:label="TelephonyRegistryTestApp">
+ <activity android:name=".TelephonyRegistryTestApp"
+ android:label="TelephonyRegistryTestApp"
+ android:exported="true">
<intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.LAUNCHER" />
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
-
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index d434650..174d22e 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -31,6 +31,7 @@
adb shell am start -n com.android.phone.tests/.CallDialTest
-->
<activity android:name="CallDialTest"
+ android:exported="true"
android:label="@string/callDialTestLabel">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -39,6 +40,7 @@
</activity>
<service android:name="SendInstantTextTestService"
+ android:exported="true"
android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE" >
<intent-filter>
<action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
diff --git a/tests/src/com/android/TelephonyTestBase.java b/tests/src/com/android/TelephonyTestBase.java
index 132d893..09abb15 100644
--- a/tests/src/com/android/TelephonyTestBase.java
+++ b/tests/src/com/android/TelephonyTestBase.java
@@ -27,6 +27,7 @@
import org.mockito.MockitoAnnotations;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
/**
@@ -58,6 +59,21 @@
PhoneConfigurationManager.unregisterAllMultiSimConfigChangeRegistrants();
}
+ protected final boolean waitForExecutorAction(Executor executor, long timeoutMillis) {
+ final CountDownLatch lock = new CountDownLatch(1);
+ executor.execute(() -> {
+ lock.countDown();
+ });
+ while (lock.getCount() > 0) {
+ try {
+ return lock.await(timeoutMillis, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ // do nothing
+ }
+ }
+ return true;
+ }
+
protected final void waitForHandlerAction(Handler h, long timeoutMillis) {
final CountDownLatch lock = new CountDownLatch(1);
h.post(lock::countDown);
diff --git a/tests/src/com/android/TestContext.java b/tests/src/com/android/TestContext.java
index c5b9b1e..9d712d3 100644
--- a/tests/src/com/android/TestContext.java
+++ b/tests/src/com/android/TestContext.java
@@ -17,9 +17,10 @@
package com.android;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doAnswer;
import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -29,10 +30,13 @@
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.telephony.ims.ImsManager;
import android.test.mock.MockContext;
+import android.util.SparseArray;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.stubbing.Answer;
import java.util.concurrent.Executor;
@@ -42,12 +46,21 @@
@Mock TelecomManager mMockTelecomManager;
@Mock TelephonyManager mMockTelephonyManager;
@Mock SubscriptionManager mMockSubscriptionManager;
+ @Mock ImsManager mMockImsManager;
- private PersistableBundle mCarrierConfig = new PersistableBundle();
+ private SparseArray<PersistableBundle> mCarrierConfigs = new SparseArray<>();
public TestContext() {
MockitoAnnotations.initMocks(this);
- doReturn(mCarrierConfig).when(mMockCarrierConfigManager).getConfigForSubId(anyInt());
+ doAnswer((Answer<PersistableBundle>) invocation -> {
+ int subId = (int) invocation.getArguments()[0];
+ if (subId < 0) {
+ return new PersistableBundle();
+ }
+ PersistableBundle b = mCarrierConfigs.get(subId);
+
+ return (b != null ? b : new PersistableBundle());
+ }).when(mMockCarrierConfigManager).getConfigForSubId(anyInt());
}
@Override
@@ -94,6 +107,11 @@
}
@Override
+ public ContentResolver getContentResolver() {
+ return null;
+ }
+
+ @Override
public Object getSystemService(String name) {
switch (name) {
case (Context.CARRIER_CONFIG_SERVICE) : {
@@ -108,6 +126,9 @@
case (Context.TELEPHONY_SUBSCRIPTION_SERVICE) : {
return mMockSubscriptionManager;
}
+ case(Context.TELEPHONY_IMS_SERVICE) : {
+ return mMockImsManager;
+ }
}
return null;
}
@@ -129,7 +150,15 @@
return null;
}
- public PersistableBundle getCarrierConfig() {
- return mCarrierConfig;
+ /**
+ * @return CarrierConfig PersistableBundle for the subscription specified.
+ */
+ public PersistableBundle getCarrierConfig(int subId) {
+ PersistableBundle b = mCarrierConfigs.get(subId);
+ if (b == null) {
+ b = new PersistableBundle();
+ mCarrierConfigs.put(subId, b);
+ }
+ return b;
}
}
diff --git a/tests/src/com/android/TestExecutorService.java b/tests/src/com/android/TestExecutorService.java
new file mode 100644
index 0000000..fec502a
--- /dev/null
+++ b/tests/src/com/android/TestExecutorService.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Delayed;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * An implementation of ExecutorService that just runs the requested task on the thread that it
+ * was called on for testing purposes.
+ */
+public class TestExecutorService implements ScheduledExecutorService {
+
+ private static class CompletedFuture<T> implements Future<T>, ScheduledFuture<T> {
+
+ private final Callable<T> mTask;
+ private final long mDelayMs;
+
+ CompletedFuture(Callable<T> task) {
+ mTask = task;
+ mDelayMs = 0;
+ }
+
+ CompletedFuture(Callable<T> task, long delayMs) {
+ mTask = task;
+ mDelayMs = delayMs;
+ }
+
+ @Override
+ public boolean cancel(boolean mayInterruptIfRunning) {
+ return false;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return false;
+ }
+
+ @Override
+ public boolean isDone() {
+ return true;
+ }
+
+ @Override
+ public T get() throws InterruptedException, ExecutionException {
+ try {
+ return mTask.call();
+ } catch (Exception e) {
+ throw new ExecutionException(e);
+ }
+ }
+
+ @Override
+ public T get(long timeout, TimeUnit unit)
+ throws InterruptedException, ExecutionException, TimeoutException {
+ try {
+ return mTask.call();
+ } catch (Exception e) {
+ throw new ExecutionException(e);
+ }
+ }
+
+ @Override
+ public long getDelay(TimeUnit unit) {
+ if (unit == TimeUnit.MILLISECONDS) {
+ return mDelayMs;
+ } else {
+ // not implemented
+ return 0;
+ }
+ }
+
+ @Override
+ public int compareTo(Delayed o) {
+ if (o == null) return 1;
+ if (o.getDelay(TimeUnit.MILLISECONDS) > mDelayMs) return -1;
+ if (o.getDelay(TimeUnit.MILLISECONDS) < mDelayMs) return 1;
+ return 0;
+ }
+ }
+
+ @Override
+ public void shutdown() {
+ }
+
+ @Override
+ public List<Runnable> shutdownNow() {
+ return null;
+ }
+
+ @Override
+ public boolean isShutdown() {
+ return false;
+ }
+
+ @Override
+ public boolean isTerminated() {
+ return false;
+ }
+
+ @Override
+ public boolean awaitTermination(long timeout, TimeUnit unit) {
+ return false;
+ }
+
+ @Override
+ public <T> Future<T> submit(Callable<T> task) {
+ return new CompletedFuture<>(task);
+ }
+
+ @Override
+ public <T> Future<T> submit(Runnable task, T result) {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public Future<?> submit(Runnable task) {
+ task.run();
+ return new CompletedFuture<>(() -> null);
+ }
+
+ @Override
+ public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout,
+ TimeUnit unit) {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public <T> T invokeAny(Collection<? extends Callable<T>> tasks) {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
+ // No need to worry about delays yet
+ command.run();
+ return new CompletedFuture<>(() -> null, delay);
+ }
+
+ @Override
+ public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {
+ return new CompletedFuture<>(callable, delay);
+ }
+
+ @Override
+ public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period,
+ TimeUnit unit) {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay,
+ long delay, TimeUnit unit) {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public void execute(Runnable command) {
+ command.run();
+ }
+}
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index 2060e6f..07fe6a8 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -936,14 +936,14 @@
// Setup test to not support SUPL on the non-DDS subscription
doReturn(true).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
- getTestContext().getCarrierConfig().putStringArray(
+ getTestContext().getCarrierConfig(0 /*subId*/).putStringArray(
CarrierConfigManager.Gps.KEY_ES_SUPL_DATA_PLANE_ONLY_ROAMING_PLMN_STRING_ARRAY,
null);
testPhone.getServiceState().setRoaming(false);
- getTestContext().getCarrierConfig().putInt(
+ getTestContext().getCarrierConfig(0 /*subId*/).putInt(
CarrierConfigManager.Gps.KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT,
CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_DP_ONLY);
- getTestContext().getCarrierConfig().putString(
+ getTestContext().getCarrierConfig(0 /*subId*/).putString(
CarrierConfigManager.Gps.KEY_ES_EXTENSION_SEC_STRING, "150");
delayDialRunnable.run();
@@ -1021,14 +1021,14 @@
// Setup test to not support SUPL on the non-DDS subscription
doReturn(true).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
- getTestContext().getCarrierConfig().putStringArray(
+ getTestContext().getCarrierConfig(0 /*subId*/).putStringArray(
CarrierConfigManager.Gps.KEY_ES_SUPL_DATA_PLANE_ONLY_ROAMING_PLMN_STRING_ARRAY,
null);
testPhone.getServiceState().setRoaming(false);
- getTestContext().getCarrierConfig().putInt(
+ getTestContext().getCarrierConfig(0 /*subId*/).putInt(
CarrierConfigManager.Gps.KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT,
CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_CP_FALLBACK);
- getTestContext().getCarrierConfig().putString(
+ getTestContext().getCarrierConfig(0 /*subId*/).putString(
CarrierConfigManager.Gps.KEY_ES_EXTENSION_SEC_STRING, "0");
delayDialRunnable.run();
@@ -1047,14 +1047,14 @@
// If the non-DDS supports SUPL, dont switch data
doReturn(false).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
- getTestContext().getCarrierConfig().putStringArray(
+ getTestContext().getCarrierConfig(0 /*subId*/).putStringArray(
CarrierConfigManager.Gps.KEY_ES_SUPL_DATA_PLANE_ONLY_ROAMING_PLMN_STRING_ARRAY,
null);
testPhone.getServiceState().setRoaming(false);
- getTestContext().getCarrierConfig().putInt(
+ getTestContext().getCarrierConfig(0 /*subId*/).putInt(
CarrierConfigManager.Gps.KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT,
CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_DP_ONLY);
- getTestContext().getCarrierConfig().putString(
+ getTestContext().getCarrierConfig(0 /*subId*/).putString(
CarrierConfigManager.Gps.KEY_ES_EXTENSION_SEC_STRING, "0");
delayDialRunnable.run();
@@ -1073,14 +1073,14 @@
// Setup test to not support SUPL on the non-DDS subscription
doReturn(true).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
- getTestContext().getCarrierConfig().putStringArray(
+ getTestContext().getCarrierConfig(0 /*subId*/).putStringArray(
CarrierConfigManager.Gps.KEY_ES_SUPL_DATA_PLANE_ONLY_ROAMING_PLMN_STRING_ARRAY,
null);
testPhone.getServiceState().setRoaming(true);
- getTestContext().getCarrierConfig().putInt(
+ getTestContext().getCarrierConfig(0 /*subId*/).putInt(
CarrierConfigManager.Gps.KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT,
CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_DP_ONLY);
- getTestContext().getCarrierConfig().putString(
+ getTestContext().getCarrierConfig(0 /*subId*/).putString(
CarrierConfigManager.Gps.KEY_ES_EXTENSION_SEC_STRING, "0");
delayDialRunnable.run();
@@ -1107,13 +1107,13 @@
doReturn(true).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
String[] roamingPlmns = new String[1];
roamingPlmns[0] = testRoamingOperator;
- getTestContext().getCarrierConfig().putStringArray(
+ getTestContext().getCarrierConfig(0 /*subId*/).putStringArray(
CarrierConfigManager.Gps.KEY_ES_SUPL_DATA_PLANE_ONLY_ROAMING_PLMN_STRING_ARRAY,
roamingPlmns);
- getTestContext().getCarrierConfig().putInt(
+ getTestContext().getCarrierConfig(0 /*subId*/).putInt(
CarrierConfigManager.Gps.KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT,
CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_CP_FALLBACK);
- getTestContext().getCarrierConfig().putString(
+ getTestContext().getCarrierConfig(0 /*subId*/).putString(
CarrierConfigManager.Gps.KEY_ES_EXTENSION_SEC_STRING, "0");
delayDialRunnable.run();
@@ -1140,13 +1140,13 @@
doReturn(true).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
String[] roamingPlmns = new String[1];
roamingPlmns[0] = testRoamingOperator;
- getTestContext().getCarrierConfig().putStringArray(
+ getTestContext().getCarrierConfig(0 /*subId*/).putStringArray(
CarrierConfigManager.Gps.KEY_ES_SUPL_DATA_PLANE_ONLY_ROAMING_PLMN_STRING_ARRAY,
roamingPlmns);
- getTestContext().getCarrierConfig().putInt(
+ getTestContext().getCarrierConfig(0 /*subId*/).putInt(
CarrierConfigManager.Gps.KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT,
CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_CP_FALLBACK);
- getTestContext().getCarrierConfig().putString(
+ getTestContext().getCarrierConfig(0 /*subId*/).putString(
CarrierConfigManager.Gps.KEY_ES_EXTENSION_SEC_STRING, "0");
delayDialRunnable.run();
diff --git a/tests/src/com/android/services/telephony/TelephonyManagerTest.java b/tests/src/com/android/services/telephony/TelephonyManagerTest.java
new file mode 100644
index 0000000..e9cdc98
--- /dev/null
+++ b/tests/src/com/android/services/telephony/TelephonyManagerTest.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.telephony.emergency.EmergencyNumber;
+import android.test.mock.MockContext;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.telephony.ITelephony;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** Unit tests for {@link TelephonyManager}. */
+@RunWith(AndroidJUnit4.class)
+public class TelephonyManagerTest {
+ private static final String PKG_NAME = "Unittest.TelephonyManagerTest";
+ private static final String TAG = "TelephonyManagerTest";
+
+ private ITelephony mMockITelephony;
+ private SubscriptionManager mMockSubscriptionManager;
+ private Context mMockContext;
+
+ private TelephonyManager mTelephonyManager;
+
+ private final MockContext mContext =
+ new MockContext() {
+ @Override
+ public String getOpPackageName() {
+ return PKG_NAME;
+ }
+ @Override
+ public String getAttributionTag() {
+ return TAG;
+ }
+ @Override
+ public Context getApplicationContext() {
+ return null;
+ }
+ @Override
+ public Object getSystemService(String name) {
+ switch (name) {
+ case (Context.TELEPHONY_SUBSCRIPTION_SERVICE) : {
+ return mMockSubscriptionManager;
+ }
+ }
+ return null;
+ }
+ };
+
+ @Before
+ public void setUp() throws Exception {
+ mMockITelephony = mock(ITelephony.class);
+ mMockSubscriptionManager = mock(SubscriptionManager.class);
+ mMockContext = mock(Context.class);
+ when(mMockContext.getSystemService(eq(Context.TELEPHONY_SUBSCRIPTION_SERVICE)))
+ .thenReturn(mMockSubscriptionManager);
+
+ mTelephonyManager = new TelephonyManager(mContext);
+ TelephonyManager.setupITelephonyForTest(mMockITelephony);
+ TelephonyManager.enableServiceHandleCaching();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ TelephonyManager.setupITelephonyForTest(null);
+ TelephonyManager.disableServiceHandleCaching();
+ }
+
+ @Test
+ public void testGetEmergencyNumberListForCategories() throws Exception {
+ Map<Integer, List<EmergencyNumber>> emergencyNumberLists = new HashMap<>();
+ List<EmergencyNumber> emergencyNumberList = new ArrayList<>();
+ EmergencyNumber number_police = new EmergencyNumber(
+ "911",
+ "us",
+ "30",
+ EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE,
+ new ArrayList<String>(),
+ EmergencyNumber.EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING,
+ EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL);
+ EmergencyNumber number_fire = new EmergencyNumber(
+ "912",
+ "us",
+ "30",
+ EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_FIRE_BRIGADE,
+ new ArrayList<String>(),
+ EmergencyNumber.EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING,
+ EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL);
+ emergencyNumberList.add(number_police);
+ emergencyNumberList.add(number_fire);
+ final int test_sub_id = 1;
+ emergencyNumberLists.put(test_sub_id, emergencyNumberList);
+ when(mMockITelephony.getEmergencyNumberList(eq(PKG_NAME), eq(TAG))).thenReturn(
+ emergencyNumberLists);
+
+ // Call TelephonyManager.getEmergencyNumberList(Category)
+ Map<Integer, List<EmergencyNumber>> returnedEmergencyNumberLists =
+ mTelephonyManager.getEmergencyNumberList(
+ EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE);
+
+ // Verify the ITelephony service is called
+ verify(mMockITelephony, times(1)).getEmergencyNumberList(eq(PKG_NAME), eq(TAG));
+
+ // Verify the returned number list contains only the police number(s)
+ List<EmergencyNumber> returnedEmergencyNumberList = returnedEmergencyNumberLists.get(
+ test_sub_id);
+ for (EmergencyNumber num : returnedEmergencyNumberList) {
+ assertTrue(num.isInEmergencyServiceCategories(
+ EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE));
+ }
+ }
+}
diff --git a/tests/src/com/android/services/telephony/TestTelephonyConnection.java b/tests/src/com/android/services/telephony/TestTelephonyConnection.java
index 09cec17..67e0329 100644
--- a/tests/src/com/android/services/telephony/TestTelephonyConnection.java
+++ b/tests/src/com/android/services/telephony/TestTelephonyConnection.java
@@ -21,6 +21,7 @@
import android.os.Bundle;
import android.os.PersistableBundle;
import android.telecom.PhoneAccountHandle;
+import android.telephony.TelephonyManager;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -61,6 +62,9 @@
Resources mMockResources;
@Mock
+ TelephonyManager mMockTelephonyManager;
+
+ @Mock
EmergencyNumberTracker mEmergencyNumberTracker;
private Phone mMockPhone;
@@ -84,6 +88,7 @@
mMockPhone = mock(Phone.class);
mMockContext = mock(Context.class);
+ mMockTelephonyManager = mock(TelephonyManager.class);
mOriginalConnection = mMockRadioConnection;
// Set up mMockRadioConnection and mMockPhone to contain an active call
when(mMockRadioConnection.getState()).thenReturn(Call.State.ACTIVE);
@@ -101,6 +106,8 @@
when(mMockPhone.getContext()).thenReturn(mMockContext);
when(mMockPhone.getCurrentSubscriberUris()).thenReturn(null);
when(mMockContext.getResources()).thenReturn(mMockResources);
+ when(mMockContext.getSystemService(Context.TELEPHONY_SERVICE))
+ .thenReturn(mMockTelephonyManager);
when(mMockResources.getBoolean(anyInt())).thenReturn(false);
when(mMockPhone.getDefaultPhone()).thenReturn(mMockPhone);
when(mMockPhone.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_IMS);
@@ -169,6 +176,12 @@
// Requires ImsManager dependencies, do not implement during testing.
}
+ @Override
+ boolean isWfcEnabled(Phone phone) {
+ // Requires ImsManager dependencies, mock for test.
+ return true;
+ }
+
public int getNotifyPhoneAccountChangedCount() {
return mNotifyPhoneAccountChangedCount;
}
diff --git a/tests/src/com/android/services/telephony/rcs/DelegateStateTrackerTest.java b/tests/src/com/android/services/telephony/rcs/DelegateStateTrackerTest.java
new file mode 100644
index 0000000..4d40702
--- /dev/null
+++ b/tests/src/com/android/services/telephony/rcs/DelegateStateTrackerTest.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateConnectionStateCallback;
+import android.util.ArraySet;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.TelephonyTestBase;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+@RunWith(AndroidJUnit4.class)
+public class DelegateStateTrackerTest extends TelephonyTestBase {
+ private static final int TEST_SUB_ID = 1;
+
+ @Mock private ISipDelegate mSipDelegate;
+ @Mock private ISipDelegateConnectionStateCallback mAppCallback;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ /**
+ * When an underlying SipDelegate is created, the app should only receive one onCreated callback
+ * independent of how many times sipDelegateConnected is called. Once created, registration
+ * and IMS configuration events should propagate up to the app as well.
+ */
+ @SmallTest
+ @Test
+ public void testDelegateCreated() throws Exception {
+ DelegateStateTracker stateTracker = new DelegateStateTracker(TEST_SUB_ID, mAppCallback,
+ mSipDelegate);
+ Set<FeatureTagState> deniedTags = getMmTelDeniedTag();
+ stateTracker.sipDelegateConnected(deniedTags);
+ // Calling connected multiple times should not generate multiple onCreated events.
+ stateTracker.sipDelegateConnected(deniedTags);
+ verify(mAppCallback).onCreated(mSipDelegate);
+
+ // Ensure status updates are sent to app as expected.
+ DelegateRegistrationState regState = new DelegateRegistrationState.Builder()
+ .addRegisteredFeatureTag(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG)
+ .build();
+ SipDelegateImsConfiguration config = new SipDelegateImsConfiguration.Builder(1/*version*/)
+ .build();
+ stateTracker.onRegistrationStateChanged(regState);
+ stateTracker.onImsConfigurationChanged(config);
+ verify(mAppCallback).onFeatureTagStatusChanged(eq(regState),
+ eq(new ArrayList<>(deniedTags)));
+ verify(mAppCallback).onImsConfigurationChanged(config);
+
+ verify(mAppCallback, never()).onDestroyed(anyInt());
+ }
+
+ /**
+ * onDestroyed should be called when sipDelegateDestroyed is called.
+ */
+ @SmallTest
+ @Test
+ public void testDelegateDestroyed() throws Exception {
+ DelegateStateTracker stateTracker = new DelegateStateTracker(TEST_SUB_ID, mAppCallback,
+ mSipDelegate);
+ Set<FeatureTagState> deniedTags = getMmTelDeniedTag();
+ stateTracker.sipDelegateConnected(deniedTags);
+
+ stateTracker.sipDelegateDestroyed(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ verify(mAppCallback).onDestroyed(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ }
+
+ /**
+ * When a SipDelegate is created and then an event occurs that will destroy->create a new
+ * SipDelegate underneath, we need to move the state of the features that are reporting
+ * registered to DEREGISTERING_REASON_FEATURE_TAGS_CHANGING so that the app can close dialogs on
+ * it. Once the new underlying SipDelegate is created, we must verify that the new registration
+ * is propagated up without any overrides.
+ */
+ @SmallTest
+ @Test
+ public void testDelegateChangingRegisteredTagsOverride() throws Exception {
+ DelegateStateTracker stateTracker = new DelegateStateTracker(TEST_SUB_ID, mAppCallback,
+ mSipDelegate);
+ Set<FeatureTagState> deniedTags = getMmTelDeniedTag();
+ stateTracker.sipDelegateConnected(deniedTags);
+ // SipDelegate created
+ verify(mAppCallback).onCreated(mSipDelegate);
+ DelegateRegistrationState regState = new DelegateRegistrationState.Builder()
+ .addRegisteredFeatureTag(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG)
+ .addDeregisteringFeatureTag(ImsSignallingUtils.FILE_TRANSFER_HTTP_TAG,
+ DelegateRegistrationState.DEREGISTERING_REASON_PROVISIONING_CHANGE)
+ .addDeregisteredFeatureTag(ImsSignallingUtils.GROUP_CHAT_TAG,
+ DelegateRegistrationState.DEREGISTERED_REASON_NOT_PROVISIONED)
+ .build();
+ stateTracker.onRegistrationStateChanged(regState);
+ // Simulate underlying SipDelegate switch
+ stateTracker.sipDelegateChanging(
+ DelegateRegistrationState.DEREGISTERING_REASON_FEATURE_TAGS_CHANGING);
+ // onFeatureTagStatusChanged should now be called with registered features overridden with
+ // DEREGISTERING_REASON_FEATURE_TAGS_CHANGING
+ DelegateRegistrationState overrideRegState = new DelegateRegistrationState.Builder()
+ .addDeregisteringFeatureTag(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG,
+ DelegateRegistrationState.DEREGISTERING_REASON_FEATURE_TAGS_CHANGING)
+ // Already Deregistering/Deregistered tags should not be overridden.
+ .addDeregisteringFeatureTag(ImsSignallingUtils.FILE_TRANSFER_HTTP_TAG,
+ DelegateRegistrationState.DEREGISTERING_REASON_PROVISIONING_CHANGE)
+ .addDeregisteredFeatureTag(ImsSignallingUtils.GROUP_CHAT_TAG,
+ DelegateRegistrationState.DEREGISTERED_REASON_NOT_PROVISIONED)
+ .build();
+ // new underlying SipDelegate created
+ stateTracker.sipDelegateConnected(deniedTags);
+ stateTracker.onRegistrationStateChanged(regState);
+
+ // Verify registration state through the process:
+ ArgumentCaptor<DelegateRegistrationState> regCaptor =
+ ArgumentCaptor.forClass(DelegateRegistrationState.class);
+ verify(mAppCallback, times(3)).onFeatureTagStatusChanged(
+ regCaptor.capture(), eq(new ArrayList<>(deniedTags)));
+ List<DelegateRegistrationState> testStates = regCaptor.getAllValues();
+ // feature tags should first be registered
+ assertEquals(regState, testStates.get(0));
+ // registered feature tags should have moved to deregistering
+ assertEquals(overrideRegState, testStates.get(1));
+ // and then moved back to registered after underlying FT change done.
+ assertEquals(regState, testStates.get(2));
+
+ //onCreate should only have been called once and onDestroy should have never been called.
+ verify(mAppCallback).onCreated(mSipDelegate);
+ verify(mAppCallback, never()).onDestroyed(anyInt());
+ }
+
+ /**
+ * Test the case that when the underlying Denied tags change in the SipDelegate, the change is
+ * properly shown in the registration update event.
+ */
+ @SmallTest
+ @Test
+ public void testDelegateChangingDeniedTagsChanged() throws Exception {
+ DelegateStateTracker stateTracker = new DelegateStateTracker(TEST_SUB_ID, mAppCallback,
+ mSipDelegate);
+ Set<FeatureTagState> deniedTags = getMmTelDeniedTag();
+ stateTracker.sipDelegateConnected(deniedTags);
+ // SipDelegate created
+ verify(mAppCallback).onCreated(mSipDelegate);
+ DelegateRegistrationState regState = new DelegateRegistrationState.Builder()
+ .addRegisteredFeatureTag(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG)
+ .build();
+ stateTracker.onRegistrationStateChanged(regState);
+ // Simulate underlying SipDelegate switch
+ stateTracker.sipDelegateChanging(
+ DelegateRegistrationState.DEREGISTERING_REASON_FEATURE_TAGS_CHANGING);
+ // onFeatureTagStatusChanged should now be called with registered features overridden with
+ // DEREGISTERING_REASON_FEATURE_TAGS_CHANGING
+ DelegateRegistrationState overrideRegState = new DelegateRegistrationState.Builder()
+ .addDeregisteringFeatureTag(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG,
+ DelegateRegistrationState.DEREGISTERING_REASON_FEATURE_TAGS_CHANGING)
+ .build();
+ // Verify registration state so far.
+ ArgumentCaptor<DelegateRegistrationState> regCaptor =
+ ArgumentCaptor.forClass(DelegateRegistrationState.class);
+ verify(mAppCallback, times(2)).onFeatureTagStatusChanged(
+ regCaptor.capture(), eq(new ArrayList<>(deniedTags)));
+ List<DelegateRegistrationState> testStates = regCaptor.getAllValues();
+ assertEquals(2, testStates.size());
+ // feature tags should first be registered
+ assertEquals(regState, testStates.get(0));
+ // registered feature tags should have moved to deregistering
+ assertEquals(overrideRegState, testStates.get(1));
+
+ // 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);
+ DelegateRegistrationState fullyDeniedRegState = new DelegateRegistrationState.Builder()
+ .build();
+ // In this special case, it will be the SipDelegateConnectionBase that will trigger
+ // reg state change.
+ stateTracker.onRegistrationStateChanged(fullyDeniedRegState);
+ verify(mAppCallback).onFeatureTagStatusChanged(regCaptor.capture(),
+ eq(new ArrayList<>(deniedTags)));
+ // now all feature tags denied, so we should see only denied tags.
+ assertEquals(fullyDeniedRegState, regCaptor.getValue());
+
+ //onCreate should only have been called once and onDestroy should have never been called.
+ verify(mAppCallback).onCreated(mSipDelegate);
+ verify(mAppCallback, never()).onDestroyed(anyInt());
+ }
+
+ /**
+ * Test that when we move from changing tags state to the delegate being destroyed, we get the
+ * correct onDestroy event sent to the app.
+ */
+ @SmallTest
+ @Test
+ public void testDelegateChangingDeniedTagsChangingToDestroy() throws Exception {
+ DelegateStateTracker stateTracker = new DelegateStateTracker(TEST_SUB_ID, mAppCallback,
+ mSipDelegate);
+ Set<FeatureTagState> deniedTags = getMmTelDeniedTag();
+ stateTracker.sipDelegateConnected(deniedTags);
+ // SipDelegate created
+ verify(mAppCallback).onCreated(mSipDelegate);
+ DelegateRegistrationState regState = new DelegateRegistrationState.Builder()
+ .addRegisteredFeatureTag(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG)
+ .addDeregisteredFeatureTag(ImsSignallingUtils.GROUP_CHAT_TAG,
+ DelegateRegistrationState.DEREGISTERED_REASON_NOT_PROVISIONED)
+ .build();
+ stateTracker.onRegistrationStateChanged(regState);
+ verify(mAppCallback).onFeatureTagStatusChanged(any(),
+ eq(new ArrayList<>(deniedTags)));
+ // Simulate underlying SipDelegate switch
+ stateTracker.sipDelegateChanging(
+ DelegateRegistrationState.DEREGISTERING_REASON_DESTROY_PENDING);
+ // Destroy
+ stateTracker.sipDelegateDestroyed(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+
+ // onFeatureTagStatusChanged should now be called with registered features overridden with
+ // DEREGISTERING_REASON_DESTROY_PENDING
+ DelegateRegistrationState overrideRegState = new DelegateRegistrationState.Builder()
+ .addDeregisteringFeatureTag(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG,
+ DelegateRegistrationState.DEREGISTERING_REASON_DESTROY_PENDING)
+ // Deregistered should stay the same.
+ .addDeregisteredFeatureTag(ImsSignallingUtils.GROUP_CHAT_TAG,
+ DelegateRegistrationState.DEREGISTERED_REASON_NOT_PROVISIONED)
+ .build();
+ // Verify registration state through process:
+ ArgumentCaptor<DelegateRegistrationState> regCaptor =
+ ArgumentCaptor.forClass(DelegateRegistrationState.class);
+ verify(mAppCallback, times(2)).onFeatureTagStatusChanged(regCaptor.capture(),
+ eq(new ArrayList<>(deniedTags)));
+ List<DelegateRegistrationState> testStates = regCaptor.getAllValues();
+ assertEquals(2, testStates.size());
+ // feature tags should first be registered
+ assertEquals(regState, testStates.get(0));
+ // registered feature tags should have moved to deregistering
+ assertEquals(overrideRegState, testStates.get(1));
+ //onCreate/onDestroy should only be called once.
+ verify(mAppCallback).onCreated(mSipDelegate);
+ verify(mAppCallback).onDestroyed(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ }
+
+ private Set<FeatureTagState> getMmTelDeniedTag() {
+ Set<FeatureTagState> deniedTags = new ArraySet<>();
+ deniedTags.add(new FeatureTagState(ImsSignallingUtils.MMTEL_TAG,
+ SipDelegateManager.DENIED_REASON_NOT_ALLOWED));
+ return deniedTags;
+ }
+}
diff --git a/tests/src/com/android/services/telephony/rcs/ImsSignallingUtils.java b/tests/src/com/android/services/telephony/rcs/ImsSignallingUtils.java
new file mode 100644
index 0000000..d607f6d
--- /dev/null
+++ b/tests/src/com/android/services/telephony/rcs/ImsSignallingUtils.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+/**
+ * Various definitions and utilities related to IMS Signalling.
+ */
+public class ImsSignallingUtils {
+ public static final String MMTEL_TAG =
+ "+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-service.ims.icsi.mmtel\"";
+ public static final String ONE_TO_ONE_CHAT_TAG =
+ "+g.3gpp.icsi-ref=\"urn%3Aurn-7%3A3gppservice.ims.icsi.oma.cpm.msg\"";
+ public static final String GROUP_CHAT_TAG =
+ "+g.3gpp.icsi-ref=\"urn%3Aurn-7%3A3gppservice.ims.icsi.oma.cpm.session\"";
+ public static final String FILE_TRANSFER_HTTP_TAG =
+ "+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gppapplication.ims.iari.rcs.fthttp\"";
+}
diff --git a/tests/src/com/android/services/telephony/rcs/MessageTransportStateTrackerTest.java b/tests/src/com/android/services/telephony/rcs/MessageTransportStateTrackerTest.java
new file mode 100644
index 0000000..5e05085
--- /dev/null
+++ b/tests/src/com/android/services/telephony/rcs/MessageTransportStateTrackerTest.java
@@ -0,0 +1,243 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.os.RemoteException;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.SipMessage;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.TelephonyTestBase;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+
+@RunWith(AndroidJUnit4.class)
+public class MessageTransportStateTrackerTest extends TelephonyTestBase {
+ private static final int TEST_SUB_ID = 1;
+
+ private static final SipMessage TEST_MESSAGE = new SipMessage(
+ "INVITE sip:callee@ex.domain.com SIP/2.0",
+ "Via: SIP/2.0/UDP ex.place.com;branch=z9hG4bK776asdhds",
+ new byte[0]);
+
+ // Use for finer-grained control of when the Executor executes.
+ private static class PendingExecutor implements Executor {
+ private final ArrayList<Runnable> mPendingRunnables = new ArrayList<>();
+
+ @Override
+ public void execute(Runnable command) {
+ mPendingRunnables.add(command);
+ }
+
+ public void executePending() {
+ for (Runnable r : mPendingRunnables) {
+ r.run();
+ }
+ mPendingRunnables.clear();
+ }
+ }
+
+ @Mock private ISipDelegateMessageCallback mDelegateMessageCallback;
+ @Mock private ISipDelegate mISipDelegate;
+ @Mock private Consumer<Boolean> mMockCloseConsumer;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @SmallTest
+ @Test
+ public void testDelegateConnectionSendOutgoingMessage() throws Exception {
+ MessageTransportStateTracker tracker = new MessageTransportStateTracker(TEST_SUB_ID,
+ Runnable::run, mDelegateMessageCallback);
+
+ tracker.openTransport(mISipDelegate, Collections.emptySet());
+ tracker.getDelegateConnection().sendMessage(TEST_MESSAGE, 1 /*version*/);
+ verify(mISipDelegate).sendMessage(TEST_MESSAGE, 1 /*version*/);
+
+ doThrow(new RemoteException()).when(mISipDelegate).sendMessage(any(), anyLong());
+ tracker.getDelegateConnection().sendMessage(TEST_MESSAGE, 1 /*version*/);
+ verify(mDelegateMessageCallback).onMessageSendFailure(any(),
+ eq(SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_DEAD));
+
+ tracker.close(SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_CLOSED);
+ tracker.getDelegateConnection().sendMessage(TEST_MESSAGE, 1 /*version*/);
+ verify(mDelegateMessageCallback).onMessageSendFailure(any(),
+ eq(SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_CLOSED));
+ }
+
+ @SmallTest
+ @Test
+ public void testDelegateConnectionCloseGracefully() throws Exception {
+ PendingExecutor executor = new PendingExecutor();
+ MessageTransportStateTracker tracker = new MessageTransportStateTracker(TEST_SUB_ID,
+ executor, mDelegateMessageCallback);
+
+ tracker.openTransport(mISipDelegate, Collections.emptySet());
+ tracker.getDelegateConnection().sendMessage(TEST_MESSAGE, 1 /*version*/);
+ executor.executePending();
+ verify(mISipDelegate).sendMessage(TEST_MESSAGE, 1 /*version*/);
+ verify(mDelegateMessageCallback, never()).onMessageSendFailure(any(), anyInt());
+
+ // Use PendingExecutor a little weird here, we need to queue sendMessage first, even though
+ // closeGracefully will complete partly synchronously to test that the pending message will
+ // return MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION before the scheduled
+ // graceful close operation completes.
+ tracker.getDelegateConnection().sendMessage(TEST_MESSAGE, 1 /*version*/);
+ tracker.closeGracefully(
+ SipDelegateManager.MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION,
+ SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_CLOSED,
+ mMockCloseConsumer);
+ verify(mMockCloseConsumer, never()).accept(any());
+ // resolve pending close operation
+ executor.executePending();
+ verify(mDelegateMessageCallback).onMessageSendFailure(any(),
+ eq(SipDelegateManager.MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION));
+ // Still should only report one call of sendMessage from before
+ verify(mISipDelegate).sendMessage(TEST_MESSAGE, 1 /*version*/);
+ verify(mMockCloseConsumer).accept(true);
+
+ // ensure that after close operation completes, we get the correct
+ // MESSAGE_FAILURE_REASON_DELEGATE_CLOSED message.
+ tracker.getDelegateConnection().sendMessage(TEST_MESSAGE, 1 /*version*/);
+ executor.executePending();
+ verify(mDelegateMessageCallback).onMessageSendFailure(any(),
+ eq(SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_CLOSED));
+ // Still should only report one call of sendMessage from before
+ verify(mISipDelegate).sendMessage(TEST_MESSAGE, 1 /*version*/);
+ }
+
+ @SmallTest
+ @Test
+ public void testDelegateConnectionNotifyMessageReceived() throws Exception {
+ MessageTransportStateTracker tracker = new MessageTransportStateTracker(TEST_SUB_ID,
+ Runnable::run, mDelegateMessageCallback);
+ tracker.openTransport(mISipDelegate, Collections.emptySet());
+ tracker.getDelegateConnection().notifyMessageReceived("z9hG4bK776asdhds");
+ verify(mISipDelegate).notifyMessageReceived("z9hG4bK776asdhds");
+ }
+
+ @SmallTest
+ @Test
+ public void testDelegateConnectionNotifyMessageReceiveError() throws Exception {
+ MessageTransportStateTracker tracker = new MessageTransportStateTracker(TEST_SUB_ID,
+ Runnable::run, mDelegateMessageCallback);
+ tracker.openTransport(mISipDelegate, Collections.emptySet());
+ tracker.getDelegateConnection().notifyMessageReceiveError("z9hG4bK776asdhds",
+ SipDelegateManager.MESSAGE_FAILURE_REASON_NETWORK_NOT_AVAILABLE);
+ verify(mISipDelegate).notifyMessageReceiveError("z9hG4bK776asdhds",
+ SipDelegateManager.MESSAGE_FAILURE_REASON_NETWORK_NOT_AVAILABLE);
+ }
+
+ @SmallTest
+ @Test
+ public void testDelegateConnectionCloseDialog() throws Exception {
+ MessageTransportStateTracker tracker = new MessageTransportStateTracker(TEST_SUB_ID,
+ Runnable::run, mDelegateMessageCallback);
+ tracker.openTransport(mISipDelegate, Collections.emptySet());
+ tracker.getDelegateConnection().closeDialog("testCallId");
+ verify(mISipDelegate).closeDialog("testCallId");
+ }
+
+ @SmallTest
+ @Test
+ public void testDelegateOnMessageReceived() throws Exception {
+ MessageTransportStateTracker tracker = new MessageTransportStateTracker(TEST_SUB_ID,
+ Runnable::run, mDelegateMessageCallback);
+ tracker.openTransport(mISipDelegate, Collections.emptySet());
+
+ tracker.getMessageCallback().onMessageReceived(TEST_MESSAGE);
+ verify(mDelegateMessageCallback).onMessageReceived(TEST_MESSAGE);
+
+ doThrow(new RemoteException()).when(mDelegateMessageCallback).onMessageReceived(any());
+ tracker.getMessageCallback().onMessageReceived(TEST_MESSAGE);
+ verify(mISipDelegate).notifyMessageReceiveError(any(),
+ eq(SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_DEAD));
+ }
+
+ @SmallTest
+ @Test
+ public void testDelegateOnMessageReceivedClosedGracefully() throws Exception {
+ PendingExecutor executor = new PendingExecutor();
+ MessageTransportStateTracker tracker = new MessageTransportStateTracker(TEST_SUB_ID,
+ executor, mDelegateMessageCallback);
+ tracker.openTransport(mISipDelegate, Collections.emptySet());
+
+ tracker.getMessageCallback().onMessageReceived(TEST_MESSAGE);
+ executor.executePending();
+ verify(mDelegateMessageCallback).onMessageReceived(TEST_MESSAGE);
+
+ tracker.getMessageCallback().onMessageReceived(TEST_MESSAGE);
+ tracker.closeGracefully(
+ SipDelegateManager.MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION,
+ SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_CLOSED,
+ mMockCloseConsumer);
+ executor.executePending();
+ // Incoming SIP message should not be blocked by closeGracefully
+ verify(mDelegateMessageCallback, times(2)).onMessageReceived(TEST_MESSAGE);
+ }
+
+ @SmallTest
+ @Test
+ public void testDelegateOnMessageSent() throws Exception {
+ MessageTransportStateTracker tracker = new MessageTransportStateTracker(TEST_SUB_ID,
+ Runnable::run, mDelegateMessageCallback);
+ tracker.openTransport(mISipDelegate, Collections.emptySet());
+ tracker.getMessageCallback().onMessageSent("z9hG4bK776asdhds");
+ verify(mDelegateMessageCallback).onMessageSent("z9hG4bK776asdhds");
+ }
+
+ @SmallTest
+ @Test
+ public void testDelegateonMessageSendFailure() throws Exception {
+ MessageTransportStateTracker tracker = new MessageTransportStateTracker(TEST_SUB_ID,
+ Runnable::run, mDelegateMessageCallback);
+ tracker.openTransport(mISipDelegate, Collections.emptySet());
+ tracker.getMessageCallback().onMessageSendFailure("z9hG4bK776asdhds",
+ SipDelegateManager.MESSAGE_FAILURE_REASON_NETWORK_NOT_AVAILABLE);
+ verify(mDelegateMessageCallback).onMessageSendFailure("z9hG4bK776asdhds",
+ SipDelegateManager.MESSAGE_FAILURE_REASON_NETWORK_NOT_AVAILABLE);
+ }
+}
diff --git a/tests/src/com/android/services/telephony/rcs/RcsFeatureControllerTest.java b/tests/src/com/android/services/telephony/rcs/RcsFeatureControllerTest.java
index fbb270d..7e87dc7 100644
--- a/tests/src/com/android/services/telephony/rcs/RcsFeatureControllerTest.java
+++ b/tests/src/com/android/services/telephony/rcs/RcsFeatureControllerTest.java
@@ -100,7 +100,8 @@
verify(mMockFeature).onRcsConnected(mFeatureManager);
// Disconnect
- mConnectorListener.getValue().connectionUnavailable();
+ mConnectorListener.getValue().connectionUnavailable(
+ FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
verify(mFeatureManager).unregisterImsRegistrationCallback(any());
verify(mMockFeature, times(2)).onRcsDisconnected();
@@ -193,7 +194,8 @@
public void testFeatureManagerDisconnectedAddFeature() {
RcsFeatureController controller = createFeatureController();
// Disconnect the RcsFeatureManager
- mConnectorListener.getValue().connectionUnavailable();
+ mConnectorListener.getValue().connectionUnavailable(
+ FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
controller.addFeature(mMockFeature, RcsFeatureController.Feature.class);
verify(mMockFeature).onRcsDisconnected();
@@ -205,7 +207,8 @@
IImsRegistrationCallback regCb = mock(IImsRegistrationCallback.class);
IImsCapabilityCallback capCb = mock(IImsCapabilityCallback.class);
// Disconnect the RcsFeatureManager
- mConnectorListener.getValue().connectionUnavailable();
+ mConnectorListener.getValue().connectionUnavailable(
+ FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
try {
controller.registerImsRegistrationCallback(0 /*subId*/, null /*callback*/);
diff --git a/tests/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionTest.java b/tests/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionTest.java
new file mode 100644
index 0000000..360fa21
--- /dev/null
+++ b/tests/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionTest.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.verify;
+
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.DelegateRequest;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.IImsRegistration;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.telephony.ims.aidl.ISipDelegateStateCallback;
+import android.telephony.ims.aidl.ISipTransport;
+import android.util.ArraySet;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.TelephonyTestBase;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+
+import java.util.ArrayList;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+@RunWith(AndroidJUnit4.class)
+public class SipDelegateBinderConnectionTest extends TelephonyTestBase {
+ private static final int TEST_SUB_ID = 1;
+
+ @Mock private ISipDelegate mMockDelegate;
+ @Mock private ISipTransport mMockTransport;
+ @Mock private IImsRegistration mMockRegistration;
+ @Mock private IBinder mTransportBinder;
+ @Mock private ISipDelegateMessageCallback mMessageCallback;
+ @Mock private DelegateBinderStateManager.StateCallback mMockStateCallback;
+ @Mock private BiConsumer<ISipDelegate, Set<FeatureTagState>> mMockCreatedCallback;
+ @Mock private Consumer<Integer> mMockDestroyedCallback;
+
+ private ArrayList<SipDelegateBinderConnection.StateCallback> mStateCallbackList;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ doReturn(mTransportBinder).when(mMockTransport).asBinder();
+ mStateCallbackList = new ArrayList<>(1);
+ mStateCallbackList.add(mMockStateCallback);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @SmallTest
+ @Test
+ public void testBaseImpl() throws Exception {
+ DelegateBinderStateManager baseConnection = new SipDelegateBinderConnectionStub(
+ getMmTelDeniedTag(), Runnable::run, mStateCallbackList);
+
+ baseConnection.create(null /*message cb*/, mMockCreatedCallback);
+ // Verify the stub simulates onCreated + on registration state callback.
+ verify(mMockCreatedCallback).accept(any(), eq(getMmTelDeniedTag()));
+ verify(mMockStateCallback).onRegistrationStateChanged(
+ new DelegateRegistrationState.Builder().build());
+
+ // Verify onDestroyed is called correctly.
+ baseConnection.destroy(SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP,
+ mMockDestroyedCallback);
+ verify(mMockDestroyedCallback).accept(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ }
+
+ @SmallTest
+ @Test
+ public void testCreateConnection() throws Exception {
+ DelegateRequest request = getDelegateRequest();
+ ArraySet<FeatureTagState> deniedTags = getMmTelDeniedTag();
+ SipDelegateBinderConnection connection = new SipDelegateBinderConnection(TEST_SUB_ID,
+ mMockTransport, mMockRegistration, request, deniedTags, Runnable::run,
+ mStateCallbackList);
+ ISipDelegateStateCallback cb = createDelegateCaptureStateCallback(request, connection);
+
+ // Send onCreated callback from SipDelegate
+ ArrayList<FeatureTagState> delegateDeniedTags = new ArrayList<>(1);
+ delegateDeniedTags.add(new FeatureTagState(ImsSignallingUtils.GROUP_CHAT_TAG,
+ SipDelegateManager.DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE));
+ assertNotNull(cb);
+ cb.onCreated(mMockDelegate, delegateDeniedTags);
+
+ ArraySet<FeatureTagState> totalDeniedTags = new ArraySet<>(deniedTags);
+ // Add the tags denied by the controller as well.
+ totalDeniedTags.addAll(delegateDeniedTags);
+ // The callback should contain the controller and delegate denied tags in the callback.
+ verify(mMockCreatedCallback).accept(mMockDelegate, totalDeniedTags);
+ }
+
+ @SmallTest
+ @Test
+ public void testCreateConnectionServiceDead() throws Exception {
+ DelegateRequest request = getDelegateRequest();
+ ArraySet<FeatureTagState> deniedTags = getMmTelDeniedTag();
+ SipDelegateBinderConnection connection = new SipDelegateBinderConnection(TEST_SUB_ID,
+ mMockTransport, mMockRegistration, request, deniedTags, Runnable::run,
+ mStateCallbackList);
+ doThrow(new RemoteException()).when(mMockTransport).createSipDelegate(eq(TEST_SUB_ID),
+ any(), any(), any());
+ ISipDelegateStateCallback cb = createDelegateCaptureStateCallback(request, connection);
+ assertNull(cb);
+ }
+
+ @SmallTest
+ @Test
+ public void testDestroyConnection() throws Exception {
+ DelegateRequest request = getDelegateRequest();
+ ArraySet<FeatureTagState> deniedTags = getMmTelDeniedTag();
+ SipDelegateBinderConnection connection = new SipDelegateBinderConnection(TEST_SUB_ID,
+ mMockTransport, mMockRegistration, request, deniedTags, Runnable::run,
+ mStateCallbackList);
+ ISipDelegateStateCallback cb = createDelegateCaptureStateCallback(request, connection);
+ assertNotNull(cb);
+ cb.onCreated(mMockDelegate, null /*denied*/);
+ verify(mMockCreatedCallback).accept(mMockDelegate, deniedTags);
+
+ // call Destroy on the SipDelegate
+ destroy(connection, SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ cb.onDestroyed(SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ verify(mMockDestroyedCallback).accept(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ }
+
+ @SmallTest
+ @Test
+ public void testDestroyConnectionDead() throws Exception {
+ DelegateRequest request = getDelegateRequest();
+ ArraySet<FeatureTagState> deniedTags = getMmTelDeniedTag();
+ SipDelegateBinderConnection connection = new SipDelegateBinderConnection(TEST_SUB_ID,
+ mMockTransport, mMockRegistration, request, deniedTags, Runnable::run,
+ mStateCallbackList);
+ ISipDelegateStateCallback cb = createDelegateCaptureStateCallback(request, connection);
+ assertNotNull(cb);
+ cb.onCreated(mMockDelegate, null /*denied*/);
+ verify(mMockCreatedCallback).accept(mMockDelegate, deniedTags);
+
+ // try to destroy when dead and ensure callback is still called.
+ doThrow(new RemoteException()).when(mMockTransport).destroySipDelegate(any(), anyInt());
+ destroy(connection, SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ verify(mMockDestroyedCallback).accept(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ }
+
+ @SmallTest
+ @Test
+ public void testStateCallback() throws Exception {
+ DelegateRequest request = getDelegateRequest();
+ ArraySet<FeatureTagState> deniedTags = getMmTelDeniedTag();
+ SipDelegateBinderConnection connection = new SipDelegateBinderConnection(TEST_SUB_ID,
+ mMockTransport, mMockRegistration, request, deniedTags, Runnable::run,
+ mStateCallbackList);
+ ISipDelegateStateCallback cb = createDelegateCaptureStateCallback(request, connection);
+ assertNotNull(cb);
+ cb.onCreated(mMockDelegate, new ArrayList<>(deniedTags));
+ verify(mMockCreatedCallback).accept(mMockDelegate, deniedTags);
+
+ SipDelegateImsConfiguration config = new SipDelegateImsConfiguration.Builder(1).build();
+ cb.onImsConfigurationChanged(config);
+ verify(mMockStateCallback).onImsConfigurationChanged(config);
+
+ DelegateRegistrationState regState = new DelegateRegistrationState.Builder()
+ .addRegisteredFeatureTags(request.getFeatureTags()).build();
+ cb.onFeatureTagRegistrationChanged(regState);
+ verify(mMockStateCallback).onRegistrationStateChanged(regState);
+ }
+
+ private ISipDelegateStateCallback createDelegateCaptureStateCallback(
+ DelegateRequest r, SipDelegateBinderConnection c) throws Exception {
+ boolean isCreating = c.create(mMessageCallback, mMockCreatedCallback);
+ if (!isCreating) return null;
+ ArgumentCaptor<ISipDelegateStateCallback> stateCaptor =
+ ArgumentCaptor.forClass(ISipDelegateStateCallback.class);
+ verify(mMockTransport).createSipDelegate(eq(TEST_SUB_ID), eq(r), stateCaptor.capture(),
+ eq(mMessageCallback));
+ assertNotNull(stateCaptor.getValue());
+ return stateCaptor.getValue();
+ }
+
+ private void destroy(SipDelegateBinderConnection c, int reason) throws Exception {
+ c.destroy(reason, mMockDestroyedCallback);
+ verify(mMockTransport).destroySipDelegate(mMockDelegate, reason);
+ }
+
+ private DelegateRequest getDelegateRequest() {
+ ArraySet<String> featureTags = new ArraySet<>(2);
+ featureTags.add(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG);
+ featureTags.add(ImsSignallingUtils.GROUP_CHAT_TAG);
+ return new DelegateRequest(featureTags);
+ }
+
+ private ArraySet<FeatureTagState> getMmTelDeniedTag() {
+ ArraySet<FeatureTagState> deniedTags = new ArraySet<>();
+ deniedTags.add(new FeatureTagState(ImsSignallingUtils.MMTEL_TAG,
+ SipDelegateManager.DENIED_REASON_NOT_ALLOWED));
+ return deniedTags;
+ }
+}
diff --git a/tests/src/com/android/services/telephony/rcs/SipDelegateControllerTest.java b/tests/src/com/android/services/telephony/rcs/SipDelegateControllerTest.java
new file mode 100644
index 0000000..27f896b
--- /dev/null
+++ b/tests/src/com/android/services/telephony/rcs/SipDelegateControllerTest.java
@@ -0,0 +1,268 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.DelegateRequest;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.util.ArraySet;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.TelephonyTestBase;
+import com.android.TestExecutorService;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+@RunWith(AndroidJUnit4.class)
+public class SipDelegateControllerTest extends TelephonyTestBase {
+ private static final int TEST_SUB_ID = 1;
+
+ @Mock private ISipDelegate mMockSipDelegate;
+ @Mock private MessageTransportStateTracker mMockMessageTracker;
+ @Mock private ISipDelegateMessageCallback mMockMessageCallback;
+ @Mock private DelegateStateTracker mMockDelegateStateTracker;
+ @Mock private DelegateBinderStateManager mMockBinderConnection;
+ @Captor private ArgumentCaptor<BiConsumer<ISipDelegate, Set<FeatureTagState>>> mCreatedCaptor;
+ @Captor private ArgumentCaptor<Consumer<Boolean>> mBooleanConsumerCaptor;
+ @Captor private ArgumentCaptor<Consumer<Integer>> mIntegerConsumerCaptor;
+
+ private ScheduledExecutorService mExecutorService;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ when(mMockMessageTracker.getMessageCallback()).thenReturn(mMockMessageCallback);
+ mExecutorService = new TestExecutorService();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ mExecutorService.shutdownNow();
+ super.tearDown();
+ }
+
+ @SmallTest
+ @Test
+ public void testCreateDelegate() throws Exception {
+ DelegateRequest request = getBaseDelegateRequest();
+ SipDelegateController controller = getTestDelegateController(request,
+ Collections.emptySet());
+
+ doReturn(true).when(mMockBinderConnection).create(eq(mMockMessageCallback), any());
+ CompletableFuture<Boolean> future = controller.create(request.getFeatureTags(),
+ Collections.emptySet() /*denied tags*/);
+ BiConsumer<ISipDelegate, Set<FeatureTagState>> consumer =
+ verifyConnectionCreated(1);
+ assertNotNull(consumer);
+
+ assertFalse(future.isDone());
+ consumer.accept(mMockSipDelegate, Collections.emptySet());
+ assertTrue(future.get());
+ verify(mMockMessageTracker).openTransport(mMockSipDelegate, Collections.emptySet());
+ verify(mMockDelegateStateTracker).sipDelegateConnected(Collections.emptySet());
+ }
+
+ @SmallTest
+ @Test
+ public void testCreateDelegateTransportDied() throws Exception {
+ DelegateRequest request = getBaseDelegateRequest();
+ SipDelegateController controller = getTestDelegateController(request,
+ Collections.emptySet());
+
+ //Create operation fails
+ doReturn(false).when(mMockBinderConnection).create(eq(mMockMessageCallback), any());
+ CompletableFuture<Boolean> future = controller.create(request.getFeatureTags(),
+ Collections.emptySet() /*denied tags*/);
+
+ assertFalse(future.get());
+ }
+
+ @SmallTest
+ @Test
+ public void testDestroyDelegate() throws Exception {
+ DelegateRequest request = getBaseDelegateRequest();
+ SipDelegateController controller = getTestDelegateController(request,
+ Collections.emptySet());
+ createSipDelegate(request, controller);
+
+ CompletableFuture<Integer> pendingDestroy = controller.destroy(false /*force*/,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ assertFalse(pendingDestroy.isDone());
+ Consumer<Boolean> pendingClosedConsumer = verifyMessageTrackerCloseGracefully();
+ verify(mMockDelegateStateTracker).sipDelegateChanging(
+ DelegateRegistrationState.DEREGISTERING_REASON_DESTROY_PENDING);
+
+ // verify we do not call destroy on the delegate until the message tracker releases the
+ // transport.
+ verify(mMockBinderConnection, never()).destroy(anyInt(), any());
+ pendingClosedConsumer.accept(true);
+ Consumer<Integer> pendingDestroyedConsumer = verifyBinderConnectionDestroy();
+ pendingDestroyedConsumer.accept(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ verify(mMockDelegateStateTracker).sipDelegateDestroyed(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ assertTrue(pendingDestroy.isDone());
+ assertEquals(SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP,
+ pendingDestroy.get().intValue());
+ }
+
+ @SmallTest
+ @Test
+ public void testDestroyDelegateForce() throws Exception {
+ DelegateRequest request = getBaseDelegateRequest();
+ SipDelegateController controller = getTestDelegateController(request,
+ Collections.emptySet());
+ createSipDelegate(request, controller);
+
+ CompletableFuture<Integer> pendingDestroy = controller.destroy(true /*force*/,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ assertFalse(pendingDestroy.isDone());
+ // Do not wait for message transport close in this case.
+ verify(mMockMessageTracker).close(
+ SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_CLOSED);
+ verify(mMockDelegateStateTracker, never()).sipDelegateChanging(
+ DelegateRegistrationState.DEREGISTERING_REASON_DESTROY_PENDING);
+
+ //verify destroy is called
+ Consumer<Integer> pendingDestroyedConsumer = verifyBinderConnectionDestroy();
+ pendingDestroyedConsumer.accept(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ verify(mMockDelegateStateTracker).sipDelegateDestroyed(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ assertTrue(pendingDestroy.isDone());
+ assertEquals(SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP,
+ pendingDestroy.get().intValue());
+ }
+
+ @SmallTest
+ @Test
+ public void testChangeSupportedFeatures() throws Exception {
+ DelegateRequest request = getBaseDelegateRequest();
+ SipDelegateController controller = getTestDelegateController(request,
+ Collections.emptySet());
+ createSipDelegate(request, controller);
+
+ Set<String> newFts = getBaseFTSet();
+ newFts.add(ImsSignallingUtils.GROUP_CHAT_TAG);
+ CompletableFuture<Boolean> pendingChange = controller.changeSupportedFeatureTags(
+ newFts, Collections.emptySet());
+ assertFalse(pendingChange.isDone());
+ // message tracker should close gracefully.
+ Consumer<Boolean> pendingClosedConsumer = verifyMessageTrackerCloseGracefully();
+ verify(mMockDelegateStateTracker).sipDelegateChanging(
+ DelegateRegistrationState.DEREGISTERING_REASON_FEATURE_TAGS_CHANGING);
+ verify(mMockBinderConnection, never()).destroy(anyInt(), any());
+ pendingClosedConsumer.accept(true);
+ Consumer<Integer> pendingDestroyedConsumer = verifyBinderConnectionDestroy();
+ pendingDestroyedConsumer.accept(
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ verify(mMockDelegateStateTracker, never()).sipDelegateDestroyed(anyInt());
+
+ // This will cause any exceptions to be printed if something completed exceptionally.
+ assertNull(pendingChange.getNow(null));
+ BiConsumer<ISipDelegate, Set<FeatureTagState>> consumer =
+ verifyConnectionCreated(2);
+ assertNotNull(consumer);
+ consumer.accept(mMockSipDelegate, Collections.emptySet());
+ assertTrue(pendingChange.get());
+
+ verify(mMockMessageTracker, times(2)).openTransport(mMockSipDelegate,
+ Collections.emptySet());
+ verify(mMockDelegateStateTracker, times(2)).sipDelegateConnected(Collections.emptySet());
+ }
+
+ private void createSipDelegate(DelegateRequest request, SipDelegateController controller)
+ throws Exception {
+ doReturn(true).when(mMockBinderConnection).create(eq(mMockMessageCallback), any());
+ CompletableFuture<Boolean> future = controller.create(request.getFeatureTags(),
+ Collections.emptySet() /*denied tags*/);
+ BiConsumer<ISipDelegate, Set<FeatureTagState>> consumer =
+ verifyConnectionCreated(1);
+ assertNotNull(consumer);
+ consumer.accept(mMockSipDelegate, Collections.emptySet());
+ assertTrue(future.get());
+ }
+
+ private ArraySet<String> getBaseFTSet() {
+ ArraySet<String> request = new ArraySet<>();
+ request.add(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG);
+ return request;
+ }
+
+ private DelegateRequest getBaseDelegateRequest() {
+ return new DelegateRequest(getBaseFTSet());
+ }
+
+ private SipDelegateController getTestDelegateController(DelegateRequest request,
+ Set<FeatureTagState> deniedSet) {
+ return new SipDelegateController(TEST_SUB_ID, request, "", mExecutorService,
+ mMockMessageTracker, mMockDelegateStateTracker,
+ (a, b, deniedFeatureSet, d, e) -> {
+ assertEquals(deniedSet, deniedFeatureSet);
+ return mMockBinderConnection;
+ });
+ }
+
+ private BiConsumer<ISipDelegate, Set<FeatureTagState>> verifyConnectionCreated(int numTimes) {
+ verify(mMockBinderConnection, times(numTimes)).create(eq(mMockMessageCallback),
+ mCreatedCaptor.capture());
+ return mCreatedCaptor.getValue();
+ }
+
+ private Consumer<Boolean> verifyMessageTrackerCloseGracefully() {
+ verify(mMockMessageTracker).closeGracefully(anyInt(), anyInt(),
+ mBooleanConsumerCaptor.capture());
+ return mBooleanConsumerCaptor.getValue();
+ }
+ private Consumer<Integer> verifyBinderConnectionDestroy() {
+ verify(mMockBinderConnection).destroy(anyInt(), mIntegerConsumerCaptor.capture());
+ return mIntegerConsumerCaptor.getValue();
+ }
+
+}
diff --git a/tests/src/com/android/services/telephony/rcs/SipTransportControllerTest.java b/tests/src/com/android/services/telephony/rcs/SipTransportControllerTest.java
new file mode 100644
index 0000000..fa27775
--- /dev/null
+++ b/tests/src/com/android/services/telephony/rcs/SipTransportControllerTest.java
@@ -0,0 +1,913 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.app.role.RoleManager;
+import android.os.IBinder;
+import android.os.UserHandle;
+import android.telephony.ims.DelegateRequest;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.IImsRegistration;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateConnectionStateCallback;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.telephony.ims.aidl.ISipTransport;
+import android.util.ArraySet;
+import android.util.Pair;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.TelephonyTestBase;
+import com.android.TestExecutorService;
+import com.android.ims.RcsFeatureManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+@RunWith(AndroidJUnit4.class)
+public class SipTransportControllerTest extends TelephonyTestBase {
+ private static final int TEST_SUB_ID = 1;
+ private static final String TEST_PACKAGE_NAME = "com.test_pkg";
+ private static final String TEST_PACKAGE_NAME_2 = "com.test_pkg2";
+ private static final int TIMEOUT_MS = 200;
+ private static final int THROTTLE_MS = 50;
+
+ private class SipDelegateControllerContainer {
+ public final int subId;
+ public final String packageName;
+ public final DelegateRequest delegateRequest;
+ public final SipDelegateController delegateController;
+ public final ISipDelegate mMockDelegate;
+ public final IBinder mMockDelegateBinder;
+
+ SipDelegateControllerContainer(int id, String name, DelegateRequest request) {
+ delegateController = mock(SipDelegateController.class);
+ mMockDelegate = mock(ISipDelegate.class);
+ mMockDelegateBinder = mock(IBinder.class);
+ doReturn(mMockDelegateBinder).when(mMockDelegate).asBinder();
+ doReturn(name).when(delegateController).getPackageName();
+ doReturn(request).when(delegateController).getInitialRequest();
+ doReturn(mMockDelegate).when(delegateController).getSipDelegateInterface();
+ subId = id;
+ packageName = name;
+ delegateRequest = request;
+ }
+ }
+
+ @Mock private RcsFeatureManager mRcsManager;
+ @Mock private ISipTransport mSipTransport;
+ @Mock private IImsRegistration mImsRegistration;
+ @Mock private ISipDelegateConnectionStateCallback mMockStateCallback;
+ @Mock private ISipDelegateMessageCallback mMockMessageCallback;
+ @Mock private SipTransportController.SipDelegateControllerFactory
+ mMockDelegateControllerFactory;
+ @Mock private SipTransportController.RoleManagerAdapter mMockRoleManager;
+
+ private ScheduledExecutorService mExecutorService = null;
+ private final ArrayList<SipDelegateControllerContainer> mMockControllers = new ArrayList<>();
+ private final ArrayList<String> mSmsPackageName = new ArrayList<>(1);
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ doReturn(mSmsPackageName).when(mMockRoleManager).getRoleHolders(RoleManager.ROLE_SMS);
+ doReturn(mImsRegistration).when(mRcsManager).getImsRegistration();
+ mSmsPackageName.add(TEST_PACKAGE_NAME);
+ doAnswer(invocation -> {
+ Integer subId = invocation.getArgument(0);
+ String packageName = invocation.getArgument(2);
+ DelegateRequest request = invocation.getArgument(1);
+ SipDelegateController c = getMockDelegateController(subId, packageName, request);
+ assertNotNull("create called with no corresponding controller set up", c);
+ return c;
+ }).when(mMockDelegateControllerFactory).create(anyInt(), any(), anyString(), any(), any(),
+ any(), any(), any());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ super.tearDown();
+ boolean isShutdown = mExecutorService == null || mExecutorService.isShutdown();
+ if (!isShutdown) {
+ mExecutorService.shutdownNow();
+ }
+ }
+
+ @SmallTest
+ @Test
+ public void isSupportedRcsNotConnected() {
+ SipTransportController controller = createController(new TestExecutorService());
+ try {
+ controller.isSupported(TEST_SUB_ID);
+ fail();
+ } catch (ImsException e) {
+ assertEquals(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE, e.getCode());
+ }
+ }
+
+ @SmallTest
+ @Test
+ public void isSupportedInvalidSubId() {
+ SipTransportController controller = createController(new TestExecutorService());
+ try {
+ controller.isSupported(TEST_SUB_ID + 1);
+ fail();
+ } catch (ImsException e) {
+ assertEquals(ImsException.CODE_ERROR_INVALID_SUBSCRIPTION, e.getCode());
+ }
+ }
+
+ @SmallTest
+ @Test
+ public void isSupportedSubIdChanged() {
+ SipTransportController controller = createController(new TestExecutorService());
+ controller.onAssociatedSubscriptionUpdated(TEST_SUB_ID + 1);
+ try {
+ controller.isSupported(TEST_SUB_ID);
+ fail();
+ } catch (ImsException e) {
+ assertEquals(ImsException.CODE_ERROR_INVALID_SUBSCRIPTION, e.getCode());
+ }
+ }
+
+ @SmallTest
+ @Test
+ public void isSupportedSipTransportAvailableRcsConnected() throws Exception {
+ SipTransportController controller = createController(new TestExecutorService());
+ doReturn(mSipTransport).when(mRcsManager).getSipTransport();
+ controller.onRcsConnected(mRcsManager);
+ try {
+ assertTrue(controller.isSupported(TEST_SUB_ID));
+ } catch (ImsException e) {
+ fail();
+ }
+ }
+
+ @SmallTest
+ @Test
+ public void isSupportedSipTransportNotAvailableRcsDisconnected() throws Exception {
+ SipTransportController controller = createController(new TestExecutorService());
+ doReturn(mSipTransport).when(mRcsManager).getSipTransport();
+ controller.onRcsConnected(mRcsManager);
+ controller.onRcsDisconnected();
+ try {
+ controller.isSupported(TEST_SUB_ID);
+ fail();
+ } catch (ImsException e) {
+ assertEquals(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE, e.getCode());
+ }
+ }
+
+ @SmallTest
+ @Test
+ public void isSupportedSipTransportNotAvailableRcsConnected() throws Exception {
+ SipTransportController controller = createController(new TestExecutorService());
+ doReturn(null).when(mRcsManager).getSipTransport();
+ controller.onRcsConnected(mRcsManager);
+ try {
+ assertFalse(controller.isSupported(TEST_SUB_ID));
+ } catch (ImsException e) {
+ fail();
+ }
+ }
+
+ @SmallTest
+ @Test
+ public void isSupportedImsServiceNotAvailableRcsConnected() throws Exception {
+ SipTransportController controller = createController(new TestExecutorService());
+ doThrow(new ImsException("", ImsException.CODE_ERROR_SERVICE_UNAVAILABLE))
+ .when(mRcsManager).getSipTransport();
+ controller.onRcsConnected(mRcsManager);
+ try {
+ controller.isSupported(TEST_SUB_ID);
+ fail();
+ } catch (ImsException e) {
+ assertEquals(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE, e.getCode());
+ }
+ }
+
+ @SmallTest
+ @Test
+ public void createImsServiceAvailableSubIdIncorrect() throws Exception {
+ SipTransportController controller = createController(new TestExecutorService());
+ doReturn(mSipTransport).when(mRcsManager).getSipTransport();
+ controller.onRcsConnected(mRcsManager);
+ try {
+ controller.createSipDelegate(TEST_SUB_ID + 1,
+ new DelegateRequest(Collections.emptySet()), TEST_PACKAGE_NAME,
+ mMockStateCallback, mMockMessageCallback);
+ fail();
+ } catch (ImsException e) {
+ assertEquals(ImsException.CODE_ERROR_INVALID_SUBSCRIPTION, e.getCode());
+ }
+ }
+
+ @SmallTest
+ @Test
+ public void createImsServiceDoesntSupportTransport() throws Exception {
+ SipTransportController controller = createController(new TestExecutorService());
+ doReturn(null).when(mRcsManager).getSipTransport();
+ controller.onRcsConnected(mRcsManager);
+ try {
+ controller.createSipDelegate(TEST_SUB_ID,
+ new DelegateRequest(Collections.emptySet()), TEST_PACKAGE_NAME,
+ mMockStateCallback, mMockMessageCallback);
+ fail();
+ } catch (ImsException e) {
+ assertEquals(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION, e.getCode());
+ }
+ }
+
+ @SmallTest
+ @Test
+ public void createImsServiceNotAvailable() throws Exception {
+ SipTransportController controller = createController(new TestExecutorService());
+ doThrow(new ImsException("", ImsException.CODE_ERROR_SERVICE_UNAVAILABLE))
+ .when(mRcsManager).getSipTransport();
+ // No RCS connected message
+ try {
+ controller.createSipDelegate(TEST_SUB_ID,
+ new DelegateRequest(Collections.emptySet()), TEST_PACKAGE_NAME,
+ mMockStateCallback, mMockMessageCallback);
+ fail();
+ } catch (ImsException e) {
+ assertEquals(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE, e.getCode());
+ }
+ }
+
+ @SmallTest
+ @Test
+ public void basicCreate() throws Exception {
+ SipTransportController controller = setupLiveTransportController();
+
+ DelegateRequest r = getBaseDelegateRequest();
+
+ SipDelegateController c = injectMockDelegateController(TEST_PACKAGE_NAME, r);
+ createDelegateAndVerify(controller, c, r, r.getFeatureTags(), Collections.emptySet(),
+ TEST_PACKAGE_NAME);
+ verifyDelegateRegistrationChangedEvent(1 /*times*/, 0 /*waitMs*/);
+ triggerFullNetworkRegistrationAndVerify(controller, c);
+ }
+
+ @SmallTest
+ @Test
+ public void basicCreateDestroy() throws Exception {
+ SipTransportController controller = setupLiveTransportController();
+
+ DelegateRequest r = getBaseDelegateRequest();
+ SipDelegateController c = injectMockDelegateController(TEST_PACKAGE_NAME, r);
+ createDelegateAndVerify(controller, c, r, r.getFeatureTags(), Collections.emptySet(),
+ TEST_PACKAGE_NAME);
+ verifyDelegateRegistrationChangedEvent(1, 0 /*throttle*/);
+
+ destroyDelegateAndVerify(controller, c, false,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ verifyDelegateRegistrationChangedEvent(2 /*times*/, 0 /*waitMs*/);
+ triggerFullNetworkRegistrationAndVerifyNever(controller, c);
+ }
+
+ @SmallTest
+ @Test
+ public void testCreateButNotInRole() throws Exception {
+ SipTransportController controller = setupLiveTransportController();
+
+ DelegateRequest r = getBaseDelegateRequest();
+ Set<FeatureTagState> getDeniedTags = getDeniedTagsForReason(r.getFeatureTags(),
+ SipDelegateManager.DENIED_REASON_NOT_ALLOWED);
+
+ // Try to create a SipDelegate for a package that is not the default sms role.
+ SipDelegateController c = injectMockDelegateController(TEST_PACKAGE_NAME_2, r);
+ createDelegateAndVerify(controller, c, r, Collections.emptySet(), getDeniedTags,
+ TEST_PACKAGE_NAME_2);
+ }
+
+ @SmallTest
+ @Test
+ public void createTwoAndDenyOverlappingTags() throws Exception {
+ SipTransportController controller = setupLiveTransportController(0 /*reeval*/,
+ THROTTLE_MS);
+
+ // First delegate requests RCS message + File transfer
+ ArraySet<String> firstDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
+ firstDelegate.remove(ImsSignallingUtils.GROUP_CHAT_TAG);
+ DelegateRequest firstDelegateRequest = new DelegateRequest(firstDelegate);
+ SipDelegateController c1 = injectMockDelegateController(TEST_PACKAGE_NAME,
+ firstDelegateRequest);
+ createDelegateAndVerify(controller, c1, firstDelegateRequest, firstDelegate,
+ Collections.emptySet(), TEST_PACKAGE_NAME);
+ // there is a delay in the indication to update reg, so it should not happen yet.
+ verifyNoDelegateRegistrationChangedEvent();
+
+ // First delegate requests RCS message + Group RCS message. For this delegate, single RCS
+ // message should be denied.
+ ArraySet<String> secondDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
+ secondDelegate.remove(ImsSignallingUtils.FILE_TRANSFER_HTTP_TAG);
+ DelegateRequest secondDelegateRequest = new DelegateRequest(secondDelegate);
+ Pair<Set<String>, Set<FeatureTagState>> grantedAndDenied = getAllowedAndDeniedTagsForConfig(
+ secondDelegateRequest, SipDelegateManager.DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE,
+ firstDelegate);
+ SipDelegateController c2 = injectMockDelegateController(TEST_PACKAGE_NAME,
+ secondDelegateRequest);
+ createDelegateAndVerify(controller, c2, secondDelegateRequest, grantedAndDenied.first,
+ grantedAndDenied.second, TEST_PACKAGE_NAME, 1);
+ // a reg changed event should happen after wait.
+ verifyDelegateRegistrationChangedEvent(1, 2 * THROTTLE_MS);
+ }
+
+ @SmallTest
+ @Test
+ public void createTwoAndTriggerRoleChange() throws Exception {
+ SipTransportController controller = setupLiveTransportController(0 /*reeval*/, THROTTLE_MS);
+
+ DelegateRequest firstDelegateRequest = getBaseDelegateRequest();
+ Set<FeatureTagState> firstDeniedTags = getDeniedTagsForReason(
+ firstDelegateRequest.getFeatureTags(),
+ SipDelegateManager.DENIED_REASON_NOT_ALLOWED);
+ SipDelegateController c1 = injectMockDelegateController(TEST_PACKAGE_NAME,
+ firstDelegateRequest);
+ createDelegateAndVerify(controller, c1, firstDelegateRequest,
+ firstDelegateRequest.getFeatureTags(), Collections.emptySet(), TEST_PACKAGE_NAME);
+ verifyDelegateRegistrationChangedEvent(1 /*times*/, THROTTLE_MS);
+
+ DelegateRequest secondDelegateRequest = getBaseDelegateRequest();
+ Set<FeatureTagState> secondDeniedTags = getDeniedTagsForReason(
+ secondDelegateRequest.getFeatureTags(),
+ SipDelegateManager.DENIED_REASON_NOT_ALLOWED);
+ // Try to create a SipDelegate for a package that is not the default sms role.
+ SipDelegateController c2 = injectMockDelegateController(TEST_PACKAGE_NAME_2,
+ secondDelegateRequest);
+ createDelegateAndVerify(controller, c2, secondDelegateRequest, Collections.emptySet(),
+ secondDeniedTags, TEST_PACKAGE_NAME_2, 1);
+
+ // now swap the SMS role.
+ CompletableFuture<Boolean> pendingC1Change = setChangeSupportedFeatureTagsFuture(c1,
+ Collections.emptySet(), firstDeniedTags);
+ CompletableFuture<Boolean> pendingC2Change = setChangeSupportedFeatureTagsFuture(c2,
+ secondDelegateRequest.getFeatureTags(), Collections.emptySet());
+ setSmsRoleAndEvaluate(controller, TEST_PACKAGE_NAME_2);
+ // swapping roles should trigger a deregistration event on the ImsService side.
+ verifyDelegateDeregistrationEvent();
+ // there should also not be any new registration changed events
+ verifyDelegateRegistrationChangedEvent(1 /*times*/, THROTTLE_MS);
+ // trigger completion stage to run
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verify(c1).changeSupportedFeatureTags(Collections.emptySet(), firstDeniedTags);
+ // we should not get a change for c2 until pendingC1Change completes.
+ verify(c2, never()).changeSupportedFeatureTags(secondDelegateRequest.getFeatureTags(),
+ Collections.emptySet());
+ // ensure we are not blocking executor here
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ completePendingChange(pendingC1Change, true);
+ // trigger completion stage to run
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verify(c2).changeSupportedFeatureTags(secondDelegateRequest.getFeatureTags(),
+ Collections.emptySet());
+ // ensure we are not blocking executor here
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ completePendingChange(pendingC2Change, true);
+ // verify we now get a second registration changed event
+ verifyDelegateRegistrationChangedEvent(2 /*times*/, THROTTLE_MS);
+ }
+
+ @SmallTest
+ @Test
+ public void createTwoAndDestroyOlder() throws Exception {
+ SipTransportController controller = setupLiveTransportController(0 /*reeval*/, THROTTLE_MS);
+
+ // First delegate requests RCS message + File transfer
+ ArraySet<String> firstDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
+ firstDelegate.remove(ImsSignallingUtils.GROUP_CHAT_TAG);
+ DelegateRequest firstDelegateRequest = new DelegateRequest(firstDelegate);
+ SipDelegateController c1 = injectMockDelegateController(TEST_PACKAGE_NAME,
+ firstDelegateRequest);
+ createDelegateAndVerify(controller, c1, firstDelegateRequest, firstDelegate,
+ Collections.emptySet(), TEST_PACKAGE_NAME);
+ verifyNoDelegateRegistrationChangedEvent();
+
+ // First delegate requests RCS message + Group RCS message. For this delegate, single RCS
+ // message should be denied.
+ ArraySet<String> secondDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
+ secondDelegate.remove(ImsSignallingUtils.FILE_TRANSFER_HTTP_TAG);
+ DelegateRequest secondDelegateRequest = new DelegateRequest(secondDelegate);
+ Pair<Set<String>, Set<FeatureTagState>> grantedAndDenied = getAllowedAndDeniedTagsForConfig(
+ secondDelegateRequest, SipDelegateManager.DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE,
+ firstDelegate);
+ SipDelegateController c2 = injectMockDelegateController(TEST_PACKAGE_NAME,
+ secondDelegateRequest);
+ createDelegateAndVerify(controller, c2, secondDelegateRequest, grantedAndDenied.first,
+ grantedAndDenied.second, TEST_PACKAGE_NAME, 1);
+ verifyNoDelegateRegistrationChangedEvent();
+
+ // Destroy the firstDelegate, which should now cause all previously denied tags to be
+ // granted to the new delegate.
+ CompletableFuture<Boolean> pendingC2Change = setChangeSupportedFeatureTagsFuture(c2,
+ secondDelegate, Collections.emptySet());
+ destroyDelegateAndVerify(controller, c1, false /*force*/,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ // wait for create to be processed.
+ assertTrue(waitForExecutorAction(mExecutorService, TIMEOUT_MS));
+ verify(c2).changeSupportedFeatureTags(secondDelegate, Collections.emptySet());
+ completePendingChange(pendingC2Change, true);
+
+ verifyDelegateRegistrationChangedEvent(1 /*times*/, THROTTLE_MS);
+ }
+
+ @SmallTest
+ @Test
+ public void testThrottling() throws Exception {
+ SipTransportController controller = setupLiveTransportController(THROTTLE_MS, THROTTLE_MS);
+
+ // First delegate requests RCS message + File transfer
+ ArraySet<String> firstDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
+ firstDelegate.remove(ImsSignallingUtils.GROUP_CHAT_TAG);
+ DelegateRequest firstDelegateRequest = new DelegateRequest(firstDelegate);
+ SipDelegateController c1 = injectMockDelegateController(TEST_PACKAGE_NAME,
+ firstDelegateRequest);
+ CompletableFuture<Boolean> pendingC1Change = createDelegate(controller, c1,
+ firstDelegateRequest, firstDelegate, Collections.emptySet(), TEST_PACKAGE_NAME);
+
+ // Request RCS message + group RCS Message. For this delegate, single RCS message should be
+ // denied.
+ ArraySet<String> secondDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
+ secondDelegate.remove(ImsSignallingUtils.FILE_TRANSFER_HTTP_TAG);
+ DelegateRequest secondDelegateRequest = new DelegateRequest(secondDelegate);
+ Pair<Set<String>, Set<FeatureTagState>> grantedAndDeniedC2 =
+ getAllowedAndDeniedTagsForConfig(secondDelegateRequest,
+ SipDelegateManager.DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE, firstDelegate);
+ SipDelegateController c2 = injectMockDelegateController(TEST_PACKAGE_NAME,
+ secondDelegateRequest);
+ CompletableFuture<Boolean> pendingC2Change = createDelegate(controller, c2,
+ secondDelegateRequest, grantedAndDeniedC2.first, grantedAndDeniedC2.second,
+ TEST_PACKAGE_NAME);
+
+ // Request group RCS message + file transfer. All should be denied at first
+ ArraySet<String> thirdDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
+ thirdDelegate.remove(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG);
+ DelegateRequest thirdDelegateRequest = new DelegateRequest(thirdDelegate);
+ Pair<Set<String>, Set<FeatureTagState>> grantedAndDeniedC3 =
+ getAllowedAndDeniedTagsForConfig(thirdDelegateRequest,
+ SipDelegateManager.DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE, firstDelegate,
+ grantedAndDeniedC2.first);
+ SipDelegateController c3 = injectMockDelegateController(TEST_PACKAGE_NAME,
+ thirdDelegateRequest);
+ CompletableFuture<Boolean> pendingC3Change = createDelegate(controller, c3,
+ thirdDelegateRequest, grantedAndDeniedC3.first, grantedAndDeniedC3.second,
+ TEST_PACKAGE_NAME);
+
+ verifyNoDelegateRegistrationChangedEvent();
+ assertTrue(scheduleDelayedWait(2 * THROTTLE_MS));
+ verifyDelegateChanged(c1, pendingC1Change, firstDelegate, Collections.emptySet(), 0);
+ verifyDelegateChanged(c2, pendingC2Change, grantedAndDeniedC2.first,
+ grantedAndDeniedC2.second, 0);
+ verifyDelegateChanged(c3, pendingC3Change, grantedAndDeniedC3.first,
+ grantedAndDeniedC3.second, 0);
+ verifyDelegateRegistrationChangedEvent(1, 2 * THROTTLE_MS);
+
+ // Destroy the first and second controller in quick succession, this should only generate
+ // one reevaluate for the third controller.
+ CompletableFuture<Boolean> pendingChangeC3 = setChangeSupportedFeatureTagsFuture(
+ c3, thirdDelegate, Collections.emptySet());
+ CompletableFuture<Integer> pendingDestroyC1 = destroyDelegate(controller, c1,
+ false /*force*/,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ CompletableFuture<Integer> pendingDestroyC2 = destroyDelegate(controller, c2,
+ false /*force*/,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ assertTrue(scheduleDelayedWait(2 * THROTTLE_MS));
+ verifyDestroyDelegate(controller, c1, pendingDestroyC1, false /*force*/,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ verifyDestroyDelegate(controller, c2, pendingDestroyC2, false /*force*/,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+
+ // All requested features should now be granted
+ completePendingChange(pendingChangeC3, true);
+ verify(c3).changeSupportedFeatureTags(thirdDelegate, Collections.emptySet());
+ // In total reeval should have only been called twice.
+ verify(c3, times(2)).changeSupportedFeatureTags(any(), any());
+ verifyDelegateRegistrationChangedEvent(2 /*times*/, 2 * THROTTLE_MS);
+ }
+
+ @SmallTest
+ @Test
+ public void testSubIdChangeDestroyTriggered() throws Exception {
+ SipTransportController controller = setupLiveTransportController();
+
+ ArraySet<String> firstDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
+ DelegateRequest firstDelegateRequest = new DelegateRequest(firstDelegate);
+ SipDelegateController c1 = injectMockDelegateController(TEST_PACKAGE_NAME,
+ firstDelegateRequest);
+ createDelegateAndVerify(controller, c1, firstDelegateRequest, firstDelegate,
+ Collections.emptySet(), TEST_PACKAGE_NAME);
+ verifyDelegateRegistrationChangedEvent(1 /*times*/, 0 /*waitMs*/);
+
+ CompletableFuture<Integer> pendingDestroy = setDestroyFuture(c1, true,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN);
+ controller.onAssociatedSubscriptionUpdated(TEST_SUB_ID + 1);
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verifyDestroyDelegate(controller, c1, pendingDestroy, true /*force*/,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN);
+ verifyDelegateRegistrationChangedEvent(2 /*times*/, 0 /*waitMs*/);
+ }
+
+ @SmallTest
+ @Test
+ public void testRcsManagerGoneDestroyTriggered() throws Exception {
+ SipTransportController controller = setupLiveTransportController();
+
+ ArraySet<String> firstDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
+ DelegateRequest firstDelegateRequest = new DelegateRequest(firstDelegate);
+ SipDelegateController c1 = injectMockDelegateController(TEST_PACKAGE_NAME,
+ firstDelegateRequest);
+ createDelegateAndVerify(controller, c1, firstDelegateRequest, firstDelegate,
+ Collections.emptySet(), TEST_PACKAGE_NAME);
+
+ CompletableFuture<Integer> pendingDestroy = setDestroyFuture(c1, true,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD);
+ controller.onRcsDisconnected();
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verifyDestroyDelegate(controller, c1, pendingDestroy, true /*force*/,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD);
+ verifyDelegateRegistrationChangedEvent(1, 0 /*waitMs*/);
+ }
+
+ @SmallTest
+ @Test
+ public void testDestroyTriggered() throws Exception {
+ SipTransportController controller = setupLiveTransportController();
+
+ ArraySet<String> firstDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
+ DelegateRequest firstDelegateRequest = new DelegateRequest(firstDelegate);
+ SipDelegateController c1 = injectMockDelegateController(TEST_PACKAGE_NAME,
+ firstDelegateRequest);
+ createDelegateAndVerify(controller, c1, firstDelegateRequest, firstDelegate,
+ Collections.emptySet(), TEST_PACKAGE_NAME);
+
+ CompletableFuture<Integer> pendingDestroy = setDestroyFuture(c1, true,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN);
+ controller.onDestroy();
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verifyDelegateDeregistrationEvent();
+ // verify change was called.
+ verify(c1).destroy(true /*force*/,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN);
+ // ensure thread is not blocked while waiting for pending complete.
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ completePendingDestroy(pendingDestroy,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN);
+ }
+
+ @SmallTest
+ @Test
+ public void testTimingSubIdChangedAndCreateNewSubId() throws Exception {
+ SipTransportController controller = setupLiveTransportController(THROTTLE_MS, 0);
+
+ ArraySet<String> firstDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
+ DelegateRequest firstDelegateRequest = new DelegateRequest(firstDelegate);
+ SipDelegateController c1 = injectMockDelegateController(TEST_PACKAGE_NAME,
+ firstDelegateRequest);
+ CompletableFuture<Boolean> pendingC1Change = createDelegate(controller, c1,
+ firstDelegateRequest, firstDelegate, Collections.emptySet(), TEST_PACKAGE_NAME);
+ assertTrue(scheduleDelayedWait(2 * THROTTLE_MS));
+ verifyDelegateChanged(c1, pendingC1Change, firstDelegate, Collections.emptySet(), 0);
+
+
+ CompletableFuture<Integer> pendingDestroy = setDestroyFuture(c1, true,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN);
+ // triggers reeval now.
+ controller.onAssociatedSubscriptionUpdated(TEST_SUB_ID + 1);
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+
+ // mock a second delegate with the new subId associated with the slot.
+ ArraySet<String> secondDelegate = new ArraySet<>();
+ secondDelegate.add(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG);
+ secondDelegate.add(ImsSignallingUtils.FILE_TRANSFER_HTTP_TAG);
+ DelegateRequest secondDelegateRequest = new DelegateRequest(secondDelegate);
+ SipDelegateController c2 = injectMockDelegateController(TEST_SUB_ID + 1,
+ TEST_PACKAGE_NAME, secondDelegateRequest);
+ CompletableFuture<Boolean> pendingC2Change = createDelegate(controller, c2,
+ TEST_SUB_ID + 1, secondDelegateRequest, secondDelegate,
+ Collections.emptySet(), TEST_PACKAGE_NAME);
+ assertTrue(scheduleDelayedWait(THROTTLE_MS));
+
+ //trigger destroyed event
+ verifyDestroyDelegate(controller, c1, pendingDestroy, true /*force*/,
+ SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN);
+ assertTrue(scheduleDelayedWait(2 * THROTTLE_MS));
+ verifyDelegateChanged(c2, pendingC2Change, secondDelegate, Collections.emptySet(), 0);
+ }
+
+ @SafeVarargs
+ private final Pair<Set<String>, Set<FeatureTagState>> getAllowedAndDeniedTagsForConfig(
+ DelegateRequest r, int denyReason, Set<String>... previousRequestedTagSets) {
+ ArraySet<String> rejectedTags = new ArraySet<>(r.getFeatureTags());
+ ArraySet<String> grantedTags = new ArraySet<>(r.getFeatureTags());
+ Set<String> previousRequestedTags = new ArraySet<>();
+ for (Set<String> s : previousRequestedTagSets) {
+ previousRequestedTags.addAll(s);
+ }
+ rejectedTags.retainAll(previousRequestedTags);
+ grantedTags.removeAll(previousRequestedTags);
+ Set<FeatureTagState> deniedTags = getDeniedTagsForReason(rejectedTags, denyReason);
+ return new Pair<>(grantedTags, deniedTags);
+ }
+
+ private void completePendingChange(CompletableFuture<Boolean> change, boolean result) {
+ mExecutorService.execute(() -> change.complete(result));
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ }
+
+ private void completePendingDestroy(CompletableFuture<Integer> destroy, int result) {
+ mExecutorService.execute(() -> destroy.complete(result));
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ }
+
+ private SipTransportController setupLiveTransportController() throws Exception {
+ return setupLiveTransportController(0 /*throttleMs*/, 0 /*regDelayMs*/);
+ }
+
+ private SipTransportController setupLiveTransportController(int throttleMs, int regDelayMs)
+ throws Exception {
+ mExecutorService = Executors.newSingleThreadScheduledExecutor();
+ SipTransportController controller = createControllerAndThrottle(mExecutorService,
+ throttleMs, regDelayMs);
+ doReturn(mSipTransport).when(mRcsManager).getSipTransport();
+ controller.onAssociatedSubscriptionUpdated(TEST_SUB_ID);
+ controller.onRcsConnected(mRcsManager);
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ return controller;
+ }
+
+ private void createDelegateAndVerify(SipTransportController controller,
+ SipDelegateController delegateController, DelegateRequest r, Set<String> allowedTags,
+ Set<FeatureTagState> deniedTags, String packageName,
+ int numPreviousChanges) throws ImsException {
+
+ CompletableFuture<Boolean> pendingChange = createDelegate(controller, delegateController, r,
+ allowedTags, deniedTags, packageName);
+ verifyDelegateChanged(delegateController, pendingChange, allowedTags, deniedTags,
+ numPreviousChanges);
+ }
+
+ private void createDelegateAndVerify(SipTransportController controller,
+ SipDelegateController delegateController, DelegateRequest r, Set<String> allowedTags,
+ Set<FeatureTagState> deniedTags, String packageName) throws ImsException {
+ createDelegateAndVerify(controller, delegateController, r, allowedTags, deniedTags,
+ packageName, 0);
+ }
+
+ private CompletableFuture<Boolean> createDelegate(SipTransportController controller,
+ SipDelegateController delegateController, int subId, DelegateRequest r,
+ Set<String> allowedTags, Set<FeatureTagState> deniedTags, String packageName) {
+ CompletableFuture<Boolean> pendingChange = setChangeSupportedFeatureTagsFuture(
+ delegateController, allowedTags, deniedTags);
+ try {
+ controller.createSipDelegate(subId, r, packageName, mMockStateCallback,
+ mMockMessageCallback);
+ } catch (ImsException e) {
+ fail("ImsException thrown:" + e);
+ }
+ // move to internal & schedule eval
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ // reeval
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ return pendingChange;
+ }
+
+ private CompletableFuture<Boolean> createDelegate(SipTransportController controller,
+ SipDelegateController delegateController, DelegateRequest r, Set<String> allowedTags,
+ Set<FeatureTagState> deniedTags, String packageName) throws ImsException {
+ return createDelegate(controller, delegateController, TEST_SUB_ID, r, allowedTags,
+ deniedTags, packageName);
+ }
+
+ private void verifyDelegateChanged(SipDelegateController delegateController,
+ CompletableFuture<Boolean> pendingChange, Set<String> allowedTags,
+ Set<FeatureTagState> deniedTags, int numPreviousChangeStages) {
+ // empty the queue of pending changeSupportedFeatureTags before running the one we are
+ // interested in, since the reevaluate waits for one stage to complete before moving to the
+ // next.
+ for (int i = 0; i < numPreviousChangeStages + 1; i++) {
+ assertTrue(waitForExecutorAction(mExecutorService, TIMEOUT_MS));
+ }
+ // verify change was called.
+ verify(delegateController).changeSupportedFeatureTags(allowedTags, deniedTags);
+ // ensure thread is not blocked while waiting for pending complete.
+ assertTrue(waitForExecutorAction(mExecutorService, TIMEOUT_MS));
+ completePendingChange(pendingChange, true);
+ // process pending change.
+ assertTrue(waitForExecutorAction(mExecutorService, TIMEOUT_MS));
+ }
+
+ private void destroyDelegateAndVerify(SipTransportController controller,
+ SipDelegateController delegateController, boolean force, int reason) {
+ CompletableFuture<Integer> pendingDestroy = destroyDelegate(controller, delegateController,
+ force, reason);
+ verifyDestroyDelegate(controller, delegateController, pendingDestroy, force, reason);
+ }
+
+ private CompletableFuture<Integer> destroyDelegate(SipTransportController controller,
+ SipDelegateController delegateController, boolean force, int reason) {
+ CompletableFuture<Integer> pendingDestroy = setDestroyFuture(delegateController, force,
+ reason);
+ controller.destroySipDelegate(TEST_SUB_ID, delegateController.getSipDelegateInterface(),
+ reason);
+ // move to internal & schedule eval
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ // reeval
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ return pendingDestroy;
+ }
+
+ private void verifyDestroyDelegate(SipTransportController controller,
+ SipDelegateController delegateController, CompletableFuture<Integer> pendingDestroy,
+ boolean force, int reason) {
+ // verify destroy was called.
+ verify(delegateController).destroy(force, reason);
+ // ensure thread is not blocked while waiting for pending complete.
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ completePendingDestroy(pendingDestroy, reason);
+ }
+
+ private void triggerFullNetworkRegistrationAndVerify(SipTransportController controller,
+ SipDelegateController delegateController) {
+ controller.triggerFullNetworkRegistration(TEST_SUB_ID,
+ delegateController.getSipDelegateInterface(), 403, "forbidden");
+ // move to internal & trigger event
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verify(delegateController).triggerFullNetworkRegistration(403, "forbidden");
+ }
+
+ private void triggerFullNetworkRegistrationAndVerifyNever(SipTransportController controller,
+ SipDelegateController delegateController) {
+ controller.triggerFullNetworkRegistration(TEST_SUB_ID,
+ delegateController.getSipDelegateInterface(), 403, "forbidden");
+ // move to internal & potentially trigger event
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verify(delegateController, never()).triggerFullNetworkRegistration(anyInt(), anyString());
+ }
+
+ private DelegateRequest getBaseDelegateRequest() {
+ Set<String> featureTags = new ArraySet<>();
+ featureTags.add(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG);
+ featureTags.add(ImsSignallingUtils.GROUP_CHAT_TAG);
+ featureTags.add(ImsSignallingUtils.FILE_TRANSFER_HTTP_TAG);
+ return new DelegateRequest(featureTags);
+ }
+
+ private Set<FeatureTagState> getBaseDeniedSet() {
+ Set<FeatureTagState> deniedTags = new ArraySet<>();
+ deniedTags.add(new FeatureTagState(ImsSignallingUtils.MMTEL_TAG,
+ SipDelegateManager.DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE));
+ return deniedTags;
+ }
+
+ private Set<FeatureTagState> getDeniedTagsForReason(Set<String> deniedTags, int reason) {
+ return deniedTags.stream().map(t -> new FeatureTagState(t, reason))
+ .collect(Collectors.toSet());
+ }
+
+ private SipDelegateController injectMockDelegateController(String packageName,
+ DelegateRequest r) {
+ return injectMockDelegateController(TEST_SUB_ID, packageName, r);
+ }
+
+ private SipDelegateController injectMockDelegateController(int subId, String packageName,
+ DelegateRequest r) {
+ SipDelegateControllerContainer c = new SipDelegateControllerContainer(subId,
+ packageName, r);
+ mMockControllers.add(c);
+ return c.delegateController;
+ }
+
+ private SipDelegateController getMockDelegateController(int subId, String packageName,
+ DelegateRequest r) {
+ return mMockControllers.stream()
+ .filter(c -> c.subId == subId && c.packageName.equals(packageName)
+ && c.delegateRequest.equals(r))
+ .map(c -> c.delegateController).findFirst().orElse(null);
+ }
+
+ private CompletableFuture<Boolean> setChangeSupportedFeatureTagsFuture(SipDelegateController c,
+ Set<String> supportedSet, Set<FeatureTagState> deniedSet) {
+ CompletableFuture<Boolean> result = new CompletableFuture<>();
+ doReturn(result).when(c).changeSupportedFeatureTags(eq(supportedSet), eq(deniedSet));
+ return result;
+ }
+
+ private CompletableFuture<Integer> setDestroyFuture(SipDelegateController c, boolean force,
+ int destroyReason) {
+ CompletableFuture<Integer> result = new CompletableFuture<>();
+ doReturn(result).when(c).destroy(force, destroyReason);
+ return result;
+ }
+
+ private void setSmsRoleAndEvaluate(SipTransportController c, String packageName) {
+ verify(mMockRoleManager).addOnRoleHoldersChangedListenerAsUser(any(), any(), any());
+ mSmsPackageName.clear();
+ mSmsPackageName.add(packageName);
+ c.onRoleHoldersChanged(RoleManager.ROLE_SMS, UserHandle.SYSTEM);
+ // finish internal throttled re-evaluate
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ }
+
+ private void verifyNoDelegateRegistrationChangedEvent() throws Exception {
+ // event is scheduled and then executed.
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verify(mImsRegistration, never()).triggerUpdateSipDelegateRegistration();
+ }
+
+ private void verifyDelegateRegistrationChangedEvent(int times, int waitMs)
+ throws Exception {
+ // event is scheduled and then executed.
+ assertTrue(scheduleDelayedWait(waitMs));
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verify(mImsRegistration, times(times)).triggerUpdateSipDelegateRegistration();
+ }
+
+
+ private void verifyDelegateDeregistrationEvent() throws Exception {
+ verify(mImsRegistration).triggerSipDelegateDeregistration();
+ }
+
+ private SipTransportController createController(ScheduledExecutorService e) {
+ return createControllerAndThrottle(e, 0 /*throttleMs*/, 0 /*regDelayMs*/);
+ }
+
+ private SipTransportController createControllerAndThrottle(ScheduledExecutorService e,
+ int throttleMs, int regDelayMs) {
+ return new SipTransportController(mContext, 0 /*slotId*/, TEST_SUB_ID,
+ mMockDelegateControllerFactory, mMockRoleManager,
+ // Remove delays for testing.
+ new SipTransportController.TimerAdapter() {
+ @Override
+ public int getReevaluateThrottleTimerMilliseconds() {
+ return throttleMs;
+ }
+
+ @Override
+ public int getUpdateRegistrationDelayMilliseconds() {
+ return regDelayMs;
+ }
+ }, e);
+ }
+
+ private boolean scheduleDelayedWait(long timeMs) {
+ CountDownLatch l = new CountDownLatch(1);
+ mExecutorService.schedule(l::countDown, timeMs, TimeUnit.MILLISECONDS);
+ while (l.getCount() > 0) {
+ try {
+ return l.await(TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ // try again
+ }
+ }
+ return true;
+ }
+}
diff --git a/tests/src/com/android/services/telephony/rcs/TelephonyRcsServiceTest.java b/tests/src/com/android/services/telephony/rcs/TelephonyRcsServiceTest.java
index cfb68b7..7a9f9e3 100644
--- a/tests/src/com/android/services/telephony/rcs/TelephonyRcsServiceTest.java
+++ b/tests/src/com/android/services/telephony/rcs/TelephonyRcsServiceTest.java
@@ -50,8 +50,10 @@
@Captor ArgumentCaptor<BroadcastReceiver> mReceiverCaptor;
@Mock TelephonyRcsService.FeatureFactory mFeatureFactory;
- @Mock UserCapabilityExchangeImpl mMockUceSlot0;
- @Mock UserCapabilityExchangeImpl mMockUceSlot1;
+ @Mock UceControllerManager mMockUceSlot0;
+ @Mock UceControllerManager mMockUceSlot1;
+ @Mock SipTransportController mMockSipTransportSlot0;
+ @Mock SipTransportController mMockSipTransportSlot1;
@Mock RcsFeatureController.RegistrationHelperFactory mRegistrationFactory;
@Mock RcsFeatureController.FeatureConnectorFactory<RcsFeatureManager> mFeatureConnectorFactory;
@Mock FeatureConnector<RcsFeatureManager> mFeatureConnector;
@@ -68,10 +70,14 @@
mFeatureControllerSlot1 = createFeatureController(1 /*slotId*/);
doReturn(mFeatureControllerSlot0).when(mFeatureFactory).createController(any(), eq(0));
doReturn(mFeatureControllerSlot1).when(mFeatureFactory).createController(any(), eq(1));
- doReturn(mMockUceSlot0).when(mFeatureFactory).createUserCapabilityExchange(any(), eq(0),
+ doReturn(mMockUceSlot0).when(mFeatureFactory).createUceControllerManager(any(), eq(0),
anyInt());
- doReturn(mMockUceSlot1).when(mFeatureFactory).createUserCapabilityExchange(any(), eq(1),
+ doReturn(mMockUceSlot1).when(mFeatureFactory).createUceControllerManager(any(), eq(1),
anyInt());
+ doReturn(mMockSipTransportSlot0).when(mFeatureFactory).createSipTransportController(any(),
+ eq(0), anyInt());
+ doReturn(mMockSipTransportSlot1).when(mFeatureFactory).createSipTransportController(any(),
+ eq(1), anyInt());
//set up default slot-> sub ID mappings.
setSlotToSubIdMapping(0 /*slotId*/, 1/*subId*/);
setSlotToSubIdMapping(1 /*slotId*/, 2/*subId*/);
@@ -83,18 +89,20 @@
}
@Test
- public void testUserCapabilityExchangePresenceConnected() {
- setCarrierConfig(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, true /*isEnabled*/);
+ public void testUceControllerPresenceConnected() {
+ setCarrierConfig(1 /*subId*/, CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL,
+ true /*isEnabled*/);
createRcsService(1 /*numSlots*/);
- verify(mFeatureControllerSlot0).addFeature(mMockUceSlot0, UserCapabilityExchangeImpl.class);
+ verify(mFeatureControllerSlot0).addFeature(mMockUceSlot0, UceControllerManager.class);
verify(mFeatureControllerSlot0).connect();
}
@Test
- public void testUserCapabilityExchangeOptionsConnected() {
- setCarrierConfig(CarrierConfigManager.KEY_USE_RCS_SIP_OPTIONS_BOOL, true /*isEnabled*/);
+ public void testUceControllerOptionsConnected() {
+ setCarrierConfig(1 /*subId*/, CarrierConfigManager.KEY_USE_RCS_SIP_OPTIONS_BOOL,
+ true /*isEnabled*/);
createRcsService(1 /*numSlots*/);
- verify(mFeatureControllerSlot0).addFeature(mMockUceSlot0, UserCapabilityExchangeImpl.class);
+ verify(mFeatureControllerSlot0).addFeature(mMockUceSlot0, UceControllerManager.class);
verify(mFeatureControllerSlot0).connect();
}
@@ -103,18 +111,67 @@
createRcsService(1 /*numSlots*/);
// No carrier config set for UCE.
verify(mFeatureControllerSlot0, never()).addFeature(mMockUceSlot0,
- UserCapabilityExchangeImpl.class);
+ UceControllerManager.class);
verify(mFeatureControllerSlot0, never()).connect();
}
@Test
+ public void testSipTransportConnected() {
+ createRcsService(1 /*numSlots*/);
+ verify(mFeatureControllerSlot0, never()).addFeature(mMockSipTransportSlot0,
+ SipTransportController.class);
+ verify(mFeatureControllerSlot0, never()).connect();
+
+
+ // Send carrier config update for each slot.
+ setCarrierConfig(1 /*subId*/,
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL,
+ true /*isEnabled*/);
+ sendCarrierConfigChanged(0 /*slotId*/, 1 /*subId*/);
+ verify(mFeatureControllerSlot0).addFeature(mMockSipTransportSlot0,
+ SipTransportController.class);
+ verify(mFeatureControllerSlot0).connect();
+ verify(mFeatureControllerSlot0).updateAssociatedSubscription(1);
+ }
+
+ @Test
+ public void testSipTransportConnectedOneSlot() {
+ createRcsService(2 /*numSlots*/);
+ verify(mFeatureControllerSlot0, never()).addFeature(mMockSipTransportSlot0,
+ SipTransportController.class);
+ verify(mFeatureControllerSlot0, never()).connect();
+ verify(mFeatureControllerSlot0, never()).addFeature(mMockSipTransportSlot1,
+ SipTransportController.class);
+ verify(mFeatureControllerSlot1, never()).connect();
+
+
+ // Send carrier config update for slot 0 only
+ setCarrierConfig(1 /*subId*/,
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL,
+ true /*isEnabled*/);
+ setCarrierConfig(2 /*subId*/,
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL,
+ false /*isEnabled*/);
+ sendCarrierConfigChanged(0 /*slotId*/, 1 /*subId*/);
+ sendCarrierConfigChanged(1 /*slotId*/, 2 /*subId*/);
+ verify(mFeatureControllerSlot0).addFeature(mMockSipTransportSlot0,
+ SipTransportController.class);
+ verify(mFeatureControllerSlot1, never()).addFeature(mMockSipTransportSlot0,
+ SipTransportController.class);
+ verify(mFeatureControllerSlot0).connect();
+ verify(mFeatureControllerSlot1, never()).connect();
+ verify(mFeatureControllerSlot0).updateAssociatedSubscription(1);
+ verify(mFeatureControllerSlot1, never()).updateAssociatedSubscription(1);
+ }
+
+ @Test
public void testNoFeaturesEnabledCarrierConfigChanged() {
createRcsService(1 /*numSlots*/);
// No carrier config set for UCE.
sendCarrierConfigChanged(0, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
verify(mFeatureControllerSlot0, never()).addFeature(mMockUceSlot0,
- UserCapabilityExchangeImpl.class);
+ UceControllerManager.class);
verify(mFeatureControllerSlot0, never()).connect();
verify(mFeatureControllerSlot0, never()).updateAssociatedSubscription(anyInt());
}
@@ -122,27 +179,30 @@
@Test
public void testSlotUpdates() {
- setCarrierConfig(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, true /*isEnabled*/);
+ setCarrierConfig(1 /*subId*/, CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL,
+ true /*isEnabled*/);
+ setCarrierConfig(2 /*subId*/, CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL,
+ true /*isEnabled*/);
TelephonyRcsService service = createRcsService(1 /*numSlots*/);
- verify(mFeatureControllerSlot0).addFeature(mMockUceSlot0, UserCapabilityExchangeImpl.class);
+ verify(mFeatureControllerSlot0).addFeature(mMockUceSlot0, UceControllerManager.class);
verify(mFeatureControllerSlot0).connect();
// there should be no changes if the new num slots = old num
service.updateFeatureControllerSize(1 /*newNumSlots*/);
verify(mFeatureControllerSlot0, times(1)).addFeature(mMockUceSlot0,
- UserCapabilityExchangeImpl.class);
+ UceControllerManager.class);
verify(mFeatureControllerSlot0, times(1)).connect();
// Add a new slot.
verify(mFeatureControllerSlot1, never()).addFeature(mMockUceSlot1,
- UserCapabilityExchangeImpl.class);
+ UceControllerManager.class);
verify(mFeatureControllerSlot1, never()).connect();
service.updateFeatureControllerSize(2 /*newNumSlots*/);
// This shouldn't have changed for slot 0.
verify(mFeatureControllerSlot0, times(1)).addFeature(mMockUceSlot0,
- UserCapabilityExchangeImpl.class);
+ UceControllerManager.class);
verify(mFeatureControllerSlot0, times(1)).connect();
- verify(mFeatureControllerSlot1).addFeature(mMockUceSlot1, UserCapabilityExchangeImpl.class);
+ verify(mFeatureControllerSlot1).addFeature(mMockUceSlot1, UceControllerManager.class);
verify(mFeatureControllerSlot1, times(1)).connect();
// Remove a slot.
@@ -151,10 +211,10 @@
service.updateFeatureControllerSize(1 /*newNumSlots*/);
// addFeature/connect shouldn't have been called again
verify(mFeatureControllerSlot0, times(1)).addFeature(mMockUceSlot0,
- UserCapabilityExchangeImpl.class);
+ UceControllerManager.class);
verify(mFeatureControllerSlot0, times(1)).connect();
verify(mFeatureControllerSlot1, times(1)).addFeature(mMockUceSlot1,
- UserCapabilityExchangeImpl.class);
+ UceControllerManager.class);
verify(mFeatureControllerSlot1, times(1)).connect();
// Verify destroy is only called for slot 1.
verify(mFeatureControllerSlot0, never()).destroy();
@@ -163,10 +223,13 @@
@Test
public void testCarrierConfigUpdate() {
- setCarrierConfig(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, true /*isEnabled*/);
+ setCarrierConfig(1 /*subId*/, CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL,
+ true /*isEnabled*/);
+ setCarrierConfig(2 /*subId*/, CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL,
+ true /*isEnabled*/);
createRcsService(2 /*numSlots*/);
- verify(mFeatureControllerSlot0).addFeature(mMockUceSlot0, UserCapabilityExchangeImpl.class);
- verify(mFeatureControllerSlot1).addFeature(mMockUceSlot1, UserCapabilityExchangeImpl.class);
+ verify(mFeatureControllerSlot0).addFeature(mMockUceSlot0, UceControllerManager.class);
+ verify(mFeatureControllerSlot1).addFeature(mMockUceSlot1, UceControllerManager.class);
verify(mFeatureControllerSlot0).connect();
verify(mFeatureControllerSlot1).connect();
@@ -182,16 +245,38 @@
@Test
public void testCarrierConfigUpdateUceToNoUce() {
- setCarrierConfig(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, true /*isEnabled*/);
+ setCarrierConfig(1 /*subId*/, CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL,
+ true /*isEnabled*/);
createRcsService(1 /*numSlots*/);
- verify(mFeatureControllerSlot0).addFeature(mMockUceSlot0, UserCapabilityExchangeImpl.class);
+ verify(mFeatureControllerSlot0).addFeature(mMockUceSlot0, UceControllerManager.class);
verify(mFeatureControllerSlot0).connect();
// Send carrier config update for each slot.
- setCarrierConfig(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, false /*isEnabled*/);
+ setCarrierConfig(1 /*subId*/, CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL,
+ false /*isEnabled*/);
sendCarrierConfigChanged(0 /*slotId*/, 1 /*subId*/);
- verify(mFeatureControllerSlot0).removeFeature(UserCapabilityExchangeImpl.class);
+ verify(mFeatureControllerSlot0).removeFeature(UceControllerManager.class);
+ verify(mFeatureControllerSlot0).updateAssociatedSubscription(1);
+ }
+
+ @Test
+ public void testCarrierConfigUpdateTransportToNoTransport() {
+ setCarrierConfig(1 /*subId*/,
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL,
+ true /*isEnabled*/);
+ createRcsService(1 /*numSlots*/);
+ verify(mFeatureControllerSlot0).addFeature(mMockSipTransportSlot0,
+ SipTransportController.class);
+ verify(mFeatureControllerSlot0).connect();
+
+
+ // Send carrier config update for each slot.
+ setCarrierConfig(1 /*subId*/,
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL,
+ false /*isEnabled*/);
+ sendCarrierConfigChanged(0 /*slotId*/, 1 /*subId*/);
+ verify(mFeatureControllerSlot0).removeFeature(SipTransportController.class);
verify(mFeatureControllerSlot0).updateAssociatedSubscription(1);
}
@@ -199,14 +284,15 @@
public void testCarrierConfigUpdateNoUceToUce() {
createRcsService(1 /*numSlots*/);
verify(mFeatureControllerSlot0, never()).addFeature(mMockUceSlot0,
- UserCapabilityExchangeImpl.class);
+ UceControllerManager.class);
verify(mFeatureControllerSlot0, never()).connect();
// Send carrier config update for each slot.
- setCarrierConfig(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, true /*isEnabled*/);
+ setCarrierConfig(1 /*subId*/, CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL,
+ true /*isEnabled*/);
sendCarrierConfigChanged(0 /*slotId*/, 1 /*subId*/);
- verify(mFeatureControllerSlot0).addFeature(mMockUceSlot0, UserCapabilityExchangeImpl.class);
+ verify(mFeatureControllerSlot0).addFeature(mMockUceSlot0, UceControllerManager.class);
verify(mFeatureControllerSlot0).connect();
verify(mFeatureControllerSlot0).updateAssociatedSubscription(1);
}
@@ -218,8 +304,8 @@
mReceiverCaptor.getValue().onReceive(mContext, intent);
}
- private void setCarrierConfig(String key, boolean value) {
- PersistableBundle bundle = mContext.getCarrierConfig();
+ private void setCarrierConfig(int subId, String key, boolean value) {
+ PersistableBundle bundle = mContext.getCarrierConfig(subId);
bundle.putBoolean(key, value);
}
diff --git a/tests/src/com/android/services/telephony/rcs/UceControllerManagerTest.java b/tests/src/com/android/services/telephony/rcs/UceControllerManagerTest.java
new file mode 100644
index 0000000..4148d13
--- /dev/null
+++ b/tests/src/com/android/services/telephony/rcs/UceControllerManagerTest.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.rcs;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+
+import android.net.Uri;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.aidl.IRcsUceControllerCallback;
+import android.telephony.ims.aidl.IRcsUcePublishStateCallback;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.TelephonyTestBase;
+import com.android.TestExecutorService;
+import com.android.ims.RcsFeatureManager;
+import com.android.ims.rcs.uce.UceController;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+
+@RunWith(AndroidJUnit4.class)
+public class UceControllerManagerTest extends TelephonyTestBase {
+
+ @Mock private UceController mUceController;
+ @Mock private RcsFeatureManager mRcsFeatureManager;
+
+ private final ExecutorService mExecutorService = new TestExecutorService();
+
+ private int mSlotId = 1;
+ private int mSubId = 1;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ doReturn(mSubId).when(mUceController).getSubId();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testRcsConnected() throws Exception {
+ UceControllerManager controllerManager = getUceControllerManager();
+
+ controllerManager.onRcsConnected(mRcsFeatureManager);
+
+ verify(mUceController).onRcsConnected(mRcsFeatureManager);
+ }
+
+ @Test
+ public void testRcsDisconnected() throws Exception {
+ UceControllerManager uceCtrlManager = getUceControllerManager();
+
+ uceCtrlManager.onRcsDisconnected();
+
+ verify(mUceController).onRcsDisconnected();
+ }
+
+ @Test
+ public void testDestroy() throws Exception {
+ UceControllerManager uceCtrlManager = getUceControllerManager();
+
+ uceCtrlManager.onDestroy();
+
+ verify(mUceController).onDestroy();
+ }
+
+ @Test
+ public void testSubscriptionUpdated() throws Exception {
+ UceControllerManager uceCtrlManager = getUceControllerManager();
+
+ uceCtrlManager.onAssociatedSubscriptionUpdated(mSubId);
+
+ verify(mUceController).onDestroy();
+ }
+
+ @Test
+ public void testRequestCapabilitiesWithRcsUnavailable() throws Exception {
+ UceControllerManager uceCtrlManager = getUceControllerManager();
+ doReturn(true).when(mUceController).isUnavailable();
+ uceCtrlManager.onRcsDisconnected();
+
+ try {
+ List<Uri> contacts = Arrays.asList(Uri.fromParts("sip", "00000", null));
+ IRcsUceControllerCallback callback = Mockito.mock(IRcsUceControllerCallback.class);
+
+ uceCtrlManager.requestCapabilities(contacts, callback);
+
+ fail();
+ } catch (ImsException e) {
+ assertEquals(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE, e.getCode());
+ return;
+ }
+ fail();
+ }
+
+ @Test
+ public void testRequestCapabilitiesWithRcsConnected() throws Exception {
+ UceControllerManager uceCtrlManager = getUceControllerManager();
+ doReturn(false).when(mUceController).isUnavailable();
+ uceCtrlManager.onRcsConnected(mRcsFeatureManager);
+
+ try {
+ List<Uri> contacts = Arrays.asList(Uri.fromParts("sip", "00000", null));
+ IRcsUceControllerCallback callback = Mockito.mock(IRcsUceControllerCallback.class);
+
+ uceCtrlManager.requestCapabilities(contacts, callback);
+
+ verify(mUceController).requestCapabilities(contacts, callback);
+ } catch (ImsException e) {
+ fail();
+ }
+ }
+
+ @Test
+ public void testRequestNetworkAvailability() throws Exception {
+ UceControllerManager uceCtrlManager = getUceControllerManager();
+ doReturn(false).when(mUceController).isUnavailable();
+ uceCtrlManager.onRcsConnected(mRcsFeatureManager);
+
+ Uri contact = Uri.fromParts("sip", "00000", null);
+ IRcsUceControllerCallback callback = Mockito.mock(IRcsUceControllerCallback.class);
+
+ uceCtrlManager.requestNetworkAvailability(contact, callback);
+
+ verify(mUceController).requestAvailability(contact, callback);
+ }
+
+ @Test
+ public void testRequestNetworkAvailabilityWithRcsUnavailable() throws Exception {
+ UceControllerManager uceCtrlManager = getUceControllerManager();
+ doReturn(true).when(mUceController).isUnavailable();
+ uceCtrlManager.onRcsDisconnected();
+
+ try {
+ Uri contact = Uri.fromParts("sip", "00000", null);
+ IRcsUceControllerCallback callback = Mockito.mock(IRcsUceControllerCallback.class);
+ uceCtrlManager.requestNetworkAvailability(contact, callback);
+ fail();
+ } catch (ImsException e) {
+ assertEquals(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE, e.getCode());
+ return;
+ }
+ fail();
+ }
+
+ @Test
+ public void testGetPublishState() throws Exception {
+ UceControllerManager uceCtrlManager = getUceControllerManager();
+ doReturn(false).when(mUceController).isUnavailable();
+ uceCtrlManager.onRcsConnected(mRcsFeatureManager);
+
+ uceCtrlManager.getUcePublishState();
+
+ verify(mUceController).getUcePublishState();
+ }
+
+ @Test
+ public void testGetPublishStateWithRcsUnavailable() throws Exception {
+ UceControllerManager uceCtrlManager = getUceControllerManager();
+ doReturn(true).when(mUceController).isUnavailable();
+ uceCtrlManager.onRcsDisconnected();
+
+ try {
+ uceCtrlManager.getUcePublishState();
+ fail();
+ } catch (ImsException e) {
+ assertEquals(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE, e.getCode());
+ return;
+ }
+ fail();
+ }
+
+ @Test
+ public void testRegisterPublishStateCallback() throws Exception {
+ UceControllerManager uceCtrlManager = getUceControllerManager();
+ IRcsUcePublishStateCallback callback = Mockito.mock(IRcsUcePublishStateCallback.class);
+
+ uceCtrlManager.registerPublishStateCallback(callback);
+
+ verify(mUceController).registerPublishStateCallback(callback);
+ }
+
+ @Test
+ public void testRegisterPublishStateCallbackWithRcsUnavailable() throws Exception {
+ UceControllerManager uceCtrlManager = getUceControllerManager();
+ doReturn(true).when(mUceController).isUnavailable();
+ uceCtrlManager.onRcsDisconnected();
+
+ try {
+ IRcsUcePublishStateCallback callback = Mockito.mock(IRcsUcePublishStateCallback.class);
+ uceCtrlManager.registerPublishStateCallback(callback);
+ fail();
+ } catch (ImsException e) {
+ assertEquals(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE, e.getCode());
+ return;
+ }
+ fail();
+ }
+
+ @Test
+ public void testUnregisterPublishStateCallback() throws Exception {
+ UceControllerManager uceCtrlManager = getUceControllerManager();
+ IRcsUcePublishStateCallback callback = Mockito.mock(IRcsUcePublishStateCallback.class);
+
+ uceCtrlManager.unregisterPublishStateCallback(callback);
+
+ verify(mUceController).unregisterPublishStateCallback(callback);
+ }
+
+ private UceControllerManager getUceControllerManager() {
+ UceControllerManager manager = new UceControllerManager(mContext, mSlotId, mSubId,
+ mExecutorService);
+ manager.setUceController(mUceController);
+ return manager;
+ }
+}