Merge "Merge Android 12"
diff --git a/Android.bp b/Android.bp
index f3c9ebc..0649958 100644
--- a/Android.bp
+++ b/Android.bp
@@ -42,6 +42,7 @@
"libprotobuf-java-lite",
"app-compat-annotations",
"unsupportedappusage",
+ "org.apache.http.legacy",
],
static_libs: [
@@ -54,6 +55,7 @@
"guava",
"PlatformProperties",
"modules-utils-os",
+ "nist-sip",
],
srcs: [
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b3b7f8b..6b4a19c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -38,6 +38,7 @@
<protected-broadcast android:name="android.intent.action.ACTION_MDN_STATE_CHANGED" />
<protected-broadcast android:name="android.telephony.action.SERVICE_PROVIDERS_UPDATED" />
<protected-broadcast android:name="android.provider.Telephony.SIM_FULL" />
+ <protected-broadcast android:name="com.android.internal.telephony.carrier_key_download_alarm" />
<protected-broadcast android:name="com.android.internal.telephony.data-restart-trysetup" />
<protected-broadcast android:name="com.android.internal.telephony.data-stall" />
<protected-broadcast android:name="com.android.internal.telephony.provisioning_apn_alarm" />
@@ -83,6 +84,7 @@
<protected-broadcast android:name= "com.android.internal.telephony.CARRIER_VVM_PACKAGE_INSTALLED" />
<protected-broadcast android:name= "com.android.cellbroadcastreceiver.GET_LATEST_CB_AREA_INFO" />
<protected-broadcast android:name= "com.android.internal.telephony.ACTION_CARRIER_CERTIFICATE_DOWNLOAD" />
+ <protected-broadcast android:name= "com.android.internal.telephony.action.COUNTRY_OVERRIDE" />
<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" />
@@ -100,6 +102,9 @@
<protected-broadcast android:name= "android.telephony.action.CARRIER_SIGNAL_REDIRECTED" />
<protected-broadcast android:name= "android.telephony.action.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED" />
+ <protected-broadcast android:name= "com.android.phone.settings.CARRIER_PROVISIONING" />
+ <protected-broadcast android:name= "com.android.phone.settings.TRIGGER_CARRIER_PROVISIONING" />
+
<!-- For Vendor Debugging in Telephony -->
<protected-broadcast android:name="android.telephony.action.ANOMALY_REPORTED" />
@@ -129,8 +134,8 @@
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
<uses-permission android:name="android.permission.VIBRATE" />
- <uses-permission android:name="android.permission.BLUETOOTH" />
- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
+ <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
+ <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.REORDER_TASKS" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
@@ -227,7 +232,6 @@
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"/>
@@ -235,6 +239,9 @@
<uses-permission android:name="android.permission.LOG_COMPAT_CHANGE"/>
<uses-permission android:name="android.permission.READ_COMPAT_CHANGE_CONFIG"/>
+ <!-- Needed to listen to changes in projection state. -->
+ <uses-permission android:name="android.permission.READ_PROJECTION_STATE"/>
+
<application android:name="PhoneApp"
android:persistent="true"
android:label="@string/phoneAppLabel"
diff --git a/proguard.flags b/proguard.flags
index c707f76..8eafd30 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -7,4 +7,9 @@
-keepclassmembers class * {
@**.NeededForTesting *;
}
+# TODO: remove this after call composer gets more integrated.
+# for the time being, this is here so that the tests don't fail when encountering dead code.
+-keep class com.android.phone.callcomposer.** {
+ *;
+}
-verbose
\ No newline at end of file
diff --git a/res/drawable/cupcake.png b/res/drawable/cupcake.png
new file mode 100644
index 0000000..dcc74e5
--- /dev/null
+++ b/res/drawable/cupcake.png
Binary files differ
diff --git a/res/layout/radio_info.xml b/res/layout/radio_info.xml
index 72627a3..68c67a3 100644
--- a/res/layout/radio_info.xml
+++ b/res/layout/radio_info.xml
@@ -153,6 +153,12 @@
<TextView android:id="@+id/nr_frequency" style="@style/info_value" />
</LinearLayout>
+ <!-- NR Frequency -->
+ <LinearLayout style="@style/RadioInfo_entry_layout" android:orientation="horizontal">
+ <TextView android:id="@+id/network_slicing_config_label" android:text="@string/radio_info_network_slicing_config" style="@style/info_label" />
+ <TextView android:id="@+id/network_slicing_config" style="@style/info_value" />
+ </LinearLayout>
+
<!-- Physical Channel Config -->
<LinearLayout style="@style/RadioInfo_entry_layout">
<TextView android:text="@string/radio_info_phy_chan_config" style="@style/info_label" />
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 76b13c6..eefaebd 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Skakel selnetwerk aan, skakel vliegtuigmodus af of skakel batterybespaardermodus af om \'n oproep te maak."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Skakel vliegtuigmodus af om \'n oproep te maak."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Skakel vliegtuigmodus af of koppel aan \'n draadlose netwerk om \'n oproep te maak."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Foon is te warm"</b>\n\n"Kan nie hierdie oproep voltooi nie. Probeer weer wanneer jou foon afkoel.\n\nJy kan nog noodoproepe maak."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Verlaat noodterugbelmodus om \'n nienoodoproep te maak."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Nie geregistreer op netwerk nie."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobiele netwerk nie beskikbaar nie."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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/strings.xml b/res/values-am/strings.xml
index a808559..d1833a6 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ስልኩ በጣም ሞቋል"</b>\n\n" ይህንን ጥሪ ማጠናቀቅ አልተቻለም። ስልክዎ ሲቀዘቅዝ እንደገና ይሞክሩ።\n\nየአደጋ ጊዜ ጥሪዎችን አሁንም ማድረግ ይችላሉ።"</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 21a540f..ac4cbdf 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"الهاتف ساخن جدًا"</b>\n\n"يتعذّر إتمام هذه المكالمة. يمكن المحاولة مرة أخرى عندما تنخفض درجة حرارة الهاتف.\n\nسيظلّ بإمكانك إجراء مكالمات الطوارئ."</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>
@@ -927,6 +926,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 2033d5e..ad6dbc3 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ফ’নটো বেছি গৰম হৈছে"</b>\n\n"এই কলটো সম্পূৰ্ণ কৰিব নোৱাৰি। আপোনাৰ ফ’নটো ঠাণ্ডা হোৱাৰ পাছত পুনৰ চেষ্টা কৰক।\n\nআপুনি তথাপি জৰুৰীকালীন কল কৰিব পাৰিব।"</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"নেটৱৰ্ক বিভাজনৰ কনফিগাৰেশ্বন:"</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 5ec4dc5..c1ea981 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Zəng etmək üçün mobil şəbəkəni aktiv edin, uçuş rejimini deaktiv edin və ya enerji qənaətini deaktiv edin."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Zəng etmək üçün təyyarə rejimini deaktiv edin."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Zəng etmək üçün təyyarə rejimini deaktiv edin və ya Wi-Fi şəbəkəsinə qoşulun."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefonunuz çox qızıb"</b>\n\n"Bu zəngi tamamlamaq mümkün deyil. Telefonunuz soyuduqda yenidən cəhd edin.\n\nHələ də təcili zənglər edə bilərsiniz."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Qeyri-fövqəladə zəng etmək üçün fövqəladə zəng rejimindən çıxın."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Şəbəkədə qeydə alınmayıb."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobil şəbəkə əlçatımlı deyil."</string>
@@ -592,7 +591,7 @@
<string name="importToFDNfromContacts" msgid="5068664870738407341">"Kontaktlardan import edin"</string>
<string name="singleContactImportedMsg" msgid="3619804066300998934">"Idxal olunmuş kontakt"</string>
<string name="failedToImportSingleContactMsg" msgid="228095510489830266">"Kontakt idxalı uğursuz oldu"</string>
- <string name="hac_mode_title" msgid="4127986689621125468">"Eşitmə cihazları"</string>
+ <string name="hac_mode_title" msgid="4127986689621125468">"Eşitmə yardımı"</string>
<string name="hac_mode_summary" msgid="7774989500136009881">"Eşitmə yardımı uyğunluğunu aktivləşdirin"</string>
<string name="rtt_mode_title" msgid="3075948111362818043">"Real zaman mətn (RTT) zəngi"</string>
<string name="rtt_mode_summary" msgid="8631541375609989562">"Səsli zəng daxilində mesajlaşmaya icazə verin"</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 bf39f18..52c569c 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Uključite mobilnu mrežu i isključite režim rada u avionu ili režim uštede baterije da biste uputili poziv."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Isključite režim rada u avionu da biste uputili poziv."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Isključite režim rada u avionu ili se povežite na bežičnu mrežu da biste uputili poziv."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefon je previše vruć"</b>\n\n"Poziv ne može da se završi. Probajte ponovo kada se telefon ohladi.\n\nI dalje možete da upućujete hitne pozive."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Izađite iz režima hitnog povratnog poziva da biste uputili poziv koji nije hitan."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Nije registrovano na mreži."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilna mreža nije dostupna."</string>
@@ -918,6 +917,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 6674bee..bdd80f5 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"Тэлефон перагрэўся"</b>\n\n"Не ўдалося зрабіць выклік. Паўтарыце спробу, калі тэлефон астыне.\n\nВы ўсё роўна можаце рабіць экстранныя выклікі."</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>
@@ -921,6 +920,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 216c789..6be0bcd 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"Телефонът е твърде горещ"</b>\n\n"Обаждането не може да се извърши. Опитайте отново, когато телефонът се охлади.\n\nМожете да извършвате спешни обаждания."</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 81a2b33..29dcb56 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ফোনটি খুব গরম হয়ে গেছে"</b>\n\n"এই কলটি সম্পূর্ণ করা যাচ্ছে না। ফোনটি ঠাণ্ডা হয়ে গেলে আবার চেষ্টা করুন।\n\nআপনি এখনও জরুরি কল করতে পারেন।"</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 5c1e681..ed5c95b 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Uključite mobilnu mrežu, isključite Način rada u avionu ili isključite Uštedu baterije da pozovete."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Isključite način rada u avionu da pozovete."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Isključite način rada u avionu ili se povežite na bežičnu mrežu da pozovete."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefon se pregrijao"</b>\n\n"Nije moguće završiti ovaj poziv. Pokušajte ponovo kada se telefon ohladi.\n\nI dalje možete upućivati hitne pozive."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Izađite iz načina rada za hitni povratni poziv da uputite poziv koji nije hitan."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Nije registrirano na mreži."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilna mreža nije dostupna."</string>
@@ -918,6 +917,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Konfiguracija rezanja mreže:"</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 5350ab0..acbe3d8 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Per fer una trucada, activa la xarxa mòbil o desactiva el mode d\'avió o el mode d\'estalvi de bateria."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Per fer una trucada, desactiva el mode d\'avió."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Per fer una trucada, desactiva el mode d\'avió o connecta amb una xarxa sense fil."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"El telèfon està massa calent"</b>\n\n"No es pot completar aquesta trucada. Torna-ho a provar quan el telèfon es refredi.\n\nPots fer trucades d\'emergència igualment."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Surt del mode de devolució de trucada d\'emergència per fer un altre tipus de trucada."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"No registrat a la xarxa."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"La xarxa mòbil no està disponible."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 926681b..ed768a7 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Pokud chcete volat, zapněte mobilní síť a vypněte režim letadla nebo spořič baterie."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Chcete-li provést hovor, vypněte režim Letadlo."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Chcete-li se připojit k bezdrátové síti a provést hovor, vypněte režim Letadlo."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefon je příliš zahřátý"</b>\n\n"Hovor nelze provést. Zkuste to znovu, až telefon vychladne.\n\nTísňové volání máte pořád k dispozici."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Chcete-li uskutečnit běžný hovor, opusťte režim tísňového volání."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Přihlášení k síti nebylo úspěšné."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilní síť je nedostupná."</string>
@@ -921,6 +920,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 9d623a4..51659c3 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Slå Mobilnetværk til, Flytilstand fra eller Batterisparefunktion fra for at foretage et opkald."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Slå flytilstand fra for at foretage et opkald."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Slå flytilstand fra, eller opret forbindelse til et trådløst netværk for at foretage et opkald."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefonen er for varm"</b>\n\n"Opkaldet kan ikke foretages. Prøv igen, når din telefon er kølet af.\n\nDu kan stadig foretage nødopkald."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Afslut nødtilbagekaldstilstand for at foretage et almindeligt opkald."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Ikke registreret på netværk."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilnetværket er ikke tilgængeligt."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 3f568a5..275147d 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Zum Anrufen Mobilfunknetz aktivieren, Flugmodus oder Energiesparmodus deaktivieren."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Deaktiviere zum Telefonieren den Flugmodus."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Deaktiviere zum Telefonieren den Flugmodus oder stelle eine WLAN-Verbindung her."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Smartphone ist überhitzt."</b>\n\n"Anruf nicht möglich. Versuche es noch einmal, wenn das Smartphone abgekühlt ist.\n\nDu kannst weiterhin Notrufe absetzen."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Beende den Notfallrückrufmodus, um einen Anruf zu tätigen, bei dem es sich nicht um einen Notfall handelt."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Nicht in Netzwerk registriert."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilfunknetz ist nicht verfügbar."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 277148c..2d8fd45 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"Το τηλέφωνο έχει υπερθερμανθεί"</b>\n\n"Δεν είναι δυνατή η ολοκλήρωση αυτής της κλήσης. Δοκιμάστε ξανά όταν η θερμοκρασία της συσκευής επανέλθει σε φυσιολογικά επίπεδα.\n\nΩστόσο, μπορείτε ακόμα να πραγματοποιείτε κλήσεις έκτακτης ανάγκης."</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 f2aa49b..191ffcf 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -537,7 +537,6 @@
<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 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_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Phone too hot"</b>\n\n"Can\'t complete this call. Try again when your phone cools down.\n\nYou can still make emergency calls."</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Network slicing config:"</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 c299527..6e43520 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"Phone too hot"</b>\n\n"Can\'t complete this call. Try again when your phone cools down.\n\nYou can still make emergency calls."</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Network slicing config:"</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 f2aa49b..191ffcf 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -537,7 +537,6 @@
<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 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_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Phone too hot"</b>\n\n"Can\'t complete this call. Try again when your phone cools down.\n\nYou can still make emergency calls."</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Network slicing config:"</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 f2aa49b..191ffcf 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -537,7 +537,6 @@
<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 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_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Phone too hot"</b>\n\n"Can\'t complete this call. Try again when your phone cools down.\n\nYou can still make emergency calls."</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Network slicing config:"</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 ef450c3..aa19d15 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168">""<b>"Phone too hot"</b>"\n\nCan\'t complete this call. Try again when your phone cools down.\n\nYou can still make emergency calls."</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Network slicing config:"</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 23e2e43..3fd44d6 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Activa la red móvil y desactiva el modo de avión o el modo de ahorro de batería para realizar una llamada."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Desactivar modo de avión para hacer una llamada"</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Desactivar el modo de avión o conectarse a una red inalámbrica para hacer una llamada"</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Se sobrecalentó el teléfono"</b>\n\n"No se puede completar esta llamada. Vuelve a intentar cuando se enfríe el teléfono.\n\nDe todos modos, puedes hacer llamadas de emergencia."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Para realizar una llamada que no sea de emergencia, sal del modo de devolución de llamada de emergencia."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"No registrado en la red."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"La red móvil no está disponible."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 a106ba2..4d1f877 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -92,7 +92,7 @@
<string name="additional_cdma_call_settings" msgid="2178016561980611304">"Ajustes adicionales de llamadas CDMA"</string>
<string name="sum_cdma_call_settings" msgid="3185825305136993636">"Ajustes adicionales de llamadas solo CDMA"</string>
<string name="labelNwService" msgid="6015891883487125120">"Ajustes del servicio de red"</string>
- <string name="labelCallerId" msgid="2090540744550903172">"Identificación de llamada"</string>
+ <string name="labelCallerId" msgid="2090540744550903172">"ID de llamada"</string>
<string name="sum_loading_settings" msgid="434063780286688775">"Cargando ajustes…"</string>
<string name="sum_hide_caller_id" msgid="131100328602371933">"Número oculto en llamadas salientes"</string>
<string name="sum_show_caller_id" msgid="3571854755324664591">"Número mostrado en llamadas salientes"</string>
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Activa la red móvil o desactiva el modo avión o el modo de ahorro de batería para hacer una llamada."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Desactiva el modo avión parra hacer llamadas."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Desactiva el modo avión o conéctate a una red inalámbrica para hacer llamadas."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"El teléfono está demasiado caliente"</b>\n\n"No se ha podido completar esta llamada. Vuelve a intentarlo cuando el teléfono se enfríe.\n\nNo obstante, puedes hacer llamadas de emergencia."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Sal del modo de devolución de llamada de emergencia para hacer otro tipo de llamada."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"No se ha podido conectar a la red"</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"La red móvil no está disponible."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 076160a..26366e9 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Helistamiseks lülitage mobiilsidevõrk sisse, lennu- või akusäästjarežiim välja."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Helistamiseks lülitage lennurežiim välja."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Helistamiseks lülitage lennurežiim välja või looge ühendus traadita võrguga."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefon on liiga kuum"</b>\n\n"Kõnet ei saa teha. Proovige uuesti, kui telefon on jahtunud.\n\nSaate endiselt teha hädaabikõnesid."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Muude kui hädaabikõne tegemiseks väljuge hädaabikõnede režiimist."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Ei ole võrku registreeritud."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobiilsidevõrk pole saadaval."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 4d5b23d..81af2b4 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -49,7 +49,7 @@
<string name="add_vm_number_str" msgid="7368168964435881637">"Gehitu zenbakia"</string>
<string name="voice_number_setting_primary_user_only" msgid="3394706575741912843">"Erabiltzaile nagusiak bakarrik alda ditzake erantzungailuaren ezarpenak."</string>
<string name="puk_unlocked" msgid="4627340655215746511">"SIM txartela desblokeatu da. Telefonoa desblokeatzen…"</string>
- <string name="label_ndp" msgid="7617392683877410341">"SIMaren sarea desblokeatzeko PINa"</string>
+ <string name="label_ndp" msgid="7617392683877410341">"SIM sarea desblokeatzeko PIN kodea"</string>
<string name="label_phoneid" msgid="8775611434123577808">"Operadore hau dauka finkatuta SIM txartelak:"</string>
<string name="sim_ndp_unlock_text" msgid="7737338355451978338">"Desblokeatu"</string>
<string name="sim_ndp_dismiss_text" msgid="89667342248929777">"Baztertu"</string>
@@ -162,15 +162,15 @@
<string name="no_change" msgid="3737264882821031892">"Ez da aldaketarik egin."</string>
<string name="sum_voicemail_choose_provider" msgid="6750824719081403773">"Aukeratu erantzungailu-zerbitzua"</string>
<string name="voicemail_default" msgid="6427575113775462077">"Operadorea"</string>
- <string name="vm_change_pin_old_pin" msgid="7154951790929009241">"PIN zaharra"</string>
- <string name="vm_change_pin_new_pin" msgid="2656200418481288069">"PIN berria"</string>
+ <string name="vm_change_pin_old_pin" msgid="7154951790929009241">"PIN kode zaharra"</string>
+ <string name="vm_change_pin_new_pin" msgid="2656200418481288069">"PIN kode berria"</string>
<string name="vm_change_pin_progress_message" msgid="626015184502739044">"Itxaron, mesedez."</string>
- <string name="vm_change_pin_error_too_short" msgid="1789139338449945483">"Laburregia da PIN berria."</string>
- <string name="vm_change_pin_error_too_long" msgid="3634907034310018954">"Luzeegia da PIN berria."</string>
- <string name="vm_change_pin_error_too_weak" msgid="8581892952627885719">"Ez da batere segurua PIN berria. Pasahitza segurua izan dadin, ez du izan behar zenbaki-segidarik edo errepikatutako zenbakirik."</string>
- <string name="vm_change_pin_error_mismatch" msgid="5364847280026257331">"PIN zaharra ez dator bat."</string>
- <string name="vm_change_pin_error_invalid" msgid="5230002671175580674">"Balio ez duten karaktereak ditu PIN berriak."</string>
- <string name="vm_change_pin_error_system_error" msgid="9116483527909681791">"Ezin da aldatu PINa"</string>
+ <string name="vm_change_pin_error_too_short" msgid="1789139338449945483">"Laburregia da PIN kode berria."</string>
+ <string name="vm_change_pin_error_too_long" msgid="3634907034310018954">"Luzeegia da PIN kode berria."</string>
+ <string name="vm_change_pin_error_too_weak" msgid="8581892952627885719">"Ez da batere segurua PIN kode berria. Pasahitza segurua izan dadin, ez du izan behar zenbaki-segidarik edo errepikatutako zenbakirik."</string>
+ <string name="vm_change_pin_error_mismatch" msgid="5364847280026257331">"PIN kode zaharra ez dator bat."</string>
+ <string name="vm_change_pin_error_invalid" msgid="5230002671175580674">"Balio ez duten karaktereak ditu PIN kode berriak."</string>
+ <string name="vm_change_pin_error_system_error" msgid="9116483527909681791">"Ezin da aldatu PIN kodea"</string>
<string name="vvm_unsupported_message_format" msgid="4206402558577739713">"Ez dira onartzen mota honetako mezuak. Entzuteko, deitu <xliff:g id="NUMBER">%s</xliff:g> zenbakira."</string>
<string name="network_settings_title" msgid="7560807107123171541">"Sare mugikorra"</string>
<string name="label_available" msgid="1316084116670821258">"Sare erabilgarriak"</string>
@@ -449,7 +449,7 @@
<string name="enable_fdn_ok" msgid="5080925177369329827">"Desgaitu markatze finkoko zenbakia"</string>
<string name="disable_fdn_ok" msgid="3745475926874838676">"Gaitu markatze finkoko zenbakiak"</string>
<string name="sum_fdn" msgid="6152246141642323582">"Kudeatu Markatze finkoko zenbakiak"</string>
- <string name="sum_fdn_change_pin" msgid="3510994280557335727">"Aldatu markatze finkoko zenbakien PINa"</string>
+ <string name="sum_fdn_change_pin" msgid="3510994280557335727">"Aldatu markatze finkoko zenbakien PIN kodea"</string>
<string name="sum_fdn_manage_list" msgid="3311397063233992907">"Kudeatu telefono-zenbakien zerrenda"</string>
<string name="voice_privacy" msgid="7346935172372181951">"Ahots-pribatutasuna"</string>
<string name="voice_privacy_summary" msgid="3556460926168473346">"Gaitu pribatutasun modu hobetua"</string>
@@ -475,7 +475,7 @@
<string name="delete_fdn_contact" msgid="7027405651994507077">"Ezabatu markatze finkoko zenbakia"</string>
<string name="deleting_fdn_contact" msgid="6872320570844460428">"Markatze finkoko zenbakia ezabatzen…"</string>
<string name="fdn_contact_deleted" msgid="1680714996763848838">"Markatze finkoko zenbakia ezabatu da."</string>
- <string name="pin2_invalid" msgid="2313954262684494442">"Ez da eguneratu markatze finkoko zenbakia, PIN okerra idatzi duzulako."</string>
+ <string name="pin2_invalid" msgid="2313954262684494442">"Ez da eguneratu markatze finkoko zenbakia, PIN kode okerra idatzi duzulako."</string>
<string name="fdn_invalid_number" msgid="9067189814657840439">"Ez da eguneratu markatze finkoko zenbakia, zenbakiak <xliff:g id="FDN_NUMBER_LIMIT_LENGTH">%d</xliff:g> digitu baino gehiago dituelako."</string>
<string name="pin2_or_fdn_invalid" msgid="7542639487955868181">"Ez da eguneratu markatze finkoko zenbakia. PIN2 kodea ez da zuzena edo telefono-zenbakia baztertu da."</string>
<string name="fdn_failed" msgid="216592346853420250">"Markatze finkoko zenbakiaren eragiketak huts egin du."</string>
@@ -483,23 +483,23 @@
<string name="simContacts_empty" msgid="1135632055473689521">"Ez duzu kontakturik SIM txartelean."</string>
<string name="simContacts_title" msgid="2714029230160136647">"Aukeratu inportatu beharreko kontaktuak"</string>
<string name="simContacts_airplaneMode" msgid="4654884030631503808">"SIM txarteleko kontaktuak inportatzeko, desaktibatu hegaldi modua."</string>
- <string name="enable_pin" msgid="967674051730845376">"Gaitu/Desgaitu SIMaren PINa"</string>
- <string name="change_pin" msgid="3657869530942905790">"Aldatu SIMaren PINa"</string>
- <string name="enter_pin_text" msgid="3182311451978663356">"SIMaren PINa:"</string>
+ <string name="enable_pin" msgid="967674051730845376">"Gaitu/Desgaitu SIM txartelaren PIN kodea"</string>
+ <string name="change_pin" msgid="3657869530942905790">"Aldatu SIM txartelaren PIN kodea"</string>
+ <string name="enter_pin_text" msgid="3182311451978663356">"SIM txartelaren PIN kodea:"</string>
<string name="oldPinLabel" msgid="8618515202411987721">"PIN zaharra"</string>
<string name="newPinLabel" msgid="3585899083055354732">"PIN berria"</string>
- <string name="confirmPinLabel" msgid="7783531218662473778">"Berretsi PIN berria"</string>
- <string name="badPin" msgid="4549286285015892321">"Idatzi duzun PIN zaharra ez da zuzena. Saiatu berriro."</string>
+ <string name="confirmPinLabel" msgid="7783531218662473778">"Berretsi PIN kode berria"</string>
+ <string name="badPin" msgid="4549286285015892321">"Idatzi duzun PIN kode zaharra ez da zuzena. Saiatu berriro."</string>
<string name="mismatchPin" msgid="1467254768290323845">"Idatzi dituzun PIN kodeak ez datoz bat. Saiatu berriro."</string>
- <string name="invalidPin" msgid="7363723429414001979">"Idatzi 4 eta 8 zenbaki arteko PIN bat."</string>
- <string name="disable_sim_pin" msgid="3112303905548613752">"Garbitu SIMaren PINa"</string>
- <string name="enable_sim_pin" msgid="445461050748318980">"Ezarri SIMaren PINa"</string>
- <string name="enable_in_progress" msgid="4135305985717272592">"PINa ezartzen…"</string>
- <string name="enable_pin_ok" msgid="2877428038280804256">"Ezarri da PINa"</string>
- <string name="disable_pin_ok" msgid="888505244389647754">"Garbitu da PINa"</string>
- <string name="pin_failed" msgid="4527347792881939652">"PINa ez da zuzena"</string>
- <string name="pin_changed" msgid="7291153750090452808">"Eguneratu da PINa"</string>
- <string name="puk_requested" msgid="2061337960609806851">"Pasahitza ez da zuzena. PINa blokeatu egin da. PUKa behar da."</string>
+ <string name="invalidPin" msgid="7363723429414001979">"Idatzi 4 eta 8 zenbaki arteko PIN kodea."</string>
+ <string name="disable_sim_pin" msgid="3112303905548613752">"Garbitu SIM txartelaren PIN kodea"</string>
+ <string name="enable_sim_pin" msgid="445461050748318980">"Ezarri SIM txartelaren PIN kodea"</string>
+ <string name="enable_in_progress" msgid="4135305985717272592">"PIN kodea ezartzen…"</string>
+ <string name="enable_pin_ok" msgid="2877428038280804256">"PIN kodea ezarri da"</string>
+ <string name="disable_pin_ok" msgid="888505244389647754">"PIN kodea garbitu da"</string>
+ <string name="pin_failed" msgid="4527347792881939652">"PIN kodea ez da zuzena"</string>
+ <string name="pin_changed" msgid="7291153750090452808">"PIN kodea eguneratu da"</string>
+ <string name="puk_requested" msgid="2061337960609806851">"Pasahitza ez da zuzena. PIN kodea blokeatu egin da. PUK kodea behar da."</string>
<string name="enter_pin2_text" msgid="7266379426804295979">"PIN2 kodea"</string>
<string name="oldPin2Label" msgid="4648543187859997203">"PIN2 kode zaharra"</string>
<string name="newPin2Label" msgid="1840905981784453939">"PIN2 berria"</string>
@@ -537,7 +537,6 @@
<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_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefonoa beroegi dago"</b>\n\n"Ezin da egin deia. Saiatu berriro telefonoa hozten denean.\n\nHala ere, larrialdi-deiak egin ditzakezu."</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_emergency_only" msgid="8786127461027964653">"Ez dago sarean erregistratuta."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Sare mugikorra ez dago erabilgarri."</string>
@@ -669,8 +668,8 @@
<string name="description_dialpad_button" msgid="7395114120463883623">"erakutsi markagailua"</string>
<string name="pane_title_emergency_dialpad" msgid="3627372514638694401">"Larrialdietarako markagailua"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="6610414098912832120">"Ikusizko erantzungailua"</string>
- <string name="voicemail_set_pin_dialog_title" msgid="7005128605986960003">"Ezarri PINa"</string>
- <string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"Aldatu PINa"</string>
+ <string name="voicemail_set_pin_dialog_title" msgid="7005128605986960003">"Ezarri PIN kodea"</string>
+ <string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"Aldatu PIN kodea"</string>
<string name="preference_category_ringtone" msgid="8787281191375434976">"Tonua eta dardara"</string>
<string name="pstn_connection_service_label" msgid="9200102709997537069">"SIM txartel integratuak"</string>
<string name="enable_video_calling_title" msgid="7246600931634161830">"Aktibatu bideo-deiak"</string>
@@ -693,18 +692,18 @@
<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>
<string name="callFailed_wfc_service_not_available_in_this_location" msgid="3624536608369524988">"Ez daude erabilgarri wifi bidezko deiak kokapen honetan."</string>
- <string name="change_pin_title" msgid="3564254326626797321">"Aldatu erantzungailuaren PINa"</string>
+ <string name="change_pin_title" msgid="3564254326626797321">"Aldatu erantzungailuaren PIN kodea"</string>
<string name="change_pin_continue_label" msgid="5177011752453506371">"Egin aurrera"</string>
<string name="change_pin_cancel_label" msgid="2301711566758827936">"Utzi"</string>
<string name="change_pin_ok_label" msgid="6861082678817785330">"Ados"</string>
- <string name="change_pin_enter_old_pin_header" msgid="853151335217594829">"Berretsi PIN zaharra"</string>
- <string name="change_pin_enter_old_pin_hint" msgid="8801292976275169367">"Aurrera egiteko, idatzi erantzungailuaren PINa."</string>
- <string name="change_pin_enter_new_pin_header" msgid="4739465616733486118">"Ezarri PIN berri bat"</string>
+ <string name="change_pin_enter_old_pin_header" msgid="853151335217594829">"Berretsi PIN kode zaharra"</string>
+ <string name="change_pin_enter_old_pin_hint" msgid="8801292976275169367">"Idatzi erantzungailuaren PIN kodea jarraitzeko."</string>
+ <string name="change_pin_enter_new_pin_header" msgid="4739465616733486118">"Ezarri PIN kode berria"</string>
<string name="change_pin_enter_new_pin_hint" msgid="2326038476516364210">"<xliff:g id="MIN">%1$d</xliff:g> eta <xliff:g id="MAX">%2$d</xliff:g> digituren artean izan behar ditu PIN kodeak."</string>
- <string name="change_pin_confirm_pin_header" msgid="2606303906320705726">"Berretsi PINa"</string>
+ <string name="change_pin_confirm_pin_header" msgid="2606303906320705726">"Berretsi PIN kodea"</string>
<string name="change_pin_confirm_pins_dont_match" msgid="305164501222587215">"PINak ez datoz bat"</string>
- <string name="change_pin_succeeded" msgid="2504705600693014403">"Eguneratu da erantzungailuaren PINa"</string>
- <string name="change_pin_system_error" msgid="7772788809875146873">"Ezin da ezarri PINa"</string>
+ <string name="change_pin_succeeded" msgid="2504705600693014403">"Eguneratu da erantzungailuaren PIN kodea"</string>
+ <string name="change_pin_system_error" msgid="7772788809875146873">"Ezin da ezarri PIN kodea"</string>
<string name="mobile_data_status_roaming_turned_off_subtext" msgid="6840673347416227054">"Desaktibatuta daude ibiltaritzako datuak"</string>
<string name="mobile_data_status_roaming_turned_on_subtext" msgid="5615757897768777865">"Aktibatuta daude ibiltaritzako datuak"</string>
<string name="mobile_data_status_roaming_without_plan_subtext" msgid="6536671968072284677">"Ibiltaritza moduan zaude une honetan. Datu-plan bat behar duzu."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 eb9086e..7cb550c 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"تلفن خیلی داغ است"</b>\n\n"نمیتوان این تماس را بهپایان رساند. وقتی تلفن خنک شد، دوباره امتحان کنید.\n\nهمچنان میتوانید تماسهای اضطراری برقرار کنید."</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"پیکربندی برش شبکه:"</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 34d40a8..6506746 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Ota mobiiliverkko käyttöön tai poista lentokonetila ja virransäästötila käytöstä, jos haluat soittaa puhelun."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Poista lentokonetila käytöstä, jos haluat soittaa puhelun."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Poista lentokonetila käytöstä tai yhdistä langattomaan verkkoon, jos haluat soittaa puhelun."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Liian kuuma puhelin"</b>\n\n"Puhelua ei voida soittaa. Yritä uudelleen, kun puhelin on jäähtynyt.\n\nVoit silti soittaa hätäpuheluita."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Poistu hätäpuhelujen takaisinsoittotilasta soittaaksesi muun kuin hätäpuhelun."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Ei rekisteröity verkkoon."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobiiliverkko ei käytettävissä."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 d918672..76d9bb6 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -537,7 +537,6 @@
<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="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_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Le téléphone est trop chaud"</b>\n\n"Impossible de passer cet appel. Réessayez plus tard quand le téléphone aura refroidi.\n\nVous pouvez toujours effectuer des appels d\'urgence."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Quittez le mode de rappel d\'urgence pour effectuer un appel non urgent."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Non enregistré sur le réseau"</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Réseau pour mobile non disponible"</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 957e361..e92aac6 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Pour passer un appel, activez le réseau mobile, et désactivez les modes Avion et Économiseur de batterie."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Désactivez le mode Avion pour passer un appel."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Désactivez le mode Avion ou connectez-vous à un réseau sans fil pour passer un appel."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Téléphone trop chaud"</b>\n\n"Impossible de passer cet appel. Réessayez lorsque votre téléphone aura refroidi.\n\nVous pouvez toujours passer des appels d\'urgence."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Veuillez quitter le mode de rappel d\'urgence pour passer un appel standard."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Non enregistré sur le réseau."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Réseau mobile non disponible"</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 6fdca2d..145ce03 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Para facer unha chamada, activa a rede de telefonía móbil, desactiva o modo avión ou desactiva o modo Aforro de batería."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Desactiva o modo avión para facer unha chamada."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Desactiva o modo avión ou conéctate a unha rede sen fíos para facer unha chamada."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"A temperatura do teléfono é moi alta"</b>\n\n"Non se pode completar esta chamada. Téntao de novo cando arrefríe o teléfono.\n\nAínda así, podes facer chamadas de emerxencia."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Sae do modo de devolución de chamada de emerxencia para facer unha chamada que non sexa de emerxencia."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Sen rexistro na rede"</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"A rede móbil non está dispoñible."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 38000a3..9ae6f2f 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -420,7 +420,7 @@
<string name="cdma_system_select_dialogtitle" msgid="5524639510676501802">"સિસ્ટમ પસંદગી"</string>
<string-array name="cdma_system_select_choices">
<item msgid="462340042928284921">"ફક્ત હોમ"</item>
- <item msgid="6058010046783562674">"ઑટોમૅટિક"</item>
+ <item msgid="6058010046783562674">"સ્વચલિત"</item>
</string-array>
<string name="cdma_subscription_title" msgid="3449527179325589434">"CDMA સબ્સ્ક્રિપ્શન"</string>
<string name="cdma_subscription_summary" msgid="5681152534466169001">"RUIM/SIM અને NV વચ્ચે બદલો"</string>
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ફોન ખૂબ ગરમ છે"</b>\n\n"આ કૉલ પૂર્ણ કરી શકતા નથી. તમારો ફોન ઠંડો પડે ત્યાર પછી ફરીથી પ્રયાસ કરો.\n\nતમે હજી પણ ઇમર્જન્સી કૉલ કરી શકો છો."</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 b65016e..0346a6d 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -186,9 +186,9 @@
<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>
- <string name="preferred_network_mode_title" msgid="5253395265169539830">"पसंदीदा नेटवर्क टाइप"</string>
+ <string name="preferred_network_mode_title" msgid="5253395265169539830">"पसंदीदा नेटवर्क प्रकार"</string>
<string name="preferred_network_mode_summary" msgid="3787989000044330064">"नेटवर्क संचालन मोड बदलें"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="2781447433514459696">"पसंदीदा नेटवर्क टाइप"</string>
+ <string name="preferred_network_mode_dialogtitle" msgid="2781447433514459696">"पसंदीदा नेटवर्क प्रकार"</string>
<string name="forbidden_network" msgid="5081729819561333023">"(मना है)"</string>
<string name="choose_network_title" msgid="5335832663422653082">"नेटवर्क चुनें"</string>
<string name="network_disconnected" msgid="8844141106841160825">"डिसकनेक्ट है"</string>
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"आपका फ़ोन बहुत गर्म हो गया है"</b>\n\n"यह कॉल नहीं लगाया जा सकता. फ़ोन का तापमान कम होने के बाद, फिर से कोशिश करें.\n\nहालांकि, आप अब भी आपातकालीन कॉल कर सकते हैं."</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>
@@ -678,7 +677,7 @@
<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_emergency_calls" msgid="5146872803938897296">"केवल आपातकालीन कॉल"</string>
<string name="sim_description_default" msgid="7474671114363724971">"सिम कार्ड, स्लॉट: <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">"इससे वाई-फ़ाई कॉल"</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 b9a8d0b..10d0bff 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Uključite mobilnu mrežu, isključite način rada u zrakoplovu ili štednju baterije da biste uputili poziv."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Isključite način rada u zrakoplovu da biste uputili poziv."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Isključite način rada u zrakoplovu ili se povežite s bežičnom mrežom da biste uputili poziv."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefon je prevruć"</b>\n\n"Poziv se ne može dovršiti. Pokušajte ponovno kad se telefon ohladi.\n\nI dalje možete upućivati hitne pozive."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Isključite način hitnih poziva da biste uputili poziv koji nije hitan."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Nije registrirano na mreži."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilna mreža nije dostupna."</string>
@@ -918,6 +917,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 80d1865..92d1d08 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"A hívás indításához kapcsolja be a hálózatot, és kapcsolja ki a repülős vagy akkumulátorkímélő üzemmódot."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Repülős üzemmód kikapcsolása hívás indításához."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Hívás indításához kapcsolja ki a repülős üzemmódot, illetve csatlakozzon egy vezeték nélküli hálózathoz."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Túlmelegedett a telefon"</b>\n\n"Ezt a hívást nem lehet végrehajtani. Próbálkozzon újra, ha már lehűlt a telefon.\n\nSegélyhívást így is indíthat."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Lépjen ki a Segélykérő visszahívása módból nem vészjellegű hívás kezdeményezéséhez."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Nincs regisztrálva a hálózaton."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"A mobilhálózat nem érhető el."</string>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Network slicing config:"</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 7ccb20d..6d5e980 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"Հեռախոսը գերտաքացել է"</b>\n\n"Չհաջողվեց կատարել զանգը։ Նորից փորձեք, երբ հեռախոսը հովանա։\n\nԴուք նախկինի պես կկարողանաք շտապ կանչեր կատարել։"</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Ցանցի հատվածավորման կազմաձև՝"</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 17e8fd7..c1a13ce 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Aktifkan jaringan seluler, lalu nonaktifkan mode pesawat atau penghemat baterai untuk melakukan panggilan."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Nonaktifkan mode pesawat untuk melakukan panggilan"</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Nonaktifkan mode pesawat atau sambungkan ke jaringan nirkabel untuk melakukan panggilan"</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Ponsel terlalu panas"</b>\n\n"Tidak dapat menyelesaikan panggilan ini. Coba lagi saat ponsel mendingin.\n\nAnda masih dapat melakukan panggilan darurat."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Keluar dari mode telepon balik darurat untuk melakukan panggilan non-darurat."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Tidak terdaftar pada jaringan."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Jaringan seluler tidak tersedia."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 b44afa2..68dd17e 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Kveiktu á farsímakerfie eða slökktu á flugstillingu eða rafhlöðusparnaði til að hringja."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Slökktu á flugstillingu til að hringja."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Slökktu á flugstillingu eða tengstu þráðlausu neti til að hringja."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Síminn er of heitur"</b>\n\n"Ekki er hægt að ljúka þessu símtali. Reyndu aftur þegar síminn hefur kólnað.\n\nÞú getur ennþá hringt neyðarsímtöl."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Hætta í stillingu fyrir svarhringingu neyðarsímtala til að hringja símtal sem ekki er neyðarsímtal."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Ekki skráð á símkerfi."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Farsímakerfi ekki tiltækt."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 d38c50f..a4b3fe1 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Attiva la rete mobile e disattiva la modalità aereo o il risparmio energetico per effettuare una chiamata."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Disattiva la modalità aereo per effettuare una chiamata."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Disattiva la modalità aereo o connettiti a una rete wireless per effettuare una chiamata."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefono surriscaldato"</b>\n\n"Impossibile completare la chiamata. Riprova quando il telefono si sarà raffreddato.\n\nPuoi comunque effettuare chiamate di emergenza."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Per effettuare chiamate non di emergenza, esci dalla modalità di richiamata di emergenza."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Non registrato sulla rete."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Rete cellulare non disponibile."</string>
@@ -668,7 +667,7 @@
<string name="description_dial_button" msgid="8614631902795087259">"componi"</string>
<string name="description_dialpad_button" msgid="7395114120463883623">"mostra tastierino"</string>
<string name="pane_title_emergency_dialpad" msgid="3627372514638694401">"Tastierino di emergenza"</string>
- <string name="voicemail_visual_voicemail_switch_title" msgid="6610414098912832120">"Lettura della segreteria"</string>
+ <string name="voicemail_visual_voicemail_switch_title" msgid="6610414098912832120">"Leggi la segreteria"</string>
<string name="voicemail_set_pin_dialog_title" msgid="7005128605986960003">"Imposta PIN"</string>
<string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"Cambia PIN"</string>
<string name="preference_category_ringtone" msgid="8787281191375434976">"Suoneria e vibrazione"</string>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Configurazione network slicing:"</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 5fbf20d..b5b2f75 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -31,29 +31,29 @@
<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">"אישור"</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_wired_headset" msgid="5028010823105817443">"אוזניות קוויות"</string>
<string name="audio_mode_bluetooth" msgid="25732183428018809">"Bluetooth"</string>
<string name="wait_prompt_str" msgid="5136209532150094910">"לשלוח את הצלילים הבאים?\n"</string>
- <string name="pause_prompt_str" msgid="2308897950360272213">"שליחת צלילים מתבצעת\n"</string>
+ <string name="pause_prompt_str" msgid="2308897950360272213">"שולח צלילים\n"</string>
<string name="send_button" msgid="5070379600779031932">"שליחה"</string>
<string name="pause_prompt_yes" msgid="8184132073048369575">"כן"</string>
<string name="pause_prompt_no" msgid="2145264674774138579">"לא"</string>
<string name="wild_prompt_str" msgid="5858910969703305375">"החלפת התו הכללי ב"</string>
<string name="no_vm_number" msgid="6623853880546176930">"חסר מספר של דואר קולי"</string>
<string name="no_vm_number_msg" msgid="5165161462411372504">"בכרטיס ה-SIM לא מאוחסן מספר של דואר קולי."</string>
- <string name="add_vm_number_str" msgid="7368168964435881637">"הוספת מספר"</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="label_ndp" msgid="7617392683877410341">"קוד אימות לביטול נעילה של רשת SIM"</string>
+ <string name="puk_unlocked" msgid="4627340655215746511">"בוטלה החסימה של כרטיס SIM. מבטל את חסימת הטלפון..."</string>
+ <string name="label_ndp" msgid="7617392683877410341">"PIN לביטול נעילה של רשת SIM"</string>
<string name="label_phoneid" msgid="8775611434123577808">"כרטיס ה-SIM נעול על ידי הספק הסלולרי"</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>
+ <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>
<string name="unlock_failed" msgid="7103543844840661366">"הבקשה לביטול נעילת הרשת נכשלה."</string>
<string name="unlock_success" msgid="32681089371067565">"ביטול נעילת הרשת התבצע בהצלחה."</string>
<string name="mobile_network_settings_not_available" msgid="8678168497517090039">"הגדרות של רשת סלולרית אינן זמינות עבור המשתמש הזה"</string>
@@ -64,17 +64,17 @@
<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_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>
+ <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>
<string name="phone_accounts_default_account_label" msgid="5107598881335931101">"אין רשתות זמינות"</string>
<string name="phone_accounts_settings_header" msgid="6296501692964706536">"הגדרות"</string>
- <string name="phone_accounts_choose_accounts" msgid="4748805293314824974">"בחירת חשבונות"</string>
+ <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_add_sip_account" msgid="1437634802033309305">"הוסף חשבון SIP"</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="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"בחר אילו חשבונות יכולים להתקשר"</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>
@@ -93,7 +93,7 @@
<string name="sum_cdma_call_settings" msgid="3185825305136993636">"הגדרות שיחה נוספות של CDMA בלבד"</string>
<string name="labelNwService" msgid="6015891883487125120">"הגדרות שירות רשת"</string>
<string name="labelCallerId" msgid="2090540744550903172">"שיחה מזוהה"</string>
- <string name="sum_loading_settings" msgid="434063780286688775">"טעינת ההגדרות מתבצעת..."</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>
<string name="sum_default_caller_id" msgid="1767070797135682959">"שימוש בהגדרות ברירת המחדל של המפעיל כדי להציג את המספר שלי בשיחות יוצאות"</string>
@@ -103,25 +103,25 @@
<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="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="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_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="messageCFNRy" msgid="7644434155765359009">"מספר לחיוג כשאין מענה"</string>
- <string name="sum_cfnry_enabled" msgid="3000500837493854799">"העברה אל <xliff:g id="PHONENUMBER">{0}</xliff:g> מתבצעת"</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="messageCFNRc" msgid="6980340731313007250">"המספר לחיוג כשלא ניתן להשיג"</string>
- <string name="sum_cfnrc_enabled" msgid="1799069234006073477">"העברה אל <xliff:g id="PHONENUMBER">{0}</xliff:g> מתבצעת"</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="disable_cfnrc_forbidden" msgid="775348748084726890">"הספק שלך לא תומך בהשבתה של העברת שיחות כאשר הטלפון כבוי."</string>
<string name="registration_cf_forbidden" msgid="4386482610771190420">"הספק הסלולרי שלך לא תומך בהעברת שיחות."</string>
@@ -135,9 +135,9 @@
<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="reverting_settings" msgid="7378668837291012205">"אחזור ההגדרות הקודמות מתבצע…"</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>
<string name="stk_cc_ss_to_dial_error" msgid="5147693491690618704">"בקשת SS שונתה לשיחה רגילה"</string>
@@ -145,41 +145,41 @@
<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="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="disable" msgid="1122698860799462116">"כבה"</string>
+ <string name="change_num" msgid="6982164494063109334">"עדכן"</string>
<string-array name="clir_display_values">
<item msgid="8477364191403806960">"רשת ברירת מחדל"</item>
- <item msgid="6813323051965618926">"הסתרת מספר"</item>
- <item msgid="9150034130629852635">"הצגת מספר"</item>
+ <item msgid="6813323051965618926">"הסתר מספר"</item>
+ <item msgid="9150034130629852635">"הצג מספר"</item>
</string-array>
<string name="vm_changed" msgid="4739599044379692505">"המספר של הדואר הקולי השתנה."</string>
- <string name="vm_change_failed" msgid="7877733929455763566">"לא ניתן לשנות את מספר הגישה לדואר הקולי.\nאם הבעיה נמשכת, יש לפנות לספק."</string>
- <string name="fw_change_failed" msgid="9179241823460192148">"לא ניתן לשנות את מספר ההעברה.\nאם הבעיה נמשכת, יש לפנות לספק."</string>
+ <string name="vm_change_failed" msgid="7877733929455763566">"לא ניתן לשנות את מספר הגישה לדואר הקולי.\nאם הבעיה נמשכת, פנה לספק."</string>
+ <string name="fw_change_failed" msgid="9179241823460192148">"לא ניתן לשנות את מספר ההעברה.\nאם הבעיה נמשכת, פנה לספק."</string>
<string name="fw_get_in_vm_failed" msgid="2432678237218183844">"לא ניתן לאחזר ולשמור את הגדרות מספר ההעברה הנוכחי.\nלעבור בכל זאת לספק החדש?"</string>
<string name="no_change" msgid="3737264882821031892">"לא בוצעו שינויים."</string>
- <string name="sum_voicemail_choose_provider" msgid="6750824719081403773">"בחירת שירות דואר קולי"</string>
+ <string name="sum_voicemail_choose_provider" msgid="6750824719081403773">"בחר שירות של דואר קולי"</string>
<string name="voicemail_default" msgid="6427575113775462077">"הספק שלך"</string>
<string name="vm_change_pin_old_pin" msgid="7154951790929009241">"קוד גישה ישן"</string>
<string name="vm_change_pin_new_pin" msgid="2656200418481288069">"קוד גישה חדש"</string>
- <string name="vm_change_pin_progress_message" msgid="626015184502739044">"יש להמתין."</string>
+ <string name="vm_change_pin_progress_message" msgid="626015184502739044">"אנא המתן."</string>
<string name="vm_change_pin_error_too_short" msgid="1789139338449945483">"קוד הגישה החדש קצר מדי."</string>
<string name="vm_change_pin_error_too_long" msgid="3634907034310018954">"קוד הגישה החדש ארוך מדי."</string>
<string name="vm_change_pin_error_too_weak" msgid="8581892952627885719">"קוד הגישה החדש חלש מדי. בסיסמה חזקה אסור שיהיו ספרות ברצף מספרי או ספרות שחוזרות על עצמן."</string>
<string name="vm_change_pin_error_mismatch" msgid="5364847280026257331">"קוד הגישה הישן אינו תואם."</string>
<string name="vm_change_pin_error_invalid" msgid="5230002671175580674">"קוד הגישה החדש מכיל תווים לא חוקיים."</string>
<string name="vm_change_pin_error_system_error" msgid="9116483527909681791">"לא ניתן לשנות את קוד הגישה"</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>
+ <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="register_on_network" msgid="4194770527833960423">"ההרשמה ב-<xliff:g id="NETWORK">%s</xliff:g> מתבצעת…"</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>
+ <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>
@@ -187,7 +187,7 @@
<string name="network_select_title" msgid="4117305053881611988">"רשת"</string>
<string name="register_automatically" msgid="3907580547590554834">"רישום אוטומטי..."</string>
<string name="preferred_network_mode_title" msgid="5253395265169539830">"סוג רשת מועדף"</string>
- <string name="preferred_network_mode_summary" msgid="3787989000044330064">"שינוי מצב ההפעלה של הרשת"</string>
+ <string name="preferred_network_mode_summary" msgid="3787989000044330064">"שנה את מצב ההפעלה של הרשת"</string>
<string name="preferred_network_mode_dialogtitle" msgid="2781447433514459696">"סוג רשת מועדף"</string>
<string name="forbidden_network" msgid="5081729819561333023">"(אסור)"</string>
<string name="choose_network_title" msgid="5335832663422653082">"בחירת רשת"</string>
@@ -239,25 +239,25 @@
<string name="preferred_network_mode_cdma_evdo_summary" msgid="3629440709757307077">"מצב רשת מועדפת: CDMA / EvDo"</string>
<string name="preferred_network_mode_cdma_only_summary" msgid="211164451887102568">"מצב רשת מועדפת: CDMA בלבד"</string>
<string name="preferred_network_mode_evdo_only_summary" msgid="939116631952132878">"מצב רשת מועדפת: EvDo בלבד"</string>
- <string name="preferred_network_mode_cdma_evdo_gsm_wcdma_summary" msgid="7891131456022601976">"מצב רשת מועדפת: CDMA/EvDo/GSM/WCDMA"</string>
- <string name="preferred_network_mode_lte_summary" msgid="8050539466545797149">"מצב רשת מועדפת: LTE"</string>
- <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_cdma_evdo_gsm_wcdma_summary" msgid="7891131456022601976">"מצב רשת מועדף: CDMA/EvDo/GSM/WCDMA"</string>
+ <string name="preferred_network_mode_lte_summary" msgid="8050539466545797149">"מצב רשת מועדף: LTE"</string>
+ <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_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_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>
- <string name="preferred_network_mode_tdscdma_summary" msgid="3602127224234207206">"מצב רשת מועדפת: TDSCDMA"</string>
- <string name="preferred_network_mode_tdscdma_wcdma_summary" msgid="7076968749402201123">"מצב רשת מועדפת: TDSCDMA / WCDMA"</string>
- <string name="preferred_network_mode_lte_tdscdma_summary" msgid="3001058390866953624">"מצב רשת מועדפת: LTE / TDSCDMA"</string>
- <string name="preferred_network_mode_tdscdma_gsm_summary" msgid="1716983444872465309">"מצב רשת מועדפת: TDSCDMA / GSM"</string>
- <string name="preferred_network_mode_lte_tdscdma_gsm_summary" msgid="1349057007230669585">"מצב רשת מועדפת: LTE/GSM/TDSCDMA"</string>
- <string name="preferred_network_mode_tdscdma_gsm_wcdma_summary" msgid="2092262901885164194">"מצב רשת מועדפת: TDSCDMA/GSM/WCDMA"</string>
- <string name="preferred_network_mode_lte_tdscdma_wcdma_summary" msgid="56422129430744466">"מצב רשת מועדפת: LTE/TDSCDMA/WCDMA"</string>
- <string name="preferred_network_mode_lte_tdscdma_gsm_wcdma_summary" msgid="2993923113350341106">"מצב רשת מועדפת: LTE/TDSCDMA/GSM/WCDMA"</string>
- <string name="preferred_network_mode_tdscdma_cdma_evdo_gsm_wcdma_summary" msgid="2779089629254220257">"מצב רשת מועדפת: TDSCDMA/CDMA/EvDo/GSM/WCDMA"</string>
- <string name="preferred_network_mode_lte_tdscdma_cdma_evdo_gsm_wcdma_summary" msgid="9065672185435798587">"מצב רשת מועדפת: LTE/TDSCDMA/CDMA/EvDo/GSM/WCDMA"</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>
+ <string name="preferred_network_mode_lte_tdscdma_summary" msgid="3001058390866953624">"מצב רשת מועדף: LTE / TDSCDMA"</string>
+ <string name="preferred_network_mode_tdscdma_gsm_summary" msgid="1716983444872465309">"מצב רשת מועדף: TDSCDMA / GSM"</string>
+ <string name="preferred_network_mode_lte_tdscdma_gsm_summary" msgid="1349057007230669585">"מצב רשת מועדף: LTE/GSM/TDSCDMA"</string>
+ <string name="preferred_network_mode_tdscdma_gsm_wcdma_summary" msgid="2092262901885164194">"מצב רשת מועדף: TDSCDMA/GSM/WCDMA"</string>
+ <string name="preferred_network_mode_lte_tdscdma_wcdma_summary" msgid="56422129430744466">"מצב רשת מועדף: LTE/TDSCDMA/WCDMA"</string>
+ <string name="preferred_network_mode_lte_tdscdma_gsm_wcdma_summary" msgid="2993923113350341106">"מצב רשת מועדף: LTE/TDSCDMA/GSM/WCDMA"</string>
+ <string name="preferred_network_mode_tdscdma_cdma_evdo_gsm_wcdma_summary" msgid="2779089629254220257">"מצב רשת מועדף: TDSCDMA/CDMA/EvDo/GSM/WCDMA"</string>
+ <string name="preferred_network_mode_lte_tdscdma_cdma_evdo_gsm_wcdma_summary" msgid="9065672185435798587">"מצב רשת מועדף: LTE/TDSCDMA/CDMA/EvDo/GSM/WCDMA"</string>
<string name="preferred_network_mode_nr_only_summary" msgid="1467452233297987391">"מצב רשת מועדפת: NR בלבד"</string>
<string name="preferred_network_mode_nr_lte_summary" msgid="5890170406507535976">"מצב רשת מועדפת: NR / LTE"</string>
<string name="preferred_network_mode_nr_lte_cdma_evdo_summary" msgid="5507940227264296616">"מצב רשת מועדפת: NR/LTE/CDMA/EvDo"</string>
@@ -273,17 +273,17 @@
<string name="network_operator_category" msgid="4992217193732304680">"רשת"</string>
<string name="enhanced_4g_lte_mode_title" msgid="4213420368777080540">"מצב 4G LTE משופר"</string>
<!-- no translation found for enhanced_4g_lte_mode_title_variant:0 (7240155150166394308) -->
- <string name="enhanced_4g_lte_mode_summary" msgid="7725708511804143638">"שימוש בשירותי LTE כדי לשפר את הקול ודרכי תקשורת אחרות (מומלץ)"</string>
+ <string name="enhanced_4g_lte_mode_summary" msgid="7725708511804143638">"השתמש בשירותי LTE כדי לשפר את הקול ודרכי תקשורת אחרות (מומלץ)"</string>
<string name="enhanced_4g_lte_mode_summary_o2" msgid="2521108446409016542">"שימוש בשירותי 4G כדי לשפר את הקול ודרכי תקשורת אחרות (מומלץ)"</string>
<!-- no translation found for enhanced_4g_lte_mode_sumary_variant:0 (2943982616649705147) -->
<!-- no translation found for enhanced_4g_lte_mode_sumary_variant:1 (5262249464504131443) -->
<!-- no translation found for enhanced_4g_lte_mode_sumary_variant:2 (6356974241850241718) -->
<string name="data_enabled" msgid="22525832097434368">"נתונים מופעלים"</string>
- <string name="data_enable_summary" msgid="696860063456536557">"התרת שימוש בחבילת הגלישה"</string>
+ <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>
@@ -355,7 +355,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>
@@ -416,7 +416,7 @@
<string name="network_4G" msgid="6800527815504223913">"4G (מומלץ)"</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_summary" msgid="3840420390242060407">"שנה את מצב נדידת CDMA"</string>
<string name="cdma_system_select_dialogtitle" msgid="5524639510676501802">"בחירת מערכת"</string>
<string-array name="cdma_system_select_choices">
<item msgid="462340042928284921">"בית בלבד"</item>
@@ -433,8 +433,8 @@
<item msgid="2953825013895327785">"0"</item>
<item msgid="7970797749269738435">"1"</item>
</string-array>
- <string name="cdma_activate_device" msgid="5914720276140097632">"הפעלת המכשיר"</string>
- <string name="cdma_lte_data_service" msgid="359786441782404562">"הגדרת שירות נתונים"</string>
+ <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>
@@ -445,7 +445,7 @@
<string name="fdn_disabled" msgid="6696468878037736600">"מספרי חיוג קבועים מושבתים"</string>
<string name="enable_fdn" msgid="4830555730418033723">"הפעלת מספרי חיוג קבועים"</string>
<string name="disable_fdn" msgid="3918794950264647541">"השבתת מספרי חיוג קבועים"</string>
- <string name="change_pin2" msgid="3110844547237754871">"שינוי קוד אימות 2"</string>
+ <string name="change_pin2" msgid="3110844547237754871">"שינוי PIN2"</string>
<string name="enable_fdn_ok" msgid="5080925177369329827">"השבת מספרי חיוג קבועים"</string>
<string name="disable_fdn_ok" msgid="3745475926874838676">"הפעלה של מספרי חיוג קבועים"</string>
<string name="sum_fdn" msgid="6152246141642323582">"ניהול מספרי חיוג קבועים"</string>
@@ -454,97 +454,96 @@
<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="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="menu_add" msgid="5616487894975773141">"הוספת איש קשר"</string>
- <string name="menu_edit" msgid="3593856941552460706">"עריכת איש קשר"</string>
- <string name="menu_delete" msgid="6326861853830546488">"מחיקת איש קשר"</string>
+ <string name="menu_add" msgid="5616487894975773141">"הוסף איש קשר"</string>
+ <string name="menu_edit" msgid="3593856941552460706">"ערוך איש קשר"</string>
+ <string name="menu_delete" msgid="6326861853830546488">"מחק איש קשר"</string>
<string name="menu_dial" msgid="4178537318419450012">"חיוג לאיש הקשר"</string>
- <string name="get_pin2" msgid="4221654606863196332">"יש להקליד קוד אימות 2"</string>
+ <string name="get_pin2" msgid="4221654606863196332">"הקלד PIN2"</string>
<string name="name" msgid="1347432469852527784">"שם"</string>
<string name="number" msgid="1564053487748491000">"מספר"</string>
- <string name="save" msgid="983805790346099749">"שמירה"</string>
- <string name="add_fdn_contact" msgid="1169713422306640887">"הוספת מספר חיוג קבוע"</string>
- <string name="adding_fdn_contact" msgid="3112531600824361259">"הוספת מספר חיוג קבוע מתבצעת..."</string>
+ <string name="save" msgid="983805790346099749">"שמור"</string>
+ <string name="add_fdn_contact" msgid="1169713422306640887">"הוסף מספר חיוג קבוע"</string>
+ <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="edit_fdn_contact" msgid="6030829994819587408">"ערוך מספר חיוג קבוע"</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="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">"רשימת מספרי חיוג קבועים לא עודכנה מכיוון שקוד הגישה שגוי."</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">"רשימת מספרי החיוג הקבועים לא עודכנה. קוד הגישה היה שגוי או שמספר הטלפון נדחה."</string>
<string name="fdn_failed" msgid="216592346853420250">"פעולת FDN נכשלה."</string>
- <string name="simContacts_emptyLoading" msgid="4989040293858675483">"קריאה מכרטיס SIM מתבצעת…"</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="enable_pin" msgid="967674051730845376">"הפעלה/השבתה של קוד האימות של SIM"</string>
- <string name="change_pin" msgid="3657869530942905790">"שינוי קוד אימות של SIM"</string>
- <string name="enter_pin_text" msgid="3182311451978663356">"קוד אימות של SIM:"</string>
- <string name="oldPinLabel" msgid="8618515202411987721">"קוד אימות ישן"</string>
- <string name="newPinLabel" msgid="3585899083055354732">"קוד אימות חדש"</string>
- <string name="confirmPinLabel" msgid="7783531218662473778">"אישור קוד אימות חדש"</string>
- <string name="badPin" msgid="4549286285015892321">"קוד האימות הישן שהקלדת שגוי. יש לנסות שוב."</string>
- <string name="mismatchPin" msgid="1467254768290323845">"קודי האימות שהקלדת לא תואמים. יש לנסות שוב."</string>
- <string name="invalidPin" msgid="7363723429414001979">"יש להקליד קוד אימות שאורכו 4 עד 8 ספרות."</string>
+ <string name="simContacts_title" msgid="2714029230160136647">"בחר אנשי קשר לייבוא"</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>
+ <string name="oldPinLabel" msgid="8618515202411987721">"PIN ישן"</string>
+ <string name="newPinLabel" msgid="3585899083055354732">"PIN חדש"</string>
+ <string name="confirmPinLabel" msgid="7783531218662473778">"אשר PIN חדש"</string>
+ <string name="badPin" msgid="4549286285015892321">"ה-PIN הישן שהקלדת שגוי. נסה שוב."</string>
+ <string name="mismatchPin" msgid="1467254768290323845">"קודי ה-PIN שהקלדת אינם תואמים. נסה שוב."</string>
+ <string name="invalidPin" msgid="7363723429414001979">"הקלד PIN שאורכו 4 עד 8 ספרות."</string>
<string name="disable_sim_pin" msgid="3112303905548613752">"ניקוי PIN עבור 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="disable_pin_ok" msgid="888505244389647754">"קוד האימות נמחק"</string>
- <string name="pin_failed" msgid="4527347792881939652">"קוד אימות 2 שגוי"</string>
- <string name="pin_changed" msgid="7291153750090452808">"קוד אימות עודכן"</string>
- <string name="puk_requested" msgid="2061337960609806851">"סיסמה שגויה. קוד האימות נעול כעת. יש להזין PUK."</string>
- <string name="enter_pin2_text" msgid="7266379426804295979">"קוד אימות 2"</string>
- <string name="oldPin2Label" msgid="4648543187859997203">"קוד אימות 2 ישן"</string>
- <string name="newPin2Label" msgid="1840905981784453939">"קוד אימות 2 חדש"</string>
- <string name="confirmPin2Label" msgid="4336025914667593762">"אישור קוד אימות 2 חדש"</string>
- <string name="badPuk2" msgid="6438182906645832235">"PUK2 שגוי. יש לנסות שוב."</string>
- <string name="badPin2" msgid="2760917538643074635">"קוד אימות 2 הישן שגוי. יש לנסות שוב."</string>
- <string name="mismatchPin2" msgid="4952718725266700631">"קודי אימות 2 לא תואמים. יש לנסות שוב."</string>
- <string name="invalidPin2" msgid="6467957903056379343">"יש להזין קוד אימות 2 שאורכו בין 4 ל-8 ספרות."</string>
- <string name="invalidPuk2" msgid="713729511903849544">"יש להזין PUK2 שאורכו 8 ספרות."</string>
- <string name="pin2_changed" msgid="5710551850481287821">"קוד אימות 2 עודכן"</string>
- <string name="label_puk2_code" msgid="2852217004288085562">"הזנת קוד PUK2"</string>
- <string name="fdn_enable_puk2_requested" msgid="5793652792131588041">"סיסמה שגויה. קוד אימות 2 חסום כעת. כדי לנסות שוב, יש לשנות את PIN 2."</string>
- <string name="puk2_requested" msgid="6992374450720307514">"סיסמה שגויה. ה-SIM נעול כעת. יש להזין PUK2."</string>
+ <string name="enable_sim_pin" msgid="445461050748318980">"הגדרת PIN עבור SIM"</string>
+ <string name="enable_in_progress" msgid="4135305985717272592">"מגדיר PIN…"</string>
+ <string name="enable_pin_ok" msgid="2877428038280804256">"PIN הוגדר"</string>
+ <string name="disable_pin_ok" msgid="888505244389647754">"ה-PIN נוקה"</string>
+ <string name="pin_failed" msgid="4527347792881939652">"PIN2 שגוי"</string>
+ <string name="pin_changed" msgid="7291153750090452808">"PIN עודכן"</string>
+ <string name="puk_requested" msgid="2061337960609806851">"סיסמה שגויה. PIN נעול כעת. יש להזין PUK."</string>
+ <string name="enter_pin2_text" msgid="7266379426804295979">"PIN2"</string>
+ <string name="oldPin2Label" msgid="4648543187859997203">"PIN2 ישן"</string>
+ <string name="newPin2Label" msgid="1840905981784453939">"PIN2 חדש"</string>
+ <string name="confirmPin2Label" msgid="4336025914667593762">"אשר PIN2 חדש"</string>
+ <string name="badPuk2" msgid="6438182906645832235">"PUK2 שגוי. נסה שוב."</string>
+ <string name="badPin2" msgid="2760917538643074635">"PIN2 הישן שגוי. נסה שוב."</string>
+ <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="label_puk2_code" msgid="2852217004288085562">"הזן קוד PUK2"</string>
+ <string name="fdn_enable_puk2_requested" msgid="5793652792131588041">"סיסמה שגויה. PIN2 חסום כעת. כדי לנסות שוב, יש לשנות את PIN 2."</string>
+ <string name="puk2_requested" msgid="6992374450720307514">"סיסמה שגויה. ה-SIM נעול כעת. הזן PUK2."</string>
<string name="puk2_blocked" msgid="3131139031779319911">"PUK2 נחסם לצמיתות."</string>
<string name="pin2_attempts" msgid="5625178102026453023">\n"נותרו לך עוד <xliff:g id="NUMBER">%d</xliff:g> ניסיונות."</string>
<string name="puk2_locked" msgid="6497760825455461057">"נעילת PUK2. כדי לבטל את הנעילה, צריך לפנות לספק השירות."</string>
- <string name="pin2_unblocked" msgid="4481107908727789303">"קוד אימות 2 אינו חסום עוד"</string>
+ <string name="pin2_unblocked" msgid="4481107908727789303">"PIN2 אינו חסום עוד"</string>
<string name="pin2_error_exception" msgid="8116103864600823641">"שגיאת רשת או כרטיס SIM"</string>
<string name="doneButton" msgid="7371209609238460207">"סיום"</string>
<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_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_call_ended" msgid="650223980095026340">"השיחה הסתיימה"</string>
<string name="card_title_on_hold" msgid="9028319436626975207">"בהמתנה"</string>
- <string name="card_title_hanging_up" msgid="814874106866647871">"הניתוק מתבצע"</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_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>
<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_thermal" product="default" msgid="8695809601655300168"><b>"הטמפרטורה של הטלפון גבוהה מדי"</b>\n\n"אי אפשר להשלים את השיחה. אפשר לנסות שוב כשהטלפון יתקרר.\n\nבינתיים אפשר להתקשר רק למספרי חירום"</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>
<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_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>
@@ -554,8 +553,8 @@
<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_wfc_only_no_wireless_network" msgid="5860742792811400109">"יש להתחבר לרשת אלחוטית כדי לבצע שיחה."</string>
- <string name="incall_error_promote_wfc" msgid="9164896813931363415">"יש להפעיל את \'שיחות Wi-Fi\' כדי להתקשר."</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_owner_hint" msgid="6256909888049185316">"בעלים"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"אפשר להקיש שוב כדי להציג את הפרטים"</string>
@@ -563,19 +562,19 @@
<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="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_empty_error" msgid="2785803395047793634">"לא ניתן להתקשר. חייג למספר חירום."</string>
<string name="dial_emergency_calling_not_available" msgid="6485846193794727823">"אי אפשר לבצע שיחות חירום"</string>
<string name="pin_puk_system_user_only" msgid="1045147220686867922">"רק הבעלים של המכשיר יכול להזין קודי אימות/PUK."</string>
<string name="police_type_description" msgid="2819533883972081757">"משטרה"</string>
<string name="ambulance_type_description" msgid="6798237503553180461">"אמבולנס"</string>
<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="dialerKeyboardHintText" msgid="1115266533703764049">"השתמש במקלדת כדי לחייג"</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>
@@ -586,10 +585,10 @@
<string name="onscreenManageConferenceText" msgid="4700574060601755137">"ניהול שיחת ועידה"</string>
<string name="onscreenAudioText" msgid="7224226735052019986">"אודיו"</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>
- <string name="importToFDNfromContacts" msgid="5068664870738407341">"ייבוא מאנשי קשר"</string>
+ <string name="importSimEntry" msgid="3892354284082689894">"ייבא"</string>
+ <string name="importAllSimEntries" msgid="2628391505643564007">"ייבא הכל"</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>
<string name="hac_mode_title" msgid="4127986689621125468">"מכשירי שמיעה"</string>
@@ -605,16 +604,16 @@
<item msgid="2131559553795606483">"TTY VCO"</item>
</string-array>
<string name="dtmf_tones_title" msgid="7874845461117175236">"צלילי DTMF"</string>
- <string name="dtmf_tones_summary" msgid="2294822239899471201">"הגדרת האורך של צלילי DTMF"</string>
+ <string name="dtmf_tones_summary" msgid="2294822239899471201">"הגדר את האורך של צלילי DTMF"</string>
<string-array name="dtmf_tone_entries">
<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="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_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>
@@ -622,26 +621,26 @@
<string name="ota_activate" msgid="7939695753665438357">"הפעלה"</string>
<string name="ota_title_activate_success" msgid="1272135024761004889">"הטלפון מופעל."</string>
<string name="ota_title_problem_with_activation" msgid="7019745985413368726">"בעיה בהפעלה"</string>
- <string name="ota_listen" msgid="2772252405488894280">"יש לבצע את ההוראות הנאמרות עד ששומעים שההפעלה הושלמה."</string>
+ <string name="ota_listen" msgid="2772252405488894280">"בצע את ההוראות הנאמרות עד שתשמע שההפעלה הושלמה."</string>
<string name="ota_speaker" msgid="1086766980329820528">"רמקול"</string>
- <string name="ota_progress" msgid="8837259285255700132">"התכנות של הטלפון שלך מתבצע…"</string>
+ <string name="ota_progress" msgid="8837259285255700132">"מתכנת את הטלפון שלך…"</string>
<string name="ota_failure" msgid="5674217489921481576">"לא ניתן היה לתכנת את הטלפון שלך"</string>
- <string name="ota_successful" msgid="1106825981548107774">"הטלפון שלך מופעל כעת. ייתכן שיהיה צורך להמתין עד 15 דקות להפעלת השירות."</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>
<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_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="two">הטלפון יהיה במצב חירום של התקשרות חזרה למשך <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="two">הטלפון יהיה במצב חירום של התקשרות חזרה למשך <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>
<plurals name="alert_dialog_not_avaialble_in_ecm" formatted="false" msgid="1152682528741457004">
<item quantity="two">הפעולה הנבחרת אינה זמינה במצב חירום של התקשרות חזרה. הטלפון יהיה במצב זה למשך <xliff:g id="COUNT_1">%s</xliff:g> דקות. האם ברצונך לצאת כעת?</item>
@@ -653,7 +652,7 @@
<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="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">
@@ -668,10 +667,10 @@
<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="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_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>
@@ -679,10 +678,10 @@
<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_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="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>
@@ -693,7 +692,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,12 +702,12 @@
<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_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_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="MAX">%2$d</xliff:g>-<xliff:g id="MIN">%1$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_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_system_error" msgid="7772788809875146873">"לא ניתן להגדיר את קוד הגישה"</string>
<string name="mobile_data_status_roaming_turned_off_subtext" msgid="6840673347416227054">"חבילת הגלישה בנדידה הושבתה"</string>
@@ -907,7 +906,7 @@
<string name="radio_info_data_network_type_label" msgid="8886597029237501929">"סוג רשת נתונים:"</string>
<string name="phone_index_label" msgid="6222406512768964268">"בחירת אינדקס טלפון"</string>
<string name="radio_info_set_perferred_label" msgid="7408131389363136210">"הגדרת סוג רשת מועדף:"</string>
- <string name="radio_info_ping_hostname_v4" msgid="6951237885381284790">"נדנוד לשם המארח (www.google.com) מסוג IPv4:"</string>
+ <string name="radio_info_ping_hostname_v4" msgid="6951237885381284790">"נדנד לשם המארח (www.google.com) מסוג IPv4:"</string>
<string name="radio_info_ping_hostname_v6" msgid="2748637889486554603">"נדנוד לשם המארח (www.google.com) מסוג IPv6:"</string>
<string name="radio_info_http_client_test" msgid="1329583721088428238">"בדיקת לקוח HTTP:"</string>
<string name="ping_test_label" msgid="448617502935719694">"הפעלת בדיקת פינג"</string>
@@ -921,11 +920,12 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"הגדרת החלוקה לפרוסות ברשת:"</string>
<string name="band_mode_title" msgid="7988822920724576842">"הגדרת מצב תדרים של רדיו"</string>
- <string name="band_mode_loading" msgid="795923726636735967">"הטעינה של רשימת התדרים מתבצעת…"</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>
+ <string name="band_mode_succeeded" msgid="2230018000534761063">"עבר בהצלחה"</string>
<string name="phone_info_label" product="tablet" msgid="7477478709388477397">"פרטי טאבלט"</string>
<string name="phone_info_label" product="default" msgid="1784175881556791433">"פרטי טלפון"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"פרטי ניהול תצורה של ספק סלולרי"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 6d65ce7..c304b74 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -75,7 +75,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>
@@ -490,7 +490,7 @@
<string name="newPinLabel" msgid="3585899083055354732">"新しいPIN"</string>
<string name="confirmPinLabel" msgid="7783531218662473778">"新しいPINを確認"</string>
<string name="badPin" msgid="4549286285015892321">"入力した古いPINは正しくありません。入力し直してください。"</string>
- <string name="mismatchPin" msgid="1467254768290323845">"入力した PIN が一致しません。入力し直してください。"</string>
+ <string name="mismatchPin" msgid="1467254768290323845">"入力したPINは一致しません。入力し直してください。"</string>
<string name="invalidPin" msgid="7363723429414001979">"4~8桁の数字のPINを入力してください。"</string>
<string name="disable_sim_pin" msgid="3112303905548613752">"SIM PINの消去"</string>
<string name="enable_sim_pin" msgid="445461050748318980">"SIM PINの設定"</string>
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"通話を発信するには、モバイル ネットワークを ON にし、機内モードまたはバッテリー セーバー モードを OFF にしてください。"</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_thermal" product="default" msgid="8695809601655300168"><b>"スマートフォンが熱くなりすぎています"</b>\n\n"この通話を完了できません。スマートフォンの熱が冷めてから、もう一度お試しください。\n\n緊急通報は通常どおり発信できます。"</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>
@@ -682,7 +681,7 @@
<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">"Wi-Fi 通話の着信"</string>
- <string name="status_hint_label_wifi_call" msgid="942993035689809853">"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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 dfd6c9a..2b6a1f6 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ტელეფონი ძალიან ცხელია"</b>\n\n"ამ ზარის დასრულება შეუძლებელია. სცადეთ ხელახლა, როდესაც ტელეფონი გაგრილდება.\n\nგადაუდებელი ზარების განხორციელება მაინც შეგიძლიათ."</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 c5542b1..d488dcd 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"Телефон қызып кетті"</b>\n\n"Қоңырауды аяқтау мүмкін емес. Телефон суығаннан кейін, әрекетті қайталап көріңіз.\n\nҚұтқару қызметіне қоңырау шалу бұрынғыша мүмкін болады."</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 fb246f9..c280faa 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ទូរសព្ទក្ដៅពេក"</b>\n\n"មិនអាចធ្វើការហៅទូរសព្ទនេះបានទេ។ សូមព្យាយាមម្ដងទៀត នៅពេលទូរសព្ទរបស់អ្នកចុះត្រជាក់។\n\nអ្នកនៅតែអាចធ្វើការហៅទៅលេខសង្គ្រោះបន្ទាន់បាន។"</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"ការកំណត់រចនាសម្ព័ន្ធការបែងចែកបណ្ដាញ៖"</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 44cca2b..ced50c5 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -61,7 +61,7 @@
<string name="labelGsmMore_with_label" msgid="3206015314393246224">"GSM ಕರೆ ಸೆಟ್ಟಿಂಗ್ಗಳು (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCDMAMore" msgid="7937441382611224632">"CDMA ಕರೆ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<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="apn_settings" msgid="1978652203074756623">"ಪ್ರವೇಶಿಸುವಿಕೆ ಕೇಂದ್ರದ ಹೆಸರುಗಳು"</string>
<string name="settings_label" msgid="9101778088412567956">"ನೆಟ್ವರ್ಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="phone_accounts" msgid="1216879437523774604">"ಕರೆ ಮಾಡುವ ಖಾತೆಗಳು"</string>
<string name="phone_accounts_make_calls_with" msgid="16747814788918145">"ಇದರೊಂದಿಗೆ ಕರೆಗಳನ್ನು ಮಾಡಿ"</string>
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ಫೋನ್ ತುಂಬಾ ಬಿಸಿಯಾಗಿದೆ"</b>\n\n"ಈ ಕರೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಫೋನ್ ತಣ್ಣಗಾದ ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.\n\nನೀವು ಈಗಲೂ ತುರ್ತು ಕರೆಗಳನ್ನು ಮಾಡಬಹುದು."</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 52ad67b..541dc23 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"휴대전화의 온도가 너무 높습니다."</b>\n\n"현재 전화를 걸 수 없습니다. 휴대전화의 온도가 내려가면 다시 시도해 보세요.\n\n긴급 전화 기능은 계속해서 사용할 수 있습니다."</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 c4ea6fa..5d533a6 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"Телефон ысып кетти"</b>\n\n"Бул чалуу аяктабай жатат. Телефон муздагандан кийин кайра аракет кылыңыз.\n\nШашылыш чалууларды аткара берсеңиз болот."</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 a7b1640..d09086d 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ໂທລະສັບຮ້ອນເກີນໄປ"</b>\n\n"ບໍ່ສາມາດເຮັດການໂທນີ້ໄດ້. ກະລຸນາລອງອີກຄັ້ງເມື່ອໂທລະສັບຂອງທ່ານເຢັນລົງ.\n\nທ່ານຍັງສາມາດໂທສຸກເສີນໄດ້."</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"ການກຳນົດການແບ່ງສ່ວນເຄືອຂ່າຍ:"</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 44e358f..c0b663b 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Įjunkite mobiliojo ryšio tinklą, išjunkite lėktuvo arba akumuliatoriaus tausojimo priemonės režimą, kad galėtumėte skambinti."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Išjunkite lėktuvo režimą, kad galėtumėte skambinti."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Išjunkite lėktuvo režimą arba prisijunkite prie belaidžio ryšio tinklo, kad galėtumėte skambinti."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefonas per karštas"</b>\n\n"Negalima užbaigti šio skambučio. Bandykite dar kartą, kai telefonas atvės.\n\nJūs vis dar galite skambinti pagalbos numeriais."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Jei norite skambinti ne pagalbos numeriu, išjunkite atgalinio skambinimo pagalbos numeriu režimą."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Neregistruota tinkle."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilusis tinklas negalimas."</string>
@@ -921,6 +920,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 5fe13bb..2d710a7 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -537,7 +537,6 @@
<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="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_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Tālrunis ir pārkarsis"</b>\n\n"Nevar veikt šo zvanu. Kad tālrunis būs atdzisis, mēģiniet vēlreiz.\n\nJoprojām varat veikt ārkārtas izsaukumus."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Lai veiktu parastu zvanu, izejiet no ārkārtas atzvana režīma."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Tīklā nav reģistrēts."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilais tīkls nav pieejams."</string>
@@ -918,6 +917,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 b8f98df..7f72fa5 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"Телефонот е премногу загреан"</b>\n\n"Повиков не може да се заврши. Обидете се повторно кога ќе се подизлади телефонот.\n\nСѐ уште може да воспоставувате итни повици."</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>
@@ -615,9 +614,9 @@
<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_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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 8572393..4703be3 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ഫോൺ വളരെയധികം ചൂടായിരിക്കുന്നു"</b>\n\n"ഈ കോൾ പൂർത്തിയാക്കാനാകില്ല. ഫോൺ തണുക്കുമ്പോൾ വീണ്ടും ശ്രമിക്കുക.\n\nഎമർജൻസി കോളുകൾ നിങ്ങൾക്ക് ഇപ്പോഴും ചെയ്യാവുന്നതാണ്."</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>
@@ -878,8 +877,8 @@
<string name="radioInfo_cid" msgid="1423185536264406705">"CID"</string>
<string name="radio_info_subid" msgid="6839966868621703203">"നിലവിലെ ഉപഐഡി:"</string>
<string name="radio_info_dds" msgid="1122593144425697126">"ഡിഫോൾട്ട് ഡാറ്റാ സിമ്മിന്റെ ഉപഐഡി:"</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_dl_kbps" msgid="2382922659525318726">"DL ബാൻഡ്വിത്ത് (kbps):"</string>
+ <string name="radio_info_ul_kbps" msgid="2102225400904799036">"UL ബാൻഡ്വിത്ത് (kbps):"</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 48ac8c0..783c821 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/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 сүлжээ тайлах ПИН"</string>
+ <string name="label_ndp" msgid="7617392683877410341">"SIM сүлжээ тайлах PIN"</string>
<string name="label_phoneid" msgid="8775611434123577808">"Операторын SIM түгжигдсэн"</string>
<string name="sim_ndp_unlock_text" msgid="7737338355451978338">"Тайлах"</string>
<string name="sim_ndp_dismiss_text" msgid="89667342248929777">"Алгасах"</string>
@@ -162,15 +162,15 @@
<string name="no_change" msgid="3737264882821031892">"Ямар ч өөрчлөлт хийгдсэнгүй."</string>
<string name="sum_voicemail_choose_provider" msgid="6750824719081403773">"Дуут шуудангийн үйлчилгээг сонгох"</string>
<string name="voicemail_default" msgid="6427575113775462077">"Таны оператор компани"</string>
- <string name="vm_change_pin_old_pin" msgid="7154951790929009241">"Хуучин ПИН"</string>
- <string name="vm_change_pin_new_pin" msgid="2656200418481288069">"Шинэ ПИН"</string>
+ <string name="vm_change_pin_old_pin" msgid="7154951790929009241">"Хуучин PIN"</string>
+ <string name="vm_change_pin_new_pin" msgid="2656200418481288069">"Шинэ PIN"</string>
<string name="vm_change_pin_progress_message" msgid="626015184502739044">"Түр хүлээнэ үү."</string>
- <string name="vm_change_pin_error_too_short" msgid="1789139338449945483">"Шинэ ПИН хэт богино байна."</string>
- <string name="vm_change_pin_error_too_long" msgid="3634907034310018954">"Шинэ ПИН хэт урт байна."</string>
- <string name="vm_change_pin_error_too_weak" msgid="8581892952627885719">"Шинэ ПИН хэт амархан байна. Сайн нууц үгэнд үргэлжилсэн дараалал буюу давтагдсан цифр ордоггүй."</string>
- <string name="vm_change_pin_error_mismatch" msgid="5364847280026257331">"Хуучин ПИН таарахгүй байна."</string>
- <string name="vm_change_pin_error_invalid" msgid="5230002671175580674">"Шинэ ПИН-д буруу тэмдэгт агуулагдаж байна."</string>
- <string name="vm_change_pin_error_system_error" msgid="9116483527909681791">"ПИН-г өөрчлөх боломжгүй"</string>
+ <string name="vm_change_pin_error_too_short" msgid="1789139338449945483">"Шинэ PIN хэт богино байна."</string>
+ <string name="vm_change_pin_error_too_long" msgid="3634907034310018954">"Шинэ PIN хэт урт байна."</string>
+ <string name="vm_change_pin_error_too_weak" msgid="8581892952627885719">"Шинэ PIN хэт амархан байна. Сайн нууц үгэнд үргэлжилсэн дараалал буюу давтагдсан цифр ордоггүй."</string>
+ <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="network_settings_title" msgid="7560807107123171541">"Мобайл сүлжээ"</string>
<string name="label_available" msgid="1316084116670821258">"Боломжтой сүлжээнүүд"</string>
@@ -449,7 +449,7 @@
<string name="enable_fdn_ok" msgid="5080925177369329827">"FDN идэвхгүйжүүлэх"</string>
<string name="disable_fdn_ok" msgid="3745475926874838676">"FDN-г идэвхжүүлэх"</string>
<string name="sum_fdn" msgid="6152246141642323582">"Тогтсон залгах дугааруудыг удирдах"</string>
- <string name="sum_fdn_change_pin" msgid="3510994280557335727">"FDN хандалтын ПИН-г өөрчлөх"</string>
+ <string name="sum_fdn_change_pin" msgid="3510994280557335727">"FDN хандалтын PIN-г өөрчлөх"</string>
<string name="sum_fdn_manage_list" msgid="3311397063233992907">"Утасны дугаарын жагсаалтыг удирдах"</string>
<string name="voice_privacy" msgid="7346935172372181951">"Дууны нууцлал"</string>
<string name="voice_privacy_summary" msgid="3556460926168473346">"Сайжруулсан нууцлалын төлвийг идэвхжүүлэх"</string>
@@ -475,7 +475,7 @@
<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="pin2_invalid" msgid="2313954262684494442">"Та буруу PIN оруулсан учир FDN шинэчлэгдсэнгүй."</string>
<string name="fdn_invalid_number" msgid="9067189814657840439">"Дугаар <xliff:g id="FDN_NUMBER_LIMIT_LENGTH">%d</xliff:g> цифрээс хэтэрсэн тул FDN-г шинэчлээгүй."</string>
<string name="pin2_or_fdn_invalid" msgid="7542639487955868181">"FDN шинэчлэгдсэнгүй. PIN2 буруу байсан, эсхүл утасны дугаар зөвшөөрөгдсөнгүй."</string>
<string name="fdn_failed" msgid="216592346853420250">"ФДН ажиллуулах амжилтгүй."</string>
@@ -483,23 +483,23 @@
<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="enable_pin" msgid="967674051730845376">"SIM ПИН Идэвхжүүлэх/идэвхгүйжүүлэх"</string>
- <string name="change_pin" msgid="3657869530942905790">"SIM ПИН өөрчлөх"</string>
- <string name="enter_pin_text" msgid="3182311451978663356">"SIM ПИН:"</string>
- <string name="oldPinLabel" msgid="8618515202411987721">"Хуучин ПИН"</string>
- <string name="newPinLabel" msgid="3585899083055354732">"Шинэ ПИН"</string>
- <string name="confirmPinLabel" msgid="7783531218662473778">"Шинэ ПИН-г баталгаажуулах"</string>
- <string name="badPin" msgid="4549286285015892321">"Таны оруулсан хуучин ПИН буруу байна. Дахин оролдоно уу."</string>
- <string name="mismatchPin" msgid="1467254768290323845">"Таны оруулсан ПИН таарахгүй байна. Дахин оролдоно уу."</string>
- <string name="invalidPin" msgid="7363723429414001979">"4-с 8 цифртэй ПИН оруулна уу"</string>
- <string name="disable_sim_pin" msgid="3112303905548613752">"SIM-ний ПИН-г цэвэрлэх"</string>
+ <string name="enable_pin" msgid="967674051730845376">"SIM PIN Идэвхжүүлэх/идэвхгүйжүүлэх"</string>
+ <string name="change_pin" msgid="3657869530942905790">"SIM PIN өөрчлөх"</string>
+ <string name="enter_pin_text" msgid="3182311451978663356">"SIM PIN:"</string>
+ <string name="oldPinLabel" msgid="8618515202411987721">"Хуучин PIN"</string>
+ <string name="newPinLabel" msgid="3585899083055354732">"Шинэ PIN"</string>
+ <string name="confirmPinLabel" msgid="7783531218662473778">"Шинэ PIN-г баталгаажуулах"</string>
+ <string name="badPin" msgid="4549286285015892321">"Таны оруулсан хуучин PIN буруу байна. Дахин оролдоно уу."</string>
+ <string name="mismatchPin" msgid="1467254768290323845">"Таны оруулсан PIN таарахгүй байна. Дахин оролдоно уу."</string>
+ <string name="invalidPin" msgid="7363723429414001979">"4-с 8 цифртэй PIN оруулна уу"</string>
+ <string name="disable_sim_pin" msgid="3112303905548613752">"SIM-ний PIN-г цэвэрлэх"</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="disable_pin_ok" msgid="888505244389647754">"ПИН цэвэрлэгдсэн"</string>
- <string name="pin_failed" msgid="4527347792881939652">"ПИН буруу байна"</string>
- <string name="pin_changed" msgid="7291153750090452808">"ПИН шинэчлэгдсэн"</string>
- <string name="puk_requested" msgid="2061337960609806851">"Нууц үг буруу байна. ПИН код одоо түгжигдсэн. PUK кодыг авах хүсэлт тавигдсан."</string>
+ <string name="enable_pin_ok" msgid="2877428038280804256">"PIN-г тохирууллаа"</string>
+ <string name="disable_pin_ok" msgid="888505244389647754">"PIN цэвэрлэгдсэн"</string>
+ <string name="pin_failed" msgid="4527347792881939652">"PIN буруу байна"</string>
+ <string name="pin_changed" msgid="7291153750090452808">"PIN шинэчлэгдсэн"</string>
+ <string name="puk_requested" msgid="2061337960609806851">"Нууц үг буруу байна. PIN код одоо түгжигдсэн. PUK кодыг авах хүсэлт тавигдсан."</string>
<string name="enter_pin2_text" msgid="7266379426804295979">"PIN2"</string>
<string name="oldPin2Label" msgid="4648543187859997203">"Хуучин PIN2"</string>
<string name="newPin2Label" msgid="1840905981784453939">"Шинэ PIN2"</string>
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"Утас хэт халуун байна"</b>\n\n"Энэ дуудлагыг гүйцээх боломжгүй. Та утсаа хөрсөн үед дахин оролдоно уу.\n\nТа яаралтай дуудлага хийх боломжтой хэвээр байна."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Яаралтай түргэн тусламжийн бус дуудлага хийхийн тулд яаралтай түргэн тусламжийн callback горимоос гарна уу."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Сүлжээнд бүртгэгдээгүй."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Мобайль сүлжээ байхгүй."</string>
@@ -669,8 +668,8 @@
<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_set_pin_dialog_title" msgid="7005128605986960003">"ПИН тохируулах"</string>
- <string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"ПИН өөрчлөх"</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>
<string name="pstn_connection_service_label" msgid="9200102709997537069">"Суурилагдсан SIM карт"</string>
<string name="enable_video_calling_title" msgid="7246600931634161830">"Видео дуудлагыг идэвхжүүлэх"</string>
@@ -693,18 +692,18 @@
<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>
+ <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>
<string name="change_pin_ok_label" msgid="6861082678817785330">"OK"</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_system_error" msgid="7772788809875146873">"ПИН тохируулах боломжгүй"</string>
+ <string name="change_pin_enter_old_pin_header" msgid="853151335217594829">"Хуучин PIN-ээ баталгаажуулна уу"</string>
+ <string name="change_pin_enter_old_pin_hint" msgid="8801292976275169367">"Үргэлжлүүлэхийн тулд дуут шуудангийн PIN оруулна уу."</string>
+ <string name="change_pin_enter_new_pin_header" msgid="4739465616733486118">"Шинэ PIN тохируулах"</string>
+ <string name="change_pin_enter_new_pin_hint" msgid="2326038476516364210">"PIN <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">"PIN кодоо баталгаажуулна уу"</string>
+ <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_without_plan_subtext" msgid="6536671968072284677">"Одоо роумингтэй байна, дата багц шаардлагатай"</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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-mr/strings.xml b/res/values-mr/strings.xml
index 78ea7eb..1c32881 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -523,7 +523,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>
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"फोन खूप गरम झाला आहे"</b>\n\n"हा कॉल पूर्ण करू शकत नाही. तुमचा फोन थंड झाल्यावर पुन्हा प्रयत्न करा.\n\nतुम्ही अजूनही आणीबाणी कॉल करू शकता."</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>
@@ -785,8 +784,8 @@
<string name="call_barring_baoicr_enabled" msgid="1615324165512798478">"जाणारे इंटरनॅशनल रोमिंग ब्लॉक करणे बंद करायचे का?"</string>
<string name="call_barring_baoicr_disabled" msgid="172010175248142831">"जाणारे इंटरनॅशनल रोमिंग ब्लॉक करायचे का?"</string>
<string name="call_barring_baic" msgid="7941393541678658566">"सर्व येणारे"</string>
- <string name="call_barring_baic_enabled" msgid="4357332358020337470">"सर्व इनकमिंग कॉल ब्लॉक करणे बंद करायचे का?"</string>
- <string name="call_barring_baic_disabled" msgid="2355945245938240958">"सर्व इनकमिंग कॉल ब्लॉक करायचे का?"</string>
+ <string name="call_barring_baic_enabled" msgid="4357332358020337470">"सर्व येणारे कॉल ब्लॉक करणे बंद करायचे का?"</string>
+ <string name="call_barring_baic_disabled" msgid="2355945245938240958">"सर्व येणारे कॉल ब्लॉक करायचे का?"</string>
<string name="call_barring_baicr" msgid="8712249337313034226">"येणारे इंटरनॅशनल रोमिंग"</string>
<string name="call_barring_baicr_enabled" msgid="64774270234828175">"सर्व येणारे इंटरनॅशनल रोमिंग ब्लॉक करणे बंद करायचे का?"</string>
<string name="call_barring_baicr_disabled" msgid="3488129262744027262">"येणारे इंटरनॅशनल रोमिंग ब्लॉक करायचे का?"</string>
@@ -811,7 +810,7 @@
<string name="supp_service_notification_call_waiting" msgid="4577403881609445324">"कॉल प्रतीक्षेत आहे."</string>
<string name="supp_service_clir_suppression_rejected" msgid="6105737020194776121">"क्रमांक ब्लॉक करणे रद्द केले."</string>
<string name="supp_service_closed_user_group_call" msgid="2811636666505250689">"बंद वापरकर्ता गट कॉल."</string>
- <string name="supp_service_incoming_calls_barred" msgid="2034627421274447674">"इनकमिंग कॉल अवरोधित केले."</string>
+ <string name="supp_service_incoming_calls_barred" msgid="2034627421274447674">"येणारे कॉल अवरोधित केले."</string>
<string name="supp_service_outgoing_calls_barred" msgid="5205725332394087112">"जाणारे कॉल अवरोधित केले."</string>
<string name="supp_service_call_forwarding_active" msgid="7910162960395132464">"कॉल फॉरवर्ड होत आहे."</string>
<string name="supp_service_additional_call_forwarded" msgid="8772753260008398632">"अतिरिक्त कॉल फॉरवर्ड केला."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 4ddb2e6..c58d6f6 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Hidupkan rangkaian mudah alih, matikan mod pesawat atau matikan mod penjimat bateri untuk membuat panggilan."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Matikan mod pesawat untuk membuat panggilan."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Matikan mod pesawat atau sambungkan ke rangkaian wayarles untuk membuat panggilan."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefon terlalu panas"</b>\n\n"Tidak dapat melengkapkan panggilan ini. Cuba lagi apabila telefon anda menyejuk.\n\nAnda masih boleh membuat panggilan kecemasan."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Keluar daripada mod panggil balik kecemasan untuk membuat panggilan bukan kecemasan."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Tidak didaftarkan pada rangkaian."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Rangkaian mudah alih tidak tersedia."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 f34f564..16dc582 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/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">"သင့် ဆင်းမ်ကဒ်အား ပိတ်ဆို့မှုကို ဖယ်ရှားပြီးပါပြီ။ သင့်ဖုန်းဟာ သော့ဖွင့်နေပါသည်…"</string>
- <string name="label_ndp" msgid="7617392683877410341">"ဆင်းမ်ကတ် ကွန်ရက် သော့ဖွင့်သော ပင်နံပါတ်"</string>
+ <string name="label_ndp" msgid="7617392683877410341">"ဆင်းမ်ကဒ် ကွန်ရက် သော့ဖွင့်သော ပင်နံပါတ်"</string>
<string name="label_phoneid" msgid="8775611434123577808">"အော်ပရေတာအတွက် ဆင်းမ်ကတ်ကို လော့ခ်ချထားသည်"</string>
<string name="sim_ndp_unlock_text" msgid="7737338355451978338">"ဖွင့်ရန်"</string>
<string name="sim_ndp_dismiss_text" msgid="89667342248929777">"ပယ်ရန်"</string>
@@ -186,9 +186,9 @@
<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>
- <string name="preferred_network_mode_title" msgid="5253395265169539830">"ဦးစားပေး ကွန်ရက်အမျိုးအစား"</string>
+ <string name="preferred_network_mode_title" msgid="5253395265169539830">"ပိုနှစ်သက်သော ကွန်ရက်အမျိုးအစား"</string>
<string name="preferred_network_mode_summary" msgid="3787989000044330064">"ကွန်ရက် လုပ်ဆောင်မှုစနစ်အား ပြောင်းပါ"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="2781447433514459696">"ဦးစားပေး ကွန်ရက်အမျိုးအစား"</string>
+ <string name="preferred_network_mode_dialogtitle" msgid="2781447433514459696">"ပိုနှစ်သက်သော ကွန်ရက်အမျိုးအစား"</string>
<string name="forbidden_network" msgid="5081729819561333023">"(တားမြစ်ထားသည်)"</string>
<string name="choose_network_title" msgid="5335832663422653082">"ကွန်ရက် ရွေးရန်"</string>
<string name="network_disconnected" msgid="8844141106841160825">"ချိတ်ဆက်မှုပြတ်နေပါသည်"</string>
@@ -301,7 +301,7 @@
<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="carrier_settings_euicc" msgid="1190237227261337749">"ဝန်ဆောင်မှုပေးသူ"</string>
- <string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"ဖုန်းကုမ္ပဏီ၊ esim၊ ဆင်းမ်ကတ်၊ euicc၊ ဖုန်းလိုင်းများ ပြောင်းရန်၊ ဖုန်းလိုင်း ထည့်ရန်"</string>
+ <string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"ဖုန်းကုမ္ပဏီ၊ esim၊ ဆင်းမ်ကဒ်၊ 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>
<string name="mobile_data_settings_title" msgid="7228249980933944101">"မိုဘိုင်းဒေတာ"</string>
<string name="mobile_data_settings_summary" msgid="5012570152029118471">"မိုဘိုင်းကွန်ရက်သုံးပြီး ဒေတာကို ဝင်သုံးခွင့်ပေးပါ"</string>
@@ -484,8 +484,8 @@
<string name="simContacts_title" msgid="2714029230160136647">"ထည့်ယူရန် လိပ်စာများ ရွေးပါ"</string>
<string name="simContacts_airplaneMode" msgid="4654884030631503808">"SIM ကဒ်မှ အဆက်အသွယ်များ သွင်းယူရန် လေယာဉ်ပျံမုဒ် ပိတ်ထားပါ။"</string>
<string name="enable_pin" msgid="967674051730845376">"ဆင်းမ် ပင်နံပါတ်ကို ပယ်ဖျက်၊ပြုလုပ်ရန်"</string>
- <string name="change_pin" msgid="3657869530942905790">"ဆင်းမ်ကတ် ပင်နံပါတ်ပြောင်းရန်"</string>
- <string name="enter_pin_text" msgid="3182311451978663356">"ဆင်းမ်ကတ် ပင်နံပါတ်:"</string>
+ <string name="change_pin" msgid="3657869530942905790">"ဆင်းမ်ကဒ် ပင်နံပါတ်ပြောင်းရန်"</string>
+ <string name="enter_pin_text" msgid="3182311451978663356">"ဆင်းမ်ကဒ် ပင်နံပါတ်:"</string>
<string name="oldPinLabel" msgid="8618515202411987721">"ပင်နံပါတ် အဟောင်း"</string>
<string name="newPinLabel" msgid="3585899083055354732">"ပင်နံပါတ် အသစ်"</string>
<string name="confirmPinLabel" msgid="7783531218662473778">"ပင်နံပါတ်အသစ်အား သေချာကြောင်း လက်ခံပါ"</string>
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ဖုန်းအလွန်ပူနေသည်"</b>\n\n"ဤဖုန်းကို ခေါ်ဆို၍မရပါ။ ဖုန်းအေးသွားသောအခါ ထပ်စမ်းကြည့်ပါ။\n\nအရေးပေါ်ဖုန်းခေါ်ခြင်းများ ပြုလုပ်နိုင်သေးသည်။"</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"ကွန်ရက်ခွဲခြားမှု စီစဉ်သတ်မှတ်ချက်-"</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 a16f582..efce396 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Slå på mobilnettverket, slå av flymodus eller slå av batterisparingsmodus for å ringe ut."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Slå av flymodus for å ringe."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Slå av flymodus eller koble til et trådløst nettverk for å ringe."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefonen er for varm"</b>\n\n"Kan ikke fullføre dette anropet. Prøv igjen når telefonen har kjølt seg ned.\n\nDu kan fortsatt foreta nødanrop."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Avslutt modusen for nødanrop for å gjøre et vanlig anrop."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Ikke registrert på nettverket."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilnettverket er ikke tilgjengelig."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 e6d6abc..7e0dac8 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -282,8 +282,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>
@@ -536,12 +536,11 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"फोन ज्यादै तातेको छ"</b>\n\n"यो कल जारी राख्न सकिँदैन। फोन सेलाएपछि फेरि प्रयास गर्नुहोस्।\n\nतपाईं अझै पनि आपत्कालीन कलहरू गर्न सक्नुहुन्छ।"</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>
- <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"मोबाइल नेटवर्क उपलब्ध छैन। कल गर्न तारविनाको नेटवर्कमा कनेक्ट गर्नुहोस्।"</string>
+ <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>
@@ -554,7 +553,7 @@
<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_wfc_only_no_wireless_network" msgid="5860742792811400109">"एक कल गर्न एक ताररहितको सञ्जालमा कनेक्ट गर्नुहोस्।"</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_owner_hint" msgid="6256909888049185316">"मालिक"</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 409cd32..c590abd 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Schakel het mobiele netwerk in, schakel de vliegtuigmodus uit of schakel Batterijbesparing uit om te bellen."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Schakel de vliegtuigmodus uit om te bellen."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Schakel de vliegtuigmodus uit of maak verbinding met een draadloos netwerk om te bellen."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefoon te heet"</b>\n\n"Kan dit gesprek niet tot stand brengen. Probeer het opnieuw als je telefoon is afgekoeld.\n\nJe kunt nog steeds noodoproepen plaatsen."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Sluit de modus voor noodoproepen af om een niet-noodoproep te plaatsen."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Niet geregistreerd op netwerk."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobiel netwerk niet beschikbaar."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 c1966cf..f3b5023 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ଫୋନଟି ବହୁତ ଗରମ ହୋଇଯାଇଛି"</b>\n\n"ଏହି କଲକୁ ସମ୍ପୂର୍ଣ୍ଣ କରାଯାଇପାରିବ ନାହିଁ। ଆପଣଙ୍କ ଫୋନ୍ ଥଣ୍ଡା ହେବା ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ। \n\nଆପଣ ଏବେ ବି ଜରୁରୀକାଳୀନ କଲ୍ କରିପାରିବେ।"</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 1ee792c..1305a0c 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਹੋ ਗਿਆ ਹੈ"</b>\n\n"ਇਸ ਕਾਲ ਨੂੰ ਪੂਰਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਫ਼ੋਨ ਦੇ ਠੰਡਾ ਹੋਣ ਜਾਣ \'ਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।\n\nਤੁਸੀਂ ਹਾਲੇ ਵੀ ਸੰਕਟਕਾਲੀਨ ਕਾਲਾਂ ਕਰ ਸਕਦੇ ਹੋ।"</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"ਨੈੱਟਵਰਕ ਸਲਾਈਸਿੰਗ ਸੰਰੂਪਣ:"</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 ceb9082..03358d9 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Aby zadzwonić, włącz sieć komórkową, wyłącz tryb samolotowy lub wyłącz tryb oszczędzania baterii."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Wyłącz tryb samolotowy, by zadzwonić."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Wyłącz tryb samolotowy lub połącz się z siecią bezprzewodową, by zadzwonić."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefon jest zbyt gorący"</b>\n\n"Nie można nawiązać tego połączenia. Spróbuj ponownie, gdy telefon się ochłodzi.\n\nNadal możesz wykonywać połączenia alarmowe."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Aby zadzwonić normalnie, wyjdź z trybu alarmowego połączenia zwrotnego."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Nie zarejestrowano w sieci"</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Sieć komórkowa jest niedostępna."</string>
@@ -921,6 +920,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 db0799d..3e92292 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Ative a rede móvel, desative o modo de avião ou desative o modo de poupança de bateria para fazer uma chamada."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Desative o modo de avião para fazer uma chamada."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Desative o modo de avião ou ligue-se a uma rede sem fios para fazer uma chamada."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"O telemóvel está demasiado quente"</b>\n\n"Não é possível concluir esta chamada. Tente novamente depois de o telemóvel arrefecer.\n\nAinda pode efetuar chamadas de emergência."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Sair do modo de chamada de retorno de emergência para efetuar uma chamada que não é de emergência."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Sem registo na rede."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Rede móvel não disponível."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 c2421cf..40eaf23 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Ative a rede móvel e desative o modo avião ou o modo de economia de bateria para ligar."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Desative o modo avião para fazer uma chamada."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Desative o modo avião ou conecte-se a uma rede sem fio para fazer uma chamada."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"O smartphone está muito quente"</b>\n\n"Não é possível completar esta chamada. Tente de novo quando seu smartphone esfriar.\n\nVocê ainda pode fazer chamadas de emergência."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Saia do modo de retorno de chamada de emergência para fazer uma chamada que não seja de emergência."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Não registrado na rede."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Rede móvel não disponível."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 326cc52..4fc807d 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Activați rețeaua mobilă, dezactivați modul avion sau modul de economisire a bateriei pentru a iniția un apel."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Pentru a apela, dezactivați modul Avion."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Pentru a apela, dezactivați modul Avion sau conectați-vă la o rețea wireless."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefonul este prea fierbinte"</b>\n\n"Nu se poate iniția apelul. Încercați din nou după ce telefonul se răcește.\n\nPuteți, totuși, să inițiați apeluri de urgență."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Ieșiți din modul de apelare inversă de urgență pentru a efectua un apel care nu este de urgență."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Neînregistrat în rețea."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Rețeaua mobilă nu este disponibilă."</string>
@@ -918,6 +917,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Configurația secționării rețelei:"</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 4a6ee96..cdbbf6a 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -303,7 +303,7 @@
<string name="carrier_settings_euicc" msgid="1190237227261337749">"Оператор"</string>
<string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"оператор, esim, sim, 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>
- <string name="mobile_data_settings_title" msgid="7228249980933944101">"Мобильный интернет"</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="sim_selection_required_pref" msgid="6985901872978341314">"Выберите SIM-карту"</string>
@@ -537,7 +537,6 @@
<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">"Чтобы позвонить, отключите режим полета и подключитесь к Wi-Fi."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Телефон перегрелся."</b>\n\n"Не удалось совершить звонок. Повторите попытку, когда телефон остынет.\n\nЭто не касается экстренных вызовов."</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>
@@ -921,6 +920,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Настройки фрагментирования сети:"</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 7efc245..0af60b6 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"දුරකථනය ඉතා උණුසුම් ය"</b>\n\n"මෙම ඇමතුම සම්පූර්ණ කළ නොහැක. ඔබේ දුරකථනය සිසිල් වන විට නැවත උත්සාහ කරන්න.\n\nඔබට තවමත් හදිසි ඇමතුම් ලබා ගත හැක."</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 7f9bc94..6a8a304 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Ak chcete volať, zapnite mobilnú sieť a vypnite režim v lietadle alebo režim šetriča batérie."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Ak chcete volať, vypnite režim v lietadle"</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Ak chcete volať, vypnite režim v lietadle alebo sa pripojte k bezdrôtovej sieti"</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefón sa príliš zahrial"</b>\n\n"Tento hovor sa nedá uskutočniť. Skúste to znova, keď telefón vychladne.\n\nTiesňové volania môžete uskutočňovať aj naďalej."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Ak chcete volať štandardným spôsobom, ukončite režim tiesňového spätného volania."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Prihlásenie do siete nebolo úspešné."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilná sieť nie je k dispozícii."</string>
@@ -921,6 +920,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 5feb01d..8f0a397 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Vklopite mobilno omrežje, izklopite način za letalo ali način za varčevanje z energijo akumulatorja, če želite opraviti klic."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Izklopite način za letalo, če želite opraviti klic."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Izklopite način za letalo ali se povežite v omrežje Wi-Fi, če želite opraviti klic."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefon je prevroč"</b>\n\n"Tega klica ni mogoče dokončati. Poskusite znova, ko se telefon ohladi.\n\nŠe vedno lahko opravljate klice v sili."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Če ne gre za klic v sili, zaprite način za povratni klici v sili."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Ni registrirano v omrežju."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Omrežje prenosnega telefona ni na voljo."</string>
@@ -921,6 +920,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Konfiguracija razkosanja omrežja:"</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 8ea15ab..483bf92 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Aktivizo rrjetin celular, çaktivizo modalitetin e aeroplanit ose modalitetin e kursyesit të baterisë për të bërë një telefonatë."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Çaktivizo modalitetin e aeroplanit për të bërë telefonata."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Çaktivizo modalitetin e aeroplanit ose lidhu me ndonjë rrjet interneti valor për të bërë telefonata."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefoni është shumë i nxehtë"</b>\n\n"Kjo telefonatë nuk mund të kryhet. Provo përsëri kur të ftohet telefoni.\n\nMund të bësh përsëri telefonata të urgjencës."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Dil nga modaliteti i kthimit të telefonatës së urgjencës për të bërë një telefonatë jo urgjente."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"I paregjistruar në rrjet."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Rrjeti celular nuk mundësohet."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 43633a7..905f491 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"Телефон је превише врућ"</b>\n\n"Позив не може да се заврши. Пробајте поново када се телефон охлади.\n\nИ даље можете да упућујете хитне позиве."</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>
@@ -918,6 +917,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 4c0570d..0d4af3f 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -75,7 +75,7 @@
<string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"Konfigurera kontoinställningar"</string>
<string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"Alla konton för samtal"</string>
<string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"Välj vilka konton som kan ringa samtal"</string>
- <string name="wifi_calling" msgid="3650509202851355742">"wifi-samtal"</string>
+ <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi-samtal"</string>
<string name="connection_service_default_label" msgid="7332739049855715584">"Inbyggd anslutningstjänst"</string>
<string name="voicemail" msgid="7697769412804195032">"Röstbrevlåda"</string>
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"Röstbrevlåda (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -309,7 +309,7 @@
<string name="sim_selection_required_pref" msgid="6985901872978341314">"Du måste välja något"</string>
<string name="sim_change_data_title" msgid="9142726786345906606">"Vill du ändra data-SIM?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"Vill du använda <xliff:g id="NEW_SIM">%1$s</xliff:g> i stället för <xliff:g id="OLD_SIM">%2$s</xliff:g> för mobildata?"</string>
- <string name="wifi_calling_settings_title" msgid="5800018845662016507">"wifi-samtal"</string>
+ <string name="wifi_calling_settings_title" msgid="5800018845662016507">"Wi-Fi-samtal"</string>
<string name="video_calling_settings_title" msgid="342829454913266078">"Videosamtal via operatören"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"Alternativ för GSM/UMTS"</string>
<string name="cdma_options" msgid="3669592472226145665">"CDMA-alternativ"</string>
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Aktivera mobilt nätverk, stäng av flygplansläget eller batterisparläget för att ringa ett samtal."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Inaktivera flygplansläget om du vill ringa."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Inaktivera flygplansläget eller anslut till ett trådlöst nätverk om du vill ringa."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefonen för varm"</b>\n\n"Det går inte att genomföra samtalet. Försök igen när telefonen svalnar.\n\nDet går fortfarande att ringa nödsamtal."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Avsluta läget för återuppringning vid nödsamtal om du vill ringa ett vanligt samtal."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Inte registrerat på nätverk."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Inget mobilt nätverk är tillgängligt."</string>
@@ -555,7 +554,7 @@
<string name="incall_error_supp_service_hangup" msgid="836524952243836735">"Det gick inte att släppa samtal."</string>
<string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Det går inte att hålla kvar samtal."</string>
<string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Anslut till ett trådlöst nätverk om du vill ringa."</string>
- <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Aktivera wifi-samtal för att ringa."</string>
+ <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Aktivera Wi-Fi-samtal för att ringa."</string>
<string name="emergency_information_hint" msgid="9208897544917793012">"Nödinformation"</string>
<string name="emergency_information_owner_hint" msgid="6256909888049185316">"Ägare"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tryck igen för att visa information"</string>
@@ -617,7 +616,7 @@
<string name="ota_hfa_activation_title" msgid="3300556778212729671">"Aktiveras ..."</string>
<string name="ota_hfa_activation_dialog_message" msgid="7921718445773342996">"Din mobila datatjänst aktiveras av mobilen.\n\nDetta kan ta upp till fem minuter."</string>
<string name="ota_skip_activation_dialog_title" msgid="7666611236789203797">"Vill du hoppa över aktiveringen?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Om du hoppar över aktiveringen kan du inte ringa samtal eller ansluta till mobila datanätverk (men du kan ansluta till wifi-nätverk). Du kommer att påminnas om att aktivera telefonen varje gång du sätter på den, tills du har aktiverat den."</string>
+ <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Om du hoppar över aktiveringen kan du inte ringa samtal eller ansluta till mobila datanätverk (men du kan ansluta till Wi-Fi-nätverk). Du kommer att påminnas om att aktivera telefonen varje gång du sätter på den, tills du har aktiverat den."</string>
<string name="ota_skip_activation_dialog_skip_label" msgid="5908029466817825633">"Hoppa över"</string>
<string name="ota_activate" msgid="7939695753665438357">"Aktivera"</string>
<string name="ota_title_activate_success" msgid="1272135024761004889">"Telefonen är aktiverad."</string>
@@ -681,18 +680,18 @@
<string name="sim_description_emergency_calls" msgid="5146872803938897296">"Endast nödsamtal"</string>
<string name="sim_description_default" msgid="7474671114363724971">"SIM-kortsplats: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="7883415189273700298">"Tillgänglighet"</string>
- <string name="status_hint_label_incoming_wifi_call" msgid="2606052595898044071">"wifi-samtal från"</string>
- <string name="status_hint_label_wifi_call" msgid="942993035689809853">"wifi-samtal"</string>
+ <string name="status_hint_label_incoming_wifi_call" msgid="2606052595898044071">"Wi-Fi-samtal från"</string>
+ <string name="status_hint_label_wifi_call" msgid="942993035689809853">"Wi-Fi-samtal"</string>
<string name="emergency_action_launch_hint" msgid="2762016865340891314">"Tryck igen för att öppna"</string>
<string name="message_decode_error" msgid="1061856591500290887">"Ett fel inträffade när meddelandet avkodades."</string>
<string name="callFailed_cdma_activation" msgid="5392057031552253550">"Ett SIM-kort har använts för att aktivera tjänsten och uppdatera roamingfunktionerna i mobilen."</string>
<string name="callFailed_cdma_call_limit" msgid="1074219746093031412">"Det finns för många aktiva samtal. Avsluta eller slå samman pågående samtal innan du ringer ett nytt."</string>
<string name="callFailed_imei_not_accepted" msgid="7257903653685147251">"Det går inte att ansluta. Sätt i ett giltigt SIM-kort."</string>
- <string name="callFailed_wifi_lost" msgid="1788036730589163141">"wifi-anslutningen bruten. Samtal avslutat."</string>
+ <string name="callFailed_wifi_lost" msgid="1788036730589163141">"Wi-Fi-anslutningen bruten. Samtal avslutat."</string>
<string name="dialFailed_low_battery" msgid="6857904237423407056">"Det går inte att ringa videosamtal på grund av svagt batteri."</string>
<string name="callFailed_low_battery" msgid="4056828320214416182">"Videosamtalet slutade på grund av svagt batteri."</string>
- <string name="callFailed_emergency_call_over_wfc_not_available" msgid="5944309590693432042">"Nödsamtal via wifi är inte tillgängligt på den här platsen."</string>
- <string name="callFailed_wfc_service_not_available_in_this_location" msgid="3624536608369524988">"wifi-samtal är inte tillgängligt på den här platsen."</string>
+ <string name="callFailed_emergency_call_over_wfc_not_available" msgid="5944309590693432042">"Nödsamtal via Wi-Fi är inte tillgängligt på den här platsen."</string>
+ <string name="callFailed_wfc_service_not_available_in_this_location" msgid="3624536608369524988">"Wi-Fi-samtal är inte tillgängligt på den här platsen."</string>
<string name="change_pin_title" msgid="3564254326626797321">"Ändra röstbrevlådans pinkod"</string>
<string name="change_pin_continue_label" msgid="5177011752453506371">"Fortsätt"</string>
<string name="change_pin_cancel_label" msgid="2301711566758827936">"Avbryt"</string>
@@ -837,7 +836,7 @@
<string name="radio_info_data_connection_disable" msgid="6404751291511368706">"Inaktivera dataanslutning"</string>
<string name="volte_provisioned_switch_string" msgid="4812874990480336178">"VoLTE-administrerad"</string>
<string name="vt_provisioned_switch_string" msgid="8295542122512195979">"Videosamtal tillhandahålls"</string>
- <string name="wfc_provisioned_switch_string" msgid="3835004640321078988">"wifi-samtal tillhandahålls"</string>
+ <string name="wfc_provisioned_switch_string" msgid="3835004640321078988">"Wi-Fi-samtal tillhandahålls"</string>
<string name="eab_provisioned_switch_string" msgid="4449676720736033035">"EAB/Presence tillhandahålls"</string>
<string name="cbrs_data_switch_string" msgid="6060356430838077653">"Data via CBRS"</string>
<string name="dsds_switch_string" msgid="7564769822086764796">"Aktivera DSDS"</string>
@@ -855,7 +854,7 @@
<string name="radio_info_ims_reg_status_not_registered" msgid="8045821447288876085">"Inte registrerad"</string>
<string name="radio_info_ims_feature_status_available" msgid="6493200914756969292">"Tillgänglig"</string>
<string name="radio_info_ims_feature_status_unavailable" msgid="8930391136839759778">"Inte tillgängligt"</string>
- <string name="radio_info_ims_reg_status" msgid="25582845222446390">"IMS-registrering: <xliff:g id="STATUS">%1$s</xliff:g>\nRöst via LTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nRöst via wifi: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nVideosamtal: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT-gränssnitt: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
+ <string name="radio_info_ims_reg_status" msgid="25582845222446390">"IMS-registrering: <xliff:g id="STATUS">%1$s</xliff:g>\nRöst via LTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nRöst via Wi-Fi: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nVideosamtal: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT-gränssnitt: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
<string name="radioInfo_service_in" msgid="45753418231446400">"I tjänst"</string>
<string name="radioInfo_service_out" msgid="287972405416142312">"Ur funktion"</string>
<string name="radioInfo_service_emergency" msgid="4763879891415016848">"Endast nödsamtal"</string>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Nätverkets uppdelningskonfiguration:"</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 83727d0..8241f0b 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -297,7 +297,7 @@
<string name="sip_accounts_removed_notification_title" msgid="3528076957535736095">"Akaunti za SIP ambazo zimefungwa zimepatikana na zikaondolewa"</string>
<string name="sip_accounts_removed_notification_message" msgid="1916856744869791592">"Huduma ya kupiga simu kupitia SIP haipatikani tena kwenye mfumo wa Android.\nAkaunti zako za SIP zilizopo <xliff:g id="REMOVED_SIP_ACCOUNTS">%s</xliff:g> zimeondolewa.\nTafadhali thibitisha mipangilio ya akaunti yako chaguomsingi ya kupiga simu."</string>
<string name="sip_accounts_removed_notification_action" msgid="3772778402370555562">"Nenda kwenye mipangilio"</string>
- <string name="data_usage_title" msgid="8438592133893837464">"Programu inavyotumia data"</string>
+ <string name="data_usage_title" msgid="8438592133893837464">"Matumizi ya data ya programu"</string>
<string name="data_usage_template" msgid="6287906680674061783">"<xliff:g id="ID_1">%1$s</xliff:g> za data ya mtandao wa simu zimetumika kuanzia <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="advanced_options_title" msgid="9208195294513520934">"Mipangilio ya Kina"</string>
<string name="carrier_settings_euicc" msgid="1190237227261337749">"Mtoa huduma"</string>
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Washa mtandao wa simu, zima hali ya ndegeni au uzime hali ya kiokoa betri ili upige simu."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Zima hali ya ndegeni ili upige simu."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Zima hali ya ndegeni au uunganishe kwenye mtandao pasiwaya ili upige simu."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Simu ina kiwango cha joto cha juu sana"</b>\n\n"Imeshindwa kupiga simu hii. Jaribu tena wakati kiwango cha joto cha simu yako kitapungua.\n\nBado unaweza kupiga simu za dharura."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Ondoka kwenye hali ya kupiga simu za dharura ili upige simu zisizokuwa za dharura."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Haijasajiliwa kwa mitandao"</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mtandao wa simu haupatikani."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 0432ff7..5a28420 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -339,7 +339,7 @@
<string name="maintenance_enable" msgid="2646784483222342290">"பராமரிப்பு இயக்கப்பட்டது"</string>
<string name="maintenance_disable" msgid="2121032601497725602">"பராமரிப்பு முடக்கப்பட்டது"</string>
<string name="general_news_settings" msgid="2670499575962080411">"பொது செய்திகள்"</string>
- <string name="bf_news_settings" msgid="8571709425370794221">"பிசினஸ் மற்றும் நிதிசார்ந்த செய்திகள்"</string>
+ <string name="bf_news_settings" msgid="8571709425370794221">"வணிகம் மற்றும் நிதிசார்ந்த செய்திகள்"</string>
<string name="sports_news_settings" msgid="2684364556989168438">"விளையாட்டுச் செய்திகள்"</string>
<string name="entertainment_news_settings" msgid="4228527702346305543">"பொழுதுபோக்குச் செய்திகள்"</string>
<string name="enable_disable_local" msgid="7654175079979415572">"உள்ளூர்"</string>
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"மொபைல் மிகச் சூடாக உள்ளது"</b>\n\n"இந்த அழைப்பைத் தொடர முடியவில்லை. மொபைலின் சூடு முழுமையாகத் தணிந்ததும் மீண்டும் அழைக்கவும்.\n\nஇருப்பினும் அவசர அழைப்புகளைச் செய்யலாம்."</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 0718c51..0b0220f 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -144,7 +144,7 @@
<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>
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"ఫోన్ చాలా వేడిగా ఉంది"</b>\n\n"ఈ కాల్ను పూర్తి చేయడం సాధ్యపడదు. మీ ఫోన్ చల్లబడినప్పుడు మళ్లీ ట్రై చేయండి.\n\nమీరు ఇప్పటికీ ఎమర్జెన్సీ కాల్స్ చేయవచ్చు."</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 0e697da..68a48c1 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"โทรศัพท์ร้อนเกินไป"</b>\n\n"ไม่สามารถโทรได้ โปรดลองอีกครั้งเมื่อโทรศัพท์เย็นลงแล้ว\n\nคุณยังสามารถโทรหมายเลขฉุกเฉินได้อยู่"</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"กำหนดค่าการแบ่งส่วนเครือข่าย:"</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 495807b..a54cd9a 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"I-on ang mobile network, i-off ang airplane mode o i-off ang battery saver mode upang tumawag."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"I-off ang airplane mode upang makatawag."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"I-off ang airplane mode o kumonekta sa isang wireless network upang makatawag."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Masyadong mainit ang telepono"</b>\n\n"Hindi makumpleto ang tawag na ito. Subukan ulit kapag lumamig ang iyong telepono.\n\nMakakagawa ka pa rin ng mga emergency na tawag."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Lumabas sa emergency callback mode upang makapagsagawa ng hindi pang-emergency na pagtawag."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Hindi nakarehistro sa network."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Hindi available ang mobile network."</string>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Configuration ng pag-slice ng network:"</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 74bb70b..01cdf49 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Telefon etmek için mobil ağı açın, uçak modunu veya pil tasarrufu modunu kapatın."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Telefon etmek için uçak modunu kapatın."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Telefon etmek için uçak modunu kapatın veya kablosuz ağa bağlanın."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefon çok ısındı"</b>\n\n"Bu arama tamamlanamıyor. Telefonunuz soğuyana kadar bekleyip tekrar deneyin.\n\nBu süre zarfında acil durum aramaları yapabilirsiniz."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Acil durum çağrısı dışında bir çağrı yapmak için acil durumda geri aranma modundan çıkın."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Ağda kayıtlı değil."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobil ağ kullanılamıyor."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 92aa4d3..c2b0ee6 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"Телефон занадто нагрівся"</b>\n\n"Не вдалося завершити виклик. Зачекайте, доки телефон охолоне, і повторіть спробу.\n\nЕкстрені виклики доступні."</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>
@@ -921,6 +920,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"Конфігурація сегментування мережі:"</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 7a5e676..46b33bd 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"فون بہت گرم ہے"</b>\n\n"اس کال کو مکمل نہیں کیا جا سکتا۔ جب آپ کا فون ٹھنڈا ہو جائے تو دوبارہ کوشش کریں۔\n\nآپ اب بھی ہنگامی کالز کر سکتے ہیں۔"</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 c86c5ee..cfd69b0 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Telefon qilish uchun mobil tarmoqni yoqing, parvoz yoki quvvat tejash rejimini oʻchiring."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Qo‘ng‘iroq qilish uchun parvoz rejimini o‘chiring"</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Qo‘ng‘iroq qilish uchun parvoz rejimini o‘chiring yoki simsiz tarmoqqa ulaning."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Telefon qizib ketdi"</b>\n\n"Chaqiruvni amalga oshirish imkonsiz. Telefoningiz soviganida qayta urining.\n\nFavqulodda chaqiruvlarni har qanday holatda ham amalga oshira olasiz."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Odatiy qo‘ng‘iroq qilish uchun favqulodda qayta qo‘ng‘iroq rejimidan chiqing."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Tarmoqda ro‘yxatdan o‘tmagan."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Uyali tarmoq mavjud emas."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 a6d8d20..28f7a37 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Bật mạng di động, tắt chế độ trên máy bay hoặc tắt chế độ trình tiết kiệm pin để thực hiện cuộc gọi."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Tắt chế độ trên máy bay để thực hiện cuộc gọi."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Tắt chế độ trên máy bay hoặc kết nối với mạng không dây để thực hiện cuộc gọi."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Điện thoại quá nóng"</b>\n\n"Không thể hoàn tất cuộc gọi này. Hãy thử lại khi điện thoại nguội bớt.\n\nBạn vẫn có thể thực hiện cuộc gọi khẩn cấp."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Thoát khỏi chế độ gọi lại khẩn cấp để thực hiện cuộc gọi không khẩn cấp."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Chưa được đăng ký trên mạng."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mạng di động không khả dụng."</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 6bcb0a5..e568da3 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"手机过热"</b>\n\n"无法完成此通话。请先让手机降温,然后再重试。\n\n您仍然可以拨打紧急呼救电话。"</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>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 85cedaa..4d04727 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"電話過熱"</b>\n\n"無法完成此通話。請在電話冷卻後再試一次。\n\n您仍可進行緊急電話。"</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>
@@ -915,6 +914,7 @@
<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="radio_info_network_slicing_config" msgid="7675131833885031563">"網絡切片設定:"</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 64a54cd..23393be 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -537,7 +537,6 @@
<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_thermal" product="default" msgid="8695809601655300168"><b>"手機過熱"</b>\n\n"無法撥打這通電話。請等到手機降溫後再試一次。\n\n在這段期間內仍可撥打緊急電話。"</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">"無法使用 Google 行動服務網路。"</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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 bcc1562..4ad89d0 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -537,7 +537,6 @@
<string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Vula inethiwekhi yeselula, vala imodi yendiza noma vala imodi yokulondoloza ibhethri ukuze wenze ikholi."</string>
<string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Vala imodi yendiza ukuze wenze ikholi."</string>
<string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Vala imodi yendiza noma xhumeka kunethiwekhi engenantambo ukuze wenze ikholi."</string>
- <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Ifoni ishisa kakhulu"</b>\n\n"Ayikwazi ukwenza le kholi. Zama futhi lapho ifoni iphola.\n\nUsengakwazi ukwenza amakholi aphuthumayo."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Phuma kwimodi yokushayela emuva yesiko esiphuthumayo ukuze wenze ikholi yemodi engaphuthumi."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Ayibhalisiwe kwinethiwekhi."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Inethiwekhi yefoni ayitholakali"</string>
@@ -915,6 +914,8 @@
<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>
+ <!-- no translation found for radio_info_network_slicing_config (7675131833885031563) -->
+ <skip />
<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/strings.xml b/res/values/strings.xml
index 0f75e23..6fda189 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2161,6 +2161,8 @@
<string name="radio_info_nr_state">NR State:</string>
<!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
<string name="radio_info_nr_frequency">NR Frequency:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_network_slicing_config" translatable="false">Network slicing config:</string>
<!-- Band Mode Selection -->
<!-- Band mode screen. Title of activity. -->
diff --git a/sip/res/values-gu/strings.xml b/sip/res/values-gu/strings.xml
index 70232ad..9eb810b 100644
--- a/sip/res/values-gu/strings.xml
+++ b/sip/res/values-gu/strings.xml
@@ -74,7 +74,7 @@
<string name="no_internet_available" msgid="161720645084325479">"SIP કૉલ કરવા માટે, પ્રથમ તમારું ઇન્ટરનેટ કનેક્શન તપાસો."</string>
<string name="no_wifi_available" msgid="1179092018692306312">"SIP કૉલ્સ માટે તમારે Wi-Fi નેટવર્કથી કનેક્ટ હોવું જરૂરી છે (વાયરલેસ અને નેટવર્ક સેટિંગ્સનો ઉપયોગ કરો)."</string>
<string name="no_voip" msgid="3366395789297981738">"SIP કૉલિંગ સમર્થિત નથી"</string>
- <string name="sip_system_decide" msgid="197230378376326430">"ઑટોમૅટિક"</string>
+ <string name="sip_system_decide" msgid="197230378376326430">"સ્વચલિત"</string>
<string name="sip_always_send_keepalive" msgid="4986533673960084769">"હંમેશાં મોકલો"</string>
<string name="sip_connection_service_label" msgid="8796284274240316006">"બિલ્ટ-ઇન SIP કૉલિંગ"</string>
</resources>
diff --git a/sip/res/values-iw/strings.xml b/sip/res/values-iw/strings.xml
index 34b1b20..6e84560 100644
--- a/sip/res/values-iw/strings.xml
+++ b/sip/res/values-iw/strings.xml
@@ -24,29 +24,29 @@
<string name="sip_call_options_title" msgid="5027066677561068192">"שימוש בשיחות SIP"</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_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="remove_sip_account" msgid="8272617403399636513">"הסרת חשבון"</string>
<string name="sip_account_list" msgid="2596262496233721769">"חשבונות SIP"</string>
- <string name="saving_account" msgid="3390358043846687266">"שמירת החשבון מתבצעת..."</string>
- <string name="removing_account" msgid="1544132880414780408">"הסרת החשבון מתבצעת..."</string>
- <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="saving_account" msgid="3390358043846687266">"שומר את החשבון..."</string>
+ <string name="removing_account" msgid="1544132880414780408">"מסיר את החשבון..."</string>
+ <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="close_profile" msgid="3756064641769751774">"סגירה"</string>
- <string name="registration_status_checking_status" msgid="884179594507591180">"בדיקת המצב מתבצעת..."</string>
- <string name="registration_status_registering" msgid="7986331597809521791">"הרישום מתבצע..."</string>
- <string name="registration_status_still_trying" msgid="7178623685868766282">"הניסיון מתבצע..."</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>
+ <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">"רישום החשבון הופסק כיוון שאין חיבור Wi-Fi."</string>
<string name="registration_status_not_running" msgid="6236403137652262659">"רישום החשבון נכשל."</string>
- <string name="registration_status_done" msgid="6787397199273357721">"קבלת שיחות."</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_server_unreachable" msgid="3832339558868965604">"רישום החשבון נכשל: יש לבדוק את שם השרת."</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>
@@ -57,7 +57,7 @@
<string name="proxy_address_title" msgid="4120361943254795287">"כתובת שרת Proxy יוצא"</string>
<string name="port_title" msgid="1703586046264385110">"מספר יציאה"</string>
<string name="transport_title" msgid="1661659138226029178">"סוג העברה"</string>
- <string name="send_keepalive_title" msgid="5319788151608946049">"שליחת אות חיבור"</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>
@@ -67,14 +67,14 @@
<string name="display_name_summary" msgid="6749135030093260358">"<זהה לשם משתמש>"</string>
<string name="optional_summary" msgid="620379377865437488">"<אופציונלי>"</string>
<string name="advanced_settings_show" msgid="2318728080037568529">"איפה כל ההגדרות?"</string>
- <string name="advanced_settings_hide" msgid="6200816937370652083">"▽ יש לגעת כדי להסתיר את הכול"</string>
- <string name="all_empty_alert" msgid="6085603517610199098">"יש להזין את פרטי חשבון ה-SIP החדש."</string>
+ <string name="advanced_settings_hide" msgid="6200816937370652083">"▽ גע כדי להסתיר את הכול"</string>
+ <string name="all_empty_alert" msgid="6085603517610199098">"הזן את פרטי חשבון ה-SIP החדש."</string>
<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 ל-65534."</string>
- <string name="no_internet_available" msgid="161720645084325479">"כדי לבצע שיחת SIP, ראשית יש לבדוק את חיבור האינטרנט שלך."</string>
- <string name="no_wifi_available" msgid="1179092018692306312">"יש צורך בחיבור לרשת Wi-Fi כדי לבצע שיחות SIP (יש להשתמש ב\'הגדרות רשת ותקשורת אלחוטית\')."</string>
+ <string name="no_internet_available" msgid="161720645084325479">"כדי לבצע שיחת 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>
+ <string name="sip_always_send_keepalive" msgid="4986533673960084769">"שלח תמיד"</string>
<string name="sip_connection_service_label" msgid="8796284274240316006">"שיחות SIP מובנות"</string>
</resources>
diff --git a/sip/res/values-kn/strings.xml b/sip/res/values-kn/strings.xml
index 99fe93e..cf7cd59 100644
--- a/sip/res/values-kn/strings.xml
+++ b/sip/res/values-kn/strings.xml
@@ -19,7 +19,7 @@
<string name="sip_settings" msgid="7452587325305604702">"ಎಸ್ಐಪಿ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="sip_accounts" msgid="7297896885665783239">"ಎಸ್ಐಪಿ ಖಾತೆಗಳು"</string>
<string name="sip_accounts_title" msgid="3061686404598143943">"ಖಾತೆಗಳು"</string>
- <string name="sip_receive_calls" msgid="3403644006618369349">"ಒಳಬರುವ ಕರೆಗಳನ್ನು ಸ್ವೀಕರಿಸಿ"</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">"ಎಸ್ಐಪಿ ಕರೆ ಮಾಡುವಿಕೆಯನ್ನು ಬಳಸಿ"</string>
<string name="sip_call_options_wifi_only_title" msgid="6663105297927456484">"ಎಸ್ಐಪಿ ಕರೆ ಮಾಡುವಿಕೆಯನ್ನು ಬಳಸಿ (ವೈ-ಫೈ ಮಾತ್ರ)"</string>
diff --git a/sip/res/values-mr/strings.xml b/sip/res/values-mr/strings.xml
index 6eb7245..60d9c88 100644
--- a/sip/res/values-mr/strings.xml
+++ b/sip/res/values-mr/strings.xml
@@ -19,7 +19,7 @@
<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_receive_calls" msgid="3403644006618369349">"इनकमिंग कॉल घ्या"</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>
<string name="sip_call_options_wifi_only_title" msgid="6663105297927456484">"SIP कॉलिंग वापरा (वाय-फाय केवळ)"</string>
diff --git a/sip/res/values-sv/strings.xml b/sip/res/values-sv/strings.xml
index a59eb21..2976425 100644
--- a/sip/res/values-sv/strings.xml
+++ b/sip/res/values-sv/strings.xml
@@ -41,7 +41,7 @@
<string name="registration_status_still_trying" msgid="7178623685868766282">"Försöker fortfarande ..."</string>
<string name="registration_status_not_receiving" msgid="3873074208531938401">"Tar inte emot samtal."</string>
<string name="registration_status_no_data" msgid="2987064560116584121">"Kontoregistreringen avbröts eftersom det inte finns någon internetanslutning."</string>
- <string name="registration_status_no_wifi_data" msgid="685470618241482948">"Kontoregistreringen avbröts eftersom det inte finns någon wifi-anslutning."</string>
+ <string name="registration_status_no_wifi_data" msgid="685470618241482948">"Kontoregistreringen avbröts eftersom det inte finns någon Wi-Fi-anslutning."</string>
<string name="registration_status_not_running" msgid="6236403137652262659">"Det gick inte att registrera kontot."</string>
<string name="registration_status_done" msgid="6787397199273357721">"Tar emot samtal."</string>
<string name="registration_status_failed_try_later" msgid="7855389184910312091">"Det gick inte att registrera kontot: (<xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>); försöker igen senare"</string>
@@ -72,7 +72,7 @@
<string name="empty_alert" msgid="3693655518612836718">"<xliff:g id="INPUT_FIELD_NAME">%s</xliff:g> är ett obligatoriskt fält som måste fyllas i."</string>
<string name="not_a_valid_port" msgid="3664668836663491376">"Portnumret ska vara mellan 1000 och 65534."</string>
<string name="no_internet_available" msgid="161720645084325479">"Om du vill ringa ett SIP-samtal kontrollerar du först att du är ansluten till internet."</string>
- <string name="no_wifi_available" msgid="1179092018692306312">"Du måste vara ansluten till wifi för att kunna ringa SIP-samtal (du ändrar detta i inställningarna för Trådlöst och nätverk)."</string>
+ <string name="no_wifi_available" msgid="1179092018692306312">"Du måste vara ansluten till Wi-Fi för att kunna ringa SIP-samtal (du ändrar detta i inställningarna för Trådlöst och nätverk)."</string>
<string name="no_voip" msgid="3366395789297981738">"SIP-samtal stöds inte"</string>
<string name="sip_system_decide" msgid="197230378376326430">"Automatiskt"</string>
<string name="sip_always_send_keepalive" msgid="4986533673960084769">"Skicka alltid"</string>
diff --git a/sip/res/values-te/strings.xml b/sip/res/values-te/strings.xml
index b15b514..9abb6f5 100644
--- a/sip/res/values-te/strings.xml
+++ b/sip/res/values-te/strings.xml
@@ -47,7 +47,7 @@
<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_server_unreachable" msgid="3832339558868965604">"ఖాతా నమోదు విఫలమైంది: సర్వర్ పేరు తనిఖీ చేయండి."</string>
- <string name="third_party_account_summary" msgid="5918779106950859167">"ఈ ఖాతా ప్రస్తుతం <xliff:g id="ACCOUNT_OWNER">%s</xliff:g> యాప్ ద్వారా ఉపయోగంలో ఉంది."</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>
diff --git a/sip/src/com/android/services/telephony/sip/SipUtil.java b/sip/src/com/android/services/telephony/sip/SipUtil.java
index 5c7409f..a5793d0 100644
--- a/sip/src/com/android/services/telephony/sip/SipUtil.java
+++ b/sip/src/com/android/services/telephony/sip/SipUtil.java
@@ -63,7 +63,9 @@
Intent intent = new Intent(context, SipIncomingCallReceiver.class);
intent.setAction(SipManager.ACTION_SIP_INCOMING_CALL);
intent.putExtra(EXTRA_PHONE_ACCOUNT, SipUtil.createAccountHandle(context, sipProfileName));
- return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ return PendingIntent.getBroadcast(context, 0, intent,
+ // Mutable because information associated with the call is passed back here.
+ PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
}
public static boolean isPhoneIdle(Context context) {
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index ae6f072..ec6ea2b 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -295,7 +295,7 @@
private final class CallFeaturesTelephonyCallback extends TelephonyCallback implements
TelephonyCallback.CallStateListener {
@Override
- public void onCallStateChanged(int state, String incomingNumber) {
+ public void onCallStateChanged(int state) {
if (DBG) log("PhoneStateListener onCallStateChanged: state is " + state);
boolean isCallStateIdle = state == TelephonyManager.CALL_STATE_IDLE;
if (mEnableVideoCalling != null) {
@@ -305,7 +305,7 @@
mButtonWifiCalling.setEnabled(isCallStateIdle);
}
}
- };
+ }
private final ProvisioningManager.Callback mProvisioningCallback =
new ProvisioningManager.Callback() {
@@ -398,7 +398,8 @@
cdmaOptions.setIntent(mSubscriptionInfoHelper.getIntent(CdmaCallOptions.class));
gsmOptions.setIntent(mSubscriptionInfoHelper.getIntent(GsmUmtsCallOptions.class));
} else {
- prefSet.removePreference(cdmaOptions);
+ // Remove GSM options and repopulate the preferences in this Activity if phone type is
+ // GSM.
prefSet.removePreference(gsmOptions);
int phoneType = mPhone.getPhoneType();
@@ -406,12 +407,16 @@
prefSet.removePreference(fdnButton);
} else {
if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
+ // For now, just keep CdmaCallOptions as one entity. Eventually CDMA should
+ // follow the same pattern as GSM below, where VP and Call forwarding are
+ // populated here and Call waiting is populated in another "Additional Settings"
+ // submenu for CDMA.
prefSet.removePreference(fdnButton);
- addPreferencesFromResource(R.xml.cdma_call_privacy);
- CdmaVoicePrivacySwitchPreference buttonVoicePrivacy =
- (CdmaVoicePrivacySwitchPreference) findPreference(BUTTON_VP_KEY);
- buttonVoicePrivacy.setPhone(mPhone);
+ cdmaOptions.setSummary(null);
+ cdmaOptions.setTitle(R.string.additional_gsm_call_settings);
+ cdmaOptions.setIntent(mSubscriptionInfoHelper.getIntent(CdmaCallOptions.class));
} else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
+ prefSet.removePreference(cdmaOptions);
if (mPhone.getIccCard() == null || !mPhone.getIccCard().getIccFdnAvailable()) {
prefSet.removePreference(fdnButton);
}
diff --git a/src/com/android/phone/CallNotifier.java b/src/com/android/phone/CallNotifier.java
index c9d5eb0..7f61f78 100644
--- a/src/com/android/phone/CallNotifier.java
+++ b/src/com/android/phone/CallNotifier.java
@@ -720,7 +720,7 @@
mCFIStatus.put(this.mSubId, visible);
updatePhoneStateListeners(false, UPDATE_TYPE_CFI, this.mSubId);
}
- };
+ }
private void log(String msg) {
Log.d(LOG_TAG, msg);
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index b0a4653..d3792f1 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -466,7 +466,15 @@
resultData.getParcelable(KEY_CONFIG_BUNDLE);
saveConfigToXml(getCarrierPackageForPhoneId(phoneId), "",
phoneId, carrierId, config);
- mConfigFromCarrierApp[phoneId] = config;
+ if (config != null) {
+ mConfigFromCarrierApp[phoneId] = config;
+ } else {
+ logdWithLocalLog("Config from carrier app is null "
+ + "for phoneId " + phoneId);
+ // Put a stub bundle in place so that the rest of the logic
+ // continues smoothly.
+ mConfigFromCarrierApp[phoneId] = new PersistableBundle();
+ }
sendMessage(
obtainMessage(
EVENT_FETCH_CARRIER_DONE, phoneId, -1));
@@ -873,9 +881,15 @@
/** Returns the package name of a priveleged carrier app, or null if there is none. */
@Nullable
private String getCarrierPackageForPhoneId(int phoneId) {
- List<String> carrierPackageNames = TelephonyManager.from(mContext)
+ List<String> carrierPackageNames;
+ final long token = Binder.clearCallingIdentity();
+ try {
+ carrierPackageNames = TelephonyManager.from(mContext)
.getCarrierPackageNamesForIntentAndPhone(
- new Intent(CarrierService.CARRIER_SERVICE_INTERFACE), phoneId);
+ new Intent(CarrierService.CARRIER_SERVICE_INTERFACE), phoneId);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
if (carrierPackageNames != null && carrierPackageNames.size() > 0) {
return carrierPackageNames.get(0);
} else {
diff --git a/src/com/android/phone/CdmaCallOptions.java b/src/com/android/phone/CdmaCallOptions.java
index 2e310aa..6145870 100644
--- a/src/com/android/phone/CdmaCallOptions.java
+++ b/src/com/android/phone/CdmaCallOptions.java
@@ -21,18 +21,36 @@
import android.preference.Preference;
import android.preference.PreferenceScreen;
import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.ImsManager;
+import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.feature.MmTelFeature;
+import android.util.Log;
import android.view.MenuItem;
import com.android.internal.telephony.PhoneConstants;
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;
+
+ private class UtCallback extends ImsMmTelManager.CapabilityCallback {
+ @Override
+ public void onCapabilitiesStatusChanged(MmTelFeature.MmTelCapabilities capabilities) {
+ boolean isUtAvailable = capabilities.isCapable(
+ MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT);
+ updatePreferencesEnabled(isUtAvailable);
+ }
+ }
+
+ private Preference mCallForwardingPref;
+ private CdmaCallWaitingPreference mCallWaitingPref;
+ private UtCallback mUtCallback;
+ private ImsMmTelManager mMmTelManager;
@Override
protected void onCreate(Bundle icicle) {
@@ -44,27 +62,112 @@
subInfoHelper.setActionBarTitle(
getActionBar(), getResources(), R.string.labelCdmaMore_with_label);
- mButtonVoicePrivacy = (CdmaVoicePrivacySwitchPreference) findPreference(BUTTON_VP_KEY);
- mButtonVoicePrivacy.setPhone(subInfoHelper.getPhone());
+ CdmaVoicePrivacySwitchPreference buttonVoicePrivacy =
+ (CdmaVoicePrivacySwitchPreference) findPreference(BUTTON_VP_KEY);
+ buttonVoicePrivacy.setPhone(subInfoHelper.getPhone());
PersistableBundle carrierConfig;
+ int subId;
if (subInfoHelper.hasSubId()) {
- carrierConfig = PhoneGlobals.getInstance().getCarrierConfigForSubId(
- subInfoHelper.getSubId());
+ subId = subInfoHelper.getSubId();
} else {
- carrierConfig = PhoneGlobals.getInstance().getCarrierConfig();
+ subId = SubscriptionManager.getDefaultSubscriptionId();
}
+ carrierConfig = PhoneGlobals.getInstance().getCarrierConfigForSubId(subId);
if (subInfoHelper.getPhone().getPhoneType() != PhoneConstants.PHONE_TYPE_CDMA
|| carrierConfig.getBoolean(CarrierConfigManager.KEY_VOICE_PRIVACY_DISABLE_UI_BOOL)) {
- // disable the entire screen
- mButtonVoicePrivacy.setEnabled(false);
+ buttonVoicePrivacy.setEnabled(false);
}
- Preference callForwardingPref = getPreferenceScreen().findPreference(CALL_FORWARDING_KEY);
- callForwardingPref.setIntent(subInfoHelper.getIntent(CdmaCallForwardOptions.class));
+ mCallForwardingPref = getPreferenceScreen().findPreference(CALL_FORWARDING_KEY);
+ if (carrierConfig != null && carrierConfig.getBoolean(
+ CarrierConfigManager.KEY_CALL_FORWARDING_VISIBILITY_BOOL)) {
+ mCallForwardingPref.setIntent(
+ subInfoHelper.getIntent(CdmaCallForwardOptions.class));
+ } else {
+ getPreferenceScreen().removePreference(mCallForwardingPref);
+ mCallForwardingPref = null;
+ }
- CdmaCallWaitingPreference callWaitingPref = (CdmaCallWaitingPreference)getPreferenceScreen()
- .findPreference(CALL_WAITING_KEY);
- callWaitingPref.init(this, subInfoHelper.getPhone());
+ mCallWaitingPref = (CdmaCallWaitingPreference) getPreferenceScreen()
+ .findPreference(CALL_WAITING_KEY);
+ if (carrierConfig == null || !carrierConfig.getBoolean(
+ CarrierConfigManager.KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL)) {
+ getPreferenceScreen().removePreference(mCallWaitingPref);
+ mCallWaitingPref = null;
+ }
+ // Do not go further if the preferences are removed.
+ if (mCallForwardingPref == null && mCallWaitingPref == null) return;
+
+ boolean isSsOverCdmaEnabled = carrierConfig != null && carrierConfig.getBoolean(
+ CarrierConfigManager.KEY_SUPPORT_SS_OVER_CDMA_BOOL);
+ boolean isSsOverUtEnabled = carrierConfig != null && carrierConfig.getBoolean(
+ CarrierConfigManager.KEY_CARRIER_SUPPORTS_SS_OVER_UT_BOOL);
+
+ if (isSsOverCdmaEnabled && mCallWaitingPref != null) {
+ // If SS over CDMA is enabled, then the preference will always be enabled,
+ // independent of SS over UT status. Initialize it now.
+ mCallWaitingPref.init(this, subInfoHelper.getPhone());
+ return;
+ }
+ // Since SS over UT availability can change, first disable the preferences that rely on it
+ // and only enable it if UT is available.
+ updatePreferencesEnabled(false);
+ if (isSsOverUtEnabled) {
+ // Register a callback to listen to SS over UT state. This will enable the preferences
+ // once the callback notifies settings that UT is enabled.
+ registerMmTelCapsCallback(subId);
+ } else {
+ Log.w(LOG_TAG, "SS over UT and CDMA disabled, but preferences are visible.");
+ }
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ unregisterMmTelCapsCallback();
+ }
+
+ private void unregisterMmTelCapsCallback() {
+ if (mMmTelManager == null || mUtCallback == null) return;
+ mMmTelManager.unregisterMmTelCapabilityCallback(mUtCallback);
+ mUtCallback = null;
+ Log.d(LOG_TAG, "unregisterMmTelCapsCallback: UT availability callback unregistered");
+ }
+
+ private void registerMmTelCapsCallback(int subId) {
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) return;
+ ImsManager imsManager = getSystemService(ImsManager.class);
+ try {
+ if (imsManager != null) {
+ mUtCallback = new UtCallback();
+ mMmTelManager = imsManager.getImsMmTelManager(subId);
+ // Callback will call back with the state as soon as it is available.
+ mMmTelManager.registerMmTelCapabilityCallback(getMainExecutor(), mUtCallback);
+ Log.d(LOG_TAG, "registerMmTelCapsCallback: UT availability callback "
+ + "registered");
+ } else {
+ Log.w(LOG_TAG, "registerMmTelCapsCallback: couldn't get ImsManager, assuming "
+ + "UT is not available: ");
+ updatePreferencesEnabled(false);
+ }
+ } catch (IllegalArgumentException | ImsException e) {
+ Log.w(LOG_TAG, "registerMmTelCapsCallback: couldn't register callback, assuming "
+ + "UT is not available: " + e);
+ updatePreferencesEnabled(false);
+ }
+ }
+
+ private void updatePreferencesEnabled(boolean isEnabled) {
+ Log.d(LOG_TAG, "updatePreferencesEnabled: " + isEnabled);
+ if (mCallForwardingPref != null) mCallForwardingPref.setEnabled(isEnabled);
+
+ if (mCallWaitingPref == null || mCallWaitingPref.isEnabled() == isEnabled) return;
+ mCallWaitingPref.setActionAvailable(isEnabled);
+ if (isEnabled) {
+ SubscriptionInfoHelper subInfoHelper = new SubscriptionInfoHelper(this, getIntent());
+ // kick off the normal process to populate the Call Waiting status.
+ mCallWaitingPref.init(this, subInfoHelper.getPhone());
+ }
}
@Override
diff --git a/src/com/android/phone/CdmaCallWaitingPreference.java b/src/com/android/phone/CdmaCallWaitingPreference.java
index 4cda7ba..3713b19 100644
--- a/src/com/android/phone/CdmaCallWaitingPreference.java
+++ b/src/com/android/phone/CdmaCallWaitingPreference.java
@@ -16,32 +16,29 @@
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;
+import com.android.internal.telephony.CommandException;
+import com.android.internal.telephony.CommandsInterface;
+import com.android.internal.telephony.Phone;
+
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();
+ private boolean mIsActionAvailable = true;
public CdmaCallWaitingPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
@@ -67,6 +64,16 @@
}
}
+ /**
+ * Enables this preference if Call waiting is available in the platform. If not, this will
+ * override all attempts to enable the preference from the associated
+ * TimeConsumingPreferenceActivity.
+ */
+ public void setActionAvailable(boolean isAvailable) {
+ mIsActionAvailable = isAvailable;
+ super.setEnabled(mIsActionAvailable);
+ }
+
@Override
public void onClick() {
super.onClick();
@@ -95,6 +102,14 @@
builder.create().show();
}
+ @Override
+ public void setEnabled(boolean enabled) {
+ // If this action is currently disabled due to configuration changes, do not allow anything
+ // to enable it.
+ if (!mIsActionAvailable) return;
+ super.setEnabled(enabled);
+ }
+
private class MyHandler extends Handler {
static final int MESSAGE_GET_CALL_WAITING = 0;
static final int MESSAGE_SET_CALL_WAITING = 1;
diff --git a/src/com/android/phone/IccPanel.java b/src/com/android/phone/IccPanel.java
index 73dd8bc..4018e40 100644
--- a/src/com/android/phone/IccPanel.java
+++ b/src/com/android/phone/IccPanel.java
@@ -74,13 +74,13 @@
@Override
protected void onStart() {
super.onStart();
- mStatusBarManager.setDisabledForSimNetworkLock(true);
+ mStatusBarManager.setExpansionDisabledForSimNetworkLock(true);
}
@Override
public void onStop() {
super.onStop();
- mStatusBarManager.setDisabledForSimNetworkLock(false);
+ mStatusBarManager.setExpansionDisabledForSimNetworkLock(false);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
diff --git a/src/com/android/phone/ImsRcsController.java b/src/com/android/phone/ImsRcsController.java
index 2e4ee94..7d594d1 100644
--- a/src/com/android/phone/ImsRcsController.java
+++ b/src/com/android/phone/ImsRcsController.java
@@ -49,7 +49,6 @@
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;
@@ -214,6 +213,8 @@
final long token = Binder.clearCallingIdentity();
try {
getRcsFeatureController(subId).unregisterRcsAvailabilityCallback(subId, callback);
+ } catch (ServiceSpecificException e) {
+ Log.e(TAG, "unregisterRcsAvailabilityCallback: error=" + e.errorCode);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -338,12 +339,16 @@
public RcsContactUceCapability addUceRegistrationOverrideShell(int subId,
Set<String> featureTags) throws ImsException {
// Permission check happening in PhoneInterfaceManager.
- UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
- UceControllerManager.class);
- if (uceCtrlManager == null) {
- return null;
+ try {
+ UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
+ UceControllerManager.class);
+ if (uceCtrlManager == null) {
+ return null;
+ }
+ return uceCtrlManager.addUceRegistrationOverride(featureTags);
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.getMessage(), e.errorCode);
}
- return uceCtrlManager.addUceRegistrationOverride(featureTags);
}
/**
@@ -353,12 +358,16 @@
public RcsContactUceCapability removeUceRegistrationOverrideShell(int subId,
Set<String> featureTags) throws ImsException {
// Permission check happening in PhoneInterfaceManager.
- UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
- UceControllerManager.class);
- if (uceCtrlManager == null) {
- return null;
+ try {
+ UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
+ UceControllerManager.class);
+ if (uceCtrlManager == null) {
+ return null;
+ }
+ return uceCtrlManager.removeUceRegistrationOverride(featureTags);
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.getMessage(), e.errorCode);
}
- return uceCtrlManager.removeUceRegistrationOverride(featureTags);
}
/**
@@ -367,13 +376,17 @@
// Used for SHELL command only right now.
public RcsContactUceCapability clearUceRegistrationOverrideShell(int subId)
throws ImsException {
- // Permission check happening in PhoneInterfaceManager.
- UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
- UceControllerManager.class);
- if (uceCtrlManager == null) {
- return null;
+ try {
+ // Permission check happening in PhoneInterfaceManager.
+ UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
+ UceControllerManager.class);
+ if (uceCtrlManager == null) {
+ return null;
+ }
+ return uceCtrlManager.clearUceRegistrationOverride();
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.getMessage(), e.errorCode);
}
- return uceCtrlManager.clearUceRegistrationOverride();
}
/**
@@ -382,13 +395,17 @@
// Used for SHELL command only right now.
public RcsContactUceCapability getLatestRcsContactUceCapabilityShell(int subId)
throws ImsException {
- // Permission check happening in PhoneInterfaceManager.
- UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
- UceControllerManager.class);
- if (uceCtrlManager == null) {
- return null;
+ try {
+ // Permission check happening in PhoneInterfaceManager.
+ UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
+ UceControllerManager.class);
+ if (uceCtrlManager == null) {
+ return null;
+ }
+ return uceCtrlManager.getLatestRcsContactUceCapability();
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.getMessage(), e.errorCode);
}
- return uceCtrlManager.getLatestRcsContactUceCapability();
}
/**
@@ -397,14 +414,18 @@
*/
// Used for SHELL command only right now.
public String getLastUcePidfXmlShell(int subId) throws ImsException {
- // Permission check happening in PhoneInterfaceManager.
- UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
- UceControllerManager.class);
- if (uceCtrlManager == null) {
- return null;
+ try {
+ // Permission check happening in PhoneInterfaceManager.
+ UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
+ UceControllerManager.class);
+ if (uceCtrlManager == null) {
+ return null;
+ }
+ String pidfXml = uceCtrlManager.getLastPidfXml();
+ return pidfXml == null ? "none" : pidfXml;
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.getMessage(), e.errorCode);
}
- String pidfXml = uceCtrlManager.getLastPidfXml();
- return pidfXml == null ? "none" : pidfXml;
}
/**
@@ -413,12 +434,16 @@
*/
// Used for SHELL command only right now.
public boolean removeUceRequestDisallowedStatus(int subId) throws ImsException {
- UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
- UceControllerManager.class);
- if (uceCtrlManager == null) {
- return false;
+ try {
+ UceControllerManager uceCtrlManager = getRcsFeatureController(subId, true).getFeature(
+ UceControllerManager.class);
+ if (uceCtrlManager == null) {
+ return false;
+ }
+ return uceCtrlManager.removeUceRequestDisallowedStatus();
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.getMessage(), e.errorCode);
}
- return uceCtrlManager.removeUceRequestDisallowedStatus();
}
/**
@@ -426,12 +451,16 @@
*/
// Used for SHELL command only right now.
public boolean setCapabilitiesRequestTimeout(int subId, long timeoutAfter) throws ImsException {
- UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
- UceControllerManager.class);
- if (uceCtrlManager == null) {
- return false;
+ try {
+ UceControllerManager uceCtrlManager = getRcsFeatureController(subId, true).getFeature(
+ UceControllerManager.class);
+ if (uceCtrlManager == null) {
+ return false;
+ }
+ return uceCtrlManager.setCapabilitiesRequestTimeout(timeoutAfter);
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.getMessage(), e.errorCode);
}
- return uceCtrlManager.setCapabilitiesRequestTimeout(timeoutAfter);
}
@Override
@@ -465,6 +494,8 @@
"This subscription does not support UCE.");
}
uceCtrlManager.unregisterPublishStateCallback(c);
+ } catch (ServiceSpecificException e) {
+ Log.e(TAG, "unregisterUcePublishStateCallback: error=" + e.errorCode);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -570,8 +601,11 @@
@Override
public void destroySipDelegate(int subId, ISipDelegate connection, int reason) {
- enforceImsSingleRegistrationPermission("destroySipDelegate");
-
+ // Do not check permissions here - the caller needs to have a connection already from the
+ // create method to call this method.
+ if (connection == null) {
+ return;
+ }
final long identity = Binder.clearCallingIdentity();
try {
SipTransportController transport = getRcsFeatureController(subId).getFeature(
@@ -580,6 +614,8 @@
return;
}
transport.destroySipDelegate(subId, connection, reason);
+ } catch (ServiceSpecificException e) {
+ Log.e(TAG, "destroySipDelegate: error=" + e.errorCode);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -598,6 +634,8 @@
return;
}
transport.triggerFullNetworkRegistration(subId, connection, sipCode, sipReason);
+ } catch (ServiceSpecificException e) {
+ Log.e(TAG, "triggerNetworkRegistration: error=" + e.errorCode);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -688,31 +726,6 @@
}
/**
- * Retrieve ImsPhone instance.
- *
- * @param subId the subscription ID
- * @return The ImsPhone instance
- * @throws ServiceSpecificException if getting ImsPhone instance failed.
- */
- private ImsPhone getImsPhone(int subId) {
- if (!ImsManager.isImsSupportedOnDevice(mApp)) {
- throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
- "IMS is not available on device.");
- }
- Phone phone = PhoneGlobals.getPhone(subId);
- if (phone == null) {
- throw new ServiceSpecificException(ImsException.CODE_ERROR_INVALID_SUBSCRIPTION,
- "Invalid subscription Id: " + subId);
- }
- ImsPhone imsPhone = (ImsPhone) phone.getImsPhone();
- if (imsPhone == null) {
- throw new ServiceSpecificException(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE,
- "Cannot find ImsPhone instance: " + subId);
- }
- return imsPhone;
- }
-
- /**
* Retrieve RcsFeatureManager instance.
*
* @param subId the subscription ID
@@ -720,6 +733,18 @@
* @throws ServiceSpecificException if getting RcsFeatureManager instance failed.
*/
private RcsFeatureController getRcsFeatureController(int subId) {
+ return getRcsFeatureController(subId, false /* skipVerifyingConfig */);
+ }
+
+ /**
+ * Retrieve RcsFeatureManager instance.
+ *
+ * @param subId the subscription ID
+ * @param skipVerifyingConfig If the RCS configuration can be skip.
+ * @return The RcsFeatureManager instance
+ * @throws ServiceSpecificException if getting RcsFeatureManager instance failed.
+ */
+ private RcsFeatureController getRcsFeatureController(int subId, boolean skipVerifyingConfig) {
if (!ImsManager.isImsSupportedOnDevice(mApp)) {
throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
"IMS is not available on device.");
@@ -734,6 +759,9 @@
"Invalid subscription Id: " + subId);
}
int slotId = phone.getPhoneId();
+ if (!skipVerifyingConfig) {
+ verifyImsRcsConfiguredOrThrow(slotId);
+ }
RcsFeatureController c = mRcsService.getFeatureController(slotId);
if (c == null) {
throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
@@ -742,6 +770,20 @@
return c;
}
+ /**
+ * Throw an ImsException if the IMS resolver does not have an ImsService configured for RCS
+ * for the given slot ID or no ImsResolver instance has been created.
+ * @param slotId The slot ID that the IMS service is created for.
+ * @throws ServiceSpecificException If there is no ImsService configured for this slot.
+ */
+ private void verifyImsRcsConfiguredOrThrow(int slotId) {
+ if (mImsResolver == null
+ || !mImsResolver.isImsServiceConfiguredForFeature(slotId, ImsFeature.FEATURE_RCS)) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "This subscription does not support RCS");
+ }
+ }
+
private boolean isImsSingleRegistrationSupportedOnDevice() {
return mSingleRegistrationOverride != null ? mSingleRegistrationOverride
: mApp.getPackageManager().hasSystemFeature(
diff --git a/src/com/android/phone/LocalConnectionImpl.java b/src/com/android/phone/LocalConnectionImpl.java
new file mode 100644
index 0000000..c2630ef
--- /dev/null
+++ b/src/com/android/phone/LocalConnectionImpl.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2021 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.content.Context;
+import android.telephony.TelephonyLocalConnection;
+
+import com.android.phone.callcomposer.CallComposerPictureManager;
+
+import java.util.UUID;
+
+public class LocalConnectionImpl implements TelephonyLocalConnection.ConnectionImpl {
+ private Context mContext;
+
+ public LocalConnectionImpl(Context context) {
+ mContext = context;
+ }
+
+ @Override
+ public String getCallComposerServerUrlForHandle(int subscriptionId, UUID uuid) {
+ return CallComposerPictureManager.getInstance(mContext, subscriptionId)
+ .getServerUrlForImageId(uuid);
+ }
+}
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index c4686db..1a1c321 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -49,6 +49,7 @@
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyLocalConnection;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.util.LocalLog;
@@ -56,6 +57,7 @@
import android.widget.Toast;
import com.android.ims.ImsFeatureBinderRepository;
+import com.android.internal.os.BinderCallsStats;
import com.android.internal.telephony.CallManager;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.MmiCode;
@@ -208,6 +210,7 @@
new CarrierVvmPackageInstalledReceiver();
private final SettingsObserver mSettingsObserver;
+ private BinderCallsStats.SettingsObserver mBinderCallsSettingsObserver;
private static class EventSimStateChangedBag {
final int mPhoneId;
@@ -372,6 +375,9 @@
ContentResolver resolver = getContentResolver();
+ // Initialize the shim from frameworks/opt/telephony into packages/services/Telephony.
+ TelephonyLocalConnection.setInstance(new LocalConnectionImpl(this));
+
// Cache the "voice capable" flag.
// This flag currently comes from a resource (which is
// overrideable on a per-product basis):
@@ -523,6 +529,13 @@
SettingsConstants.HAC_KEY + "=" + (hac == SettingsConstants.HAC_ENABLED
? SettingsConstants.HAC_VAL_ON : SettingsConstants.HAC_VAL_OFF));
}
+
+ // Start tracking Binder latency for the phone process.
+ mBinderCallsSettingsObserver = new BinderCallsStats.SettingsObserver(
+ getApplicationContext(),
+ new BinderCallsStats(
+ new BinderCallsStats.Injector(),
+ com.android.internal.os.BinderLatencyProto.Dims.TELEPHONY));
}
/**
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 44858d2..eeccf0f 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -29,6 +29,8 @@
import android.annotation.Nullable;
import android.app.AppOpsManager;
import android.app.PendingIntent;
+import android.app.compat.CompatChanges;
+import android.app.role.RoleManager;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -106,7 +108,7 @@
import android.telephony.UssdResponse;
import android.telephony.VisualVoicemailSmsFilterSettings;
import android.telephony.data.ApnSetting;
-import android.telephony.data.SlicingConfig;
+import android.telephony.data.NetworkSlicingConfig;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.gba.GbaAuthRequest;
import android.telephony.gba.UaSecurityProtocolIdentifier;
@@ -139,7 +141,7 @@
import com.android.internal.telephony.CallForwardInfo;
import com.android.internal.telephony.CallManager;
import com.android.internal.telephony.CallStateException;
-import com.android.internal.telephony.CarrierInfoManager;
+import com.android.internal.telephony.CallTracker;
import com.android.internal.telephony.CarrierResolver;
import com.android.internal.telephony.CellNetworkScanResult;
import com.android.internal.telephony.CommandException;
@@ -194,6 +196,9 @@
import com.android.internal.telephony.util.VoicemailNotificationSettingsUtil;
import com.android.internal.util.FunctionalUtils;
import com.android.internal.util.HexDump;
+import com.android.phone.callcomposer.CallComposerPictureManager;
+import com.android.phone.callcomposer.CallComposerPictureTransfer;
+import com.android.phone.callcomposer.ImageData;
import com.android.phone.settings.PickSmsSubscriptionActivity;
import com.android.phone.vvm.PhoneAccountHandleConverter;
import com.android.phone.vvm.RemoteVvmTaskManager;
@@ -203,7 +208,10 @@
import com.android.services.telephony.TelephonyConnectionService;
import com.android.telephony.Rlog;
+import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
+import java.io.IOException;
+import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
@@ -333,6 +341,7 @@
private static final int CMD_PREPARE_UNATTENDED_REBOOT = 109;
private static final int CMD_GET_SLICING_CONFIG = 110;
private static final int EVENT_GET_SLICING_CONFIG_DONE = 111;
+ private static final int CMD_ERASE_DATA_SHARED_PREFERENCES = 112;
// Parameters of select command.
private static final int SELECT_COMMAND = 0xA4;
@@ -349,6 +358,7 @@
private ImsResolver mImsResolver;
private UserManager mUserManager;
private AppOpsManager mAppOps;
+ private PackageManager mPm;
private MainThreadHandler mMainThreadHandler;
private SubscriptionController mSubscriptionController;
private SharedPreferences mTelephonySharedPreferences;
@@ -1702,6 +1712,12 @@
handleNullReturnEvent(msg, "eraseModemConfig");
break;
+ case CMD_ERASE_DATA_SHARED_PREFERENCES:
+ request = (MainThreadRequest) msg.obj;
+ request.result = defaultPhone.eraseDataInSharedPreferences();
+ notifyRequester(request);
+ break;
+
case CMD_CHANGE_ICC_LOCK_PASSWORD:
request = (MainThreadRequest) msg.obj;
onCompleted = obtainMessage(EVENT_CHANGE_ICC_LOCK_PASSWORD_DONE, request);
@@ -1927,24 +1943,24 @@
request = (MainThreadRequest) ar.userObj;
ResultReceiver result = (ResultReceiver) request.argument;
- SlicingConfig slicingConfig = null;
+ NetworkSlicingConfig slicingConfig = null;
Bundle bundle = new Bundle();
int resultCode = 0;
if (ar.exception != null) {
Log.e(LOG_TAG, "Exception retrieving slicing configuration="
+ ar.exception);
- resultCode = TelephonyManager.SlicingException.ERROR_MODEM_ERROR;
+ resultCode = TelephonyManager.NetworkSlicingException.ERROR_MODEM_ERROR;
} else if (ar.result == null) {
Log.w(LOG_TAG, "Timeout Waiting for slicing configuration!");
- resultCode = TelephonyManager.SlicingException.ERROR_TIMEOUT;
+ resultCode = TelephonyManager.NetworkSlicingException.ERROR_TIMEOUT;
} else {
// use the result as returned
- resultCode = TelephonyManager.SlicingException.SUCCESS;
- slicingConfig = (SlicingConfig) ar.result;
+ resultCode = TelephonyManager.NetworkSlicingException.SUCCESS;
+ slicingConfig = (NetworkSlicingConfig) ar.result;
}
if (slicingConfig == null) {
- slicingConfig = new SlicingConfig();
+ slicingConfig = new NetworkSlicingConfig();
}
bundle.putParcelable(TelephonyManager.KEY_SLICING_CONFIG_HANDLE, slicingConfig);
result.send(resultCode, bundle);
@@ -1955,8 +1971,7 @@
case CMD_PREPARE_UNATTENDED_REBOOT:
request = (MainThreadRequest) msg.obj;
request.result =
- UiccController.getInstance().getPinStorage()
- .prepareUnattendedReboot(request.workSource);
+ UiccController.getInstance().getPinStorage().prepareUnattendedReboot();
notifyRequester(request);
break;
@@ -2078,7 +2093,7 @@
// Wait for at least timeoutInMs before returning null request result
long now = SystemClock.elapsedRealtime();
long deadline = now + timeoutInMs;
- while (request == null && now < deadline) {
+ while (request.result == null && now < deadline) {
try {
request.wait(deadline - now);
} catch (InterruptedException e) {
@@ -2156,6 +2171,7 @@
mImsResolver = ImsResolver.getInstance();
mUserManager = (UserManager) app.getSystemService(Context.USER_SERVICE);
mAppOps = (AppOpsManager)app.getSystemService(Context.APP_OPS_SERVICE);
+ mPm = app.getSystemService(PackageManager.class);
mMainThreadHandler = new MainThreadHandler();
mSubscriptionController = SubscriptionController.getInstance();
mTelephonySharedPreferences =
@@ -2206,18 +2222,14 @@
return PhoneFactory.getPhone(mSubscriptionController.getPhoneId(subId));
}
- private void sendEraseModemConfig(Phone phone) {
- if (phone != null) {
- TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
- mApp, phone.getSubId(), "eraseModemConfig");
- final long identity = Binder.clearCallingIdentity();
- try {
- Boolean success = (Boolean) sendRequest(CMD_ERASE_MODEM_CONFIG, null);
- if (DBG) log("eraseModemConfig:" + ' ' + (success ? "ok" : "fail"));
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
+ private void sendEraseModemConfig(@NonNull Phone phone) {
+ Boolean success = (Boolean) sendRequest(CMD_ERASE_MODEM_CONFIG, null);
+ if (DBG) log("eraseModemConfig:" + ' ' + (success ? "ok" : "fail"));
+ }
+
+ private void sendEraseDataInSharedPreferences(@NonNull Phone phone) {
+ Boolean success = (Boolean) sendRequest(CMD_ERASE_DATA_SHARED_PREFERENCES, null);
+ if (DBG) log("eraseDataInSharedPreferences:" + ' ' + (success ? "ok" : "fail"));
}
private boolean isImsAvailableOnDevice() {
@@ -2763,14 +2775,46 @@
}
}
+ /**
+ * @deprecated This method is deprecated and is only being kept due to an UnsupportedAppUsage
+ * tag on getCallState Binder call.
+ */
+ @Deprecated
+ @Override
public int getCallState() {
- return getCallStateForSlot(getSlotForDefaultSubscription());
- }
-
- public int getCallStateForSlot(int slotIndex) {
+ if (CompatChanges.isChangeEnabled(
+ TelecomManager.ENABLE_GET_CALL_STATE_PERMISSION_PROTECTION,
+ Binder.getCallingUid())) {
+ // Do not allow this API to be called on API version 31+, it should only be
+ // called on old apps using this Binder call directly.
+ throw new SecurityException("This method can only be used for applications "
+ + "targeting API version 30 or less.");
+ }
final long identity = Binder.clearCallingIdentity();
try {
- Phone phone = PhoneFactory.getPhone(slotIndex);
+ Phone phone = getPhone(getDefaultSubscription());
+ return phone == null ? TelephonyManager.CALL_STATE_IDLE :
+ PhoneConstantConversions.convertCallState(phone.getState());
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public int getCallStateForSubscription(int subId, String callingPackage, String featureId) {
+ if (CompatChanges.isChangeEnabled(
+ TelecomManager.ENABLE_GET_CALL_STATE_PERMISSION_PROTECTION,
+ Binder.getCallingUid())) {
+ // Check READ_PHONE_STATE for API version 31+
+ if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(mApp, subId, callingPackage,
+ featureId, "getCallStateForSubscription")) {
+ throw new SecurityException("getCallState requires READ_PHONE_STATE for apps "
+ + "targeting API level 31+.");
+ }
+ }
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ Phone phone = getPhone(subId);
return phone == null ? TelephonyManager.CALL_STATE_IDLE :
PhoneConstantConversions.convertCallState(phone.getState());
} finally {
@@ -3066,6 +3110,7 @@
return null;
}
int subId = phone.getSubId();
+ enforceCallingPackage(callingPackage, Binder.getCallingUid(), "getImeiForSlot");
if (!TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers(mApp, subId,
callingPackage, callingFeatureId, "getImeiForSlot")) {
return null;
@@ -3222,6 +3267,26 @@
//
/**
+ * Make sure the caller is the calling package itself
+ *
+ * @throws SecurityException if the caller is not the calling package
+ */
+ private void enforceCallingPackage(String callingPackage, int callingUid, String message) {
+ int packageUid = -1;
+ PackageManager pm = mApp.getBaseContext().createContextAsUser(
+ UserHandle.getUserHandleForUid(callingUid), 0).getPackageManager();
+ try {
+ packageUid = pm.getPackageUid(callingPackage, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ // packageUid is -1
+ }
+ if (packageUid != callingUid) {
+ throw new SecurityException(message + ": Package " + callingPackage
+ + " does not belong to " + callingUid);
+ }
+ }
+
+ /**
* Make sure the caller has the MODIFY_PHONE_STATE permission.
*
* @throws SecurityException if the caller does not have the required permission
@@ -3796,9 +3861,9 @@
}
final long token = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- ImsManager.getInstance(mApp, getSlotIndexOrException(subId))
- .addRegistrationCallbackForSubscription(c, subId);
+ int slotId = getSlotIndexOrException(subId);
+ verifyImsMmTelConfiguredOrThrow(slotId);
+ ImsManager.getInstance(mApp, slotId).addRegistrationCallbackForSubscription(c, subId);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -3820,7 +3885,6 @@
}
final long token = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone.
ImsManager.getInstance(mApp, getSlotIndexOrException(subId))
.removeRegistrationCallbackForSubscription(c, subId);
} catch (ImsException e) {
@@ -3916,11 +3980,11 @@
throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
"IMS not available on device.");
}
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
final long token = Binder.clearCallingIdentity();
try {
- ImsManager.getInstance(mApp, getSlotIndexOrException(subId))
- .addCapabilitiesCallbackForSubscription(c, subId);
+ int slotId = getSlotIndexOrException(subId);
+ verifyImsMmTelConfiguredOrThrow(slotId);
+ ImsManager.getInstance(mApp, slotId).addCapabilitiesCallbackForSubscription(c, subId);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -3943,7 +4007,6 @@
final long token = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone.
ImsManager.getInstance(mApp, getSlotIndexOrException(subId))
.removeCapabilitiesCallbackForSubscription(c, subId);
} catch (ImsException e) {
@@ -3959,11 +4022,11 @@
@Override
public boolean isCapable(int subId, int capability, int regTech) {
enforceReadPrivilegedPermission("isCapable");
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
final long token = Binder.clearCallingIdentity();
try {
- return ImsManager.getInstance(mApp,
- getSlotIndexOrException(subId)).queryMmTelCapability(capability, regTech);
+ int slotId = getSlotIndexOrException(subId);
+ verifyImsMmTelConfiguredOrThrow(slotId);
+ return ImsManager.getInstance(mApp, slotId).queryMmTelCapability(capability, regTech);
} catch (com.android.ims.ImsException e) {
Log.w(LOG_TAG, "IMS isCapable - service unavailable: " + e.getMessage());
return false;
@@ -4015,6 +4078,7 @@
+ subId + "'");
throw new ServiceSpecificException(ImsException.CODE_ERROR_INVALID_SUBSCRIPTION);
}
+ verifyImsMmTelConfiguredOrThrow(slotId);
ImsManager.getInstance(mApp, slotId).isSupported(capability,
transportType, aBoolean -> {
try {
@@ -4024,6 +4088,8 @@
+ "running. Ignore");
}
});
+ } catch (ImsException e) {
+ throw new ServiceSpecificException(e.getCode());
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -4038,11 +4104,11 @@
TelephonyPermissions.enforceCallingOrSelfReadPrecisePhoneStatePermissionOrCarrierPrivilege(
mApp, subId, "isAdvancedCallingSettingEnabled");
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
final long token = Binder.clearCallingIdentity();
try {
- return ImsManager.getInstance(mApp,
- getSlotIndexOrException(subId)).isEnhanced4gLteModeSettingEnabledByUser();
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify.
+ return ImsManager.getInstance(mApp, slotId).isEnhanced4gLteModeSettingEnabledByUser();
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4056,9 +4122,10 @@
"setAdvancedCallingSettingEnabled");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- ImsManager.getInstance(mApp,
- getSlotIndexOrException(subId)).setEnhanced4gLteModeSetting(isEnabled);
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify. The
+ // new setting will be picked up when the ImsService comes up next if it isn't up.
+ ImsManager.getInstance(mApp, slotId).setEnhanced4gLteModeSetting(isEnabled);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4076,8 +4143,9 @@
mApp, subId, "isVtSettingEnabled");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- return ImsManager.getInstance(mApp, getSlotIndexOrException(subId)).isVtEnabledByUser();
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify.
+ return ImsManager.getInstance(mApp, slotId).isVtEnabledByUser();
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4091,8 +4159,10 @@
"setVtSettingEnabled");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- ImsManager.getInstance(mApp, getSlotIndexOrException(subId)).setVtSetting(isEnabled);
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify. The
+ // new setting will be picked up when the ImsService comes up next if it isn't up.
+ ImsManager.getInstance(mApp, slotId).setVtSetting(isEnabled);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4110,9 +4180,9 @@
mApp, subId, "isVoWiFiSettingEnabled");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- return ImsManager.getInstance(mApp,
- getSlotIndexOrException(subId)).isWfcEnabledByUser();
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify.
+ return ImsManager.getInstance(mApp, slotId).isWfcEnabledByUser();
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4126,8 +4196,55 @@
"setVoWiFiSettingEnabled");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- ImsManager.getInstance(mApp, getSlotIndexOrException(subId)).setWfcSetting(isEnabled);
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify. The
+ // new setting will be picked up when the ImsService comes up next if it isn't up.
+ ImsManager.getInstance(mApp, slotId).setWfcSetting(isEnabled);
+ } catch (ImsException e) {
+ throw new ServiceSpecificException(e.getCode());
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * @return true if the user's setting for Voice over Cross SIM is enabled and false if it is not
+ * Requires carrier privileges or READ_PRECISE_PHONE_STATE permission.
+ * @param subId The subscription to use to check the configuration.
+ */
+ @Override
+ public boolean isCrossSimCallingEnabledByUser(int subId) {
+ TelephonyPermissions.enforceCallingOrSelfReadPrecisePhoneStatePermissionOrCarrierPrivilege(
+ mApp, subId, "isCrossSimCallingEnabledByUser");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify.
+ return ImsManager.getInstance(mApp, slotId).isCrossSimCallingEnabledByUser();
+ } catch (ImsException e) {
+ throw new ServiceSpecificException(e.getCode());
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Sets the user's setting for whether or not Voice over Cross SIM is enabled.
+ * Requires MODIFY_PHONE_STATE permission.
+ * @param subId The subscription to use to check the configuration.
+ * @param isEnabled true if the user's setting for Voice over Cross SIM is enabled,
+ * false otherwise
+ */
+ @Override
+ public void setCrossSimCallingEnabled(int subId, boolean isEnabled) {
+ TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(mApp, subId,
+ "setCrossSimCallingEnabled");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify. The
+ // new setting will be picked up when the ImsService comes up next if it isn't up.
+ ImsManager.getInstance(mApp, slotId).setCrossSimCallingEnabled(isEnabled);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4140,14 +4257,15 @@
* @param subId The subscription to use to check the configuration.
*/
@Override
+
public boolean isVoWiFiRoamingSettingEnabled(int subId) {
TelephonyPermissions.enforceCallingOrSelfReadPrecisePhoneStatePermissionOrCarrierPrivilege(
mApp, subId, "isVoWiFiRoamingSettingEnabled");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- return ImsManager.getInstance(mApp,
- getSlotIndexOrException(subId)).isWfcRoamingEnabledByUser();
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify.
+ return ImsManager.getInstance(mApp, slotId).isWfcRoamingEnabledByUser();
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4161,9 +4279,10 @@
"setVoWiFiRoamingSettingEnabled");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- ImsManager.getInstance(mApp,
- getSlotIndexOrException(subId)).setWfcRoamingSetting(isEnabled);
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify. The
+ // new setting will be picked up when the ImsService comes up next if it isn't up.
+ ImsManager.getInstance(mApp, slotId).setWfcRoamingSetting(isEnabled);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4177,9 +4296,9 @@
"setVoWiFiNonPersistent");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- ImsManager.getInstance(mApp,
- getSlotIndexOrException(subId)).setWfcNonPersistent(isCapable, mode);
+ int slotId = getSlotIndexOrException(subId);
+ // This setting will be ignored if the ImsService isn't up.
+ ImsManager.getInstance(mApp, slotId).setWfcNonPersistent(isCapable, mode);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4197,9 +4316,9 @@
mApp, subId, "getVoWiFiModeSetting");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- return ImsManager.getInstance(mApp,
- getSlotIndexOrException(subId)).getWfcMode(false /*isRoaming*/);
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify.
+ return ImsManager.getInstance(mApp, slotId).getWfcMode(false /*isRoaming*/);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4213,9 +4332,10 @@
"setVoWiFiModeSetting");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- ImsManager.getInstance(mApp,
- getSlotIndexOrException(subId)).setWfcMode(mode, false /*isRoaming*/);
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify. The
+ // new setting will be picked up when the ImsService comes up next if it isn't up.
+ ImsManager.getInstance(mApp, slotId).setWfcMode(mode, false /*isRoaming*/);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4228,9 +4348,9 @@
enforceReadPrivilegedPermission("getVoWiFiRoamingModeSetting");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- return ImsManager.getInstance(mApp,
- getSlotIndexOrException(subId)).getWfcMode(true /*isRoaming*/);
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify.
+ return ImsManager.getInstance(mApp, slotId).getWfcMode(true /*isRoaming*/);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4244,9 +4364,10 @@
"setVoWiFiRoamingModeSetting");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- ImsManager.getInstance(mApp,
- getSlotIndexOrException(subId)).setWfcMode(mode, true /*isRoaming*/);
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify. The
+ // new setting will be picked up when the ImsService comes up next if it isn't up.
+ ImsManager.getInstance(mApp, slotId).setWfcMode(mode, true /*isRoaming*/);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4260,8 +4381,10 @@
"setRttCapabilityEnabled");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- ImsManager.getInstance(mApp, getSlotIndexOrException(subId)).setRttEnabled(isEnabled);
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify. The
+ // new setting will be picked up when the ImsService comes up next if it isn't up.
+ ImsManager.getInstance(mApp, slotId).setRttEnabled(isEnabled);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4279,9 +4402,9 @@
mApp, subId, "isTtyOverVolteEnabled");
final long identity = Binder.clearCallingIdentity();
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- return ImsManager.getInstance(mApp,
- getSlotIndexOrException(subId)).isTtyOnVoLteCapable();
+ int slotId = getSlotIndexOrException(subId);
+ // This setting doesn't require an active ImsService connection, so do not verify.
+ return ImsManager.getInstance(mApp, slotId).isTtyOnVoLteCapable();
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
} finally {
@@ -4298,8 +4421,9 @@
throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
"IMS not available on device.");
}
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
- ImsManager.getInstance(mApp, getSlotIndexOrException(subId))
+ int slotId = getSlotIndexOrException(subId);
+ verifyImsMmTelConfiguredOrThrow(slotId);
+ ImsManager.getInstance(mApp, slotId)
.addProvisioningCallbackForSubscription(callback, subId);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode());
@@ -4316,7 +4440,6 @@
throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
}
try {
- // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
ImsManager.getInstance(mApp, getSlotIndexOrException(subId))
.removeProvisioningCallbackForSubscription(callback, subId);
} catch (ImsException e) {
@@ -4417,8 +4540,10 @@
@Override
public void setImsProvisioningStatusForCapability(int subId, int capability, int tech,
boolean isProvisioned) {
- if (tech < ImsRegistrationImplBase.REGISTRATION_TECH_LTE
- || tech > ImsRegistrationImplBase.REGISTRATION_TECH_NR) {
+ if (tech != ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN
+ && tech != ImsRegistrationImplBase.REGISTRATION_TECH_LTE
+ && tech != ImsRegistrationImplBase.REGISTRATION_TECH_NR
+ && tech != ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM) {
throw new IllegalArgumentException("Registration technology '" + tech + "' is invalid");
}
checkModifyPhoneStatePermission(subId, "setImsProvisioningStatusForCapability");
@@ -4428,8 +4553,8 @@
if (!isImsProvisioningRequired(subId, capability, true)) {
return;
}
- if (tech != ImsRegistrationImplBase.REGISTRATION_TECH_LTE
- && tech != ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN) {
+ if (tech == ImsRegistrationImplBase.REGISTRATION_TECH_NR
+ || tech == ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM) {
loge("setImsProvisioningStatusForCapability: called for technology that does "
+ "not support provisioning - " + tech);
return;
@@ -4482,8 +4607,10 @@
@Override
public boolean getImsProvisioningStatusForCapability(int subId, int capability, int tech) {
- if (tech < ImsRegistrationImplBase.REGISTRATION_TECH_LTE
- || tech > ImsRegistrationImplBase.REGISTRATION_TECH_NR) {
+ if (tech != ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN
+ && tech != ImsRegistrationImplBase.REGISTRATION_TECH_LTE
+ && tech != ImsRegistrationImplBase.REGISTRATION_TECH_NR
+ && tech != ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM) {
throw new IllegalArgumentException("Registration technology '" + tech + "' is invalid");
}
enforceReadPrivilegedPermission("getProvisioningStatusForCapability");
@@ -4494,8 +4621,8 @@
return true;
}
- if (tech != ImsRegistrationImplBase.REGISTRATION_TECH_LTE
- && tech != ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN) {
+ if (tech == ImsRegistrationImplBase.REGISTRATION_TECH_NR
+ || tech == ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM) {
loge("getImsProvisioningStatusForCapability: called for technology that does "
+ "not support provisioning - " + tech);
return true;
@@ -4759,6 +4886,20 @@
}
}
+ /**
+ * Throw an ImsException if the IMS resolver does not have an ImsService configured for MMTEL
+ * for the given slot ID or no ImsResolver instance has been created.
+ * @param slotId The slot ID that the IMS service is created for.
+ * @throws ImsException If there is no ImsService configured for this slot.
+ */
+ private void verifyImsMmTelConfiguredOrThrow(int slotId) throws ImsException {
+ if (mImsResolver == null || !mImsResolver.isImsServiceConfiguredForFeature(slotId,
+ ImsFeature.FEATURE_MMTEL)) {
+ throw new ImsException("This subscription does not support MMTEL over IMS",
+ ImsException.CODE_ERROR_UNSUPPORTED_OPERATION);
+ }
+ }
+
private int getSlotIndexOrException(int subId) throws ImsException {
int slotId = SubscriptionManager.getSlotIndex(subId);
if (!SubscriptionManager.isValidSlotIndex(slotId)) {
@@ -5719,6 +5860,7 @@
+ subId + "'");
throw new ServiceSpecificException(ImsException.CODE_ERROR_INVALID_SUBSCRIPTION);
}
+ verifyImsMmTelConfiguredOrThrow(slotId);
ImsManager.getInstance(mApp, slotId).getImsServiceState(anInteger -> {
try {
callback.accept(anInteger == null ? ImsFeature.STATE_UNAVAILABLE : anInteger);
@@ -5727,6 +5869,8 @@
+ "Ignore");
}
});
+ } catch (ImsException e) {
+ throw new ServiceSpecificException(e.getCode());
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -5823,12 +5967,12 @@
final long identity = Binder.clearCallingIdentity();
try {
if (!isActiveSubscription(subId)) {
- return "";
+ throw new IllegalArgumentException("Invalid Subscription Id: " + subId);
}
final Phone phone = getPhone(subId);
if (phone == null) {
- return "";
+ throw new IllegalArgumentException("Invalid Subscription Id: " + subId);
}
OperatorInfo networkSelection = phone.getSavedNetworkSelection();
return TextUtils.isEmpty(networkSelection.getOperatorNumeric())
@@ -6092,6 +6236,8 @@
.setCallingUid(Binder.getCallingUid())
.setMethod("requestNetworkScan")
.setMinSdkVersionForFine(Build.VERSION_CODES.Q)
+ .setMinSdkVersionForCoarse(Build.VERSION_CODES.Q)
+ .setMinSdkVersionForEnforcement(Build.VERSION_CODES.Q)
.build());
if (locationResult != LocationAccessPolicy.LocationPermissionResult.ALLOWED) {
SecurityException e = checkNetworkRequestForSanitizedLocationAccess(
@@ -6605,6 +6751,7 @@
@Override
public int checkCarrierPrivilegesForPackage(int subId, String pkgName) {
+ enforceReadPrivilegedPermission("checkCarrierPrivilegesForPackage");
if (TextUtils.isEmpty(pkgName)) {
return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
}
@@ -6622,6 +6769,7 @@
@Override
public int checkCarrierPrivilegesForPackageAnyPhone(String pkgName) {
+ // TODO(b/186774706): Remove @RequiresPermission from TelephonyManager API
if (TextUtils.isEmpty(pkgName))
return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
int result = TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED;
@@ -6645,6 +6793,7 @@
@Override
public List<String> getCarrierPackageNamesForIntentAndPhone(Intent intent, int phoneId) {
+ enforceReadPrivilegedPermission("getCarrierPackageNamesForIntentAndPhone");
if (!SubscriptionManager.isValidPhoneId(phoneId)) {
loge("phoneId " + phoneId + " is not valid.");
return null;
@@ -6659,6 +6808,7 @@
@Override
public List<String> getPackagesWithCarrierPrivileges(int phoneId) {
+ enforceReadPrivilegedPermission("getPackagesWithCarrierPrivileges");
PackageManager pm = mApp.getPackageManager();
List<String> privilegedPackages = new ArrayList<>();
List<PackageInfo> packages = null;
@@ -7084,6 +7234,98 @@
}
@Override
+ public void uploadCallComposerPicture(int subscriptionId, String callingPackage,
+ String contentType, ParcelFileDescriptor fd, ResultReceiver callback) {
+ try {
+ if (!Objects.equals(mApp.getPackageManager().getPackageUid(callingPackage, 0),
+ Binder.getCallingUid())) {
+ throw new SecurityException("Invalid package:" + callingPackage);
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new SecurityException("Invalid package:" + callingPackage);
+ }
+ RoleManager rm = mApp.getSystemService(RoleManager.class);
+ List<String> dialerRoleHolders = rm.getRoleHolders(RoleManager.ROLE_DIALER);
+ if (!dialerRoleHolders.contains(callingPackage)) {
+ throw new SecurityException("App must be the dialer role holder to"
+ + " upload a call composer pic");
+ }
+
+ Executors.newSingleThreadExecutor().execute(() -> {
+ ByteArrayOutputStream output = new ByteArrayOutputStream(
+ (int) TelephonyManager.getMaximumCallComposerPictureSize());
+ InputStream input = new ParcelFileDescriptor.AutoCloseInputStream(fd);
+ boolean readUntilEnd = false;
+ int totalBytesRead = 0;
+ byte[] buffer = new byte[16 * 1024];
+ while (true) {
+ int numRead;
+ try {
+ numRead = input.read(buffer);
+ } catch (IOException e) {
+ try {
+ fd.checkError();
+ callback.send(TelephonyManager.CallComposerException.ERROR_INPUT_CLOSED,
+ null);
+ } catch (IOException e1) {
+ // This means that the other side closed explicitly with an error. If this
+ // happens, log and ignore.
+ loge("Remote end of call composer picture pipe closed: " + e1);
+ }
+ break;
+ }
+ if (numRead == -1) {
+ readUntilEnd = true;
+ break;
+ }
+ totalBytesRead += numRead;
+ if (totalBytesRead > TelephonyManager.getMaximumCallComposerPictureSize()) {
+ loge("Too many bytes read for call composer picture: " + totalBytesRead);
+ try {
+ input.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ break;
+ }
+ output.write(buffer, 0, numRead);
+ }
+ // Generally, the remote end will close the file descriptors. The only case where we
+ // close is above, where the picture size is too big.
+
+ try {
+ fd.checkError();
+ } catch (IOException e) {
+ loge("Remote end for call composer closed with an error: " + e);
+ return;
+ }
+
+ if (!readUntilEnd) {
+ loge("Did not finish reading entire image; aborting");
+ return;
+ }
+
+ ImageData imageData = new ImageData(output.toByteArray(), contentType, null);
+ CallComposerPictureManager.getInstance(mApp, subscriptionId).handleUploadToServer(
+ new CallComposerPictureTransfer.Factory() {},
+ imageData,
+ (result) -> {
+ if (result.first != null) {
+ ParcelUuid parcelUuid = new ParcelUuid(result.first);
+ Bundle outputResult = new Bundle();
+ outputResult.putParcelable(
+ TelephonyManager.KEY_CALL_COMPOSER_PICTURE_HANDLE, parcelUuid);
+ callback.send(TelephonyManager.CallComposerException.SUCCESS,
+ outputResult);
+ } else {
+ callback.send(result.second, null);
+ }
+ }
+ );
+ });
+ }
+
+ @Override
public void enableVideoCalling(boolean enable) {
final Phone defaultPhone = getDefaultPhone();
enforceModifyPermission();
@@ -7294,8 +7536,11 @@
@Override
public @Nullable PhoneAccountHandle getPhoneAccountHandleForSubscriptionId(int subscriptionId) {
- enforceReadPrivilegedPermission("getPhoneAccountHandleForSubscriptionId, "
- + "subscriptionId: " + subscriptionId);
+ TelephonyPermissions
+ .enforceCallingOrSelfReadPrivilegedPhoneStatePermissionOrCarrierPrivilege(
+ mApp,
+ subscriptionId,
+ "getPhoneAccountHandleForSubscriptionId, " + "subscriptionId: " + subscriptionId);
final long identity = Binder.clearCallingIdentity();
try {
Phone phone = getPhone(subscriptionId);
@@ -7366,7 +7611,11 @@
if (mUserManager.hasUserRestriction(UserManager.DISALLOW_NETWORK_RESET)) {
return;
}
-
+ Phone defaultPhone = getDefaultPhone();
+ if (defaultPhone != null) {
+ TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+ mApp, getDefaultPhone().getSubId(), "factoryReset");
+ }
final long identity = Binder.clearCallingIdentity();
try {
@@ -7378,7 +7627,7 @@
Phone phone = getPhone(subId);
cleanUpAllowedNetworkTypes(phone, subId);
setDataRoamingEnabled(subId, getDefaultDataRoamingEnabled(subId));
- CarrierInfoManager.deleteAllCarrierKeysForImsiEncryption(mApp);
+ getPhone(subId).resetCarrierKeysForImsiEncryption();
}
// There has been issues when Sms raw table somehow stores orphan
// fragments. They lead to garbled message when new fragments come
@@ -7391,12 +7640,17 @@
ImsManager.getInstance(mApp, slotId).factoryReset();
}
+ if (defaultPhone == null) {
+ return;
+ }
// Erase modem config if erase modem on network setting is enabled.
String configValue = DeviceConfig.getProperty(DeviceConfig.NAMESPACE_TELEPHONY,
RESET_NETWORK_ERASE_MODEM_CONFIG_ENABLED);
if (configValue != null && Boolean.parseBoolean(configValue)) {
- sendEraseModemConfig(getDefaultPhone());
+ sendEraseModemConfig(defaultPhone);
}
+
+ sendEraseDataInSharedPreferences(defaultPhone);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -7570,7 +7824,15 @@
boolean hasCoarsePermission =
coarseLocationResult == LocationAccessPolicy.LocationPermissionResult.ALLOWED;
+ final Phone phone = getPhone(subId);
+ if (phone == null) {
+ return null;
+ }
+
final long identity = Binder.clearCallingIdentity();
+
+ boolean isCallingPackageDataService = phone.getDataServicePackages()
+ .contains(callingPackage);
try {
// isActiveSubId requires READ_PHONE_STATE, which we already check for above
if (!mSubscriptionController.isActiveSubId(subId, callingPackage, callingFeatureId)) {
@@ -7579,16 +7841,11 @@
return null;
}
- final Phone phone = getPhone(subId);
- if (phone == null) {
- return null;
- }
-
ServiceState ss = phone.getServiceState();
// Scrub out the location info in ServiceState depending on what level of access
// the caller has.
- if (hasFinePermission) return ss;
+ if (hasFinePermission || isCallingPackageDataService) return ss;
if (hasCoarsePermission) return ss.createLocationInfoSanitizedCopy(false);
return ss.createLocationInfoSanitizedCopy(true);
} finally {
@@ -9254,7 +9511,7 @@
}
@Override
- public void setMobileDataPolicyEnabledStatus(int subscriptionId, int policy,
+ public void setMobileDataPolicyEnabled(int subscriptionId, int policy,
boolean enabled) {
enforceModifyPermission();
@@ -9484,14 +9741,13 @@
@Override
public boolean isRadioInterfaceCapabilitySupported(
- @NonNull @TelephonyManager.RadioInterfaceCapability String capability) {
+ final @NonNull @TelephonyManager.RadioInterfaceCapability String capability) {
Set<String> radioInterfaceCapabilities =
mRadioInterfaceCapabilities.getCapabilities();
if (radioInterfaceCapabilities == null) {
throw new RuntimeException("radio interface capabilities are not available");
- } else {
- return radioInterfaceCapabilities.contains(capability);
}
+ return radioInterfaceCapabilities.contains(capability);
}
@Override
@@ -9675,8 +9931,8 @@
switch (thermalMitigationAction) {
case ThermalMitigationRequest.THERMAL_MITIGATION_ACTION_DATA_THROTTLING:
thermalMitigationResult =
- handleDataThrottlingRequest(subId,
- thermalMitigationRequest.getDataThrottlingRequest());
+ handleDataThrottlingRequest(subId,
+ thermalMitigationRequest.getDataThrottlingRequest());
break;
case ThermalMitigationRequest.THERMAL_MITIGATION_ACTION_VOICE_ONLY:
if (thermalMitigationRequest.getDataThrottlingRequest() != null) {
@@ -9707,7 +9963,7 @@
Phone phone = getPhone(subId);
if (phone == null) {
thermalMitigationResult =
- TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE;
+ TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE;
break;
}
@@ -9720,7 +9976,7 @@
break;
} else if (isAnyPhoneInEmergencyState()) {
thermalMitigationResult =
- TelephonyManager.THERMAL_MITIGATION_RESULT_INVALID_STATE;
+ TelephonyManager.THERMAL_MITIGATION_RESULT_INVALID_STATE;
break;
}
} else {
@@ -9737,7 +9993,7 @@
break;
}
thermalMitigationResult =
- TelephonyManager.THERMAL_MITIGATION_RESULT_SUCCESS;
+ TelephonyManager.THERMAL_MITIGATION_RESULT_SUCCESS;
break;
default:
throw new IllegalArgumentException("the requested thermalMitigationAction does "
@@ -9898,8 +10154,8 @@
try {
if (!RcsProvisioningMonitor.getInstance()
.registerRcsProvisioningCallback(subId, callback)) {
- throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
- "Service not available for the subscription.");
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_INVALID_SUBSCRIPTION,
+ "Active subscription not found.");
}
} finally {
Binder.restoreCallingIdentity(identity);
@@ -9980,11 +10236,15 @@
IImsConfig configBinder = getImsConfig(getSlotIndex(subId), ImsFeature.FEATURE_RCS);
if (configBinder == null) {
Rlog.e(LOG_TAG, "null result for setRcsClientConfiguration");
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_INVALID_SUBSCRIPTION,
+ "could not find the requested subscription");
} else {
configBinder.setRcsClientConfiguration(rcc);
}
} catch (RemoteException e) {
Rlog.e(LOG_TAG, "fail to setRcsClientConfiguration " + e.getMessage());
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE,
+ "service is temporarily unavailable.");
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -10035,7 +10295,7 @@
@Override
public void sendDeviceToDeviceMessage(int message, int value) {
TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(),
- "setCarrierSingleRegistrationEnabledOverride");
+ "sendDeviceToDeviceMessage");
enforceModifyPermission();
final long identity = Binder.clearCallingIdentity();
@@ -10052,6 +10312,55 @@
}
}
+ /**
+ * Sets the specified device to device transport active.
+ * @param transport The transport to set active.
+ */
+ @Override
+ public void setActiveDeviceToDeviceTransport(@NonNull String transport) {
+ TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(),
+ "setActiveDeviceToDeviceTransport");
+ enforceModifyPermission();
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ TelephonyConnectionService service =
+ TelecomAccountRegistry.getInstance(null).getTelephonyConnectionService();
+ if (service == null) {
+ Rlog.e(LOG_TAG, "setActiveDeviceToDeviceTransport: not in a call.");
+ return;
+ }
+ service.setActiveDeviceToDeviceTransport(transport);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void setDeviceToDeviceForceEnabled(boolean isForceEnabled) {
+ TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(),
+ "setDeviceToDeviceForceEnabled");
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ Arrays.stream(PhoneFactory.getPhones()).forEach(
+ p -> {
+ Phone thePhone = p.getImsPhone();
+ if (thePhone != null && thePhone instanceof ImsPhone) {
+ ImsPhone imsPhone = (ImsPhone) thePhone;
+ CallTracker tracker = imsPhone.getCallTracker();
+ if (tracker != null && tracker instanceof ImsPhoneCallTracker) {
+ ImsPhoneCallTracker imsPhoneCallTracker =
+ (ImsPhoneCallTracker) tracker;
+ imsPhoneCallTracker.setDeviceToDeviceForceEnabled(isForceEnabled);
+ }
+ }
+ }
+ );
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
/**
* Gets the config of RCS VoLTE single registration enabled for the device.
@@ -10141,6 +10450,21 @@
}
/**
+ * Get the EAB capability from the EAB database.
+ */
+ @Override
+ public String getCapabilityFromEab(String contact) {
+ TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(), "getCapabilityFromEab");
+ enforceModifyPermission();
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return EabUtil.getCapabilityFromEab(getDefaultPhone().getContext(), contact);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
* Remove the EAB contacts from the EAB database.
*/
@Override
@@ -10397,24 +10721,6 @@
}
/**
- * Prepare TelephonyManager for an unattended reboot. The reboot is
- * required to be done shortly after the API is invoked.
- */
- @Override
- @TelephonyManager.PrepareUnattendedRebootResult
- public int prepareForUnattendedReboot() {
- WorkSource workSource = getWorkSource(Binder.getCallingUid());
- enforceRebootPermission();
-
- final long identity = Binder.clearCallingIdentity();
- try {
- return (int) sendRequest(CMD_PREPARE_UNATTENDED_REBOOT, null, workSource);
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-
- /**
* Gets the current phone capability.
*
* Requires carrier privileges or READ_PRECISE_PHONE_STATE permission.
@@ -10434,6 +10740,23 @@
}
/**
+ * Prepare TelephonyManager for an unattended reboot. The reboot is
+ * required to be done shortly after the API is invoked.
+ */
+ @Override
+ @TelephonyManager.PrepareUnattendedRebootResult
+ public int prepareForUnattendedReboot() {
+ enforceRebootPermission();
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return (int) sendRequest(CMD_PREPARE_UNATTENDED_REBOOT, null);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
* Request to get the current slicing configuration including URSP rules and
* NSSAIs (configured, allowed and rejected).
*
diff --git a/src/com/android/phone/RcsProvisioningMonitor.java b/src/com/android/phone/RcsProvisioningMonitor.java
index 8f4cd86..23c4c5a 100644
--- a/src/com/android/phone/RcsProvisioningMonitor.java
+++ b/src/com/android/phone/RcsProvisioningMonitor.java
@@ -129,7 +129,6 @@
public void onRoleHoldersChanged(String role, UserHandle user) {
if (RoleManager.ROLE_SMS.equals(role)) {
logv("default messaging application changed.");
- String packageName = getDmaPackageName();
mHandler.sendEmptyMessage(EVENT_DMA_CHANGED);
}
}
@@ -676,6 +675,8 @@
logv("new default messaging application " + mDmaPackageName);
mRcsProvisioningInfos.forEach((k, v) -> {
+ notifyDmaForSub(k, v.getSingleRegistrationCapability());
+
byte[] cachedConfig = v.getConfig();
//clear old callbacks
v.clear();
@@ -803,7 +804,7 @@
intent.setPackage(mDmaPackageName);
intent.putExtra(ProvisioningManager.EXTRA_SUBSCRIPTION_ID, subId);
intent.putExtra(ProvisioningManager.EXTRA_STATUS, capability);
- logv("notify " + intent);
+ logv("notify " + intent + ", sub:" + subId + ", capability:" + capability);
// Only send permission to the default sms app if it has the correct permissions
// except test mode enabled
if (!mTestModeEnabled) {
diff --git a/src/com/android/phone/TelephonyShellCommand.java b/src/com/android/phone/TelephonyShellCommand.java
index 2af0823..dbeb7ce 100644
--- a/src/com/android/phone/TelephonyShellCommand.java
+++ b/src/com/android/phone/TelephonyShellCommand.java
@@ -21,16 +21,21 @@
import static com.android.internal.telephony.d2d.Communicator.MESSAGE_DEVICE_BATTERY_STATE;
import static com.android.internal.telephony.d2d.Communicator.MESSAGE_DEVICE_NETWORK_COVERAGE;
+import android.Manifest;
import android.content.Context;
+import android.net.Uri;
import android.os.Binder;
import android.os.PersistableBundle;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.provider.BlockedNumberContract;
+import android.telephony.BarringInfo;
import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.telephony.TelephonyRegistryManager;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.ImsException;
import android.telephony.ims.RcsContactUceCapability;
@@ -39,6 +44,7 @@
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
+import android.util.SparseArray;
import com.android.ims.rcs.uce.util.FeatureTags;
import com.android.internal.telephony.ITelephony;
@@ -48,6 +54,7 @@
import com.android.internal.telephony.emergency.EmergencyNumberTracker;
import com.android.internal.telephony.util.TelephonyUtils;
import com.android.modules.utils.BasicShellCommandHandler;
+import com.android.phone.callcomposer.CallComposerPictureManager;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -58,6 +65,8 @@
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
/**
* Takes actions based on the adb commands given by "adb shell cmd phone ...". Be careful, no
@@ -72,6 +81,7 @@
private static final boolean VDBG = true;
private static final int DEFAULT_PHONE_ID = 0;
+ private static final String CALL_COMPOSER_SUBCOMMAND = "callcomposer";
private static final String IMS_SUBCOMMAND = "ims";
private static final String NUMBER_VERIFICATION_SUBCOMMAND = "numverify";
private static final String EMERGENCY_CALLBACK_MODE = "emergency-callback-mode";
@@ -81,14 +91,17 @@
private static final String UNATTENDED_REBOOT = "unattended-reboot";
private static final String CARRIER_CONFIG_SUBCOMMAND = "cc";
private static final String DATA_TEST_MODE = "data";
- private static final String DATA_ENABLE = "enable";
- private static final String DATA_DISABLE = "disable";
+ private static final String ENABLE = "enable";
+ private static final String DISABLE = "disable";
+ private static final String QUERY = "query";
+
+ private static final String CALL_COMPOSER_TEST_MODE = "test-mode";
+ private static final String CALL_COMPOSER_SIMULATE_CALL = "simulate-outgoing-call";
+ private static final String CALL_COMPOSER_USER_SETTING = "user-setting";
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.
// This is handy for testing scenarios where CEP data does not exist on a network which does
// support CEP data.
@@ -119,9 +132,15 @@
private static final String D2D_SUBCOMMAND = "d2d";
private static final String D2D_SEND = "send";
+ private static final String D2D_TRANSPORT = "transport";
+ private static final String D2D_SET_DEVICE_SUPPORT = "set-device-support";
+
+ private static final String BARRING_SUBCOMMAND = "barring";
+ private static final String BARRING_SEND_INFO = "send";
private static final String RCS_UCE_COMMAND = "uce";
private static final String UCE_GET_EAB_CONTACT = "get-eab-contact";
+ private static final String UCE_GET_EAB_CAPABILITY = "get-eab-capability";
private static final String UCE_REMOVE_EAB_CONTACT = "remove-eab-contact";
private static final String UCE_GET_DEVICE_ENABLED = "get-device-enabled";
private static final String UCE_SET_DEVICE_ENABLED = "set-device-enabled";
@@ -135,15 +154,23 @@
// Check if a package has carrier privileges on any SIM, regardless of subId/phoneId.
private static final String HAS_CARRIER_PRIVILEGES_COMMAND = "has-carrier-privileges";
+ private static final String DISABLE_PHYSICAL_SUBSCRIPTION = "disable-physical-subscription";
+ private static final String ENABLE_PHYSICAL_SUBSCRIPTION = "enable-physical-subscription";
+
private static final String THERMAL_MITIGATION_COMMAND = "thermal-mitigation";
private static final String ALLOW_THERMAL_MITIGATION_PACKAGE_SUBCOMMAND = "allow-package";
private static final String DISALLOW_THERMAL_MITIGATION_PACKAGE_SUBCOMMAND = "disallow-package";
+ private static final String GET_ALLOWED_NETWORK_TYPES_FOR_USER =
+ "get-allowed-network-types-for-users";
+ private static final String SET_ALLOWED_NETWORK_TYPES_FOR_USER =
+ "set-allowed-network-types-for-users";
// Take advantage of existing methods that already contain permissions checks when possible.
private final ITelephony mInterface;
private SubscriptionManager mSubscriptionManager;
private CarrierConfigManager mCarrierConfigManager;
+ private TelephonyRegistryManager mTelephonyRegistryManager;
private Context mContext;
private enum CcType {
@@ -237,6 +264,8 @@
(CarrierConfigManager) context.getSystemService(Context.CARRIER_CONFIG_SERVICE);
mSubscriptionManager = (SubscriptionManager)
context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+ mTelephonyRegistryManager = (TelephonyRegistryManager)
+ context.getSystemService(Context.TELEPHONY_REGISTRY_SERVICE);
mContext = context;
}
@@ -269,16 +298,27 @@
return handleGbaCommand();
case D2D_SUBCOMMAND:
return handleD2dCommand();
+ case BARRING_SUBCOMMAND:
+ return handleBarringCommand();
case SINGLE_REGISTATION_CONFIG:
return handleSingleRegistrationConfigCommand();
case RESTART_MODEM:
return handleRestartModemCommand();
+ case CALL_COMPOSER_SUBCOMMAND:
+ return handleCallComposerCommand();
case UNATTENDED_REBOOT:
return handleUnattendedReboot();
case HAS_CARRIER_PRIVILEGES_COMMAND:
return handleHasCarrierPrivilegesCommand();
case THERMAL_MITIGATION_COMMAND:
return handleThermalMitigationCommand();
+ case DISABLE_PHYSICAL_SUBSCRIPTION:
+ return handleEnablePhysicalSubscription(false);
+ case ENABLE_PHYSICAL_SUBSCRIPTION:
+ return handleEnablePhysicalSubscription(true);
+ case GET_ALLOWED_NETWORK_TYPES_FOR_USER:
+ case SET_ALLOWED_NETWORK_TYPES_FOR_USER:
+ return handleAllowedNetworkTypesCommand(cmd);
default: {
return handleDefaultCommands(cmd);
}
@@ -313,6 +353,10 @@
pw.println(" Prepare for unattended reboot.");
pw.println(" has-carrier-privileges [package]");
pw.println(" Query carrier privilege status for a package. Prints true or false.");
+ pw.println(" get-allowed-network-types-for-users");
+ pw.println(" Get the Allowed Network Types.");
+ pw.println(" set-allowed-network-types-for-users");
+ pw.println(" Set the Allowed Network Types.");
onHelpIms();
onHelpUce();
onHelpEmergencyNumber();
@@ -322,6 +366,8 @@
onHelpGba();
onHelpSrc();
onHelpD2D();
+ onHelpDisableOrEnablePhysicalSubscription();
+ onHelpAllowedNetworkTypes();
}
private void onHelpD2D() {
@@ -338,6 +384,25 @@
MESSAGE_DEVICE_BATTERY_STATE));
pw.println(" Type: " + MESSAGE_DEVICE_NETWORK_COVERAGE + " - "
+ Communicator.messageToString(MESSAGE_DEVICE_NETWORK_COVERAGE));
+ pw.println(" d2d transport TYPE");
+ pw.println(" Forces the specified D2D transport TYPE to be active. Use the");
+ pw.println(" short class name of the transport; i.e. DtmfTransport or RtpTransport.");
+ pw.println(" d2d set-device-support true/default");
+ pw.println(" true - forces device support to be enabled for D2D.");
+ pw.println(" default - clear any previously set force-enable of D2D, reverting to ");
+ pw.println(" the current device's configuration.");
+ }
+
+ private void onHelpBarring() {
+ PrintWriter pw = getOutPrintWriter();
+ pw.println("Barring Commands:");
+ pw.println(" barring send -s SLOT_ID -b BARRING_TYPE -c IS_CONDITIONALLY_BARRED"
+ + " -t CONDITIONAL_BARRING_TIME_SECS");
+ pw.println(" Notifies of a barring info change for the specified slot id.");
+ pw.println(" BARRING_TYPE: 0 for BARRING_TYPE_NONE");
+ pw.println(" BARRING_TYPE: 1 for BARRING_TYPE_UNCONDITIONAL");
+ pw.println(" BARRING_TYPE: 2 for BARRING_TYPE_CONDITIONAL");
+ pw.println(" BARRING_TYPE: -1 for BARRING_TYPE_UNKNOWN");
}
private void onHelpIms() {
@@ -439,6 +504,15 @@
+ "mitigation.");
}
+ private void onHelpDisableOrEnablePhysicalSubscription() {
+ PrintWriter pw = getOutPrintWriter();
+ pw.println("Disable or enable a physical subscription");
+ pw.println(" disable-physical-subscription SUB_ID");
+ pw.println(" Disable the physical subscription with the provided subId, if allowed.");
+ pw.println(" enable-physical-subscription SUB_ID");
+ pw.println(" Enable the physical subscription with the provided subId, if allowed.");
+ }
+
private void onHelpDataTestMode() {
PrintWriter pw = getOutPrintWriter();
pw.println("Mobile Data Test Mode Commands:");
@@ -558,6 +632,30 @@
pw.println(" is specified, it will choose the default voice SIM slot.");
}
+ private void onHelpAllowedNetworkTypes() {
+ PrintWriter pw = getOutPrintWriter();
+ pw.println("Allowed Network Types Commands:");
+ pw.println(" get-allowed-network-types-for-users [-s SLOT_ID]");
+ pw.println(" Print allowed network types value.");
+ pw.println(" Options are:");
+ pw.println(" -s: The SIM slot ID to read allowed network types value for. If no");
+ pw.println(" option is specified, it will choose the default voice SIM slot.");
+ pw.println(" set-allowed-network-types-for-users [-s SLOT_ID] [NETWORK_TYPES_BITMASK]");
+ pw.println(" Sets allowed network types to NETWORK_TYPES_BITMASK.");
+ pw.println(" Options are:");
+ pw.println(" -s: The SIM slot ID to set allowed network types value for. If no");
+ pw.println(" option is specified, it will choose the default voice SIM slot.");
+ pw.println(" NETWORK_TYPES_BITMASK specifies the new network types value and this type");
+ pw.println(" is bitmask in binary format. Reference the NetworkTypeBitMask");
+ pw.println(" at TelephonyManager.java");
+ pw.println(" For example:");
+ pw.println(" NR only : 10000000000000000000");
+ pw.println(" NR|LTE : 11000001000000000000");
+ pw.println(" NR|LTE|CDMA|EVDO|GSM|WCDMA : 11001111101111111111");
+ pw.println(" LTE|CDMA|EVDO|GSM|WCDMA : 01001111101111111111");
+ pw.println(" LTE only : 01000001000000000000");
+ }
+
private int handleImsCommand() {
String arg = getNextArg();
if (arg == null) {
@@ -575,10 +673,10 @@
case IMS_CLEAR_SERVICE_OVERRIDE: {
return handleImsClearCarrierServiceCommand();
}
- case IMS_ENABLE: {
+ case ENABLE: {
return handleEnableIms();
}
- case IMS_DISABLE: {
+ case DISABLE: {
return handleDisableIms();
}
case IMS_CEP: {
@@ -597,7 +695,7 @@
return 0;
}
switch (arg) {
- case DATA_ENABLE: {
+ case ENABLE: {
try {
mInterface.enableDataConnectivity();
} catch (RemoteException ex) {
@@ -607,7 +705,7 @@
}
break;
}
- case DATA_DISABLE: {
+ case DISABLE: {
try {
mInterface.disableDataConnectivity();
} catch (RemoteException ex) {
@@ -749,6 +847,41 @@
return -1;
}
+ private boolean subIsEsim(int subId) {
+ SubscriptionInfo info = mSubscriptionManager.getActiveSubscriptionInfo(subId);
+ if (info != null) {
+ return info.isEmbedded();
+ }
+ return false;
+ }
+
+ private int handleEnablePhysicalSubscription(boolean enable) {
+ PrintWriter errPw = getErrPrintWriter();
+ int subId = 0;
+ try {
+ subId = Integer.parseInt(getNextArgRequired());
+ } catch (NumberFormatException e) {
+ errPw.println((enable ? "enable" : "disable")
+ + "-physical-subscription requires an integer as a subId.");
+ return -1;
+ }
+ // Verify that the user is allowed to run the command. Only allowed in rooted device in a
+ // non user build.
+ if (Binder.getCallingUid() != Process.ROOT_UID || TelephonyUtils.IS_USER) {
+ errPw.println("cc: Permission denied.");
+ return -1;
+ }
+ // Verify that the subId represents a physical sub
+ if (subIsEsim(subId)) {
+ errPw.println("SubId " + subId + " is not for a physical subscription");
+ return -1;
+ }
+ Log.d(LOG_TAG, (enable ? "Enabling" : "Disabling")
+ + " physical subscription with subId=" + subId);
+ mSubscriptionManager.setUiccApplicationsEnabled(subId, enable);
+ return 0;
+ }
+
private int handleThermalMitigationCommand() {
String arg = getNextArg();
String packageName = getNextArg();
@@ -790,6 +923,12 @@
case D2D_SEND: {
return handleD2dSendCommand();
}
+ case D2D_TRANSPORT: {
+ return handleD2dTransportCommand();
+ }
+ case D2D_SET_DEVICE_SUPPORT: {
+ return handleD2dDeviceSupportedCommand();
+ }
}
return -1;
@@ -797,11 +936,9 @@
private int handleD2dSendCommand() {
PrintWriter errPw = getErrPrintWriter();
- String opt;
int messageType = -1;
int messageValue = -1;
-
String arg = getNextArg();
if (arg == null) {
onHelpD2D();
@@ -837,6 +974,132 @@
return 0;
}
+ private int handleD2dTransportCommand() {
+ PrintWriter errPw = getErrPrintWriter();
+
+ String arg = getNextArg();
+ if (arg == null) {
+ onHelpD2D();
+ return 0;
+ }
+
+ try {
+ mInterface.setActiveDeviceToDeviceTransport(arg);
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, "d2d transport error: " + e.getMessage());
+ errPw.println("Exception: " + e.getMessage());
+ return -1;
+ }
+ return 0;
+ }
+ private int handleBarringCommand() {
+ String arg = getNextArg();
+ if (arg == null) {
+ onHelpBarring();
+ return 0;
+ }
+
+ switch (arg) {
+ case BARRING_SEND_INFO: {
+ return handleBarringSendCommand();
+ }
+ }
+ return -1;
+ }
+
+ private int handleBarringSendCommand() {
+ PrintWriter errPw = getErrPrintWriter();
+ int slotId = getDefaultSlot();
+ int subId = SubscriptionManager.getSubId(slotId)[0];
+ @BarringInfo.BarringServiceInfo.BarringType int barringType =
+ BarringInfo.BarringServiceInfo.BARRING_TYPE_UNCONDITIONAL;
+ boolean isConditionallyBarred = false;
+ int conditionalBarringTimeSeconds = 0;
+
+ String opt;
+ while ((opt = getNextOption()) != null) {
+ switch (opt) {
+ case "-s": {
+ try {
+ slotId = Integer.parseInt(getNextArgRequired());
+ subId = SubscriptionManager.getSubId(slotId)[0];
+ } catch (NumberFormatException e) {
+ errPw.println("barring send requires an integer as a SLOT_ID.");
+ return -1;
+ }
+ break;
+ }
+ case "-b": {
+ try {
+ barringType = Integer.parseInt(getNextArgRequired());
+ if (barringType < -1 || barringType > 2) {
+ throw new NumberFormatException();
+ }
+
+ } catch (NumberFormatException e) {
+ errPw.println("barring send requires an integer in range [-1,2] as "
+ + "a BARRING_TYPE.");
+ return -1;
+ }
+ break;
+ }
+ case "-c": {
+ try {
+ isConditionallyBarred = Boolean.parseBoolean(getNextArgRequired());
+ } catch (Exception e) {
+ errPw.println("barring send requires a boolean after -c indicating"
+ + " conditional barring");
+ return -1;
+ }
+ break;
+ }
+ case "-t": {
+ try {
+ conditionalBarringTimeSeconds = Integer.parseInt(getNextArgRequired());
+ } catch (NumberFormatException e) {
+ errPw.println("barring send requires an integer for time of barring"
+ + " in seconds after -t for conditional barring");
+ return -1;
+ }
+ break;
+ }
+ }
+ }
+ SparseArray<BarringInfo.BarringServiceInfo> barringServiceInfos = new SparseArray<>();
+ BarringInfo.BarringServiceInfo bsi = new BarringInfo.BarringServiceInfo(
+ barringType, isConditionallyBarred, 0, conditionalBarringTimeSeconds);
+ barringServiceInfos.append(0, bsi);
+ BarringInfo barringInfo = new BarringInfo(null, barringServiceInfos);
+ try {
+ mTelephonyRegistryManager.notifyBarringInfoChanged(slotId, subId, barringInfo);
+ } catch (Exception e) {
+ Log.w(LOG_TAG, "barring send error: " + e.getMessage());
+ errPw.println("Exception: " + e.getMessage());
+ return -1;
+ }
+ return 0;
+ }
+
+ private int handleD2dDeviceSupportedCommand() {
+ PrintWriter errPw = getErrPrintWriter();
+
+ String arg = getNextArg();
+ if (arg == null) {
+ onHelpD2D();
+ return 0;
+ }
+
+ boolean isEnabled = "true".equals(arg.toLowerCase());
+ try {
+ mInterface.setDeviceToDeviceForceEnabled(isEnabled);
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, "Error forcing D2D enabled: " + e.getMessage());
+ errPw.println("Exception: " + e.getMessage());
+ return -1;
+ }
+ return 0;
+ }
+
// ims set-ims-service
private int handleImsSetServiceCommand() {
PrintWriter errPw = getErrPrintWriter();
@@ -1825,6 +2088,8 @@
return handleRemovingEabContactCommand();
case UCE_GET_EAB_CONTACT:
return handleGettingEabContactCommand();
+ case UCE_GET_EAB_CAPABILITY:
+ return handleGettingEabCapabilityCommand();
case UCE_GET_DEVICE_ENABLED:
return handleUceGetDeviceEnabledCommand();
case UCE_SET_DEVICE_ENABLED:
@@ -1874,7 +2139,6 @@
String result = "";
try {
result = mInterface.getContactFromEab(phoneNumber);
-
} catch (RemoteException e) {
Log.w(LOG_TAG, "uce get-eab-contact, error " + e.getMessage());
getErrPrintWriter().println("Exception: " + e.getMessage());
@@ -1888,6 +2152,27 @@
return 0;
}
+ private int handleGettingEabCapabilityCommand() {
+ String phoneNumber = getNextArgRequired();
+ if (TextUtils.isEmpty(phoneNumber)) {
+ return -1;
+ }
+ String result = "";
+ try {
+ result = mInterface.getCapabilityFromEab(phoneNumber);
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, "uce get-eab-capability, error " + e.getMessage());
+ getErrPrintWriter().println("Exception: " + e.getMessage());
+ return -1;
+ }
+
+ if (VDBG) {
+ Log.v(LOG_TAG, "uce get-eab-capability, result: " + result);
+ }
+ getOutPrintWriter().println(result);
+ return 0;
+ }
+
private int handleUceGetDeviceEnabledCommand() {
boolean result = false;
try {
@@ -2225,10 +2510,95 @@
return 0;
}
+
+ private void onHelpCallComposer() {
+ PrintWriter pw = getOutPrintWriter();
+ pw.println("Call composer commands");
+ pw.println(" callcomposer test-mode enable|disable|query");
+ pw.println(" Enables or disables test mode for call composer. In test mode, picture");
+ pw.println(" upload/download from carrier servers is disabled, and operations are");
+ pw.println(" performed using emulated local files instead.");
+ pw.println(" callcomposer simulate-outgoing-call [subId] [UUID]");
+ pw.println(" Simulates an outgoing call being placed with the picture ID as");
+ pw.println(" the provided UUID. This triggers storage to the call log.");
+ pw.println(" callcomposer user-setting [subId] enable|disable|query");
+ pw.println(" Enables or disables the user setting for call composer, as set by");
+ pw.println(" TelephonyManager#setCallComposerStatus.");
+ }
+
+ private int handleCallComposerCommand() {
+ String arg = getNextArg();
+ if (arg == null) {
+ onHelpCallComposer();
+ return 0;
+ }
+
+ mContext.enforceCallingPermission(Manifest.permission.MODIFY_PHONE_STATE,
+ "MODIFY_PHONE_STATE required for call composer shell cmds");
+ switch (arg) {
+ case CALL_COMPOSER_TEST_MODE: {
+ String enabledStr = getNextArg();
+ if (ENABLE.equals(enabledStr)) {
+ CallComposerPictureManager.sTestMode = true;
+ } else if (DISABLE.equals(enabledStr)) {
+ CallComposerPictureManager.sTestMode = false;
+ } else if (QUERY.equals(enabledStr)) {
+ getOutPrintWriter().println(CallComposerPictureManager.sTestMode);
+ } else {
+ onHelpCallComposer();
+ return 1;
+ }
+ break;
+ }
+ case CALL_COMPOSER_SIMULATE_CALL: {
+ int subscriptionId = Integer.valueOf(getNextArg());
+ String uuidString = getNextArg();
+ UUID uuid = UUID.fromString(uuidString);
+ CompletableFuture<Uri> storageUriFuture = new CompletableFuture<>();
+ Binder.withCleanCallingIdentity(() -> {
+ CallComposerPictureManager.getInstance(mContext, subscriptionId)
+ .storeUploadedPictureToCallLog(uuid, storageUriFuture::complete);
+ });
+ try {
+ Uri uri = storageUriFuture.get();
+ getOutPrintWriter().println(String.valueOf(uri));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ break;
+ }
+ case CALL_COMPOSER_USER_SETTING: {
+ try {
+ int subscriptionId = Integer.valueOf(getNextArg());
+ String enabledStr = getNextArg();
+ if (ENABLE.equals(enabledStr)) {
+ mInterface.setCallComposerStatus(subscriptionId,
+ TelephonyManager.CALL_COMPOSER_STATUS_ON);
+ } else if (DISABLE.equals(enabledStr)) {
+ mInterface.setCallComposerStatus(subscriptionId,
+ TelephonyManager.CALL_COMPOSER_STATUS_OFF);
+ } else if (QUERY.equals(enabledStr)) {
+ getOutPrintWriter().println(mInterface.getCallComposerStatus(subscriptionId)
+ == TelephonyManager.CALL_COMPOSER_STATUS_ON);
+ } else {
+ onHelpCallComposer();
+ return 1;
+ }
+ } catch (RemoteException e) {
+ e.printStackTrace(getOutPrintWriter());
+ return 1;
+ }
+ break;
+ }
+ }
+ return 0;
+ }
+
private int handleHasCarrierPrivilegesCommand() {
String packageName = getNextArgRequired();
boolean hasCarrierPrivileges;
+ final long token = Binder.clearCallingIdentity();
try {
hasCarrierPrivileges =
mInterface.checkCarrierPrivilegesForPackageAnyPhone(packageName)
@@ -2237,9 +2607,122 @@
Log.w(LOG_TAG, HAS_CARRIER_PRIVILEGES_COMMAND + " exception", e);
getErrPrintWriter().println("Exception: " + e.getMessage());
return -1;
+ } finally {
+ Binder.restoreCallingIdentity(token);
}
getOutPrintWriter().println(hasCarrierPrivileges);
return 0;
}
+
+ private int handleAllowedNetworkTypesCommand(String command) {
+ if (!checkShellUid()) {
+ return -1;
+ }
+
+ PrintWriter errPw = getErrPrintWriter();
+ String tag = command + ": ";
+ String opt;
+ int subId = -1;
+ Log.v(LOG_TAG, command + " start");
+
+ while ((opt = getNextOption()) != null) {
+ if (opt.equals("-s")) {
+ try {
+ subId = slotStringToSubId(tag, getNextArgRequired());
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ errPw.println(tag + "No valid subscription found.");
+ return -1;
+ }
+ } catch (IllegalArgumentException e) {
+ // Missing slot id
+ errPw.println(tag + "SLOT_ID expected after -s.");
+ return -1;
+ }
+ } else {
+ errPw.println(tag + "Unknown option " + opt);
+ return -1;
+ }
+ }
+
+ if (GET_ALLOWED_NETWORK_TYPES_FOR_USER.equals(command)) {
+ return handleGetAllowedNetworkTypesCommand(subId);
+ }
+ if (SET_ALLOWED_NETWORK_TYPES_FOR_USER.equals(command)) {
+ return handleSetAllowedNetworkTypesCommand(subId);
+ }
+ return -1;
+ }
+
+ private int handleGetAllowedNetworkTypesCommand(int subId) {
+ PrintWriter errPw = getErrPrintWriter();
+
+ long result = -1;
+ try {
+ if (mInterface != null) {
+ result = mInterface.getAllowedNetworkTypesForReason(subId,
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER);
+ } else {
+ throw new IllegalStateException("telephony service is null.");
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "getAllowedNetworkTypesForReason RemoteException" + e);
+ errPw.println(GET_ALLOWED_NETWORK_TYPES_FOR_USER + "RemoteException " + e);
+ return -1;
+ }
+
+ getOutPrintWriter().println(TelephonyManager.convertNetworkTypeBitmaskToString(result));
+ return 0;
+ }
+
+ private int handleSetAllowedNetworkTypesCommand(int subId) {
+ PrintWriter errPw = getErrPrintWriter();
+
+ String bitmaskString = getNextArg();
+ if (TextUtils.isEmpty(bitmaskString)) {
+ errPw.println(SET_ALLOWED_NETWORK_TYPES_FOR_USER + " No NETWORK_TYPES_BITMASK");
+ return -1;
+ }
+ long allowedNetworkTypes = convertNetworkTypeBitmaskFromStringToLong(bitmaskString);
+ if (allowedNetworkTypes < 0) {
+ errPw.println(SET_ALLOWED_NETWORK_TYPES_FOR_USER + " No valid NETWORK_TYPES_BITMASK");
+ return -1;
+ }
+ boolean result = false;
+ try {
+ if (mInterface != null) {
+ result = mInterface.setAllowedNetworkTypesForReason(subId,
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER, allowedNetworkTypes);
+ } else {
+ throw new IllegalStateException("telephony service is null.");
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "setAllowedNetworkTypesForReason RemoteException" + e);
+ errPw.println(SET_ALLOWED_NETWORK_TYPES_FOR_USER + " RemoteException " + e);
+ return -1;
+ }
+
+ String resultMessage = SET_ALLOWED_NETWORK_TYPES_FOR_USER + " failed";
+ if (result) {
+ resultMessage = SET_ALLOWED_NETWORK_TYPES_FOR_USER + " completed";
+ }
+ getOutPrintWriter().println(resultMessage);
+ return 0;
+ }
+
+ private long convertNetworkTypeBitmaskFromStringToLong(String bitmaskString) {
+ if (TextUtils.isEmpty(bitmaskString)) {
+ return -1;
+ }
+ if (VDBG) {
+ Log.v(LOG_TAG, "AllowedNetworkTypes:" + bitmaskString
+ + ", length: " + bitmaskString.length());
+ }
+ try {
+ return Long.parseLong(bitmaskString, 2);
+ } catch (NumberFormatException e) {
+ Log.e(LOG_TAG, "AllowedNetworkTypes: " + e);
+ return -1;
+ }
+ }
}
diff --git a/src/com/android/phone/callcomposer/CallComposerPictureManager.java b/src/com/android/phone/callcomposer/CallComposerPictureManager.java
new file mode 100644
index 0000000..efb149e
--- /dev/null
+++ b/src/com/android/phone/callcomposer/CallComposerPictureManager.java
@@ -0,0 +1,382 @@
+/*
+ * 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.callcomposer;
+
+import android.content.Context;
+import android.location.Location;
+import android.net.Uri;
+import android.os.OutcomeReceiver;
+import android.os.PersistableBundle;
+import android.os.UserHandle;
+import android.provider.CallLog;
+import android.telephony.CarrierConfigManager;
+import android.telephony.TelephonyManager;
+import android.telephony.gba.UaSecurityProtocolIdentifier;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.Pair;
+import android.util.SparseArray;
+
+import androidx.annotation.NonNull;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.phone.R;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
+
+public class CallComposerPictureManager {
+ private static final String TAG = CallComposerPictureManager.class.getSimpleName();
+ private static final SparseArray<CallComposerPictureManager> sInstances = new SparseArray<>();
+ private static final String THREE_GPP_BOOTSTRAPPING = "3GPP-bootstrapping";
+
+ public static CallComposerPictureManager getInstance(Context context, int subscriptionId) {
+ synchronized (sInstances) {
+ if (sExecutorService == null) {
+ sExecutorService = Executors.newSingleThreadScheduledExecutor();
+ }
+ if (!sInstances.contains(subscriptionId)) {
+ sInstances.put(subscriptionId,
+ new CallComposerPictureManager(context, subscriptionId));
+ }
+ return sInstances.get(subscriptionId);
+ }
+ }
+
+ @VisibleForTesting
+ public static void clearInstances() {
+ synchronized (sInstances) {
+ sInstances.clear();
+ if (sExecutorService != null) {
+ sExecutorService.shutdown();
+ sExecutorService = null;
+ }
+ }
+ }
+
+ // disabled provisionally until the auth stack is fully operational
+ @VisibleForTesting
+ public static boolean sTestMode = false;
+ public static final String FAKE_SERVER_URL = "https://example.com/FAKE.png";
+ public static final String FAKE_SUBJECT = "This is a test call subject";
+ public static final Location FAKE_LOCATION = new Location("");
+ static {
+ // Meteor Crater, AZ
+ FAKE_LOCATION.setLatitude(35.027526);
+ FAKE_LOCATION.setLongitude(-111.021696);
+ }
+
+ public interface CallLogProxy {
+ default void storeCallComposerPictureAsUser(Context context,
+ UserHandle user,
+ InputStream input,
+ Executor executor,
+ OutcomeReceiver<Uri, CallLog.CallComposerLoggingException> callback) {
+ CallLog.storeCallComposerPicture(context.createContextAsUser(user, 0),
+ input, executor, callback);
+ }
+ }
+
+ private static ScheduledExecutorService sExecutorService = null;
+
+ private final HashMap<UUID, String> mCachedServerUrls = new HashMap<>();
+ private final HashMap<UUID, ImageData> mCachedImages = new HashMap<>();
+ private GbaCredentials mCachedCredentials = null;
+ private final int mSubscriptionId;
+ private final TelephonyManager mTelephonyManager;
+ private final Context mContext;
+ private CallLogProxy mCallLogProxy = new CallLogProxy() {};
+
+ private CallComposerPictureManager(Context context, int subscriptionId) {
+ mContext = context;
+ mSubscriptionId = subscriptionId;
+ mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
+ .createForSubscriptionId(mSubscriptionId);
+ }
+
+ public void handleUploadToServer(CallComposerPictureTransfer.Factory transferFactory,
+ ImageData imageData, Consumer<Pair<UUID, Integer>> callback) {
+ if (sTestMode) {
+ UUID id = UUID.randomUUID();
+ mCachedImages.put(id, imageData);
+ mCachedServerUrls.put(id, FAKE_SERVER_URL);
+ callback.accept(Pair.create(id, TelephonyManager.CallComposerException.SUCCESS));
+ return;
+ }
+
+ PersistableBundle carrierConfig = mTelephonyManager.getCarrierConfig();
+ String uploadUrl = carrierConfig.getString(
+ CarrierConfigManager.KEY_CALL_COMPOSER_PICTURE_SERVER_URL_STRING);
+ if (TextUtils.isEmpty(uploadUrl)) {
+ Log.e(TAG, "Call composer upload URL not configured in carrier config");
+ callback.accept(Pair.create(null,
+ TelephonyManager.CallComposerException.ERROR_UNKNOWN));
+ }
+ UUID id = UUID.randomUUID();
+ imageData.setId(id.toString());
+
+ CallComposerPictureTransfer transfer = transferFactory.create(mContext,
+ mSubscriptionId, uploadUrl, sExecutorService);
+
+ AtomicBoolean hasRetried = new AtomicBoolean(false);
+ transfer.setCallback(new CallComposerPictureTransfer.PictureCallback() {
+ @Override
+ public void onError(int error) {
+ callback.accept(Pair.create(null, error));
+ }
+
+ @Override
+ public void onRetryNeeded(boolean credentialRefresh, long backoffMillis) {
+ if (hasRetried.getAndSet(true)) {
+ Log.e(TAG, "Giving up on image upload after one retry.");
+ callback.accept(Pair.create(null,
+ TelephonyManager.CallComposerException.ERROR_NETWORK_UNAVAILABLE));
+ return;
+ }
+ GbaCredentialsSupplier supplier =
+ (realm, executor) ->
+ getGbaCredentials(credentialRefresh, carrierConfig, executor);
+
+ sExecutorService.schedule(() -> transfer.uploadPicture(imageData, supplier),
+ backoffMillis, TimeUnit.MILLISECONDS);
+ }
+
+ @Override
+ public void onUploadSuccessful(String serverUrl) {
+ mCachedServerUrls.put(id, serverUrl);
+ mCachedImages.put(id, imageData);
+ Log.i(TAG, "Successfully received url: " + serverUrl + " associated with "
+ + id.toString());
+ callback.accept(Pair.create(id, TelephonyManager.CallComposerException.SUCCESS));
+ }
+ });
+
+ transfer.uploadPicture(imageData,
+ (realm, executor) -> getGbaCredentials(false, carrierConfig, executor));
+ }
+
+ public void handleDownloadFromServer(CallComposerPictureTransfer.Factory transferFactory,
+ String remoteUrl, Consumer<Pair<Uri, Integer>> callback) {
+ if (sTestMode) {
+ ImageData imageData = new ImageData(getPlaceholderPictureAsBytes(), "image/png", null);
+ UUID id = UUID.randomUUID();
+ mCachedImages.put(id, imageData);
+ storeUploadedPictureToCallLog(id, uri -> callback.accept(Pair.create(uri, -1)));
+ return;
+ }
+
+ PersistableBundle carrierConfig = mTelephonyManager.getCarrierConfig();
+ CallComposerPictureTransfer transfer = transferFactory.create(mContext,
+ mSubscriptionId, remoteUrl, sExecutorService);
+
+ AtomicBoolean hasRetried = new AtomicBoolean(false);
+ transfer.setCallback(new CallComposerPictureTransfer.PictureCallback() {
+ @Override
+ public void onError(int error) {
+ callback.accept(Pair.create(null, error));
+ }
+
+ @Override
+ public void onRetryNeeded(boolean credentialRefresh, long backoffMillis) {
+ if (hasRetried.getAndSet(true)) {
+ Log.e(TAG, "Giving up on image download after one retry.");
+ callback.accept(Pair.create(null,
+ TelephonyManager.CallComposerException.ERROR_NETWORK_UNAVAILABLE));
+ return;
+ }
+ GbaCredentialsSupplier supplier =
+ (realm, executor) ->
+ getGbaCredentials(credentialRefresh, carrierConfig, executor);
+
+ sExecutorService.schedule(() -> transfer.downloadPicture(supplier),
+ backoffMillis, TimeUnit.MILLISECONDS);
+ }
+
+ @Override
+ public void onDownloadSuccessful(ImageData data) {
+ ByteArrayInputStream imageDataInput =
+ new ByteArrayInputStream(data.getImageBytes());
+ mCallLogProxy.storeCallComposerPictureAsUser(
+ mContext, UserHandle.CURRENT, imageDataInput,
+ sExecutorService,
+ new OutcomeReceiver<Uri, CallLog.CallComposerLoggingException>() {
+ @Override
+ public void onResult(@NonNull Uri result) {
+ callback.accept(Pair.create(
+ result, TelephonyManager.CallComposerException.SUCCESS));
+ }
+
+ @Override
+ public void onError(CallLog.CallComposerLoggingException e) {
+ // Just report an error to the client for now.
+ callback.accept(Pair.create(null,
+ TelephonyManager.CallComposerException.ERROR_UNKNOWN));
+ }
+ });
+ }
+ });
+
+ transfer.downloadPicture(((realm, executor) ->
+ getGbaCredentials(false, carrierConfig, executor)));
+ }
+
+ public void storeUploadedPictureToCallLog(UUID id, Consumer<Uri> callback) {
+ ImageData data = mCachedImages.get(id);
+ if (data == null) {
+ Log.e(TAG, "No picture associated with uuid " + id);
+ callback.accept(null);
+ return;
+ }
+ ByteArrayInputStream imageDataInput =
+ new ByteArrayInputStream(data.getImageBytes());
+ mCallLogProxy.storeCallComposerPictureAsUser(mContext, UserHandle.CURRENT, imageDataInput,
+ sExecutorService,
+ new OutcomeReceiver<Uri, CallLog.CallComposerLoggingException>() {
+ @Override
+ public void onResult(@NonNull Uri result) {
+ callback.accept(result);
+ clearCachedData();
+ }
+
+ @Override
+ public void onError(CallLog.CallComposerLoggingException e) {
+ // Just report an error to the client for now.
+ Log.e(TAG, "Error logging uploaded image: " + e.getErrorCode());
+ callback.accept(null);
+ clearCachedData();
+ }
+ });
+ }
+
+ public String getServerUrlForImageId(UUID id) {
+ return mCachedServerUrls.get(id);
+ }
+
+ public void clearCachedData() {
+ mCachedServerUrls.clear();
+ mCachedImages.clear();
+ }
+
+ private byte[] getPlaceholderPictureAsBytes() {
+ InputStream resourceInput = mContext.getResources().openRawResource(R.drawable.cupcake);
+ try {
+ return readBytes(resourceInput);
+ } catch (Exception e) {
+ return new byte[] {};
+ }
+ }
+
+ private static byte[] readBytes(InputStream inputStream) throws Exception {
+ byte[] buffer = new byte[1024];
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ int numRead;
+ do {
+ numRead = inputStream.read(buffer);
+ if (numRead > 0) output.write(buffer, 0, numRead);
+ } while (numRead > 0);
+ return output.toByteArray();
+ }
+
+ private CompletableFuture<GbaCredentials> getGbaCredentials(
+ boolean forceRefresh, PersistableBundle config, Executor executor) {
+ synchronized (this) {
+ if (!forceRefresh && mCachedCredentials != null) {
+ return CompletableFuture.completedFuture(mCachedCredentials);
+ }
+
+ if (forceRefresh) {
+ mCachedCredentials = null;
+ }
+ }
+
+ UaSecurityProtocolIdentifier securityProtocolIdentifier =
+ new UaSecurityProtocolIdentifier.Builder()
+ .setOrg(config.getInt(
+ CarrierConfigManager.KEY_GBA_UA_SECURITY_ORGANIZATION_INT))
+ .setProtocol(config.getInt(
+ CarrierConfigManager.KEY_GBA_UA_SECURITY_PROTOCOL_INT))
+ .setTlsCipherSuite(config.getInt(
+ CarrierConfigManager.KEY_GBA_UA_TLS_CIPHER_SUITE_INT))
+ .build();
+ CompletableFuture<GbaCredentials> resultFuture = new CompletableFuture<>();
+
+ mTelephonyManager.bootstrapAuthenticationRequest(TelephonyManager.APPTYPE_ISIM,
+ getNafUri(config), securityProtocolIdentifier, forceRefresh, executor,
+ new TelephonyManager.BootstrapAuthenticationCallback() {
+ @Override
+ public void onKeysAvailable(byte[] gbaKey, String transactionId) {
+ GbaCredentials creds = new GbaCredentials(transactionId, gbaKey);
+ synchronized (CallComposerPictureManager.this) {
+ mCachedCredentials = creds;
+ }
+ resultFuture.complete(creds);
+ }
+
+ @Override
+ public void onAuthenticationFailure(int reason) {
+ Log.e(TAG, "GBA auth failed: reason=" + reason);
+ resultFuture.complete(null);
+ }
+ });
+
+ return resultFuture;
+ }
+
+ private static Uri getNafUri(PersistableBundle carrierConfig) {
+ String uploadUriString = carrierConfig.getString(
+ CarrierConfigManager.KEY_CALL_COMPOSER_PICTURE_SERVER_URL_STRING);
+ Uri uploadUri = Uri.parse(uploadUriString);
+ String nafPrefix;
+ switch (carrierConfig.getInt(CarrierConfigManager.KEY_GBA_MODE_INT)) {
+ case CarrierConfigManager.GBA_U:
+ nafPrefix = THREE_GPP_BOOTSTRAPPING + "-uicc";
+ break;
+ case CarrierConfigManager.GBA_DIGEST:
+ nafPrefix = THREE_GPP_BOOTSTRAPPING + "-digest";
+ break;
+ case CarrierConfigManager.GBA_ME:
+ default:
+ nafPrefix = THREE_GPP_BOOTSTRAPPING;
+ }
+ String newAuthority = nafPrefix + "@" + uploadUri.getAuthority();
+ Uri nafUri = new Uri.Builder().scheme(uploadUri.getScheme())
+ .encodedAuthority(newAuthority)
+ .build();
+ Log.i(TAG, "using NAF uri " + nafUri + " for GBA");
+ return nafUri;
+ }
+
+ @VisibleForTesting
+ static ScheduledExecutorService getExecutor() {
+ return sExecutorService;
+ }
+
+ @VisibleForTesting
+ void setCallLogProxy(CallLogProxy proxy) {
+ mCallLogProxy = proxy;
+ }
+}
diff --git a/src/com/android/phone/callcomposer/CallComposerPictureTransfer.java b/src/com/android/phone/callcomposer/CallComposerPictureTransfer.java
new file mode 100644
index 0000000..e4458cd
--- /dev/null
+++ b/src/com/android/phone/callcomposer/CallComposerPictureTransfer.java
@@ -0,0 +1,538 @@
+/*
+ * 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.callcomposer;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
+import android.os.Build;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.http.multipart.MultipartEntity;
+import com.android.internal.http.multipart.Part;
+
+import com.google.common.net.MediaType;
+
+import gov.nist.javax.sip.header.WWWAuthenticate;
+
+import org.xml.sax.InputSource;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Iterator;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+public class CallComposerPictureTransfer {
+ private static final String TAG = CallComposerPictureTransfer.class.getSimpleName();
+ private static final int HTTP_TIMEOUT_MILLIS = 20000;
+ private static final int DEFAULT_BACKOFF_MILLIS = 1000;
+ private static final String THREE_GPP_GBA = "3gpp-gba";
+
+ private static final int ERROR_UNKNOWN = 0;
+ private static final int ERROR_HTTP_TIMEOUT = 1;
+ private static final int ERROR_NO_AUTH_REQUIRED = 2;
+ private static final int ERROR_FORBIDDEN = 3;
+
+ public interface Factory {
+ default CallComposerPictureTransfer create(Context context, int subscriptionId, String url,
+ ExecutorService executorService) {
+ return new CallComposerPictureTransfer(context, subscriptionId, url, executorService);
+ }
+ }
+
+ public interface PictureCallback {
+ default void onError(@TelephonyManager.CallComposerException.CallComposerError int error) {}
+ default void onRetryNeeded(boolean credentialRefresh, long backoffMillis) {}
+ default void onUploadSuccessful(String serverUrl) {}
+ default void onDownloadSuccessful(ImageData data) {}
+ }
+
+ private static class NetworkAccessException extends RuntimeException {
+ final int errorCode;
+
+ NetworkAccessException(int errorCode) {
+ this.errorCode = errorCode;
+ }
+ }
+
+ private final Context mContext;
+ private final int mSubscriptionId;
+ private final String mUrl;
+ private final ExecutorService mExecutorService;
+
+ private PictureCallback mCallback;
+
+ private CallComposerPictureTransfer(Context context, int subscriptionId, String url,
+ ExecutorService executorService) {
+ mContext = context;
+ mSubscriptionId = subscriptionId;
+ mExecutorService = executorService;
+ mUrl = url;
+ }
+
+ @VisibleForTesting
+ public void setCallback(PictureCallback callback) {
+ mCallback = callback;
+ }
+
+ public void uploadPicture(ImageData image,
+ GbaCredentialsSupplier credentialsSupplier) {
+ CompletableFuture<Network> networkFuture = getNetworkForCallComposer();
+ CompletableFuture<WWWAuthenticate> authorizationHeaderFuture = networkFuture
+ .thenApplyAsync((network) -> prepareInitialPost(network, mUrl), mExecutorService)
+ .thenComposeAsync(this::obtainAuthenticateHeader, mExecutorService)
+ .thenApplyAsync(DigestAuthUtils::parseAuthenticateHeader);
+ CompletableFuture<GbaCredentials> credsFuture = authorizationHeaderFuture
+ .thenComposeAsync((header) ->
+ credentialsSupplier.getCredentials(header.getRealm(), mExecutorService),
+ mExecutorService);
+
+ CompletableFuture<String> authorizationFuture =
+ authorizationHeaderFuture.thenCombineAsync(credsFuture,
+ (authHeader, credentials) ->
+ DigestAuthUtils.generateAuthorizationHeader(
+ authHeader, credentials, "POST", mUrl),
+ mExecutorService)
+ .whenCompleteAsync(
+ (authorization, error) -> handleExceptionalCompletion(error),
+ mExecutorService);
+
+ CompletableFuture<String> networkUrlFuture =
+ networkFuture.thenCombineAsync(authorizationFuture,
+ (network, auth) -> sendActualImageUpload(network, auth, image),
+ mExecutorService);
+ networkUrlFuture.thenAcceptAsync((result) -> {
+ if (result != null) mCallback.onUploadSuccessful(result);
+ }, mExecutorService).exceptionally((ex) -> {
+ logException("Exception uploading image" , ex);
+ return null;
+ });
+ }
+
+ public void downloadPicture(GbaCredentialsSupplier credentialsSupplier) {
+ CompletableFuture<Network> networkFuture = getNetworkForCallComposer();
+ CompletableFuture<HttpURLConnection> getConnectionFuture =
+ networkFuture.thenApplyAsync((network) ->
+ prepareImageDownloadRequest(network, mUrl), mExecutorService);
+
+ CompletableFuture<ImageData> immediatelyDownloadableImage = getConnectionFuture
+ .thenComposeAsync((conn) -> {
+ try {
+ if (conn.getResponseCode() != 200) {
+ return CompletableFuture.completedFuture(null);
+ }
+ } catch (IOException e) {
+ logException("IOException obtaining return code: ", e);
+ throw new NetworkAccessException(ERROR_HTTP_TIMEOUT);
+ }
+ return CompletableFuture.completedFuture(downloadImageFromConnection(conn));
+ }, mExecutorService);
+
+ CompletableFuture<ImageData> authRequiredImage = getConnectionFuture
+ .thenComposeAsync((conn) -> {
+ try {
+ if (conn.getResponseCode() == 200) {
+ // handled by above case
+ return CompletableFuture.completedFuture(null);
+ }
+ } catch (IOException e) {
+ logException("IOException obtaining return code: ", e);
+ throw new NetworkAccessException(ERROR_HTTP_TIMEOUT);
+ }
+ CompletableFuture<WWWAuthenticate> authenticateHeaderFuture =
+ obtainAuthenticateHeader(conn)
+ .thenApply(DigestAuthUtils::parseAuthenticateHeader);
+ CompletableFuture<GbaCredentials> credsFuture = authenticateHeaderFuture
+ .thenComposeAsync((header) ->
+ credentialsSupplier.getCredentials(header.getRealm(),
+ mExecutorService), mExecutorService);
+
+ CompletableFuture<String> authorizationFuture = authenticateHeaderFuture
+ .thenCombineAsync(credsFuture, (authHeader, credentials) ->
+ DigestAuthUtils.generateAuthorizationHeader(
+ authHeader, credentials, "GET", mUrl),
+ mExecutorService)
+ .whenCompleteAsync((authorization, error) ->
+ handleExceptionalCompletion(error), mExecutorService);
+
+ return networkFuture.thenCombineAsync(authorizationFuture,
+ this::downloadImageWithAuth, mExecutorService);
+ }, mExecutorService);
+
+ CompletableFuture.allOf(immediatelyDownloadableImage, authRequiredImage).thenRun(() -> {
+ ImageData fromImmediate = immediatelyDownloadableImage.getNow(null);
+ ImageData fromAuth = authRequiredImage.getNow(null);
+ // If both of these are null, that means an error happened somewhere in the chain.
+ // in that case, the error has already been transmitted to the callback, so ignore it.
+ if (fromAuth == null && fromImmediate == null) {
+ Log.w(TAG, "No result from download -- error happened sometime earlier");
+ }
+ if (fromAuth != null) mCallback.onDownloadSuccessful(fromAuth);
+ mCallback.onDownloadSuccessful(fromImmediate);
+ }).exceptionally((ex) -> {
+ logException("Exception downloading image" , ex);
+ return null;
+ });
+ }
+
+ private CompletableFuture<Network> getNetworkForCallComposer() {
+ ConnectivityManager connectivityManager =
+ mContext.getSystemService(ConnectivityManager.class);
+ NetworkRequest pictureNetworkRequest = new NetworkRequest.Builder()
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+ .build();
+ CompletableFuture<Network> resultFuture = new CompletableFuture<>();
+ connectivityManager.requestNetwork(pictureNetworkRequest,
+ new ConnectivityManager.NetworkCallback() {
+ @Override
+ public void onAvailable(@NonNull Network network) {
+ resultFuture.complete(network);
+ }
+ });
+ return resultFuture;
+ }
+
+ private HttpURLConnection prepareInitialPost(Network network, String uploadUrl) {
+ try {
+ HttpURLConnection connection =
+ (HttpURLConnection) network.openConnection(new URL(uploadUrl));
+ connection.setRequestMethod("POST");
+ connection.setInstanceFollowRedirects(false);
+ connection.setConnectTimeout(HTTP_TIMEOUT_MILLIS);
+ connection.setReadTimeout(HTTP_TIMEOUT_MILLIS);
+ connection.setRequestProperty("User-Agent", getUserAgent());
+ return connection;
+ } catch (MalformedURLException e) {
+ Log.e(TAG, "Malformed URL: " + uploadUrl);
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ logException("IOException opening network: ", e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ private HttpURLConnection prepareImageDownloadRequest(Network network, String imageUrl) {
+ try {
+ HttpURLConnection connection =
+ (HttpURLConnection) network.openConnection(new URL(imageUrl));
+ connection.setRequestMethod("GET");
+ connection.setConnectTimeout(HTTP_TIMEOUT_MILLIS);
+ connection.setReadTimeout(HTTP_TIMEOUT_MILLIS);
+ connection.setRequestProperty("User-Agent", getUserAgent());
+ return connection;
+ } catch (MalformedURLException e) {
+ Log.e(TAG, "Malformed URL: " + imageUrl);
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ logException("IOException opening network: ", e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ // Attempts to connect via the supplied connection, expecting a HTTP 401 in response. Throws
+ // an IOException if the connection times out.
+ // After the response is received, returns the WWW-Authenticate header in the following form:
+ // "WWW-Authenticate:<method> <params>"
+ private CompletableFuture<String> obtainAuthenticateHeader(
+ HttpURLConnection connection) {
+ return CompletableFuture.supplyAsync(() -> {
+ int responseCode;
+ try {
+ responseCode = connection.getResponseCode();
+ } catch (IOException e) {
+ logException("IOException obtaining auth header: ", e);
+ throw new NetworkAccessException(ERROR_HTTP_TIMEOUT);
+ }
+ if (responseCode == 204) {
+ throw new NetworkAccessException(ERROR_NO_AUTH_REQUIRED);
+ } else if (responseCode == 403) {
+ throw new NetworkAccessException(ERROR_FORBIDDEN);
+ } else if (responseCode != 401) {
+ Log.w(TAG, "Received unexpected response in auth request, code= "
+ + responseCode);
+ throw new NetworkAccessException(ERROR_UNKNOWN);
+ }
+
+ return connection.getHeaderField(DigestAuthUtils.WWW_AUTHENTICATE);
+ }, mExecutorService);
+ }
+
+ private ImageData downloadImageWithAuth(Network network, String authorization) {
+ HttpURLConnection connection = prepareImageDownloadRequest(network, mUrl);
+ connection.addRequestProperty("Authorization", authorization);
+ return downloadImageFromConnection(connection);
+ }
+
+ private ImageData downloadImageFromConnection(HttpURLConnection conn) {
+ try {
+ if (conn.getResponseCode() != 200) {
+ Log.w(TAG, "Got response code " + conn.getResponseCode() + " when trying"
+ + " to download image");
+ if (conn.getResponseCode() == 401) {
+ Log.i(TAG, "Got 401 even with auth -- key refresh needed?");
+ mCallback.onRetryNeeded(true, 0);
+ }
+ return null;
+ }
+ } catch (IOException e) {
+ logException("IOException obtaining return code: ", e);
+ throw new NetworkAccessException(ERROR_HTTP_TIMEOUT);
+ }
+
+ String contentType = conn.getContentType();
+ ByteArrayOutputStream imageDataOut = new ByteArrayOutputStream();
+ byte[] buffer = new byte[4096];
+ int numRead;
+ try {
+ InputStream is = conn.getInputStream();
+ while (true) {
+ numRead = is.read(buffer);
+ if (numRead < 0) break;
+ imageDataOut.write(buffer, 0, numRead);
+ }
+ } catch (IOException e) {
+ logException("IOException reading from image body: ", e);
+ return null;
+ }
+
+ return new ImageData(imageDataOut.toByteArray(), contentType, null);
+ }
+
+ private void handleExceptionalCompletion(Throwable error) {
+ if (error != null) {
+ if (error.getCause() instanceof NetworkAccessException) {
+ int code = ((NetworkAccessException) error.getCause()).errorCode;
+ if (code == ERROR_UNKNOWN || code == ERROR_HTTP_TIMEOUT) {
+ scheduleRetry();
+ } else {
+ int failureCode;
+ if (code == ERROR_FORBIDDEN) {
+ failureCode = TelephonyManager.CallComposerException
+ .ERROR_AUTHENTICATION_FAILED;
+ } else {
+ failureCode = TelephonyManager.CallComposerException
+ .ERROR_UNKNOWN;
+ }
+ deliverFailure(failureCode);
+ }
+ } else {
+ deliverFailure(TelephonyManager.CallComposerException.ERROR_UNKNOWN);
+ }
+ }
+ }
+
+ private void scheduleRetry() {
+ mCallback.onRetryNeeded(false, DEFAULT_BACKOFF_MILLIS);
+ }
+
+ private void deliverFailure(int code) {
+ mCallback.onError(code);
+ }
+
+ private static Part makeUploadPart(String name, String contentType, String filename,
+ byte[] data) {
+ return new Part() {
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String getContentType() {
+ return contentType;
+ }
+
+ @Override
+ public String getCharSet() {
+ return null;
+ }
+
+ @Override
+ public String getTransferEncoding() {
+ return null;
+ }
+
+ @Override
+ public void sendDispositionHeader(OutputStream out) throws IOException {
+ super.sendDispositionHeader(out);
+ if (filename != null) {
+ String fileNameSuffix = "; filename=\"" + filename + "\"";
+ out.write(fileNameSuffix.getBytes());
+ }
+ }
+
+ @Override
+ protected void sendData(OutputStream out) throws IOException {
+ out.write(data);
+ }
+
+ @Override
+ protected long lengthOfData() throws IOException {
+ return data.length;
+ }
+ };
+ }
+
+ private String sendActualImageUpload(Network network, String authHeader, ImageData image) {
+ Part transactionIdPart = makeUploadPart("tid", "text/plain",
+ null, image.getId().getBytes());
+ Part imageDataPart = makeUploadPart("File", image.getMimeType(),
+ image.getId(), image.getImageBytes());
+
+ MultipartEntity multipartEntity =
+ new MultipartEntity(new Part[] {transactionIdPart, imageDataPart});
+
+ HttpURLConnection connection = prepareInitialPost(network, mUrl);
+ connection.setDoOutput(true);
+ connection.addRequestProperty("Authorization", authHeader);
+ connection.addRequestProperty("Content-Length",
+ String.valueOf(multipartEntity.getContentLength()));
+ connection.addRequestProperty("Content-Type", multipartEntity.getContentType().getValue());
+ connection.addRequestProperty("Accept-Encoding", "*");
+
+ try (OutputStream requestBodyOut = connection.getOutputStream()) {
+ multipartEntity.writeTo(requestBodyOut);
+ } catch (IOException e) {
+ logException("IOException making request to upload image: ", e);
+ throw new RuntimeException(e);
+ }
+
+ try {
+ int response = connection.getResponseCode();
+ Log.i(TAG, "Received response code: " + response
+ + ", message=" + connection.getResponseMessage());
+ if (response == 401 || response == 403) {
+ deliverFailure(TelephonyManager.CallComposerException.ERROR_AUTHENTICATION_FAILED);
+ return null;
+ }
+ if (response == 503) {
+ // TODO: implement parsing of retry-after and schedule a retry with that time
+ scheduleRetry();
+ return null;
+ }
+ if (response != 200) {
+ scheduleRetry();
+ return null;
+ }
+ String responseBody = readResponseBody(connection);
+ String parsedUrl = parseImageUploadResponseXmlForUrl(responseBody);
+ Log.i(TAG, "Parsed URL as upload result: " + parsedUrl);
+ return parsedUrl;
+ } catch (IOException e) {
+ logException("IOException getting response to image upload: ", e);
+ deliverFailure(TelephonyManager.CallComposerException.ERROR_UNKNOWN);
+ return null;
+ }
+ }
+
+ private static String parseImageUploadResponseXmlForUrl(String xmlData) {
+ NamespaceContext ns = new NamespaceContext() {
+ public String getNamespaceURI(String prefix) {
+ return "urn:gsma:params:xml:ns:rcs:rcs:fthttp";
+ }
+
+ public String getPrefix(String uri) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Iterator getPrefixes(String uri) {
+ throw new UnsupportedOperationException();
+ }
+ };
+
+ XPath xPath = XPathFactory.newInstance().newXPath();
+ xPath.setNamespaceContext(ns);
+ StringReader reader = new StringReader(xmlData);
+ try {
+ return (String) xPath.evaluate("/a:file/a:file-info[@type='file']/a:data/@url",
+ new InputSource(reader), XPathConstants.STRING);
+ } catch (XPathExpressionException e) {
+ logException("Error parsing response XML:", e);
+ return null;
+ }
+ }
+
+ private static String readResponseBody(HttpURLConnection connection) {
+ Charset charset = MediaType.parse(connection.getContentType())
+ .charset().or(Charset.defaultCharset());
+ StringBuilder sb = new StringBuilder();
+ try (InputStream inputStream = connection.getInputStream()) {
+ String outLine;
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset));
+ while ((outLine = reader.readLine()) != null) {
+ sb.append(outLine);
+ }
+ } catch (IOException e) {
+ logException("IOException reading request body: ", e);
+ return null;
+ }
+ return sb.toString();
+ }
+
+ private String getUserAgent() {
+ String carrierName = mContext.getSystemService(TelephonyManager.class)
+ .createForSubscriptionId(mSubscriptionId)
+ .getSimOperatorName();
+ String buildId = Build.ID;
+ String buildDate = DateTimeFormatter.ofPattern("yyyy-MM-dd")
+ .withZone(ZoneId.systemDefault())
+ .format(Instant.ofEpochMilli(Build.TIME));
+ String buildVersion = Build.VERSION.RELEASE_OR_CODENAME;
+ String deviceName = Build.DEVICE;
+ return String.format("%s %s %s %s %s %s %s",
+ carrierName, buildId, buildDate, "Android", buildVersion,
+ deviceName, THREE_GPP_GBA);
+
+ }
+
+ private static void logException(String message, Throwable e) {
+ StringWriter log = new StringWriter();
+ log.append(message);
+ log.append(":\n");
+ log.append(e.getMessage());
+ PrintWriter pw = new PrintWriter(log);
+ e.printStackTrace(pw);
+ Log.e(TAG, log.toString());
+ }
+}
diff --git a/src/com/android/phone/callcomposer/DigestAuthUtils.java b/src/com/android/phone/callcomposer/DigestAuthUtils.java
new file mode 100644
index 0000000..2f081f7
--- /dev/null
+++ b/src/com/android/phone/callcomposer/DigestAuthUtils.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2021 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.callcomposer;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.google.common.io.BaseEncoding;
+
+import gov.nist.javax.sip.address.GenericURI;
+import gov.nist.javax.sip.header.Authorization;
+import gov.nist.javax.sip.header.WWWAuthenticate;
+import gov.nist.javax.sip.parser.WWWAuthenticateParser;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.text.ParseException;
+
+public class DigestAuthUtils {
+ private static final String TAG = DigestAuthUtils.class.getSimpleName();
+
+ public static final String WWW_AUTHENTICATE = "www-authenticate";
+ private static final String MD5_ALGORITHM = "md5";
+ private static final int CNONCE_LENGTH_BYTES = 16;
+ private static final String AUTH_QOP = "auth";
+
+ public static WWWAuthenticate parseAuthenticateHeader(String header) {
+ String reconstitutedHeader = WWW_AUTHENTICATE + ": " + header;
+ WWWAuthenticate parsedHeader;
+ try {
+ return (WWWAuthenticate) (new WWWAuthenticateParser(reconstitutedHeader).parse());
+ } catch (ParseException e) {
+ Log.e(TAG, "Error parsing received auth header: " + e);
+ return null;
+ }
+ }
+
+ // Generates the Authorization header for use in future requests to the call composer server.
+ public static String generateAuthorizationHeader(WWWAuthenticate parsedHeader,
+ GbaCredentials credentials, String method, String uri) {
+ if (!TextUtils.isEmpty(parsedHeader.getAlgorithm())
+ && !MD5_ALGORITHM.equals(parsedHeader.getAlgorithm().toLowerCase())) {
+ Log.e(TAG, "This client only supports MD5 auth");
+ return "";
+ }
+ if (!TextUtils.isEmpty(parsedHeader.getQop())
+ && !AUTH_QOP.equals(parsedHeader.getQop().toLowerCase())) {
+ Log.e(TAG, "This client only supports the auth qop");
+ return "";
+ }
+
+ String clientNonce = makeClientNonce();
+
+ String response = computeResponse(parsedHeader.getNonce(), clientNonce, AUTH_QOP,
+ credentials.getTransactionId(), parsedHeader.getRealm(), credentials.getKey(),
+ method, uri);
+
+ Authorization replyHeader = new Authorization();
+ try {
+ replyHeader.setScheme(parsedHeader.getScheme());
+ replyHeader.setUsername(credentials.getTransactionId());
+ replyHeader.setURI(new WorkaroundURI(uri));
+ replyHeader.setRealm(parsedHeader.getRealm());
+ replyHeader.setQop(AUTH_QOP);
+ replyHeader.setNonce(parsedHeader.getNonce());
+ replyHeader.setCNonce(clientNonce);
+ replyHeader.setNonceCount(1);
+ replyHeader.setResponse(response);
+ replyHeader.setOpaque(parsedHeader.getOpaque());
+ replyHeader.setAlgorithm(parsedHeader.getAlgorithm());
+
+ } catch (ParseException e) {
+ Log.e(TAG, "Error parsing while constructing reply header: " + e);
+ return null;
+ }
+
+ return replyHeader.encodeBody();
+ }
+
+ public static String computeResponse(String serverNonce, String clientNonce, String qop,
+ String username, String realm, byte[] password, String method, String uri) {
+ String a1Hash = generateA1Hash(username, realm, password);
+ String a2Hash = generateA2Hash(method, uri);
+
+ // this is the nonce-count; since we don't reuse, it's always 1
+ String nonceCount = "00000001";
+ MessageDigest md5Digest = getMd5Digest();
+
+ String hashInput = String.join(":",
+ a1Hash,
+ serverNonce,
+ nonceCount,
+ clientNonce,
+ qop,
+ a2Hash);
+ md5Digest.update(hashInput.getBytes());
+ return base16(md5Digest.digest());
+ }
+
+ private static String makeClientNonce() {
+ SecureRandom rand = new SecureRandom();
+ byte[] clientNonceBytes = new byte[CNONCE_LENGTH_BYTES];
+ rand.nextBytes(clientNonceBytes);
+ return base16(clientNonceBytes);
+ }
+
+ private static String generateA1Hash(
+ String bootstrapTransactionId, String realm, byte[] gbaKey) {
+ MessageDigest md5Digest = getMd5Digest();
+
+ String gbaKeyBase64 = BaseEncoding.base64().encode(gbaKey);
+ String hashInput = String.join(":", bootstrapTransactionId, realm, gbaKeyBase64);
+ md5Digest.update(hashInput.getBytes());
+
+ return base16(md5Digest.digest());
+ }
+
+ private static String generateA2Hash(String method, String requestUri) {
+ MessageDigest md5Digest = getMd5Digest();
+ md5Digest.update(String.join(":", method, requestUri).getBytes());
+ return base16(md5Digest.digest());
+ }
+
+ private static String base16(byte[] input) {
+ return BaseEncoding.base16().encode(input).toLowerCase();
+ }
+
+ private static MessageDigest getMd5Digest() {
+ try {
+ return MessageDigest.getInstance("MD5");
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException("Couldn't find MD5 algorithm: " + e);
+ }
+ }
+
+ private static class WorkaroundURI extends GenericURI {
+ public WorkaroundURI(String uriString) {
+ this.uriString = uriString;
+ this.scheme = "";
+ }
+ }
+}
diff --git a/src/com/android/phone/callcomposer/GbaCredentials.java b/src/com/android/phone/callcomposer/GbaCredentials.java
new file mode 100644
index 0000000..25a0cd5
--- /dev/null
+++ b/src/com/android/phone/callcomposer/GbaCredentials.java
@@ -0,0 +1,35 @@
+/*
+ * 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.callcomposer;
+
+public class GbaCredentials {
+ private final String mTransactionId;
+ private final byte[] mKey;
+
+ public GbaCredentials(String transactionId, byte[] key) {
+ mTransactionId = transactionId;
+ mKey = key;
+ }
+
+ public String getTransactionId() {
+ return mTransactionId;
+ }
+
+ public byte[] getKey() {
+ return mKey;
+ }
+}
diff --git a/src/com/android/phone/callcomposer/GbaCredentialsSupplier.java b/src/com/android/phone/callcomposer/GbaCredentialsSupplier.java
new file mode 100644
index 0000000..9e5bb6a
--- /dev/null
+++ b/src/com/android/phone/callcomposer/GbaCredentialsSupplier.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2021 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.callcomposer;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
+
+public interface GbaCredentialsSupplier {
+ CompletableFuture<GbaCredentials> getCredentials(String realm, Executor executor);
+}
diff --git a/src/com/android/phone/callcomposer/ImageData.java b/src/com/android/phone/callcomposer/ImageData.java
new file mode 100644
index 0000000..fc93485
--- /dev/null
+++ b/src/com/android/phone/callcomposer/ImageData.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.callcomposer;
+
+public class ImageData {
+ private final byte[] mImageBytes;
+ private final String mMimeType;
+
+ private String mId;
+
+ public ImageData(byte[] imageBytes, String mimeType, String id) {
+ mImageBytes = imageBytes;
+ mMimeType = mimeType;
+ mId = id;
+ }
+
+ public byte[] getImageBytes() {
+ return mImageBytes;
+ }
+
+ public String getMimeType() {
+ return mMimeType;
+ }
+
+ public String getId() {
+ return mId;
+ }
+
+ public void setId(String id) {
+ mId = id;
+ }
+}
diff --git a/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java b/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java
index 57caede..f24e7d6 100644
--- a/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java
+++ b/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java
@@ -26,7 +26,7 @@
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.UserHandle;
-import android.permission.PermissionManager;
+import android.permission.LegacyPermissionManager;
import android.service.euicc.EuiccService;
import android.telephony.euicc.EuiccManager;
import android.util.Log;
@@ -55,14 +55,15 @@
PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DEBUG_TRIAGED_MISSING
| PackageManager.GET_RESOLVED_FILTER;
- private PermissionManager mPermissionManager;
+ private LegacyPermissionManager mPermissionManager;
private boolean mGrantPermissionDone = false;
private ThreadPoolExecutor mExecutor;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mPermissionManager = (PermissionManager) getSystemService(Context.PERMISSION_SERVICE);
+ mPermissionManager = (LegacyPermissionManager) getSystemService(
+ Context.LEGACY_PERMISSION_SERVICE);
mExecutor = new ThreadPoolExecutor(
1 /* corePoolSize */,
1 /* maxPoolSize */,
diff --git a/src/com/android/phone/settings/AccessibilitySettingsFragment.java b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
index 8355fa6..475d878 100644
--- a/src/com/android/phone/settings/AccessibilitySettingsFragment.java
+++ b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
@@ -64,7 +64,7 @@
private final class AccessibilityTelephonyCallback extends TelephonyCallback implements
TelephonyCallback.CallStateListener {
@Override
- public void onCallStateChanged(int state, String incomingNumber) {
+ public void onCallStateChanged(int state) {
if (DBG) Log.d(LOG_TAG, "PhoneStateListener.onCallStateChanged: state=" + state);
Preference pref = getPreferenceScreen().findPreference(BUTTON_TTY_KEY);
if (pref != null) {
@@ -78,7 +78,7 @@
|| (telephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE));
}
}
- };
+ }
private Context mContext;
private AudioManager mAudioManager;
diff --git a/src/com/android/phone/settings/RadioInfo.java b/src/com/android/phone/settings/RadioInfo.java
index 302fc47..b1ab413 100644
--- a/src/com/android/phone/settings/RadioInfo.java
+++ b/src/com/android/phone/settings/RadioInfo.java
@@ -17,6 +17,7 @@
package com.android.phone.settings;
import static android.net.ConnectivityManager.NetworkCallback;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
import android.content.ComponentName;
import android.content.Context;
@@ -56,9 +57,9 @@
import android.telephony.CellSignalStrengthLte;
import android.telephony.CellSignalStrengthWcdma;
import android.telephony.DataSpecificRegistrationInfo;
+import android.telephony.data.NetworkSlicingConfig;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.PhysicalChannelConfig;
-import android.telephony.PreciseCallState;
import android.telephony.RadioAccessFamily;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
@@ -96,8 +97,12 @@
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeoutException;
import java.util.concurrent.TimeUnit;
/**
@@ -211,6 +216,11 @@
private static final int MENU_ITEM_GET_IMS_STATUS = 4;
private static final int MENU_ITEM_TOGGLE_DATA = 5;
+ private static final String CARRIER_PROVISIONING_ACTION =
+ "com.android.phone.settings.CARRIER_PROVISIONING";
+ private static final String TRIGGER_CARRIER_PROVISIONING_ACTION =
+ "com.android.phone.settings.TRIGGER_CARRIER_PROVISIONING";
+
private TextView mDeviceId; //DeviceId is the IMEI in GSM and the MEID in CDMA
private TextView mLine1Number;
private TextView mSubscriptionId;
@@ -241,6 +251,7 @@
private TextView mNrAvailable;
private TextView mNrState;
private TextView mNrFrequency;
+ private TextView mNetworkSlicingConfig;
private EditText mSmsc;
private Switch mRadioPowerOnSwitch;
private Button mCellInfoRefreshRateButton;
@@ -295,6 +306,8 @@
}
};
+ private static final int DEFAULT_TIMEOUT_MS = 1000;
+
// not final because we need to recreate this object to register on a new subId (b/117555407)
private TelephonyCallback mTelephonyCallback = new RadioInfoTelephonyCallback();
private class RadioInfoTelephonyCallback extends TelephonyCallback implements
@@ -305,8 +318,7 @@
TelephonyCallback.CallForwardingIndicatorListener,
TelephonyCallback.CellInfoListener,
TelephonyCallback.SignalStrengthsListener,
- TelephonyCallback.ServiceStateListener,
- TelephonyCallback.PreciseCallStateListener {
+ TelephonyCallback.ServiceStateListener {
@Override
public void onDataConnectionStateChanged(int state, int networkType) {
@@ -320,17 +332,12 @@
}
@Override
- public void onCallStateChanged(int state, String incomingNumber) {
+ public void onCallStateChanged(int state) {
updateNetworkType();
updatePhoneState(state);
}
@Override
- public void onPreciseCallStateChanged(PreciseCallState preciseState) {
- updateNetworkType();
- }
-
- @Override
public void onMessageWaitingIndicatorChanged(boolean mwi) {
mMwiValue = mwi;
updateMessageWaiting();
@@ -496,6 +503,7 @@
mNrState = (TextView) findViewById(R.id.nr_state);
mNrFrequency = (TextView) findViewById(R.id.nr_frequency);
mPhyChanConfig = (TextView) findViewById(R.id.phy_chan_config);
+ mNetworkSlicingConfig = (TextView) findViewById(R.id.network_slicing_config);
// hide 5G stats on devices that don't support 5G
if ((mTelephonyManager.getSupportedRadioAccessFamily()
@@ -510,6 +518,8 @@
mNrState.setVisibility(View.GONE);
((TextView) findViewById(R.id.nr_frequency_label)).setVisibility(View.GONE);
mNrFrequency.setVisibility(View.GONE);
+ ((TextView) findViewById(R.id.network_slicing_config_label)).setVisibility(View.GONE);
+ mNetworkSlicingConfig.setVisibility(View.GONE);
}
mPreferredNetworkType = (Spinner) findViewById(R.id.preferredNetworkType);
@@ -578,11 +588,20 @@
mDnsCheckToggleButton = (Button) findViewById(R.id.dns_check_toggle);
mDnsCheckToggleButton.setOnClickListener(mDnsCheckButtonHandler);
mCarrierProvisioningButton = (Button) findViewById(R.id.carrier_provisioning);
- mCarrierProvisioningButton.setOnClickListener(mCarrierProvisioningButtonHandler);
+ if (!TextUtils.isEmpty(getCarrierProvisioningAppString())) {
+ mCarrierProvisioningButton.setOnClickListener(mCarrierProvisioningButtonHandler);
+ } else {
+ mCarrierProvisioningButton.setEnabled(false);
+ }
+
mTriggerCarrierProvisioningButton = (Button) findViewById(
R.id.trigger_carrier_provisioning);
- mTriggerCarrierProvisioningButton.setOnClickListener(
- mTriggerCarrierProvisioningButtonHandler);
+ if (!TextUtils.isEmpty(getCarrierProvisioningAppString())) {
+ mTriggerCarrierProvisioningButton.setOnClickListener(
+ mTriggerCarrierProvisioningButtonHandler);
+ } else {
+ mTriggerCarrierProvisioningButton.setEnabled(false);
+ }
mOemInfoButton = (Button) findViewById(R.id.oem_info);
mOemInfoButton.setOnClickListener(mOemInfoButtonHandler);
@@ -647,6 +666,8 @@
mCellInfoRefreshRateSpinner.setOnItemSelectedListener(mCellInfoRefreshRateHandler);
//set selection after registering listener to force update
mCellInfoRefreshRateSpinner.setSelection(mCellInfoRefreshRateIndex);
+ // Request cell information update from RIL.
+ mTelephonyManager.setCellInfoListRate(CELL_INFO_REFRESH_RATES[mCellInfoRefreshRateIndex]);
//set selection before registering to prevent update
mPreferredNetworkType.setSelection(mPreferredNetworkTypeResult, true);
@@ -1116,6 +1137,19 @@
mNrState.setText(NetworkRegistrationInfo.nrStateToString(ss.getNrState()));
mNrFrequency.setText(ServiceState.frequencyRangeToString(ss.getNrFrequencyRange()));
}
+
+ Executor simpleExecutor = (r) -> r.run();
+ CompletableFuture<NetworkSlicingConfig> resultFuture = new CompletableFuture<>();
+ mTelephonyManager.getNetworkSlicingConfiguration(simpleExecutor, resultFuture::complete);
+ try {
+ NetworkSlicingConfig networkSlicingConfig =
+ resultFuture.get(DEFAULT_TIMEOUT_MS, MILLISECONDS);
+ mNetworkSlicingConfig.setText(networkSlicingConfig.toString());
+ } catch (ExecutionException | InterruptedException | TimeoutException e) {
+ Log.e(TAG, "Unable to get slicing config: " + e.toString());
+ mNetworkSlicingConfig.setText("Unable to get slicing config.");
+ }
+
}
private void updateProperties() {
@@ -1615,21 +1649,23 @@
}
};
- OnClickListener mCarrierProvisioningButtonHandler = new OnClickListener() {
- public void onClick(View v) {
- final Intent intent = new Intent("com.android.settings.CARRIER_PROVISIONING");
- final ComponentName serviceComponent = ComponentName.unflattenFromString(
- "com.android.omadm.service/.DMIntentReceiver");
+ OnClickListener mCarrierProvisioningButtonHandler = v -> {
+ String carrierProvisioningApp = getCarrierProvisioningAppString();
+ if (!TextUtils.isEmpty(carrierProvisioningApp)) {
+ final Intent intent = new Intent(CARRIER_PROVISIONING_ACTION);
+ final ComponentName serviceComponent =
+ ComponentName.unflattenFromString(carrierProvisioningApp);
intent.setComponent(serviceComponent);
sendBroadcast(intent);
}
};
- OnClickListener mTriggerCarrierProvisioningButtonHandler = new OnClickListener() {
- public void onClick(View v) {
- final Intent intent = new Intent("com.android.settings.TRIGGER_CARRIER_PROVISIONING");
- final ComponentName serviceComponent = ComponentName.unflattenFromString(
- "com.android.omadm.service/.DMIntentReceiver");
+ OnClickListener mTriggerCarrierProvisioningButtonHandler = v -> {
+ String carrierProvisioningApp = getCarrierProvisioningAppString();
+ if (!TextUtils.isEmpty(carrierProvisioningApp)) {
+ final Intent intent = new Intent(TRIGGER_CARRIER_PROVISIONING_ACTION);
+ final ComponentName serviceComponent =
+ ComponentName.unflattenFromString(carrierProvisioningApp);
intent.setComponent(serviceComponent);
sendBroadcast(intent);
}
@@ -1694,6 +1730,19 @@
}
};
+ private String getCarrierProvisioningAppString() {
+ if (mPhone != null) {
+ CarrierConfigManager configManager =
+ mPhone.getContext().getSystemService(CarrierConfigManager.class);
+ PersistableBundle b = configManager.getConfigForSubId(mPhone.getSubId());
+ if (b != null) {
+ return b.getString(
+ CarrierConfigManager.KEY_CARRIER_PROVISIONING_APP_STRING, "");
+ }
+ }
+ return "";
+ }
+
boolean isCbrsSupported() {
return getResources().getBoolean(
com.android.internal.R.bool.config_cbrs_supported);
diff --git a/src/com/android/services/telephony/CdmaConferenceController.java b/src/com/android/services/telephony/CdmaConferenceController.java
index 8523a5f..a076ec8 100644
--- a/src/com/android/services/telephony/CdmaConferenceController.java
+++ b/src/com/android/services/telephony/CdmaConferenceController.java
@@ -20,11 +20,14 @@
import android.telecom.Connection;
import android.telecom.DisconnectCause;
import android.telecom.PhoneAccountHandle;
+import android.util.ArraySet;
import com.android.phone.PhoneUtils;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import java.util.Set;
/**
* Manages CDMA conference calls. CDMA conference calls are much more limited than GSM conference
@@ -83,6 +86,9 @@
private final Handler mHandler = new Handler();
+ private final Set<CdmaConnection> mPendingAddConnections = Collections.synchronizedSet(
+ new ArraySet<>());
+
public CdmaConferenceController(TelephonyConnectionService connectionService) {
mConnectionService = connectionService;
}
@@ -91,7 +97,7 @@
private CdmaConference mConference;
void add(final CdmaConnection connection) {
- if (mCdmaConnections.contains(connection)) {
+ if (mCdmaConnections.contains(connection) || !mPendingAddConnections.add(connection)) {
// Adding a duplicate realistically shouldn't happen.
Log.w(this, "add - connection already tracked; connection=%s", connection);
return;
@@ -140,6 +146,7 @@
private void addInternal(CdmaConnection connection) {
mCdmaConnections.add(connection);
+ mPendingAddConnections.remove(connection);
connection.addTelephonyConnectionListener(mTelephonyConnectionListener);
recalculateConference();
}
diff --git a/src/com/android/services/telephony/DisconnectCauseUtil.java b/src/com/android/services/telephony/DisconnectCauseUtil.java
index e17577f..9c89e9e 100644
--- a/src/com/android/services/telephony/DisconnectCauseUtil.java
+++ b/src/com/android/services/telephony/DisconnectCauseUtil.java
@@ -23,6 +23,7 @@
import android.telecom.DisconnectCause;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
+import android.telephony.ims.ImsReasonInfo;
import com.android.internal.telephony.CallFailCause;
import com.android.internal.telephony.Phone;
@@ -64,13 +65,13 @@
* message and tone.
*
* @param telephonyDisconnectCause The code for the reason for the disconnect.
- * @param telephonyPerciseDisconnectCause The code for the percise reason for the disconnect.
+ * @param telephonyPreciseDisconnectCause The code for the precise reason for the disconnect.
* @param reason Description of the reason for the disconnect, not intended for the user to see..
*/
public static DisconnectCause toTelecomDisconnectCause(
- int telephonyDisconnectCause, int telephonyPerciseDisconnectCause, String reason) {
- return toTelecomDisconnectCause(telephonyDisconnectCause, telephonyPerciseDisconnectCause,
- reason, SubscriptionManager.getDefaultVoicePhoneId());
+ int telephonyDisconnectCause, int telephonyPreciseDisconnectCause, String reason) {
+ return toTelecomDisconnectCause(telephonyDisconnectCause, telephonyPreciseDisconnectCause,
+ reason, SubscriptionManager.getDefaultVoicePhoneId(), null);
}
/**
@@ -84,30 +85,33 @@
public static DisconnectCause toTelecomDisconnectCause(int telephonyDisconnectCause,
String reason, int phoneId) {
return toTelecomDisconnectCause(telephonyDisconnectCause, CallFailCause.NOT_VALID,
- reason, phoneId);
+ reason, phoneId, null);
}
/**
* Converts from a disconnect code in {@link android.telephony.DisconnectCause} into a more
* generic {@link android.telecom.DisconnectCause}.object, possibly populated with a localized
* message and tone for Slot.
- *
* @param telephonyDisconnectCause The code for the reason for the disconnect.
- * @param telephonyPerciseDisconnectCause The code for the percise reason for the disconnect.
- * @param reason Description of the reason for the disconnect, not intended for the user to see..
+ * @param telephonyPreciseDisconnectCause The code for the precise reason for the disconnect.
+ * @param reason Description of the reason for the disconnect, not intended for the user to see.
* @param phoneId To support localized message based on phoneId
+ * @param imsReasonInfo
*/
public static DisconnectCause toTelecomDisconnectCause(
- int telephonyDisconnectCause, int telephonyPerciseDisconnectCause, String reason,
- int phoneId) {
+ int telephonyDisconnectCause, int telephonyPreciseDisconnectCause, String reason,
+ int phoneId, ImsReasonInfo imsReasonInfo) {
Context context = PhoneGlobals.getInstance();
return new DisconnectCause(
toTelecomDisconnectCauseCode(telephonyDisconnectCause),
toTelecomDisconnectCauseLabel(context, telephonyDisconnectCause,
- telephonyPerciseDisconnectCause),
+ telephonyPreciseDisconnectCause),
toTelecomDisconnectCauseDescription(context, telephonyDisconnectCause, phoneId),
toTelecomDisconnectReason(context,telephonyDisconnectCause, reason, phoneId),
- toTelecomDisconnectCauseTone(telephonyDisconnectCause, phoneId));
+ toTelecomDisconnectCauseTone(telephonyDisconnectCause, phoneId),
+ telephonyDisconnectCause,
+ telephonyPreciseDisconnectCause,
+ imsReasonInfo);
}
/**
@@ -233,10 +237,10 @@
* Returns a label for to the disconnect cause to be shown to the user.
*/
private static CharSequence toTelecomDisconnectCauseLabel(
- Context context, int telephonyDisconnectCause, int telephonyPerciseDisconnectCause) {
+ Context context, int telephonyDisconnectCause, int telephonyPreciseDisconnectCause) {
CharSequence label;
- if (telephonyPerciseDisconnectCause != CallFailCause.NOT_VALID) {
- label = getLabelFromPreciseDisconnectCause(context, telephonyPerciseDisconnectCause,
+ if (telephonyPreciseDisconnectCause != CallFailCause.NOT_VALID) {
+ label = getLabelFromPreciseDisconnectCause(context, telephonyPreciseDisconnectCause,
telephonyDisconnectCause);
} else {
label = getLabelFromDisconnectCause(context, telephonyDisconnectCause);
diff --git a/src/com/android/services/telephony/ImsConference.java b/src/com/android/services/telephony/ImsConference.java
index c9f762b..0be927a 100644
--- a/src/com/android/services/telephony/ImsConference.java
+++ b/src/com/android/services/telephony/ImsConference.java
@@ -1074,7 +1074,12 @@
// If the conference is empty and we're supposed to do a local disconnect, do so now.
if (mCarrierConfig.shouldLocalDisconnectEmptyConference()
- && oldParticipantCount > 0 && newParticipantCount == 0) {
+ // If we dropped from > 0 participants to zero
+ // OR if the conference had a single participant and is emulating a standalone
+ // call.
+ && (oldParticipantCount > 0 || !isMultiparty())
+ // AND the CEP says there is nobody left any more.
+ && newParticipantCount == 0) {
Log.i(this, "handleConferenceParticipantsUpdate: empty conference; "
+ "local disconnect.");
onDisconnect();
diff --git a/src/com/android/services/telephony/PstnIncomingCallNotifier.java b/src/com/android/services/telephony/PstnIncomingCallNotifier.java
index ee4baae..4191367 100644
--- a/src/com/android/services/telephony/PstnIncomingCallNotifier.java
+++ b/src/com/android/services/telephony/PstnIncomingCallNotifier.java
@@ -41,6 +41,7 @@
import com.android.internal.telephony.imsphone.ImsPhoneConnection;
import com.android.phone.NumberVerificationManager;
import com.android.phone.PhoneUtils;
+import com.android.phone.callcomposer.CallComposerPictureManager;
import com.android.telephony.Rlog;
import java.util.List;
@@ -297,6 +298,17 @@
if (imsCall != null) {
ImsCallProfile imsCallProfile = imsCall.getCallProfile();
if (imsCallProfile != null) {
+ if (CallComposerPictureManager.sTestMode) {
+ imsCallProfile.setCallExtra(ImsCallProfile.EXTRA_PICTURE_URL,
+ CallComposerPictureManager.FAKE_SERVER_URL);
+ imsCallProfile.setCallExtraInt(ImsCallProfile.EXTRA_PRIORITY,
+ TelecomManager.PRIORITY_URGENT);
+ imsCallProfile.setCallExtra(ImsCallProfile.EXTRA_CALL_SUBJECT,
+ CallComposerPictureManager.FAKE_SUBJECT);
+ imsCallProfile.setCallExtraParcelable(ImsCallProfile.EXTRA_LOCATION,
+ CallComposerPictureManager.FAKE_LOCATION);
+ }
+
extras.putInt(TelecomManager.EXTRA_PRIORITY,
imsCallProfile.getCallExtraInt(ImsCallProfile.EXTRA_PRIORITY));
extras.putString(TelecomManager.EXTRA_CALL_SUBJECT,
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 9226cae..1d749f4 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -588,11 +588,15 @@
private boolean isCarrierVideoPresenceSupported() {
PersistableBundle b =
PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
- boolean carrierConfigEnabled = b != null
- && (b.getBoolean(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL)
- || b.getBoolean(
- CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL));
- return carrierConfigEnabled && isUserContactDiscoverySettingEnabled();
+ if (b == null) return false;
+
+ // If using the new RcsUceAdapter API, this should be true if
+ // KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL is set. If using the old
+ // KEY_USE_RCS_PRESENCE_BOOL key, we have to also check the user setting.
+ return b.getBoolean(
+ CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL)
+ || (b.getBoolean(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL)
+ && isUserContactDiscoverySettingEnabled());
}
/**
@@ -1007,6 +1011,9 @@
return mMmTelManager.isAvailable(ImsRegistrationImplBase.REGISTRATION_TECH_LTE,
MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE)
|| mMmTelManager.isAvailable(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN,
+ MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE)
+ || mMmTelManager.isAvailable(
+ ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM,
MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE);
}
}
@@ -1111,7 +1118,7 @@
}
}
}
- };
+ }
private static TelecomAccountRegistry sInstance;
private final Context mContext;
@@ -1203,7 +1210,7 @@
* @param handle The {@link PhoneAccountHandle}.
* @return {@code True} if merging calls is supported.
*/
- boolean isMergeCallSupported(PhoneAccountHandle handle) {
+ public boolean isMergeCallSupported(PhoneAccountHandle handle) {
synchronized (mAccountsLock) {
for (AccountEntry entry : mAccounts) {
if (entry.getPhoneAccountHandle().equals(handle)) {
@@ -1221,7 +1228,7 @@
* @param handle The {@link PhoneAccountHandle}.
* @return {@code True} if video conferencing is supported.
*/
- boolean isVideoConferencingSupported(PhoneAccountHandle handle) {
+ public boolean isVideoConferencingSupported(PhoneAccountHandle handle) {
synchronized (mAccountsLock) {
for (AccountEntry entry : mAccounts) {
if (entry.getPhoneAccountHandle().equals(handle)) {
@@ -1239,7 +1246,7 @@
* @param handle The {@link PhoneAccountHandle}.
* @return {@code True} if merging of wifi calls is allowed when VoWIFI is disabled.
*/
- boolean isMergeOfWifiCallsAllowedWhenVoWifiOff(final PhoneAccountHandle handle) {
+ public boolean isMergeOfWifiCallsAllowedWhenVoWifiOff(final PhoneAccountHandle handle) {
synchronized (mAccountsLock) {
Optional<AccountEntry> result = mAccounts.stream().filter(
entry -> entry.getPhoneAccountHandle().equals(handle)).findFirst();
@@ -1259,7 +1266,7 @@
* @param handle The {@link PhoneAccountHandle}.
* @return {@code True} if merging IMS calls is supported.
*/
- boolean isMergeImsCallSupported(PhoneAccountHandle handle) {
+ public boolean isMergeImsCallSupported(PhoneAccountHandle handle) {
synchronized (mAccountsLock) {
for (AccountEntry entry : mAccounts) {
if (entry.getPhoneAccountHandle().equals(handle)) {
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 1110de0..18a40cf 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -28,8 +28,11 @@
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.Messenger;
import android.os.PersistableBundle;
import android.telecom.CallAudioState;
+import android.telecom.CallDiagnostics;
+import android.telecom.CallScreeningService;
import android.telecom.Conference;
import android.telecom.Connection;
import android.telecom.ConnectionService;
@@ -46,10 +49,12 @@
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsCallProfile;
+import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ImsStreamMediaProfile;
import android.telephony.ims.RtpHeaderExtension;
import android.telephony.ims.RtpHeaderExtensionType;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.Pair;
import com.android.ims.ImsCall;
@@ -67,9 +72,11 @@
import com.android.internal.telephony.d2d.Communicator;
import com.android.internal.telephony.d2d.DtmfAdapter;
import com.android.internal.telephony.d2d.DtmfTransport;
+import com.android.internal.telephony.d2d.MessageTypeAndValueHelper;
import com.android.internal.telephony.d2d.RtpAdapter;
import com.android.internal.telephony.d2d.RtpTransport;
import com.android.internal.telephony.d2d.Timeouts;
+import com.android.internal.telephony.d2d.TransportProtocol;
import com.android.internal.telephony.gsm.SuppServiceNotification;
import com.android.internal.telephony.imsphone.ImsPhone;
import com.android.internal.telephony.imsphone.ImsPhoneCall;
@@ -79,6 +86,8 @@
import com.android.phone.PhoneGlobals;
import com.android.phone.PhoneUtils;
import com.android.phone.R;
+import com.android.phone.callcomposer.CallComposerPictureManager;
+import com.android.phone.callcomposer.CallComposerPictureTransfer;
import com.android.telephony.Rlog;
import java.util.ArrayList;
@@ -91,6 +100,7 @@
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
/**
* Base class for CDMA and GSM connections.
@@ -129,6 +139,8 @@
private static final int MSG_ON_CONNECTION_EVENT = 19;
private static final int MSG_REDIAL_CONNECTION_CHANGED = 20;
private static final int MSG_REJECT = 21;
+ private static final int MSG_DTMF_DONE = 22;
+ private static final int MSG_MEDIA_ATTRIBUTES_CHANGED = 23;
private static final String JAPAN_COUNTRY_CODE_WITH_PLUS_SIGN = "+81";
private static final String JAPAN_ISO_COUNTRY_CODE = "JP";
@@ -145,39 +157,15 @@
updateState();
break;
case MSG_HANDOVER_STATE_CHANGED:
+ // fall through
case MSG_REDIAL_CONNECTION_CHANGED:
String what = (msg.what == MSG_HANDOVER_STATE_CHANGED)
? "MSG_HANDOVER_STATE_CHANGED" : "MSG_REDIAL_CONNECTION_CHANGED";
- Log.v(TelephonyConnection.this, what);
+ Log.i(TelephonyConnection.this, "Connection changed due to: %s", what);
AsyncResult ar = (AsyncResult) msg.obj;
com.android.internal.telephony.Connection connection =
(com.android.internal.telephony.Connection) ar.result;
- if (connection == null) {
- setDisconnected(DisconnectCauseUtil
- .toTelecomDisconnectCause(DisconnectCause.OUT_OF_NETWORK,
- "handover failure, no connection"));
- close();
- break;
- }
- if (mOriginalConnection != null) {
- if (connection != null &&
- ((connection.getAddress() != null &&
- mOriginalConnection.getAddress() != null &&
- mOriginalConnection.getAddress().equals(connection.getAddress())) ||
- connection.getState() == mOriginalConnection.getStateBeforeHandover())) {
- 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)");
- }
+ onOriginalConnectionRedialed(connection);
break;
case MSG_RINGBACK_TONE:
Log.v(TelephonyConnection.this, "MSG_RINGBACK_TONE");
@@ -244,6 +232,10 @@
setAudioQuality(audioQuality);
break;
+ case MSG_MEDIA_ATTRIBUTES_CHANGED:
+ refreshCodec();
+ break;
+
case MSG_SET_CONFERENCE_PARTICIPANTS:
List<ConferenceParticipant> participants = (List<ConferenceParticipant>) msg.obj;
updateConferenceParticipants(participants);
@@ -299,6 +291,9 @@
int rejectReason = (int) msg.obj;
reject(rejectReason);
break;
+ case MSG_DTMF_DONE:
+ Log.i(this, "MSG_DTMF_DONE");
+ break;
case MSG_SET_CALL_RADIO_TECH:
int vrat = (int) msg.obj;
@@ -337,6 +332,56 @@
}
};
+ private final Messenger mHandlerMessenger = new Messenger(mHandler);
+
+ /**
+ * The underlying telephony Connection has been redialed on a different domain (CS or IMS).
+ * Track the new telephony Connection and set back up appropriate callbacks.
+ * @param connection The new telephony Connection associated with this TelephonyConnection.
+ */
+ @VisibleForTesting
+ public void onOriginalConnectionRedialed(
+ com.android.internal.telephony.Connection connection) {
+ if (connection == null) {
+ setDisconnected(DisconnectCauseUtil
+ .toTelecomDisconnectCause(DisconnectCause.OUT_OF_NETWORK,
+ "handover failure, no connection"));
+ close();
+ return;
+ }
+ if (mOriginalConnection != null) {
+ if ((connection.getAddress() != null
+ && mOriginalConnection.getAddress() != null
+ && mOriginalConnection.getAddress().equals(connection.getAddress()))
+ || connection.getState() == mOriginalConnection.getStateBeforeHandover()) {
+ Log.i(TelephonyConnection.this, "Setting original connection after"
+ + " handover or redial, current original connection="
+ + mOriginalConnection.toString()
+ + ", new original connection="
+ + connection.toString());
+ setOriginalConnection(connection);
+ mWasImsConnection = false;
+ if (mHangupDisconnectCause != DisconnectCause.NOT_VALID) {
+ // A hangup request was initiated during the handover process, so
+ // go ahead and initiate the hangup on the new connection.
+ try {
+ Log.i(TelephonyConnection.this, "user has tried to hangup "
+ + "during handover, retrying hangup.");
+ connection.hangup();
+ } catch (CallStateException e) {
+ // Call state exception may be thrown if the connection was
+ // already disconnected, so just log this case.
+ Log.w(TelephonyConnection.this, "hangup during "
+ + "handover or redial resulted in an exception:" + e);
+ }
+ }
+ }
+ } else {
+ Log.w(TelephonyConnection.this, " mOriginalConnection==null --"
+ + " invalid state (not cleaned up)");
+ }
+ }
+
/**
* Handles {@link SuppServiceNotification}s pertinent to Telephony.
* @param ssn the notification.
@@ -506,7 +551,7 @@
@Override
public void onStateChanged(android.telecom.Connection c, int state) {
- mCommunicator.onStateChanged(c, state);
+ mCommunicator.onStateChanged(c.getTelecomCallId(), state);
}
}
@@ -581,6 +626,12 @@
public void onAudioQualityChanged(int audioQuality) {
mHandler.obtainMessage(MSG_SET_AUDIO_QUALITY, audioQuality).sendToTarget();
}
+
+ @Override
+ public void onMediaAttributesChanged() {
+ mHandler.obtainMessage(MSG_MEDIA_ATTRIBUTES_CHANGED).sendToTarget();
+ }
+
/**
* Handles a change in the state of conference participant(s), as reported by the
* {@link com.android.internal.telephony.Connection}.
@@ -717,6 +768,8 @@
@Override
public void onOriginalConnectionReplaced(
com.android.internal.telephony.Connection newConnection) {
+ Log.i(TelephonyConnection.this, "onOriginalConnectionReplaced; newConn=%s",
+ newConnection);
setOriginalConnection(newConnection);
}
@@ -738,10 +791,20 @@
extensionData.size());
mRtpTransport.onRtpHeaderExtensionsReceived(extensionData);
}
+
+ @Override
+ public void onReceivedDtmfDigit(char digit) {
+ if (mDtmfTransport == null) {
+ return;
+ }
+ Log.i(this, "onReceivedDtmfDigit: digit=%c", digit);
+ mDtmfTransport.onDtmfReceived(digit);
+ }
};
private TelephonyConnectionService mTelephonyConnectionService;
protected com.android.internal.telephony.Connection mOriginalConnection;
+ private Phone mPhoneForEvents;
private Call.State mConnectionState = Call.State.IDLE;
private Bundle mOriginalConnectionExtras = new Bundle();
private boolean mIsStateOverridden = false;
@@ -870,9 +933,18 @@
}
}
+ @VisibleForTesting
+ protected TelephonyConnection() {
+ // Do nothing
+ }
+
@Override
public void onCallEvent(String event, Bundle extras) {
switch (event) {
+ case Connection.EVENT_DEVICE_TO_DEVICE_MESSAGE:
+ // A Device to device message is being sent by a CallDiagnosticService.
+ handleOutgoingDeviceToDeviceMessage(extras);
+ break;
default:
break;
}
@@ -1127,6 +1199,64 @@
}
@Override
+ public void onCallFilteringCompleted(CallFilteringCompletionInfo callFilteringCompletionInfo) {
+ // Check what the call screening service has to say, if it's a system dialer.
+ boolean isAllowedToDisplayPicture;
+ String callScreeningPackage =
+ callFilteringCompletionInfo.getCallScreeningComponent() == null
+ ? null
+ : callFilteringCompletionInfo.getCallScreeningComponent().getPackageName();
+ boolean isResponseFromSystemDialer =
+ Objects.equals(getPhone().getContext()
+ .getSystemService(TelecomManager.class).getSystemDialerPackage(),
+ callScreeningPackage);
+ CallScreeningService.CallResponse callScreeningResponse =
+ callFilteringCompletionInfo.getCallResponse();
+
+ if (isResponseFromSystemDialer && callScreeningResponse != null
+ && callScreeningResponse.getCallComposerAttachmentsToShow() >= 0) {
+ isAllowedToDisplayPicture = (callScreeningResponse.getCallComposerAttachmentsToShow()
+ & CallScreeningService.CallResponse.CALL_COMPOSER_ATTACHMENT_PICTURE) != 0;
+ } else {
+ isAllowedToDisplayPicture = callFilteringCompletionInfo.isInContacts();
+ }
+
+ if (isImsConnection()) {
+ ImsPhone imsPhone = (getPhone() instanceof ImsPhone) ? (ImsPhone) getPhone() : null;
+ if (imsPhone != null
+ && imsPhone.getCallComposerStatus() == TelephonyManager.CALL_COMPOSER_STATUS_ON
+ && !callFilteringCompletionInfo.isBlocked() && isAllowedToDisplayPicture) {
+ ImsPhoneConnection originalConnection = (ImsPhoneConnection) mOriginalConnection;
+ ImsCallProfile profile = originalConnection.getImsCall().getCallProfile();
+ String serverUrl = CallComposerPictureManager.sTestMode
+ ? CallComposerPictureManager.FAKE_SERVER_URL
+ : profile.getCallExtra(ImsCallProfile.EXTRA_PICTURE_URL);
+ if (profile != null
+ && !TextUtils.isEmpty(serverUrl)) {
+ CallComposerPictureManager manager = CallComposerPictureManager
+ .getInstance(getPhone().getContext(), getPhone().getSubId());
+ manager.handleDownloadFromServer(new CallComposerPictureTransfer.Factory() {},
+ serverUrl,
+ (result) -> {
+ if (result.first != null) {
+ Bundle newExtras = new Bundle();
+ newExtras.putParcelable(TelecomManager.EXTRA_PICTURE_URI,
+ result.first);
+ putTelephonyExtras(newExtras);
+ } else {
+ Log.i(this, "Call composer picture download:"
+ + " error=" + result.second);
+ Bundle newExtras = new Bundle();
+ newExtras.putBoolean(TelecomManager.EXTRA_HAS_PICTURE, false);
+ putTelephonyExtras(newExtras);
+ }
+ });
+ }
+ }
+ }
+ }
+
+ @Override
public void handleRttUpgradeResponse(RttTextStream textStream) {
if (!isImsConnection()) {
Log.w(this, "handleRttUpgradeResponse - not in IMS, so RTT cannot be enabled.");
@@ -1140,6 +1270,8 @@
Log.v(this, "performAnswer");
if (isValidRingingCall() && getPhone() != null) {
try {
+ mTelephonyConnectionService.maybeDisconnectCallsOnOtherSubs(
+ getPhoneAccountHandle());
getPhone().acceptCall(videoState);
} catch (CallStateException e) {
Log.e(this, e, "Failed to accept call.");
@@ -1332,7 +1464,7 @@
newProperties = changeBitmask(newProperties, PROPERTY_HIGH_DEF_AUDIO,
hasHighDefAudioProperty());
- newProperties = changeBitmask(newProperties, PROPERTY_WIFI, isWifi());
+ newProperties = changeBitmask(newProperties, PROPERTY_WIFI, isWifi() && !isCrossSimCall());
newProperties = changeBitmask(newProperties, PROPERTY_IS_EXTERNAL_CALL,
isExternalConnection());
newProperties = changeBitmask(newProperties, PROPERTY_HAS_CDMA_VOICE_PRIVACY,
@@ -1344,6 +1476,8 @@
isNetworkIdentifiedEmergencyCall());
newProperties = changeBitmask(newProperties, PROPERTY_IS_ADHOC_CONFERENCE,
isAdhocConferenceCall());
+ newProperties = changeBitmask(newProperties, PROPERTY_CROSS_SIM,
+ isCrossSimCall());
if (getConnectionProperties() != newProperties) {
setTelephonyConnectionProperties(newProperties);
@@ -1403,8 +1537,29 @@
// Subclass can override this to do cleanup.
}
+ public void registerForCallEvents(Phone phone) {
+ if (mPhoneForEvents == phone) {
+ Log.i(this, "registerForCallEvents - same phone requested for"
+ + "registration, ignoring.");
+ return;
+ }
+ Log.i(this, "registerForCallEvents; phone=%s", phone);
+ // Only one Phone should be registered for events at a time.
+ unregisterForCallEvents();
+ phone.registerForPreciseCallStateChanged(mHandler, MSG_PRECISE_CALL_STATE_CHANGED, null);
+ phone.registerForHandoverStateChanged(mHandler, MSG_HANDOVER_STATE_CHANGED, null);
+ phone.registerForRedialConnectionChanged(mHandler, MSG_REDIAL_CONNECTION_CHANGED, null);
+ phone.registerForRingbackTone(mHandler, MSG_RINGBACK_TONE, null);
+ phone.registerForSuppServiceNotification(mHandler, MSG_SUPP_SERVICE_NOTIFY, null);
+ phone.registerForOnHoldTone(mHandler, MSG_ON_HOLD_TONE, null);
+ phone.registerForInCallVoicePrivacyOn(mHandler, MSG_CDMA_VOICE_PRIVACY_ON, null);
+ phone.registerForInCallVoicePrivacyOff(mHandler, MSG_CDMA_VOICE_PRIVACY_OFF, null);
+ mPhoneForEvents = phone;
+ }
+
void setOriginalConnection(com.android.internal.telephony.Connection originalConnection) {
- Log.v(this, "new TelephonyConnection, originalConnection: " + originalConnection);
+ Log.i(this, "setOriginalConnection: TelephonyConnection, originalConnection: "
+ + originalConnection);
if (mOriginalConnection != null && originalConnection != null
&& !originalConnection.isIncoming()
&& originalConnection.getOrigDialString() == null
@@ -1419,17 +1574,8 @@
mOriginalConnectionExtras.clear();
mOriginalConnection = originalConnection;
mOriginalConnection.setTelecomCallId(getTelecomCallId());
- getPhone().registerForPreciseCallStateChanged(
- mHandler, MSG_PRECISE_CALL_STATE_CHANGED, null);
- getPhone().registerForHandoverStateChanged(
- mHandler, MSG_HANDOVER_STATE_CHANGED, null);
- getPhone().registerForRedialConnectionChanged(
- mHandler, MSG_REDIAL_CONNECTION_CHANGED, null);
- getPhone().registerForRingbackTone(mHandler, MSG_RINGBACK_TONE, null);
- getPhone().registerForSuppServiceNotification(mHandler, MSG_SUPP_SERVICE_NOTIFY, null);
- getPhone().registerForOnHoldTone(mHandler, MSG_ON_HOLD_TONE, null);
- getPhone().registerForInCallVoicePrivacyOn(mHandler, MSG_CDMA_VOICE_PRIVACY_ON, null);
- getPhone().registerForInCallVoicePrivacyOff(mHandler, MSG_CDMA_VOICE_PRIVACY_OFF, null);
+ registerForCallEvents(getPhone());
+
mOriginalConnection.addPostDialListener(mPostDialListener);
mOriginalConnection.addListener(mOriginalConnectionListener);
@@ -1469,6 +1615,12 @@
mIsMultiParty = mOriginalConnection.isMultiparty();
Bundle extrasToPut = new Bundle();
+ // Also stash the number verification status in a hidden extra key in the connection.
+ // We do this because a RemoteConnection DOES NOT include a getNumberVerificationStatus
+ // method and we need to be able to pass the number verification status up to Telecom
+ // despite the missing pathway in the RemoteConnectionService API surface.
+ extrasToPut.putInt(Connection.EXTRA_CALLER_NUMBER_VERIFICATION_STATUS,
+ mOriginalConnection.getNumberVerificationStatus());
List<String> extrasToRemove = new ArrayList<>();
if (mOriginalConnection.isActiveCallDisconnectedOnAnswer()) {
extrasToPut.putBoolean(Connection.EXTRA_ANSWERING_DROPS_FG_CALL, true);
@@ -1587,7 +1739,7 @@
Connection.AUDIO_CODEC_NONE);
if (newCodecType != oldCodecType) {
newExtras.putInt(Connection.EXTRA_AUDIO_CODEC, newCodecType);
- Log.i(this, "put audio codec:" + newCodecType);
+ Log.i(this, "refreshCodec: codec changed; old=%d, new=%d", oldCodecType, newCodecType);
changed = true;
}
if (isImsConnection()) {
@@ -1595,7 +1747,8 @@
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);
- Log.i(this, "put audio bitrate:" + newBitrate);
+ Log.i(this, "refreshCodec: bitrate changed; old=%f, new=%f", oldBitrate,
+ newBitrate);
changed = true;
}
@@ -1604,7 +1757,8 @@
0.0f);
if (Math.abs(newBandwidth - oldBandwidth) > THRESHOLD) {
newExtras.putFloat(Connection.EXTRA_AUDIO_CODEC_BANDWIDTH_KHZ, newBandwidth);
- Log.i(this, "put audio bandwidth:" + newBandwidth);
+ Log.i(this, "refreshCodec: bandwidth changed; old=%f, new=%f", oldBandwidth,
+ newBandwidth);
changed = true;
}
} else {
@@ -1615,7 +1769,7 @@
}
if (changed) {
- Log.i(this, "Audio attribute, Codec:"
+ Log.i(this, "refreshCodec: Codec:"
+ newExtras.getInt(Connection.EXTRA_AUDIO_CODEC, Connection.AUDIO_CODEC_NONE)
+ ", Bitrate:"
+ newExtras.getFloat(Connection.EXTRA_AUDIO_CODEC_BITRATE_KBPS, 0.0f)
@@ -1833,8 +1987,12 @@
* - not indicated, then the add participant capability is same as before.
*/
if (isCapable && (mOriginalConnection != null) && !mIsMultiParty) {
- isCapable = mOriginalConnectionExtras.getBoolean(
+ // In case OEMs are still using deprecated value, read it and use it as default value.
+ boolean isCapableFromDeprecatedExtra = mOriginalConnectionExtras.getBoolean(
ImsCallProfile.EXTRA_CONFERENCE_AVAIL, isCapable);
+ isCapable = mOriginalConnectionExtras.getBoolean(
+ ImsCallProfile.EXTRA_EXTENDING_TO_CONFERENCE_SUPPORTED,
+ isCapableFromDeprecatedExtra);
}
return isCapable;
}
@@ -1948,28 +2106,43 @@
}
/**
+ * Sets whether to treat this call as an emergency call or not.
+ * @param shouldTreatAsEmergencyCall
+ */
+ @VisibleForTesting
+ public void setShouldTreatAsEmergencyCall(boolean shouldTreatAsEmergencyCall) {
+ mTreatAsEmergencyCall = shouldTreatAsEmergencyCall;
+ }
+
+ /**
* Un-sets the underlying radio connection.
*/
void clearOriginalConnection() {
if (mOriginalConnection != null) {
- if (getPhone() != null) {
- getPhone().unregisterForPreciseCallStateChanged(mHandler);
- getPhone().unregisterForRingbackTone(mHandler);
- getPhone().unregisterForHandoverStateChanged(mHandler);
- getPhone().unregisterForRedialConnectionChanged(mHandler);
- getPhone().unregisterForDisconnect(mHandler);
- getPhone().unregisterForSuppServiceNotification(mHandler);
- getPhone().unregisterForOnHoldTone(mHandler);
- getPhone().unregisterForInCallVoicePrivacyOn(mHandler);
- getPhone().unregisterForInCallVoicePrivacyOff(mHandler);
- }
+ Log.i(this, "clearOriginalConnection; clearing=%s", mOriginalConnection);
+ unregisterForCallEvents();
mOriginalConnection.removePostDialListener(mPostDialListener);
mOriginalConnection.removeListener(mOriginalConnectionListener);
mOriginalConnection = null;
}
}
- protected void hangup(int telephonyDisconnectCode) {
+ public void unregisterForCallEvents() {
+ if (mPhoneForEvents == null) return;
+ mPhoneForEvents.unregisterForPreciseCallStateChanged(mHandler);
+ mPhoneForEvents.unregisterForRingbackTone(mHandler);
+ mPhoneForEvents.unregisterForHandoverStateChanged(mHandler);
+ mPhoneForEvents.unregisterForRedialConnectionChanged(mHandler);
+ mPhoneForEvents.unregisterForDisconnect(mHandler);
+ mPhoneForEvents.unregisterForSuppServiceNotification(mHandler);
+ mPhoneForEvents.unregisterForOnHoldTone(mHandler);
+ mPhoneForEvents.unregisterForInCallVoicePrivacyOn(mHandler);
+ mPhoneForEvents.unregisterForInCallVoicePrivacyOff(mHandler);
+ mPhoneForEvents = null;
+ }
+
+ @VisibleForTesting
+ public void hangup(int telephonyDisconnectCode) {
if (mOriginalConnection != null) {
mHangupDisconnectCause = telephonyDisconnectCode;
try {
@@ -2166,7 +2339,9 @@
// If extras contain Conference support information,
// then ensure capabilities are updated.
if (mOriginalConnectionExtras.containsKey(
- ImsCallProfile.EXTRA_CONFERENCE_AVAIL)) {
+ ImsCallProfile.EXTRA_EXTENDING_TO_CONFERENCE_SUPPORTED)
+ || mOriginalConnectionExtras.containsKey(
+ ImsCallProfile.EXTRA_CONFERENCE_AVAIL)) {
updateConnectionCapabilities();
}
} else {
@@ -2277,12 +2452,18 @@
+ " -> " + mHangupDisconnectCause);
disconnectCause = mHangupDisconnectCause;
}
+ ImsReasonInfo imsReasonInfo = null;
+ if (isImsConnection()) {
+ ImsPhoneConnection imsPhoneConnection =
+ (ImsPhoneConnection) mOriginalConnection;
+ imsReasonInfo = imsPhoneConnection.getImsReasonInfo();
+ }
setTelephonyConnectionDisconnected(
DisconnectCauseUtil.toTelecomDisconnectCause(
disconnectCause,
preciseDisconnectCause,
mOriginalConnection.getVendorDisconnectCause(),
- getPhone().getPhoneId()));
+ getPhone().getPhoneId(), imsReasonInfo));
close();
}
break;
@@ -2291,7 +2472,7 @@
}
if (mCommunicator != null) {
- mCommunicator.onStateChanged(this, getState());
+ mCommunicator.onStateChanged(getTelecomCallId(), getState());
}
}
}
@@ -2430,6 +2611,16 @@
}
/**
+ * Determines if the current connection is cross sim calling
+ */
+ private boolean isCrossSimCall() {
+ return mOriginalConnection != null
+ && mOriginalConnection.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS
+ && mOriginalConnection instanceof ImsPhoneConnection
+ && ((ImsPhoneConnection) mOriginalConnection).isCrossSimCall();
+ }
+
+ /**
* Determines if the current connection is pullable.
*
* A connection is deemed to be pullable if the original connection capabilities state that it
@@ -2671,8 +2862,10 @@
*/
protected boolean isImsConnection() {
com.android.internal.telephony.Connection originalConnection = getOriginalConnection();
- return originalConnection != null &&
- originalConnection.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS;
+
+ return originalConnection != null
+ && originalConnection.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS
+ && originalConnection instanceof ImsPhoneConnection;
}
/**
@@ -2737,7 +2930,7 @@
}
private void updateStatusHints() {
- if (isWifi() && getPhone() != null) {
+ if (isWifi() && !isCrossSimCall() && getPhone() != null) {
int labelId = isValidRingingCall()
? R.string.status_hint_label_incoming_wifi_call
: R.string.status_hint_label_wifi_call;
@@ -2850,8 +3043,8 @@
PhoneAccountHandle phoneAccountHandle = isIms ? PhoneUtils
.makePstnPhoneAccountHandle(phone.getDefaultPhone())
: PhoneUtils.makePstnPhoneAccountHandle(phone);
- TelecomAccountRegistry telecomAccountRegistry = TelecomAccountRegistry
- .getInstance(getPhone().getContext());
+ TelecomAccountRegistry telecomAccountRegistry = getTelecomAccountRegistry(
+ getPhone().getContext());
boolean isConferencingSupported = telecomAccountRegistry
.isMergeCallSupported(phoneAccountHandle);
boolean isImsConferencingSupported = telecomAccountRegistry
@@ -2860,6 +3053,19 @@
.isVideoConferencingSupported(phoneAccountHandle);
boolean isMergeOfWifiCallsAllowedWhenVoWifiOff = telecomAccountRegistry
.isMergeOfWifiCallsAllowedWhenVoWifiOff(phoneAccountHandle);
+ ImsCall imsCall = isImsConnection()
+ ? ((ImsPhoneConnection) getOriginalConnection()).getImsCall()
+ : null;
+ CarrierConfigManager configManager = (CarrierConfigManager) phone.getContext()
+ .getSystemService(Context.CARRIER_CONFIG_SERVICE);
+ boolean downGradedVideoCall = false;
+ if (configManager != null) {
+ PersistableBundle config = configManager.getConfigForSubId(phone.getSubId());
+ if (config != null) {
+ downGradedVideoCall = config.getBoolean(
+ CarrierConfigManager.KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL);
+ }
+ }
Log.v(this, "refreshConferenceSupported : isConfSupp=%b, isImsConfSupp=%b, " +
"isVidConfSupp=%b, isMergeOfWifiAllowed=%b, " +
@@ -2880,6 +3086,12 @@
} else if (isVideoCall && !mIsCarrierVideoConferencingSupported) {
isConferenceSupported = false;
Log.d(this, "refreshConferenceSupported = false; video conf not supported.");
+ } else if ((imsCall != null) && (imsCall.wasVideoCall() && downGradedVideoCall)
+ && !mIsCarrierVideoConferencingSupported) {
+ isConferenceSupported = false;
+ Log.d(this,
+ "refreshConferenceSupported = false;"
+ + " video conf not supported for downgraded audio call.");
} else if (!isMergeOfWifiCallsAllowedWhenVoWifiOff && isWifi() && !isVoWifiEnabled) {
isConferenceSupported = false;
Log.d(this,
@@ -3047,7 +3259,7 @@
}
/**
- * Set this {@link TelephonyConnection} to a held state.
+ * Set this {@link TelephonyConnection} to a disconnected state.
* <p>
* Note: This should be used instead of
* {@link #setDisconnected(android.telecom.DisconnectCause)} to ensure listeners are notified.
@@ -3197,55 +3409,87 @@
private void maybeConfigureDeviceToDeviceCommunication() {
if (!getPhone().getContext().getResources().getBoolean(
R.bool.config_use_device_to_device_communication)) {
- Log.d(this, "maybeConfigureDeviceToDeviceCommunication: not using D2D.");
+ Log.i(this, "maybeConfigureDeviceToDeviceCommunication: not using D2D.");
+ notifyD2DAvailabilityChanged(false);
return;
}
if (!isImsConnection()) {
- Log.d(this, "maybeConfigureDeviceToDeviceCommunication: not an IMS connection.");
+ Log.i(this, "maybeConfigureDeviceToDeviceCommunication: not an IMS connection.");
+ if (mCommunicator != null) {
+ mCommunicator = null;
+ }
+ notifyD2DAvailabilityChanged(false);
return;
}
- // Implement abstracted out RTP functionality the RTP transport depends on.
- RtpAdapter rtpAdapter = new RtpAdapter() {
- @Override
- public Set<RtpHeaderExtensionType> getAcceptedRtpHeaderExtensions() {
- if (!isImsConnection()) {
- return Collections.EMPTY_SET;
+ if (mTreatAsEmergencyCall || mIsNetworkIdentifiedEmergencyCall) {
+ Log.i(this, "maybeConfigureDeviceToDeviceCommunication: emergency call; no D2D");
+ notifyD2DAvailabilityChanged(false);
+ return;
+ }
+
+ ArrayList<TransportProtocol> supportedTransports = new ArrayList<>(2);
+
+ if (supportsD2DUsingRtp()) {
+ Log.i(this, "maybeConfigureDeviceToDeviceCommunication: carrier supports RTP.");
+ // Implement abstracted out RTP functionality the RTP transport depends on.
+ RtpAdapter rtpAdapter = new RtpAdapter() {
+ @Override
+ public Set<RtpHeaderExtensionType> getAcceptedRtpHeaderExtensions() {
+ ImsPhoneConnection originalConnection =
+ (ImsPhoneConnection) mOriginalConnection;
+ return originalConnection.getAcceptedRtpHeaderExtensions();
}
+
+ @Override
+ public void sendRtpHeaderExtensions(
+ @NonNull Set<RtpHeaderExtension> rtpHeaderExtensions) {
+ Log.i(TelephonyConnection.this, "sendRtpHeaderExtensions: sending: %s",
+ rtpHeaderExtensions.stream()
+ .map(r -> r.toString())
+ .collect(Collectors.joining(",")));
+ ImsPhoneConnection originalConnection =
+ (ImsPhoneConnection) mOriginalConnection;
+ originalConnection.sendRtpHeaderExtensions(rtpHeaderExtensions);
+ }
+ };
+ mRtpTransport = new RtpTransport(rtpAdapter, null /* TODO: not needed yet */, mHandler,
+ supportsSdpNegotiationOfRtpHeaderExtensions());
+ supportedTransports.add(mRtpTransport);
+ }
+ if (supportsD2DUsingDtmf()) {
+ Log.i(this, "maybeConfigureDeviceToDeviceCommunication: carrier supports DTMF.");
+ DtmfAdapter dtmfAdapter = digit -> {
+ Log.i(TelephonyConnection.this, "sendDtmf: send digit %c", digit);
ImsPhoneConnection originalConnection =
(ImsPhoneConnection) mOriginalConnection;
- return originalConnection.getAcceptedRtpHeaderExtensions();
- }
+ Message dtmfComplete = mHandler.obtainMessage(MSG_DTMF_DONE);
+ dtmfComplete.replyTo = mHandlerMessenger;
+ originalConnection.getImsCall().sendDtmf(digit, dtmfComplete);
+ };
+ ContentResolver cr = getPhone().getContext().getContentResolver();
+ mDtmfTransport = new DtmfTransport(dtmfAdapter, new Timeouts.Adapter(cr),
+ Executors.newSingleThreadScheduledExecutor());
+ supportedTransports.add(mDtmfTransport);
+ }
+ if (supportedTransports.size() > 0) {
+ mCommunicator = new Communicator(supportedTransports, this);
+ mD2DCallStateAdapter = new D2DCallStateAdapter(mCommunicator);
+ addTelephonyConnectionListener(mD2DCallStateAdapter);
+ } else {
+ Log.i(this, "maybeConfigureDeviceToDeviceCommunication: no transports; disabled.");
+ notifyD2DAvailabilityChanged(false);
+ }
+ }
- @Override
- public void sendRtpHeaderExtensions(
- @NonNull Set<RtpHeaderExtension> rtpHeaderExtensions) {
- if (!isImsConnection()) {
- Log.w(TelephonyConnection.this, "sendRtpHeaderExtensions: not an ims conn.");
- }
- Log.d(TelephonyConnection.this, "sendRtpHeaderExtensions: sending %d messages",
- rtpHeaderExtensions.size());
- ImsPhoneConnection originalConnection =
- (ImsPhoneConnection) mOriginalConnection;
- originalConnection.sendRtpHeaderExtensions(rtpHeaderExtensions);
- }
- };
- mRtpTransport = new RtpTransport(rtpAdapter, null /* TODO: not needed yet */, mHandler);
-
- DtmfAdapter dtmfAdapter = digit -> {
- if (!isImsConnection()) {
- Log.w(TelephonyConnection.this, "sendDtmf: not an ims conn.");
- }
- Log.d(TelephonyConnection.this, "sendDtmf: send digit %c", digit);
- ImsPhoneConnection originalConnection =
- (ImsPhoneConnection) mOriginalConnection;
- originalConnection.getImsCall().sendDtmf(digit, null /* result msg not needed */);
- };
- ContentResolver cr = getPhone().getContext().getContentResolver();
- mDtmfTransport = new DtmfTransport(dtmfAdapter, new Timeouts.Adapter(cr),
- Executors.newSingleThreadScheduledExecutor());
- mCommunicator = new Communicator(List.of(mRtpTransport, mDtmfTransport), this);
- mD2DCallStateAdapter = new D2DCallStateAdapter(mCommunicator);
- addTelephonyConnectionListener(mD2DCallStateAdapter);
+ /**
+ * Notifies upper layers of the availability of D2D communication.
+ * @param isAvailable {@code true} if D2D is available, {@code false} otherwise.
+ */
+ private void notifyD2DAvailabilityChanged(boolean isAvailable) {
+ Bundle extras = new Bundle();
+ extras.putBoolean(Connection.EXTRA_IS_DEVICE_TO_DEVICE_COMMUNICATION_AVAILABLE,
+ isAvailable);
+ putTelephonyExtras(extras);
}
/**
@@ -3266,14 +3510,57 @@
// Send connection events up to Telecom so that we can relay the messages to a valid
// CallDiagnosticService which is bound.
for (Communicator.Message msg : messages) {
+ Integer dcMsgType = MessageTypeAndValueHelper.MSG_TYPE_TO_DC_MSG_TYPE.getValue(
+ msg.getType());
+ if (dcMsgType == null) {
+ // Invalid msg type, skip.
+ continue;
+ }
+
+ Integer dcMsgValue;
+ switch (msg.getType()) {
+ case CallDiagnostics.MESSAGE_CALL_AUDIO_CODEC:
+ dcMsgValue = MessageTypeAndValueHelper.CODEC_TO_DC_CODEC.getValue(
+ msg.getValue());
+ break;
+ case CallDiagnostics.MESSAGE_CALL_NETWORK_TYPE:
+ dcMsgValue = MessageTypeAndValueHelper.RAT_TYPE_TO_DC_NETWORK_TYPE.getValue(
+ msg.getValue());
+ break;
+ case CallDiagnostics.MESSAGE_DEVICE_BATTERY_STATE:
+ dcMsgValue = MessageTypeAndValueHelper.BATTERY_STATE_TO_DC_BATTERY_STATE
+ .getValue(msg.getValue());
+ break;
+ case CallDiagnostics.MESSAGE_DEVICE_NETWORK_COVERAGE:
+ dcMsgValue = MessageTypeAndValueHelper.COVERAGE_TO_DC_COVERAGE
+ .getValue(msg.getValue());
+ break;
+ default:
+ Log.w(this, "onMessagesReceived: msg=%d - invalid msg", msg.getValue());
+ continue;
+ }
+ if (dcMsgValue == null) {
+ Log.w(this, "onMessagesReceived: msg=%d/%d - invalid msg value", msg.getType(),
+ msg.getValue());
+ continue;
+ }
Bundle extras = new Bundle();
- extras.putInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_TYPE, msg.getType());
- extras.putInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_VALUE, msg.getValue());
+ extras.putInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_TYPE, dcMsgType);
+ extras.putInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_VALUE, dcMsgValue);
sendConnectionEvent(Connection.EVENT_DEVICE_TO_DEVICE_MESSAGE, extras);
}
}
/**
+ * Handles report from {@link Communicator} when the availability of D2D changes.
+ * @param isAvailable {@code true} if D2D is available, {@code false} if unavailable.
+ */
+ @Override
+ public void onD2DAvailabilitychanged(boolean isAvailable) {
+ notifyD2DAvailabilityChanged(isAvailable);
+ }
+
+ /**
* Called by a {@link ConnectionService} to notify Telecom that a {@link Conference#onMerge()}
* operation has started.
*/
@@ -3445,4 +3732,86 @@
return PhoneNumberUtils.stripSeparators(
PhoneNumberUtils.formatNumber(number, JAPAN_ISO_COUNTRY_CODE));
}
+
+ public TelecomAccountRegistry getTelecomAccountRegistry(Context context) {
+ return TelecomAccountRegistry.getInstance(context);
+ }
+
+ /**
+ * @return {@code true} if the carrier supports D2D using RTP header extensions, {@code false}
+ * otherwise.
+ */
+ private boolean supportsD2DUsingRtp() {
+ PersistableBundle b = getCarrierConfig();
+ return b != null && b.getBoolean(
+ CarrierConfigManager.KEY_SUPPORTS_DEVICE_TO_DEVICE_COMMUNICATION_USING_RTP_BOOL);
+ }
+
+ /**
+ * @return {@code true} if the carrier supports D2D using DTMF digits, {@code false} otherwise.
+ */
+ private boolean supportsD2DUsingDtmf() {
+ PersistableBundle b = getCarrierConfig();
+ return b != null && b.getBoolean(
+ CarrierConfigManager.KEY_SUPPORTS_DEVICE_TO_DEVICE_COMMUNICATION_USING_DTMF_BOOL);
+ }
+
+ /**
+ * @return {@code true} if the carrier supports using SDP negotiation for the RTP header
+ * extensions used in D2D comms, {@code false} otherwise.
+ */
+ private boolean supportsSdpNegotiationOfRtpHeaderExtensions() {
+ PersistableBundle b = getCarrierConfig();
+ return b != null && b.getBoolean(
+ CarrierConfigManager
+ .KEY_SUPPORTS_SDP_NEGOTIATION_OF_D2D_RTP_HEADER_EXTENSIONS_BOOL);
+ }
+
+ /**
+ * Handles a device to device message which a {@link CallDiagnostics} wishes to send.
+ * @param extras the call event extras bundle.
+ */
+ private void handleOutgoingDeviceToDeviceMessage(Bundle extras) {
+ int messageType = extras.getInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_TYPE);
+ int messageValue = extras.getInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_VALUE);
+
+ Integer internalMessageValue;
+ switch (messageType) {
+ case CallDiagnostics.MESSAGE_CALL_AUDIO_CODEC:
+ internalMessageValue = MessageTypeAndValueHelper.CODEC_TO_DC_CODEC.getKey(
+ messageValue);
+ break;
+ case CallDiagnostics.MESSAGE_CALL_NETWORK_TYPE:
+ internalMessageValue = MessageTypeAndValueHelper.RAT_TYPE_TO_DC_NETWORK_TYPE.getKey(
+ messageValue);
+ break;
+ case CallDiagnostics.MESSAGE_DEVICE_BATTERY_STATE:
+ internalMessageValue = MessageTypeAndValueHelper.BATTERY_STATE_TO_DC_BATTERY_STATE
+ .getKey(messageValue);
+ break;
+ case CallDiagnostics.MESSAGE_DEVICE_NETWORK_COVERAGE:
+ internalMessageValue = MessageTypeAndValueHelper.COVERAGE_TO_DC_COVERAGE
+ .getKey(messageValue);
+ break;
+ default:
+ Log.w(this, "handleOutgoingDeviceToDeviceMessage: msg=%d - invalid msg",
+ messageType);
+ return;
+ }
+ Integer internalMessageType = MessageTypeAndValueHelper.MSG_TYPE_TO_DC_MSG_TYPE.getKey(
+ messageType);
+ if (internalMessageValue == null) {
+ Log.w(this, "handleOutgoingDeviceToDeviceMessage: msg=%d/%d - invalid value",
+ messageType, messageValue);
+ return;
+ }
+
+ if (mCommunicator != null) {
+ Log.w(this, "handleOutgoingDeviceToDeviceMessage: msg=%d/%d - sending",
+ internalMessageType, internalMessageValue);
+ Set<Communicator.Message> set = new ArraySet<>();
+ set.add(new Communicator.Message(internalMessageType, internalMessageValue));
+ mCommunicator.sendMessages(set);
+ }
+ }
}
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index d2b0c50..7a0d8c2 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -28,9 +28,7 @@
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
+import android.os.ParcelUuid;
import android.telecom.Conference;
import android.telecom.Connection;
import android.telecom.ConnectionRequest;
@@ -70,6 +68,7 @@
import com.android.phone.MMIDialogActivity;
import com.android.phone.PhoneUtils;
import com.android.phone.R;
+import com.android.phone.callcomposer.CallComposerPictureManager;
import com.android.phone.settings.SuppServicesUiUtil;
import java.lang.ref.WeakReference;
@@ -82,9 +81,10 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Queue;
import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
import java.util.regex.Pattern;
import javax.annotation.Nullable;
@@ -93,7 +93,7 @@
* Service for making GSM and CDMA connections.
*/
public class TelephonyConnectionService extends ConnectionService {
-
+ private static final String LOG_TAG = TelephonyConnectionService.class.getSimpleName();
// Timeout before we continue with the emergency call without waiting for DDS switch response
// from the modem.
private static final int DEFAULT_DATA_SWITCH_TIMEOUT_MS = 1000;
@@ -173,8 +173,6 @@
// destroyed.
@VisibleForTesting
public Pair<WeakReference<TelephonyConnection>, Queue<Phone>> mEmergencyRetryCache;
- private Handler mDdsSwitchHandler;
- private HandlerThread mHandlerThread;
private DeviceState mDeviceState = new DeviceState();
/**
@@ -361,27 +359,6 @@
};
/**
- * Factory for Handler creation in order to remove flakiness during t esting.
- */
- @VisibleForTesting
- public interface HandlerFactory {
- HandlerThread createHandlerThread(String name);
- Handler createHandler(Looper looper);
- }
-
- private HandlerFactory mHandlerFactory = new HandlerFactory() {
- @Override
- public HandlerThread createHandlerThread(String name) {
- return new HandlerThread(name);
- }
-
- @Override
- public Handler createHandler(Looper looper) {
- return new Handler(looper);
- }
- };
-
- /**
* DisconnectCause depends on PhoneGlobals in order to get a system context. Mock out
* dependency for testing.
*/
@@ -472,14 +449,6 @@
}
/**
- * Override Handler creation factory for testing.
- */
- @VisibleForTesting
- public void setHandlerFactory(HandlerFactory handlerFactory) {
- mHandlerFactory = handlerFactory;
- }
-
- /**
* Override DisconnectCause creation for testing.
*/
@VisibleForTesting
@@ -530,16 +499,11 @@
IntentFilter intentFilter = new IntentFilter(
TelecomManager.ACTION_TTY_PREFERRED_MODE_CHANGED);
registerReceiver(mTtyBroadcastReceiver, intentFilter);
- mHandlerThread = mHandlerFactory.createHandlerThread("DdsSwitchHandlerThread");
- mHandlerThread.start();
- Looper looper = mHandlerThread.getLooper();
- mDdsSwitchHandler = mHandlerFactory.createHandler(looper);
}
@Override
public boolean onUnbind(Intent intent) {
unregisterReceiver(mTtyBroadcastReceiver);
- mHandlerThread.quitSafely();
return super.onUnbind(intent);
}
@@ -873,14 +837,9 @@
} else {
final Connection resultConnection = getTelephonyConnection(request, numberToDial,
true, handle, phone);
- mDdsSwitchHandler.post(new Runnable() {
- @Override
- public void run() {
- boolean result = delayDialForDdsSwitch(phone);
- Log.i(this,
- "onCreateOutgoingConn - delayDialForDdsSwitch result = " + result);
+ delayDialForDdsSwitch(phone, (result) -> {
+ Log.i(this, "onCreateOutgoingConn - delayDialForDdsSwitch result = " + result);
placeOutgoingConnection(request, resultConnection, phone);
- }
});
return resultConnection;
}
@@ -962,18 +921,14 @@
adjustAndPlaceOutgoingConnection(phone, originalConnection, request, numberToDial,
handle, originalPhoneType, false);
} else {
- mDdsSwitchHandler.post(new Runnable() {
- @Override
- public void run() {
- boolean result = delayDialForDdsSwitch(phone);
- Log.i(this, "handleOnComplete - delayDialForDdsSwitch result = " + result);
- adjustAndPlaceOutgoingConnection(phone, originalConnection, request,
- numberToDial, handle, originalPhoneType, true);
- mIsEmergencyCallPending = false;
- }
+ delayDialForDdsSwitch(phone, result -> {
+ Log.i(this, "handleOnComplete - delayDialForDdsSwitch "
+ + "result = " + result);
+ adjustAndPlaceOutgoingConnection(phone, originalConnection, request,
+ numberToDial, handle, originalPhoneType, true);
+ mIsEmergencyCallPending = false;
});
}
-
} else {
Log.w(this, "onCreateOutgoingConnection, failed to turn on radio");
closeOrDestroyConnection(originalConnection,
@@ -1256,10 +1211,15 @@
createConnectionFor(phone, originalConnection, false /* isOutgoing */,
request.getAccountHandle(), request.getTelecomCallId(),
request.isAdhocConferenceCall());
+
handleIncomingRtt(request, originalConnection);
if (connection == null) {
return Connection.createCanceledConnection();
} else {
+ // Add extra to call if answering this incoming call would cause an in progress call on
+ // another subscription to be disconnected.
+ maybeIndicateAnsweringWillDisconnect(connection, request.getAccountHandle());
+
connection.setTtyEnabled(mDeviceState.isTtyModeEnabled(getApplicationContext()));
return connection;
}
@@ -1710,7 +1670,23 @@
return;
}
- com.android.internal.telephony.Connection originalConnection = null;
+ if (extras != null && extras.containsKey(TelecomManager.EXTRA_OUTGOING_PICTURE)) {
+ ParcelUuid uuid = extras.getParcelable(TelecomManager.EXTRA_OUTGOING_PICTURE);
+ CallComposerPictureManager.getInstance(phone.getContext(), phone.getSubId())
+ .storeUploadedPictureToCallLog(uuid.getUuid(), (uri) -> {
+ if (uri != null) {
+ try {
+ Bundle b = new Bundle();
+ b.putParcelable(TelecomManager.EXTRA_PICTURE_URI, uri);
+ connection.putTelephonyExtras(b);
+ } catch (Exception e) {
+ Log.e(this, e, "Couldn't set picture extra on outgoing call");
+ }
+ }
+ });
+ }
+
+ final com.android.internal.telephony.Connection originalConnection;
try {
if (phone != null) {
EmergencyNumber emergencyNumber =
@@ -1756,10 +1732,16 @@
.setVideoState(videoState)
.setIntentExtras(extras)
.setRttTextStream(connection.getRttTextStream())
- .build());
+ .build(),
+ // We need to wait until the phone has been chosen in GsmCdmaPhone to
+ // register for the associated TelephonyConnection call event listeners.
+ connection::registerForCallEvents);
+ } else {
+ originalConnection = null;
}
} catch (CallStateException e) {
Log.e(this, e, "placeOutgoingConnection, phone.dial exception: " + e);
+ connection.unregisterForCallEvents();
handleCallStateException(e, connection, phone);
return;
}
@@ -1787,7 +1769,17 @@
"Connection is null", phone.getPhoneId()));
connection.close();
} else {
- connection.setOriginalConnection(originalConnection);
+ if (!getMainThreadHandler().getLooper().isCurrentThread()) {
+ Log.w(this, "placeOriginalConnection - Unexpected, this call "
+ + "should always be on the main thread.");
+ getMainThreadHandler().post(() -> {
+ if (connection.getOriginalConnection() == null) {
+ connection.setOriginalConnection(originalConnection);
+ }
+ });
+ } else {
+ connection.setOriginalConnection(originalConnection);
+ }
}
}
@@ -1945,18 +1937,32 @@
/**
* If needed, block until the the default data is is switched for outgoing emergency call, or
* timeout expires.
+ * @param phone The Phone to switch the DDS on.
+ * @param completeConsumer The consumer to call once the default data subscription has been
+ * switched, provides {@code true} result if the switch happened
+ * successfully or {@code false} if the operation timed out/failed.
*/
- private boolean delayDialForDdsSwitch(Phone phone) {
+ private void delayDialForDdsSwitch(Phone phone, Consumer<Boolean> completeConsumer) {
if (phone == null) {
- return true;
+ // Do not block indefinitely.
+ completeConsumer.accept(false);
}
try {
- return possiblyOverrideDefaultDataForEmergencyCall(phone).get(
- DEFAULT_DATA_SWITCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ // Waiting for PhoneSwitcher to complete the operation.
+ CompletableFuture<Boolean> future = possiblyOverrideDefaultDataForEmergencyCall(phone);
+ // In the case that there is an issue or bug in PhoneSwitcher logic, do not wait
+ // indefinitely for the future to complete. Instead, set a timeout that will complete
+ // the future as to not block the outgoing call indefinitely.
+ CompletableFuture<Boolean> timeout = new CompletableFuture<>();
+ phone.getContext().getMainThreadHandler().postDelayed(
+ () -> timeout.complete(false), DEFAULT_DATA_SWITCH_TIMEOUT_MS);
+ // Also ensure that the Consumer is completed on the main thread.
+ future.acceptEitherAsync(timeout, completeConsumer,
+ phone.getContext().getMainExecutor());
} catch (Exception e) {
Log.w(this, "delayDialForDdsSwitch - exception= "
+ e.getMessage());
- return false;
+
}
}
@@ -2506,18 +2512,42 @@
getAllConnections().stream()
.filter(f -> f instanceof TelephonyConnection)
.forEach(t -> {
- TelephonyConnection tc = (TelephonyConnection) t;
- Communicator c = tc.getCommunicator();
- if (c == null) {
- Log.w(this, "sendTestDeviceToDeviceMessage: D2D not enabled");
- return;
- }
+ TelephonyConnection tc = (TelephonyConnection) t;
+ if (!tc.isImsConnection()) {
+ Log.w(this, "sendTestDeviceToDeviceMessage: not an IMS connection");
+ return;
+ }
+ Communicator c = tc.getCommunicator();
+ if (c == null) {
+ Log.w(this, "sendTestDeviceToDeviceMessage: D2D not enabled");
+ return;
+ }
- c.sendMessages(new HashSet<Communicator.Message>() {{
- add(new Communicator.Message(message, value));
- }});
+ c.sendMessages(new HashSet<Communicator.Message>() {{
+ add(new Communicator.Message(message, value));
+ }});
- });
+ });
+ }
+
+ /**
+ * Overrides the current D2D transport, forcing the specified one to be active. Used for test.
+ * @param transport The class simple name of the transport to make active.
+ */
+ public void setActiveDeviceToDeviceTransport(@NonNull String transport) {
+ getAllConnections().stream()
+ .filter(f -> f instanceof TelephonyConnection)
+ .forEach(t -> {
+ TelephonyConnection tc = (TelephonyConnection) t;
+ Communicator c = tc.getCommunicator();
+ if (c == null) {
+ Log.w(this, "setActiveDeviceToDeviceTransport: D2D not enabled");
+ return;
+ }
+ Log.i(this, "setActiveDeviceToDeviceTransport: callId=%s, set to: %s",
+ tc.getTelecomCallId(), transport);
+ c.setTransportActive(transport);
+ });
}
private PhoneAccountHandle adjustAccountHandle(Phone phone,
@@ -2535,4 +2565,82 @@
}
return origAccountHandle;
}
+
+ /**
+ * For the passed in incoming {@link TelephonyConnection}, add
+ * {@link Connection#EXTRA_ANSWERING_DROPS_FG_CALL} if there are ongoing calls on another
+ * subscription (ie phone account handle) than the one passed in.
+ * @param connection The connection.
+ * @param phoneAccountHandle The {@link PhoneAccountHandle} the incoming call originated on;
+ * this is passed in because
+ * {@link Connection#getPhoneAccountHandle()} is not set until after
+ * {@link ConnectionService#onCreateIncomingConnection(
+ * PhoneAccountHandle, ConnectionRequest)} returns.
+ */
+ public void maybeIndicateAnsweringWillDisconnect(@NonNull TelephonyConnection connection,
+ @NonNull PhoneAccountHandle phoneAccountHandle) {
+ if (isCallPresentOnOtherSub(phoneAccountHandle)) {
+ Log.i(this, "maybeIndicateAnsweringWillDisconnect; answering call %s will cause a call "
+ + "on another subscription to drop.", connection.getTelecomCallId());
+ Bundle extras = new Bundle();
+ extras.putBoolean(Connection.EXTRA_ANSWERING_DROPS_FG_CALL, true);
+ connection.putExtras(extras);
+ }
+ }
+
+ /**
+ * Checks to see if there are calls present on a sub other than the one passed in.
+ * @param incomingHandle The new incoming connection {@link PhoneAccountHandle}
+ */
+ private boolean isCallPresentOnOtherSub(@NonNull PhoneAccountHandle incomingHandle) {
+ return getAllConnections().stream()
+ .filter(c ->
+ // Exclude multiendpoint calls as they're not on this device.
+ (c.getConnectionProperties() & Connection.PROPERTY_IS_EXTERNAL_CALL) == 0
+ // Include any calls not on same sub as current connection.
+ && !Objects.equals(c.getPhoneAccountHandle(), incomingHandle))
+ .count() > 0;
+ }
+
+ /**
+ * Where there are ongoing calls on another subscription other than the one specified,
+ * disconnect these calls. This is used where there is an incoming call on one sub, but there
+ * are ongoing calls on another sub which need to be disconnected.
+ * @param incomingHandle The incoming {@link PhoneAccountHandle}.
+ */
+ public void maybeDisconnectCallsOnOtherSubs(@NonNull PhoneAccountHandle incomingHandle) {
+ Log.i(this, "maybeDisconnectCallsOnOtherSubs: check for calls not on %s", incomingHandle);
+ maybeDisconnectCallsOnOtherSubs(getAllConnections(), incomingHandle);
+ }
+
+ /**
+ * Used by {@link #maybeDisconnectCallsOnOtherSubs(PhoneAccountHandle)} to perform call
+ * disconnection. This method exists as a convenience so that it is possible to unit test
+ * the core functionality.
+ * @param connections the calls to check.
+ * @param incomingHandle the incoming handle.
+ */
+ @VisibleForTesting
+ public static void maybeDisconnectCallsOnOtherSubs(@NonNull Collection<Connection> connections,
+ @NonNull PhoneAccountHandle incomingHandle) {
+ connections.stream()
+ .filter(c ->
+ // Exclude multiendpoint calls as they're not on this device.
+ (c.getConnectionProperties() & Connection.PROPERTY_IS_EXTERNAL_CALL) == 0
+ // Include any calls not on same sub as current connection.
+ && !Objects.equals(c.getPhoneAccountHandle(), incomingHandle))
+ .forEach(c -> {
+ if (c instanceof TelephonyConnection) {
+ TelephonyConnection tc = (TelephonyConnection) c;
+ if (!tc.shouldTreatAsEmergencyCall()) {
+ Log.i(LOG_TAG, "maybeDisconnectCallsOnOtherSubs: disconnect %s due to "
+ + "incoming call on other sub.", tc.getTelecomCallId());
+ // Note: intentionally calling hangup instead of onDisconnect.
+ // onDisconnect posts the disconnection to a handle which means that the
+ // disconnection will take place AFTER we answer the incoming call.
+ tc.hangup(android.telephony.DisconnectCause.LOCAL);
+ }
+ }
+ });
+ }
}
diff --git a/src/com/android/services/telephony/rcs/MessageTransportWrapper.java b/src/com/android/services/telephony/rcs/MessageTransportWrapper.java
index 0d4265a..45f7d95 100644
--- a/src/com/android/services/telephony/rcs/MessageTransportWrapper.java
+++ b/src/com/android/services/telephony/rcs/MessageTransportWrapper.java
@@ -482,7 +482,7 @@
}
private void logi(String log) {
- Log.w(SipTransportController.LOG_TAG, TAG + "[" + mSubId + "] " + log);
+ Log.i(SipTransportController.LOG_TAG, TAG + "[" + mSubId + "] " + log);
mLocalLog.log("[I] " + log);
}
diff --git a/src/com/android/services/telephony/rcs/SipDelegateController.java b/src/com/android/services/telephony/rcs/SipDelegateController.java
index 30edca1..8cc70a4 100644
--- a/src/com/android/services/telephony/rcs/SipDelegateController.java
+++ b/src/com/android/services/telephony/rcs/SipDelegateController.java
@@ -414,7 +414,7 @@
}
private void logi(String log) {
- Log.w(SipTransportController.LOG_TAG, LOG_TAG + "[" + mSubId + "] " + log);
+ Log.i(SipTransportController.LOG_TAG, LOG_TAG + "[" + mSubId + "] " + log);
mLocalLog.log("[I] " + log);
}
diff --git a/src/com/android/services/telephony/rcs/SipSessionTracker.java b/src/com/android/services/telephony/rcs/SipSessionTracker.java
index 77bf3f3..5ab482f 100644
--- a/src/com/android/services/telephony/rcs/SipSessionTracker.java
+++ b/src/com/android/services/telephony/rcs/SipSessionTracker.java
@@ -357,7 +357,7 @@
}
private void logi(String log) {
- Log.w(SipTransportController.LOG_TAG, TAG + ": " + log);
+ Log.i(SipTransportController.LOG_TAG, TAG + ": " + log);
mLocalLog.log("[I] " + log);
}
diff --git a/src/com/android/services/telephony/rcs/SipTransportController.java b/src/com/android/services/telephony/rcs/SipTransportController.java
index f37c360..709e142 100644
--- a/src/com/android/services/telephony/rcs/SipTransportController.java
+++ b/src/com/android/services/telephony/rcs/SipTransportController.java
@@ -803,7 +803,12 @@
}
boolean roleChanged = updateRoleCache();
if (roleChanged) {
- triggerDeregistrationEvent();
+ if (!TextUtils.isEmpty(mCachedSmsRolePackageName)) {
+ // the role change event will go A -> "" and then "" -> B. In order to not send two
+ // events to the modem, only trigger the deregistration event when we move to a
+ // non-empty package name.
+ triggerDeregistrationEvent();
+ }
// new denied tags will be picked up when reevaluate completes.
scheduleThrottledReevaluate();
}
@@ -1072,7 +1077,7 @@
}
private void logi(String log) {
- Log.w(LOG_TAG, "[" + mSlotId + "->" + mSubId + "] " + log);
+ Log.i(LOG_TAG, "[" + mSlotId + "->" + mSubId + "] " + log);
mLocalLog.log("[I] " + log);
}
diff --git a/src/com/android/services/telephony/rcs/UceControllerManager.java b/src/com/android/services/telephony/rcs/UceControllerManager.java
index 5d0cab9..995d685 100644
--- a/src/com/android/services/telephony/rcs/UceControllerManager.java
+++ b/src/com/android/services/telephony/rcs/UceControllerManager.java
@@ -26,12 +26,12 @@
import android.telephony.ims.RcsUceAdapter.PublishState;
import android.telephony.ims.aidl.IRcsUceControllerCallback;
import android.telephony.ims.aidl.IRcsUcePublishStateCallback;
+import android.util.IndentingPrintWriter;
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;
diff --git a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsCallingActivity.java b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsCallingActivity.java
index 0ff6cc1..477bbc0 100644
--- a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsCallingActivity.java
+++ b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsCallingActivity.java
@@ -188,6 +188,9 @@
sb.append("}, \nIWLAN: ");
sb.append("{");
sb.append(caps.get(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
+ sb.append("}, \nCROSS-SIM: ");
+ sb.append("{");
+ sb.append(caps.get(ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM));
sb.append("}");
mCapEnabledText.setText(sb.toString());
}
diff --git a/testapps/SmsManagerTestApp/res/layout/activity_main.xml b/testapps/SmsManagerTestApp/res/layout/activity_main.xml
index d889936..ddaf3a6 100644
--- a/testapps/SmsManagerTestApp/res/layout/activity_main.xml
+++ b/testapps/SmsManagerTestApp/res/layout/activity_main.xml
@@ -82,4 +82,4 @@
android:paddingRight="4dp"
android:text="@string/check_single_reg_permission"/>
</LinearLayout>
-</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 7383a4a..ca07c54 100644
--- a/testapps/SmsManagerTestApp/res/values/donottranslate_strings.xml
+++ b/testapps/SmsManagerTestApp/res/values/donottranslate_strings.xml
@@ -22,4 +22,4 @@
<string name="enable_persistent_service">Enable Persistent Service</string>
<string name="disable_persistent_service">Disable Persistent Service</string>
<string name="check_single_reg_permission">Check RCS Single Reg Perm</string>
-</resources>
+</resources>
\ No newline at end of file
diff --git a/testapps/TestRcsApp/TestApp/AndroidManifest.xml b/testapps/TestRcsApp/TestApp/AndroidManifest.xml
index 7538df7..35a0822 100644
--- a/testapps/TestRcsApp/TestApp/AndroidManifest.xml
+++ b/testapps/TestRcsApp/TestApp/AndroidManifest.xml
@@ -19,8 +19,8 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google.android.sample.rcsclient"
- android:versionCode="13"
- android:versionName="1.0.12">
+ android:versionCode="14"
+ android:versionName="1.0.13">
<uses-sdk
android:minSdkVersion="30"
diff --git a/testapps/TestRcsApp/TestApp/res/values-as/strings.xml b/testapps/TestRcsApp/TestApp/res/values-as/strings.xml
new file mode 100644
index 0000000..2fac78c
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-as/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"প্ৰ’ভিজনিং পৰীক্ষা"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"অধিকাৰ প্ৰদান কৰাৰ পৰীক্ষা"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE পৰীক্ষা"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA পৰীক্ষা"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"ফলাফল:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"কলবেকৰ ফলাফল:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"সন্ধানৰ সামৰ্থ্যত নম্বৰটো দিয়ক আৰু বহুকেইটা থাকিলে \',\'ৰ দ্বাৰা পৃথক কৰক।"</string>
+ <string name="number" msgid="9096578126043995890">"সংখ্যা:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"চাট আৰম্ভ কৰক"</string>
+ <string name="to" msgid="1156781884609653284">"প্ৰতি:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"চাট বার্তা"</string>
+ <string name="send" msgid="8797467615003240434">"পঠিয়াওক"</string>
+ <string name="ok" msgid="2206671077510386729">"ঠিক আছে"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"ছেশ্বন আৰম্ভ কৰাত সফল হৈছে"</string>
+ <string name="session_failed" msgid="4524986240102190509">"ছেশ্বন আৰম্ভ কৰাত বিফল হৈছে"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"ছেশ্বন সাজু নহয়"</string>
+ <string name="organization" msgid="913518283470119113">"সংস্থা:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICCৰ ধৰণ:"</string>
+ <string name="protocol" msgid="8626139294022821930">"প্ৰট’কল:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS চাইফাৰ ছুইট:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"ষ্টেণ্ডএল’ন পেজাৰ"</string>
+ <string name="standalone_large" msgid="336170805696694543">"ষ্টেণ্ডএল’ন ডাঙৰ"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"ষ্টেণ্ডএল’ন স্থগিত ৰখা হৈছে"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"ষ্টেণ্ডএল’ন ডাঙৰ পেজাৰ"</string>
+ <string name="chat" msgid="5500583808773151982">"চাট"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"ফাইল স্থানান্তৰণ"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"জিঅ’লোকেশ্বনৰ এছএমএছ"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"চাটব’ট ছেশ্বন"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"ষ্টেণ্ডএল’ন চাটব’ট"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"চাটব’টৰ সংস্কৰণ"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"প্ৰ’ভিজনিং সম্পন্ন হৈছে"</string>
+ <string name="registration_done" msgid="492878616836655421">"পঞ্জীয়ন সম্পন্ন হৈছে"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"একো নাই"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"স্থানীয়"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"অজ্ঞাত"</item>
+ <item msgid="1715684709703792003">"ছিম"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-be/strings.xml b/testapps/TestRcsApp/TestApp/res/values-be/strings.xml
new file mode 100644
index 0000000..5196cf4
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-be/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Тэст ініцыялізацыі"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Дэлегаванне тэста"</string>
+ <string name="uce_test" msgid="6466919844953883038">"Тэст UCE"</string>
+ <string name="gba_test" msgid="8786745991279224003">"Тэст GBA"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"Вынік:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Вынік зваротнага выкліку"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Увядзіце нумар для запыту магчымасці. Калі нумароў некалькі, раздзяліце іх коскамі."</string>
+ <string name="number" msgid="9096578126043995890">"Нумар:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Пачаць чат"</string>
+ <string name="to" msgid="1156781884609653284">"Каму:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Паведамленне чата"</string>
+ <string name="send" msgid="8797467615003240434">"Адправіць"</string>
+ <string name="ok" msgid="2206671077510386729">"ОК"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"Ініцыялізацыя сеанса выканана"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Збой ініцыялізацыі сеанса"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Сеанс не гатовы"</string>
+ <string name="organization" msgid="913518283470119113">"Арганізацыя:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"Тып UICC:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Пратакол:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"Набор шыфраў TLS:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Аўтаномны пэйджар"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Аўтаномны вялікі"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Аўтаномны адкладзены"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Аўтаномны вялікі пэйджар"</string>
+ <string name="chat" msgid="5500583808773151982">"Чат"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"Перадача файлаў"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"SMS геалакацыі"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Сеанс чат-бота"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Аўтаномны чат-бот"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Версія чат-бота"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Ініцыялізацыя выканана"</string>
+ <string name="registration_done" msgid="492878616836655421">"Рэгістрацыя выканана"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"НЯМА"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"МЯСЦОВАЯ СЕТКА"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"НЕВЯДОМА"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-bs/strings.xml b/testapps/TestRcsApp/TestApp/res/values-bs/strings.xml
new file mode 100644
index 0000000..8787d26
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-bs/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Test za dodjeljivanje"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Test ovlaštenika"</string>
+ <string name="uce_test" msgid="6466919844953883038">"Test UCE"</string>
+ <string name="gba_test" msgid="8786745991279224003">"Test GBA"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"Rezultat:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Rezultat povratnog poziva:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Unesite broj da pošaljte upit o kapacitetu te upite razdvojite \",\" ako ih ima više."</string>
+ <string name="number" msgid="9096578126043995890">"Broj:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Započni chat"</string>
+ <string name="to" msgid="1156781884609653284">"Za:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Poruka chata"</string>
+ <string name="send" msgid="8797467615003240434">"Pošalji"</string>
+ <string name="ok" msgid="2206671077510386729">"Uredu"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"Pokretanje sesije je uspjelo"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Pokretanje sesije nije uspjelo"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Sesija nije spremna"</string>
+ <string name="organization" msgid="913518283470119113">"Organizacija:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"Vrsta UICC:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Protokol:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"Paket TLS Cipher:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Samostalni pejdžer"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Samostalno veliko"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Samostalno odgođeno"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Samostalni veliki pejdžer"</string>
+ <string name="chat" msgid="5500583808773151982">"Chat"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"Prijenos fajlova"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"SMS za geolokaciju"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Sesija bota za chat"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Samostalni bot za chat"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Vezija bota za chat"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Dodjeljivanje je završeno"</string>
+ <string name="registration_done" msgid="492878616836655421">"Registracija je završena"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"NEMA"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"LOKALNO"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"CERTIFIKAT_PRETPLATNIKA"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"NEPOZNATO"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-en-rAU/strings.xml b/testapps/TestRcsApp/TestApp/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..bec17d3
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-en-rAU/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"Rcs client"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Provisioning test"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Delegate test"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE test"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA test"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DB client"</string>
+ <string name="result" msgid="435222369457564619">"Result:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Callback result:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initialiseSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Enter the number to query capability and separate by \',\' if multiple ones."</string>
+ <string name="number" msgid="9096578126043995890">"Number:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Start chat"</string>
+ <string name="to" msgid="1156781884609653284">"To:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Chat message"</string>
+ <string name="send" msgid="8797467615003240434">"Send"</string>
+ <string name="ok" msgid="2206671077510386729">"OK"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"Session init succeeded"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Session init failed"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Session not ready"</string>
+ <string name="organization" msgid="913518283470119113">"Organisation:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICC type:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Protocol:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS cipher suite:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Standalone pager"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Standalone large"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Standalone deferred"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Standalone large pager"</string>
+ <string name="chat" msgid="5500583808773151982">"Chat"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"File transfer"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"Geolocation SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Chatbot session"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Chatbot standalone"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Chatbot version"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Provisioning done"</string>
+ <string name="registration_done" msgid="492878616836655421">"Registration done"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"NONE"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"LOCAL"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"UNKNOWN"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-en-rCA/strings.xml b/testapps/TestRcsApp/TestApp/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..bec17d3
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-en-rCA/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"Rcs client"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Provisioning test"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Delegate test"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE test"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA test"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DB client"</string>
+ <string name="result" msgid="435222369457564619">"Result:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Callback result:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initialiseSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Enter the number to query capability and separate by \',\' if multiple ones."</string>
+ <string name="number" msgid="9096578126043995890">"Number:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Start chat"</string>
+ <string name="to" msgid="1156781884609653284">"To:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Chat message"</string>
+ <string name="send" msgid="8797467615003240434">"Send"</string>
+ <string name="ok" msgid="2206671077510386729">"OK"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"Session init succeeded"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Session init failed"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Session not ready"</string>
+ <string name="organization" msgid="913518283470119113">"Organisation:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICC type:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Protocol:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS cipher suite:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Standalone pager"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Standalone large"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Standalone deferred"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Standalone large pager"</string>
+ <string name="chat" msgid="5500583808773151982">"Chat"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"File transfer"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"Geolocation SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Chatbot session"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Chatbot standalone"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Chatbot version"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Provisioning done"</string>
+ <string name="registration_done" msgid="492878616836655421">"Registration done"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"NONE"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"LOCAL"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"UNKNOWN"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-en-rGB/strings.xml b/testapps/TestRcsApp/TestApp/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..bec17d3
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-en-rGB/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"Rcs client"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Provisioning test"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Delegate test"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE test"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA test"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DB client"</string>
+ <string name="result" msgid="435222369457564619">"Result:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Callback result:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initialiseSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Enter the number to query capability and separate by \',\' if multiple ones."</string>
+ <string name="number" msgid="9096578126043995890">"Number:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Start chat"</string>
+ <string name="to" msgid="1156781884609653284">"To:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Chat message"</string>
+ <string name="send" msgid="8797467615003240434">"Send"</string>
+ <string name="ok" msgid="2206671077510386729">"OK"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"Session init succeeded"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Session init failed"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Session not ready"</string>
+ <string name="organization" msgid="913518283470119113">"Organisation:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICC type:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Protocol:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS cipher suite:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Standalone pager"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Standalone large"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Standalone deferred"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Standalone large pager"</string>
+ <string name="chat" msgid="5500583808773151982">"Chat"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"File transfer"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"Geolocation SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Chatbot session"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Chatbot standalone"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Chatbot version"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Provisioning done"</string>
+ <string name="registration_done" msgid="492878616836655421">"Registration done"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"NONE"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"LOCAL"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"UNKNOWN"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-en-rIN/strings.xml b/testapps/TestRcsApp/TestApp/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..bec17d3
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-en-rIN/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"Rcs client"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Provisioning test"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Delegate test"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE test"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA test"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DB client"</string>
+ <string name="result" msgid="435222369457564619">"Result:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Callback result:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initialiseSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Enter the number to query capability and separate by \',\' if multiple ones."</string>
+ <string name="number" msgid="9096578126043995890">"Number:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Start chat"</string>
+ <string name="to" msgid="1156781884609653284">"To:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Chat message"</string>
+ <string name="send" msgid="8797467615003240434">"Send"</string>
+ <string name="ok" msgid="2206671077510386729">"OK"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"Session init succeeded"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Session init failed"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Session not ready"</string>
+ <string name="organization" msgid="913518283470119113">"Organisation:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICC type:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Protocol:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS cipher suite:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Standalone pager"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Standalone large"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Standalone deferred"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Standalone large pager"</string>
+ <string name="chat" msgid="5500583808773151982">"Chat"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"File transfer"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"Geolocation SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Chatbot session"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Chatbot standalone"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Chatbot version"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Provisioning done"</string>
+ <string name="registration_done" msgid="492878616836655421">"Registration done"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"NONE"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"LOCAL"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"UNKNOWN"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-en-rXC/strings.xml b/testapps/TestRcsApp/TestApp/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..ef9b6cb
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-en-rXC/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Provisioning Test"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Delegate Test"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE Test"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA Test"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"Result:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Callback Result:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Enter the number to query capability and separate by \',\' if multiple ones."</string>
+ <string name="number" msgid="9096578126043995890">"Number:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Start Chat"</string>
+ <string name="to" msgid="1156781884609653284">"To:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Chat Message"</string>
+ <string name="send" msgid="8797467615003240434">"Send"</string>
+ <string name="ok" msgid="2206671077510386729">"OK"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"Session init succeeded"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Session init failed"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Session not ready"</string>
+ <string name="organization" msgid="913518283470119113">"Organization:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICC Type:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Protocol:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS Cipher Suite:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Standalone Pager"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Standalone Large"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Standalone Deferred"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Standalone Large Pager"</string>
+ <string name="chat" msgid="5500583808773151982">"Chat"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"File Transfer"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"Geolocation SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Chatbot Session"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Chatbot Standalone"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Chatbot Version"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Provisioning Done"</string>
+ <string name="registration_done" msgid="492878616836655421">"Registration Done"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"NONE"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"LOCAL"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"UNKNOWN"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-gu/strings.xml b/testapps/TestRcsApp/TestApp/res/values-gu/strings.xml
new file mode 100644
index 0000000..4842877
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-gu/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"જોગવાઈનું પરીક્ષણ"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"અધિકાર સોંપવાનું પરીક્ષણ"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE પરીક્ષણ"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA પરીક્ષણ"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"પરિણામ:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"કૉલબૅકનું પરિણામ:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"ક્વેરીની ક્ષમતામાં નંબર દાખલ કરો અને એક કરતાં વધુ હોય તો વડે \',\' જુદાં પાડો."</string>
+ <string name="number" msgid="9096578126043995890">"નંબર:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"ચૅટ શરૂ કરો"</string>
+ <string name="to" msgid="1156781884609653284">"પ્રતિ:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"ચૅટ સંદેશ"</string>
+ <string name="send" msgid="8797467615003240434">"મોકલો"</string>
+ <string name="ok" msgid="2206671077510386729">"ઓકે"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"સત્ર શરૂ કરવાનું સફળ થયું"</string>
+ <string name="session_failed" msgid="4524986240102190509">"સત્ર શરૂ કરવાનું નિષ્ફળ રહ્યું"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"સત્ર તૈયાર નથી"</string>
+ <string name="organization" msgid="913518283470119113">"સંસ્થા:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICCનો પ્રકાર:"</string>
+ <string name="protocol" msgid="8626139294022821930">"પ્રોટોકૉલ:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS સાઇફર સ્યૂટ:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"સ્ટેન્ડઅલોન પેજર"</string>
+ <string name="standalone_large" msgid="336170805696694543">"સ્ટેન્ડઅલોન મોટું"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"સ્ટેન્ડઅલોન સ્થગિત થયું"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"સ્ટેન્ડઅલોન મોટું પેજર"</string>
+ <string name="chat" msgid="5500583808773151982">"ચૅટ"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"ફાઇલ ટ્રાન્સફર"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"ભૌગોલિક સ્થાન SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"ચૅટબૉટ સત્ર"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"ચૅટબૉટ સ્ટેન્ડઅલોન"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"ચૅટબૉટ વર્ઝન"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"જોગવાઈ કરી"</string>
+ <string name="registration_done" msgid="492878616836655421">"રજિસ્ટ્રેશન થઈ ગયું"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"કોઈ નહીં"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"સ્થાનિક"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"અજાણ"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-ko/strings.xml b/testapps/TestRcsApp/TestApp/res/values-ko/strings.xml
new file mode 100644
index 0000000..38f1bd5
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-ko/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"프로비저닝 테스트"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"테스트 위임"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE 테스트"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA 테스트"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"결과:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"콜백 결과:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"기능을 쿼리할 숫자를 입력하고, 여러 개일 경우 \',\' 기호로 구분하세요."</string>
+ <string name="number" msgid="9096578126043995890">"번호:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"채팅 시작"</string>
+ <string name="to" msgid="1156781884609653284">"대상:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"채팅 메시지"</string>
+ <string name="send" msgid="8797467615003240434">"보내기"</string>
+ <string name="ok" msgid="2206671077510386729">"확인"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"세션 초기화 성공"</string>
+ <string name="session_failed" msgid="4524986240102190509">"세션 초기화 실패"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"세션이 준비되지 않음"</string>
+ <string name="organization" msgid="913518283470119113">"조직:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICC 유형:"</string>
+ <string name="protocol" msgid="8626139294022821930">"프로토콜:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS 암호화 스위트:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"독립형 페이저"</string>
+ <string name="standalone_large" msgid="336170805696694543">"독립형 대형"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"독립형 지연됨"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"독립형 대형 페이저"</string>
+ <string name="chat" msgid="5500583808773151982">"채팅"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"파일 전송"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"위치정보 SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"챗봇 세션"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"독립형 챗봇"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"챗봇 버전"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"프로비저닝 완료"</string>
+ <string name="registration_done" msgid="492878616836655421">"등록 완료"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"없음"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"로컬"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"알 수 없음"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-lo/strings.xml b/testapps/TestRcsApp/TestApp/res/values-lo/strings.xml
new file mode 100644
index 0000000..6050bad
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-lo/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Provisioning Test"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"ທົດສອບຕົວແທນ"</string>
+ <string name="uce_test" msgid="6466919844953883038">"ທົດສອບ UCE"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA Test"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"ຜົນໄດ້ຮັບ:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"ຜົນການໂທກັບ:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"ປ້ອນໝາຍເລກໃສ່ຄຳຊອກຫາ ແລະ ຂັ້ນດ້ວຍ \',\' ຖ້າມີຫຼາຍກວ່າໜຶ່ງ."</string>
+ <string name="number" msgid="9096578126043995890">"ໝາຍເລກ:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"ເລີ່ມການສົນທະນາ"</string>
+ <string name="to" msgid="1156781884609653284">"ຫາ:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"ຂໍ້ຄວາມສົນທະນາ"</string>
+ <string name="send" msgid="8797467615003240434">"ສົ່ງ"</string>
+ <string name="ok" msgid="2206671077510386729">"ຕົກລົງ"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"ເລີ່ມເຊດຊັນສຳເລັດ"</string>
+ <string name="session_failed" msgid="4524986240102190509">"ເລີ່ມເຊດຊັນຜິດພາດ"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"ເຊດຊັນບໍ່ທັນພ້ອມ"</string>
+ <string name="organization" msgid="913518283470119113">"ອົງການ:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"ປະເພດ UICC:"</string>
+ <string name="protocol" msgid="8626139294022821930">"ໂປຣໂຕຄໍ:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"ຊຸດ TLS Cipher:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Standalone Pager"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Standalone Large"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Standalone Deferred"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Standalone Large Pager"</string>
+ <string name="chat" msgid="5500583808773151982">"ສົນທະນາ"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"ການໂອນໄຟລ໌"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"ທີ່ຕັ້ງພູມສາດ SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"ເຊດຊັນ Chatbot"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Chatbot ແບບດ່ຽວ"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"ເວີຊັນ Chatbot"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Provisioning Done"</string>
+ <string name="registration_done" msgid="492878616836655421">"Registration Done"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"ບໍ່ມີ"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"ພາຍໃນ"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"ບໍ່ຮູ້ຈັກ"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-ml/strings.xml b/testapps/TestRcsApp/TestApp/res/values-ml/strings.xml
new file mode 100644
index 0000000..00d9a4e
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-ml/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"പ്രൊവിഷനിംഗ് ടെസ്റ്റ്"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"ഡെലിഗേറ്റ് ടെസ്റ്റ്"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE ടെസ്റ്റ്"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA ടെസ്റ്റ്"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"ഫലം:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"തിരികെ വിളിക്കൽ ഫലം:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"ചോദ്യത്തിന്റെ കാര്യക്ഷമത എന്നതിലേക്ക് നമ്പർ നൽകുക, ഒന്നിലധികം ഉണ്ടെങ്കിൽ അവയെ \',\' ഉപയോഗിച്ച് വേർതിരിക്കുക."</string>
+ <string name="number" msgid="9096578126043995890">"നമ്പർ:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"ചാറ്റ് ആരംഭിക്കുക"</string>
+ <string name="to" msgid="1156781884609653284">"സ്വീകർത്താവ്:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Chat സന്ദേശം"</string>
+ <string name="send" msgid="8797467615003240434">"അയയ്ക്കുക"</string>
+ <string name="ok" msgid="2206671077510386729">"ശരി"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"സെഷൻ ആരംഭിച്ചു"</string>
+ <string name="session_failed" msgid="4524986240102190509">"സെഷൻ ആരംഭിക്കാനായില്ല"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"സെഷൻ തയ്യാറല്ല"</string>
+ <string name="organization" msgid="913518283470119113">"ഓർഗനൈസേഷൻ:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICC തരം:"</string>
+ <string name="protocol" msgid="8626139294022821930">"പ്രോട്ടോക്കോൾ:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS Cipher Suite:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"സ്റ്റാൻഡ്എലോൺ പേജർ"</string>
+ <string name="standalone_large" msgid="336170805696694543">"സ്റ്റാൻഡ്എലോൺ ലാർജ്"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"സ്റ്റാൻഡ്എലോൺ ഡെഫേഡ്"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"സ്റ്റാൻഡ്എലോൺ ലാർജ് പേജർ"</string>
+ <string name="chat" msgid="5500583808773151982">"Chat"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"ഫയൽ കൈമാറൽ"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"ജിയോലൊക്കേഷൻ SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"ചാറ്റ്ബോട്ട് സെഷൻ"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"ചാറ്റ്ബോട്ട് സ്റ്റാൻഡ്എലോൺ"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"ചാറ്റ്ബോട്ട് പതിപ്പ്"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"പ്രൊവിഷനിംഗ് പൂർത്തിയായി"</string>
+ <string name="registration_done" msgid="492878616836655421">"രജിസ്ട്രേഷൻ പൂർത്തിയായി"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"ഒന്നുമില്ല"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"LOCAL"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"UNKNOWN"</item>
+ <item msgid="1715684709703792003">"സിം"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-ms/strings.xml b/testapps/TestRcsApp/TestApp/res/values-ms/strings.xml
new file mode 100644
index 0000000..758b2bd
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-ms/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Ujian Peruntukan"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Tugaskan Ujian"</string>
+ <string name="uce_test" msgid="6466919844953883038">"Ujian UCE"</string>
+ <string name="gba_test" msgid="8786745991279224003">"Ujian GBA"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"Hasil:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Hasil Panggil Balik:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Masukkan nombor untuk bertanya keupayaan dan pisahkan dengan \',\' jika terdapat berbilang nombor."</string>
+ <string name="number" msgid="9096578126043995890">"Nombor:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Mulakan Sembang"</string>
+ <string name="to" msgid="1156781884609653284">"Kepada:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Mesej Sembang"</string>
+ <string name="send" msgid="8797467615003240434">"Hantar"</string>
+ <string name="ok" msgid="2206671077510386729">"OK"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"Pemulaan sesi berjaya"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Pemulaan sesi gagal"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Sesi belum sedia"</string>
+ <string name="organization" msgid="913518283470119113">"Organisasi:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"Jenis UICC:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Protokol:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"Set Sifer TLS:"</string>
+ <string name="naf" msgid="7620247915001854662">"URI NAF:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Alat Kelui Kendiri"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Apl Kendiri Besar"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Apl Kendiri Ditunda"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Alat Kelui Kendiri Besar"</string>
+ <string name="chat" msgid="5500583808773151982">"Sembang"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"Pemindahan Fail"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"SMS Geolokasi"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Sesi Chatbot"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Apl Kendiri Chatbot"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Versi Chatbot"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Peruntukan Selesai"</string>
+ <string name="registration_done" msgid="492878616836655421">"Pendaftaran Selesai"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"TIADA"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"SETEMPAT"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"TIDAK DIKETAHUI"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-ne/strings.xml b/testapps/TestRcsApp/TestApp/res/values-ne/strings.xml
new file mode 100644
index 0000000..51cf376
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-ne/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"प्रबन्ध मिलाउने परीक्षण"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"परीक्षण गर्ने जिम्मा दिनुहोस्"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE परीक्षण"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA परीक्षण"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"परिणाम:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"कलब्याकसम्बन्धी परिणाम:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"क्वेरी क्यापाबिलिटीको नम्बर हाल्नुहोस्। एकभन्दा बढी नम्बर छन् भने \',\' ले छुट्याउनुहोस्।"</string>
+ <string name="number" msgid="9096578126043995890">"नम्बर:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"च्याट गर्नुहोस्"</string>
+ <string name="to" msgid="1156781884609653284">"प्रापक:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"च्याट म्यासेज"</string>
+ <string name="send" msgid="8797467615003240434">"पठाउनुहोस्"</string>
+ <string name="ok" msgid="2206671077510386729">"ठिक छ"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"सत्र सफलतापूर्वक सुरु गरियो"</string>
+ <string name="session_failed" msgid="4524986240102190509">"सत्र सुरु गर्न सकिएन"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"सत्र तयार छैन"</string>
+ <string name="organization" msgid="913518283470119113">"सङ्गठन:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICC को प्रकार:"</string>
+ <string name="protocol" msgid="8626139294022821930">"प्रोटोकोल:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS Cipher Suite:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"स्ट्यान्डअलोन पेजर"</string>
+ <string name="standalone_large" msgid="336170805696694543">"स्ट्यान्डअलोन ठुलो"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"स्ट्यान्डअलोन विलम्बित गरिएको"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"स्ट्यान्डअलोन ठुलो पेजर"</string>
+ <string name="chat" msgid="5500583808773151982">"Chat"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"फाइल स्थानान्तरण"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"भूस्थानसम्बन्धी SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"च्याटबटसँगको सत्र"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"च्याटबट स्ट्यान्डअलोन"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"च्याटबटको संस्करण"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"प्रबन्ध मिलाउने कार्य पूरा भयो"</string>
+ <string name="registration_done" msgid="492878616836655421">"दर्ता गर्ने कार्य पूरा भयो"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"कुनै पनि होइन"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"स्थानीय"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"अज्ञात"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-or/strings.xml b/testapps/TestRcsApp/TestApp/res/values-or/strings.xml
new file mode 100644
index 0000000..5c9491b
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-or/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"ପ୍ରୋଭିଜନିଂ ଟେଷ୍ଟ"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"ଟେଷ୍ଟ ଡେଲିଗେଟ୍ କରନ୍ତୁ"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE ଟେଷ୍ଟ"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA ଟେଷ୍ଟ"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"ଫଳାଫଳ:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"କଲବ୍ୟାକ୍ ଫଳାଫଳ:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"ସାମର୍ଥ୍ୟ ପାଇଁ କ୍ୱେରୀ କରିବାକୁ ନମ୍ବର ଲେଖନ୍ତୁ ଏବଂ ଯଦି ଏକାଧିକ ନମ୍ବର ଅଛି ତେବେ \',\' ଦ୍ୱାରା ଅଲଗା କରନ୍ତୁ।"</string>
+ <string name="number" msgid="9096578126043995890">"ନମ୍ବର:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"ଚାଟ୍ ଆରମ୍ଭ କରନ୍ତୁ"</string>
+ <string name="to" msgid="1156781884609653284">"ପ୍ରାପ୍ତେଷୁ:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"ଚାଟ୍ ମେସେଜ୍"</string>
+ <string name="send" msgid="8797467615003240434">"ପଠାନ୍ତୁ"</string>
+ <string name="ok" msgid="2206671077510386729">"ଠିକ୍ ଅଛି"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"ସେସନ୍ ଆରମ୍ଭ ସଫଳ ହୋଇଛି"</string>
+ <string name="session_failed" msgid="4524986240102190509">"ସେସନ୍ ଆରମ୍ଭ ବିଫଳ ହୋଇଛି"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"ସେସନ୍ ପ୍ରସ୍ତୁତ ନୁହେଁ"</string>
+ <string name="organization" msgid="913518283470119113">"ସଂସ୍ଥା:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICC ପ୍ରକାର:"</string>
+ <string name="protocol" msgid="8626139294022821930">"ପ୍ରୋଟୋକଲ୍:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS ସାଇଫର୍ ସୁଟ୍:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"ଷ୍ଟାଣ୍ଡଏଲୋନ୍ ପେଜର୍"</string>
+ <string name="standalone_large" msgid="336170805696694543">"ଷ୍ଟାଣ୍ଡଏଲୋନ୍ ବଡ଼"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"ଷ୍ଟାଣ୍ଡଏଲୋନ୍ ସ୍ଥଗିତ ହୋଇଛି"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"ଷ୍ଟାଣ୍ଡଏଲୋନ୍ ବଡ଼ ପେଜର୍"</string>
+ <string name="chat" msgid="5500583808773151982">"ଚାଟ୍"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"ଜିଓଲୋକେସନ୍ SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"ଚାଟବଟ୍ ସେସନ୍"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"ଚାଟବଟ୍ ଷ୍ଟାଣ୍ଡଏଲୋନ୍"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"ଚାଟବଟ୍ ସଂସ୍କରଣ"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"ପ୍ରୋଭିଜନିଂ ହୋଇଗଲା"</string>
+ <string name="registration_done" msgid="492878616836655421">"ପଞ୍ଜିକରଣ ହୋଇଗଲା"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"କିଛି ନାହିଁ"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"ସ୍ଥାନୀୟ"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"ଅଜଣା"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-ro/strings.xml b/testapps/TestRcsApp/TestApp/res/values-ro/strings.xml
new file mode 100644
index 0000000..593cf46
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-ro/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Test de configurare a accesului pentru utilizatori"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Test delegat"</string>
+ <string name="uce_test" msgid="6466919844953883038">"Test UCE"</string>
+ <string name="gba_test" msgid="8786745991279224003">"Test GBA"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"Rezultat:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Rezultatul apelării inverse:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Introduceți numărul pentru capacitatea de interogare și separați prin „,” dacă aveți mai multe."</string>
+ <string name="number" msgid="9096578126043995890">"Număr:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Începeți conversația"</string>
+ <string name="to" msgid="1156781884609653284">"Către:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Mesaj prin chat"</string>
+ <string name="send" msgid="8797467615003240434">"Trimiteți"</string>
+ <string name="ok" msgid="2206671077510386729">"OK"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"S-a inițializat sesiunea"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Sesiunea nu a fost inițializată"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Sesiunea nu este gata"</string>
+ <string name="organization" msgid="913518283470119113">"Organizație:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"Tip UICC:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Protocol:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"Suita cifrului TLS:"</string>
+ <string name="naf" msgid="7620247915001854662">"URI NAF:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Pager autonom"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Autonom mare"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Autonom amânat"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Pager autonom mare"</string>
+ <string name="chat" msgid="5500583808773151982">"Chat"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"Transfer de fișier"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"SMS pentru localizare geografică"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Sesiune chatbot"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Chatbot autonom"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Versiune chatbot"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"S-a configurat accesul pentru utilizatori"</string>
+ <string name="registration_done" msgid="492878616836655421">"S-a înregistrat"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"NICIUNA"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"LOCAL"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"NECUNOSCUTĂ"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-ru/strings.xml b/testapps/TestRcsApp/TestApp/res/values-ru/strings.xml
new file mode 100644
index 0000000..1276015
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-ru/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Тест инициализации"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Делегирование теста"</string>
+ <string name="uce_test" msgid="6466919844953883038">"Тест UCE"</string>
+ <string name="gba_test" msgid="8786745991279224003">"Тест GBA"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"Результат:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Результат обратного вызова:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Введите номер для запроса возможности. Разделяйте номера запятыми, если их несколько."</string>
+ <string name="number" msgid="9096578126043995890">"Номер:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Начать чат"</string>
+ <string name="to" msgid="1156781884609653284">"Кому:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Сообщение чата"</string>
+ <string name="send" msgid="8797467615003240434">"Отправить"</string>
+ <string name="ok" msgid="2206671077510386729">"ОК"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"Инициализация сеанса выполнена"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Сбой инициализации сеанса"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Сеанс не готов\\"</string>
+ <string name="organization" msgid="913518283470119113">"Организация:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"Тип UICC:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Протокол:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"Шифронабор TLS:"</string>
+ <string name="naf" msgid="7620247915001854662">"URI NAF:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Автономный пейджер"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Автономный большой"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Автономный отложенный"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Автономный большой пейджер"</string>
+ <string name="chat" msgid="5500583808773151982">"Чат"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"Передача файла"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"SMS геолокации"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Сеанс чат-бота"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Автономный чат-бот"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Версия чат-бота"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Инициализация выполнена"</string>
+ <string name="registration_done" msgid="492878616836655421">"Регистрация выполнена"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"НЕТ"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"МЕСТНАЯ СЕТЬ"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"НЕИЗВЕСТНО"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-sl/strings.xml b/testapps/TestRcsApp/TestApp/res/values-sl/strings.xml
new file mode 100644
index 0000000..ca62620
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-sl/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Preizkus priprave za uporabo"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Preizkus dodelitve"</string>
+ <string name="uce_test" msgid="6466919844953883038">"Preizkus UCE"</string>
+ <string name="gba_test" msgid="8786745991279224003">"Preizkus GBA"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"Rezultat:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Rezultat povratnega klica:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Vnesite številko, da pošljete poizvedbo za zmogljivost. Če jih je več, jih ločite z vejicami."</string>
+ <string name="number" msgid="9096578126043995890">"Številka:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Zaženi Chat"</string>
+ <string name="to" msgid="1156781884609653284">"Za:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Sporočilo v storitvi Chat"</string>
+ <string name="send" msgid="8797467615003240434">"Pošlji"</string>
+ <string name="ok" msgid="2206671077510386729">"V redu"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"Inicializacija seje je uspela"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Inicializacija seje ni uspela"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Seja ni pripravljena"</string>
+ <string name="organization" msgid="913518283470119113">"Organizacija:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"Vrsta UICC:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Protokol:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"Zbirka šifriranja TLS:"</string>
+ <string name="naf" msgid="7620247915001854662">"URI NAF:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Samostojni pozivnik"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Samostojno veliko"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Samostojno odloženo"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Samostojni veliki pozivnik"</string>
+ <string name="chat" msgid="5500583808773151982">"Chat"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"Prenos datotek"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"Geolokacijski SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Seja bota za klepet"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Samostojni bot za klepet"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Različica bota za klepet"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Priprava za uporabo je končana"</string>
+ <string name="registration_done" msgid="492878616836655421">"Registracija je končana"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"NONE"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"LOCAL"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"UNKNOWN"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-te/strings.xml b/testapps/TestRcsApp/TestApp/res/values-te/strings.xml
new file mode 100644
index 0000000..7a0643d
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-te/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"నిర్వహణ టెస్ట్"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"డెలిగేట్ టెస్ట్"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE టెస్ట్"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA టెస్ట్"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"ఫలితం:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"కాల్బ్యాక్ ఫలితం:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"క్వెరీ సామర్థ్యం కోసం నంబర్ను ఎంటర్ చేసి, అవి ఒకటి కంటే ఎక్కువ ఉంటే \',\'తో వేరు చేయండి."</string>
+ <string name="number" msgid="9096578126043995890">"నంబర్:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"చాట్ను ప్రారంభించండి"</string>
+ <string name="to" msgid="1156781884609653284">"వీరికి:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"చాట్ మెసేజ్"</string>
+ <string name="send" msgid="8797467615003240434">"పంపు"</string>
+ <string name="ok" msgid="2206671077510386729">"సరే"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"సెషన్ ప్రారంభం విజయవంతమైంది"</string>
+ <string name="session_failed" msgid="4524986240102190509">"సెషన్ ప్రారంభం విఫలమైంది"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"సెషన్ సిద్ధంగా ఉంది"</string>
+ <string name="organization" msgid="913518283470119113">"సంస్థ:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICC రకం:"</string>
+ <string name="protocol" msgid="8626139294022821930">"ప్రోటోకాల్:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS Cipher Suite:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"స్టాండ్ఎలోన్ పేజర్"</string>
+ <string name="standalone_large" msgid="336170805696694543">"స్టాండ్ఎలోన్ లార్జ్"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"స్టాండ్ఎలోన్ వాయిదా వేయబడింది"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"స్టాండ్ఎలోన్ లార్జ్ పేజర్"</string>
+ <string name="chat" msgid="5500583808773151982">"చాట్"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"ఫైల్ బదిలీ"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"భౌగోళిక స్థాన SMS"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"చాట్బాట్ సెషన్"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"చాట్బాట్ స్టాండ్ఎలోన్"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"చాట్బాట్ వెర్షన్"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"నిర్వహణ పూర్తయింది"</string>
+ <string name="registration_done" msgid="492878616836655421">"రిజిస్ట్రేషన్ పూర్తయింది"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"ఏదీ కాదు"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"LOCAL"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"తెలియదు"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-tl/strings.xml b/testapps/TestRcsApp/TestApp/res/values-tl/strings.xml
new file mode 100644
index 0000000..e2dc0cb
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-tl/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Pagsusuri ng Provisioning"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Pagsusuri ng Pinaglaanan"</string>
+ <string name="uce_test" msgid="6466919844953883038">"Pagsusuri ng UCE"</string>
+ <string name="gba_test" msgid="8786745991279224003">"Pagsusuri ng GBA"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"Resulta:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Resulta ng Callback:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Ilagay ang numero para i-query ang kakayahan at paghiwa-hiwalayin gamit ang \',\' kung marami ito."</string>
+ <string name="number" msgid="9096578126043995890">"Numero:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Simulan ang Chat"</string>
+ <string name="to" msgid="1156781884609653284">"Para sa:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Mensahe sa Chat"</string>
+ <string name="send" msgid="8797467615003240434">"Ipadala"</string>
+ <string name="ok" msgid="2206671077510386729">"OK"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"Matagumpay na nasimulan ang session"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Hindi nasimulan ang session"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Hindi pa handa ang session"</string>
+ <string name="organization" msgid="913518283470119113">"Organisasyon:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"Uri ng UICC:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Protocol:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS Cipher Suite:"</string>
+ <string name="naf" msgid="7620247915001854662">"URI ng NAF:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Standalone Pager"</string>
+ <string name="standalone_large" msgid="336170805696694543">"Standalone Large"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"Standalone Deferred"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Standalone Large Pager"</string>
+ <string name="chat" msgid="5500583808773151982">"Chat"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"Paglilipat ng File"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"SMS ng Geolocation"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Chatbot Session"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"Chatbot Standalone"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Bersyon ng Chatbot"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Tapos na ang Provisioning"</string>
+ <string name="registration_done" msgid="492878616836655421">"Tapos na ang Pagpaparehistro"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"WALA"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"LOKAL"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"HINDI ALAM"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-zh-rHK/strings.xml b/testapps/TestRcsApp/TestApp/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..ec7f74a
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-zh-rHK/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"佈建測試"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"委派測試"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE 測試"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA 測試"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"結果:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"回撥電話結果:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"輸入要查詢功能的號碼;如果有多組號碼,請以半形逗號 (,) 分隔。"</string>
+ <string name="number" msgid="9096578126043995890">"號碼:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"發起即時通訊"</string>
+ <string name="to" msgid="1156781884609653284">"收件者:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"即時通訊訊息"</string>
+ <string name="send" msgid="8797467615003240434">"傳送"</string>
+ <string name="ok" msgid="2206671077510386729">"確定"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"工作階段初始化失敗成功"</string>
+ <string name="session_failed" msgid="4524986240102190509">"工作階段初始化失敗"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"工作階段尚未就緒"</string>
+ <string name="organization" msgid="913518283470119113">"機構:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICC 類型:"</string>
+ <string name="protocol" msgid="8626139294022821930">"通訊協定:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS 加密套裝組合:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"一般版 UI:呼叫器"</string>
+ <string name="standalone_large" msgid="336170805696694543">"一般版 UI:大型"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"一般版 UI:已延後"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"一般版 UI:大型呼叫器"</string>
+ <string name="chat" msgid="5500583808773151982">"即時通訊"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"檔案傳輸"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"地理位置簡訊"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"聊天機器人工作階段"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"聊天機器人一般版 UI"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"聊天機器人版本"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"已完成佈建"</string>
+ <string name="registration_done" msgid="492878616836655421">"已完成註冊"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"無"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"本地"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"不明"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-zh-rTW/strings.xml b/testapps/TestRcsApp/TestApp/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..ec7f74a
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-zh-rTW/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"佈建測試"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"委派測試"</string>
+ <string name="uce_test" msgid="6466919844953883038">"UCE 測試"</string>
+ <string name="gba_test" msgid="8786745991279224003">"GBA 測試"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"DBClient"</string>
+ <string name="result" msgid="435222369457564619">"結果:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"回撥電話結果:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"輸入要查詢功能的號碼;如果有多組號碼,請以半形逗號 (,) 分隔。"</string>
+ <string name="number" msgid="9096578126043995890">"號碼:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"發起即時通訊"</string>
+ <string name="to" msgid="1156781884609653284">"收件者:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"即時通訊訊息"</string>
+ <string name="send" msgid="8797467615003240434">"傳送"</string>
+ <string name="ok" msgid="2206671077510386729">"確定"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"工作階段初始化失敗成功"</string>
+ <string name="session_failed" msgid="4524986240102190509">"工作階段初始化失敗"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"工作階段尚未就緒"</string>
+ <string name="organization" msgid="913518283470119113">"機構:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"UICC 類型:"</string>
+ <string name="protocol" msgid="8626139294022821930">"通訊協定:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"TLS 加密套裝組合:"</string>
+ <string name="naf" msgid="7620247915001854662">"NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"一般版 UI:呼叫器"</string>
+ <string name="standalone_large" msgid="336170805696694543">"一般版 UI:大型"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"一般版 UI:已延後"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"一般版 UI:大型呼叫器"</string>
+ <string name="chat" msgid="5500583808773151982">"即時通訊"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"檔案傳輸"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"地理位置簡訊"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"聊天機器人工作階段"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"聊天機器人一般版 UI"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"聊天機器人版本"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"已完成佈建"</string>
+ <string name="registration_done" msgid="492878616836655421">"已完成註冊"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"無"</item>
+ <item msgid="7841117287115880098">"3GPP"</item>
+ <item msgid="5871357530951196401">"3GPP2"</item>
+ <item msgid="4979706772323445701">"OMA"</item>
+ <item msgid="1202873556413702218">"GSMA"</item>
+ <item msgid="2237392451840970059">"本地"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"不明"</item>
+ <item msgid="1715684709703792003">"SIM"</item>
+ <item msgid="4592543026990143036">"USIM"</item>
+ <item msgid="8763183137100323328">"RSIM"</item>
+ <item msgid="3778400020205644807">"CSIM"</item>
+ <item msgid="3774607711141191499">"ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/TestApp/res/values-zu/strings.xml b/testapps/TestRcsApp/TestApp/res/values-zu/strings.xml
new file mode 100644
index 0000000..d05fa16
--- /dev/null
+++ b/testapps/TestRcsApp/TestApp/res/values-zu/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="1411081210960307023">"I-RcsClient"</string>
+ <string name="provisioning_test" msgid="1035549386706009246">"Isivivinyo Sokunikezwa"</string>
+ <string name="delegate_test" msgid="8212368545489779643">"Susa Isivivinyo"</string>
+ <string name="uce_test" msgid="6466919844953883038">"Isivivinyo se-UCE"</string>
+ <string name="gba_test" msgid="8786745991279224003">"Isivivinyo se-GBA"</string>
+ <string name="test_msg_client" msgid="5345166277460949996">"TestMessageClient"</string>
+ <string name="db_client" msgid="5131401341721936367">"I-DBClient"</string>
+ <string name="result" msgid="435222369457564619">"Umphumela:"</string>
+ <string name="callback_result" msgid="7162990408241244749">"Imiphumela yokuphinda ushaye:"</string>
+ <string name="initialize_delegate" msgid="1772072838514674246">"initializeSipDelegate"</string>
+ <string name="destroy_delegate" msgid="1678202834033613371">"destroySipDelegate"</string>
+ <string name="uce_description" msgid="1117661457446955869">"Faka inombolo ukubuza amandla futhi uhlukanise ngokuthi \',\' uma kukuningi."</string>
+ <string name="number" msgid="9096578126043995890">"Inombolo:"</string>
+ <string name="request_capability" msgid="7644752985651089411">"requestCapability"</string>
+ <string name="request_availability" msgid="6387685341316953239">"requestNetworkAvailability"</string>
+ <string name="gba_bootstrap" msgid="549563024448934689">"bootstrapAuthenticationRequest"</string>
+ <string name="start_chat" msgid="96121236227112396">"Qalisa Ingxoxo"</string>
+ <string name="to" msgid="1156781884609653284">"Ku:"</string>
+ <string name="chat_message" msgid="3945528453939746046">"Umlayezo Wengxoxo"</string>
+ <string name="send" msgid="8797467615003240434">"Thumela"</string>
+ <string name="ok" msgid="2206671077510386729">"KULUNGILE"</string>
+ <string name="session_succeeded" msgid="4692992136758212220">"Ukuqaliswa kweseshini kuphumelele"</string>
+ <string name="session_failed" msgid="4524986240102190509">"Ukuqaliswa kweseshini kwehlulekile"</string>
+ <string name="session_not_ready" msgid="4612635394279901948">"Iseshini ayilungile"</string>
+ <string name="organization" msgid="913518283470119113">"Inhlangano:"</string>
+ <string name="uicc_type" msgid="5584433205228698588">"Uhlobo lwe-UICC:"</string>
+ <string name="protocol" msgid="8626139294022821930">"Iphrothokholi:"</string>
+ <string name="tls_cs" msgid="5410567052979996834">"I-TLS Cipher Suite:"</string>
+ <string name="naf" msgid="7620247915001854662">"I-NAF URI:"</string>
+ <string name="standalone_pager" msgid="1351341861641131423">"Ipheja ye-Standalone"</string>
+ <string name="standalone_large" msgid="336170805696694543">"I-Standalone Enkulu"</string>
+ <string name="standalone_deferred" msgid="4906576900729108844">"I-Standalone Iyekiswe ukubhekiswa"</string>
+ <string name="standalone_pager_large" msgid="5662294171123433547">"Ipheja ye-Standalone Enkulu"</string>
+ <string name="chat" msgid="5500583808773151982">"Ingxoxo"</string>
+ <string name="file_transfer" msgid="5522080545470609737">"Ukudluliselwa kwefayela"</string>
+ <string name="geolocation_sms" msgid="4463328438708195479">"I-SMS ye-Geolocation"</string>
+ <string name="chatbot_session" msgid="5639314220589146717">"Iseshini ye-Chatbot"</string>
+ <string name="chatbot_standalone" msgid="8159185526765238041">"I-Chatbot Standalone"</string>
+ <string name="chatbot_version" msgid="2431939061806512544">"Inguqulo ye-Chatbot"</string>
+ <string name="provisioning_done" msgid="204618840179891984">"Ukunikezwa kwenziwe"</string>
+ <string name="registration_done" msgid="492878616836655421">"Ukubhalisa Kwenziwe"</string>
+ <string-array name="organization">
+ <item msgid="9074061482474975772">"LUTHO"</item>
+ <item msgid="7841117287115880098">"I-3GPP"</item>
+ <item msgid="5871357530951196401">"I-3GPP2"</item>
+ <item msgid="4979706772323445701">"I-OMA"</item>
+ <item msgid="1202873556413702218">"I-GSMA"</item>
+ <item msgid="2237392451840970059">"OKWENDAWO"</item>
+ </string-array>
+ <string-array name="protocol">
+ <item msgid="7955884038486794595">"SUBSCRIBER_CERTIFICATE"</item>
+ <item msgid="6305648228108532104">"I-MBMS"</item>
+ <item msgid="4369286857827087787">"HTTP_DIGEST_AUTH"</item>
+ <item msgid="1047245839171009229">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="1728229445161381738">"GENERIC_PUSH_LAYER"</item>
+ <item msgid="8586727908453122385">"IMS_MEDIA_PLANE"</item>
+ <item msgid="5721752897501838331">"GENERATION_TMPI"</item>
+ <item msgid="1622910302975417378">"3GPP_HTTP_BASED_MBMS"</item>
+ <item msgid="7519270727796373646">"TLS_DEFAULT"</item>
+ <item msgid="7444251498958422990">"TLS_BROWSER"</item>
+ </string-array>
+ <string-array name="uicc_type">
+ <item msgid="5878327014492655902">"AKWAZIWA"</item>
+ <item msgid="1715684709703792003">"I-SIM"</item>
+ <item msgid="4592543026990143036">"I-USIM"</item>
+ <item msgid="8763183137100323328">"I-RSIM"</item>
+ <item msgid="3778400020205644807">"I-CSIM"</item>
+ <item msgid="3774607711141191499">"I-ISIM"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/msrp/MsrpSession.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/msrp/MsrpSession.java
index 1c461fe..7436da4 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/msrp/MsrpSession.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/msrp/MsrpSession.java
@@ -27,6 +27,8 @@
import android.net.QosSession;
import android.net.QosSessionAttributes;
import android.net.QosSocketInfo;
+import android.os.Handler;
+import android.os.Message;
import android.util.Log;
import android.widget.Toast;
@@ -53,6 +55,7 @@
public class MsrpSession {
private static final String DEDICATED_BEARER_SUCCESS = "Dedicated bearer succeeded";
private static final String DEDICATED_BEARER_ERROR = "Dedicated bearer error";
+ private static final int TOAST_MSG = 1;
private final Network network;
private final Socket socket;
private final InputStream input;
@@ -64,6 +67,7 @@
private final ConnectivityManager connectivityManager;
private final String LOG_TAG = MsrpSession.class.getSimpleName();
private final Context context;
+ private Handler handler;
/** Creates a new MSRP session on the given listener and the provided streams. */
MsrpSession(ConnectivityManager connectivityManager, Context context, Network network,
@@ -76,31 +80,36 @@
this.output = socket.getOutputStream();
this.listener = listener;
+
+ handler = new Handler(context.getMainLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ Toast.makeText(context, msg.obj.toString(), Toast.LENGTH_SHORT).show();
+ }
+ };
+
listenForBearer();
}
private final QosCallback qosCallback = new QosCallback() {
@Override
public void onError(@NonNull QosCallbackException exception) {
- Toast.makeText(context, DEDICATED_BEARER_ERROR, Toast.LENGTH_SHORT).show();
Log.e(LOG_TAG, "onError: " + exception.toString());
- super.onError(exception);
+ handler.sendMessage(handler.obtainMessage(TOAST_MSG, DEDICATED_BEARER_ERROR));
}
@Override
public void onQosSessionAvailable(@NonNull QosSession session,
@NonNull QosSessionAttributes sessionAttributes) {
- Toast.makeText(context, DEDICATED_BEARER_SUCCESS, Toast.LENGTH_SHORT).show();
Log.d(LOG_TAG, "onQosSessionAvailable: " + session.toString() + ", "
+ sessionAttributes.toString());
- super.onQosSessionAvailable(session, sessionAttributes);
+ handler.sendMessage(handler.obtainMessage(TOAST_MSG, DEDICATED_BEARER_SUCCESS));
}
@Override
public void onQosSessionLost(@NonNull QosSession session) {
- Toast.makeText(context, DEDICATED_BEARER_ERROR, Toast.LENGTH_SHORT).show();
Log.e(LOG_TAG, "onQosSessionLost: " + session.toString());
- super.onQosSessionLost(session);
+ handler.sendMessage(handler.obtainMessage(TOAST_MSG, DEDICATED_BEARER_ERROR));
}
};
diff --git a/tests/src/com/android/TestContext.java b/tests/src/com/android/TestContext.java
index fc5ee4c..5456469 100644
--- a/tests/src/com/android/TestContext.java
+++ b/tests/src/com/android/TestContext.java
@@ -27,6 +27,7 @@
import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.Handler;
+import android.os.Looper;
import android.os.PersistableBundle;
import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
@@ -160,6 +161,11 @@
return null;
}
+ @Override
+ public Handler getMainThreadHandler() {
+ return new Handler(Looper.getMainLooper());
+ }
+
/**
* @return CarrierConfig PersistableBundle for the subscription specified.
*/
diff --git a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
index 85e190e..4fba922 100644
--- a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
+++ b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
@@ -579,6 +579,18 @@
@Test
@SmallTest
+ public void testSendBroadcastWhenDmaChanged() throws Exception {
+ createMonitor(3);
+ verify(mPhone, times(3)).sendBroadcast(any(), any());
+
+ updateDefaultMessageApplication(DEFAULT_MESSAGING_APP2);
+ processAllMessages();
+
+ verify(mPhone, times(6)).sendBroadcast(any(), any());
+ }
+
+ @Test
+ @SmallTest
public void testRcsConnectedAndDisconnected() throws Exception {
createMonitor(1);
mRcsProvisioningMonitor.registerRcsProvisioningCallback(
diff --git a/tests/src/com/android/phone/callcomposer/CallComposerAuthTest.java b/tests/src/com/android/phone/callcomposer/CallComposerAuthTest.java
new file mode 100644
index 0000000..b503790
--- /dev/null
+++ b/tests/src/com/android/phone/callcomposer/CallComposerAuthTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 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.callcomposer;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.phone.callcomposer.DigestAuthUtils;
+
+import org.junit.Test;
+
+public class CallComposerAuthTest {
+ @Test
+ public void testResponseGeneration() {
+ String username = "test1";
+ String realm = "test@test.com";
+ byte[] password = "12345678".getBytes();
+ String sNonce = "aaaabbbbcccc";
+ String cNonce = "ccccbbbbaaaa";
+ String ncValue = "00000001";
+ String method = "POST";
+ String uri = "/test/test1?a=b";
+ String qop = "auth";
+
+ String response = DigestAuthUtils.computeResponse(sNonce, cNonce, qop, username,
+ realm, password, method, uri);
+ // precomputed response value from a known-good implementation
+ assertEquals("744d63d6fb11aa132dc906ec95306960", response);
+ }
+}
diff --git a/tests/src/com/android/phone/callcomposer/PictureManagerTest.java b/tests/src/com/android/phone/callcomposer/PictureManagerTest.java
new file mode 100644
index 0000000..f1ce3b8
--- /dev/null
+++ b/tests/src/com/android/phone/callcomposer/PictureManagerTest.java
@@ -0,0 +1,324 @@
+/*
+ * Copyright (C) 2021 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.callcomposer;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.Uri;
+import android.os.OutcomeReceiver;
+import android.os.PersistableBundle;
+import android.os.UserHandle;
+import android.provider.CallLog;
+import android.telephony.CarrierConfigManager;
+import android.telephony.TelephonyManager;
+import android.telephony.gba.TlsParams;
+import android.telephony.gba.UaSecurityProtocolIdentifier;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.io.InputStream;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+public class PictureManagerTest {
+ private static final String FAKE_URL_BASE = "https://www.example.com";
+ private static final String FAKE_URL = "https://www.example.com/AAAAA";
+ private static final long TIMEOUT_MILLIS = 1000;
+ private static final Uri FAKE_CALLLOG_URI = Uri.parse("content://asdf");
+
+ @Mock CallComposerPictureManager.CallLogProxy mockCallLogProxy;
+ @Mock CallComposerPictureTransfer mockPictureTransfer;
+ @Mock Context context;
+ @Mock TelephonyManager telephonyManager;
+
+ private boolean originalTestMode = false;
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ originalTestMode = CallComposerPictureManager.sTestMode;
+ // Even though this is a test, we want test mode off so we can actually exercise the logic
+ // in the class.
+ CallComposerPictureManager.sTestMode = false;
+ when(context.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(telephonyManager);
+ when(context.getSystemServiceName(TelephonyManager.class))
+ .thenReturn(Context.TELEPHONY_SERVICE);
+ when(telephonyManager.createForSubscriptionId(anyInt())).thenReturn(telephonyManager);
+ PersistableBundle b = new PersistableBundle();
+ b.putString(CarrierConfigManager.KEY_CALL_COMPOSER_PICTURE_SERVER_URL_STRING,
+ FAKE_URL_BASE);
+ b.putInt(CarrierConfigManager.KEY_GBA_MODE_INT,
+ CarrierConfigManager.GBA_ME);
+ b.putInt(CarrierConfigManager.KEY_GBA_UA_SECURITY_ORGANIZATION_INT,
+ UaSecurityProtocolIdentifier.ORG_3GPP);
+ b.putInt(CarrierConfigManager.KEY_GBA_UA_SECURITY_PROTOCOL_INT,
+ UaSecurityProtocolIdentifier.UA_SECURITY_PROTOCOL_3GPP_TLS_DEFAULT);
+ b.putInt(CarrierConfigManager.KEY_GBA_UA_TLS_CIPHER_SUITE_INT,
+ TlsParams.TLS_RSA_WITH_AES_128_CBC_SHA);
+ when(telephonyManager.getCarrierConfig()).thenReturn(b);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ CallComposerPictureManager.sTestMode = originalTestMode;
+ CallComposerPictureManager.clearInstances();
+ }
+
+ @Test
+ public void testPictureUpload() throws Exception {
+ CallComposerPictureManager manager = CallComposerPictureManager.getInstance(context, 0);
+ manager.setCallLogProxy(mockCallLogProxy);
+ ImageData imageData = new ImageData(new byte[] {1,2,3,4},
+ "image/png", null);
+
+ CompletableFuture<UUID> uploadedUuidFuture = new CompletableFuture<>();
+ manager.handleUploadToServer(new CallComposerPictureTransfer.Factory() {
+ @Override
+ public CallComposerPictureTransfer create(Context context, int subscriptionId,
+ String url, ExecutorService executorService) {
+ return mockPictureTransfer;
+ }
+ }, imageData, (pair) -> uploadedUuidFuture.complete(pair.first));
+
+ // Get the callback for later manipulation
+ ArgumentCaptor<CallComposerPictureTransfer.PictureCallback> callbackCaptor =
+ ArgumentCaptor.forClass(CallComposerPictureTransfer.PictureCallback.class);
+ verify(mockPictureTransfer).setCallback(callbackCaptor.capture());
+
+ // Make sure the upload method is called
+ ArgumentCaptor<GbaCredentialsSupplier> credSupplierCaptor =
+ ArgumentCaptor.forClass(GbaCredentialsSupplier.class);
+ ArgumentCaptor<ImageData> imageDataCaptor =
+ ArgumentCaptor.forClass(ImageData.class);
+ verify(mockPictureTransfer).uploadPicture(imageDataCaptor.capture(),
+ credSupplierCaptor.capture());
+
+ // Make sure the id field on the image data got filled in
+ ImageData sentData = imageDataCaptor.getValue();
+ assertArrayEquals(imageData.getImageBytes(), sentData.getImageBytes());
+ assertNotNull(sentData.getId());
+ String imageId = sentData.getId();
+
+ testGbaCredLookup(credSupplierCaptor.getValue(), false);
+
+ // Trigger upload success, make sure that the internal state is consistent after the upload.
+ callbackCaptor.getValue().onUploadSuccessful(FAKE_URL);
+ UUID id = uploadedUuidFuture.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+ assertEquals(imageId, id.toString());
+ assertEquals(FAKE_URL, manager.getServerUrlForImageId(id));
+
+ // Test the call log upload
+ CompletableFuture<Uri> callLogUriFuture = new CompletableFuture<>();
+ manager.storeUploadedPictureToCallLog(id, callLogUriFuture::complete);
+
+ ArgumentCaptor<OutcomeReceiver<Uri, CallLog.CallComposerLoggingException>>
+ callLogCallbackCaptor = ArgumentCaptor.forClass(OutcomeReceiver.class);
+
+ verify(mockCallLogProxy).storeCallComposerPictureAsUser(nullable(Context.class),
+ nullable(UserHandle.class), nullable(InputStream.class), nullable(Executor.class),
+ callLogCallbackCaptor.capture());
+ callLogCallbackCaptor.getValue().onResult(FAKE_CALLLOG_URI);
+ Uri receivedUri = callLogUriFuture.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+ assertEquals(FAKE_CALLLOG_URI, receivedUri);
+ }
+
+ @Test
+ public void testPictureUploadWithAuthRefresh() throws Exception {
+ CallComposerPictureManager manager = CallComposerPictureManager.getInstance(context, 0);
+ manager.setCallLogProxy(mockCallLogProxy);
+ ImageData imageData = new ImageData(new byte[] {1,2,3,4},
+ "image/png", null);
+
+ CompletableFuture<UUID> uploadedUuidFuture = new CompletableFuture<>();
+ manager.handleUploadToServer(new CallComposerPictureTransfer.Factory() {
+ @Override
+ public CallComposerPictureTransfer create(Context context, int subscriptionId,
+ String url, ExecutorService executorService) {
+ return mockPictureTransfer;
+ }
+ }, imageData, (pair) -> uploadedUuidFuture.complete(pair.first));
+
+ // Get the callback for later manipulation
+ ArgumentCaptor<CallComposerPictureTransfer.PictureCallback> callbackCaptor =
+ ArgumentCaptor.forClass(CallComposerPictureTransfer.PictureCallback.class);
+ verify(mockPictureTransfer).setCallback(callbackCaptor.capture());
+
+ // Make sure the upload method is called
+ verify(mockPictureTransfer).uploadPicture(nullable(ImageData.class),
+ nullable(GbaCredentialsSupplier.class));
+
+ // Simulate a auth-needed retry request
+ callbackCaptor.getValue().onRetryNeeded(true, 0);
+ waitForExecutorAction(CallComposerPictureManager.getExecutor(), TIMEOUT_MILLIS);
+
+ // Make sure upload gets called again immediately, and make sure that the new GBA creds
+ // are requested with a force-refresh.
+ ArgumentCaptor<GbaCredentialsSupplier> credSupplierCaptor =
+ ArgumentCaptor.forClass(GbaCredentialsSupplier.class);
+ verify(mockPictureTransfer, times(2)).uploadPicture(nullable(ImageData.class),
+ credSupplierCaptor.capture());
+
+ testGbaCredLookup(credSupplierCaptor.getValue(), true);
+ }
+
+ @Test
+ public void testPictureDownload() throws Exception {
+ ImageData imageData = new ImageData(new byte[] {1,2,3,4},
+ "image/png", null);
+ CallComposerPictureManager manager = CallComposerPictureManager.getInstance(context, 0);
+ manager.setCallLogProxy(mockCallLogProxy);
+
+ CompletableFuture<Uri> callLogUriFuture = new CompletableFuture<>();
+ manager.handleDownloadFromServer(new CallComposerPictureTransfer.Factory() {
+ @Override
+ public CallComposerPictureTransfer create(Context context, int subscriptionId,
+ String url, ExecutorService executorService) {
+ return mockPictureTransfer;
+ }
+ }, FAKE_URL, (p) -> callLogUriFuture.complete(p.first));
+
+ // Get the callback for later manipulation
+ ArgumentCaptor<CallComposerPictureTransfer.PictureCallback> callbackCaptor =
+ ArgumentCaptor.forClass(CallComposerPictureTransfer.PictureCallback.class);
+ verify(mockPictureTransfer).setCallback(callbackCaptor.capture());
+
+ // Make sure the download method is called
+ ArgumentCaptor<GbaCredentialsSupplier> credSupplierCaptor =
+ ArgumentCaptor.forClass(GbaCredentialsSupplier.class);
+ verify(mockPictureTransfer).downloadPicture(credSupplierCaptor.capture());
+
+ testGbaCredLookup(credSupplierCaptor.getValue(), false);
+
+ // Trigger download success, make sure that the call log is called into next.
+ callbackCaptor.getValue().onDownloadSuccessful(imageData);
+ ArgumentCaptor<OutcomeReceiver<Uri, CallLog.CallComposerLoggingException>>
+ callLogCallbackCaptor = ArgumentCaptor.forClass(OutcomeReceiver.class);
+ verify(mockCallLogProxy).storeCallComposerPictureAsUser(nullable(Context.class),
+ nullable(UserHandle.class), nullable(InputStream.class), nullable(Executor.class),
+ callLogCallbackCaptor.capture());
+
+ callLogCallbackCaptor.getValue().onResult(FAKE_CALLLOG_URI);
+ Uri receivedUri = callLogUriFuture.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+ assertEquals(FAKE_CALLLOG_URI, receivedUri);
+ }
+
+ @Test
+ public void testPictureDownloadWithAuthRefresh() throws Exception {
+ CallComposerPictureManager manager = CallComposerPictureManager.getInstance(context, 0);
+ manager.setCallLogProxy(mockCallLogProxy);
+
+ CompletableFuture<Uri> callLogUriFuture = new CompletableFuture<>();
+ manager.handleDownloadFromServer(new CallComposerPictureTransfer.Factory() {
+ @Override
+ public CallComposerPictureTransfer create(Context context, int subscriptionId,
+ String url, ExecutorService executorService) {
+ return mockPictureTransfer;
+ }
+ }, FAKE_URL, (p) -> callLogUriFuture.complete(p.first));
+
+ // Get the callback for later manipulation
+ ArgumentCaptor<CallComposerPictureTransfer.PictureCallback> callbackCaptor =
+ ArgumentCaptor.forClass(CallComposerPictureTransfer.PictureCallback.class);
+ verify(mockPictureTransfer).setCallback(callbackCaptor.capture());
+
+ // Make sure the download method is called
+ verify(mockPictureTransfer).downloadPicture(nullable(GbaCredentialsSupplier.class));
+
+ // Simulate a auth-needed retry request
+ callbackCaptor.getValue().onRetryNeeded(true, 0);
+ waitForExecutorAction(CallComposerPictureManager.getExecutor(), TIMEOUT_MILLIS);
+
+ // Make sure download gets called again immediately, and make sure that the new GBA creds
+ // are requested with a force-refresh.
+ ArgumentCaptor<GbaCredentialsSupplier> credSupplierCaptor =
+ ArgumentCaptor.forClass(GbaCredentialsSupplier.class);
+ verify(mockPictureTransfer, times(2)).downloadPicture(credSupplierCaptor.capture());
+
+ testGbaCredLookup(credSupplierCaptor.getValue(), true);
+ }
+
+
+ public void testGbaCredLookup(GbaCredentialsSupplier supplier, boolean forceExpected)
+ throws Exception {
+ String fakeNafId = "https://3GPP-bootstrapping@www.example.com";
+ byte[] fakeKey = new byte[] {1, 2, 3, 4, 5};
+ String fakeTxId = "89sdfjggf";
+
+ ArgumentCaptor<TelephonyManager.BootstrapAuthenticationCallback> authCallbackCaptor =
+ ArgumentCaptor.forClass(TelephonyManager.BootstrapAuthenticationCallback.class);
+
+ CompletableFuture<GbaCredentials> credsFuture =
+ supplier.getCredentials(fakeNafId, CallComposerPictureManager.getExecutor());
+ verify(telephonyManager).bootstrapAuthenticationRequest(anyInt(),
+ eq(Uri.parse(fakeNafId)),
+ nullable(UaSecurityProtocolIdentifier.class), eq(forceExpected),
+ nullable(Executor.class),
+ authCallbackCaptor.capture());
+ authCallbackCaptor.getValue().onKeysAvailable(fakeKey, fakeTxId);
+ GbaCredentials creds = credsFuture.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+ assertEquals(fakeTxId, creds.getTransactionId());
+ assertArrayEquals(fakeKey, creds.getKey());
+
+
+ // Do it again and see if we make another request, then make sure that matches up with what
+ // we expected.
+ CompletableFuture<GbaCredentials> credsFuture1 =
+ supplier.getCredentials(fakeNafId, CallComposerPictureManager.getExecutor());
+ verify(telephonyManager, times(forceExpected ? 2 : 1))
+ .bootstrapAuthenticationRequest(anyInt(), eq(Uri.parse(fakeNafId)),
+ nullable(UaSecurityProtocolIdentifier.class),
+ eq(forceExpected),
+ nullable(Executor.class),
+ authCallbackCaptor.capture());
+ authCallbackCaptor.getValue().onKeysAvailable(fakeKey, fakeTxId);
+ GbaCredentials creds1 = credsFuture1.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+ assertEquals(fakeTxId, creds1.getTransactionId());
+ assertArrayEquals(fakeKey, creds1.getKey());
+ }
+
+ private static boolean waitForExecutorAction(
+ ExecutorService executorService, long timeoutMillis) {
+ CompletableFuture<Void> f = new CompletableFuture<>();
+ executorService.execute(() -> f.complete(null));
+ try {
+ f.get(timeoutMillis, TimeUnit.MILLISECONDS);
+ } catch (TimeoutException e) {
+ return false;
+ } catch (InterruptedException | ExecutionException e) {
+ throw new RuntimeException(e);
+ }
+ return true;
+ }
+}
diff --git a/tests/src/com/android/services/telephony/ImsConferenceControllerTest.java b/tests/src/com/android/services/telephony/ImsConferenceControllerTest.java
index edfc34f..33c8b8a 100644
--- a/tests/src/com/android/services/telephony/ImsConferenceControllerTest.java
+++ b/tests/src/com/android/services/telephony/ImsConferenceControllerTest.java
@@ -27,8 +27,6 @@
import android.os.Looper;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.internal.telephony.PhoneConstants;
-
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
@@ -112,12 +110,10 @@
@Test
@SmallTest
public void testMergeMultiPartyCalls() {
- when(mTestTelephonyConnectionA.mMockRadioConnection.getPhoneType())
- .thenReturn(PhoneConstants.PHONE_TYPE_IMS);
- when(mTestTelephonyConnectionB.mMockRadioConnection.getPhoneType())
- .thenReturn(PhoneConstants.PHONE_TYPE_IMS);
- when(mTestTelephonyConnectionA.mMockRadioConnection.isMultiparty()).thenReturn(true);
- when(mTestTelephonyConnectionB.mMockRadioConnection.isMultiparty()).thenReturn(true);
+ mTestTelephonyConnectionA.setIsImsConnection(true);
+ mTestTelephonyConnectionB.setIsImsConnection(true);
+ when(mTestTelephonyConnectionA.mImsPhoneConnection.isMultiparty()).thenReturn(true);
+ when(mTestTelephonyConnectionB.mImsPhoneConnection.isMultiparty()).thenReturn(true);
mControllerTest.add(mTestTelephonyConnectionB);
mControllerTest.add(mTestTelephonyConnectionA);
diff --git a/tests/src/com/android/services/telephony/ImsConferenceTest.java b/tests/src/com/android/services/telephony/ImsConferenceTest.java
index 7e6488d..3bc5ee8 100644
--- a/tests/src/com/android/services/telephony/ImsConferenceTest.java
+++ b/tests/src/com/android/services/telephony/ImsConferenceTest.java
@@ -577,6 +577,51 @@
}
/**
+ * Similar to {@link #testLocalDisconnectOnEmptyConference()}, except tests the case where the
+ * conference first drops to a single participant, triggering single party conference emulation.
+ * Ensure that we will still recognize this and disconnect the conference.
+ * @throws Exception
+ */
+ @Test
+ @SmallTest
+ public void testLocalDisconnectOnEmptySinglePartyConference() throws Exception {
+ when(mMockTelecomAccountRegistry.isUsingSimCallManager(any(PhoneAccountHandle.class)))
+ .thenReturn(false);
+
+ ImsConference imsConference = new ImsConference(mMockTelecomAccountRegistry,
+ mMockTelephonyConnectionServiceProxy, mConferenceHost,
+ null /* phoneAccountHandle */, () -> false /* featureFlagProxy */,
+ new ImsConference.CarrierConfiguration.Builder()
+ .setShouldLocalDisconnectEmptyConference(true)
+ .build());
+
+ ConferenceParticipant participant1 = new ConferenceParticipant(
+ Uri.parse("tel:6505551212"),
+ "A",
+ Uri.parse("sip:6505551212@testims.com"),
+ Connection.STATE_ACTIVE,
+ Call.Details.DIRECTION_INCOMING);
+ ConferenceParticipant participant2 = new ConferenceParticipant(
+ Uri.parse("tel:6505551213"),
+ "A",
+ Uri.parse("sip:6505551213@testims.com"),
+ Connection.STATE_ACTIVE,
+ Call.Details.DIRECTION_INCOMING);
+ imsConference.handleConferenceParticipantsUpdate(mConferenceHost,
+ Arrays.asList(participant1, participant2));
+ assertEquals(2, imsConference.getNumberOfParticipants());
+
+ // Drop to 1 participant which enters single party mode.
+ imsConference.handleConferenceParticipantsUpdate(mConferenceHost,
+ Arrays.asList(participant1));
+
+ // Drop to 0 participants; should have a hangup request.
+ imsConference.handleConferenceParticipantsUpdate(mConferenceHost, Collections.emptyList());
+ assertEquals(0, imsConference.getNumberOfParticipants());
+ verify(mConferenceHost.mMockCall).hangup();
+ }
+
+ /**
* Verifies that an ImsConference can handle SIP and TEL URIs for both the P-Associated-Uri and
* conference event package identities.
*/
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index b761959..4ce94ca 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -26,10 +26,10 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -42,8 +42,6 @@
import android.os.AsyncResult;
import android.os.Bundle;
import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Message;
import android.telecom.ConnectionRequest;
import android.telecom.DisconnectCause;
import android.telecom.PhoneAccountHandle;
@@ -58,6 +56,8 @@
import androidx.test.runner.AndroidJUnit4;
import com.android.TelephonyTestBase;
+import com.android.internal.telecom.IConnectionService;
+import com.android.internal.telephony.Call;
import com.android.internal.telephony.CallStateException;
import com.android.internal.telephony.Connection;
import com.android.internal.telephony.Phone;
@@ -84,6 +84,23 @@
@RunWith(AndroidJUnit4.class)
public class TelephonyConnectionServiceTest extends TelephonyTestBase {
+ /**
+ * Unlike {@link TestTelephonyConnection}, a bare minimal {@link TelephonyConnection} impl
+ * that does not try to configure anything.
+ */
+ public static class SimpleTelephonyConnection extends TelephonyConnection {
+ public boolean wasDisconnected = false;
+
+ @Override
+ public TelephonyConnection cloneConnection() {
+ return null;
+ }
+
+ @Override
+ public void hangup(int telephonyDisconnectCode) {
+ wasDisconnected = true;
+ }
+ }
private static final long TIMEOUT_MS = 100;
private static final int SLOT_0_PHONE_ID = 0;
@@ -107,13 +124,18 @@
@Mock TelephonyConnectionService.PhoneSwitcherProxy mPhoneSwitcherProxy;
@Mock TelephonyConnectionService.PhoneNumberUtilsProxy mPhoneNumberUtilsProxy;
@Mock TelephonyConnectionService.PhoneUtilsProxy mPhoneUtilsProxy;
- @Mock TelephonyConnectionService.HandlerFactory mHandlerFactory;
@Mock TelephonyConnectionService.DisconnectCauseFactory mDisconnectCauseFactory;
@Mock Handler mMockHandler;
@Mock EmergencyNumberTracker mEmergencyNumberTracker;
@Mock PhoneSwitcher mPhoneSwitcher;
@Mock RadioOnHelper mRadioOnHelper;
@Mock ServiceStateTracker mSST;
+ @Mock Call mCall;
+ @Mock Call mCall2;
+ @Mock com.android.internal.telephony.Connection mInternalConnection;
+ @Mock com.android.internal.telephony.Connection mInternalConnection2;
+ private Phone mPhone0;
+ private Phone mPhone1;
private static class TestTelephonyConnectionService extends TelephonyConnectionService {
@@ -132,6 +154,7 @@
}
private TelephonyConnectionService mTestConnectionService;
+ private IConnectionService.Stub mBinderStub;
@Before
public void setUp() throws Exception {
@@ -147,11 +170,6 @@
.thenAnswer(invocation -> invocation.getArgument(1));
mTestConnectionService.setPhoneNumberUtilsProxy(mPhoneNumberUtilsProxy);
mTestConnectionService.setPhoneUtilsProxy(mPhoneUtilsProxy);
- HandlerThread mockHandlerThread = mock(HandlerThread.class);
- doReturn(mockHandlerThread).when(mHandlerFactory).createHandlerThread(anyString());
- doReturn(null).when(mockHandlerThread).getLooper();
- doReturn(mMockHandler).when(mHandlerFactory).createHandler(any());
- mTestConnectionService.setHandlerFactory(mHandlerFactory);
mTestConnectionService.setDeviceState(mDeviceState);
mTestConnectionService.setRadioOnHelper(mRadioOnHelper);
doReturn(new DisconnectCause(DisconnectCause.UNKNOWN)).when(mDisconnectCauseFactory)
@@ -161,6 +179,7 @@
mTestConnectionService.setDisconnectCauseFactory(mDisconnectCauseFactory);
mTestConnectionService.onCreate();
mTestConnectionService.setTelephonyManagerProxy(mTelephonyManagerProxy);
+ mBinderStub = (IConnectionService.Stub) mTestConnectionService.onBind(null);
}
@After
@@ -648,7 +667,7 @@
// was redialed on the same slot
assertEquals(0, c.getNotifyPhoneAccountChangedCount());
try {
- verify(slot0Phone).dial(anyString(), any());
+ verify(slot0Phone).dial(anyString(), any(), any());
} catch (CallStateException e) {
// This shouldn't happen
fail();
@@ -679,7 +698,7 @@
// was never redialed
assertEquals(0, c.getNotifyPhoneAccountChangedCount());
try {
- verify(slot0Phone, never()).dial(anyString(), any());
+ verify(slot0Phone, never()).dial(anyString(), any(), any());
} catch (CallStateException e) {
// This shouldn't happen
fail();
@@ -722,7 +741,7 @@
// redialed on another slot
assertEquals(1, c.getNotifyPhoneAccountChangedCount());
try {
- verify(slot1Phone).dial(anyString(), any());
+ verify(slot1Phone).dial(anyString(), any(), any());
} catch (CallStateException e) {
// This shouldn't happen
fail();
@@ -763,7 +782,7 @@
// redialed on another slot
assertEquals(1, c.getNotifyPhoneAccountChangedCount());
try {
- verify(slot1Phone).dial(anyString(), any());
+ verify(slot1Phone).dial(anyString(), any(), any());
} catch (CallStateException e) {
// This shouldn't happen
fail();
@@ -817,8 +836,8 @@
// redialed on another slot
assertEquals(2, c.getNotifyPhoneAccountChangedCount());
try {
- verify(slot0Phone).dial(anyString(), any());
- verify(slot1Phone).dial(anyString(), any());
+ verify(slot0Phone).dial(anyString(), any(), any());
+ verify(slot1Phone).dial(anyString(), any(), any());
} catch (CallStateException e) {
// This shouldn't happen
fail();
@@ -870,8 +889,8 @@
// redialed on another slot
assertEquals(1, c.getNotifyPhoneAccountChangedCount());
try {
- verify(slot1Phone).dial(anyString(), any());
- verify(slot0Phone, never()).dial(anyString(), any());
+ verify(slot1Phone).dial(anyString(), any(), any());
+ verify(slot0Phone, never()).dial(anyString(), any(), any());
} catch (CallStateException e) {
// This shouldn't happen
fail();
@@ -931,22 +950,20 @@
@Test
@SmallTest
public void testCreateOutgoingEmergencyConnection_delayDial_carrierconfig_dds() {
- Phone testPhone = setupConnectionServiceForDelayDial();
- Runnable delayDialRunnable = verifyRunnablePosted();
-
// Setup test to not support SUPL on the non-DDS subscription
doReturn(true).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
getTestContext().getCarrierConfig(0 /*subId*/).putStringArray(
CarrierConfigManager.Gps.KEY_ES_SUPL_DATA_PLANE_ONLY_ROAMING_PLMN_STRING_ARRAY,
null);
- testPhone.getServiceState().setRoaming(false);
getTestContext().getCarrierConfig(0 /*subId*/).putInt(
CarrierConfigManager.Gps.KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT,
CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_DP_ONLY);
getTestContext().getCarrierConfig(0 /*subId*/).putString(
CarrierConfigManager.Gps.KEY_ES_EXTENSION_SEC_STRING, "150");
- delayDialRunnable.run();
+ Phone testPhone = setupConnectionServiceForDelayDial(
+ false /* isRoaming */, false /* setOperatorName */, null /* operator long name*/,
+ null /* operator short name */, null /* operator numeric name */);
verify(mPhoneSwitcher).overrideDefaultDataForEmergency(eq(0) /*phoneId*/ ,
eq(150) /*extensionTime*/, any());
}
@@ -997,12 +1014,10 @@
assertTrue(callback.getValue().isOkToCall(testPhone, ServiceState.STATE_OUT_OF_SERVICE));
callback.getValue().onComplete(null, true);
- Runnable delayDialRunnable = verifyRunnablePosted();
try {
doAnswer(invocation -> null).when(mContext).startActivity(any());
- delayDialRunnable.run();
- verify(testPhone).dial(anyString(), any());
+ verify(testPhone).dial(anyString(), any(), any());
} catch (CallStateException e) {
// This shouldn't happen
fail();
@@ -1016,22 +1031,20 @@
@Test
@SmallTest
public void testCreateOutgoingEmergencyConnection_delayDial_nocarrierconfig() {
- Phone testPhone = setupConnectionServiceForDelayDial();
- Runnable delayDialRunnable = verifyRunnablePosted();
-
// Setup test to not support SUPL on the non-DDS subscription
doReturn(true).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
getTestContext().getCarrierConfig(0 /*subId*/).putStringArray(
CarrierConfigManager.Gps.KEY_ES_SUPL_DATA_PLANE_ONLY_ROAMING_PLMN_STRING_ARRAY,
null);
- testPhone.getServiceState().setRoaming(false);
getTestContext().getCarrierConfig(0 /*subId*/).putInt(
CarrierConfigManager.Gps.KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT,
CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_CP_FALLBACK);
getTestContext().getCarrierConfig(0 /*subId*/).putString(
CarrierConfigManager.Gps.KEY_ES_EXTENSION_SEC_STRING, "0");
- delayDialRunnable.run();
+ Phone testPhone = setupConnectionServiceForDelayDial(
+ false /* isRoaming */, false /* setOperatorName */, null /* operator long name*/,
+ null /* operator short name */, null /* operator numeric name */);
verify(mPhoneSwitcher, never()).overrideDefaultDataForEmergency(anyInt(), anyInt(), any());
}
@@ -1042,22 +1055,20 @@
@Test
@SmallTest
public void testCreateOutgoingEmergencyConnection_delayDial_supportsuplondds() {
- Phone testPhone = setupConnectionServiceForDelayDial();
- Runnable delayDialRunnable = verifyRunnablePosted();
-
// If the non-DDS supports SUPL, dont switch data
doReturn(false).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
getTestContext().getCarrierConfig(0 /*subId*/).putStringArray(
CarrierConfigManager.Gps.KEY_ES_SUPL_DATA_PLANE_ONLY_ROAMING_PLMN_STRING_ARRAY,
null);
- testPhone.getServiceState().setRoaming(false);
getTestContext().getCarrierConfig(0 /*subId*/).putInt(
CarrierConfigManager.Gps.KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT,
CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_DP_ONLY);
getTestContext().getCarrierConfig(0 /*subId*/).putString(
CarrierConfigManager.Gps.KEY_ES_EXTENSION_SEC_STRING, "0");
- delayDialRunnable.run();
+ Phone testPhone = setupConnectionServiceForDelayDial(
+ false /* isRoaming */, false /* setOperatorName */, null /* operator long name*/,
+ null /* operator short name */, null /* operator numeric name */);
verify(mPhoneSwitcher, never()).overrideDefaultDataForEmergency(anyInt(), anyInt(), any());
}
@@ -1068,22 +1079,20 @@
@Test
@SmallTest
public void testCreateOutgoingEmergencyConnection_delayDial_roaming_nocarrierconfig() {
- Phone testPhone = setupConnectionServiceForDelayDial();
- Runnable delayDialRunnable = verifyRunnablePosted();
-
// Setup test to not support SUPL on the non-DDS subscription
doReturn(true).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
getTestContext().getCarrierConfig(0 /*subId*/).putStringArray(
CarrierConfigManager.Gps.KEY_ES_SUPL_DATA_PLANE_ONLY_ROAMING_PLMN_STRING_ARRAY,
null);
- testPhone.getServiceState().setRoaming(true);
getTestContext().getCarrierConfig(0 /*subId*/).putInt(
CarrierConfigManager.Gps.KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT,
CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_DP_ONLY);
getTestContext().getCarrierConfig(0 /*subId*/).putString(
CarrierConfigManager.Gps.KEY_ES_EXTENSION_SEC_STRING, "0");
- delayDialRunnable.run();
+ Phone testPhone = setupConnectionServiceForDelayDial(
+ true /* isRoaming */, false /* setOperatorName */, null /* operator long name*/,
+ null /* operator short name */, null /* operator numeric name */);
verify(mPhoneSwitcher, never()).overrideDefaultDataForEmergency(anyInt(), anyInt(), any());
}
@@ -1095,16 +1104,10 @@
@Test
@SmallTest
public void testCreateOutgoingEmergencyConnection_delayDial_roamingcarrierconfig() {
- Phone testPhone = setupConnectionServiceForDelayDial();
- Runnable delayDialRunnable = verifyRunnablePosted();
-
+ doReturn(true).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
// Setup voice roaming scenario
String testRoamingOperator = "001001";
- // In some roaming conditions, we are not technically "roaming"
- testPhone.getServiceState().setRoaming(false);
- testPhone.getServiceState().setOperatorName("TestTel", "TestTel", testRoamingOperator);
// Setup test to not support SUPL on the non-DDS subscription
- doReturn(true).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
String[] roamingPlmns = new String[1];
roamingPlmns[0] = testRoamingOperator;
getTestContext().getCarrierConfig(0 /*subId*/).putStringArray(
@@ -1115,8 +1118,11 @@
CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_CP_FALLBACK);
getTestContext().getCarrierConfig(0 /*subId*/).putString(
CarrierConfigManager.Gps.KEY_ES_EXTENSION_SEC_STRING, "0");
- delayDialRunnable.run();
+ Phone testPhone = setupConnectionServiceForDelayDial(
+ false /* isRoaming */, true /* setOperatorName */,
+ "TestTel" /* operator long name*/, "TestTel" /* operator short name */,
+ testRoamingOperator /* operator numeric name */);
verify(mPhoneSwitcher).overrideDefaultDataForEmergency(eq(0) /*phoneId*/ ,
eq(0) /*extensionTime*/, any());
}
@@ -1129,15 +1135,10 @@
@Test
@SmallTest
public void testCreateOutgoingEmergencyConnection_delayDial__roaming_roamingcarrierconfig() {
- Phone testPhone = setupConnectionServiceForDelayDial();
- Runnable delayDialRunnable = verifyRunnablePosted();
-
- // Setup voice roaming scenario
- String testRoamingOperator = "001001";
- testPhone.getServiceState().setRoaming(true);
- testPhone.getServiceState().setOperatorName("TestTel", "TestTel", testRoamingOperator);
// Setup test to not support SUPL on the non-DDS subscription
doReturn(true).when(mDeviceState).isSuplDdsSwitchRequiredForEmergencyCall(any());
+ // Setup voice roaming scenario
+ String testRoamingOperator = "001001";
String[] roamingPlmns = new String[1];
roamingPlmns[0] = testRoamingOperator;
getTestContext().getCarrierConfig(0 /*subId*/).putStringArray(
@@ -1148,17 +1149,225 @@
CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_CP_FALLBACK);
getTestContext().getCarrierConfig(0 /*subId*/).putString(
CarrierConfigManager.Gps.KEY_ES_EXTENSION_SEC_STRING, "0");
- delayDialRunnable.run();
+ Phone testPhone = setupConnectionServiceForDelayDial(
+ false /* isRoaming */, true /* setOperatorName */,
+ "TestTel" /* operator long name*/, "TestTel" /* operator short name */,
+ testRoamingOperator /* operator numeric name */);
verify(mPhoneSwitcher).overrideDefaultDataForEmergency(eq(0) /*phoneId*/ ,
eq(0) /*extensionTime*/, any());
}
/**
+ * Verifies for an incoming call on the same SIM that we don't set
+ * {@link android.telecom.Connection#EXTRA_ANSWERING_DROPS_FG_CALL} on the incoming call extras.
+ * @throws Exception
+ */
+ @Test
+ @SmallTest
+ public void testIncomingDoesntRequestDisconnect() throws Exception {
+ setupForCallTest();
+
+ mBinderStub.createConnection(PHONE_ACCOUNT_HANDLE_1, "TC@1",
+ new ConnectionRequest(PHONE_ACCOUNT_HANDLE_1, Uri.parse("tel:16505551212"),
+ new Bundle()),
+ true, false, null);
+ waitForHandlerAction(mTestConnectionService.getHandler(), TIMEOUT_MS);
+ assertEquals(1, mTestConnectionService.getAllConnections().size());
+
+ // Make sure the extras do not indicate that it answering will disconnect another call.
+ android.telecom.Connection connection = (android.telecom.Connection)
+ mTestConnectionService.getAllConnections().toArray()[0];
+ assertFalse(connection.getExtras() != null && connection.getExtras().containsKey(
+ android.telecom.Connection.EXTRA_ANSWERING_DROPS_FG_CALL));
+ }
+
+ /**
+ * Verifies where there is another call on the same sub, we don't set
+ * {@link android.telecom.Connection#EXTRA_ANSWERING_DROPS_FG_CALL} on the incoming call extras.
+ * @throws Exception
+ */
+ @Test
+ @SmallTest
+ public void testSecondCallSameSubWontDisconnect() throws Exception {
+ // Previous test gets us into a good enough state
+ testIncomingDoesntRequestDisconnect();
+
+ when(mCall.getState()).thenReturn(Call.State.ACTIVE);
+ when(mCall2.getState()).thenReturn(Call.State.WAITING);
+ when(mCall2.getLatestConnection()).thenReturn(mInternalConnection2);
+ when(mPhone0.getRingingCall()).thenReturn(mCall2);
+
+ mBinderStub.createConnection(PHONE_ACCOUNT_HANDLE_1, "TC@2",
+ new ConnectionRequest(PHONE_ACCOUNT_HANDLE_1, Uri.parse("tel:16505551213"),
+ new Bundle()),
+ true, false, null);
+ waitForHandlerAction(mTestConnectionService.getHandler(), TIMEOUT_MS);
+ assertEquals(2, mTestConnectionService.getAllConnections().size());
+
+ // None of the connections should have the extra set.
+ assertEquals(0, mTestConnectionService.getAllConnections().stream()
+ .filter(c -> c.getExtras() != null && c.getExtras().containsKey(
+ android.telecom.Connection.EXTRA_ANSWERING_DROPS_FG_CALL))
+ .count());
+ }
+
+ /**
+ * Verifies where there is another call on the same sub, we don't set
+ * {@link android.telecom.Connection#EXTRA_ANSWERING_DROPS_FG_CALL} on the incoming call extras.
+ * @throws Exception
+ */
+ @Test
+ @SmallTest
+ public void testSecondCallDifferentSubWillDisconnect() throws Exception {
+ // Previous test gets us into a good enough state
+ testIncomingDoesntRequestDisconnect();
+
+ when(mCall.getState()).thenReturn(Call.State.ACTIVE);
+ when(mCall2.getState()).thenReturn(Call.State.WAITING);
+ when(mCall2.getLatestConnection()).thenReturn(mInternalConnection2);
+ // At this point the call is ringing on the second phone.
+ when(mPhone0.getRingingCall()).thenReturn(null);
+ when(mPhone1.getRingingCall()).thenReturn(mCall2);
+
+ mBinderStub.createConnection(PHONE_ACCOUNT_HANDLE_2, "TC@2",
+ new ConnectionRequest(PHONE_ACCOUNT_HANDLE_2, Uri.parse("tel:16505551213"),
+ new Bundle()),
+ true, false, null);
+ waitForHandlerAction(mTestConnectionService.getHandler(), TIMEOUT_MS);
+ assertEquals(2, mTestConnectionService.getAllConnections().size());
+
+ // The incoming connection should have the extra set.
+ assertEquals(1, mTestConnectionService.getAllConnections().stream()
+ .filter(c -> c.getExtras() != null && c.getExtras().containsKey(
+ android.telecom.Connection.EXTRA_ANSWERING_DROPS_FG_CALL))
+ .count());
+ }
+
+ private static final PhoneAccountHandle SUB1_HANDLE = new PhoneAccountHandle(
+ new ComponentName("test", "class"), "1");
+ private static final PhoneAccountHandle SUB2_HANDLE = new PhoneAccountHandle(
+ new ComponentName("test", "class"), "2");
+
+ @Test
+ @SmallTest
+ public void testDontDisconnectSameSub() {
+ ArrayList<android.telecom.Connection> tcs = new ArrayList<>();
+ SimpleTelephonyConnection tc1 = createTestConnection(SUB1_HANDLE, 0, false);
+ tcs.add(tc1);
+ TelephonyConnectionService.maybeDisconnectCallsOnOtherSubs(tcs, SUB1_HANDLE);
+ // Would've preferred to use mockito, but can't mock out TelephonyConnection/Connection
+ // easily.
+ assertFalse(tc1.wasDisconnected);
+ }
+
+ @Test
+ @SmallTest
+ public void testDontDisconnectEmergency() {
+ ArrayList<android.telecom.Connection> tcs = new ArrayList<>();
+ SimpleTelephonyConnection tc1 = createTestConnection(SUB1_HANDLE, 0, true);
+ tcs.add(tc1);
+ TelephonyConnectionService.maybeDisconnectCallsOnOtherSubs(tcs, SUB2_HANDLE);
+ // Other call is an emergency call, so don't disconnect it.
+ assertFalse(tc1.wasDisconnected);
+ }
+
+ @Test
+ @SmallTest
+ public void testDontDisconnectExternal() {
+ ArrayList<android.telecom.Connection> tcs = new ArrayList<>();
+ SimpleTelephonyConnection tc1 = createTestConnection(SUB1_HANDLE,
+ android.telecom.Connection.PROPERTY_IS_EXTERNAL_CALL, false);
+ tcs.add(tc1);
+ TelephonyConnectionService.maybeDisconnectCallsOnOtherSubs(tcs, SUB2_HANDLE);
+ // Other call is an external call, so don't disconnect it.
+ assertFalse(tc1.wasDisconnected);
+ }
+
+ @Test
+ @SmallTest
+ public void testDisconnectDifferentSub() {
+ ArrayList<android.telecom.Connection> tcs = new ArrayList<>();
+ SimpleTelephonyConnection tc1 = createTestConnection(SUB1_HANDLE, 0, false);
+ tcs.add(tc1);
+ TelephonyConnectionService.maybeDisconnectCallsOnOtherSubs(tcs, SUB2_HANDLE);
+ assertTrue(tc1.wasDisconnected);
+ }
+
+ @Test
+ @SmallTest
+ public void testDisconnectDifferentSubTwoCalls() {
+ ArrayList<android.telecom.Connection> tcs = new ArrayList<>();
+ SimpleTelephonyConnection tc1 = createTestConnection(SUB1_HANDLE, 0, false);
+ SimpleTelephonyConnection tc2 = createTestConnection(SUB1_HANDLE, 0, false);
+
+ tcs.add(tc1);
+ tcs.add(tc2);
+ TelephonyConnectionService.maybeDisconnectCallsOnOtherSubs(tcs, SUB2_HANDLE);
+ assertTrue(tc1.wasDisconnected);
+ assertTrue(tc2.wasDisconnected);
+ }
+
+ private SimpleTelephonyConnection createTestConnection(PhoneAccountHandle handle,
+ int properties, boolean isEmergency) {
+ SimpleTelephonyConnection connection = new SimpleTelephonyConnection();
+ connection.setShouldTreatAsEmergencyCall(isEmergency);
+ connection.setConnectionProperties(properties);
+ connection.setPhoneAccountHandle(handle);
+ return connection;
+ }
+
+ /**
+ * Setup the mess of mocks for {@link #testSecondCallSameSubWontDisconnect()} and
+ * {@link #testIncomingDoesntRequestDisconnect()}.
+ */
+ private void setupForCallTest() {
+ // Setup a bunch of stuff. Blech.
+ mTestConnectionService.setReadyForTest();
+ mPhone0 = makeTestPhone(0 /*phoneId*/, ServiceState.STATE_IN_SERVICE,
+ false /*isEmergencyOnly*/);
+ when(mCall.getState()).thenReturn(Call.State.INCOMING);
+ when(mCall.getPhone()).thenReturn(mPhone0);
+ when(mPhone0.getRingingCall()).thenReturn(mCall);
+ mPhone1 = makeTestPhone(1 /*phoneId*/, ServiceState.STATE_IN_SERVICE,
+ false /*isEmergencyOnly*/);
+ when(mCall2.getPhone()).thenReturn(mPhone1);
+ List<Phone> phones = new ArrayList<>(2);
+ doReturn(true).when(mPhone0).isRadioOn();
+ doReturn(true).when(mPhone1).isRadioOn();
+ doReturn(GSM_PHONE).when(mPhone0).getPhoneType();
+ doReturn(GSM_PHONE).when(mPhone1).getPhoneType();
+ phones.add(mPhone0);
+ phones.add(mPhone1);
+ setPhones(phones);
+ when(mPhoneUtilsProxy.getSubIdForPhoneAccountHandle(eq(PHONE_ACCOUNT_HANDLE_1)))
+ .thenReturn(0);
+ when(mSubscriptionManagerProxy.getPhoneId(0)).thenReturn(0);
+ when(mPhoneFactoryProxy.getPhone(eq(0))).thenReturn(mPhone0);
+ when(mPhoneUtilsProxy.getSubIdForPhoneAccountHandle(eq(PHONE_ACCOUNT_HANDLE_2)))
+ .thenReturn(1);
+ when(mSubscriptionManagerProxy.getPhoneId(1)).thenReturn(1);
+ when(mPhoneFactoryProxy.getPhone(eq(1))).thenReturn(mPhone1);
+ setupDeviceConfig(mPhone0, mPhone1, 1);
+
+ when(mInternalConnection.getCall()).thenReturn(mCall);
+ when(mInternalConnection.getState()).thenReturn(Call.State.ACTIVE);
+ when(mInternalConnection2.getCall()).thenReturn(mCall2);
+ when(mInternalConnection2.getState()).thenReturn(Call.State.WAITING);
+ }
+
+ /**
* Set up a mock MSIM device with TEST_ADDRESS set as an emergency number.
+ * @param isRoaming whether it is roaming
+ * @param setOperatorName whether operator name needs to set
+ * @param operatorNameLongName the operator long name if needs to set
+ * @param operatorNameShortName the operator short name if needs to set
+ * @param operatorNameNumeric the operator numeric name if needs to set
* @return the Phone associated with slot 0.
*/
- private Phone setupConnectionServiceForDelayDial() {
+ private Phone setupConnectionServiceForDelayDial(boolean isRoaming, boolean setOperatorName,
+ String operatorNameLongName, String operatorNameShortName,
+ String operatorNameNumeric) {
ConnectionRequest connectionRequest = new ConnectionRequest.Builder()
.setAccountHandle(PHONE_ACCOUNT_HANDLE_1)
.setAddress(TEST_ADDRESS)
@@ -1183,15 +1392,17 @@
emergencyNumbers.put(0 /*subId*/, numbers);
doReturn(emergencyNumbers).when(mTelephonyManagerProxy).getCurrentEmergencyNumberList();
doReturn(2).when(mTelephonyManagerProxy).getPhoneCount();
-
+ testPhone0.getServiceState().setRoaming(isRoaming);
+ if (setOperatorName) {
+ testPhone0.getServiceState().setOperatorName(operatorNameLongName,
+ operatorNameShortName, operatorNameNumeric);
+ }
mConnection = mTestConnectionService.onCreateOutgoingConnection(
PHONE_ACCOUNT_HANDLE_1, connectionRequest);
assertNotNull("test connection was not set up correctly.", mConnection);
-
return testPhone0;
}
-
/**
* Set up a mock MSIM device with TEST_ADDRESS set as an emergency number in airplane mode.
* @return the Phone associated with slot 0.
@@ -1231,15 +1442,6 @@
return testPhone0;
}
- private Runnable verifyRunnablePosted() {
- ArgumentCaptor<Message> runnableCaptor = ArgumentCaptor.forClass(Message.class);
- verify(mMockHandler).sendMessageDelayed(runnableCaptor.capture(), anyLong());
- assertNotNull("Invalid Message created", runnableCaptor.getValue());
- Runnable runnable = runnableCaptor.getValue().getCallback();
- assertNotNull("sendMessageDelayed never occurred.", runnableCaptor);
- return runnable;
- }
-
private EmergencyNumber setupEmergencyNumber(Uri address) {
return new EmergencyNumber(address.getSchemeSpecificPart(), "", "",
EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED,
@@ -1248,11 +1450,11 @@
EmergencyNumber.EMERGENCY_CALL_ROUTING_EMERGENCY);
}
- private void setupHandleToPhoneMap(PhoneAccountHandle handle, Phone phone) {
+ private void setupHandleToPhoneMap(PhoneAccountHandle handle, Phone phone) {
// use subId 0
- when(mPhoneUtilsProxy.getSubIdForPhoneAccountHandle(handle)).thenReturn(0);
- when(mSubscriptionManagerProxy.getPhoneId(0)).thenReturn(0);
- when(mPhoneFactoryProxy.getPhone(0)).thenReturn(phone);
+ when(mPhoneUtilsProxy.getSubIdForPhoneAccountHandle(eq(handle))).thenReturn(0);
+ when(mSubscriptionManagerProxy.getPhoneId(eq(0))).thenReturn(0);
+ when(mPhoneFactoryProxy.getPhone(eq(0))).thenReturn(phone);
}
private AsyncResult getSuppServiceNotification(int notificationType, int code) {
@@ -1273,6 +1475,8 @@
when(phone.getDefaultPhone()).thenReturn(phone);
when(phone.getEmergencyNumberTracker()).thenReturn(mEmergencyNumberTracker);
when(phone.getServiceStateTracker()).thenReturn(mSST);
+ doNothing().when(phone).registerForPreciseCallStateChanged(any(Handler.class), anyInt(),
+ any(Object.class));
when(mEmergencyNumberTracker.getEmergencyNumber(anyString())).thenReturn(null);
return phone;
}
@@ -1308,7 +1512,7 @@
private void setPhonesDialConnection(Phone phone, Connection c) {
try {
- when(phone.dial(anyString(), any())).thenReturn(c);
+ when(phone.dial(anyString(), any(), any())).thenReturn(c);
} catch (CallStateException e) {
// this shouldn't happen
fail();
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionTest.java
index 7d15680..388fd29 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionTest.java
@@ -1,25 +1,215 @@
package com.android.services.telephony;
import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.fail;
+import static junit.framework.TestCase.assertFalse;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.os.Bundle;
import android.telecom.Connection;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import android.telephony.CarrierConfigManager;
+import android.telephony.DisconnectCause;
import androidx.test.runner.AndroidJUnit4;
+import com.android.internal.telephony.Call;
+import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.d2d.DtmfTransport;
+import com.android.internal.telephony.d2d.RtpTransport;
+import com.android.internal.telephony.imsphone.ImsPhoneConnection;
+import com.android.phone.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
@RunWith(AndroidJUnit4.class)
public class TelephonyConnectionTest {
+ @Mock
+ private ImsPhoneConnection mImsPhoneConnection;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ when(mImsPhoneConnection.getState()).thenReturn(Call.State.ACTIVE);
+ when(mImsPhoneConnection.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_IMS);
+ }
+
+ /**
+ * Ensures an Ims connection uses the D2D communicator when it is enabled.
+ */
+ @Test
+ public void testSetupCommunicator() {
+ TestTelephonyConnection c = new TestTelephonyConnection();
+ c.setIsImsConnection(true);
+ // Enable D2D comms.
+ when(c.mMockResources.getBoolean(eq(
+ R.bool.config_use_device_to_device_communication))).thenReturn(true);
+ c.getCarrierConfigBundle().putBoolean(
+ CarrierConfigManager.KEY_SUPPORTS_DEVICE_TO_DEVICE_COMMUNICATION_USING_DTMF_BOOL,
+ true);
+
+ c.setOriginalConnection(mImsPhoneConnection);
+ assertNotNull(c.getCommunicator());
+ }
+
+ /**
+ * Ensures an Ims connection does not use the D2D communicator when it is disabled.
+ */
+ @Test
+ public void testDoNotSetupCommunicatorWhenDisabled() {
+ TestTelephonyConnection c = new TestTelephonyConnection();
+ c.setIsImsConnection(true);
+ // Disable D2D comms.
+ when(c.mMockResources.getBoolean(eq(
+ R.bool.config_use_device_to_device_communication))).thenReturn(false);
+
+ c.setOriginalConnection(mImsPhoneConnection);
+ assertNull(c.getCommunicator());
+ }
+
+ /**
+ * Ensures an Ims connection does not use the D2D communicator for a non-IMS call.
+ */
+ @Test
+ public void testDoNotSetupCommunicatorForNonIms() {
+ TestTelephonyConnection c = new TestTelephonyConnection();
+ c.setIsImsConnection(false);
+ // Disable D2D comms.
+ when(c.mMockResources.getBoolean(eq(
+ R.bool.config_use_device_to_device_communication))).thenReturn(true);
+
+ c.setOriginalConnection(mImsPhoneConnection);
+ assertNull(c.getCommunicator());
+ }
+
+ /**
+ * Ensures an Ims connection does not use the D2D communicator when it is disabled.
+ */
+ @Test
+ public void testDoNotSetupCommunicatorNoTransports() {
+ TestTelephonyConnection c = new TestTelephonyConnection();
+ c.setIsImsConnection(true);
+ // Enable D2D comms.
+ when(c.mMockResources.getBoolean(eq(
+ R.bool.config_use_device_to_device_communication))).thenReturn(true);
+ // But carrier disables transports. Womp.
+ c.getCarrierConfigBundle().putBoolean(
+ CarrierConfigManager.KEY_SUPPORTS_DEVICE_TO_DEVICE_COMMUNICATION_USING_DTMF_BOOL,
+ false);
+ c.getCarrierConfigBundle().putBoolean(
+ CarrierConfigManager.KEY_SUPPORTS_DEVICE_TO_DEVICE_COMMUNICATION_USING_RTP_BOOL,
+ false);
+ c.setOriginalConnection(mImsPhoneConnection);
+ assertNull(c.getCommunicator());
+ }
+
+ @Test
+ public void testSetupRtpOnly() {
+ TestTelephonyConnection c = new TestTelephonyConnection();
+ c.setIsImsConnection(true);
+ // Enable D2D comms.
+ when(c.mMockResources.getBoolean(eq(
+ R.bool.config_use_device_to_device_communication))).thenReturn(true);
+ // But carrier disables transports. Womp.
+ c.getCarrierConfigBundle().putBoolean(
+ CarrierConfigManager.KEY_SUPPORTS_DEVICE_TO_DEVICE_COMMUNICATION_USING_DTMF_BOOL,
+ false);
+ c.getCarrierConfigBundle().putBoolean(
+ CarrierConfigManager.KEY_SUPPORTS_DEVICE_TO_DEVICE_COMMUNICATION_USING_RTP_BOOL,
+ true);
+ c.setOriginalConnection(mImsPhoneConnection);
+ assertNotNull(c.getCommunicator());
+ assertEquals(1, c.getCommunicator().getTransportProtocols().size());
+ assertTrue(c.getCommunicator().getTransportProtocols()
+ .stream().anyMatch(p -> p instanceof RtpTransport));
+ }
+
+ @Test
+ public void testHangupAfterRedial() throws Exception {
+ TestTelephonyConnection c = new TestTelephonyConnection();
+ c.hangup(DisconnectCause.LOCAL);
+ verify(c.mMockRadioConnection).hangup();
+
+ // hangup failed because redial was in progress... The new original connection has been sent
+ // to the TelephonyConnection
+ com.android.internal.telephony.Connection newMockRadioConnection =
+ mock(com.android.internal.telephony.Connection.class);
+ doReturn("5551212").when(c.mMockRadioConnection).getAddress();
+ doReturn("5551212").when(newMockRadioConnection).getAddress();
+ doReturn(Call.State.DIALING).when(newMockRadioConnection).getState();
+ c.onOriginalConnectionRedialed(newMockRadioConnection);
+ verify(newMockRadioConnection).hangup();
+ }
+
+ @Test
+ public void testSetupDtmfOnly() {
+ TestTelephonyConnection c = new TestTelephonyConnection();
+ c.setIsImsConnection(true);
+ // Enable D2D comms.
+ when(c.mMockResources.getBoolean(eq(
+ R.bool.config_use_device_to_device_communication))).thenReturn(true);
+ // But carrier disables transports. Womp.
+ c.getCarrierConfigBundle().putBoolean(
+ CarrierConfigManager.KEY_SUPPORTS_DEVICE_TO_DEVICE_COMMUNICATION_USING_DTMF_BOOL,
+ true);
+ c.getCarrierConfigBundle().putBoolean(
+ CarrierConfigManager.KEY_SUPPORTS_DEVICE_TO_DEVICE_COMMUNICATION_USING_RTP_BOOL,
+ false);
+ c.setOriginalConnection(mImsPhoneConnection);
+ assertNotNull(c.getCommunicator());
+ assertEquals(1, c.getCommunicator().getTransportProtocols().size());
+ assertTrue(c.getCommunicator().getTransportProtocols()
+ .stream().anyMatch(p -> p instanceof DtmfTransport));
+ }
@Test
public void testCodecInIms() {
TestTelephonyConnection c = new TestTelephonyConnection();
+ c.setIsImsConnection(true);
c.updateState();
Bundle extras = c.getExtras();
int codec = extras.getInt(Connection.EXTRA_AUDIO_CODEC, Connection.AUDIO_CODEC_NONE);
assertEquals(codec, Connection.AUDIO_CODEC_AMR);
}
+ @Test
+ public void testConferenceNotSupportedForDownGradedVideoCall() {
+ TestTelephonyConnection c = new TestTelephonyConnection();
+ c.setIsImsConnection(true);
+ c.setIsVideoCall(false);
+ c.setWasVideoCall(true);
+ c.setDownGradeVideoCall(true);
+ c.refreshConferenceSupported();
+ assertFalse(c.isConferenceSupported());
+ c.setDownGradeVideoCall(false);
+ c.refreshConferenceSupported();
+ assertTrue(c.isConferenceSupported());
+ }
+
+ /**
+ * Tests to ensure that the presence of an ImsExternalConnection does not cause a crash in
+ * TelephonyConnection due to an illegal cast.
+ */
+ @Test
+ public void testImsExternalConnectionOnRefreshConference() {
+ TestTelephonyConnection c = new TestTelephonyConnection();
+ c.setIsImsConnection(true);
+ c.setIsImsExternalConnection(true);
+ try {
+ c.refreshConferenceSupported();
+ } catch (ClassCastException e) {
+ fail("refreshConferenceSupported threw ClassCastException");
+ }
+ }
}
diff --git a/tests/src/com/android/services/telephony/TestTelephonyConnection.java b/tests/src/com/android/services/telephony/TestTelephonyConnection.java
index 67e0329..817e9a7 100644
--- a/tests/src/com/android/services/telephony/TestTelephonyConnection.java
+++ b/tests/src/com/android/services/telephony/TestTelephonyConnection.java
@@ -16,29 +16,42 @@
package com.android.services.telephony;
-import android.content.Context;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.os.PersistableBundle;
-import android.telecom.PhoneAccountHandle;
+import android.content.AttributionSource;
+import android.content.ContentResolver;
+import android.os.Process;
+import android.os.UserHandle;
import android.telephony.TelephonyManager;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.notNull;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.VideoProfile;
+import android.telephony.CarrierConfigManager;
+
+import com.android.ims.ImsCall;
import com.android.internal.telephony.Call;
import com.android.internal.telephony.CallStateException;
import com.android.internal.telephony.Connection;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.emergency.EmergencyNumberTracker;
+import com.android.internal.telephony.imsphone.ImsExternalConnection;
+import com.android.internal.telephony.imsphone.ImsPhoneConnection;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
import java.util.ArrayList;
import java.util.List;
@@ -59,6 +72,9 @@
Context mMockContext;
@Mock
+ ContentResolver mMockContentResolver;
+
+ @Mock
Resources mMockResources;
@Mock
@@ -67,14 +83,40 @@
@Mock
EmergencyNumberTracker mEmergencyNumberTracker;
+ @Mock
+ ImsPhoneConnection mImsPhoneConnection;
+
+ @Mock
+ ImsExternalConnection mImsExternalConnection;
+
+ @Mock
+ ImsCall mImsCall;
+
+ @Mock
+ TelecomAccountRegistry mTelecomAccountRegistry;
+
+ @Mock
+ CarrierConfigManager mCarrierConfigManager;
+
+ private boolean mIsImsConnection;
+ private boolean mIsImsExternalConnection;
+ private boolean mIsConferenceSupported = true;
private Phone mMockPhone;
private int mNotifyPhoneAccountChangedCount = 0;
private List<String> mLastConnectionEvents = new ArrayList<>();
private List<Bundle> mLastConnectionEventExtras = new ArrayList<>();
+ private Object mLock = new Object();
+ private PersistableBundle mCarrierConfig = new PersistableBundle();
@Override
public com.android.internal.telephony.Connection getOriginalConnection() {
- return mMockRadioConnection;
+ if (mIsImsExternalConnection) {
+ return mImsExternalConnection;
+ } else if (mIsImsConnection) {
+ return mImsPhoneConnection;
+ } else {
+ return mMockRadioConnection;
+ }
}
@Override
@@ -86,6 +128,11 @@
super(null, null, android.telecom.Call.Details.DIRECTION_INCOMING);
MockitoAnnotations.initMocks(this);
+ AttributionSource attributionSource = new AttributionSource.Builder(
+ Process.myUid()).build();
+
+ mIsImsConnection = false;
+ mIsImsExternalConnection = false;
mMockPhone = mock(Phone.class);
mMockContext = mock(Context.class);
mMockTelephonyManager = mock(TelephonyManager.class);
@@ -95,8 +142,11 @@
when(mOriginalConnection.getState()).thenReturn(Call.State.ACTIVE);
when(mMockRadioConnection.getAudioCodec()).thenReturn(
android.telecom.Connection.AUDIO_CODEC_AMR);
+ when(mImsPhoneConnection.getAudioCodec()).thenReturn(
+ android.telecom.Connection.AUDIO_CODEC_AMR);
when(mMockRadioConnection.getCall()).thenReturn(mMockCall);
when(mMockRadioConnection.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_IMS);
+ when(mImsPhoneConnection.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_IMS);
doNothing().when(mMockRadioConnection).addListener(any(Connection.Listener.class));
doNothing().when(mMockRadioConnection).addPostDialListener(
any(Connection.PostDialListener.class));
@@ -106,13 +156,28 @@
when(mMockPhone.getContext()).thenReturn(mMockContext);
when(mMockPhone.getCurrentSubscriberUris()).thenReturn(null);
when(mMockContext.getResources()).thenReturn(mMockResources);
+ when(mMockContext.getContentResolver()).thenReturn(mMockContentResolver);
when(mMockContext.getSystemService(Context.TELEPHONY_SERVICE))
.thenReturn(mMockTelephonyManager);
+ when(mMockContext.getAttributionSource()).thenReturn(attributionSource);
+ when(mMockContentResolver.getUserId()).thenReturn(UserHandle.USER_CURRENT);
+ when(mMockContentResolver.getAttributionSource()).thenReturn(attributionSource);
when(mMockResources.getBoolean(anyInt())).thenReturn(false);
when(mMockPhone.getDefaultPhone()).thenReturn(mMockPhone);
when(mMockPhone.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_IMS);
when(mMockCall.getState()).thenReturn(Call.State.ACTIVE);
when(mMockCall.getPhone()).thenReturn(mMockPhone);
+ when(mMockPhone.getDefaultPhone()).thenReturn(mMockPhone);
+ when(mImsPhoneConnection.getImsCall()).thenReturn(mImsCall);
+ when(mTelecomAccountRegistry.isMergeCallSupported(notNull(PhoneAccountHandle.class)))
+ .thenReturn(mIsConferenceSupported);
+ when(mTelecomAccountRegistry.isMergeImsCallSupported(notNull(PhoneAccountHandle.class)))
+ .thenReturn(mIsImsConnection);
+ when(mTelecomAccountRegistry
+ .isVideoConferencingSupported(notNull(PhoneAccountHandle.class))).thenReturn(false);
+ when(mTelecomAccountRegistry
+ .isMergeOfWifiCallsAllowedWhenVoWifiOff(notNull(PhoneAccountHandle.class)))
+ .thenReturn(false);
try {
doNothing().when(mMockCall).hangup();
} catch (CallStateException e) {
@@ -120,11 +185,6 @@
}
}
- @Override
- public boolean isConferenceSupported() {
- return true;
- }
-
public void setMockPhone(Phone newPhone) {
mMockPhone = newPhone;
}
@@ -158,7 +218,14 @@
public PersistableBundle getCarrierConfig() {
// Depends on PhoneGlobals for context in TelephonyConnection, do not implement during
// testing.
- return new PersistableBundle();
+ return mCarrierConfig;
+ }
+
+ @Override
+ public void refreshConferenceSupported() {
+ if (mIsImsConnection) {
+ super.refreshConferenceSupported();
+ }
}
@Override
@@ -172,8 +239,30 @@
}
@Override
- void refreshConferenceSupported() {
- // Requires ImsManager dependencies, do not implement during testing.
+ public void setConferenceSupported(boolean conferenceSupported) {
+ mIsConferenceSupported = conferenceSupported;
+ }
+
+ @Override
+ public boolean isConferenceSupported() {
+ return mIsConferenceSupported;
+ }
+
+ @Override
+ public TelecomAccountRegistry getTelecomAccountRegistry(Context context) {
+ return mTelecomAccountRegistry;
+ }
+
+ public void setIsVideoCall(boolean isVideoCall) {
+ if (isVideoCall) {
+ setVideoState(VideoProfile.STATE_TX_ENABLED);
+ } else {
+ setVideoState(VideoProfile.STATE_AUDIO_ONLY);
+ }
+ }
+
+ public void setWasVideoCall(boolean wasVideoCall) {
+ when(mImsCall.wasVideoCall()).thenReturn(wasVideoCall);
}
@Override
@@ -193,4 +282,27 @@
public List<Bundle> getLastConnectionEventExtras() {
return mLastConnectionEventExtras;
}
+
+ public void setIsImsConnection(boolean isImsConnection) {
+ mIsImsConnection = isImsConnection;
+ when(mTelecomAccountRegistry.isMergeImsCallSupported(notNull(PhoneAccountHandle.class)))
+ .thenReturn(isImsConnection && mIsConferenceSupported);
+ }
+
+ public void setIsImsExternalConnection(boolean isExternalConnection) {
+ mIsImsExternalConnection = isExternalConnection;
+ }
+
+ public void setDownGradeVideoCall(boolean downgrade) {
+ PersistableBundle bundle = new PersistableBundle();
+ bundle.putBoolean(CarrierConfigManager.KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL,
+ downgrade);
+ when(mMockContext.getSystemService(Context.CARRIER_CONFIG_SERVICE))
+ .thenReturn(mCarrierConfigManager);
+ when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
+ }
+
+ public PersistableBundle getCarrierConfigBundle() {
+ return mCarrierConfig;
+ }
}