diff options
| author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-10-12 21:53:30 +0000 |
|---|---|---|
| committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2021-10-12 21:53:30 +0000 |
| commit | e3ff2b3d7fbf71da096da17c8b52e42dfb3700cd (patch) | |
| tree | f6fe1e22b6d39d22fbb800a42919616a2933f023 | |
| parent | f304e2eb7b78bdfc498ab73b8d8b9fc7d7917e9b (diff) | |
| parent | 937b7f421728b6a980bb05c7c70a657c385676ea (diff) | |
| download | platform_packages_services_Telephony-simpleperf-release.tar.gz platform_packages_services_Telephony-simpleperf-release.tar.bz2 platform_packages_services_Telephony-simpleperf-release.zip | |
Merge "Snap for 7817384 from 17fa6106d68bb08edf66d9f2a1bee551a3a1684b to simpleperf-release" into simpleperf-releasesimpleperf-release
168 files changed, 6496 insertions, 983 deletions
diff --git a/Android.bp b/Android.bp index f3c9ebcc6..0649958d6 100644 --- a/Android.bp +++ b/Android.bp @@ -42,6 +42,7 @@ android_app { "libprotobuf-java-lite", "app-compat-annotations", "unsupportedappusage", + "org.apache.http.legacy", ], static_libs: [ @@ -54,6 +55,7 @@ android_app { "guava", "PlatformProperties", "modules-utils-os", + "nist-sip", ], srcs: [ diff --git a/AndroidManifest.xml b/AndroidManifest.xml index b3b7f8b11..6b4a19c14 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 c707f7648..8eafd307c 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 Binary files differnew file mode 100644 index 000000000..dcc74e595 --- /dev/null +++ b/res/drawable/cupcake.png diff --git a/res/layout/radio_info.xml b/res/layout/radio_info.xml index 72627a35c..68c67a335 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 76b13c6ac..eefaebd81 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 a808559ee..d1833a68e 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 21a540fe8..ac4cbdf79 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 2033d5e51..ad6dbc389 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 5ec4dc547..c1ea981c2 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 bf39f1839..52c569cfe 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 6674beeb9..bdd80f584 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 216c78922..6be0bcd9c 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 81a2b336c..29dcb56a6 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 5c1e68120..ed5c95bcb 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 5350ab0d6..acbe3d887 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 926681bce..ed768a76d 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 9d623a4eb..51659c3d0 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 3f568a5b5..275147dab 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 277148cf6..2d8fd4574 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 f2aa49b3e..191ffcf33 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 c299527a0..6e435204c 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 f2aa49b3e..191ffcf33 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 f2aa49b3e..191ffcf33 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 ef450c38c..aa19d155f 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 23e2e43e0..3fd44d665 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 a106ba282..4d1f8771e 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 076160abe..26366e984 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 4d5b23dee..81af2b482 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 eb9086e2e..7cb550ce1 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 34d40a85d..6506746a4 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 d91867218..76d9bb612 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 957e36196..e92aac65b 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 6fdca2d8c..145ce0313 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 38000a3b4..9ae6f2fcf 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 b65016e0f..0346a6d90 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 b9a8d0bde..10d0bff88 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 80d1865df..92d1d085e 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 7ccb20df0..6d5e9805c 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 17e8fd775..c1a13ce26 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 b44afa238..68dd17ec5 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 d38c50f97..a4b3fe1a7 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 5fbf20dc0..b5b2f7583 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 6d65ce729..c304b7431 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 dfd6c9a5b..2b6a1f616 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 c5542b138..d488dcda0 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 fb246f94b..c280faadc 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 44cca2b76..ced50c589 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 52ad67b98..541dc23dd 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 c4ea6fa69..5d533a655 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 a7b16407e..d09086d41 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 44e358ff8..c0b663b6d 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 5fe13bbbd..2d710a70b 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 b8f98dff6..7f72fa5fc 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 857239376..4703be3c7 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 48ac8c0a7..783c82177 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 78ea7eb37..1c32881ca 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 4ddb2e662..c58d6f6da 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 f34f564f9..16dc582fd 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 a16f582c6..efce396b3 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 e6d6abcc6..7e0dac8c3 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 409cd32ec..c590abd83 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 c1966cfd4..f3b502387 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 1ee792c24..1305a0c8b 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 ceb908247..03358d9b0 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 db0799daf..3e92292c9 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 c2421cf62..40eaf2383 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 326cc52ba..4fc807d16 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 4a6ee9660..cdbbf6aee 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 7efc24584..0af60b69f 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 7f9bc94be..6a8a30492 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 5feb01d45..8f0a3975a 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 8ea15ab0f..483bf92bb 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 43633a73a..905f491cc 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 4c0570d0e..0d4af3f28 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 83727d001..8241f0b00 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 0432ff7d5..5a28420ca 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 0718c518b..0b0220f6d 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 0e697da1b..68a48c1f2 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 495807b8d..a54cd9ae7 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 74bb70b2a..01cdf4913 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 92aa4d334..c2b0ee6de 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 7a5e67680..46b33bdd7 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 c86c5ee90..cfd69b04a 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 a6d8d20e6..28f7a377a 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 6bcb0a5b1..e568da37e 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 85cedaae6..4d0472795 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 64a54cdf3..23393be3f 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 bcc156285..4ad89d09e 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 0f75e231b..6fda189ab 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 70232ad3b..9eb810bb6 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 34b1b203e..6e8456004 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 99fe93e85..cf7cd59f5 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 6eb72452d..60d9c88b5 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 a59eb2183..297642572 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 b15b51460..9abb6f5e0 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 5c7409f8c..a5793d0c7 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 @@ public class SipUtil { 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 ae6f07268..ec6ea2bd3 100644 --- a/src/com/android/phone/CallFeaturesSetting.java +++ b/src/com/android/phone/CallFeaturesSetting.java @@ -295,7 +295,7 @@ public class CallFeaturesSetting extends PreferenceActivity 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 @@ public class CallFeaturesSetting extends PreferenceActivity mButtonWifiCalling.setEnabled(isCallStateIdle); } } - }; + } private final ProvisioningManager.Callback mProvisioningCallback = new ProvisioningManager.Callback() { @@ -398,7 +398,8 @@ public class CallFeaturesSetting extends PreferenceActivity 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 @@ public class CallFeaturesSetting extends PreferenceActivity 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 c9d5eb016..7f61f78cb 100644 --- a/src/com/android/phone/CallNotifier.java +++ b/src/com/android/phone/CallNotifier.java @@ -720,7 +720,7 @@ public class CallNotifier extends Handler { 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 b0a46538e..d3792f1a5 100644 --- a/src/com/android/phone/CarrierConfigLoader.java +++ b/src/com/android/phone/CarrierConfigLoader.java @@ -466,7 +466,15 @@ public class CarrierConfigLoader extends ICarrierConfigLoader.Stub { 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 @@ public class CarrierConfigLoader extends ICarrierConfigLoader.Stub { /** 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 2e310aab2..614587099 100644 --- a/src/com/android/phone/CdmaCallOptions.java +++ b/src/com/android/phone/CdmaCallOptions.java @@ -21,18 +21,36 @@ import android.os.PersistableBundle; 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 @@ public class CdmaCallOptions extends TimeConsumingPreferenceActivity { 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); + } + + 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; + } + + 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(); + } - Preference callForwardingPref = getPreferenceScreen().findPreference(CALL_FORWARDING_KEY); - callForwardingPref.setIntent(subInfoHelper.getIntent(CdmaCallForwardOptions.class)); + 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); - CdmaCallWaitingPreference callWaitingPref = (CdmaCallWaitingPreference)getPreferenceScreen() - .findPreference(CALL_WAITING_KEY); - callWaitingPref.init(this, subInfoHelper.getPhone()); + 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 4cda7ba59..3713b1939 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 @@ public class CdmaCallWaitingPreference extends Preference { } } + /** + * 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 @@ public class CdmaCallWaitingPreference extends Preference { 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 73dd8bc4e..4018e4050 100644 --- a/src/com/android/phone/IccPanel.java +++ b/src/com/android/phone/IccPanel.java @@ -74,13 +74,13 @@ public class IccPanel extends Dialog { @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 2e4ee94d4..7d594d12f 100644 --- a/src/com/android/phone/ImsRcsController.java +++ b/src/com/android/phone/ImsRcsController.java @@ -49,7 +49,6 @@ import com.android.internal.telephony.IIntegerConsumer; import com.android.internal.telephony.Phone; import com.android.internal.telephony.TelephonyPermissions; import com.android.internal.telephony.ims.ImsResolver; -import com.android.internal.telephony.imsphone.ImsPhone; import com.android.services.telephony.rcs.RcsFeatureController; import com.android.services.telephony.rcs.SipTransportController; import com.android.services.telephony.rcs.TelephonyRcsService; @@ -214,6 +213,8 @@ public class ImsRcsController extends IImsRcsController.Stub { 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 class ImsRcsController extends IImsRcsController.Stub { 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 class ImsRcsController extends IImsRcsController.Stub { 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 @@ public class ImsRcsController extends IImsRcsController.Stub { // 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 @@ public class ImsRcsController extends IImsRcsController.Stub { // 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 @@ public class ImsRcsController extends IImsRcsController.Stub { */ // 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 @@ public class ImsRcsController extends IImsRcsController.Stub { */ // 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 @@ public class ImsRcsController extends IImsRcsController.Stub { */ // 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 @@ public class ImsRcsController extends IImsRcsController.Stub { "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 @@ public class ImsRcsController extends IImsRcsController.Stub { @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 @@ public class ImsRcsController extends IImsRcsController.Stub { return; } transport.destroySipDelegate(subId, connection, reason); + } catch (ServiceSpecificException e) { + Log.e(TAG, "destroySipDelegate: error=" + e.errorCode); } finally { Binder.restoreCallingIdentity(identity); } @@ -598,6 +634,8 @@ public class ImsRcsController extends IImsRcsController.Stub { return; } transport.triggerFullNetworkRegistration(subId, connection, sipCode, sipReason); + } catch (ServiceSpecificException e) { + Log.e(TAG, "triggerNetworkRegistration: error=" + e.errorCode); } finally { Binder.restoreCallingIdentity(identity); } @@ -688,38 +726,25 @@ public class ImsRcsController extends IImsRcsController.Stub { } /** - * Retrieve ImsPhone instance. + * Retrieve RcsFeatureManager instance. * * @param subId the subscription ID - * @return The ImsPhone instance - * @throws ServiceSpecificException if getting ImsPhone instance failed. + * @return The RcsFeatureManager instance + * @throws ServiceSpecificException if getting RcsFeatureManager 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; + 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) { + 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 @@ public class ImsRcsController extends IImsRcsController.Stub { "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 @@ public class ImsRcsController extends IImsRcsController.Stub { 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 000000000..c2630ef78 --- /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 c4686db4c..1a1c32195 100644 --- a/src/com/android/phone/PhoneGlobals.java +++ b/src/com/android/phone/PhoneGlobals.java @@ -49,6 +49,7 @@ import android.telephony.CarrierConfigManager; 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.util.Log; 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 @@ public class PhoneGlobals extends ContextWrapper { new CarrierVvmPackageInstalledReceiver(); private final SettingsObserver mSettingsObserver; + private BinderCallsStats.SettingsObserver mBinderCallsSettingsObserver; private static class EventSimStateChangedBag { final int mPhoneId; @@ -372,6 +375,9 @@ public class PhoneGlobals extends ContextWrapper { 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 @@ public class PhoneGlobals extends ContextWrapper { 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 b67b77a1d..7581f56ad 100755 --- a/src/com/android/phone/PhoneInterfaceManager.java +++ b/src/com/android/phone/PhoneInterfaceManager.java @@ -29,6 +29,8 @@ import android.annotation.NonNull; 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.UiccSlotInfo; 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.annotations.VisibleForTesting; 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.LocaleUtils; 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.TelecomAccountRegistry; 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 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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); @@ -1875,7 +1891,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { (Pair<Integer, SignalStrengthUpdateRequest>) request.argument; onCompleted = obtainMessage(EVENT_SET_SIGNAL_STRENGTH_UPDATE_REQUEST_DONE, request); - phone.getServiceStateTracker().setSignalStrengthUpdateRequest( + phone.getSignalStrengthController().setSignalStrengthUpdateRequest( request.subId, pair.first /*callingUid*/, pair.second /*request*/, onCompleted); break; @@ -1903,7 +1919,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { (Pair<Integer, SignalStrengthUpdateRequest>) request.argument; onCompleted = obtainMessage(EVENT_CLEAR_SIGNAL_STRENGTH_UPDATE_REQUEST_DONE, request); - phone.getServiceStateTracker().clearSignalStrengthUpdateRequest( + phone.getSignalStrengthController().clearSignalStrengthUpdateRequest( request.subId, pair.first /*callingUid*/, pair.second /*request*/, onCompleted); break; @@ -1927,24 +1943,24 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 @@ public class PhoneInterfaceManager extends ITelephony.Stub { // 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 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 @@ public class PhoneInterfaceManager extends ITelephony.Stub { } } + /** + * @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()); + 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 = getPhone(getDefaultSubscription()); + return phone == null ? TelephonyManager.CALL_STATE_IDLE : + PhoneConstantConversions.convertCallState(phone.getState()); + } finally { + Binder.restoreCallingIdentity(identity); + } } - public int getCallStateForSlot(int slotIndex) { + @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 = PhoneFactory.getPhone(slotIndex); + Phone phone = getPhone(subId); return phone == null ? TelephonyManager.CALL_STATE_IDLE : PhoneConstantConversions.convertCallState(phone.getState()); } finally { @@ -3066,6 +3110,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { return null; } int subId = phone.getSubId(); + enforceCallingPackage(callingPackage, Binder.getCallingUid(), "getImeiForSlot"); if (!TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers(mApp, subId, callingPackage, callingFeatureId, "getImeiForSlot")) { return null; @@ -3085,7 +3130,12 @@ public class PhoneInterfaceManager extends ITelephony.Stub { String tac = null; if (phone != null) { String imei = phone.getImei(); - tac = imei == null ? null : imei.substring(0, TYPE_ALLOCATION_CODE_LENGTH); + try { + tac = imei == null ? null : imei.substring(0, TYPE_ALLOCATION_CODE_LENGTH); + } catch (IndexOutOfBoundsException e) { + Log.e(LOG_TAG, "IMEI length shorter than upper index."); + return null; + } } return tac; } @@ -3117,7 +3167,13 @@ public class PhoneInterfaceManager extends ITelephony.Stub { String manufacturerCode = null; if (phone != null) { String meid = phone.getMeid(); - manufacturerCode = meid == null ? null : meid.substring(0, MANUFACTURER_CODE_LENGTH); + try { + manufacturerCode = + meid == null ? null : meid.substring(0, MANUFACTURER_CODE_LENGTH); + } catch (IndexOutOfBoundsException e) { + Log.e(LOG_TAG, "MEID length shorter than upper index."); + return null; + } } return manufacturerCode; } @@ -3211,6 +3267,26 @@ public class PhoneInterfaceManager extends ITelephony.Stub { // /** + * 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 @@ -3785,9 +3861,9 @@ public class PhoneInterfaceManager extends ITelephony.Stub { } 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 { @@ -3809,7 +3885,6 @@ public class PhoneInterfaceManager extends ITelephony.Stub { } 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) { @@ -3905,11 +3980,11 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 { @@ -3932,7 +4007,6 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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) { @@ -3948,11 +4022,11 @@ public class PhoneInterfaceManager extends ITelephony.Stub { @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; @@ -4004,6 +4078,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { + subId + "'"); throw new ServiceSpecificException(ImsException.CODE_ERROR_INVALID_SUBSCRIPTION); } + verifyImsMmTelConfiguredOrThrow(slotId); ImsManager.getInstance(mApp, slotId).isSupported(capability, transportType, aBoolean -> { try { @@ -4013,6 +4088,8 @@ public class PhoneInterfaceManager extends ITelephony.Stub { + "running. Ignore"); } }); + } catch (ImsException e) { + throw new ServiceSpecificException(e.getCode()); } finally { Binder.restoreCallingIdentity(token); } @@ -4027,11 +4104,11 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 { @@ -4045,9 +4122,10 @@ public class PhoneInterfaceManager extends ITelephony.Stub { "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 { @@ -4065,8 +4143,9 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 { @@ -4080,8 +4159,10 @@ public class PhoneInterfaceManager extends ITelephony.Stub { "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 { @@ -4099,9 +4180,9 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 { @@ -4115,8 +4196,55 @@ public class PhoneInterfaceManager extends ITelephony.Stub { "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 { @@ -4129,14 +4257,15 @@ public class PhoneInterfaceManager extends ITelephony.Stub { * @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 { @@ -4150,9 +4279,10 @@ public class PhoneInterfaceManager extends ITelephony.Stub { "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 { @@ -4166,9 +4296,9 @@ public class PhoneInterfaceManager extends ITelephony.Stub { "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 { @@ -4186,9 +4316,9 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 { @@ -4202,9 +4332,10 @@ public class PhoneInterfaceManager extends ITelephony.Stub { "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 { @@ -4217,9 +4348,9 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 { @@ -4233,9 +4364,10 @@ public class PhoneInterfaceManager extends ITelephony.Stub { "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 { @@ -4249,8 +4381,10 @@ public class PhoneInterfaceManager extends ITelephony.Stub { "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 { @@ -4268,9 +4402,9 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 { @@ -4287,8 +4421,9 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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()); @@ -4305,7 +4440,6 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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) { @@ -4406,8 +4540,10 @@ public class PhoneInterfaceManager extends ITelephony.Stub { @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"); @@ -4417,8 +4553,8 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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; @@ -4471,8 +4607,10 @@ public class PhoneInterfaceManager extends ITelephony.Stub { @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"); @@ -4483,8 +4621,8 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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; @@ -4748,6 +4886,20 @@ public class PhoneInterfaceManager extends ITelephony.Stub { } } + /** + * 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)) { @@ -5708,6 +5860,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { + 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); @@ -5716,6 +5869,8 @@ public class PhoneInterfaceManager extends ITelephony.Stub { + "Ignore"); } }); + } catch (ImsException e) { + throw new ServiceSpecificException(e.getCode()); } finally { Binder.restoreCallingIdentity(token); } @@ -5812,12 +5967,12 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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()) @@ -6081,6 +6236,8 @@ public class PhoneInterfaceManager extends ITelephony.Stub { .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( @@ -6594,6 +6751,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { @Override public int checkCarrierPrivilegesForPackage(int subId, String pkgName) { + enforceReadPrivilegedPermission("checkCarrierPrivilegesForPackage"); if (TextUtils.isEmpty(pkgName)) { return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS; } @@ -6611,6 +6769,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { @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; @@ -6634,6 +6793,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { @Override public List<String> getCarrierPackageNamesForIntentAndPhone(Intent intent, int phoneId) { + enforceReadPrivilegedPermission("getCarrierPackageNamesForIntentAndPhone"); if (!SubscriptionManager.isValidPhoneId(phoneId)) { loge("phoneId " + phoneId + " is not valid."); return null; @@ -6648,6 +6808,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { @Override public List<String> getPackagesWithCarrierPrivileges(int phoneId) { + enforceReadPrivilegedPermission("getPackagesWithCarrierPrivileges"); PackageManager pm = mApp.getPackageManager(); List<String> privilegedPackages = new ArrayList<>(); List<PackageInfo> packages = null; @@ -6666,7 +6827,9 @@ public class PhoneInterfaceManager extends ITelephony.Stub { for (int p = packages.size() - 1; p >= 0; p--) { PackageInfo pkgInfo = packages.get(p); if (pkgInfo != null && pkgInfo.packageName != null - && card.getCarrierPrivilegeStatus(pkgInfo) + && getCarrierPrivilegeStatusFromCarrierConfigRules( + card.getCarrierPrivilegeStatus(pkgInfo), + getPhone(phoneId), pkgInfo.packageName) == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { privilegedPackages.add(pkgInfo.packageName); } @@ -7073,6 +7236,98 @@ public class PhoneInterfaceManager extends ITelephony.Stub { } @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(); @@ -7283,8 +7538,11 @@ public class PhoneInterfaceManager extends ITelephony.Stub { @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); @@ -7355,7 +7613,11 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 { @@ -7367,7 +7629,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 @@ -7380,12 +7642,17 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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); } @@ -7559,7 +7826,15 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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)) { @@ -7568,16 +7843,11 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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 { @@ -9243,7 +9513,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { } @Override - public void setMobileDataPolicyEnabledStatus(int subscriptionId, int policy, + public void setMobileDataPolicyEnabled(int subscriptionId, int policy, boolean enabled) { enforceModifyPermission(); @@ -9473,14 +9743,13 @@ public class PhoneInterfaceManager extends ITelephony.Stub { @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 @@ -9664,8 +9933,8 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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) { @@ -9696,7 +9965,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { Phone phone = getPhone(subId); if (phone == null) { thermalMitigationResult = - TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE; + TelephonyManager.THERMAL_MITIGATION_RESULT_MODEM_NOT_AVAILABLE; break; } @@ -9709,7 +9978,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { break; } else if (isAnyPhoneInEmergencyState()) { thermalMitigationResult = - TelephonyManager.THERMAL_MITIGATION_RESULT_INVALID_STATE; + TelephonyManager.THERMAL_MITIGATION_RESULT_INVALID_STATE; break; } } else { @@ -9726,7 +9995,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { break; } thermalMitigationResult = - TelephonyManager.THERMAL_MITIGATION_RESULT_SUCCESS; + TelephonyManager.THERMAL_MITIGATION_RESULT_SUCCESS; break; default: throw new IllegalArgumentException("the requested thermalMitigationAction does " @@ -9887,8 +10156,8 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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); @@ -9969,11 +10238,15 @@ public class PhoneInterfaceManager extends ITelephony.Stub { 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); } @@ -10024,7 +10297,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub { @Override public void sendDeviceToDeviceMessage(int message, int value) { TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(), - "setCarrierSingleRegistrationEnabledOverride"); + "sendDeviceToDeviceMessage"); enforceModifyPermission(); final long identity = Binder.clearCallingIdentity(); @@ -10041,6 +10314,55 @@ public class PhoneInterfaceManager extends ITelephony.Stub { } } + /** + * 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. @@ -10130,6 +10452,21 @@ public class PhoneInterfaceManager extends ITelephony.Stub { } /** + * 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 @@ -10386,37 +10723,36 @@ public class PhoneInterfaceManager extends ITelephony.Stub { } /** - * Prepare TelephonyManager for an unattended reboot. The reboot is - * required to be done shortly after the API is invoked. + * Gets the current phone capability. + * + * Requires carrier privileges or READ_PRECISE_PHONE_STATE permission. + * @return the PhoneCapability which describes the data connection capability of modem. + * It's used to evaluate possible phone config change, for example from single + * SIM device to multi-SIM device. */ @Override - @TelephonyManager.PrepareUnattendedRebootResult - public int prepareForUnattendedReboot() { - WorkSource workSource = getWorkSource(Binder.getCallingUid()); - enforceRebootPermission(); - + public PhoneCapability getPhoneCapability() { + enforceReadPrivilegedPermission("getPhoneCapability"); final long identity = Binder.clearCallingIdentity(); try { - return (int) sendRequest(CMD_PREPARE_UNATTENDED_REBOOT, null, workSource); + return mPhoneConfigurationManager.getCurrentPhoneCapability(); } finally { Binder.restoreCallingIdentity(identity); } } /** - * Gets the current phone capability. - * - * Requires carrier privileges or READ_PRECISE_PHONE_STATE permission. - * @return the PhoneCapability which describes the data connection capability of modem. - * It's used to evaluate possible phone config change, for example from single - * SIM device to multi-SIM device. + * Prepare TelephonyManager for an unattended reboot. The reboot is + * required to be done shortly after the API is invoked. */ @Override - public PhoneCapability getPhoneCapability() { - enforceReadPrivilegedPermission("getPhoneCapability"); + @TelephonyManager.PrepareUnattendedRebootResult + public int prepareForUnattendedReboot() { + enforceRebootPermission(); + final long identity = Binder.clearCallingIdentity(); try { - return mPhoneConfigurationManager.getCurrentPhoneCapability(); + return (int) sendRequest(CMD_PREPARE_UNATTENDED_REBOOT, null); } finally { Binder.restoreCallingIdentity(identity); } diff --git a/src/com/android/phone/RcsProvisioningMonitor.java b/src/com/android/phone/RcsProvisioningMonitor.java index 8f4cd86af..23c4c5a95 100644 --- a/src/com/android/phone/RcsProvisioningMonitor.java +++ b/src/com/android/phone/RcsProvisioningMonitor.java @@ -129,7 +129,6 @@ public class RcsProvisioningMonitor { 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 @@ public class RcsProvisioningMonitor { 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 @@ public class RcsProvisioningMonitor { 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 2af08234a..dbeb7ce1d 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_CALL_RADIO 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.text.TextUtils; 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.d2d.Communicator; 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.List; 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { // 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { (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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { onHelpGba(); onHelpSrc(); onHelpD2D(); + onHelpDisableOrEnablePhysicalSubscription(); + onHelpAllowedNetworkTypes(); } private void onHelpD2D() { @@ -338,6 +384,25 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { + "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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { return 0; } switch (arg) { - case DATA_ENABLE: { + case ENABLE: { try { mInterface.enableDataConnectivity(); } catch (RemoteException ex) { @@ -607,7 +705,7 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { } break; } - case DATA_DISABLE: { + case DISABLE: { try { mInterface.disableDataConnectivity(); } catch (RemoteException ex) { @@ -749,6 +847,41 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { case D2D_SEND: { return handleD2dSendCommand(); } + case D2D_TRANSPORT: { + return handleD2dTransportCommand(); + } + case D2D_SET_DEVICE_SUPPORT: { + return handleD2dDeviceSupportedCommand(); + } } return -1; @@ -797,11 +936,9 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 @@ public class TelephonyShellCommand extends BasicShellCommandHandler { 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 000000000..efb149e73 --- /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 000000000..e4458cd8c --- /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 000000000..2f081f712 --- /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 000000000..25a0cd505 --- /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 000000000..9e5bb6aee --- /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 000000000..fc934855d --- /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 57caedee0..f24e7d6f5 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.PackageManager; 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 @@ public class EuiccUiDispatcherActivity extends Activity { 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 8355fa6f8..475d878ed 100644 --- a/src/com/android/phone/settings/AccessibilitySettingsFragment.java +++ b/src/com/android/phone/settings/AccessibilitySettingsFragment.java @@ -64,7 +64,7 @@ public class AccessibilitySettingsFragment extends PreferenceFragment { 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 @@ public class AccessibilitySettingsFragment extends PreferenceFragment { || (telephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE)); } } - }; + } private Context mContext; private AudioManager mAudioManager; diff --git a/src/com/android/phone/settings/PhoneAccountSettingsFragment.java b/src/com/android/phone/settings/PhoneAccountSettingsFragment.java index 224a1f90d..6bc71dc48 100644 --- a/src/com/android/phone/settings/PhoneAccountSettingsFragment.java +++ b/src/com/android/phone/settings/PhoneAccountSettingsFragment.java @@ -78,6 +78,9 @@ public class PhoneAccountSettingsFragment extends PreferenceFragment new SubscriptionManager.OnSubscriptionsChangedListener() { @Override public void onSubscriptionsChanged() { + if (getActivity() == null) { + return; + } updateAccounts(); } }; diff --git a/src/com/android/phone/settings/RadioInfo.java b/src/com/android/phone/settings/RadioInfo.java index 302fc4776..b1ab41376 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.CellSignalStrengthGsm; 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.io.IOException; 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 @@ public class RadioInfo extends AppCompatActivity { 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 @@ public class RadioInfo extends AppCompatActivity { 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 @@ public class RadioInfo extends AppCompatActivity { } }; + 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 @@ public class RadioInfo extends AppCompatActivity { TelephonyCallback.CallForwardingIndicatorListener, TelephonyCallback.CellInfoListener, TelephonyCallback.SignalStrengthsListener, - TelephonyCallback.ServiceStateListener, - TelephonyCallback.PreciseCallStateListener { + TelephonyCallback.ServiceStateListener { @Override public void onDataConnectionStateChanged(int state, int networkType) { @@ -320,17 +332,12 @@ public class RadioInfo extends AppCompatActivity { } @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 @@ public class RadioInfo extends AppCompatActivity { 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 @@ public class RadioInfo extends AppCompatActivity { 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 @@ public class RadioInfo extends AppCompatActivity { 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 @@ public class RadioInfo extends AppCompatActivity { 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 @@ public class RadioInfo extends AppCompatActivity { 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 @@ public class RadioInfo extends AppCompatActivity { } }; - 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 @@ public class RadioInfo extends AppCompatActivity { } }; + 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 8523a5ff4..a076ec840 100644 --- a/src/com/android/services/telephony/CdmaConferenceController.java +++ b/src/com/android/services/telephony/CdmaConferenceController.java @@ -20,11 +20,14 @@ import android.os.Handler; 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 @@ final class CdmaConferenceController { 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 @@ final class CdmaConferenceController { 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 @@ final class CdmaConferenceController { 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 e17577fc6..9c89e9e1e 100644 --- a/src/com/android/services/telephony/DisconnectCauseUtil.java +++ b/src/com/android/services/telephony/DisconnectCauseUtil.java @@ -23,6 +23,7 @@ import android.provider.Settings; 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 @@ public class DisconnectCauseUtil { * 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 class DisconnectCauseUtil { 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 @@ public class DisconnectCauseUtil { * 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 c9f762be4..0be927a8c 100644 --- a/src/com/android/services/telephony/ImsConference.java +++ b/src/com/android/services/telephony/ImsConference.java @@ -1074,7 +1074,12 @@ public class ImsConference extends TelephonyConferenceBase implements Holdable { // 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 ee4baae64..41913678c 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.ImsExternalConnection; 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 @@ final class PstnIncomingCallNotifier { 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 9226cae0c..1d749f4ac 100644 --- a/src/com/android/services/telephony/TelecomAccountRegistry.java +++ b/src/com/android/services/telephony/TelecomAccountRegistry.java @@ -588,11 +588,15 @@ public class TelecomAccountRegistry { 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 @@ public class TelecomAccountRegistry { 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 @@ public class TelecomAccountRegistry { } } } - }; + } private static TelecomAccountRegistry sInstance; private final Context mContext; @@ -1203,7 +1210,7 @@ public class TelecomAccountRegistry { * @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 @@ public class TelecomAccountRegistry { * @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 @@ public class TelecomAccountRegistry { * @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 @@ public class TelecomAccountRegistry { * @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 78942a159..18a40cf13 100755..100644 --- a/src/com/android/services/telephony/TelephonyConnection.java +++ b/src/com/android/services/telephony/TelephonyConnection.java @@ -28,8 +28,11 @@ import android.os.Bundle; 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.ServiceState.RilRadioTechnology; 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.PhoneConstants; 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.ImsUtil; 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.Objects; 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu } }; + 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu @Override public void onStateChanged(android.telecom.Connection c, int state) { - mCommunicator.onStateChanged(c, state); + mCommunicator.onStateChanged(c.getTelecomCallId(), state); } } @@ -581,6 +626,12 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu @Override public void onOriginalConnectionReplaced( com.android.internal.telephony.Connection newConnection) { + Log.i(TelephonyConnection.this, "onOriginalConnectionReplaced; newConn=%s", + newConnection); setOriginalConnection(newConnection); } @@ -738,10 +791,20 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu } } + @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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu } @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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu // 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu } 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu * - 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu } /** + * 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu // 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu + " -> " + 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 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu } if (mCommunicator != null) { - mCommunicator.onStateChanged(this, getState()); + mCommunicator.onStateChanged(getTelecomCallId(), getState()); } } } @@ -2430,6 +2611,16 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu } /** + * 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 @@ -2516,6 +2707,10 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu capabilities = changeBitmask(capabilities, CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL, isLocalVideoSupported); + capabilities = changeBitmask(capabilities, CAPABILITY_REMOTE_PARTY_SUPPORTS_RTT, + (mOriginalConnectionCapabilities & Capability.SUPPORTS_RTT_REMOTE) + == Capability.SUPPORTS_RTT_REMOTE); + return capabilities; } @@ -2667,8 +2862,10 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu */ 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; } /** @@ -2733,7 +2930,7 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu } 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; @@ -2846,8 +3043,8 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 @@ -2856,6 +3053,19 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu .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, " + @@ -2876,6 +3086,12 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu } 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, @@ -3043,7 +3259,7 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu } /** - * 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. @@ -3193,55 +3409,87 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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(); } - ImsPhoneConnection originalConnection = - (ImsPhoneConnection) mOriginalConnection; - return originalConnection.getAcceptedRtpHeaderExtensions(); - } - @Override - public void sendRtpHeaderExtensions( - @NonNull Set<RtpHeaderExtension> rtpHeaderExtensions) { - if (!isImsConnection()) { - Log.w(TelephonyConnection.this, "sendRtpHeaderExtensions: not an ims conn."); + @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); } - Log.d(TelephonyConnection.this, "sendRtpHeaderExtensions: sending %d messages", - rtpHeaderExtensions.size()); + }; + 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; - originalConnection.sendRtpHeaderExtensions(rtpHeaderExtensions); - } - }; - mRtpTransport = new RtpTransport(rtpAdapter, null /* TODO: not needed yet */, mHandler); + 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); + } + } - 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); } /** @@ -3262,14 +3510,57 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu // 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. */ @@ -3441,4 +3732,86 @@ abstract class TelephonyConnection extends Connection implements Holdable, Commu 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 d2b0c5039..7a0d8c276 100644 --- a/src/com/android/services/telephony/TelephonyConnectionService.java +++ b/src/com/android/services/telephony/TelephonyConnectionService.java @@ -28,9 +28,7 @@ import android.content.Intent; 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.internal.telephony.imsphone.ImsPhoneConnection; 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.HashSet; 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 @@ import javax.annotation.Nullable; * 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 @@ public class TelephonyConnectionService extends ConnectionService { // destroyed. @VisibleForTesting public Pair<WeakReference<TelephonyConnection>, Queue<Phone>> mEmergencyRetryCache; - private Handler mDdsSwitchHandler; - private HandlerThread mHandlerThread; private DeviceState mDeviceState = new DeviceState(); /** @@ -361,27 +359,6 @@ public class TelephonyConnectionService extends ConnectionService { }; /** - * 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 @@ public class TelephonyConnectionService extends ConnectionService { } /** - * Override Handler creation factory for testing. - */ - @VisibleForTesting - public void setHandlerFactory(HandlerFactory handlerFactory) { - mHandlerFactory = handlerFactory; - } - - /** * Override DisconnectCause creation for testing. */ @VisibleForTesting @@ -530,16 +499,11 @@ public class TelephonyConnectionService extends ConnectionService { 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 @@ public class TelephonyConnectionService extends ConnectionService { } 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 @@ public class TelephonyConnectionService extends ConnectionService { 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 @@ public class TelephonyConnectionService extends ConnectionService { 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 @@ public class TelephonyConnectionService extends ConnectionService { 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 @@ public class TelephonyConnectionService extends ConnectionService { .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 @@ public class TelephonyConnectionService extends ConnectionService { "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 @@ public class TelephonyConnectionService extends ConnectionService { /** * 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 @@ public class TelephonyConnectionService extends ConnectionService { 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 @@ public class TelephonyConnectionService extends ConnectionService { } 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 0d4265ab6..45f7d95c1 100644 --- a/src/com/android/services/telephony/rcs/MessageTransportWrapper.java +++ b/src/com/android/services/telephony/rcs/MessageTransportWrapper.java @@ -482,7 +482,7 @@ public class MessageTransportWrapper implements DelegateBinderStateManager.State } 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 30edca1b0..8cc70a403 100644 --- a/src/com/android/services/telephony/rcs/SipDelegateController.java +++ b/src/com/android/services/telephony/rcs/SipDelegateController.java @@ -414,7 +414,7 @@ public class SipDelegateController { } 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 77bf3f3a7..5ab482fef 100644 --- a/src/com/android/services/telephony/rcs/SipSessionTracker.java +++ b/src/com/android/services/telephony/rcs/SipSessionTracker.java @@ -357,7 +357,7 @@ public class SipSessionTracker { } 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 f37c3605c..709e1420f 100644 --- a/src/com/android/services/telephony/rcs/SipTransportController.java +++ b/src/com/android/services/telephony/rcs/SipTransportController.java @@ -803,7 +803,12 @@ public class SipTransportController implements RcsFeatureController.Feature, } 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 @@ public class SipTransportController implements RcsFeatureController.Feature, } 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 5d0cab90f..995d6851c 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; 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 0ff6cc1f4..477bbc068 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 @@ public class ImsCallingActivity extends Activity { 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 d8899366e..ddaf3a678 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 7383a4a91..ca07c5472 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 7538df764..35a0822e5 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 000000000..2fac78ca1 --- /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 000000000..5196cf4a9 --- /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 000000000..8787d2661 --- /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 000000000..bec17d3ac --- /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 000000000..bec17d3ac --- /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 000000000..bec17d3ac --- /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 000000000..bec17d3ac --- /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 000000000..ef9b6cba6 --- /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 000000000..484287772 --- /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 000000000..38f1bd5d9 --- /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 000000000..6050bad41 --- /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 000000000..00d9a4e09 --- /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 000000000..758b2bddc --- /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 000000000..51cf3763b --- /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 000000000..5c9491bc1 --- /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 000000000..593cf463a --- /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 000000000..1276015bf --- /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 000000000..ca626208d --- /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 000000000..7a0643dfc --- /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 000000000..e2dc0cb09 --- /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 000000000..ec7f74ada --- /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 000000000..ec7f74ada --- /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 000000000..d05fa1607 --- /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 1c461fe28..7436da433 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.QosCallbackException; 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 @@ import java.util.concurrent.atomic.AtomicBoolean; 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 @@ public class MsrpSession { 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 @@ public class MsrpSession { 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 fc5ee4c9c..545646942 100644 --- a/tests/src/com/android/TestContext.java +++ b/tests/src/com/android/TestContext.java @@ -27,6 +27,7 @@ import android.content.IntentFilter; 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 @@ public class TestContext extends MockContext { 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 85e190ecb..4fba9224d 100644 --- a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java +++ b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java @@ -579,6 +579,18 @@ public class RcsProvisioningMonitorTest { @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 000000000..b50379082 --- /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 000000000..f1ce3b8c2 --- /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 edfc34fc5..33c8b8a61 100644 --- a/tests/src/com/android/services/telephony/ImsConferenceControllerTest.java +++ b/tests/src/com/android/services/telephony/ImsConferenceControllerTest.java @@ -27,8 +27,6 @@ import static org.mockito.Mockito.when; 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 @@ public class ImsConferenceControllerTest { @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 7e6488d6e..3bc5ee847 100644 --- a/tests/src/com/android/services/telephony/ImsConferenceTest.java +++ b/tests/src/com/android/services/telephony/ImsConferenceTest.java @@ -577,6 +577,51 @@ public class ImsConferenceTest { } /** + * 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 b761959f1..4ce94ca80 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 junit.framework.Assert.fail; 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.net.Uri; 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 android.test.suitebuilder.annotation.SmallTest; 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 @@ import java.util.List; @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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { @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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { } private TelephonyConnectionService mTestConnectionService; + private IConnectionService.Stub mBinderStub; @Before public void setUp() throws Exception { @@ -147,11 +170,6 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { .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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { mTestConnectionService.setDisconnectCauseFactory(mDisconnectCauseFactory); mTestConnectionService.onCreate(); mTestConnectionService.setTelephonyManagerProxy(mTelephonyManagerProxy); + mBinderStub = (IConnectionService.Stub) mTestConnectionService.onBind(null); } @After @@ -648,7 +667,7 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { // 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { // 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { // 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { // 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { // 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { // 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { @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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { @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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { @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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { @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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { @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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { @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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { 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 @@ public class TelephonyConnectionServiceTest extends TelephonyTestBase { 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 7d156806d..388fd298c 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 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 androidx.test.runner.AndroidJUnit4; +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 67e032918..817e9a7cc 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 @@ public class TestTelephonyConnection extends TelephonyConnection { Context mMockContext; @Mock + ContentResolver mMockContentResolver; + + @Mock Resources mMockResources; @Mock @@ -67,14 +83,40 @@ public class TestTelephonyConnection extends TelephonyConnection { @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 @@ public class TestTelephonyConnection extends TelephonyConnection { 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 @@ public class TestTelephonyConnection extends TelephonyConnection { 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 @@ public class TestTelephonyConnection extends TelephonyConnection { 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 @@ public class TestTelephonyConnection extends TelephonyConnection { } } - @Override - public boolean isConferenceSupported() { - return true; - } - public void setMockPhone(Phone newPhone) { mMockPhone = newPhone; } @@ -158,7 +218,14 @@ public class TestTelephonyConnection extends TelephonyConnection { 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 @@ public class TestTelephonyConnection extends TelephonyConnection { } @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 class TestTelephonyConnection extends TelephonyConnection { 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; + } } |
