Merge "Add set/get call composer status methods in PhoneInterfaceMangaer"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c363811..8f637c6 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -40,6 +40,7 @@
<protected-broadcast android:name="android.provider.Telephony.SIM_FULL" />
<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" />
<protected-broadcast android:name="android.intent.action.DATA_SMS_RECEIVED" />
<protected-broadcast android:name="android.provider.Telephony.SMS_RECEIVED" />
<protected-broadcast android:name="android.provider.Telephony.SMS_DELIVER" />
@@ -59,6 +60,7 @@
<protected-broadcast android:name= "com.android.internal.telephony.CARRIER_SIGNAL_PCO_VALUE" />
<protected-broadcast android:name= "com.android.internal.telephony.CARRIER_SIGNAL_RESET" />
<protected-broadcast android:name= "com.android.internal.telephony.CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE" />
+ <protected-broadcast android:name= "com.android.internal.telephony.PROVISION" />
<protected-broadcast android:name= "com.android.internal.telephony.ACTION_LINE1_NUMBER_ERROR_DETECTED" />
<protected-broadcast android:name= "com.android.internal.provider.action.VOICEMAIL_SMS_RECEIVED" />
<protected-broadcast android:name= "com.android.intent.isim_refresh" />
@@ -81,6 +83,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" />
@@ -88,6 +91,7 @@
<protected-broadcast android:name= "android.telephony.action.SIM_SLOT_STATUS_CHANGED" />
<protected-broadcast android:name= "android.telephony.action.SUBSCRIPTION_CARRIER_IDENTITY_CHANGED" />
<protected-broadcast android:name= "android.telephony.action.SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED" />
+ <protected-broadcast android:name= "android.telephony.action.TOGGLE_PROVISION" />
<protected-broadcast android:name= "android.telephony.action.NETWORK_COUNTRY_CHANGED" />
<protected-broadcast android:name= "android.telephony.action.PRIMARY_SUBSCRIPTION_LIST_CHANGED" />
<protected-broadcast android:name= "android.telephony.action.MULTI_SIM_CONFIG_CHANGED" />
@@ -220,6 +224,7 @@
<uses-permission android:name="android.permission.NETWORK_STATS_PROVIDER" />
<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"/>
<!-- Needed to listen to changes in projection state. -->
<uses-permission android:name="android.permission.READ_PROJECTION_STATE"/>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index cb0ec8b..dfe7c8c 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Fooninligting"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Diensverskaffervoorsiening-inligting"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Trigger-diensverskaffervoorsiening"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index a2ebdf5..e7324e6 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"የስልክ መረጃ"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"የአገልግሎት አቅራቢ አቅርቦት መረጃ"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"የቀስቅሴ አገልግሎት አቅራቢ አቅርቦት"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"የአስተያየት ጥቆማ፦ የብሉቱዝን ግንኙነት ያሻሽሉ"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"የጥሪ ጥራት ማሳወቂያ"</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index cce064f..620b5cc 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -931,4 +931,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"معلومات الهاتف"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"معلومات توفير خدمة مشغّل شبكة الجوّال"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"توفير خدمة مشغّل شبكة الجوّال"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 6c653bd..ca997de 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ফ\'নৰ তথ্য"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"বাহকৰ প্ৰ’ভিজনিং তথ্য"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"বাহকৰ প্ৰ’ভিজনিং সূচনা কৰক"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"পৰামৰ্শ: ব্লুটুথ সংযোগ উন্নত কৰক"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"কলৰ গুণগত মানৰ জাননী"</string>
</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index c5bbc87..5376968 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Telefon məlumatı"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Operator Təchizat Məlumatı"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Operator Təchizatlanmasını aktiv edin"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Təklif: Bluetooth bağlantısını təkmilləşdirin"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Zəng keyfiyyəti bildirişi"</string>
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 0c0aad3..7ab9248 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -922,4 +922,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informacije o telefonu"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informacije o dodeli mobilnog operatera"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Pokretanje dodele mobilnog operatera"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Predlog: poboljšajte Bluetooth vezu"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Obaveštenje o kvalitetu poziva"</string>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index a419870..2d2a8d7 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -310,7 +310,7 @@
<string name="video_calling_settings_title" msgid="342829454913266078">"Відэавыклікі праз аператара"</string>
<string name="gsm_umts_options" msgid="4968446771519376808">"Параметры GSM/UMTS"</string>
<string name="cdma_options" msgid="3669592472226145665">"Параметры CDMA"</string>
- <string name="throttle_data_usage" msgid="1944145350660420711">"Выкарыстанне трафіку"</string>
+ <string name="throttle_data_usage" msgid="1944145350660420711">"Выкарыстанне трафіка"</string>
<string name="throttle_current_usage" msgid="7483859109708658613">"Выкарыстанне даных у бягучы перыяд"</string>
<string name="throttle_time_frame" msgid="1813452485948918791">"Перыяд выкарыстання дадзеных"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Палітыка хуткасці перадачы дадзеных"</string>
@@ -925,4 +925,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Звесткі аб тэлефоне"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Звесткі аб аператары"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Запусціць сінхранізацыю з аператарам"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 4f69827..d6eb65d 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Информация за телефона"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Информация за обезпечаването от оператора"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Задействане на обезпечаването от оператора"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Предложение: Подобрете връзката през Bluetooth"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Известия за качеството на обаждането"</string>
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 893d8a8..3cdc467 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ফোনের তথ্য"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"পরিষেবা প্রদানকারীর ব্যবস্থামূলক তথ্য"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"ট্রিগার পরিষেবা প্রদানকারীর ব্যবস্থা"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"পরামর্শ: ব্লুটুথ কানেক্টিভিটি উন্নত করুন"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"ফোন কলের কোয়ালিটি সংক্রান্ত বিজ্ঞপ্তি"</string>
</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 286b69d..6b223e6 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -922,4 +922,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informacije o telefonu"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Operater koji pruža informacije"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Aktiviranje dodjele resursa operatera"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Prijedlog: poboljšajte Bluetooth povezivost"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Obavještenje o kvalitetu poziva"</string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index e40d4af..7c2bc60 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informació del telèfon"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informació de serveis de l\'operador"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Activa els serveis de l\'operador"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 3bddac6..bf71b23 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -925,4 +925,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informace o telefonu"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informace o zprovoznění služby u operátora"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Spustit zprovoznění služby u operátora"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index a57b744..330998a 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Telefonoplysninger"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Oplysninger om mobilselskab"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Aktivér mobilselskab"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Forslag: Optimer Bluetooth-forbindelsen"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Notifikation om opkaldskvalitet"</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 09d5143..f909c19 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Über das Telefon"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informationen zur Nutzerverwaltung durch den Anbieter"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Nutzerverwaltung durch den Anbieter auslösen"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index d7f72bb..af1f8db 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Πληροφορίες τηλεφώνου"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Πληροφορίες παροχής εταιρείας κινητής τηλεφωνίας"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Ενεργοποίηση παροχής εταιρείας κινητής τηλεφωνίας"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 146f292..f246913 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Phone info"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Operator provisioning info"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Trigger operator provisioning"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Suggestion: Improve Bluetooth connectivity"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Call quality notification"</string>
</resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index fa87216..d325708 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Phone info"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Operator provisioning info"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Trigger operator provisioning"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Suggestion: Improve Bluetooth connectivity"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Call quality notification"</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 146f292..f246913 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Phone info"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Operator provisioning info"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Trigger operator provisioning"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Suggestion: Improve Bluetooth connectivity"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Call quality notification"</string>
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 146f292..f246913 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Phone info"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Operator provisioning info"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Trigger operator provisioning"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Suggestion: Improve Bluetooth connectivity"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Call quality notification"</string>
</resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index beff7ad..cca7e56 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Phone info"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Carrier Provisioning Info"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Trigger Carrier Provisioning"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Suggestion: Improve Bluetooth connectivity"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Call Quality Notification"</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 406ce56..8f14c57 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Información del teléfono"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Información del aprovisionamiento del proveedor"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Activar aprovisionamiento del proveedor"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 49cea79..70185fd 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -555,7 +555,7 @@
<string name="emergency_information_owner_hint" msgid="6256909888049185316">"Propietario"</string>
<string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tocar de nuevo para ver la información"</string>
<string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"Llamada de emergencia"</string>
- <string name="single_emergency_number_title" msgid="8413371079579067196">"Llamada de emergencia"</string>
+ <string name="single_emergency_number_title" msgid="8413371079579067196">"Número de emergencia"</string>
<string name="numerous_emergency_numbers_title" msgid="8972398932506755510">"Números de emergencia"</string>
<string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"Tocar de nuevo para llamar al <xliff:g id="EMERGENCY_NUMBER">%s</xliff:g>"</string>
<string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"Activando señal móvil…"</string>
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Información sobre el teléfono"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Información de servicios del operador"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Activar servicios del operador"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 21c637e..406091b 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Telefoniteave"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Operaatori ettevalmistamise teave"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Operaatori ettevalmistamise päästik"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 6b0678d..18359c4 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Telefonoaren informazioa"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Operadorearen hornikuntza-informazioa"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Abiarazi operadorearen hornikuntza"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index daa3eab..60c0de1 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"اطلاعات تلفن"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"اطلاعات ارائه شرکت مخابراتی"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"شروع ارائه شرکت مخابراتی"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"پیشنهاد: اتصال بلوتوث را بهبود دهید"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"اعلان کیفیت تماس"</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index c402f87..495d5fa 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Puhelimen tiedot"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Operaattorin hallintatiedot"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Ota operaattorin hallinta käyttöön"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Ehdotus: Paranna Bluetooth-yhteyttä"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Puhelun laatua koskeva ilmoitus"</string>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 93f797c..c81450a 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -634,12 +634,10 @@
<string name="phone_in_ecm_notification_complete_time" msgid="7341624337163082759">"Aucune connexion de données avant <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
<plurals name="alert_dialog_exit_ecm" formatted="false" msgid="5425906903766466743">
<item quantity="one">Le téléphone sera en mode de rappel d\'urgence pendant <xliff:g id="COUNT_1">%s</xliff:g> minute. Lorsque ce mode est activé, vous ne pouvez pas utiliser d\'applications nécessitant une connexion à Internet. Voulez-vous quitter l\'écran maintenant?</item>
- <item quantity="many">The phone will be in Emergency Callback mode for <xliff:g id="COUNT_1">%s</xliff:g> minutes. While in this mode no applications using a data connection can be used. Do you want to exit now?</item>
<item quantity="other"> Le téléphone sera en mode de rappel d\'urgence pendant <xliff:g id="COUNT_1">%s</xliff:g> minutes. Lorsque ce mode est activé, vous ne pouvez pas utiliser d\'applications nécessitant une connexion à Internet. Voulez-vous quitter l\'écran maintenant?</item>
</plurals>
<plurals name="alert_dialog_not_avaialble_in_ecm" formatted="false" msgid="1152682528741457004">
<item quantity="one">L\'action sélectionnée n\'est pas disponible lorsque le mode de rappel d\'urgence est activé. Ce mode restera activé sur ce téléphone pendant <xliff:g id="COUNT_1">%s</xliff:g> minute. Voulez-vous quitter l\'écran maintenant?</item>
- <item quantity="many">The selected action isn\'t available while in the Emergency Callback mode. The phone will be in this mode for <xliff:g id="COUNT_1">%s</xliff:g> minutes. Do you want to exit now?</item>
<item quantity="other">L\'action sélectionnée n\'est pas disponible lorsque le mode de rappel d\'urgence est activé. Ce mode restera activé sur ce téléphone pendant <xliff:g id="COUNT_1">%s</xliff:g> minutes. Voulez-vous quitter l\'écran maintenant?</item>
</plurals>
<string name="alert_dialog_in_ecm_call" msgid="1207545603149771978">"L\'action sélectionnée n\'est pas disponible pendant un appel d\'urgence."</string>
@@ -651,7 +649,6 @@
<string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Jusqu\'à <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
<plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
<item quantity="one">Le mode de rappel d\'urgence sera activé sur le téléphone pour une durée de <xliff:g id="COUNT_1">%s</xliff:g> minute.\nVoulez-vous quitter ce mode maintenant?</item>
- <item quantity="many">The phone will be in emergency callback mode for <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nDo you want to exit now?</item>
<item quantity="other">Le mode de rappel d\'urgence sera activé sur le téléphone pour une durée de <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nVoulez-vous quitter ce mode maintenant?</item>
</plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Service"</string>
@@ -922,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informations sur le téléphone"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Données d\'approvisionnement du fournisseur de services"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Déclencher l\'approvisionnement du fournisseur de services"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Suggestion : améliorer la connectivité Bluetooth"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Notification de qualité d\'appel"</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 93c013a..28aa118 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -634,12 +634,10 @@
<string name="phone_in_ecm_notification_complete_time" msgid="7341624337163082759">"Aucune connexion Internet mobile jusqu\'à <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
<plurals name="alert_dialog_exit_ecm" formatted="false" msgid="5425906903766466743">
<item quantity="one">Le téléphone sera en mode de rappel d\'urgence pendant <xliff:g id="COUNT_1">%s</xliff:g> minute. Lorsque ce mode est activé, vous ne pouvez pas utiliser d\'applications nécessitant une connexion à Internet. Voulez-vous quitter l\'écran maintenant ?</item>
- <item quantity="many">The phone will be in Emergency Callback mode for <xliff:g id="COUNT_1">%s</xliff:g> minutes. While in this mode no applications using a data connection can be used. Do you want to exit now?</item>
<item quantity="other">Le téléphone sera en mode de rappel d\'urgence pendant <xliff:g id="COUNT_1">%s</xliff:g> minutes. Lorsque ce mode est activé, vous ne pouvez pas utiliser d\'applications nécessitant une connexion à Internet. Voulez-vous quitter l\'écran maintenant ?</item>
</plurals>
<plurals name="alert_dialog_not_avaialble_in_ecm" formatted="false" msgid="1152682528741457004">
<item quantity="one">L\'action sélectionnée n\'est pas disponible lorsque le mode de rappel d\'urgence est activé. Ce mode restera activé sur ce téléphone pendant <xliff:g id="COUNT_1">%s</xliff:g> minute. Voulez-vous quitter l\'écran maintenant ?</item>
- <item quantity="many">The selected action isn\'t available while in the Emergency Callback mode. The phone will be in this mode for <xliff:g id="COUNT_1">%s</xliff:g> minutes. Do you want to exit now?</item>
<item quantity="other">L\'action sélectionnée n\'est pas disponible lorsque le mode de rappel d\'urgence est activé. Ce mode restera activé sur ce téléphone pendant <xliff:g id="COUNT_1">%s</xliff:g> minute. Voulez-vous quitter l\'écran maintenant ?</item>
</plurals>
<string name="alert_dialog_in_ecm_call" msgid="1207545603149771978">"L\'action sélectionnée n\'est pas disponible pendant un appel d\'urgence."</string>
@@ -651,7 +649,6 @@
<string name="phone_in_ecm_notification_complete_time_without_data_restriction_hint" msgid="3690292264812050858">"Jusqu\'à <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
<plurals name="alert_dialog_exit_ecm_without_data_restriction_hint" formatted="false" msgid="6477733043040328640">
<item quantity="one">Le téléphone sera en mode de rappel d\'urgence pendant <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nSouhaitez-vous quitter ce mode maintenant ?</item>
- <item quantity="many">The phone will be in emergency callback mode for <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nDo you want to exit now?</item>
<item quantity="other">Le téléphone sera en mode de rappel d\'urgence pendant <xliff:g id="COUNT_1">%s</xliff:g> minutes.\nSouhaitez-vous quitter ce mode maintenant ?</item>
</plurals>
<string name="voicemail_provider" msgid="4158806657253745294">"Service"</string>
@@ -922,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informations sur le téléphone"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informations de gestion des comptes opérateur"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Déclencher la gestion des comptes opérateur"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 1876244..b7b5b55 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Información do teléfono"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Información de aprovisionamento do operador"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Aprovisionamento do operador do activador"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index c767c67..0b655ad 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ફોનની માહિતી"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"કૅરિઅરની જોગવાઈ વિશે માહિતી"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"કૅરિઅરની જોગવાઈ ટ્રિગર કરો"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"સૂચન: બ્લૂટૂથ કનેક્ટિવિટી બહેતર બનાવો"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"કૉલની ક્વૉલિટી માટે નોટિફિકેશન"</string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 54b66f6..df0bbc8 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -656,7 +656,7 @@
<string name="voicemail_number_not_set" msgid="8831561283386938155">"<सेट नहीं है>"</string>
<string name="other_settings" msgid="8895088007393598447">"अन्य कॉल सेटिंग"</string>
<string name="calling_via_template" msgid="1791323450703751750">"कॉल <xliff:g id="PROVIDER_NAME">%s</xliff:g> से जा रही है"</string>
- <string name="contactPhoto" msgid="7885089213135154834">"संपर्क का फ़ोटो"</string>
+ <string name="contactPhoto" msgid="7885089213135154834">"संपर्क की फ़ोटो"</string>
<string name="goPrivate" msgid="4645108311382209551">"निजी हो जाएं"</string>
<string name="selectContact" msgid="1527612842599767382">"संपर्क को चुनें"</string>
<string name="not_voice_capable" msgid="2819996734252084253">"ध्वनि कॉल करना समर्थित नहीं है"</string>
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"फ़ोन की जानकारी"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी के प्रावधान की जानकारी"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी के प्रावधान चालू करें"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"सुझाव: ब्लूटूथ कनेक्टिविटी बेहतर करें"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"कॉल की क्वालिटी की सूचना"</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 091147b..6ed1619 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -922,4 +922,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informacije o telefonu"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informacije o uslugama mobilnog operatera"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Pokretanje usluga mobilnog operatera"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 45405e9..3e15eba 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Telefon adatai"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Információ a szolgáltatói ellátásról"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Szolgáltatói ellátás aktiválása"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index af95672..6033af7 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Հեռախոսի տեղեկություններ"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Օպերատորի նախապատրաստման տվյալներ"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Գործարկել օպերատորի նախապատրաստումը"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Հուշում. բարելավեք Bluetooth կապը"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Զանգի որակի մասին ծանուցում"</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index e06cb64..a23444c 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Info telepon"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Info Provisioning Operator"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Memicu Provisioning Operator"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Saran: Tingkatkan konektivitas Bluetooth"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Notifikasi Kualitas Panggilan"</string>
</resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 4a467ea..9a903ed 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Upplýsingar um síma"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Úthlutunarupplýsingar símafyrirtækis"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Kveikja á úthlutun símafyrirtækis"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index c05ac00..26e6aa5 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Info telefono"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informazioni sul provisioning operatore"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Attiva provisioning operatore"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Suggerimento: migliora la connettività Bluetooth"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Notifica qualità chiamata"</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 3d397d0..0dfc2ab 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -925,4 +925,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"פרטי טלפון"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"פרטי ניהול תצורה של ספק סלולרי"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"הפעלת ניהול תצורה של ספק סלולרי"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"הצעה: שיפור הקישוריות ל-Bluetooth"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"התראה על איכות השיחה"</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index e571695..b3f6683 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"スマートフォン情報"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"携帯通信会社のプロビジョニング情報"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"携帯通信会社のプロビジョニングをトリガー"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Bluetooth の接続性を改善することをおすすめします"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"通話品質に関するお知らせ"</string>
</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 17ad78e..130372a 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ტელეფონის ინფორმაცია"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"ოპერატორის უზრუნველყოფის ინფორმაცია"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"ოპერატორის უზრუნველყოფის გააქტიურება"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index cdc7f70..a58993a 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Телефон ақпараты"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Операторды инициализациялау туралы ақпарат"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Операторды инциализациялауды іске қосу"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 24ce0e3..3bb7e10 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ព័ត៌មានទូរសព្ទ"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"ព័ត៌មានអំពីការផ្តល់ទិន្នន័យរបស់ក្រុមហ៊ុនសេវាទូរសព្ទ"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"នាំឱ្យមានការផ្តល់ទិន្នន័យពីក្រុមហ៊ុនសេវាទូរសព្ទ"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"ការណែនាំ៖ កែលម្អការតភ្ជាប់ប៊្លូធូស"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"ការជូនដំណឹងអំពីគុណភាពហៅទូរសព្ទ"</string>
</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 6f92cfd..40f397e 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ಫೋನ್ ಮಾಹಿತಿ"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"ವಾಹಕ ಪೂರೈಕೆಯ ಮಾಹಿತಿ"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"ಟ್ರಿಗರ್ ವಾಹಕ ಪೂರೈಕೆ"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"ಸಲಹೆ: ಬ್ಲೂಟೂತ್ ಕನೆಕ್ಷನ್ ಅನ್ನು ಸುಧಾರಿಸಿ"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"ಕರೆ ಗುಣಮಟ್ಟದ ಅಧಿಸೂಚನೆ"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 94dfa8f..3d47101 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"휴대전화 정보"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"이동통신사 프로비저닝 정보"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"이동통신사 프로비저닝 실행"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index a9c8a83..970f90a 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Телефондун маалыматы"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Байланыш оператору жөнүндө маалымат"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Байланыш операторун өзгөртүү"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index e106463..b11d585 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ຂໍ້ມູນໂທລະສັບ"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"ຂໍ້ມູນການເປີດນຳໃຊ້ເຄືອຂ່າຍ"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"ກະຕຸ້ນການຈັດຫາຜູ້ໃຫ້ບໍລິການ"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 7af54c0..9217ab2 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -927,4 +927,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Telefono informacija"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Operatoriaus aprūpinimo informacija"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Aktyviklio operatoriaus aprūpinimas"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 12af068..e9eefc1 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -922,4 +922,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Tālruņa informācija"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informācija par mobilo sakaru operatora nodrošināšanu"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Aktivizēt operatora nodrošināšanu"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index ed3a16a..1643021 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Информации за телефонот"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Информации за обезбедување оператор"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Активирајте обезбедување оператор"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index daaa13e7..2cf119f 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ഫോൺ വിവരം"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"കാരിയർ പ്രൊവിഷനിംഗ് വിവരം"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"കാരിയർ പ്രൊവിഷനിംഗ് തുടങ്ങുക"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"നിർദ്ദേശം: Bluetooth കണക്റ്റിവിറ്റി മെച്ചപ്പെടുത്തുക"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"കോൾ നിലവാര അറിയിപ്പ്"</string>
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index c7ecf19..24a3692 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Утасны мэдээлэл"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Оператор компанийн хангалтын мэдээлэл"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Оператор компанийн хангалтыг эхлүүлэх"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 8e5b47b..b177729 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"फोनची माहिती"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"वाहक सुविधा माहिती"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"वाहक सुविधा ट्रिगर करा"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index f9829bd..0f07649 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Maklumat telefon"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Maklumat Peruntukan Pembawa"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Cetus Peruntukan Pembawa"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Cadangan: Tingkatkan kesambungan Bluetooth"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Pemberitahuan Kualiti Panggilan"</string>
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 43930e9..6050556 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ဖုန်းအချက်အလက်"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"ဝန်ဆောင်မှုပေးသူက ပေးထားသည့် အချက်အလက်များ"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"အစပျိုးပေးသော ဖုန်းကုမ္ပဏီ ပံ့ပိုးမှု"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index dc6d224..ff5bd9c 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Telefoninformasjon"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informasjon om operatørhåndtering"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Utløs operatørhåndtering"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index acb6056..9b53399 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"फोनसम्बन्धी जानकारी"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"सेवा प्रदायकको प्रावधानसम्बन्धी जानकारी"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"सेवा प्रदायकको प्रावधानलाई ट्रिगर गर्नुहोस्"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 1013da8..849ddd6 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Telefooninformatie"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Gegevens voor providerregistratie"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Providerregistratie activeren"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index e0523e4..e8545da 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ଫୋନ୍ ସୂଚନା"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"ମୋବାଇଲ୍ କମ୍ପାନୀ ପ୍ରାବଧାନ ସୂଚନା"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"କେରିଅର୍ ପ୍ରୋଭିଜନିଂ ଟ୍ରିଗର୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 69da642..bcb1e5e 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ਫ਼ੋਨ ਜਾਣਕਾਰੀ"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"ਕੈਰੀਅਰ ਪ੍ਰੋਵਿਜ਼ਨਿੰਗ ਜਾਣਕਾਰੀ"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"ਕੈਰੀਅਰ ਪ੍ਰਵਿਜ਼ਨਿੰਗ ਨੂੰ ਟ੍ਰਿਗਰ ਕਰੋ"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 4abf1d4..69ef7e7 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -925,4 +925,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informacje o telefonie"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informacje o obsłudze administracyjnej operatora"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Uruchom obsługę administracyjną operatora"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index a3242ba..55deb95 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informações do telefone"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informações de fornecimento do operador"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Acionar fornecimento do operador"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 4b71e5b..9cafc46 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informações do telefone"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informações de provisionamento da operadora"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Acionar provisionamento da operadora"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Sugestão: melhore a conectividade Bluetooth"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Notificação sobre a qualidade da chamada"</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 559ee07..55bb13f 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -922,4 +922,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informații despre telefon"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informații despre provizionarea operatorului"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Declanșați provizionarea operatorului"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Sugestie: îmbunătățiți conectivitatea Bluetooth"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Notificare privind calitatea apelului"</string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 8e59241..b4e6da5 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -925,4 +925,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Информация о телефоне"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Сведения о синхронизации оператора"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Запустить синхронизацию оператора"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Рекомендация: повысьте качество связи по Bluetooth"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Уведомление о качестве связи"</string>
</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index afab89a..174fd1c 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"දුරකථන තොරතුරු"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"වාහක ප්රතිපාදන තතු"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"උත්ප්රේරක වාහක ප්රතිපාදන"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"යෝජනාව: බ්ලූටූත් සබැඳුම වැඩි දියුණු කිරීම"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"ඇමතුම් ගුණත්ව දැනුම්දීම"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index f667513..7ec8e2a 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -179,7 +179,7 @@
<string name="network_query_error" msgid="3862515805115145124">"Nepodarilo sa nájsť siete. Skúste to znova."</string>
<string name="register_on_network" msgid="4194770527833960423">"Prebieha registrácia v sieti <xliff:g id="NETWORK">%s</xliff:g>..."</string>
<string name="not_allowed" msgid="8541221928746104798">"Vaša SIM karta nepovoľuje pripojenie k tejto sieti."</string>
- <string name="connect_later" msgid="1950138106010005425">"V tejto chvíli sa nedá pripojiť k sieti. Skúste to znova neskôr."</string>
+ <string name="connect_later" msgid="1950138106010005425">"V tejto chvíli sa nedá pripojiť k sieti. Skúste to neskôr."</string>
<string name="registration_done" msgid="5337407023566953292">"Prihlásenie k sieti prebehlo úspešne."</string>
<string name="already_auto" msgid="8607068290733079336">"Už v automatickom výbere"</string>
<string name="select_automatically" msgid="779750291257872651">"Vybrať sieť automaticky"</string>
@@ -925,4 +925,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informácie o telefóne"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informácie o poskytovaní služieb operátorom"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Spustiť poskytovanie služieb operátorom"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index db13d74..5b88521 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -925,4 +925,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informacije o telefonu"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Podatki o omogočanju uporabe operaterja"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Sproži omogočanje uporabe operaterja"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Predlog: Izboljšajte povezavo Bluetooth."</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Obvestilo o kakovosti klica"</string>
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 412fac0..d4df8ac 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Informacioni i telefonit"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Informacionet e përgatitjes së operatorit celular"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Aktivizo përgatitjen e operatorit celular"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 70df76d..f242d5d 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -922,4 +922,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Информације о телефону"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Информације о додели мобилног оператера"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Покретање доделе мобилног оператера"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Предлог: побољшајте Bluetooth везу"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Обавештење о квалитету позива"</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 76d37f8..924e059 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Telefoninformation"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Information om operatörsadministration"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Aktivera operatörsadministration"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 28f2503..aca0c97 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Maelezo ya simu"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Maelezo ya Utaratibu wa Kutayarisha Mtandao"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Anzisha Utaratibu wa Kutayarisha Mtandao"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 29f191d..6e0bfc8 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"மொபைலின் தகவல்"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Carrier Provisioning Info"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Trigger Carrier Provisioning"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index b6996f7..ab25ada 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ఫోన్ సమాచారం"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"క్యారియర్ కేటాయింపు సమాచారం"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"క్యారియర్ కేటాయింపు సక్రియం చేయండి"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"సూచన: బ్లూటూత్ కనెక్టివిటీని మెరుగుపరచండి"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"కాల్ క్వాలిటీ నోటిఫికేషన్"</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 81d954f..5a4e293 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"ข้อมูลโทรศัพท์"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"ข้อมูลการจัดสรรผู้ให้บริการ"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"ทริกเกอร์การจัดสรรผู้ให้บริการ"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"คำแนะนำ: ปรับปรุงการเชื่อมต่อบลูทูธ"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"การแจ้งเตือนคุณภาพการโทร"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 805edce..0d266a4 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -314,7 +314,7 @@
<string name="throttle_current_usage" msgid="7483859109708658613">"Ginamit na data sa kasalukuyang panahon"</string>
<string name="throttle_time_frame" msgid="1813452485948918791">"Panahon ng paggamit ng data"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Patakaran ng rate ng data"</string>
- <string name="throttle_help" msgid="2624535757028809735">"Matuto nang higit pa"</string>
+ <string name="throttle_help" msgid="2624535757028809735">"Matuto pa"</string>
<string name="throttle_status_subtext" msgid="1110276415078236687">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) ng <xliff:g id="USED_2">%3$s</xliff:g> maximum na tagal ng panahon\nMagsisimula ang susunod na tagal ng panahon sa loob ng <xliff:g id="USED_3">%4$d</xliff:g> (na) araw (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
<string name="throttle_data_usage_subtext" msgid="3185429653996709840">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) ng <xliff:g id="USED_2">%3$s</xliff:g> maximum na period"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"Ang <xliff:g id="USED_0">%1$s</xliff:g> na maximum ay lumagpas sa\nBinabaan ang rate ng data sa <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Impormasyon ng telepono"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Impormasyon sa Provisioning ng Carrier"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"I-trigger ang Provisioning ng Carrier"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Suhestyon: Pahusayin ang connectivity ng Bluetooth"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Notification sa Kalidad ng Tawag"</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 1e2868c..c6ed1da 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Telefon bilgileri"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Operatör Temel Hazırlık Bilgileri"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Tetikleyici Operatör Temel Hazırlığı"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Öneri: Bluetooth bağlantısını iyileştirin"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Arama Kalitesiyle İlgili Bildirim"</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 54a2bc4..199fa35 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -925,4 +925,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Інформація про телефон"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Інформація про ініціалізацію оператора"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Запустити ініціалізацію оператора"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 1aa482d..7a92f14 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"فون کی معلومات"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"کیرئیر فراہمی معلومات"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"ٹرگر کیرئیر فراہمی"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"تجویز: بلوٹوتھ کنیکٹوٹی کو بہتر بنائیں"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"کال کی کوالٹی کی اطلاع"</string>
</resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index e18784a..b0b7d8c 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Telefon haqida"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Operator sinxronizatsiyasi haqida"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Operator sinxronizatsiyasini yoqish/o‘chirish"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Tavsiya: aloqa sifatini Bluetooth orqali oshiring"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Chaqiruv sifati haqida bildirishnoma"</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index a8a57ca..4616f08 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Thông tin điện thoại"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Thông tin cấp phép của nhà mạng"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Kích hoạt dịch vụ cấp phép của nhà mạng"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index a5562aa..2164961 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"手机信息"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"运营商配置信息"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"触发运营商配置"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"建议:改善蓝牙连接"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"通话质量通知"</string>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 10888de..c9c8f4f 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -919,4 +919,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"手機資訊"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"流動網絡供應商佈建資料"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"觸發流動網絡供應商佈建程序"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"建議:改善 Bluetooth 連線品質"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"通話品質通知"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index b41e1c5..65dacb4 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -919,4 +919,8 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"手機資訊"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"電信業者佈建資訊"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"觸發電信業者佈建程序"</string>
+ <!-- no translation found for call_quality_notification_bluetooth_details (219073466476340435) -->
+ <skip />
+ <!-- no translation found for call_quality_notification_name (3476828289553948830) -->
+ <skip />
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index eb0f2eb..dace3b1 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -921,4 +921,6 @@
<string name="phone_info_label" product="default" msgid="1784175881556791433">"Ulwazi lwefoni"</string>
<string name="carrier_provisioning" msgid="2668065041869578376">"Ulwazi lokuhlinzeka lenkampani yenethiwekhi"</string>
<string name="trigger_carrier_provisioning" msgid="1301829588620638234">"Cupha ukunikezwa kwenkampani yenethiwekhi"</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="219073466476340435">"Isiphakamiso: Thuthukisa uxhumo lwe-Bluetooth"</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Isaziso Sekhwalithi"</string>
</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index 5ade479..e6c578a 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -296,4 +296,14 @@
<item>250</item>
<item>350</item>
</integer-array>
+
+ <!-- String indicating the package name of the device GbaService implementation. -->
+ <string name="config_gba_package" translatable="false"/>
+ <!-- The interval to release/unbind GbaService after the authentication request
+ by millisecond. -1 - no release, 0 - release immediately,
+ positive n - release in n milliseconds -->
+ <integer name="config_gba_release_time">0</integer>
+
+ <!-- Whether or not to support RCS VoLTE single registration -->
+ <bool name="config_rcsVolteSingleRegistrationEnabled">true</bool>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 83a5673..1613ca8 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2172,4 +2172,12 @@
<string name="carrier_provisioning">Carrier Provisioning Info</string>
<!-- Trigger Carrier Provisioning [CHAR LIMIT=NONE] -->
<string name="trigger_carrier_provisioning">Trigger Carrier Provisioning</string>
+
+ <!-- details of the message popped up when there is
+ bad call quality caused by bluetooth connection-->
+ <string name="call_quality_notification_bluetooth_details">
+ Suggestion: Improve Bluetooth connectivity</string>
+ <!-- name of the notification that pops up during
+ a phone call when there is bad call quality -->
+ <string name="call_quality_notification_name">Call Quality Notification</string>
</resources>
diff --git a/sip/res/values-ne/strings.xml b/sip/res/values-ne/strings.xml
index 3b33681..9fc1263 100644
--- a/sip/res/values-ne/strings.xml
+++ b/sip/res/values-ne/strings.xml
@@ -45,7 +45,7 @@
<string name="registration_status_not_running" msgid="6236403137652262659">"खाता दर्ता गर्न विफल"</string>
<string name="registration_status_done" msgid="6787397199273357721">"कलहरू प्राप्त गर्दै।"</string>
<string name="registration_status_failed_try_later" msgid="7855389184910312091">"खाता दर्ता गर्न विफल: (<xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>); पछि प्रयास गर्नुहोस्"</string>
- <string name="registration_status_invalid_credentials" msgid="8896714049938660777">"खाता दर्ता प्रक्रिया असफल: गलत प्रयोगकर्ताको नाम वा पासवर्ड।"</string>
+ <string name="registration_status_invalid_credentials" msgid="8896714049938660777">"खाता दर्ता प्रक्रिया असफल: गलत युजरनेम वा पासवर्ड।"</string>
<string name="registration_status_server_unreachable" msgid="3832339558868965604">"खाता दर्ता गर्न असफल: सर्भरको नाम जाँच गर्नुहोस्।"</string>
<string name="third_party_account_summary" msgid="5918779106950859167">"<xliff:g id="ACCOUNT_OWNER">%s</xliff:g> अनुप्रयोगद्वारा यो खाता हाल प्रयोगमा छ।"</string>
<string name="sip_edit_title" msgid="7438891546610820307">"SIP खाता विवरणहरू"</string>
diff --git a/src/com/android/phone/ImsRcsController.java b/src/com/android/phone/ImsRcsController.java
index 52069b8..12c8cda 100644
--- a/src/com/android/phone/ImsRcsController.java
+++ b/src/com/android/phone/ImsRcsController.java
@@ -466,6 +466,24 @@
}
}
+ @Override
+ public void triggerNetworkRegistration(int subId, ISipDelegate connection, int sipCode,
+ String sipReason) {
+ enforceModifyPermission();
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ SipTransportController transport = getRcsFeatureController(subId).getFeature(
+ SipTransportController.class);
+ if (transport == null) {
+ return;
+ }
+ transport.triggerFullNetworkRegistration(subId, connection, sipCode, sipReason);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
/**
* Registers for updates to the RcsFeature connection through the IImsServiceFeatureCallback
* callback.
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index fe4a0ba..4fb61f0 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -19,6 +19,7 @@
import static android.Manifest.permission.READ_PHONE_STATE;
import android.annotation.Nullable;
+import android.app.BroadcastOptions;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -106,6 +107,12 @@
private static final String ACTION_MOBILE_NETWORK_LIST = "android.settings.MOBILE_NETWORK_LIST";
+ /**
+ * Grant recipients of new voicemail broadcasts a 10sec allowlist so they can start a background
+ * service to do VVM processing.
+ */
+ private final long VOICEMAIL_ALLOW_LIST_DURATION_MILLIS = 10000L;
+
/** The singleton NotificationMgr instance. */
private static NotificationMgr sInstance;
@@ -470,7 +477,10 @@
pendingIntent);
}
}
- mContext.sendBroadcastAsUser(intent, userHandle, READ_PHONE_STATE);
+
+ BroadcastOptions bopts = BroadcastOptions.makeBasic();
+ bopts.setTemporaryAppWhitelistDuration(VOICEMAIL_ALLOW_LIST_DURATION_MILLIS);
+ mContext.sendBroadcastAsUser(intent, userHandle, READ_PHONE_STATE, bopts.toBundle());
return true;
}
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 509aa57..3ad702a 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -360,6 +360,7 @@
defaultImsRcsPackage, PhoneFactory.getPhones().length,
new ImsFeatureBinderRepository());
mImsResolver.initialize();
+ RcsProvisioningMonitor.make(this);
}
// Start TelephonyDebugService After the default phone is created.
@@ -367,9 +368,6 @@
startService(intent);
mCM = CallManager.getInstance();
- for (Phone phone : PhoneFactory.getPhones()) {
- mCM.registerPhone(phone);
- }
// Create the NotificationMgr singleton, which is used to display
// status bar icons and control other status bar behavior.
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index ebea856..5abecd2 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -31,7 +31,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
-import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@@ -77,6 +76,7 @@
import android.telephony.CellInfoWcdma;
import android.telephony.ClientRequestStats;
import android.telephony.DataThrottlingRequest;
+import android.telephony.IBootstrapAuthenticationCallback;
import android.telephony.ICellInfoCallback;
import android.telephony.IccOpenLogicalChannelResponse;
import android.telephony.LocationAccessPolicy;
@@ -103,14 +103,18 @@
import android.telephony.VisualVoicemailSmsFilterSettings;
import android.telephony.data.ApnSetting;
import android.telephony.emergency.EmergencyNumber;
+import android.telephony.gba.GbaAuthRequest;
+import android.telephony.gba.UaSecurityProtocolIdentifier;
import android.telephony.ims.ImsException;
import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.RcsClientConfiguration;
import android.telephony.ims.RegistrationManager;
import android.telephony.ims.aidl.IImsCapabilityCallback;
import android.telephony.ims.aidl.IImsConfig;
import android.telephony.ims.aidl.IImsConfigCallback;
import android.telephony.ims.aidl.IImsRegistration;
import android.telephony.ims.aidl.IImsRegistrationCallback;
+import android.telephony.ims.aidl.IRcsConfigCallback;
import android.telephony.ims.feature.ImsFeature;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.feature.RcsFeature;
@@ -133,6 +137,7 @@
import com.android.internal.telephony.CommandException;
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.DefaultPhoneNotifier;
+import com.android.internal.telephony.GbaManager;
import com.android.internal.telephony.HalVersion;
import com.android.internal.telephony.IBooleanConsumer;
import com.android.internal.telephony.ICallForwardingInfoCallback;
@@ -2268,7 +2273,7 @@
mApp.getSystemService(AppOpsManager.class)
.checkPackage(Binder.getCallingUid(), callingPackage);
- final int targetSdk = getTargetSdk(callingPackage);
+ final int targetSdk = TelephonyPermissions.getTargetSdk(mApp, callingPackage);
if (targetSdk > android.os.Build.VERSION_CODES.R) {
// Callers targeting S have no business invoking this method.
return;
@@ -2703,30 +2708,11 @@
android.Manifest.permission.CONTROL_LOCATION_UPDATES, null);
}
- /**
- * Returns the target SDK version number for a given package name.
- *
- * This call MUST be invoked before clearing the calling UID.
- *
- * @return target SDK if the package is found or INT_MAX.
- */
- private int getTargetSdk(String packageName) {
- try {
- final ApplicationInfo ai = mApp.getPackageManager().getApplicationInfoAsUser(
- packageName, 0, UserHandle.getUserHandleForUid(Binder.getCallingUid()));
- if (ai != null) return ai.targetSdkVersion;
- } catch (PackageManager.NameNotFoundException unexpected) {
- loge("Failed to get package info for pkg="
- + packageName + ", uid=" + Binder.getCallingUid());
- }
- return Integer.MAX_VALUE;
- }
-
@Override
@SuppressWarnings("unchecked")
public List<NeighboringCellInfo> getNeighboringCellInfo(String callingPackage,
String callingFeatureId) {
- final int targetSdk = getTargetSdk(callingPackage);
+ final int targetSdk = TelephonyPermissions.getTargetSdk(mApp, callingPackage);
if (targetSdk >= android.os.Build.VERSION_CODES.Q) {
throw new SecurityException(
"getNeighboringCellInfo() is unavailable to callers targeting Q+ SDK levels.");
@@ -2785,7 +2771,7 @@
return new ArrayList<>();
}
- final int targetSdk = getTargetSdk(callingPackage);
+ final int targetSdk = TelephonyPermissions.getTargetSdk(mApp, callingPackage);
if (targetSdk >= android.os.Build.VERSION_CODES.Q) {
return getCachedCellInfo();
}
@@ -2838,13 +2824,15 @@
.build());
switch (locationResult) {
case DENIED_HARD:
- if (getTargetSdk(callingPackage) < Build.VERSION_CODES.Q) {
+ if (TelephonyPermissions
+ .getTargetSdk(mApp, callingPackage) < Build.VERSION_CODES.Q) {
// Safetynet logging for b/154934934
EventLog.writeEvent(0x534e4554, "154934934", Binder.getCallingUid());
}
throw new SecurityException("Not allowed to access cell info");
case DENIED_SOFT:
- if (getTargetSdk(callingPackage) < Build.VERSION_CODES.Q) {
+ if (TelephonyPermissions
+ .getTargetSdk(mApp, callingPackage) < Build.VERSION_CODES.Q) {
// Safetynet logging for b/154934934
EventLog.writeEvent(0x534e4554, "154934934", Binder.getCallingUid());
}
@@ -4569,7 +4557,7 @@
@Override
public int getNetworkTypeForSubscriber(int subId, String callingPackage,
String callingFeatureId) {
- final int targetSdk = getTargetSdk(callingPackage);
+ final int targetSdk = TelephonyPermissions.getTargetSdk(mApp, callingPackage);
if (targetSdk > android.os.Build.VERSION_CODES.Q) {
return getDataNetworkTypeForSubscriber(subId, callingPackage, callingFeatureId);
} else if (targetSdk == android.os.Build.VERSION_CODES.Q
@@ -9120,15 +9108,19 @@
isCompressed) {
TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
mApp, subId, "notifyRcsAutoConfigurationReceived");
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
+ }
+ if (!isImsAvailableOnDevice()) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "IMS not available on device.");
+ }
+
+ final long identity = Binder.clearCallingIdentity();
try {
- IImsConfig configBinder = getImsConfig(getSlotIndex(subId), ImsFeature.FEATURE_RCS);
- if (configBinder == null) {
- Rlog.e(LOG_TAG, "null result for getImsConfig");
- } else {
- configBinder.notifyRcsAutoConfigurationReceived(config, isCompressed);
- }
- } catch (RemoteException e) {
- Rlog.e(LOG_TAG, "fail to getImsConfig " + e.getMessage());
+ RcsProvisioningMonitor.getInstance().updateConfig(subId, config, isCompressed);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
}
@@ -9292,6 +9284,44 @@
}
}
+ @Override
+ public void bootstrapAuthenticationRequest(int subId, int appType, Uri nafUrl,
+ UaSecurityProtocolIdentifier securityProtocol,
+ boolean forceBootStrapping, IBootstrapAuthenticationCallback callback)
+ throws RemoteException {
+ enforceModifyPermission();
+ if (DBG) {
+ log("bootstrapAuthenticationRequest, subId:" + subId + ", appType:"
+ + appType + ", NAF:" + nafUrl + ", sp:" + securityProtocol
+ + ", forceBootStrapping:" + forceBootStrapping + ", callback:" + callback);
+ }
+
+ if (!SubscriptionManager.isValidSubscriptionId(subId)
+ || appType < TelephonyManager.APPTYPE_UNKNOWN
+ || appType > TelephonyManager.APPTYPE_ISIM
+ || nafUrl == null || securityProtocol == null || callback == null) {
+ Log.d(LOG_TAG, "bootstrapAuthenticationRequest failed due to invalid parameters");
+ if (callback != null) {
+ try {
+ callback.onAuthenticationFailure(
+ 0, TelephonyManager.GBA_FAILURE_REASON_FEATURE_NOT_SUPPORTED);
+ } catch (RemoteException exception) {
+ log("Fail to notify onAuthenticationFailure due to " + exception);
+ }
+ return;
+ }
+ }
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ getGbaManager(subId).bootstrapAuthenticationRequest(
+ new GbaAuthRequest(subId, appType, nafUrl, securityProtocol.toByteArray(),
+ forceBootStrapping, callback));
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
/**
* Attempts to set the radio power state for thermal reason. This does not guarantee that the
* requested radio power state will actually be set. See {@link
@@ -9444,4 +9474,268 @@
return thermalMitigationResult;
}
+
+ /**
+ * Set the GbaService Package Name that Telephony will bind to.
+ *
+ * @param subId The sim that the GbaService is associated with.
+ * @param packageName The name of the package to be replaced with.
+ * @return true if setting the GbaService to bind to succeeded, false if it did not.
+ */
+ @Override
+ public boolean setBoundGbaServiceOverride(int subId, String packageName) {
+ enforceModifyPermission();
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return getGbaManager(subId).overrideServicePackage(packageName);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Return the package name of the currently bound GbaService.
+ *
+ * @param subId The sim that the GbaService is associated with.
+ * @return the package name of the GbaService configuration, null if GBA is not supported.
+ */
+ @Override
+ public String getBoundGbaService(int subId) {
+ enforceReadPrivilegedPermission("getBoundGbaServicePackage");
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return getGbaManager(subId).getServicePackage();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Set the release time for telephony to unbind GbaService.
+ *
+ * @param subId The sim that the GbaService is associated with.
+ * @param interval The release time to unbind GbaService by millisecond.
+ * @return true if setting the GbaService to bind to succeeded, false if it did not.
+ */
+ @Override
+ public boolean setGbaReleaseTimeOverride(int subId, int interval) {
+ enforceModifyPermission();
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return getGbaManager(subId).overrideReleaseTime(interval);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Return the release time for telephony to unbind GbaService.
+ *
+ * @param subId The sim that the GbaService is associated with.
+ * @return The release time to unbind GbaService by millisecond.
+ */
+ @Override
+ public int getGbaReleaseTime(int subId) {
+ enforceReadPrivilegedPermission("getGbaReleaseTime");
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return getGbaManager(subId).getReleaseTime();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ private GbaManager getGbaManager(int subId) {
+ GbaManager instance = GbaManager.getInstance(subId);
+ if (instance == null) {
+ String packageName = mApp.getResources().getString(R.string.config_gba_package);
+ int releaseTime = mApp.getResources().getInteger(R.integer.config_gba_release_time);
+ instance = GbaManager.make(mApp, subId, packageName, releaseTime);
+ }
+ return instance;
+ }
+
+ /**
+ * indicate whether the device and the carrier can support
+ * RCS VoLTE single registration.
+ */
+ @Override
+ public boolean isRcsVolteSingleRegistrationCapable(int subId) {
+ enforceReadPrivilegedPermission("isRcsVolteSingleRegistrationCapable");
+
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
+ }
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ RcsProvisioningMonitor rpm = RcsProvisioningMonitor.getInstance();
+ if (rpm != null) {
+ return rpm.isRcsVolteSingleRegistrationEnabled(subId);
+ }
+ return false;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Register RCS provisioning callback.
+ */
+ @Override
+ public void registerRcsProvisioningChangedCallback(int subId,
+ IRcsConfigCallback callback) {
+ enforceReadPrivilegedPermission("registerRcsProvisioningChangedCallback");
+
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
+ }
+ if (!isImsAvailableOnDevice()) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "IMS not available on device.");
+ }
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ ImsManager.getInstance(mApp, getSlotIndexOrException(subId))
+ .addRcsProvisioningCallbackForSubscription(callback, subId);
+ } catch (ImsException e) {
+ throw new ServiceSpecificException(e.getCode());
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Unregister RCS provisioning callback.
+ */
+ @Override
+ public void unregisterRcsProvisioningChangedCallback(int subId,
+ IRcsConfigCallback callback) {
+ enforceReadPrivilegedPermission("unregisterRcsProvisioningChangedCallback");
+
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
+ }
+ if (!isImsAvailableOnDevice()) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "IMS not available on device.");
+ }
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ ImsManager.getInstance(mApp, getSlotIndexOrException(subId))
+ .removeRcsProvisioningCallbackForSubscription(callback, subId);
+ } catch (ImsException e) {
+ Log.i(LOG_TAG, "unregisterRcsProvisioningChangedCallback: " + subId
+ + "is inactive, ignoring unregister.");
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * trigger RCS reconfiguration.
+ */
+ public void triggerRcsReconfiguration(int subId) {
+ TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+ mApp, subId, "triggerRcsReconfiguration");
+
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
+ }
+ if (!isImsAvailableOnDevice()) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "IMS not available on device.");
+ }
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ RcsProvisioningMonitor.getInstance().requestReconfig(subId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Provide the client configuration parameters of the RCS application.
+ */
+ public void setRcsClientConfiguration(int subId, RcsClientConfiguration rcc) {
+ TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+ mApp, subId, "setRcsClientConfiguration");
+
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
+ }
+ if (!isImsAvailableOnDevice()) {
+ throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+ "IMS not available on device.");
+ }
+
+ final long identity = Binder.clearCallingIdentity();
+
+ try {
+ IImsConfig configBinder = getImsConfig(getSlotIndex(subId), ImsFeature.FEATURE_RCS);
+ if (configBinder == null) {
+ Rlog.e(LOG_TAG, "null result for setRcsClientConfiguration");
+ } else {
+ configBinder.setRcsClientConfiguration(rcc);
+ }
+ } catch (RemoteException e) {
+ Rlog.e(LOG_TAG, "fail to setRcsClientConfiguration " + e.getMessage());
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Overrides the config of RCS VoLTE single registration enabled for the device.
+ */
+ @Override
+ public void setDeviceSingleRegistrationEnabledOverride(String enabledStr) {
+ TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(),
+ "setDeviceSingleRegistrationEnabledOverride");
+ enforceModifyPermission();
+
+ Boolean enabled = "NULL".equalsIgnoreCase(enabledStr) ? null
+ : Boolean.parseBoolean(enabledStr);
+ RcsProvisioningMonitor.getInstance().overrideDeviceSingleRegistrationEnabled(enabled);
+ }
+
+ /**
+ * Gets the config of RCS VoLTE single registration enabled for the device.
+ */
+ @Override
+ public boolean getDeviceSingleRegistrationEnabled() {
+ enforceReadPrivilegedPermission("getDeviceSingleRegistrationEnabled");
+ return RcsProvisioningMonitor.getInstance().getDeviceSingleRegistrationEnabled();
+ }
+
+ /**
+ * Overrides the config of RCS VoLTE single registration enabled for the carrier/subscription.
+ */
+ @Override
+ public boolean setCarrierSingleRegistrationEnabledOverride(int subId, String enabledStr) {
+ TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(),
+ "setCarrierSingleRegistrationEnabledOverride");
+ enforceModifyPermission();
+
+ Boolean enabled = "NULL".equalsIgnoreCase(enabledStr) ? null
+ : Boolean.parseBoolean(enabledStr);
+ return RcsProvisioningMonitor.getInstance().overrideCarrierSingleRegistrationEnabled(
+ subId, enabled);
+ }
+
+ /**
+ * Gets the config of RCS VoLTE single registration enabled for the carrier/subscription.
+ */
+ @Override
+ public boolean getCarrierSingleRegistrationEnabled(int subId) {
+ enforceReadPrivilegedPermission("getCarrierSingleRegistrationEnabled");
+ return RcsProvisioningMonitor.getInstance().getCarrierSingleRegistrationEnabled(subId);
+ }
}
diff --git a/src/com/android/phone/RcsProvisioningMonitor.java b/src/com/android/phone/RcsProvisioningMonitor.java
new file mode 100644
index 0000000..8e4d35e
--- /dev/null
+++ b/src/com/android/phone/RcsProvisioningMonitor.java
@@ -0,0 +1,514 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import android.app.role.OnRoleHoldersChangedListener;
+import android.app.role.RoleManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Build;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.PersistableBundle;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyRegistryManager;
+import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.RcsConfig;
+import android.telephony.ims.aidl.IImsConfig;
+import android.telephony.ims.feature.ImsFeature;
+import android.text.TextUtils;
+
+import com.android.ims.ImsManager;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.CollectionUtils;
+import com.android.telephony.Rlog;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Class to monitor RCS Provisioning Status
+ */
+public class RcsProvisioningMonitor {
+ private static final String TAG = "RcsProvisioningMonitor";
+ private static final boolean DBG = Build.IS_ENG;
+
+ private static final int EVENT_SUB_CHANGED = 1;
+ private static final int EVENT_DMA_CHANGED = 2;
+ private static final int EVENT_CC_CHANGED = 3;
+ private static final int EVENT_CONFIG_RECEIVED = 4;
+ private static final int EVENT_RECONFIG_REQUEST = 5;
+ private static final int EVENT_DEVICE_CONFIG_OVERRIDE = 6;
+ private static final int EVENT_CARRIER_CONFIG_OVERRIDE = 7;
+
+ private final PhoneGlobals mPhone;
+ private final Handler mHandler;
+ //cache the rcs config per sub id
+ private final Map<Integer, byte[]> mConfigs = Collections.synchronizedMap(new HashMap<>());
+ //cache the single registration config per sub id
+ private final ConcurrentHashMap<Integer, Integer> mSingleRegistrations =
+ new ConcurrentHashMap<>();
+ private Boolean mDeviceSingleRegistrationEnabledOverride;
+ private final HashMap<Integer, Boolean> mCarrierSingleRegistrationEnabledOverride =
+ new HashMap<>();
+ private String mDmaPackageName;
+
+ private final CarrierConfigManager mCarrierConfigManager;
+ private final DmaChangedListener mDmaChangedListener;
+ private final SubscriptionManager mSubscriptionManager;
+ private final TelephonyRegistryManager mTelephonyRegistryManager;
+
+ private static RcsProvisioningMonitor sInstance;
+
+ private final SubscriptionManager.OnSubscriptionsChangedListener mSubChangedListener =
+ new SubscriptionManager.OnSubscriptionsChangedListener() {
+ @Override
+ public void onSubscriptionsChanged() {
+ if (!mHandler.hasMessages(EVENT_SUB_CHANGED)) {
+ mHandler.sendEmptyMessage(EVENT_SUB_CHANGED);
+ }
+ }
+ };
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED.equals(
+ intent.getAction())) {
+ int subId = intent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX,
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ logv("Carrier-config changed for sub : " + subId);
+ if (SubscriptionManager.isValidSubscriptionId(subId)
+ && !mHandler.hasMessages(EVENT_CC_CHANGED)) {
+ mHandler.sendEmptyMessage(EVENT_CC_CHANGED);
+ }
+ }
+ }
+ };
+
+ private final class DmaChangedListener implements OnRoleHoldersChangedListener {
+ private RoleManager mRoleManager;
+
+ @Override
+ 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);
+ }
+ }
+
+ public void register() {
+ mRoleManager = mPhone.getSystemService(RoleManager.class);
+ if (mRoleManager != null) {
+ try {
+ mRoleManager.addOnRoleHoldersChangedListenerAsUser(
+ mPhone.getMainExecutor(), this, UserHandle.SYSTEM);
+ } catch (RuntimeException e) {
+ loge("Could not register dma change listener due to " + e);
+ }
+ }
+ }
+
+ public void unregister() {
+ if (mRoleManager != null) {
+ try {
+ mRoleManager.removeOnRoleHoldersChangedListenerAsUser(this, UserHandle.SYSTEM);
+ } catch (RuntimeException e) {
+ loge("Could not unregister dma change listener due to " + e);
+ }
+ }
+ }
+ }
+
+ private final class MyHandler extends Handler {
+ MyHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case EVENT_SUB_CHANGED:
+ onSubChanged();
+ break;
+ case EVENT_DMA_CHANGED:
+ onDefaultMessagingApplicationChanged();
+ break;
+ case EVENT_CC_CHANGED:
+ onCarrierConfigChange();
+ break;
+ case EVENT_CONFIG_RECEIVED:
+ onConfigReceived(msg.arg1, (byte[]) msg.obj, msg.arg2 == 1);
+ break;
+ case EVENT_RECONFIG_REQUEST:
+ onReconfigRequest(msg.arg1);
+ break;
+ case EVENT_DEVICE_CONFIG_OVERRIDE:
+ Boolean deviceEnabled = (Boolean) msg.obj;
+ if (!booleanEquals(deviceEnabled, mDeviceSingleRegistrationEnabledOverride)) {
+ mDeviceSingleRegistrationEnabledOverride = deviceEnabled;
+ onCarrierConfigChange();
+ }
+ break;
+ case EVENT_CARRIER_CONFIG_OVERRIDE:
+ Boolean carrierEnabledOverride = (Boolean) msg.obj;
+ Boolean carrierEnabled = mCarrierSingleRegistrationEnabledOverride.put(
+ msg.arg1, carrierEnabledOverride);
+ if (!booleanEquals(carrierEnabledOverride, carrierEnabled)) {
+ onCarrierConfigChange();
+ }
+ break;
+ default:
+ loge("Unhandled event " + msg.what);
+ }
+ }
+ }
+
+ @VisibleForTesting
+ public RcsProvisioningMonitor(PhoneGlobals app, Looper looper) {
+ mPhone = app;
+ mHandler = new MyHandler(looper);
+ mCarrierConfigManager = mPhone.getSystemService(CarrierConfigManager.class);
+ mSubscriptionManager = mPhone.getSystemService(SubscriptionManager.class);
+ mTelephonyRegistryManager = mPhone.getSystemService(TelephonyRegistryManager.class);
+ mDmaPackageName = getDmaPackageName();
+ logv("DMA is " + mDmaPackageName);
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
+ mPhone.registerReceiver(mReceiver, filter);
+ mTelephonyRegistryManager.addOnSubscriptionsChangedListener(
+ mSubChangedListener, mSubChangedListener.getHandlerExecutor());
+ mDmaChangedListener = new DmaChangedListener();
+ mDmaChangedListener.register();
+ //initialize configs for all active sub
+ onSubChanged();
+ }
+
+ /**
+ * create an instance
+ */
+ public static RcsProvisioningMonitor make(PhoneGlobals app) {
+ if (sInstance == null) {
+ logd("RcsProvisioningMonitor created.");
+ HandlerThread handlerThread = new HandlerThread(TAG);
+ handlerThread.start();
+ sInstance = new RcsProvisioningMonitor(app, handlerThread.getLooper());
+ }
+ return sInstance;
+ }
+
+ /**
+ * get the instance
+ */
+ public static RcsProvisioningMonitor getInstance() {
+ return sInstance;
+ }
+
+ /**
+ * destroy the instance
+ */
+ @VisibleForTesting
+ public void destroy() {
+ logd("destroy it.");
+ mDmaChangedListener.unregister();
+ mTelephonyRegistryManager.removeOnSubscriptionsChangedListener(mSubChangedListener);
+ mPhone.unregisterReceiver(mReceiver);
+ mHandler.getLooper().quit();
+ }
+
+ /**
+ * get the handler
+ */
+ @VisibleForTesting
+ public Handler getHandler() {
+ return mHandler;
+ }
+
+ /**
+ * Gets the config for a subscription
+ */
+ @VisibleForTesting
+ public byte[] getConfig(int subId) {
+ return mConfigs.get(subId);
+ }
+
+ /**
+ * Returns whether Rcs Volte single registration is enabled for the sub.
+ */
+ public boolean isRcsVolteSingleRegistrationEnabled(int subId) {
+ if (mSingleRegistrations.containsKey(subId)) {
+ return mSingleRegistrations.get(subId) == ProvisioningManager.STATUS_CAPABLE;
+ }
+ return false;
+ }
+
+ /**
+ * Called when the new rcs config is received
+ */
+ public void updateConfig(int subId, byte[] config, boolean isCompressed) {
+ mHandler.sendMessage(mHandler.obtainMessage(
+ EVENT_CONFIG_RECEIVED, subId, isCompressed ? 1 : 0, config));
+ }
+
+ /**
+ * Called when the application needs rcs re-config
+ */
+ public void requestReconfig(int subId) {
+ mHandler.sendMessage(mHandler.obtainMessage(EVENT_RECONFIG_REQUEST, subId, 0));
+ }
+
+ /**
+ * override the device config whether single registration is enabled
+ */
+ public void overrideDeviceSingleRegistrationEnabled(Boolean enabled) {
+ mHandler.sendMessage(mHandler.obtainMessage(EVENT_DEVICE_CONFIG_OVERRIDE, enabled));
+ }
+
+ /**
+ * Overrides the carrier config whether single registration is enabled
+ */
+ public boolean overrideCarrierSingleRegistrationEnabled(int subId, Boolean enabled) {
+ if (!mSingleRegistrations.containsKey(subId)) {
+ return false;
+ }
+ mHandler.sendMessage(mHandler.obtainMessage(
+ EVENT_CARRIER_CONFIG_OVERRIDE, subId, 0, enabled));
+ return true;
+ }
+
+ /**
+ * Returns the device config whether single registration is enabled
+ */
+ public boolean getDeviceSingleRegistrationEnabled() {
+ for (int val : mSingleRegistrations.values()) {
+ return (val & ProvisioningManager.STATUS_DEVICE_NOT_CAPABLE) == 0;
+ }
+ return false;
+ }
+
+ /**
+ * Returns the carrier config whether single registration is enabled
+ */
+ public boolean getCarrierSingleRegistrationEnabled(int subId) {
+ if (mSingleRegistrations.containsKey(subId)) {
+ return (mSingleRegistrations.get(subId)
+ & ProvisioningManager.STATUS_CARRIER_NOT_CAPABLE) == 0;
+ }
+ return false;
+ }
+
+ private void onDefaultMessagingApplicationChanged() {
+ final String packageName = getDmaPackageName();
+ if (!TextUtils.equals(mDmaPackageName, packageName)) {
+ //clear old callbacks
+ ImsManager.getInstance(mPhone, mPhone.getPhone().getPhoneId())
+ .clearRcsProvisioningCallbacks();
+ mDmaPackageName = packageName;
+ logv("new default messaging application " + mDmaPackageName);
+ mConfigs.forEach((k, v) -> {
+ if (isAcsUsed(k)) {
+ logv("acs used, trigger to re-configure.");
+ notifyRcsAutoConfigurationRemoved(k);
+ triggerRcsReconfiguration(k);
+ } else {
+ logv("acs not used, notify.");
+ notifyRcsAutoConfigurationReceived(k, v, false);
+ }
+ });
+ }
+ }
+
+ private void notifyRcsAutoConfigurationReceived(int subId, byte[] config,
+ boolean isCompressed) {
+ IImsConfig imsConfig = getIImsConfig(subId, ImsFeature.FEATURE_RCS);
+ if (imsConfig != null) {
+ try {
+ imsConfig.notifyRcsAutoConfigurationReceived(config, isCompressed);
+ } catch (RemoteException e) {
+ loge("fail to notify rcs configuration received!");
+ }
+ } else {
+ logd("getIImsConfig returns null.");
+ }
+ }
+
+ private void notifyRcsAutoConfigurationRemoved(int subId) {
+ IImsConfig imsConfig = getIImsConfig(subId, ImsFeature.FEATURE_RCS);
+ if (imsConfig != null) {
+ try {
+ imsConfig.notifyRcsAutoConfigurationRemoved();
+ } catch (RemoteException e) {
+ loge("fail to notify rcs configuration removed!");
+ }
+ } else {
+ logd("getIImsConfig returns null.");
+ }
+ }
+
+ private void triggerRcsReconfiguration(int subId) {
+ IImsConfig imsConfig = getIImsConfig(subId, ImsFeature.FEATURE_RCS);
+ if (imsConfig != null) {
+ try {
+ imsConfig.triggerRcsReconfiguration();
+ } catch (RemoteException e) {
+ loge("fail to trigger rcs reconfiguration!");
+ }
+ } else {
+ logd("getIImsConfig returns null.");
+ }
+ }
+
+ private boolean isAcsUsed(int subId) {
+ PersistableBundle b = mCarrierConfigManager.getConfigForSubId(subId);
+ if (b == null) {
+ return false;
+ }
+ return b.getBoolean(CarrierConfigManager.KEY_USE_ACS_FOR_RCS_BOOL);
+ }
+
+ private boolean isSingleRegistrationRequiredByCarrier(int subId) {
+ Boolean enabledByOverride = mCarrierSingleRegistrationEnabledOverride.get(subId);
+ if (enabledByOverride != null) {
+ return enabledByOverride;
+ }
+
+ PersistableBundle b = mCarrierConfigManager.getConfigForSubId(subId);
+ if (b == null) {
+ return false;
+ }
+ return b.getBoolean(CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL);
+ }
+
+ private int getSingleRegistrationCapableValue(int subId) {
+ boolean isSingleRegistrationEnabledOnDevice =
+ mDeviceSingleRegistrationEnabledOverride != null
+ ? mDeviceSingleRegistrationEnabledOverride
+ : mPhone.getResources().getBoolean(R.bool.config_rcsVolteSingleRegistrationEnabled);
+
+ int value = (isSingleRegistrationEnabledOnDevice ? 0
+ : ProvisioningManager.STATUS_DEVICE_NOT_CAPABLE) | (
+ isSingleRegistrationRequiredByCarrier(subId) ? 0
+ : ProvisioningManager.STATUS_CARRIER_NOT_CAPABLE);
+ logv("SingleRegistrationCapableValue : " + value);
+ return value;
+ }
+
+ private void onCarrierConfigChange() {
+ logv("onCarrierConfigChange");
+ mConfigs.forEach((subId, config) -> {
+ int value = getSingleRegistrationCapableValue(subId);
+ if (value != mSingleRegistrations.get(subId)) {
+ mSingleRegistrations.put(subId, value);
+ notifyDmaForSub(subId);
+ }
+ });
+ }
+
+ private void onSubChanged() {
+ final int[] activeSubs = mSubscriptionManager.getActiveSubscriptionIdList();
+ final HashSet<Integer> subsToBeDeactivated = new HashSet<>(mConfigs.keySet());
+
+ for (int i : activeSubs) {
+ subsToBeDeactivated.remove(i);
+ if (!mConfigs.containsKey(i)) {
+ byte[] data = RcsConfig.loadRcsConfigForSub(mPhone, i, false);
+ logv("new config is created for sub : " + i);
+ mConfigs.put(i, data);
+ notifyRcsAutoConfigurationReceived(i, data, false);
+ mSingleRegistrations.put(i, getSingleRegistrationCapableValue(i));
+ notifyDmaForSub(i);
+ }
+ }
+
+ subsToBeDeactivated.forEach(i -> {
+ mConfigs.remove(i);
+ notifyRcsAutoConfigurationRemoved(i);
+ });
+ }
+
+ private void onConfigReceived(int subId, byte[] config, boolean isCompressed) {
+ logv("onConfigReceived, subId:" + subId + ", config:"
+ + config + ", isCompressed:" + isCompressed);
+ mConfigs.put(subId, isCompressed ? RcsConfig.decompressGzip(config) : config);
+ RcsConfig.updateConfigForSub(mPhone, subId, config, isCompressed);
+ notifyRcsAutoConfigurationReceived(subId, config, isCompressed);
+ }
+
+ private void onReconfigRequest(int subId) {
+ logv("onReconfigRequest, subId:" + subId);
+ mConfigs.remove(subId);
+ RcsConfig.updateConfigForSub(mPhone, subId, null, true);
+ notifyRcsAutoConfigurationRemoved(subId);
+ triggerRcsReconfiguration(subId);
+ }
+
+ private void notifyDmaForSub(int subId) {
+ final Intent intent = new Intent(
+ ProvisioningManager.ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE);
+ intent.setPackage(mDmaPackageName);
+ intent.putExtra(ProvisioningManager.EXTRA_SUBSCRIPTION_ID, subId);
+ intent.putExtra(ProvisioningManager.EXTRA_STATUS, mSingleRegistrations.get(subId));
+ logv("notify " + intent);
+ mPhone.sendBroadcast(intent);
+ }
+
+ private IImsConfig getIImsConfig(int subId, int feature) {
+ return mPhone.getImsResolver().getImsConfig(
+ SubscriptionManager.getSlotIndex(subId), feature);
+ }
+
+ private String getDmaPackageName() {
+ try {
+ return CollectionUtils.firstOrNull(mPhone.getSystemService(RoleManager.class)
+ .getRoleHolders(RoleManager.ROLE_SMS));
+ } catch (RuntimeException e) {
+ loge("Could not get dma name due to " + e);
+ return null;
+ }
+ }
+
+ private static boolean booleanEquals(Boolean val1, Boolean val2) {
+ return (val1 == null && val2 == null)
+ || (Boolean.TRUE.equals(val1) && Boolean.TRUE.equals(val2))
+ || (Boolean.FALSE.equals(val1) && Boolean.FALSE.equals(val2));
+ }
+
+ private static void logv(String msg) {
+ if (DBG) {
+ Rlog.d(TAG, msg);
+ }
+ }
+
+ private static void logd(String msg) {
+ Rlog.d(TAG, msg);
+ }
+
+ private static void loge(String msg) {
+ Rlog.e(TAG, msg);
+ }
+}
diff --git a/src/com/android/phone/TelephonyShellCommand.java b/src/com/android/phone/TelephonyShellCommand.java
index 33d0721..ed719b6 100644
--- a/src/com/android/phone/TelephonyShellCommand.java
+++ b/src/com/android/phone/TelephonyShellCommand.java
@@ -81,6 +81,18 @@
private static final String CC_SET_VALUE = "set-value";
private static final String CC_CLEAR_VALUES = "clear-values";
+ private static final String GBA_SUBCOMMAND = "gba";
+ private static final String GBA_SET_SERVICE = "set-service";
+ private static final String GBA_GET_SERVICE = "get-service";
+ private static final String GBA_SET_RELEASE_TIME = "set-release";
+ private static final String GBA_GET_RELEASE_TIME = "get-release";
+
+ private static final String SINGLE_REGISTATION_CONFIG = "src";
+ private static final String SRC_SET_DEVICE_ENABLED = "set-device-enabled";
+ private static final String SRC_GET_DEVICE_ENABLED = "get-device-enabled";
+ private static final String SRC_SET_CARRIER_ENABLED = "set-carrier-enabled";
+ private static final String SRC_GET_CARRIER_ENABLED = "get-carrier-enabled";
+
// Take advantage of existing methods that already contain permissions checks when possible.
private final ITelephony mInterface;
@@ -161,6 +173,10 @@
return handleDataTestModeCommand();
case END_BLOCK_SUPPRESSION:
return handleEndBlockSuppressionCommand();
+ case GBA_SUBCOMMAND:
+ return handleGbaCommand();
+ case SINGLE_REGISTATION_CONFIG:
+ return handleSingleRegistrationConfigCommand();
default: {
return handleDefaultCommands(cmd);
}
@@ -183,11 +199,17 @@
pw.println(" Data Test Mode Commands.");
pw.println(" cc");
pw.println(" Carrier Config Commands.");
+ pw.println(" gba");
+ pw.println(" GBA Commands.");
+ pw.println(" src");
+ pw.println(" RCS VoLTE Single Registration Config Commands.");
onHelpIms();
onHelpEmergencyNumber();
onHelpEndBlockSupperssion();
onHelpDataTestMode();
onHelpCc();
+ onHelpGba();
+ onHelpSrc();
}
private void onHelpIms() {
@@ -293,6 +315,53 @@
pw.println(" is specified, it will choose the default voice SIM slot.");
}
+ private void onHelpGba() {
+ PrintWriter pw = getOutPrintWriter();
+ pw.println("Gba Commands:");
+ pw.println(" gba set-service [-s SLOT_ID] PACKAGE_NAME");
+ pw.println(" Sets the GbaService defined in PACKAGE_NAME to to be the bound.");
+ pw.println(" Options are:");
+ pw.println(" -s: The SIM slot ID to read carrier config value for. If no option");
+ pw.println(" is specified, it will choose the default voice SIM slot.");
+ pw.println(" gba get-service [-s SLOT_ID]");
+ pw.println(" Gets the package name of the currently defined GbaService.");
+ pw.println(" Options are:");
+ pw.println(" -s: The SIM slot ID to read carrier config value for. If no option");
+ pw.println(" is specified, it will choose the default voice SIM slot.");
+ pw.println(" gba set-release [-s SLOT_ID] n");
+ pw.println(" Sets the time to release/unbind GbaService in n milli-second.");
+ pw.println(" Do not release/unbind if n is -1.");
+ pw.println(" Options are:");
+ pw.println(" -s: The SIM slot ID to read carrier config value for. If no option");
+ pw.println(" is specified, it will choose the default voice SIM slot.");
+ pw.println(" gba get-release [-s SLOT_ID]");
+ pw.println(" Gets the time to release/unbind GbaService in n milli-sencond.");
+ pw.println(" Options are:");
+ pw.println(" -s: The SIM slot ID to read carrier config value for. If no option");
+ pw.println(" is specified, it will choose the default voice SIM slot.");
+ }
+
+ private void onHelpSrc() {
+ PrintWriter pw = getOutPrintWriter();
+ pw.println("RCS VoLTE Single Registration Config Commands:");
+ pw.println(" src set-device-enabled true|false|null");
+ pw.println(" Sets the device config for RCS VoLTE single registration to the value.");
+ pw.println(" The value could be true, false, or null(undefined).");
+ pw.println(" src get-device-enabled");
+ pw.println(" Gets the device config for RCS VoLTE single registration.");
+ pw.println(" src set-carrier-enabled [-s SLOT_ID] true|false|null");
+ pw.println(" Sets the carrier config for RCS VoLTE single registration to the value.");
+ pw.println(" The value could be true, false, or null(undefined).");
+ pw.println(" Options are:");
+ pw.println(" -s: The SIM slot ID to set the config value for. If no option");
+ pw.println(" is specified, it will choose the default voice SIM slot.");
+ pw.println(" src get-carrier-enabled [-s SLOT_ID]");
+ pw.println(" Gets the carrier config for RCS VoLTE single registration.");
+ pw.println(" Options are:");
+ pw.println(" -s: The SIM slot ID to read the config value for. If no option");
+ pw.println(" is specified, it will choose the default voice SIM slot.");
+ }
+
private int handleImsCommand() {
String arg = getNextArg();
if (arg == null) {
@@ -1246,4 +1315,247 @@
}
return 0;
}
+
+ private int handleGbaCommand() {
+ String arg = getNextArg();
+ if (arg == null) {
+ onHelpGba();
+ return 0;
+ }
+
+ switch (arg) {
+ case GBA_SET_SERVICE: {
+ return handleGbaSetServiceCommand();
+ }
+ case GBA_GET_SERVICE: {
+ return handleGbaGetServiceCommand();
+ }
+ case GBA_SET_RELEASE_TIME: {
+ return handleGbaSetReleaseCommand();
+ }
+ case GBA_GET_RELEASE_TIME: {
+ return handleGbaGetReleaseCommand();
+ }
+ }
+
+ return -1;
+ }
+
+ private int getSubId(String cmd) {
+ int slotId = getDefaultSlot();
+ String opt = getNextOption();
+ if (opt != null && opt.equals("-s")) {
+ try {
+ slotId = Integer.parseInt(getNextArgRequired());
+ } catch (NumberFormatException e) {
+ getErrPrintWriter().println(cmd + " requires an integer as a SLOT_ID.");
+ return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+ }
+ }
+ int[] subIds = SubscriptionManager.getSubId(slotId);
+ return subIds[0];
+ }
+
+ private int handleGbaSetServiceCommand() {
+ int subId = getSubId("gba set-service");
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return -1;
+ }
+
+ String packageName = getNextArg();
+ try {
+ if (packageName == null) {
+ packageName = "";
+ }
+ boolean result = mInterface.setBoundGbaServiceOverride(subId, packageName);
+ if (VDBG) {
+ Log.v(LOG_TAG, "gba set-service -s " + subId + " "
+ + packageName + ", result=" + result);
+ }
+ getOutPrintWriter().println(result);
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, "gba set-service " + subId + " "
+ + packageName + ", error" + e.getMessage());
+ getErrPrintWriter().println("Exception: " + e.getMessage());
+ return -1;
+ }
+ return 0;
+ }
+
+ private int handleGbaGetServiceCommand() {
+ String result;
+
+ int subId = getSubId("gba get-service");
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return -1;
+ }
+
+ try {
+ result = mInterface.getBoundGbaService(subId);
+ } catch (RemoteException e) {
+ return -1;
+ }
+ if (VDBG) {
+ Log.v(LOG_TAG, "gba get-service -s " + subId + ", returned: " + result);
+ }
+ getOutPrintWriter().println(result);
+ return 0;
+ }
+
+ private int handleGbaSetReleaseCommand() {
+ //the release time value could be -1
+ int subId = getRemainingArgsCount() > 1 ? getSubId("gba set-release")
+ : SubscriptionManager.getDefaultSubscriptionId();
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return -1;
+ }
+
+ String intervalStr = getNextArg();
+ if (intervalStr == null) {
+ return -1;
+ }
+
+ try {
+ int interval = Integer.parseInt(intervalStr);
+ boolean result = mInterface.setGbaReleaseTimeOverride(subId, interval);
+ if (VDBG) {
+ Log.v(LOG_TAG, "gba set-release -s " + subId + " "
+ + intervalStr + ", result=" + result);
+ }
+ getOutPrintWriter().println(result);
+ } catch (NumberFormatException | RemoteException e) {
+ Log.w(LOG_TAG, "gba set-release -s " + subId + " "
+ + intervalStr + ", error" + e.getMessage());
+ getErrPrintWriter().println("Exception: " + e.getMessage());
+ return -1;
+ }
+ return 0;
+ }
+
+ private int handleGbaGetReleaseCommand() {
+ int subId = getSubId("gba get-release");
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return -1;
+ }
+
+ int result = 0;
+ try {
+ result = mInterface.getGbaReleaseTime(subId);
+ } catch (RemoteException e) {
+ return -1;
+ }
+ if (VDBG) {
+ Log.v(LOG_TAG, "gba get-release -s " + subId + ", returned: " + result);
+ }
+ getOutPrintWriter().println(result);
+ return 0;
+ }
+
+ private int handleSingleRegistrationConfigCommand() {
+ String arg = getNextArg();
+ if (arg == null) {
+ onHelpSrc();
+ return 0;
+ }
+
+ switch (arg) {
+ case SRC_SET_DEVICE_ENABLED: {
+ return handleSrcSetDeviceEnabledCommand();
+ }
+ case SRC_GET_DEVICE_ENABLED: {
+ return handleSrcGetDeviceEnabledCommand();
+ }
+ case SRC_SET_CARRIER_ENABLED: {
+ return handleSrcSetCarrierEnabledCommand();
+ }
+ case SRC_GET_CARRIER_ENABLED: {
+ return handleSrcGetCarrierEnabledCommand();
+ }
+ }
+
+ return -1;
+ }
+
+ private int handleSrcSetDeviceEnabledCommand() {
+ String enabledStr = getNextArg();
+ if (enabledStr == null) {
+ return -1;
+ }
+
+ try {
+ mInterface.setDeviceSingleRegistrationEnabledOverride(enabledStr);
+ if (VDBG) {
+ Log.v(LOG_TAG, "src set-device-enabled " + enabledStr + ", done");
+ }
+ getOutPrintWriter().println("Done");
+ } catch (NumberFormatException | RemoteException e) {
+ Log.w(LOG_TAG, "src set-device-enabled " + enabledStr + ", error" + e.getMessage());
+ getErrPrintWriter().println("Exception: " + e.getMessage());
+ return -1;
+ }
+ return 0;
+ }
+
+ private int handleSrcGetDeviceEnabledCommand() {
+ boolean result = false;
+ try {
+ result = mInterface.getDeviceSingleRegistrationEnabled();
+ } catch (RemoteException e) {
+ return -1;
+ }
+ if (VDBG) {
+ Log.v(LOG_TAG, "src get-device-enabled, returned: " + result);
+ }
+ getOutPrintWriter().println(result);
+ return 0;
+ }
+
+ private int handleSrcSetCarrierEnabledCommand() {
+ //the release time value could be -1
+ int subId = getRemainingArgsCount() > 1 ? getSubId("src set-carrier-enabled")
+ : SubscriptionManager.getDefaultSubscriptionId();
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return -1;
+ }
+
+ String enabledStr = getNextArg();
+ if (enabledStr == null) {
+ return -1;
+ }
+
+ try {
+ boolean result =
+ mInterface.setCarrierSingleRegistrationEnabledOverride(subId, enabledStr);
+ if (VDBG) {
+ Log.v(LOG_TAG, "src set-carrier-enabled -s " + subId + " "
+ + enabledStr + ", result=" + result);
+ }
+ getOutPrintWriter().println(result);
+ } catch (NumberFormatException | RemoteException e) {
+ Log.w(LOG_TAG, "src set-carrier-enabled -s " + subId + " "
+ + enabledStr + ", error" + e.getMessage());
+ getErrPrintWriter().println("Exception: " + e.getMessage());
+ return -1;
+ }
+ return 0;
+ }
+
+ private int handleSrcGetCarrierEnabledCommand() {
+ int subId = getSubId("src get-carrier-enabled");
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return -1;
+ }
+
+ boolean result = false;
+ try {
+ result = mInterface.getCarrierSingleRegistrationEnabled(subId);
+ } catch (RemoteException e) {
+ return -1;
+ }
+ if (VDBG) {
+ Log.v(LOG_TAG, "src get-carrier-enabled -s " + subId + ", returned: " + result);
+ }
+ getOutPrintWriter().println(result);
+ return 0;
+ }
}
diff --git a/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java b/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java
index 57caede..f24e7d6 100644
--- a/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java
+++ b/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java
@@ -26,7 +26,7 @@
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.UserHandle;
-import android.permission.PermissionManager;
+import android.permission.LegacyPermissionManager;
import android.service.euicc.EuiccService;
import android.telephony.euicc.EuiccManager;
import android.util.Log;
@@ -55,14 +55,15 @@
PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DEBUG_TRIAGED_MISSING
| PackageManager.GET_RESOLVED_FILTER;
- private PermissionManager mPermissionManager;
+ private LegacyPermissionManager mPermissionManager;
private boolean mGrantPermissionDone = false;
private ThreadPoolExecutor mExecutor;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mPermissionManager = (PermissionManager) getSystemService(Context.PERMISSION_SERVICE);
+ mPermissionManager = (LegacyPermissionManager) getSystemService(
+ Context.LEGACY_PERMISSION_SERVICE);
mExecutor = new ThreadPoolExecutor(
1 /* corePoolSize */,
1 /* maxPoolSize */,
diff --git a/src/com/android/services/telephony/CallQualityManager.java b/src/com/android/services/telephony/CallQualityManager.java
new file mode 100644
index 0000000..01b5bae
--- /dev/null
+++ b/src/com/android/services/telephony/CallQualityManager.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.os.Bundle;
+import android.telecom.BluetoothCallQualityReport;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.phone.R;
+
+/**
+ * class to handle call quality events that are received by telecom and telephony
+ */
+public class CallQualityManager {
+ private static final String TAG = CallQualityManager.class.getCanonicalName();
+ private static final String CALL_QUALITY_REPORT_CHANNEL = "call_quality_report_channel";
+
+ /** notification ids */
+ public static final int BLUETOOTH_CHOPPY_VOICE_NOTIFICATION_ID = 700;
+
+ public static final String CALL_QUALITY_CHANNEL_ID = "CallQualityNotification";
+
+ private final Context mContext;
+ private final NotificationChannel mNotificationChannel;
+ private final NotificationManager mNotificationManager;
+
+ public CallQualityManager(Context context) {
+ mContext = context;
+ mNotificationChannel = new NotificationChannel(CALL_QUALITY_CHANNEL_ID,
+ mContext.getString(R.string.call_quality_notification_name),
+ NotificationManager.IMPORTANCE_HIGH);
+ mNotificationManager = (NotificationManager)
+ mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ mNotificationManager.createNotificationChannel(mNotificationChannel);
+ }
+
+ /**
+ * method that is called whenever a
+ * {@code BluetoothCallQualityReport.EVENT_SEND_BLUETOOTH_CALL_QUALITY_REPORT} is received
+ * @param extras Bundle that includes serialized {@code BluetoothCallQualityReport} parcelable
+ */
+ @VisibleForTesting
+ public void onBluetoothCallQualityReported(Bundle extras) {
+ if (extras == null) {
+ Log.d(TAG, "onBluetoothCallQualityReported: no extras provided");
+ }
+
+ BluetoothCallQualityReport callQualityReport = extras.getParcelable(
+ BluetoothCallQualityReport.EXTRA_BLUETOOTH_CALL_QUALITY_REPORT);
+
+ if (callQualityReport.isChoppyVoice()) {
+ onChoppyVoice();
+ }
+ // TODO: once other signals are also sent, we will add more actions here
+ }
+
+ /**
+ * method to post a notification to user suggesting ways to improve call quality in case of
+ * bluetooth choppy voice
+ */
+ @VisibleForTesting
+ public void onChoppyVoice() {
+ String title = "Call Quality Improvement";
+ //TODO: update call_quality_bluetooth_enhancement_suggestion with below before submitting:
+// "Voice is not being transmitted properly via your bluetooth device."
+// + "To improve, try:\n"
+// + "1. moving your phone closer to your bluetooth device\n"
+// + "2. using a different bluetooth device, or your phone's speaker\n";
+ popUpNotification(title,
+ mContext.getText(R.string.call_quality_notification_bluetooth_details));
+ }
+
+ private void popUpNotification(String title, CharSequence details) {
+ int iconId = android.R.drawable.stat_notify_error;
+
+ Notification notification = new Notification.Builder(mContext)
+ .setSmallIcon(iconId)
+ .setWhen(System.currentTimeMillis())
+ .setAutoCancel(true)
+ .setContentTitle(title)
+ .setContentText(details)
+ .setStyle(new Notification.BigTextStyle().bigText(details))
+ .setOngoing(true)
+ .setChannelId(CALL_QUALITY_CHANNEL_ID)
+ .setOnlyAlertOnce(true)
+ .build();
+
+ mNotificationManager.notify(TAG, BLUETOOTH_CHOPPY_VOICE_NOTIFICATION_ID, notification);
+ }
+}
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 7af1678..c9a6571 100755
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -28,6 +28,7 @@
import android.os.Looper;
import android.os.Message;
import android.os.PersistableBundle;
+import android.telecom.BluetoothCallQualityReport;
import android.telecom.CallAudioState;
import android.telecom.Conference;
import android.telecom.Connection;
@@ -810,6 +811,8 @@
private final Set<TelephonyConnectionListener> mTelephonyListeners = Collections.newSetFromMap(
new ConcurrentHashMap<TelephonyConnectionListener, Boolean>(8, 0.9f, 1));
+ private CallQualityManager mCallQualityManager;
+
protected TelephonyConnection(com.android.internal.telephony.Connection originalConnection,
String callId, @android.telecom.Call.Details.CallDirection int callDirection) {
setCallDirection(callDirection);
@@ -819,6 +822,20 @@
}
}
+ @Override
+ public void onCallEvent(String event, Bundle extras) {
+ switch (event) {
+ case BluetoothCallQualityReport.EVENT_BLUETOOTH_CALL_QUALITY_REPORT:
+ if (mCallQualityManager == null) {
+ mCallQualityManager = new CallQualityManager(getPhone().getContext());
+ }
+ mCallQualityManager.onBluetoothCallQualityReported(extras);
+ break;
+ default:
+ break;
+ }
+
+ }
/**
* Creates a clone of the current {@link TelephonyConnection}.
*
@@ -1419,6 +1436,15 @@
} else {
extrasToRemove.add(Connection.EXTRA_DISABLE_ADD_CALL);
}
+
+ if (mOriginalConnection != null) {
+ ArrayList<String> forwardedNumber = mOriginalConnection.getForwardedNumber();
+ if (forwardedNumber != null) {
+ extrasToPut.putStringArrayList(Connection.EXTRA_LAST_FORWARDED_NUMBER,
+ forwardedNumber);
+ }
+ }
+
putTelephonyExtras(extrasToPut);
removeTelephonyExtras(extrasToRemove);
diff --git a/src/com/android/services/telephony/rcs/DelegateBinderStateManager.java b/src/com/android/services/telephony/rcs/DelegateBinderStateManager.java
index 39e9965..9d2c5d6 100644
--- a/src/com/android/services/telephony/rcs/DelegateBinderStateManager.java
+++ b/src/com/android/services/telephony/rcs/DelegateBinderStateManager.java
@@ -19,10 +19,11 @@
import android.telephony.ims.DelegateRegistrationState;
import android.telephony.ims.DelegateRequest;
import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateConnection;
import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.SipDelegateManager;
import android.telephony.ims.aidl.ISipDelegate;
import android.telephony.ims.aidl.ISipDelegateMessageCallback;
-import android.telephony.ims.aidl.ISipTransport;
import com.android.internal.annotations.VisibleForTesting;
@@ -61,8 +62,8 @@
* denied. See {@link SipDelegateBinderConnectionStub} and
* {@link SipDelegateBinderConnection}
*/
- DelegateBinderStateManager create(int subId, ISipTransport sipTransport,
- DelegateRequest requestedConfig, Set<FeatureTagState> transportDeniedTags,
+ DelegateBinderStateManager create(int subId, DelegateRequest requestedConfig,
+ Set<FeatureTagState> transportDeniedTags,
Executor executor, List<StateCallback> stateCallbacks);
}
@@ -89,4 +90,11 @@
* Contains the reason the SipDelegate reported it was destroyed.
*/
void destroy(int reason, Consumer<Integer> destroyedConsumer);
+
+ /**
+ * Called by IMS application, see
+ * {@link SipDelegateManager#triggerFullNetworkRegistration(SipDelegateConnection, int, String)}
+ * for more information about when this is called.
+ */
+ void triggerFullNetworkRegistration(int sipCode, String sipReason);
}
diff --git a/src/com/android/services/telephony/rcs/SipDelegateBinderConnection.java b/src/com/android/services/telephony/rcs/SipDelegateBinderConnection.java
index 1a77f2b..3f6f269 100644
--- a/src/com/android/services/telephony/rcs/SipDelegateBinderConnection.java
+++ b/src/com/android/services/telephony/rcs/SipDelegateBinderConnection.java
@@ -24,6 +24,7 @@
import android.telephony.ims.FeatureTagState;
import android.telephony.ims.SipDelegateImsConfiguration;
import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.IImsRegistration;
import android.telephony.ims.aidl.ISipDelegate;
import android.telephony.ims.aidl.ISipDelegateMessageCallback;
import android.telephony.ims.aidl.ISipDelegateStateCallback;
@@ -118,6 +119,7 @@
};
private final ISipTransport mSipTransport;
+ private final IImsRegistration mImsRegistration;
private final DelegateRequest mRequestedConfig;
private ISipDelegate mDelegateBinder;
@@ -129,6 +131,8 @@
* {@link SipDelegate}.
* @param subId The subid that this SipDelegate is being created for.
* @param sipTransport The SipTransport implementation that will be used to manage SipDelegates.
+ * @param registrationImpl The ImsRegistration implementation that will be used to manage
+ * registration changes in relation to the SipDelegates.
* @param requestedConfig The DelegateRequest to be sent to the ImsService.
* @param transportDeniedTags The feature tags that have already been denied by the
* SipTransportController and should not be requested.
@@ -138,10 +142,12 @@
* SipDelegate changes. This will be called on the supplied executor.
*/
public SipDelegateBinderConnection(int subId, ISipTransport sipTransport,
- DelegateRequest requestedConfig, Set<FeatureTagState> transportDeniedTags,
- Executor executor, List<StateCallback> stateCallbacks) {
+ IImsRegistration registrationImpl, DelegateRequest requestedConfig,
+ Set<FeatureTagState> transportDeniedTags, Executor executor,
+ List<StateCallback> stateCallbacks) {
mSubId = subId;
mSipTransport = sipTransport;
+ mImsRegistration = registrationImpl;
mRequestedConfig = requestedConfig;
mDeniedTags = transportDeniedTags;
mExecutor = executor;
@@ -184,6 +190,15 @@
}
}
+ @Override
+ public void triggerFullNetworkRegistration(int sipCode, String sipReason) {
+ try {
+ mImsRegistration.triggerFullNetworkRegistration(sipCode, sipReason);
+ } catch (RemoteException e) {
+ logw("triggerFullNetworkRegistration called on unreachable ImsRegistration:" + e);
+ }
+ }
+
private void notifySipDelegateCreated(ISipDelegate delegate,
List<FeatureTagState> deniedFeatureTags) {
logi("Delegate Created: " + delegate + ", deniedTags:" + deniedFeatureTags);
diff --git a/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionStub.java b/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionStub.java
index 888af94..ef12eb8 100644
--- a/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionStub.java
+++ b/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionStub.java
@@ -77,4 +77,10 @@
destroyedConsumer.accept(reason);
});
}
+
+ @Override
+ public void triggerFullNetworkRegistration(int sipCode, String sipReason) {
+ // This stub is not connected to an ImsService, so this method is intentionally not
+ // implemented.
+ }
}
diff --git a/src/com/android/services/telephony/rcs/SipDelegateController.java b/src/com/android/services/telephony/rcs/SipDelegateController.java
index ed50778..4b3176a 100644
--- a/src/com/android/services/telephony/rcs/SipDelegateController.java
+++ b/src/com/android/services/telephony/rcs/SipDelegateController.java
@@ -21,6 +21,7 @@
import android.telephony.ims.FeatureTagState;
import android.telephony.ims.SipDelegateConnection;
import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.IImsRegistration;
import android.telephony.ims.aidl.ISipDelegate;
import android.telephony.ims.aidl.ISipDelegateConnectionStateCallback;
import android.telephony.ims.aidl.ISipDelegateMessageCallback;
@@ -49,10 +50,18 @@
public class SipDelegateController {
static final String LOG_TAG = "SipDelegateC";
- private DelegateBinderStateManager.Factory mBinderConnectionFactory =
- new DelegateBinderStateManager.Factory() {
+ private class BinderConnectionFactory implements DelegateBinderStateManager.Factory {
+
+ private final ISipTransport mSipTransportImpl;
+ private final IImsRegistration mImsRegistrationImpl;
+
+ BinderConnectionFactory(ISipTransport transport, IImsRegistration registration) {
+ mSipTransportImpl = transport;
+ mImsRegistrationImpl = registration;
+ }
+
@Override
- public DelegateBinderStateManager create(int subId, ISipTransport sipTransport,
+ public DelegateBinderStateManager create(int subId,
DelegateRequest requestedConfig, Set<FeatureTagState> transportDeniedTags,
Executor executor, List<DelegateBinderStateManager.StateCallback> stateCallbacks) {
// We should not actually create a SipDelegate in this case.
@@ -60,32 +69,33 @@
return new SipDelegateBinderConnectionStub(transportDeniedTags, executor,
stateCallbacks);
}
- return new SipDelegateBinderConnection(mSubId, mSipTransportImpl, requestedConfig,
- transportDeniedTags, mExecutorService, stateCallbacks);
+ return new SipDelegateBinderConnection(mSubId, mSipTransportImpl, mImsRegistrationImpl,
+ requestedConfig, transportDeniedTags, mExecutorService, stateCallbacks);
}
- };
+ }
private final int mSubId;
private final String mPackageName;
private final DelegateRequest mInitialRequest;
- private final ISipTransport mSipTransportImpl;
private final ScheduledExecutorService mExecutorService;
private final MessageTransportStateTracker mMessageTransportStateTracker;
private final DelegateStateTracker mDelegateStateTracker;
+ private final DelegateBinderStateManager.Factory mBinderConnectionFactory;
private final LocalLog mLocalLog = new LocalLog(SipTransportController.LOG_SIZE);
private DelegateBinderStateManager mBinderConnection;
private Set<String> mTrackedFeatureTags;
public SipDelegateController(int subId, DelegateRequest initialRequest, String packageName,
- ISipTransport sipTransportImpl, ScheduledExecutorService executorService,
+ ISipTransport transportImpl, IImsRegistration registrationImpl,
+ ScheduledExecutorService executorService,
ISipDelegateConnectionStateCallback stateCallback,
ISipDelegateMessageCallback messageCallback) {
mSubId = subId;
mPackageName = packageName;
mInitialRequest = initialRequest;
- mSipTransportImpl = sipTransportImpl;
mExecutorService = executorService;
+ mBinderConnectionFactory = new BinderConnectionFactory(transportImpl, registrationImpl);
mMessageTransportStateTracker = new MessageTransportStateTracker(mSubId, executorService,
messageCallback);
@@ -98,14 +108,13 @@
*/
@VisibleForTesting
public SipDelegateController(int subId, DelegateRequest initialRequest, String packageName,
- ISipTransport sipTransportImpl, ScheduledExecutorService executorService,
+ ScheduledExecutorService executorService,
MessageTransportStateTracker messageTransportStateTracker,
DelegateStateTracker delegateStateTracker,
DelegateBinderStateManager.Factory connectionFactory) {
mSubId = subId;
mInitialRequest = initialRequest;
mPackageName = packageName;
- mSipTransportImpl = sipTransportImpl;
mExecutorService = executorService;
mMessageTransportStateTracker = messageTransportStateTracker;
mDelegateStateTracker = delegateStateTracker;
@@ -249,6 +258,21 @@
}, mExecutorService);
};
+ /**
+ * The IMS application is notifying the ImsService that it has received a response to a request
+ * that will require that the IMS registration be torn down and brought back up.
+ *<p>
+ * See {@link SipDelegateManager#triggerFullNetworkRegistration} for more information.
+ */
+ public void triggerFullNetworkRegistration(int sipCode, String sipReason) {
+ logi("triggerFullNetworkRegistration, code=" + sipCode + ", reason=" + sipReason);
+ if (mBinderConnection != null) {
+ mBinderConnection.triggerFullNetworkRegistration(sipCode, sipReason);
+ } else {
+ logw("triggerFullNetworkRegistration called when binder connection is null");
+ }
+ }
+
private static int getMessageFailReasonFromDestroyReason(int destroyReason) {
switch (destroyReason) {
case SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD:
@@ -340,7 +364,7 @@
stateCallbacks.add(mDelegateStateTracker);
stateCallbacks.add(mMessageTransportStateTracker);
- return mBinderConnectionFactory.create(mSubId, mSipTransportImpl,
+ return mBinderConnectionFactory.create(mSubId,
new DelegateRequest(supportedSet), deniedSet, mExecutorService, stateCallbacks);
}
diff --git a/src/com/android/services/telephony/rcs/SipTransportController.java b/src/com/android/services/telephony/rcs/SipTransportController.java
index 5d817ba..028e49f 100644
--- a/src/com/android/services/telephony/rcs/SipTransportController.java
+++ b/src/com/android/services/telephony/rcs/SipTransportController.java
@@ -19,12 +19,14 @@
import android.app.role.OnRoleHoldersChangedListener;
import android.app.role.RoleManager;
import android.content.Context;
+import android.os.RemoteException;
import android.os.UserHandle;
import android.telephony.ims.DelegateRequest;
import android.telephony.ims.FeatureTagState;
import android.telephony.ims.ImsException;
import android.telephony.ims.ImsService;
import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.IImsRegistration;
import android.telephony.ims.aidl.ISipDelegate;
import android.telephony.ims.aidl.ISipDelegateConnectionStateCallback;
import android.telephony.ims.aidl.ISipDelegateMessageCallback;
@@ -206,7 +208,8 @@
public interface SipDelegateControllerFactory {
/** See {@link SipDelegateController} */
SipDelegateController create(int subId, DelegateRequest initialRequest, String packageName,
- ISipTransport sipTransportImpl, ScheduledExecutorService executorService,
+ ISipTransport sipTransportImpl, IImsRegistration registrationImpl,
+ ScheduledExecutorService executorService,
ISipDelegateConnectionStateCallback stateCallback,
ISipDelegateMessageCallback messageCallback);
}
@@ -348,6 +351,16 @@
}
/**
+ * The remote IMS application has requested that the ImsService tear down and re-register for
+ * IMS features due to an error it received on the network in response to a SIP request.
+ */
+ public void triggerFullNetworkRegistration(int subId, ISipDelegate connection, int sipCode,
+ String sipReason) {
+ mExecutorService.execute(() -> triggerFullNetworkRegistrationInternal(subId, connection,
+ sipCode, sipReason));
+ }
+
+ /**
* @return Whether or not SipTransports are supported on the connected ImsService. This can
* change based on the capabilities of the ImsService.
* @throws ImsException if the ImsService connected to this controller is currently down.
@@ -366,11 +379,13 @@
ISipDelegateMessageCallback delegateMessage,
Consumer<ImsException> startedErrorConsumer) {
ISipTransport transport;
+ IImsRegistration registration;
// Send back any errors via Consumer early in creation process if it is clear that the
// SipDelegate will never be created.
try {
checkStateOfController(subId);
transport = mRcsManager.getSipTransport();
+ registration = mRcsManager.getImsRegistration();
if (transport == null) {
logw("createSipDelegateInternal, transport null during request.");
startedErrorConsumer.accept(new ImsException("SipTransport not supported",
@@ -387,7 +402,7 @@
}
SipDelegateController c = mDelegateControllerFactory.create(subId, request, packageName,
- transport, mExecutorService, delegateState, delegateMessage);
+ transport, registration, mExecutorService, delegateState, delegateMessage);
logi("createSipDelegateInternal: request= " + request + ", packageName= " + packageName
+ ", controller created: " + c);
addPendingCreateAndEvaluate(c);
@@ -420,43 +435,98 @@
addPendingDestroyAndEvaluate(match, reason);
}
+ private void triggerFullNetworkRegistrationInternal(int subId, ISipDelegate connection,
+ int sipCode, String sipReason) {
+ if (subId != mSubId) {
+ logw("triggerFullNetworkRegistrationInternal: ignoring network reg request, as this is"
+ + "about to be destroyed anyway due to subId change, delegate=" + connection);
+ return;
+ }
+ if (connection == null) {
+ logw("triggerFullNetworkRegistrationInternal: ignoring, null connection binder.");
+ return;
+ }
+ // Ensure the requester has a valid SipDelegate registered.
+ SipDelegateController match = null;
+ for (SipDelegateController controller : mDelegatePriorityQueue) {
+ if (Objects.equal(connection.asBinder(),
+ controller.getSipDelegateInterface().asBinder())) {
+ match = controller;
+ break;
+ }
+ }
+ if (match == null) {
+ logw("triggerFullNetworkRegistrationInternal: could not find matching connection, "
+ + "ignoring");
+ return;
+ }
+
+ match.triggerFullNetworkRegistration(sipCode, sipReason);
+ }
+
/**
* Cancel pending update IMS registration events if they exist and instead send a deregister
* event.
*/
private void triggerDeregistrationEvent() {
- if (mPendingUpdateRegistrationFuture != null
- && !mPendingUpdateRegistrationFuture.isDone()) {
- // Cancel pending update and replace with a call to deregister now.
- mPendingUpdateRegistrationFuture.cancel(false);
- logi("triggerDeregistrationEvent: cancelling existing reg update event: "
- + mPendingUpdateRegistrationFuture);
- }
logi("triggerDeregistrationEvent: Sending deregister event to ImsService");
- //TODO hook up registration apis
+ cancelPendingUpdateRegistration();
+
+ IImsRegistration registrationImpl = mRcsManager.getImsRegistration();
+ if (registrationImpl != null) {
+ try {
+ registrationImpl.triggerSipDelegateDeregistration();
+ } catch (RemoteException e) {
+ logi("triggerDeregistrationEvent: received RemoteException: " + e);
+ }
+ }
}
/**
* Schedule an update to the IMS registration. If there is an existing update scheduled, cancel
* it and reschedule.
+ * <p>
+ * We want to wait because this can directly result in changes to the IMS registration on the
+ * network, so we need to wait for a steady state where all changes have been made before
+ * triggering an update to the network registration.
*/
private void scheduleUpdateRegistration() {
- if (mPendingUpdateRegistrationFuture != null
- && !mPendingUpdateRegistrationFuture.isDone()) {
- // Cancel the old pending operation and reschedule again.
- mPendingUpdateRegistrationFuture.cancel(false);
- logi("scheduleUpdateRegistration: cancelling existing reg update event: "
- + mPendingUpdateRegistrationFuture);
- }
+ cancelPendingUpdateRegistration();
+
ScheduledFuture<?> f = mExecutorService.schedule(this::triggerUpdateRegistrationEvent,
mTimerAdapter.getUpdateRegistrationDelayMilliseconds(), TimeUnit.MILLISECONDS);
logi("scheduleUpdateRegistration: scheduling new event: " + f);
mPendingUpdateRegistrationFuture = f;
}
+ /**
+ * Cancel an existing pending task to update the IMS registration associated with SIP delegates.
+ */
+ private void cancelPendingUpdateRegistration() {
+ if (mPendingUpdateRegistrationFuture == null
+ || mPendingUpdateRegistrationFuture.isDone()) {
+ return;
+ }
+ // Cancel the old pending operation and reschedule again.
+ mPendingUpdateRegistrationFuture.cancel(false);
+ logi("scheduleUpdateRegistration: cancelling existing reg update event: "
+ + mPendingUpdateRegistrationFuture);
+ }
+
+ /**
+ * Triggers an event to update the IMS registration of the ImsService. Should only be called
+ * from {@link #scheduleUpdateRegistration()}.
+ */
private void triggerUpdateRegistrationEvent() {
logi("triggerUpdateRegistrationEvent: Sending update registration event to ImsService");
- //TODO hook up registration apis
+ IImsRegistration registrationImpl = mRcsManager.getImsRegistration();
+ if (registrationImpl != null) {
+ try {
+ registrationImpl.triggerUpdateSipDelegateRegistration();
+ } catch (RemoteException e) {
+ logi("triggerUpdateRegistrationEvent: received RemoteException: " + e);
+ }
+ }
}
/**
@@ -564,6 +634,9 @@
* by another delegate higher in the priority queue.
*/
private void reevaluateDelegates() {
+ // We need to cancel the pending update now and reschedule IMS registration update for
+ // after the reevaluate is complete.
+ cancelPendingUpdateRegistration();
if (mEvaluateCompleteFuture != null && !mEvaluateCompleteFuture.isDone()) {
logw("reevaluateDelegates: last evaluate not done, deferring new request");
// Defer re-evaluate until after the pending re-evaluate is complete.
@@ -614,10 +687,13 @@
}, mExecutorService);
}
- // Executor doesn't matter here, just adding an extra stage to print result.
+ // Executor doesn't matter here, schedule an event to update the IMS registration.
mEvaluateCompleteFuture = pendingChange
- .thenAccept((associatedFeatures) -> logi("reevaluateDelegates: reevaluate complete,"
- + " feature tags associated: " + associatedFeatures));
+ .thenAccept((associatedFeatures) -> {
+ logi("reevaluateDelegates: reevaluate complete," + " feature tags associated: "
+ + associatedFeatures);
+ scheduleUpdateRegistration();
+ });
logi("reevaluateDelegates: future created.");
}
@@ -666,13 +742,19 @@
// CarrierConfigManager
return;
}
- updateRoleCache();
- // new denied tags will be picked up when reevaluate completes.
- scheduleThrottledReevaluate();
+ boolean roleChanged = updateRoleCache();
+ if (roleChanged) {
+ triggerDeregistrationEvent();
+ // new denied tags will be picked up when reevaluate completes.
+ scheduleThrottledReevaluate();
+ }
}
- private void updateRoleCache() {
+ /**
+ * @return true, if the role cache has changed, false otherwise.
+ */
+ private boolean updateRoleCache() {
String newSmsRolePackageName = "";
try {
// Only one app can fulfill the SMS role.
@@ -685,9 +767,10 @@
logi("updateRoleCache: new packageName=" + newSmsRolePackageName);
if (TextUtils.equals(mCachedSmsRolePackageName, newSmsRolePackageName)) {
logi("updateRoleCache, skipping, role did not change");
- return;
+ return false;
}
mCachedSmsRolePackageName = newSmsRolePackageName;
+ return true;
}
/**
diff --git a/testapps/GbaTestApp/Android.bp b/testapps/GbaTestApp/Android.bp
new file mode 100644
index 0000000..cb6df4e
--- /dev/null
+++ b/testapps/GbaTestApp/Android.bp
@@ -0,0 +1,26 @@
+// Copyright 2020 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+android_test {
+ name: "GbaTestApp",
+ static_libs: [
+ "androidx.appcompat_appcompat",
+ "androidx-constraintlayout_constraintlayout",
+ "ub-uiautomator",
+ ],
+ srcs: ["src/**/*.java"],
+ javacflags: ["-parameters"],
+ platform_apis: true,
+ certificate: "platform",
+}
diff --git a/testapps/GbaTestApp/AndroidManifest.xml b/testapps/GbaTestApp/AndroidManifest.xml
new file mode 100644
index 0000000..8554461
--- /dev/null
+++ b/testapps/GbaTestApp/AndroidManifest.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.phone.testapps.gbatestapp">
+
+ <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
+ <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
+ <uses-permission android:name="android.permission.BIND_GBA_SERVICE" />
+
+ <application
+ android:allowBackup="true"
+ android:label="@string/app_name"
+ android:theme="@style/Theme.AppCompat"
+ android:supportsRtl="true">
+ <service
+ android:name=".TestGbaService"
+ android:directBootAware="true"
+ android:permission="android.permission.BIND_GBA_SERVICE"
+ android:enabled="true"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.telephony.gba.GbaService"/>
+ </intent-filter>
+ </service>
+
+ <activity android:name=".MainActivity"
+ android:enabled="true"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/testapps/GbaTestApp/res/layout/fragment_carrier_config.xml b/testapps/GbaTestApp/res/layout/fragment_carrier_config.xml
new file mode 100644
index 0000000..f15fa2a
--- /dev/null
+++ b/testapps/GbaTestApp/res/layout/fragment_carrier_config.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/black"
+ tools:context=".ui.main.CarrierConfigFragment">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/service_package_name" />
+
+ <EditText
+ android:id="@+id/editServicePackageName"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:ems="10"
+ android:gravity="start|top"
+ android:inputType="textMultiLine" />
+
+ <TextView
+ android:id="@+id/textTestLabel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/service_release_time" />
+
+ <EditText
+ android:id="@+id/editServiceReleaseTime"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="numberSigned" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/layout_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:orientation="vertical">
+
+ <Button
+ android:id="@+id/carrier_config_clear"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_clear" />
+
+ <Button
+ android:id="@+id/carrier_config_done"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_done" />
+ </LinearLayout>
+
+</FrameLayout>
diff --git a/testapps/GbaTestApp/res/layout/fragment_service_config.xml b/testapps/GbaTestApp/res/layout/fragment_service_config.xml
new file mode 100644
index 0000000..50090c2
--- /dev/null
+++ b/testapps/GbaTestApp/res/layout/fragment_service_config.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/black"
+ tools:context=".ui.main.ServiceConfigFragment">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_above="@id/layout_buttons"
+ android:orientation="vertical">
+
+ <CheckBox
+ android:id="@+id/checkBoxResult"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/response_success" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/response_key" />
+
+ <EditText
+ android:id="@+id/editKey"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="textPersonName" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:editable="false"
+ android:text="@string/response_btid" />
+
+ <EditText
+ android:id="@+id/editBTid"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="textPersonName" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/response_fail_reason" />
+
+ <EditText
+ android:id="@+id/editFailReason"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="numberSigned" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/layout_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_gravity="bottom"
+ android:orientation="vertical">
+
+ <Button
+ android:id="@+id/service_config_clear"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_clear" />
+
+ <Button
+ android:id="@+id/service_config_done"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_done" />
+ </LinearLayout>
+
+</FrameLayout>
diff --git a/testapps/GbaTestApp/res/layout/fragment_test_config.xml b/testapps/GbaTestApp/res/layout/fragment_test_config.xml
new file mode 100644
index 0000000..d8016f0
--- /dev/null
+++ b/testapps/GbaTestApp/res/layout/fragment_test_config.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/black"
+ tools:context=".ui.main.TestConfigFragment">
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_marginBottom="8dp"
+ android:scrollbarStyle="outsideInset"
+ app:layout_constraintBottom_toTopOf="@id/layout_buttons"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/request_app_type" />
+
+ <EditText
+ android:id="@+id/editAppType"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="numberSigned" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/request_naf_url" />
+
+ <EditText
+ android:id="@+id/editUrl"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="textUri" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/request_org" />
+
+ <EditText
+ android:id="@+id/editOrg"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="numberSigned" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/request_security_protocol" />
+
+ <EditText
+ android:id="@+id/editSpId"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="numberSigned" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/request_tls_cipher_suite" />
+
+ <EditText
+ android:id="@+id/editTlsCs"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:inputType="numberSigned" />
+
+ <CheckBox
+ android:id="@+id/checkBoxForce"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/request_force_bootstrapping" />
+
+ </LinearLayout>
+ </ScrollView>
+
+ <LinearLayout
+ android:id="@+id/layout_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="false"
+ android:layout_gravity="bottom"
+ android:orientation="vertical"
+ app:layout_constraintBottom_toBottomOf="parent">
+
+ <Button
+ android:id="@+id/client_config_clear"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_clear" />
+
+ <Button
+ android:id="@+id/client_config_done"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_done" />
+ </LinearLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/testapps/GbaTestApp/res/layout/main_activity.xml b/testapps/GbaTestApp/res/layout/main_activity.xml
new file mode 100644
index 0000000..1dfb73b
--- /dev/null
+++ b/testapps/GbaTestApp/res/layout/main_activity.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".MainActivity" />
\ No newline at end of file
diff --git a/testapps/GbaTestApp/res/layout/main_fragment.xml b/testapps/GbaTestApp/res/layout/main_fragment.xml
new file mode 100644
index 0000000..33bb6e1
--- /dev/null
+++ b/testapps/GbaTestApp/res/layout/main_fragment.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/main"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".ui.main.MainFragment">
+
+ <LinearLayout
+ android:id="@+id/layout_config"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:orientation="vertical"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/label_settings" />
+
+ <Button
+ android:id="@+id/carrier_config_change_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/label_carrier" />
+
+ <Button
+ android:id="@+id/service_config"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/label_service" />
+
+ <Button
+ android:id="@+id/client_config"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/label_test" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/layout_test"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:orientation="vertical"
+ app:layout_constraintBottom_toTopOf="@id/layout_exit"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/layout_config">
+
+ <Button
+ android:id="@+id/send_request"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_running" />
+
+ <TextView
+ android:id="@+id/textTestLabel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/label_test_result" />
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/viewTestOutput"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+ </LinearLayout>
+ </ScrollView>
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/layout_exit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_gravity="bottom"
+ android:orientation="vertical"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent">
+
+ <Button
+ android:id="@+id/test_exit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_name_exit" />
+ </LinearLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/testapps/GbaTestApp/res/values-am/strings.xml b/testapps/GbaTestApp/res/values-am/strings.xml
new file mode 100644
index 0000000..b78cd6c
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-am/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"ቅንብሮች"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"የአገልግሎት አቅራቢ ውቅረት"</string>
+ <string name="label_service" msgid="2668963955237345578">"የአገልግሎት ውቅረት"</string>
+ <string name="label_test" msgid="8425079572898571918">"የሙከራ ውቅረት"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"በመስራት ላይ"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"ውጣ"</string>
+ <string name="label_test_result" msgid="892984695972956196">"የሙከራ ውጤት"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"ዳግም አስጀምር"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"ተከናውኗል"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"የGBA አገልግሎት የጥቅል ስም"</string>
+ <string name="service_release_time" msgid="532937496122890892">"ጥሪ ከተደረገ በኋላ አገልግሎት የሚለቀቅበት ጊዜ"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC የመተግበሪያ አይነት"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"የአውታረ መረብ የመተግበሪያ ተግባር (NAF) ዩአርኤል"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"በማስነሻ ተገዶ ይነሳ?"</string>
+ <string name="request_org" msgid="8416693445448308975">"የድርጅት ኮድ"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA የደህንነት ፕሮቶኮል መታወቂያ"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"የTLS ማመስጠሪያ ጥቅል መታወቂያ"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA ማረጋገጥ ተሳክቷል?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ያለመሳካት ምክንያት መታወቂያ"</string>
+ <string name="response_key" msgid="8839847772051686309">"የGBA ቁልፍ (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"የማስነሻ የግብይት መለያ (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-as/strings.xml b/testapps/GbaTestApp/res/values-as/strings.xml
new file mode 100644
index 0000000..3fbba0f
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-as/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"ছেটিং"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"বাহকৰ কনফিগাৰেশ্বন"</string>
+ <string name="label_service" msgid="2668963955237345578">"সেৱাৰ কনফিগাৰেশ্বন"</string>
+ <string name="label_test" msgid="8425079572898571918">"পৰীক্ষাৰ কনফিগাৰেশ্বন"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"চলি আছে"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"বাহিৰ হওক"</string>
+ <string name="label_test_result" msgid="892984695972956196">"পৰীক্ষাৰ ফলাফল"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"ৰিছেট কৰক"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"হ’ল"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA সেৱাৰ পেকেজৰ নাম"</string>
+ <string name="service_release_time" msgid="532937496122890892">"কল কৰাৰ কিমান সময়ৰ পাছত সেৱা প্ৰদান কৰা হ’ব"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC এপৰ প্ৰকাৰ"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"নেটৱৰ্ক এপ্লিকেশ্বন ফাংশ্বন (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"বলেৰে বুটষ্ট্ৰেপিং কৰিবনে?"</string>
+ <string name="request_org" msgid="8416693445448308975">"প্ৰতিষ্ঠানৰ ক’ড"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA সুৰক্ষা প্ৰ’ট’কল আইডি"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS Cipher Suite আইডি"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA প্ৰমাণীকৰণ সফল হৈছে নেকি?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ব্যৰ্থতাৰ কাৰণৰ আইডি"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA কী (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"বুটষ্ট্ৰেপিং লেনদেন চিনাক্তকাৰী (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-az/strings.xml b/testapps/GbaTestApp/res/values-az/strings.xml
new file mode 100644
index 0000000..5d78cde
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-az/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Ayarlar"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Operator konfiqurasiyası"</string>
+ <string name="label_service" msgid="2668963955237345578">"Xidmət konfiqurasiyası"</string>
+ <string name="label_test" msgid="8425079572898571918">"Test konfiqurasiyası"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Proses gedir"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Çıxın"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Test nəticəsi"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Sıfırlayın"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Oldu"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA xidmətinin paket adı"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Zəngdən sonra xidməti hansı müddətə buraxmalı"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC tətbiq növü"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"Şəbəkə tətbiqi funksiyası (NAF) URL-i"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Öz-özünə yükləməyə müdaxilə edilsin?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Təşkilat kodu"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA təhlükəsizlik protokolu ID-si"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS şifr dəsti ID-si"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA doğrulama alındı?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Uğursuzluq səbəbi ID-si"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA açarı (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Öz-özünə yükləmə tranzaksiyası üzrə identifikator (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-b+sr+Latn/strings.xml b/testapps/GbaTestApp/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..4ae2c86
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Podešavanja"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Konfiguracija mobilnog operatera"</string>
+ <string name="label_service" msgid="2668963955237345578">"Konfiguracija usluge"</string>
+ <string name="label_test" msgid="8425079572898571918">"Probna konfiguracija"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Aktivno"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Zatvori"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Rezultat testa"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Resetuj"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Gotovo"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Naziv paketa usluge GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Vreme dok se usluga ne aktivira posle poziva"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Tip UICC aplikacije"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL funkcije mrežne aplikacije (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Želite li da nametnete samostalno uzorkovanje?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Kôd organizacije"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"ID bezbednosnog protokola univerzalne analitike"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"ID TLS paketa za šifrovanje"</string>
+ <string name="response_success" msgid="2469204471244527663">"Da li je potvrda identiteta za GBA uspela?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ID razloga za neuspeh"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA taster (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Identifikator transakcije za samostalno uzorkovanje (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-bg/strings.xml b/testapps/GbaTestApp/res/values-bg/strings.xml
new file mode 100644
index 0000000..664b304
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-bg/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Настройки"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Конфигурация от оператора"</string>
+ <string name="label_service" msgid="2668963955237345578">"Конфигурация на услугата"</string>
+ <string name="label_test" msgid="8425079572898571918">"Конфигурация на теста"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Изпълнява се"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Изход"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Резултат от теста"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Повторно задаване"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Готово"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Име на пакета за услугата GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Колко време след обаждането да бъде освободена услугата"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Тип на приложението в UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL адрес на функцията за мрежово приложение (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Да се извърши ли принудително начално зареждане?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Код на организацията"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"Идентификатор на протокола за сигурност в UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"Идентификатор на пакета за шифроване с TLS"</string>
+ <string name="response_success" msgid="2469204471244527663">"Упълномощаването в GBA успя ли?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Идентификатор на причината за неуспех"</string>
+ <string name="response_key" msgid="8839847772051686309">"Ключ за GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Идентификатор на транзакцията при начално зареждане (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-bn/strings.xml b/testapps/GbaTestApp/res/values-bn/strings.xml
new file mode 100644
index 0000000..c661312
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-bn/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"সেটিংস"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"পরিষেবা প্রদানকারী কনফিগার করুন"</string>
+ <string name="label_service" msgid="2668963955237345578">"পরিষেবা কনফিগার করুন"</string>
+ <string name="label_test" msgid="8425079572898571918">"টেস্ট কনফিগার করুন"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"চলছে"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"বেরিয়ে আসুন"</string>
+ <string name="label_test_result" msgid="892984695972956196">"টেস্টের ফলাফল"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"রিসেট করুন"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"হয়ে গেছে"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA পরিষেবা সংক্রান্ত প্যাকেজের নাম"</string>
+ <string name="service_release_time" msgid="532937496122890892">"কল করার কতক্ষণ পরে পরিষেবা পাওয়া যাবে"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC অ্যাপের ধরন"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"নেটওয়ার্ক অ্যাপ্লিকেশনের কাজ (NAF) সংক্রান্ত URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"জোর করেই বুটস্ট্র্যাপিং করবেন?"</string>
+ <string name="request_org" msgid="8416693445448308975">"অর্গানাইজেশনের কোড"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA নিরাপত্তা সংক্রান্ত আইডি"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS গোপন কোডের স্যুট ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA যাচাই করা গেছে?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ব্যর্থতার কারণ সংক্রান্ত ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA কী (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"বুটস্ট্র্যাপিং ট্রানজ্যাকশন শনাক্তকারী (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-bs/strings.xml b/testapps/GbaTestApp/res/values-bs/strings.xml
new file mode 100644
index 0000000..1cfc0d1
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-bs/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Postavke"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Konfiguracija mobilnog operatera"</string>
+ <string name="label_service" msgid="2668963955237345578">"Konfiguracija usluge"</string>
+ <string name="label_test" msgid="8425079572898571918">"Testna konfiguracija"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Pokrenuto"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Izađi"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Rezultati testa"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Vrati na zadano"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Gotovo"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Ime paketa usluge GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Vrijeme prije nego se usluga aktivira nakon pozivanja"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Vrsta aplikacije UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL funkcije mrežne aplikacije (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Prisilno omogućiti metodu ponovnog uzorkovanja?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Kôd organizacije"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"ID sigurnosnog protokola UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"ID paketa TLS Cipher"</string>
+ <string name="response_success" msgid="2469204471244527663">"Uspjeli ste izvršiti autorizaciju GBA?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ID razloga za neuspjeh"</string>
+ <string name="response_key" msgid="8839847772051686309">"Tipka GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Identifikator transakcije za metodu ponovnog uzorkovanja (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-da/strings.xml b/testapps/GbaTestApp/res/values-da/strings.xml
new file mode 100644
index 0000000..1c3860d
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-da/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Indstillinger"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Konfiguration af mobilselskab"</string>
+ <string name="label_service" msgid="2668963955237345578">"Konfiguration af tjeneste"</string>
+ <string name="label_test" msgid="8425079572898571918">"Test konfiguration"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Kører"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Afslut"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Testresultat"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Nulstil"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Udfør"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Pakkenavn på GBA-tjeneste"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Hvor lang tid der går, før tjenesten frigives efter opkaldet"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC-apptype"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"Webadresse til NAF (Network application function)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Vil du gennemtvinge bootstrapping?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Organisationskode"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"Id for UA-sikkerhedsprotokol"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"Id for TLS-krypteringsalgoritmepakke"</string>
+ <string name="response_success" msgid="2469204471244527663">"Blev GBA godkendt?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Id for fejlårsag"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA-tat (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Transaktions-id for bootstrapping (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-en-rAU/strings.xml b/testapps/GbaTestApp/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..6c4a199
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-en-rAU/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Settings"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Operator config"</string>
+ <string name="label_service" msgid="2668963955237345578">"Service config"</string>
+ <string name="label_test" msgid="8425079572898571918">"Test config"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Running"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Exit"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Test result"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Reset"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Done"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Package name of GBA service"</string>
+ <string name="service_release_time" msgid="532937496122890892">"How long to release service after calling"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC app type"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"Network application function (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Force bootstrapping?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Organisation code"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA security protocol ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS cipher suite ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA auth success?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Fail reason ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA key (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Bootstrapping transaction identifier (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-en-rCA/strings.xml b/testapps/GbaTestApp/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..6c4a199
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-en-rCA/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Settings"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Operator config"</string>
+ <string name="label_service" msgid="2668963955237345578">"Service config"</string>
+ <string name="label_test" msgid="8425079572898571918">"Test config"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Running"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Exit"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Test result"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Reset"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Done"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Package name of GBA service"</string>
+ <string name="service_release_time" msgid="532937496122890892">"How long to release service after calling"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC app type"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"Network application function (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Force bootstrapping?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Organisation code"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA security protocol ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS cipher suite ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA auth success?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Fail reason ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA key (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Bootstrapping transaction identifier (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-en-rGB/strings.xml b/testapps/GbaTestApp/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..6c4a199
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-en-rGB/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Settings"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Operator config"</string>
+ <string name="label_service" msgid="2668963955237345578">"Service config"</string>
+ <string name="label_test" msgid="8425079572898571918">"Test config"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Running"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Exit"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Test result"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Reset"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Done"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Package name of GBA service"</string>
+ <string name="service_release_time" msgid="532937496122890892">"How long to release service after calling"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC app type"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"Network application function (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Force bootstrapping?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Organisation code"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA security protocol ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS cipher suite ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA auth success?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Fail reason ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA key (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Bootstrapping transaction identifier (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-en-rIN/strings.xml b/testapps/GbaTestApp/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..6c4a199
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-en-rIN/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Settings"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Operator config"</string>
+ <string name="label_service" msgid="2668963955237345578">"Service config"</string>
+ <string name="label_test" msgid="8425079572898571918">"Test config"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Running"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Exit"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Test result"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Reset"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Done"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Package name of GBA service"</string>
+ <string name="service_release_time" msgid="532937496122890892">"How long to release service after calling"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC app type"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"Network application function (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Force bootstrapping?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Organisation code"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA security protocol ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS cipher suite ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA auth success?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Fail reason ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA key (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Bootstrapping transaction identifier (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-en-rXC/strings.xml b/testapps/GbaTestApp/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..e3fe56b
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-en-rXC/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Settings"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Carrier Config"</string>
+ <string name="label_service" msgid="2668963955237345578">"Service Config"</string>
+ <string name="label_test" msgid="8425079572898571918">"Test Config"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Running"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Exit"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Test Result"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Reset"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Done"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Package name of GBA service"</string>
+ <string name="service_release_time" msgid="532937496122890892">"How long to release service after calling"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC App Type"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"Network application function (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Force Bootstrapping?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Organization Code"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA Security Protocol ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS Cipher Suite ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA Auth Success?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Fail Reason ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA Key (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Bootstrapping Transaction Identifier (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-fa/strings.xml b/testapps/GbaTestApp/res/values-fa/strings.xml
new file mode 100644
index 0000000..92801e7
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-fa/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"تنظیمات"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"پیکربندی شرکت مخابراتی"</string>
+ <string name="label_service" msgid="2668963955237345578">"پیکربندی سرویس"</string>
+ <string name="label_test" msgid="8425079572898571918">"پیکربندی آزمایش"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"درحال اجرا"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"خروج"</string>
+ <string name="label_test_result" msgid="892984695972956196">"نتیجه آزمایش"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"بازنشانی"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"تمام"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"نام بسته سرویس «معماری خود راهاندازی فراگیر» (GBA)"</string>
+ <string name="service_release_time" msgid="532937496122890892">"مدت زمان عرضه سرویس بعداز تماس"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"نوع برنامه «کارت مدار مجتمع جهانی» (UICC)"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"نشانی وب «عملکرد برنامه شبکه» (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"«خود راهاندازی» بهصورت اجباری اجرا شود؟"</string>
+ <string name="request_org" msgid="8416693445448308975">"کد سازمان"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"شناسه پروتکل امنیتی UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"شناسه مجموعه رمزنگاری امنیت لایه انتقال"</string>
+ <string name="response_success" msgid="2469204471244527663">"احراز هویت «معماری خود راهاندازی فراگیر» (GBA) موفق بود؟"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"شناسه دلیل انجام نشدن"</string>
+ <string name="response_key" msgid="8839847772051686309">"کلید «معماری خود راهاندازی فراگیر» (GBA) (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"شناسه تبادل خود راهاندازی (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-fi/strings.xml b/testapps/GbaTestApp/res/values-fi/strings.xml
new file mode 100644
index 0000000..ad5862d
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-fi/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Asetukset"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Operaattorin määritys"</string>
+ <string name="label_service" msgid="2668963955237345578">"Palvelun määritys"</string>
+ <string name="label_test" msgid="8425079572898571918">"Testimääritys"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Käynnissä"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Sulje"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Testitulokset"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Nollaa"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Valmis"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA-palvelun paketin nimi"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Kuinka pian soittamisen jälkeen palvelu vapautetaan"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC-sovelluksen tyyppi"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"NAF-URL-osoite (Network Application Function)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Pakotetaanko käynnistäminen?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Organisaation koodi"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA-suojausprotokollan tunnus"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS-salauspaketin tunnus"</string>
+ <string name="response_success" msgid="2469204471244527663">"Onnistuiko GBA-todennus?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Epäonnistumisen syyn tunnus"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA-avain (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"B-TID (Bootstrapping Transaction Identifier)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-fr-rCA/strings.xml b/testapps/GbaTestApp/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..2c7abc6
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-fr-rCA/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Paramètres"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Configuration d\'opérateur"</string>
+ <string name="label_service" msgid="2668963955237345578">"Configuration de service"</string>
+ <string name="label_test" msgid="8425079572898571918">"Configuration de test"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"En cours d\'exécution…"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Quitter"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Résultat du test"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Réinitialiser"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"OK"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Nom de l\'ensemble de service GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Délai de libération du service après un appel"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Type d\'application UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL de fonction d\'application réseau (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Forcer l\'amorçage?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Code d\'organisation"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"Identifiant de protocole de sécurité UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"Identifiant de suite de chiffrement TLS"</string>
+ <string name="response_success" msgid="2469204471244527663">"Réussite d\'autorisation GBA?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Identifiant de motif d\'échec"</string>
+ <string name="response_key" msgid="8839847772051686309">"Clé GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Identifiant de transaction d\'amorçage (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-gu/strings.xml b/testapps/GbaTestApp/res/values-gu/strings.xml
new file mode 100644
index 0000000..b43ecad
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-gu/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"સેટિંગ"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"મોબાઇલ ઑપરેટરની ગોઠવણી"</string>
+ <string name="label_service" msgid="2668963955237345578">"સેવાની ગોઠવણી"</string>
+ <string name="label_test" msgid="8425079572898571918">"પરીક્ષણની ગોઠવણી"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"ચાલે છે"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"બહાર નીકળો"</string>
+ <string name="label_test_result" msgid="892984695972956196">"પરીક્ષણનું પરિણામ"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"રીસેટ કરો"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"થઈ ગયું"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA સેવાનું પૅકેજિંગ નામ"</string>
+ <string name="service_release_time" msgid="532937496122890892">"કૉલ કર્યા પછી કેટલા સમયે સેવા રિલીઝ કરવી, તે સમયગાળો"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC ઍપ પ્રકાર"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"નેટવર્ક ઍપ્લિકેશન કાર્ય (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"શું બળજબરીથી બૂટસ્ટ્રેપિંગ કરીએ?"</string>
+ <string name="request_org" msgid="8416693445448308975">"સંસ્થાનો કોડ"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA સિક્યુરિટી પ્રોટોકૉલ ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS સાઇફર સ્યૂટ ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA Aપ્રમાણીકરણ સફળ થયું?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"નિષ્ફળતા કારણ ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA કી (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"બૂટસ્ટ્રેપિંગ વ્યવહાર ઓળખકર્તા (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-hi/strings.xml b/testapps/GbaTestApp/res/values-hi/strings.xml
new file mode 100644
index 0000000..442d65f
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-hi/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"सेटिंग"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी का कॉन्फ़िगरेशन"</string>
+ <string name="label_service" msgid="2668963955237345578">"सेवा का कॉन्फ़िगरेशन"</string>
+ <string name="label_test" msgid="8425079572898571918">"टेस्ट के लिए कॉन्फ़िगरेशन"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"चल रहा है"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"बाहर निकलें"</string>
+ <string name="label_test_result" msgid="892984695972956196">"टेस्ट का नतीजा"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"रीसेट करें"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"हो गया"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA सेवा के पैकेज का नाम"</string>
+ <string name="service_release_time" msgid="532937496122890892">"प्रोग्राम चालू करने के बाद, सेवा शुरू होने में कितना समय लगेगा"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC ऐप्लिकेशन टाइप"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"नेटवर्क ऐप्लिकेशन फ़ंक्शन (NAF) यूआरएल"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"क्या आप ज़बरदस्ती बूटस्ट्रैपिंग करना चाहते हैं?"</string>
+ <string name="request_org" msgid="8416693445448308975">"संगठन कोड"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA सिक्योरिटी प्रोटोकॉल आईडी"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS साइफ़र सुइट आईडी"</string>
+ <string name="response_success" msgid="2469204471244527663">"क्या GBA की पुष्टि हुई?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ऐप्लिकेशन लोड नहीं हो पाने की वजह का आईडी"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA कुंजी (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"बूटस्ट्रैपिंग ट्रांज़ैक्शन आइडेंटिफ़ायर (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-hy/strings.xml b/testapps/GbaTestApp/res/values-hy/strings.xml
new file mode 100644
index 0000000..7c306c1
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-hy/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Կարգավորումներ"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Օպերատորի կարգավորում"</string>
+ <string name="label_service" msgid="2668963955237345578">"Ծառայության կարգավորում"</string>
+ <string name="label_test" msgid="8425079572898571918">"Փորձարկման կարգավորում"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Աշխատանք"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Դուրս գալ"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Փորձարկման արդյունքը"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Վերակայել"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Պատրաստ է"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA ծառայության փաթեթի անունը"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Որքան ժամանակով դադարեցնել ծառայությունը զանգից հետո"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC հավելվածի տեսակը"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"Ցանցային հավելվածի գործառույթի (Network application function, NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Հարկադրե՞լ բութսթրափ"</string>
+ <string name="request_org" msgid="8416693445448308975">"Կազմակերպության կոդը"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA անվտանգության հաղորդակարգի ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS ծածկագրերի հավաքածուի ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA նույնականացումը հաջողվե՞ց"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Սխալի պատճառի ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA բանալի (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Բութսթրափի գործարքի նույնացուցիչ (Bootstrapping Transaction Identifier, B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-in/strings.xml b/testapps/GbaTestApp/res/values-in/strings.xml
new file mode 100644
index 0000000..cd5b0a8
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-in/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Setelan"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Konfigurasi Operator"</string>
+ <string name="label_service" msgid="2668963955237345578">"Konfigurasi Layanan"</string>
+ <string name="label_test" msgid="8425079572898571918">"Konfigurasi Pengujian"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Berjalan"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Keluar"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Hasil Uji"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Reset"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Selesai"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Nama paket layanan GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Berapa lama merilis layanan setelah panggilan"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Jenis Aplikasi UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL fungsi aplikasi jaringan (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Paksa Bootstrap?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Kode Organisasi"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"ID Protokol Keamanan UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"ID TLS Cipher Suite"</string>
+ <string name="response_success" msgid="2469204471244527663">"Autentikasi GBA Berhasil?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ID Alasan Gagal"</string>
+ <string name="response_key" msgid="8839847772051686309">"Tombol GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"ID Transaksi Bootstrap (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-it/strings.xml b/testapps/GbaTestApp/res/values-it/strings.xml
new file mode 100644
index 0000000..afde9ce
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-it/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Impostazioni"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Configurazione operatore"</string>
+ <string name="label_service" msgid="2668963955237345578">"Configurazione servizio"</string>
+ <string name="label_test" msgid="8425079572898571918">"Configurazione test"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"In esecuzione"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Esci"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Risultato test"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Reimposta"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Fine"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Nome pacchetto del servizio GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Tempo per il rilascio del servizio dopo la chiamata"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Tipo di app UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL NAF (Network Application Function)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Forzare il bootstrapping?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Codice organizzazione"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"ID protocollo sicurezza UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"ID pacchetto crittografia TLS"</string>
+ <string name="response_success" msgid="2469204471244527663">"Esito positivo autenticazione GBA?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ID motivo errore"</string>
+ <string name="response_key" msgid="8839847772051686309">"Chiave GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Identificatore transazione bootstrapping (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-iw/strings.xml b/testapps/GbaTestApp/res/values-iw/strings.xml
new file mode 100644
index 0000000..76412fa
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-iw/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"הגדרות"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"הגדרת הספק"</string>
+ <string name="label_service" msgid="2668963955237345578">"הגדרת השירות"</string>
+ <string name="label_test" msgid="8425079572898571918">"הגדרת הבדיקה"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"בפעולה"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"יציאה"</string>
+ <string name="label_test_result" msgid="892984695972956196">"תוצאת הבדיקה"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"איפוס"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"סיום"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"שם החבילה של שירות GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"תוך כמה זמן לשחרר את השירות אחרי השיחה?"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"סוג אפליקציית UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"כתובת ה-URL של פונקציית היישום של הרשת (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"לאלץ אתחול מסוג Bootstrapping?"</string>
+ <string name="request_org" msgid="8416693445448308975">"קוד הארגון"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"מזהה פרוטוקול אבטחה של UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"מזהה חבילת הצפנה של TLS"</string>
+ <string name="response_success" msgid="2469204471244527663">"האם אימות GBA בוצע בהצלחה?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"מזהה סיבת כישלון"</string>
+ <string name="response_key" msgid="8839847772051686309">"מפתח GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"מזהה טרנזקציית אתחול מסוג Bootstrapping (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-ja/strings.xml b/testapps/GbaTestApp/res/values-ja/strings.xml
new file mode 100644
index 0000000..7cb53e8
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-ja/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"設定"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"携帯通信会社の設定"</string>
+ <string name="label_service" msgid="2668963955237345578">"サービスの設定"</string>
+ <string name="label_test" msgid="8425079572898571918">"テストの設定"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"実行中"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"終了"</string>
+ <string name="label_test_result" msgid="892984695972956196">"テスト結果"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"リセット"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"完了"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA サービスのパッケージ名"</string>
+ <string name="service_release_time" msgid="532937496122890892">"呼び出してからサービスがリリースされるまでの時間"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC アプリの種類"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"ネットワーク アプリケーション ファンクション(NAF)の URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"ブートストラップを強制実行しますか?"</string>
+ <string name="request_org" msgid="8416693445448308975">"組織コード"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA セキュリティ プロトコル ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS 暗号スイート ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA 認証は成功しましたか?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"失敗理由 ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA キー(CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"ブートストラップ トランザクション識別子(B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-km/strings.xml b/testapps/GbaTestApp/res/values-km/strings.xml
new file mode 100644
index 0000000..390cef0
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-km/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"ការកំណត់"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"ការកំណត់រចនាសម្ព័ន្ធក្រុមហ៊ុនសេវាទូរសព្ទ"</string>
+ <string name="label_service" msgid="2668963955237345578">"ការកំណត់រចនាសម្ព័ន្ធសេវាកម្ម"</string>
+ <string name="label_test" msgid="8425079572898571918">"ការកំណត់រចនាសម្ព័ន្ធការធ្វើតេស្ត"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"កំពុងដំណើរការ"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"ចាកចេញ"</string>
+ <string name="label_test_result" msgid="892984695972956196">"លទ្ធផលធ្វើតេស្ត"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"កំណត់ឡើងវិញ"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"រួចរាល់"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"ឈ្មោះកញ្ចប់នៃសេវាកម្ម GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"រយៈពេលដែលត្រូវបញ្ចេញសេវាកម្ម បន្ទាប់ពីហៅទូរសព្ទ"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"ប្រភេទកម្មវិធី UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"មុខងារកម្មវិធីបណ្ដាញ (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"បង្ខំ Bootstrapping ឬ?"</string>
+ <string name="request_org" msgid="8416693445448308975">"កូដរៀបចំ"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"លេខសម្គាល់ប្រូតូកូលសុវត្ថិភាព UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"លេខសម្គាល់កម្មវិធីកញ្ចប់ TLS Cipher"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA Auth ជោគជ័យដែរទេ?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"លេខសម្គាល់មូលហេតុដែលមិនដំណើរការ"</string>
+ <string name="response_key" msgid="8839847772051686309">"គ្រាប់ចុច GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"ព័ត៌មានសម្គាល់ប្រតិបត្តិការ Bootstrapping (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-kn/strings.xml b/testapps/GbaTestApp/res/values-kn/strings.xml
new file mode 100644
index 0000000..d37f0f5
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-kn/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"ವಾಹಕ ಕಾನ್ಫಿಗ್"</string>
+ <string name="label_service" msgid="2668963955237345578">"ಸೇವೆ ಕಾನ್ಫಿಗ್"</string>
+ <string name="label_test" msgid="8425079572898571918">"ಪರೀಕ್ಷಾ ಕಾನ್ಫಿಗ್"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"ರನ್ನಿಂಗ್"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"ನಿರ್ಗಮಿಸಿ"</string>
+ <string name="label_test_result" msgid="892984695972956196">"ಪರೀಕ್ಷಾ ಫಲಿತಾಂಶ"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"ಮರುಹೊಂದಿಸಿ"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"ಮುಗಿದಿದೆ"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA ಸೇವೆಯ ಪ್ಯಾಕೇಜ್ ಹೆಸರು"</string>
+ <string name="service_release_time" msgid="532937496122890892">"ಕರೆ ಮಾಡಿದ ನಂತರ ಎಷ್ಟು ಸಮಯದವರೆಗೆ ಸೇವೆಯನ್ನು ಬಿಡುಗಡೆ ಮಾಡುವುದು"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC ಆ್ಯಪ್ ಪ್ರಕಾರ"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"ನೆಟ್ವರ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ ಫಂಕ್ಷನ್ (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"ಬೂಟ್ ಸ್ಟ್ರಾಪಿಂಗ್ ಸ್ಥಗಿತಗೊಳಿಸುವುದೇ?"</string>
+ <string name="request_org" msgid="8416693445448308975">"ಸಂಸ್ಥೆ ಕೋಡ್"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA ಭದ್ರತಾ ಪ್ರೊಟೊಕಾಲ್ ಐಡಿ"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS ಸೈಫರ್ ಸೂಟ್ ಐಡಿ"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA ಪ್ರಮಾಣೀಕರಣ ಯಶಸ್ವಿಯಾಗಿದೆಯೇ?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ವಿಫಲವಾದ ಕಾರಣ ಐಡಿ"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA ಕೀ (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"ಬೂಟ್ ಸ್ಟ್ರಾಪಿಂಗ್ ವಹಿವಾಟು ಗುರುತಿಸುವಿಕೆ (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-ml/strings.xml b/testapps/GbaTestApp/res/values-ml/strings.xml
new file mode 100644
index 0000000..bc93aa3
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-ml/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"ക്രമീകരണം"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"കാരിയർ കോൺഫിഗറേഷൻ"</string>
+ <string name="label_service" msgid="2668963955237345578">"സർവീസ് കോൺഫിഗറേഷൻ"</string>
+ <string name="label_test" msgid="8425079572898571918">"ടെസ്റ്റ് കോൺഫിഗറേഷൻ"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"റൺ ചെയ്യുന്നു"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"പുറത്ത് കടക്കുക"</string>
+ <string name="label_test_result" msgid="892984695972956196">"ടെസ്റ്റ് ഫലം"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"റീസെറ്റ് ചെയ്യുക"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"പൂർത്തിയായി"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA സേവനത്തിന്റെ പാക്കേജ് പേര്"</string>
+ <string name="service_release_time" msgid="532937496122890892">"കോൾ ചെയ്തതിന് ശേഷം സേവനം റിലീസ് ചെയ്യാൻ എത്ര സമയമെടുക്കും"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC ആപ്പ് തരം"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"നെറ്റ്വർക്ക് അപ്ലിക്കേഷൻ ഫംഗ്ഷൻ (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"ബലം പ്രയോഗിച്ച് ബൂട്ട്സ്ട്രാപ്പിംഗ് ചെയ്യണോ?"</string>
+ <string name="request_org" msgid="8416693445448308975">"സ്ഥാപനത്തിന്റെ കോഡ്"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA സുരക്ഷാ പ്രോട്ടോക്കോൾ ഐഡി"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS സെെഫർ സ്വീറ്റ് ഐഡി"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA പരിശോധിച്ചുറപ്പിക്കൽ വിജയകരമായിരുന്നോ?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"പരാജയ കാരണ ഐഡി"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA കീ (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"ബൂട്ട്സ്ട്രാപ്പിംഗ് ട്രാൻസാക്ഷൻ ഐഡന്റിഫയർ (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-ms/strings.xml b/testapps/GbaTestApp/res/values-ms/strings.xml
new file mode 100644
index 0000000..35838b7
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-ms/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Tetapan"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Konfigurasi Pembawa"</string>
+ <string name="label_service" msgid="2668963955237345578">"Konfigurasi Perkhidmatan"</string>
+ <string name="label_test" msgid="8425079572898571918">"Konfigurasi Ujian"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Berjalan"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Keluar"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Keputusan Ujian"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Tetapkan semula"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Selesai"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Nama pakej perkhidmatan GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Tempoh untuk mengaktifkan perkhidmatan selepas panggilan"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Jenis Apl UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL fungsi aplikasi rangkaian (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Paksa Butstrap?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Kod Organisasi"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"ID Protokol Keselamatan UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"ID Suite Sifer TLS"</string>
+ <string name="response_success" msgid="2469204471244527663">"Pengesahan GBA Berjaya?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ID Sebab Gagal"</string>
+ <string name="response_key" msgid="8839847772051686309">"Kunci GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Pengecam Transaksi Butstrap (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-pt/strings.xml b/testapps/GbaTestApp/res/values-pt/strings.xml
new file mode 100644
index 0000000..cf4ea72
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-pt/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Configurações"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Configurações da operadora"</string>
+ <string name="label_service" msgid="2668963955237345578">"Configurações do serviço"</string>
+ <string name="label_test" msgid="8425079572898571918">"Configurações de teste"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Executando"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Sair"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Resultado do teste"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Redefinir"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Concluído"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Nome do pacote de serviços da GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Tempo para liberar o serviço após a chamada"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Tipo de app UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL da função de aplicativo de rede (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Forçar inicialização?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Código da organização"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"ID do protocolo de segurança UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"ID do pacote de criptografia TLS"</string>
+ <string name="response_success" msgid="2469204471244527663">"Autenticação da GBA concluída?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ID do motivo da falha"</string>
+ <string name="response_key" msgid="8839847772051686309">"Chave de segurança da GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Identificador de transações de inicialização (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-ro/strings.xml b/testapps/GbaTestApp/res/values-ro/strings.xml
new file mode 100644
index 0000000..d7f9e7b
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-ro/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Setări"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Configurația operatorului"</string>
+ <string name="label_service" msgid="2668963955237345578">"Configurația serviciului"</string>
+ <string name="label_test" msgid="8425079572898571918">"Configurație de testare"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Rulează"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Ieșiți"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Rezultatul testului"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Resetați"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Terminat"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Numele de pachet al serviciului GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Durata până la lansarea serviciului după apel"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Tipul aplicației UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"Adresa URL pentru funcția aplicației pentru rețea (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Forțați inițializarea?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Cod organizațional"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"ID-ul protocolului de securitate pentru Google Analytics universal"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"ID-ul suitei TLS Cipher"</string>
+ <string name="response_success" msgid="2469204471244527663">"Succes la autentificarea GBA?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ID-ul motivului eșecului"</string>
+ <string name="response_key" msgid="8839847772051686309">"Cheie GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Se inițializează identificatorul tranzacției (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-ru/strings.xml b/testapps/GbaTestApp/res/values-ru/strings.xml
new file mode 100644
index 0000000..a5d0bff
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-ru/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Настройки"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Конфигурация оператора связи"</string>
+ <string name="label_service" msgid="2668963955237345578">"Конфигурация сервиса"</string>
+ <string name="label_test" msgid="8425079572898571918">"Тестовая конфигурация"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Выполняется"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Выйти"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Результат тестирования"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Сбросить"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Готово"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Название пакета сервиса GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Через какое время освобождать сервис после вызова"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Тип приложения UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL функции сетевого приложения (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Включить начальную загрузку принудительно?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Код организации"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"Идентификатор протокола безопасности UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"Идентификатор шифронабора TLS"</string>
+ <string name="response_success" msgid="2469204471244527663">"Авторизация GBA выполнена?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Идентификатор причины сбоя"</string>
+ <string name="response_key" msgid="8839847772051686309">"Ключ GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Идентификатор транзакции начальной загрузки (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-si/strings.xml b/testapps/GbaTestApp/res/values-si/strings.xml
new file mode 100644
index 0000000..7a66d1f
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-si/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"සැකසීම්"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"වාහකය වින්යාසය"</string>
+ <string name="label_service" msgid="2668963955237345578">"සේවා වින්යාසය"</string>
+ <string name="label_test" msgid="8425079572898571918">"පරීක්ෂණ වින්යාසය"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"ධාවනය වේ"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"පිටවන්න"</string>
+ <string name="label_test_result" msgid="892984695972956196">"පරීක්ෂණ ප්රතිඵලය"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"යළි පිහිටුවන්න"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"නිමයි"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA සේවාවෙහි පැකේජයේ නම"</string>
+ <string name="service_release_time" msgid="532937496122890892">"ඇමතුමෙන් පසු සේවාව මුදා හැරීමට කාලය"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC යෙදුම් වර්ගය"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"ජාල යෙදුම් කාර්යය (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"ඇරඹුම් පටිය බලාත්මක කරන්න ද?"</string>
+ <string name="request_org" msgid="8416693445448308975">"සංවිධාන කේතය"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA ආරක්ෂක ප්රොටොකෝල ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS කේතාංක කට්ටල ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA සත්යාපනය සාර්ථක ද?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"අසමත් හේතුව ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA යතුර (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"ඇරඹුම් පටි ගනුදෙනු හැඳුනුම්කාරකය (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-sl/strings.xml b/testapps/GbaTestApp/res/values-sl/strings.xml
new file mode 100644
index 0000000..6e3196b
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-sl/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Nastavitve"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Konfiguracija operaterja"</string>
+ <string name="label_service" msgid="2668963955237345578">"Konfiguracija storitve"</string>
+ <string name="label_test" msgid="8425079572898571918">"Preizkusi konfiguracijo"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Se izvaja"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Zapri"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Rezultat preizkusa"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Ponastavi"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Končano"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Ime paketa storitve GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Čas, preden se storitev aktivira po klicanju"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Vrsta aplikacije UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL funkcije uporabe v omrežju (NAF – Network application function)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Želite vsiliti zagon?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Koda organizacije"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"ID varnostnega protokola za UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"ID zbirke šifriranja TLS"</string>
+ <string name="response_success" msgid="2469204471244527663">"Je preverjanje pristnosti GBA uspelo?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ID vzroka za napako"</string>
+ <string name="response_key" msgid="8839847772051686309">"Ključ GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Identifikator transakcije zagona (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-sr/strings.xml b/testapps/GbaTestApp/res/values-sr/strings.xml
new file mode 100644
index 0000000..9d8cbd6
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-sr/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Подешавања"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Конфигурација мобилног оператера"</string>
+ <string name="label_service" msgid="2668963955237345578">"Конфигурација услуге"</string>
+ <string name="label_test" msgid="8425079572898571918">"Пробна конфигурација"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Активно"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Затвори"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Резултат теста"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Ресетуј"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Готово"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Назив пакета услуге GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Време док се услуга не активира после позива"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Тип UICC апликације"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL функције мрежне апликације (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Желите ли да наметнете самостално узорковање?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Кôд организације"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"ИД безбедносног протокола универзалне аналитике"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"ИД TLS пакета за шифровање"</string>
+ <string name="response_success" msgid="2469204471244527663">"Да ли је потврда идентитета за GBA успела?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ИД разлога за неуспех"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA тастер (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Идентификатор трансакције за самостално узорковање (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-te/strings.xml b/testapps/GbaTestApp/res/values-te/strings.xml
new file mode 100644
index 0000000..7434bca
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-te/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"సెట్టింగ్లు"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"క్యారియర్ కాన్ఫిగరేషన్"</string>
+ <string name="label_service" msgid="2668963955237345578">"సర్వీస్ కాన్ఫిగరేషన్"</string>
+ <string name="label_test" msgid="8425079572898571918">"పరీక్ష కాన్ఫిగరేషన్"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"రన్ అవుతోంది"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"నిష్క్రమించు"</string>
+ <string name="label_test_result" msgid="892984695972956196">"పరీక్ష ఫలితం"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"రీసెట్ చేయి"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"పూర్తయింది"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA సర్వీస్ ప్యాకేజీ పేరు"</string>
+ <string name="service_release_time" msgid="532937496122890892">"కాల్ చేసిన తర్వాత సర్వీస్ను రిలీజ్ చేయడానికి ఎంత సమయం పడుతుంది"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC యాప్ రకం"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"నెట్వర్క్ యాప్ ఫంక్షన్ (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"బూట్స్ట్రాపింగ్ ఫోర్స్ చేయాలా?"</string>
+ <string name="request_org" msgid="8416693445448308975">"సంస్థ కోడ్"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA సెక్యూరిటీ ప్రోటోకాల్ ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS సైఫర్ Suite ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA Auth విజయవంతమైందా?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"వైఫల్యానికి కారణమైన ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA కీ (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"బూట్స్ట్రాపింగ్ ట్రాన్జాక్షన్ ఐడెంటిఫయర్ (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-th/strings.xml b/testapps/GbaTestApp/res/values-th/strings.xml
new file mode 100644
index 0000000..4e58913
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-th/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"การตั้งค่า"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"กำหนดผู้ให้บริการ"</string>
+ <string name="label_service" msgid="2668963955237345578">"กำหนดบริการ"</string>
+ <string name="label_test" msgid="8425079572898571918">"กำหนดการทดสอบ"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"วิ่ง"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"ออก"</string>
+ <string name="label_test_result" msgid="892984695972956196">"ผลการทดสอบ"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"รีเซ็ต"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"เสร็จ"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"ชื่อแพ็กเกจบริการ GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"ระยะเวลาที่จะให้บริการหลังจากโทร"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"ประเภทแอป UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL ของ Network Application Function (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"บังคับให้เริ่มต้นไหม"</string>
+ <string name="request_org" msgid="8416693445448308975">"รหัสองค์กร"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"รหัสโปรโตคอลความปลอดภัยของ UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"รหัสของ TLS Cipher Suite"</string>
+ <string name="response_success" msgid="2469204471244527663">"การตรวจสอบสิทธิ์ GBA สำเร็จไหม"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"รหัสเหตุผลที่ล้มเหลว"</string>
+ <string name="response_key" msgid="8839847772051686309">"คีย์ GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Bootstrapping Transaction Identifier (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-tl/strings.xml b/testapps/GbaTestApp/res/values-tl/strings.xml
new file mode 100644
index 0000000..d96464b
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-tl/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Mga Setting"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Config ng Carrier"</string>
+ <string name="label_service" msgid="2668963955237345578">"Config ng Serbisyo"</string>
+ <string name="label_test" msgid="8425079572898571918">"Config ng Pagsubok"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Tumatakbo"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Lumabas"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Resulta ng Pagsubok"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"I-reset"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Tapos na"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Pangalan ng package ng serbisyo ng GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Gaano katagal ire-release ang serbisyo pagkatapos ng pagtawag"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Uri ng UICC App"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"URL ng Network application function (NAF)"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Puwersahin ang Pag-bootstrap?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Organization Code"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"Security Protocol ID ng UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"Suite ID ng TLS Cipher"</string>
+ <string name="response_success" msgid="2469204471244527663">"Matagumpay ba ang GBA Auth?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ID ng Dahilan ng Pagkabigo"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA Key (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Bootstrapping Transaction Identifier (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-tr/strings.xml b/testapps/GbaTestApp/res/values-tr/strings.xml
new file mode 100644
index 0000000..8078563
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-tr/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Ayarlar"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Operatör Yapılandırması"</string>
+ <string name="label_service" msgid="2668963955237345578">"Hizmet Yapılandırması"</string>
+ <string name="label_test" msgid="8425079572898571918">"Test Yapılandırması"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Çalışıyor"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Çık"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Test Sonucu"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Sıfırla"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Bitti"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA hizmetinin paket adı"</string>
+ <string name="service_release_time" msgid="532937496122890892">"API çağrısından sonra hizmetin ne süreyle serbest bırakılacağı"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC Uygulaması Türü"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"Ağ uygulaması işlevi (NAF) URL\'si"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Önyüklemeye Zorlansın mı?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Kuruluş Kodu"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA Güvenlik Protokolü Kimliği"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS Şifre Paketi Kimliği"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA Kimlik Doğrulaması Başarılı mı?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Hata Nedeni Kimliği"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA Anahtarı (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Önyükleme İşlem Tanımlayıcısı (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-ur/strings.xml b/testapps/GbaTestApp/res/values-ur/strings.xml
new file mode 100644
index 0000000..26e5c04
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-ur/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"ترتیبات"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"کیریئر کنفیگریشن"</string>
+ <string name="label_service" msgid="2668963955237345578">"سروس کنفیگریشن"</string>
+ <string name="label_test" msgid="8425079572898571918">"ٹیسٹ کنفیگریشن"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"دوڑ"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"باہر نکلیں"</string>
+ <string name="label_test_result" msgid="892984695972956196">"ٹیسٹ کا نتیجہ"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"ری سیٹ کریں"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"ہو گیا"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA سروس کا پیکیج نام"</string>
+ <string name="service_release_time" msgid="532937496122890892">"فون کرنے کے بعد سروس کب تک ریلیز کی جائے"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC ایپ کی قسم"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"نیٹ ورک ایپلیکیشن فنکشن (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"بوٹ اسٹراپنگ فورس کریں؟"</string>
+ <string name="request_org" msgid="8416693445448308975">"آرگنائزیشن کوڈ"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA سکیورٹی پروٹوکول ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS Cipher سوئیٹ ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA کی توثیق کامیاب کریں؟"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"ناکامی کی وجہ ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA کلید (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"بوٹ اسٹراپنگ ٹرانزیکشن شناخت کار (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-uz/strings.xml b/testapps/GbaTestApp/res/values-uz/strings.xml
new file mode 100644
index 0000000..6d86a51
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-uz/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Sozlamalar"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Aloqa operatorini sozlash"</string>
+ <string name="label_service" msgid="2668963955237345578">"Xizmatni sozlash"</string>
+ <string name="label_test" msgid="8425079572898571918">"Sinovli sozlash"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Bajarilmoqda"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Chiqish"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Sinov natijalari"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Asliga qaytarish"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Tayyor"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA xizmati paketi nomi"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Chaqiruvdan keyin xizmatni bo‘shatish uchun vaqt oralig‘i"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC ilovasi turi"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"Tarmoq ilovasi funksiyasining (NAF) URL manzili"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Avtomatik yuklash majburiy yoqilsinmi?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Tashkilot kodi"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA xavfsizlik protokoli identifikatori"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS shifrli terish identifikatori"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA tekshiruvi bajarildimi?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"Nosozlik sababi identifikatori"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA kaliti (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"Avtomatik yuklash tranzaksiyasining identifikatori (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-zh-rCN/strings.xml b/testapps/GbaTestApp/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..0229222
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-zh-rCN/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"设置"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"运营商配置"</string>
+ <string name="label_service" msgid="2668963955237345578">"服务配置"</string>
+ <string name="label_test" msgid="8425079572898571918">"测试配置"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"正在运行"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"退出"</string>
+ <string name="label_test_result" msgid="892984695972956196">"测试结果"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"重置"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"完成"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA 服务的软件包名称"</string>
+ <string name="service_release_time" msgid="532937496122890892">"通话后释放服务所需的时间"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC 应用类型"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"网络应用功能 (NAF) 网址"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"要强制使用引导吗?"</string>
+ <string name="request_org" msgid="8416693445448308975">"单位代码"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA 安全协议 ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"传输层安全协议 (TLS) 加密套件 ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA 身份验证成功了吗?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"失败原因 ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA 密钥 (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"引导事务标识符 (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-zh-rHK/strings.xml b/testapps/GbaTestApp/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..eb93a5d
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-zh-rHK/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"設定"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"流動網絡供應商設定"</string>
+ <string name="label_service" msgid="2668963955237345578">"服務設定"</string>
+ <string name="label_test" msgid="8425079572898571918">"測試設定"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"正在執行"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"結束"</string>
+ <string name="label_test_result" msgid="892984695972956196">"測試結果"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"重設"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"完成"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"GBA 服務套件名稱"</string>
+ <string name="service_release_time" msgid="532937496122890892">"調用後多久才釋出服務"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"UICC 應用程式類型"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"網絡應用功能 (NAF) 網址"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"要強制啟動嗎?"</string>
+ <string name="request_org" msgid="8416693445448308975">"機構代碼"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"UA 安全性通訊協定 ID"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS 密碼套件 ID"</string>
+ <string name="response_success" msgid="2469204471244527663">"GBA 驗證成功?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"失敗原因 ID"</string>
+ <string name="response_key" msgid="8839847772051686309">"GBA 鍵 (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"啟動交易識別碼 (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values-zu/strings.xml b/testapps/GbaTestApp/res/values-zu/strings.xml
new file mode 100644
index 0000000..8a221a2
--- /dev/null
+++ b/testapps/GbaTestApp/res/values-zu/strings.xml
@@ -0,0 +1,32 @@
+<?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="2922839697457005451">"I-GbaTestApp"</string>
+ <string name="label_settings" msgid="8030871890526865502">"Amasethingi"</string>
+ <string name="label_carrier" msgid="1470455313066422804">"Ukulungiswa Kwenkampani Yenethiwekhi"</string>
+ <string name="label_service" msgid="2668963955237345578">"Ukulungiswa Kwesevisi"</string>
+ <string name="label_test" msgid="8425079572898571918">"Ukulungiswa Kohlolo"</string>
+ <string name="button_name_running" msgid="4557363091224858010">"Uyagijima"</string>
+ <string name="button_name_exit" msgid="8025683733431538975">"Phuma"</string>
+ <string name="label_test_result" msgid="892984695972956196">"Umphumela wokuhlolwa"</string>
+ <string name="button_name_clear" msgid="436313515327318537">"Setha kabusha"</string>
+ <string name="button_name_done" msgid="6030406534322497491">"Kwenziwe"</string>
+ <string name="title_activity_carrier_config" msgid="7807803900475957717">"I-CarrierConfigActivity"</string>
+ <string name="title_activity_service_config" msgid="5394662739555577279">"I-ServiceConfigActivity"</string>
+ <string name="title_activity_test_config" msgid="7585204485536359713">"I-TestConfigActivity"</string>
+ <string name="service_package_name" msgid="7204809439090483315">"Igama lephakheji lesevisi ye-GBA"</string>
+ <string name="service_release_time" msgid="532937496122890892">"Uyikhulula isikhathi eside kangakanani isevisi ngemuva kokushaya"</string>
+ <string name="request_app_type" msgid="3975978141673475612">"Uhlobo Lohlelo Lokusebenza lwe-UICC"</string>
+ <string name="request_naf_url" msgid="4487793541217737042">"Umsebenzi wohlelo lokusebenza lenethiwekhi (NAF) URL"</string>
+ <string name="request_force_bootstrapping" msgid="206043602616214325">"Phoqelela i-Bootstrapping?"</string>
+ <string name="request_org" msgid="8416693445448308975">"Ikhodi yenhlangano"</string>
+ <string name="request_security_protocol" msgid="1444164827561010482">"I-ID Yephrothokholi Yokuphepha ye-UA"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"I-ID ye-TLS Cipher Suite"</string>
+ <string name="response_success" msgid="2469204471244527663">"Ukuphumelela kwe-GBA Auth?"</string>
+ <string name="response_fail_reason" msgid="3401426967253202496">"I-ID Yesizathu Sokwahluleka"</string>
+ <string name="response_key" msgid="8839847772051686309">"Ukhiye we-GBA (CK + IK)"</string>
+ <string name="response_btid" msgid="2550216722679350756">"I-Bootstrapping Transaction Identifier (B-TID)"</string>
+ <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
+ <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
+ <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
+</resources>
diff --git a/testapps/GbaTestApp/res/values/colors.xml b/testapps/GbaTestApp/res/values/colors.xml
new file mode 100644
index 0000000..f8c6127
--- /dev/null
+++ b/testapps/GbaTestApp/res/values/colors.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <color name="purple_200">#FFBB86FC</color>
+ <color name="purple_500">#FF6200EE</color>
+ <color name="purple_700">#FF3700B3</color>
+ <color name="teal_200">#FF03DAC5</color>
+ <color name="teal_700">#FF018786</color>
+ <color name="black">#FF000000</color>
+ <color name="white">#FFFFFFFF</color>
+</resources>
\ No newline at end of file
diff --git a/testapps/GbaTestApp/res/values/strings.xml b/testapps/GbaTestApp/res/values/strings.xml
new file mode 100644
index 0000000..e74c181
--- /dev/null
+++ b/testapps/GbaTestApp/res/values/strings.xml
@@ -0,0 +1,30 @@
+<resources>
+ <string name="app_name">GbaTestApp</string>
+ <string name="label_settings">Settings</string>
+ <string name="label_carrier">Carrier Config</string>
+ <string name="label_service">Service Config</string>
+ <string name="label_test">Test Config</string>
+ <string name="button_name_running">Running</string>
+ <string name="button_name_exit">Exit</string>
+ <string name="label_test_result">Test Result</string>
+ <string name="button_name_clear">Reset</string>
+ <string name="button_name_done">Done</string>
+ <string name="title_activity_carrier_config">CarrierConfigActivity</string>
+ <string name="title_activity_service_config">ServiceConfigActivity</string>
+ <string name="title_activity_test_config">TestConfigActivity</string>
+ <string name="service_package_name">Package name of GBA service</string>
+ <string name="service_release_time">How long to release service after calling</string>
+ <string name="request_app_type">UICC App Type</string>
+ <string name="request_naf_url">Network application function (NAF) URL</string>
+ <string name="request_force_bootstrapping">Force Bootstrapping?</string>
+ <string name="request_org">Organization Code</string>
+ <string name="request_security_protocol">UA Security Protocol ID</string>
+ <string name="request_tls_cipher_suite">TLS Cipher Suite ID</string>
+ <string name="response_success">GBA Auth Success?</string>
+ <string name="response_fail_reason">Fail Reason ID</string>
+ <string name="response_key">GBA Key (CK + IK)</string>
+ <string name="response_btid">Bootstrapping Transaction Identifier (B-TID)</string>
+ <string name="sample_naf">3GPP-bootstrapping@naf1.operator.com</string>
+ <string name="sample_btid">(B-TID)</string>
+ <string name="sample_key">6629fae49393a05397450978507c4ef1</string>
+</resources>
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/MainActivity.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/MainActivity.java
new file mode 100644
index 0000000..72cbf5c
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/MainActivity.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp;
+
+import android.os.Bundle;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.android.phone.testapps.gbatestapp.ui.main.MainFragment;
+
+/** main activity of the gba test app */
+public class MainActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main_activity);
+ if (savedInstanceState == null) {
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.container, MainFragment.newInstance())
+ .commitNow();
+ }
+ }
+}
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/Settings.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/Settings.java
new file mode 100644
index 0000000..eaa424a
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/Settings.java
@@ -0,0 +1,309 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.RemoteException;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyFrameworkInitializer;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.telephony.ITelephony;
+
+import java.util.Locale;
+
+/** class to load and save the settings */
+public class Settings {
+
+ private static final String TAG = "SETTINGS";
+
+ private static final String PREF_CARRIER_CONFIG = "pref_carrier_config";
+ private static final String KEY_SERVICE_PACKAGE = "key_service_package";
+ private static final String KEY_RELEASE_TIME = "key_release_time";
+
+ private static final String PREF_TEST_CONFIG = "pref_test_config";
+ private static final String KEY_APP_TYPE = "key_app_type";
+ private static final String KEY_NAF_URL = "key_naf_url";
+ private static final String KEY_FORCE_BT = "key_force_bt";
+ private static final String KEY_ORG = "org";
+ private static final String KEY_SP_ID = "key_sp_id";
+ private static final String KEY_TLS_CS = "key_tls_cs";
+
+ private static final String PREF_SERVICE_CONFIG = "pref_carrier_config";
+ private static final String KEY_AUTH_RESULT = "key_auth_result";
+ private static final String KEY_GBA_KEY = "key_gba_key";
+ private static final String KEY_B_TID = "key_b_tid";
+ private static final String KEY_FAIL_REASON = "key_fail_reason";
+
+ private ITelephony mTelephony;
+ private int mSubId;
+ private String mServicePackageName;
+ private int mReleaseTime;
+ private int mAppType;
+ private String mNafUrl;
+ private boolean mForceBootstrap;
+ private int mOrg;
+ private int mSpId;
+ private int mTlsCs;
+ private boolean mIsAuthSuccess;
+ private String mGbaKey;
+ private String mBTid;
+ private int mFailReason;
+
+ private static Settings sInstance;
+
+ private Settings(Context cxt) {
+ mTelephony = ITelephony.Stub.asInterface(TelephonyFrameworkInitializer
+ .getTelephonyServiceManager().getTelephonyServiceRegisterer().get());
+ mSubId = SubscriptionManager.getDefaultSubscriptionId();
+ SharedPreferences sharedPref = cxt.getSharedPreferences(
+ PREF_CARRIER_CONFIG, Context.MODE_PRIVATE);
+ mServicePackageName = loadServicePackageName(mSubId, sharedPref);
+ mReleaseTime = loadReleaseTime(mSubId, sharedPref);
+
+ sharedPref = cxt.getSharedPreferences(PREF_TEST_CONFIG, Context.MODE_PRIVATE);
+ mAppType = sharedPref.getInt(KEY_APP_TYPE, TelephonyManager.APPTYPE_SIM);
+ mNafUrl = sharedPref.getString(KEY_NAF_URL, null);
+ mForceBootstrap = sharedPref.getBoolean(KEY_FORCE_BT, false);
+ mOrg = sharedPref.getInt(KEY_ORG, 0);
+ mSpId = sharedPref.getInt(KEY_SP_ID, 0);
+ mTlsCs = sharedPref.getInt(KEY_TLS_CS, 0);
+
+ sharedPref = cxt.getSharedPreferences(PREF_SERVICE_CONFIG, Context.MODE_PRIVATE);
+ mIsAuthSuccess = sharedPref.getBoolean(KEY_AUTH_RESULT, false);
+ mFailReason = sharedPref.getInt(KEY_FAIL_REASON, 0);
+ mGbaKey = sharedPref.getString(KEY_GBA_KEY, null);
+ mBTid = sharedPref.getString(KEY_B_TID, null);
+ }
+
+ /** Get the instance of Settings*/
+ public static Settings getSettings(Context cxt) {
+ if (sInstance == null) {
+ sInstance = new Settings(cxt);
+ }
+
+ return sInstance;
+ }
+
+ /** update carrier config settings */
+ public void updateCarrierConfig(Context cxt, String packageName, int releaseTime) {
+ new Thread(() -> {
+ synchronized (PREF_CARRIER_CONFIG) {
+
+ if (TextUtils.equals(mServicePackageName, packageName)
+ && (mReleaseTime == releaseTime)) {
+ return;
+ }
+
+ if (!TextUtils.equals(mServicePackageName, packageName)) {
+ mServicePackageName = packageName;
+
+ try {
+ mTelephony.setBoundGbaServiceOverride(mSubId, packageName);
+ } catch (RemoteException e) {
+ Log.e(TAG, "fail to set package name due to " + e);
+ }
+
+ }
+
+ if (mReleaseTime != releaseTime) {
+ mReleaseTime = releaseTime;
+
+ try {
+ mTelephony.setGbaReleaseTimeOverride(mSubId, releaseTime);
+ } catch (RemoteException e) {
+ Log.e(TAG, "fail to set release time due to " + e);
+ }
+ }
+
+ SharedPreferences sharedPref = cxt.getSharedPreferences(
+ PREF_CARRIER_CONFIG, Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sharedPref.edit();
+ editor.putString(KEY_SERVICE_PACKAGE, packageName);
+ editor.putInt(KEY_RELEASE_TIME, releaseTime);
+ editor.commit();
+ }
+ }).start();
+ }
+
+ /** get the config of gba service package name */
+ public String getServicePackageName() {
+ synchronized (PREF_CARRIER_CONFIG) {
+ return mServicePackageName;
+ }
+ }
+
+ /** get the config of gba release time */
+ public int getReleaseTime() {
+ synchronized (PREF_CARRIER_CONFIG) {
+ return mReleaseTime;
+ }
+ }
+
+ /** get the config of gba service package name used for now*/
+ public String loadServicePackageName(int subId, SharedPreferences sharedPref) {
+ try {
+ return mTelephony.getBoundGbaService(subId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "fail to get package name due to " + e);
+ }
+ return sharedPref != null ? sharedPref.getString(KEY_SERVICE_PACKAGE, null) : null;
+ }
+
+ /** get the config of gba release time used for now */
+ public int loadReleaseTime(int subId, SharedPreferences sharedPref) {
+ try {
+ return mTelephony.getGbaReleaseTime(subId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "fail to get package name due to " + e);
+ }
+ return sharedPref != null ? sharedPref.getInt(KEY_RELEASE_TIME, 0) : 0;
+ }
+
+ /** update the config of test gba service */
+ public void updateServiceConfig(Context cxt, boolean success, int reason,
+ String key, String btId) {
+ new Thread(() -> {
+ synchronized (PREF_SERVICE_CONFIG) {
+ mIsAuthSuccess = success;
+ mFailReason = reason;
+ mGbaKey = key;
+ mBTid = btId;
+ SharedPreferences sharedPref = cxt.getSharedPreferences(
+ PREF_SERVICE_CONFIG, Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sharedPref.edit();
+ editor.putBoolean(KEY_AUTH_RESULT, success);
+ editor.putInt(KEY_FAIL_REASON, reason);
+ editor.putString(KEY_GBA_KEY, key);
+ editor.putString(KEY_B_TID, btId);
+ editor.commit();
+ }
+ }).start();
+ }
+
+ /** get the config of the authentication result */
+ public boolean getAuthResult() {
+ synchronized (PREF_SERVICE_CONFIG) {
+ return mIsAuthSuccess;
+ }
+ }
+
+ /** get the config of authentication fail cause */
+ public int getFailReason() {
+ synchronized (PREF_SERVICE_CONFIG) {
+ return mFailReason;
+ }
+ }
+
+ /** get the config of GBA key */
+ public String getGbaKey() {
+ synchronized (PREF_SERVICE_CONFIG) {
+ return mGbaKey;
+ }
+ }
+
+ /** get the config of B-Tid */
+ public String getBTid() {
+ synchronized (PREF_SERVICE_CONFIG) {
+ return mBTid;
+ }
+ }
+
+ /** update the config of the test */
+ public void updateTestConfig(Context cxt, int appType, String url,
+ boolean force, int org, int spId, int tlsCs) {
+ new Thread(() -> {
+ synchronized (PREF_TEST_CONFIG) {
+ mAppType = appType;
+ mNafUrl = url;
+ mForceBootstrap = force;
+ mOrg = org;
+ mSpId = spId;
+ mTlsCs = tlsCs;
+
+ SharedPreferences sharedPref = cxt.getSharedPreferences(
+ PREF_TEST_CONFIG, Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sharedPref.edit();
+ editor.putInt(KEY_APP_TYPE, appType);
+ editor.putString(KEY_NAF_URL, url);
+ editor.putBoolean(KEY_FORCE_BT, force);
+ editor.putInt(KEY_ORG, org);
+ editor.putInt(KEY_SP_ID, spId);
+ editor.putInt(KEY_TLS_CS, tlsCs);
+ editor.commit();
+ }
+ }).start();
+ }
+
+ /** get the config of the uicc application type*/
+ public int getAppType() {
+ synchronized (PREF_TEST_CONFIG) {
+ return mAppType;
+ }
+ }
+
+ /** get the config of NAF url */
+ public String getNafUrl() {
+ synchronized (PREF_TEST_CONFIG) {
+ return mNafUrl;
+ }
+ }
+
+ /** get the config if bootstrap is forced */
+ public boolean isForceBootstrap() {
+ synchronized (PREF_TEST_CONFIG) {
+ return mForceBootstrap;
+ }
+ }
+
+ /** get the config of the organization code */
+ public int getOrg() {
+ synchronized (PREF_TEST_CONFIG) {
+ return mOrg;
+ }
+ }
+
+ /** get the config of the security protocol id */
+ public int getSpId() {
+ synchronized (PREF_TEST_CONFIG) {
+ return mSpId;
+ }
+ }
+
+ /** get the config of the tls ciper suite id */
+ public int getTlsCs() {
+ synchronized (PREF_TEST_CONFIG) {
+ return mTlsCs;
+ }
+ }
+
+ /** convert byte arry to hex string */
+ public static String byteArrayToHexString(byte[] data) {
+ if (data == null || data.length == 0) {
+ return "";
+ }
+
+ StringBuilder sb = new StringBuilder();
+ for (byte b : data) {
+ sb.append(String.format(Locale.US, "%02X", b));
+ }
+ return sb.toString();
+ }
+}
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/TestGbaService.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/TestGbaService.java
new file mode 100644
index 0000000..4b0636c
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/TestGbaService.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp;
+
+import android.annotation.NonNull;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.IBinder;
+import android.telephony.gba.GbaService;
+import android.util.Log;
+
+/** test GbaService to be used for Gba api test */
+public class TestGbaService extends GbaService {
+
+ private static final String TAG = "TestGbaService";
+
+ private Settings mSettings;
+
+ @Override
+ public void onCreate() {
+ Log.i(TAG, "TestGbaService: onCreate");
+ mSettings = Settings.getSettings(getApplicationContext());
+ }
+
+ @Override
+ public void onAuthenticationRequest(int subId, int token, int appType,
+ @NonNull Uri nafUrl, @NonNull byte[] securityProtocol, boolean forceBootStrapping) {
+ boolean isSuccess = mSettings.getAuthResult();
+ int reason = mSettings.getFailReason();
+ String key = mSettings.getGbaKey();
+ String btid = mSettings.getBTid();
+
+ if (isSuccess) {
+ reportKeysAvailable(token, key.getBytes(), btid);
+ } else {
+ reportAuthenticationFailure(token, reason);
+ }
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ Log.d(TAG, "onBind intent:" + intent);
+ return super.onBind(intent);
+ }
+
+ @Override
+ public void onDestroy() {
+ Log.d(TAG, "onDestroy!");
+ super.onDestroy();
+ }
+}
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/CarrierConfigFragment.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/CarrierConfigFragment.java
new file mode 100644
index 0000000..b0bfc32
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/CarrierConfigFragment.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp.ui.main;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.phone.testapps.gbatestapp.R;
+import com.android.phone.testapps.gbatestapp.Settings;
+import com.android.phone.testapps.gbatestapp.TestGbaService;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Use the {@link CarrierConfigFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class CarrierConfigFragment extends Fragment {
+ private static final String TAG = "CARRIER";
+
+ private static CarrierConfigFragment sInstance;
+
+ private Settings mSettings;
+ private EditText mEditPackageName;
+ private EditText mEditReleaseTime;
+
+ /** get the instance of CarrierConfigFragment */
+ public static CarrierConfigFragment newInstance() {
+ if (sInstance == null) {
+ Log.d(TAG, "new instance:");
+ sInstance = new CarrierConfigFragment();
+ }
+ return sInstance;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mSettings = Settings.getSettings(getActivity());
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ // Inflate the layout for this fragment
+ View viewHierarchy = inflater.inflate(R.layout.fragment_carrier_config, container, false);
+ mEditPackageName = viewHierarchy.findViewById(R.id.editServicePackageName);
+ mEditReleaseTime = viewHierarchy.findViewById(R.id.editServiceReleaseTime);
+ getConfig(false);
+
+ Button buttonDone = viewHierarchy.findViewById(R.id.carrier_config_done);
+ buttonDone.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mSettings.updateCarrierConfig(getActivity(),
+ mEditPackageName.getText().toString(),
+ Integer.parseInt(mEditReleaseTime.getText().toString()));
+ getFragmentManager().beginTransaction().remove(
+ CarrierConfigFragment.this).commitNow();
+ }
+ }
+ );
+
+ Button buttonClear = viewHierarchy.findViewById(R.id.carrier_config_clear);
+ buttonClear.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getConfig(true);
+ }
+ }
+ );
+ return viewHierarchy;
+ }
+
+ private void getConfig(boolean isDefault) {
+ String packagename = mSettings.getServicePackageName();
+ if (isDefault || packagename == null) {
+ packagename = TestGbaService.class.getPackage().getName();
+ }
+ mEditPackageName.setText(packagename);
+ mEditReleaseTime.setText(isDefault ? "0" : Integer.toString(mSettings.getReleaseTime()));
+ }
+}
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/MainFragment.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/MainFragment.java
new file mode 100644
index 0000000..ff50f5c
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/MainFragment.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp.ui.main;
+
+import android.content.Context;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.telephony.TelephonyManager;
+import android.telephony.gba.UaSecurityProtocolIdentifier;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.phone.testapps.gbatestapp.R;
+import com.android.phone.testapps.gbatestapp.Settings;
+
+/** main fragent to update settings and run the test */
+public class MainFragment extends Fragment {
+
+ private static final String TAG = "GBATestApp";
+ private static final String TAG_CARRIER = "carrier";
+ private static final String TAG_SERVICE = "service";
+ private static final String TAG_CLIENT = "client";
+
+ private static MainFragment sInstance;
+
+ private Settings mSettings;
+ private TelephonyManager mTelephonyManager;
+
+ /** Get the instance of MainFragment*/
+ public static MainFragment newInstance() {
+ if (sInstance == null) {
+ sInstance = new MainFragment();
+ }
+ return sInstance;
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ View viewHierarchy = inflater.inflate(R.layout.main_fragment, container, false);
+
+ Button buttonCarrier = viewHierarchy.findViewById(R.id.carrier_config_change_button);
+ buttonCarrier.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Fragment carrierFrag = getChildFragmentManager()
+ .findFragmentByTag(TAG_CARRIER);
+ if (carrierFrag == null) {
+ carrierFrag = CarrierConfigFragment.newInstance();
+ }
+ getChildFragmentManager()
+ .beginTransaction()
+ .replace(R.id.main, carrierFrag, TAG_CARRIER)
+ .commitNow();
+ }
+ }
+ );
+
+ Button buttonService = viewHierarchy.findViewById(R.id.service_config);
+ buttonService.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Fragment serviceFrag = getChildFragmentManager()
+ .findFragmentByTag(TAG_SERVICE);
+ if (serviceFrag == null) {
+ serviceFrag = ServiceConfigFragment.newInstance();
+ }
+ getChildFragmentManager()
+ .beginTransaction()
+ .replace(R.id.main, serviceFrag, TAG_SERVICE)
+ .commitNow();
+ }
+ }
+ );
+
+ Button buttonClient = viewHierarchy.findViewById(R.id.client_config);
+ buttonClient.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Fragment testFrag = getChildFragmentManager()
+ .findFragmentByTag(TAG_CLIENT);
+ if (testFrag == null) {
+ testFrag = TestConfigFragment.newInstance();
+ }
+
+ getChildFragmentManager()
+ .beginTransaction()
+ .replace(R.id.main, testFrag, TAG_CLIENT)
+ .commitNow();
+ }
+ }
+ );
+
+ Button buttonExit = viewHierarchy.findViewById(R.id.test_exit);
+ buttonExit.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getActivity().finish();
+ }
+ }
+ );
+
+ Button buttonRunning = viewHierarchy.findViewById(R.id.send_request);
+ buttonRunning.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Log.d(TAG, "starting test...");
+ TelephonyManager.BootstrapAuthenticationCallback cb = new
+ TelephonyManager.BootstrapAuthenticationCallback() {
+ @Override
+ public void onKeysAvailable(byte[] gbaKey, String btId) {
+ String result = "onKeysAvailable, key:"
+ + Settings.byteArrayToHexString(gbaKey)
+ + ", btid:" + btId;
+ Log.d(TAG, result);
+ getActivity().runOnUiThread(()-> {
+ mTestLog.append(result + "\n");
+ });
+ }
+
+ @Override
+ public void onAuthenticationFailure(int reason) {
+ String result = "onAuthFailure, cause:" + reason;
+ Log.d(TAG, result);
+ getActivity().runOnUiThread(
+ () -> mTestLog.append(result + "\n"));
+ }
+ };
+ UaSecurityProtocolIdentifier.Builder builder =
+ new UaSecurityProtocolIdentifier.Builder();
+ try {
+ if (mSettings.getOrg() != 0 || mSettings.getSpId() != 0
+ || mSettings.getTlsCs() != 0) {
+ builder.setOrg(mSettings.getOrg())
+ .setProtocol(mSettings.getSpId())
+ .setTlsCipherSuite(mSettings.getTlsCs());
+ }
+ } catch (IllegalArgumentException e) {
+ getActivity().runOnUiThread(() -> mTestLog.append(
+ "Fail to create UaSecurityProtocolIdentifier " + e + "\n"));
+ return;
+ }
+
+ UaSecurityProtocolIdentifier spId = builder.build();
+ Log.d(TAG, "bootstrapAuthenticationRequest with parameters [appType:"
+ + mSettings.getAppType() + ", NAF:" + mSettings.getNafUrl()
+ + ", spId:" + spId + ", isForceBootstrap:"
+ + mSettings.isForceBootstrap() + "]");
+ try {
+ mTelephonyManager.bootstrapAuthenticationRequest(
+ mSettings.getAppType(), Uri.parse(mSettings.getNafUrl()),
+ spId, mSettings.isForceBootstrap(),
+ AsyncTask.SERIAL_EXECUTOR, cb);
+ } catch (NullPointerException e) {
+ getActivity().runOnUiThread(() -> mTestLog.append(
+ "Invalid parameters, please check!" + "\n"));
+ }
+ }
+ }
+ );
+
+ return viewHierarchy;
+ }
+
+ TextView mTestLog;
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ mTelephonyManager = (TelephonyManager)
+ getContext().getSystemService(Context.TELEPHONY_SERVICE);
+ mSettings = Settings.getSettings(getContext());
+ mTestLog = getActivity().findViewById(R.id.viewTestOutput);
+ }
+
+}
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/ServiceConfigFragment.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/ServiceConfigFragment.java
new file mode 100644
index 0000000..5e7f2fa
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/ServiceConfigFragment.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp.ui.main;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.phone.testapps.gbatestapp.R;
+import com.android.phone.testapps.gbatestapp.Settings;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Use the {@link ServiceConfigFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class ServiceConfigFragment extends Fragment {
+
+ private static final String TAG = "SERVICE";
+
+ private static ServiceConfigFragment sInstance;
+
+ private Settings mSettings;
+
+ private CheckBox mAuthResult;
+ private EditText mGbaKey;
+ private EditText mBTid;
+ private EditText mFailReason;
+
+ /** get the instance of ServiceConfigFragment */
+ public static ServiceConfigFragment newInstance() {
+ if (sInstance == null) {
+ sInstance = new ServiceConfigFragment();
+ }
+ return sInstance;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mSettings = Settings.getSettings(getActivity());
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View viewHierarchy = inflater.inflate(R.layout.fragment_service_config, container, false);
+
+ mAuthResult = viewHierarchy.findViewById(R.id.checkBoxResult);
+ mFailReason = viewHierarchy.findViewById(R.id.editFailReason);
+ mGbaKey = viewHierarchy.findViewById(R.id.editKey);
+ mBTid = viewHierarchy.findViewById(R.id.editBTid);
+
+ setDefault();
+
+ Button buttonDone = viewHierarchy.findViewById(R.id.service_config_done);
+ buttonDone.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mSettings.updateServiceConfig(getActivity(), mAuthResult.isChecked(),
+ Integer.parseInt(mFailReason.getText().toString()),
+ mGbaKey.getText().toString(), mBTid.getText().toString());
+ getFragmentManager().beginTransaction()
+ .remove(ServiceConfigFragment.this).commitNow();
+ }
+ }
+ );
+
+ Button buttonClear = viewHierarchy.findViewById(R.id.service_config_clear);
+ buttonClear.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ setDefault();
+ }
+ }
+ );
+
+ return viewHierarchy;
+ }
+
+ private void setDefault() {
+ mAuthResult.setChecked(mSettings.getAuthResult());
+ String key = mSettings.getGbaKey();
+ if (key == null || key.isEmpty()) {
+ key = getString(R.string.sample_key);
+ }
+ mGbaKey.setText(key);
+ String id = mSettings.getBTid();
+ if (id == null || id.isEmpty()) {
+ id = getString(R.string.sample_btid);
+ }
+ mBTid.setText(id);
+ mFailReason.setText(Integer.toString(mSettings.getFailReason()));
+ }
+}
diff --git a/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/TestConfigFragment.java b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/TestConfigFragment.java
new file mode 100644
index 0000000..4049082
--- /dev/null
+++ b/testapps/GbaTestApp/src/com/android/phone/testapps/gbatestapp/ui/main/TestConfigFragment.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.gbatestapp.ui.main;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.phone.testapps.gbatestapp.R;
+import com.android.phone.testapps.gbatestapp.Settings;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Use the {@link TestConfigFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class TestConfigFragment extends Fragment {
+
+ private static final String TAG = "TEST_CONFIG";
+
+ private static TestConfigFragment sInstance;
+
+ private Settings mSettings;
+
+ private EditText mAppType;
+ private EditText mUrl;
+ private EditText mOrg;
+ private EditText mSpId;
+ private EditText mTlsCs;
+ private CheckBox mForce;
+
+ /** get the instance of TestConfigFragment */
+ public static TestConfigFragment newInstance() {
+ if (sInstance == null) {
+ sInstance = new TestConfigFragment();
+ }
+ return sInstance;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mSettings = Settings.getSettings(getActivity());
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View viewHierarchy = inflater.inflate(R.layout.fragment_test_config, container, false);
+ mAppType = viewHierarchy.findViewById(R.id.editAppType);
+ mUrl = viewHierarchy.findViewById(R.id.editUrl);
+ mOrg = viewHierarchy.findViewById(R.id.editOrg);
+ mSpId = viewHierarchy.findViewById(R.id.editSpId);
+ mTlsCs = viewHierarchy.findViewById(R.id.editTlsCs);
+ mForce = viewHierarchy.findViewById(R.id.checkBoxForce);
+
+ setDefault();
+
+ Button buttonDone = viewHierarchy.findViewById(R.id.client_config_done);
+ buttonDone.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Log.d(TAG, "updateTestConfig");
+ mSettings.updateTestConfig(getActivity(),
+ Integer.parseInt(mAppType.getText().toString()),
+ mUrl.getText().toString(),
+ mForce.isChecked(),
+ Integer.parseInt(mOrg.getText().toString()),
+ Integer.parseInt(mSpId.getText().toString()),
+ Integer.parseInt(mTlsCs.getText().toString()));
+ getFragmentManager().beginTransaction().remove(
+ TestConfigFragment.this).commitNow();
+ }
+ }
+ );
+
+ Button buttonClear = viewHierarchy.findViewById(R.id.client_config_clear);
+ buttonClear.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ setDefault();
+ }
+ }
+ );
+
+ return viewHierarchy;
+ }
+
+ void setDefault() {
+ Log.d(TAG, "setDefault");
+ mAppType.setText(Integer.toString(mSettings.getAppType()));
+ String naf = mSettings.getNafUrl();
+ if (naf == null || naf.isEmpty()) {
+ naf = getString(R.string.sample_naf);
+ }
+ mUrl.setText(naf);
+ mOrg.setText(Integer.toString(mSettings.getOrg()));
+ mSpId.setText(Integer.toString(mSettings.getSpId()));
+ mTlsCs.setText(Integer.toString(mSettings.getTlsCs()));
+ mForce.setChecked(mSettings.isForceBootstrap());
+ }
+}
diff --git a/tests/Android.bp b/tests/Android.bp
index 7ed234e..13c0dc8 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -37,6 +37,7 @@
"mockito-target-minus-junit4",
"androidx.test.espresso.core",
"truth-prebuilt",
+ "testables",
],
test_suites: [
diff --git a/tests/src/com/android/TelephonyTestBase.java b/tests/src/com/android/TelephonyTestBase.java
index 502740d..09abb15 100644
--- a/tests/src/com/android/TelephonyTestBase.java
+++ b/tests/src/com/android/TelephonyTestBase.java
@@ -61,9 +61,7 @@
protected final boolean waitForExecutorAction(Executor executor, long timeoutMillis) {
final CountDownLatch lock = new CountDownLatch(1);
- Log.i("BRAD", "waitForExecutorAction");
executor.execute(() -> {
- Log.i("BRAD", "countdown");
lock.countDown();
});
while (lock.getCount() > 0) {
diff --git a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
new file mode 100644
index 0000000..7ef9768
--- /dev/null
+++ b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
@@ -0,0 +1,507 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.role.IOnRoleHoldersChangedListener;
+import android.app.role.IRoleManager;
+import android.app.role.RoleManager;
+import android.content.BroadcastReceiver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.IInterface;
+import android.os.Looper;
+import android.os.PersistableBundle;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.provider.Telephony.SimInfo;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyRegistryManager;
+import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.RcsConfig;
+import android.telephony.ims.aidl.IImsConfig;
+import android.telephony.ims.feature.ImsFeature;
+import android.test.mock.MockContentProvider;
+import android.test.mock.MockContentResolver;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.testing.TestableLooper;
+import android.util.Log;
+
+import com.android.internal.telephony.ITelephony;
+import com.android.internal.telephony.ims.ImsResolver;
+
+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 org.mockito.MockitoSession;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executor;
+
+/**
+ * Unit tests for RcsProvisioningMonitor
+ */
+public class RcsProvisioningMonitorTest {
+ private static final String TAG = "RcsProvisioningMonitorTest";
+ private static final String SAMPLE_CONFIG = "<RCSConfig>\n"
+ + "\t<rcsVolteSingleRegistration>1</rcsVolteSingleRegistration>\n"
+ + "\t<SERVICES>\n"
+ + "\t\t<SupportedRCSProfileVersions>UP_2.0</SupportedRCSProfileVersions>\n"
+ + "\t\t<ChatAuth>1</ChatAuth>\n"
+ + "\t\t<GroupChatAuth>1</GroupChatAuth>\n"
+ + "\t\t<ftAuth>1</ftAuth>\n"
+ + "\t\t<standaloneMsgAuth>1</standaloneMsgAuth>\n"
+ + "\t\t<geolocPushAuth>1<geolocPushAuth>\n"
+ + "\t\t<Ext>\n"
+ + "\t\t\t<DataOff>\n"
+ + "\t\t\t\t<rcsMessagingDataOff>1</rcsMessagingDataOff>\n"
+ + "\t\t\t\t<fileTransferDataOff>1</fileTransferDataOff>\n"
+ + "\t\t\t\t<mmsDataOff>1</mmsDataOff>\n"
+ + "\t\t\t\t<syncDataOff>1</syncDataOff>\n"
+ + "\t\t\t</DataOff>\n"
+ + "\t\t</Ext>\n"
+ + "\t</SERVICES>\n"
+ + "</RCSConfig>";
+ private static final int FAKE_SUB_ID_BASE = 0x0FFFFFF0;
+ private static final String DEFAULT_MESSAGING_APP1 = "DMA1";
+ private static final String DEFAULT_MESSAGING_APP2 = "DMA2";
+
+ private MockitoSession mSession;
+ private RcsProvisioningMonitor mRcsProvisioningMonitor;
+ private Handler mHandler;
+ private HandlerThread mHandlerThread;
+ private TestableLooper mLooper;
+ private PersistableBundle mBundle;
+ private MockContentResolver mContentResolver = new MockContentResolver();
+ private SimInfoContentProvider mProvider;
+ private BroadcastReceiver mReceiver;
+ @Mock
+ private Cursor mCursor;
+ @Mock
+ private SubscriptionManager mSubscriptionManager;
+ private SubscriptionManager.OnSubscriptionsChangedListener mSubChangedListener;
+ @Mock
+ private TelephonyRegistryManager mTelephonyRegistryManager;
+ @Mock
+ private CarrierConfigManager mCarrierConfigManager;
+ private IOnRoleHoldersChangedListener.Stub mRoleHolderChangedListener;
+ private RoleManager mRoleManager;
+ @Mock
+ private IRoleManager.Stub mIRoleManager;
+ @Mock
+ private ITelephony.Stub mITelephony;
+ @Mock
+ private ImsResolver mImsResolver;
+ @Mock
+ private IImsConfig.Stub mIImsConfig;
+ @Mock
+ private Resources mResources;
+ @Mock
+ private PhoneGlobals mPhone;
+
+ private Executor mExecutor = new Executor() {
+ @Override
+ public void execute(Runnable r) {
+ r.run();
+ }
+ };
+
+ private class SimInfoContentProvider extends MockContentProvider {
+ private Cursor mCursor;
+
+ SimInfoContentProvider(Context context) {
+ super(context);
+ }
+
+ public void setCursor(Cursor cursor) {
+ mCursor = cursor;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection,
+ String[] selectionArgs, String sortOrder) {
+ return mCursor;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values,
+ String selection, String[] selectionArgs) {
+ return 1;
+ }
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ replaceService(Context.ROLE_SERVICE, mIRoleManager);
+ mRoleManager = new RoleManager(mPhone);
+ when(mPhone.getResources()).thenReturn(mResources);
+ when(mResources.getBoolean(
+ eq(R.bool.config_rcsVolteSingleRegistrationEnabled))).thenReturn(true);
+ when(mPhone.getMainExecutor()).thenReturn(mExecutor);
+ when(mPhone.getSystemServiceName(eq(CarrierConfigManager.class)))
+ .thenReturn(Context.CARRIER_CONFIG_SERVICE);
+ when(mPhone.getSystemServiceName(eq(SubscriptionManager.class)))
+ .thenReturn(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+ when(mPhone.getSystemServiceName(eq(TelephonyRegistryManager.class)))
+ .thenReturn(Context.TELEPHONY_REGISTRY_SERVICE);
+ when(mPhone.getSystemServiceName(eq(RoleManager.class)))
+ .thenReturn(Context.ROLE_SERVICE);
+ when(mPhone.getSystemService(eq(Context.CARRIER_CONFIG_SERVICE)))
+ .thenReturn(mCarrierConfigManager);
+ when(mPhone.getSystemService(eq(Context.TELEPHONY_SUBSCRIPTION_SERVICE)))
+ .thenReturn(mSubscriptionManager);
+ when(mPhone.getSystemService(eq(Context.TELEPHONY_REGISTRY_SERVICE)))
+ .thenReturn(mTelephonyRegistryManager);
+ when(mPhone.getSystemService(eq(Context.ROLE_SERVICE)))
+ .thenReturn(mRoleManager);
+
+ mBundle = new PersistableBundle();
+ when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);
+
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ mReceiver = (BroadcastReceiver) invocation.getArguments()[0];
+ return null;
+ }
+ }).when(mPhone).registerReceiver(any(BroadcastReceiver.class), any());
+
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ mSubChangedListener = (SubscriptionManager.OnSubscriptionsChangedListener)
+ invocation.getArguments()[0];
+ return null;
+ }
+ }).when(mTelephonyRegistryManager).addOnSubscriptionsChangedListener(
+ any(SubscriptionManager.OnSubscriptionsChangedListener.class),
+ any());
+
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ mRoleHolderChangedListener = (IOnRoleHoldersChangedListener.Stub)
+ invocation.getArguments()[0];
+ return null;
+ }
+ }).when(mIRoleManager).addOnRoleHoldersChangedListenerAsUser(
+ any(IOnRoleHoldersChangedListener.Stub.class), anyInt());
+ List<String> dmas = new ArrayList<>();
+ dmas.add(DEFAULT_MESSAGING_APP1);
+ when(mIRoleManager.getRoleHoldersAsUser(any(), anyInt())).thenReturn(dmas);
+
+ mProvider = new SimInfoContentProvider(mPhone);
+ mProvider.setCursor(mCursor);
+ mContentResolver.addProvider(SimInfo.CONTENT_URI.getAuthority(), mProvider);
+ when(mPhone.getContentResolver()).thenReturn(mContentResolver);
+ when(mCursor.moveToFirst()).thenReturn(true);
+ when(mCursor.getColumnIndexOrThrow(any())).thenReturn(1);
+ when(mCursor.getBlob(anyInt())).thenReturn(
+ RcsConfig.compressGzip(SAMPLE_CONFIG.getBytes()));
+ when(mPhone.getImsResolver()).thenReturn(mImsResolver);
+ when(mImsResolver.getImsConfig(anyInt(), anyInt())).thenReturn(mIImsConfig);
+ mHandlerThread = new HandlerThread("RcsProvisioningMonitorTest");
+ mHandlerThread.start();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ if (mRcsProvisioningMonitor != null) {
+ mRcsProvisioningMonitor.destroy();
+ mRcsProvisioningMonitor = null;
+ }
+
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ if (mLooper != null) {
+ mLooper.destroy();
+ mLooper = null;
+ }
+ }
+
+ @Test
+ @SmallTest
+ public void testInit() throws Exception {
+ createMonitor(3);
+ ArgumentCaptor<Intent> captorIntent = ArgumentCaptor.forClass(Intent.class);
+ for (int i = 0; i < 3; i++) {
+ assertTrue(Arrays.equals(SAMPLE_CONFIG.getBytes(),
+ mRcsProvisioningMonitor.getConfig(FAKE_SUB_ID_BASE + i)));
+ }
+
+ verify(mPhone, times(3)).sendBroadcast(captorIntent.capture());
+ Intent capturedIntent = captorIntent.getAllValues().get(1);
+ assertEquals(ProvisioningManager.ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE,
+ capturedIntent.getAction());
+ PhoneGlobals.getInstance().getImsResolver();
+ verify(mPhone, atLeastOnce()).getImsResolver();
+ verify(mIImsConfig, times(3)).notifyRcsAutoConfigurationReceived(any(), anyBoolean());
+ }
+
+ @Test
+ @SmallTest
+ public void testSubInfoChanged() throws Exception {
+ createMonitor(3);
+ ArgumentCaptor<Intent> captorIntent = ArgumentCaptor.forClass(Intent.class);
+ mExecutor.execute(() -> mSubChangedListener.onSubscriptionsChanged());
+ processAllMessages();
+ for (int i = 0; i < 3; i++) {
+ assertTrue(Arrays.equals(SAMPLE_CONFIG.getBytes(),
+ mRcsProvisioningMonitor.getConfig(FAKE_SUB_ID_BASE + i)));
+ }
+ verify(mPhone, times(3)).sendBroadcast(captorIntent.capture());
+ Intent capturedIntent = captorIntent.getAllValues().get(1);
+ assertEquals(ProvisioningManager.ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE,
+ capturedIntent.getAction());
+ verify(mIImsConfig, times(3)).notifyRcsAutoConfigurationReceived(any(), anyBoolean());
+
+ makeFakeActiveSubIds(1);
+ mExecutor.execute(() -> mSubChangedListener.onSubscriptionsChanged());
+ processAllMessages();
+
+ for (int i = 1; i < 3; i++) {
+ assertNull(mRcsProvisioningMonitor.getConfig(FAKE_SUB_ID_BASE + i));
+ }
+ verify(mIImsConfig, times(2)).notifyRcsAutoConfigurationRemoved();
+ }
+
+ @Test
+ @SmallTest
+ public void testDefaultMessagingApplicationChanged() throws Exception {
+ createMonitor(1);
+ updateDefaultMessageApplication(DEFAULT_MESSAGING_APP2);
+ mBundle.putBoolean(CarrierConfigManager.KEY_USE_ACS_FOR_RCS_BOOL, false);
+ processAllMessages();
+ verify(mIImsConfig, atLeastOnce())
+ .notifyRcsAutoConfigurationReceived(any(), anyBoolean());
+ mBundle.putBoolean(CarrierConfigManager.KEY_USE_ACS_FOR_RCS_BOOL, true);
+ updateDefaultMessageApplication(DEFAULT_MESSAGING_APP1);
+ processAllMessages();
+ verify(mIImsConfig, atLeastOnce()).triggerRcsReconfiguration();
+ }
+
+ @Test
+ @SmallTest
+ public void testCarrierConfigChanged() throws Exception {
+ createMonitor(1);
+ when(mResources.getBoolean(
+ eq(R.bool.config_rcsVolteSingleRegistrationEnabled))).thenReturn(true);
+ ArgumentCaptor<Intent> captorIntent = ArgumentCaptor.forClass(Intent.class);
+ mBundle.putBoolean(
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
+ broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
+ processAllMessages();
+ verify(mPhone, atLeastOnce()).sendBroadcast(captorIntent.capture());
+ Intent capturedIntent = captorIntent.getValue();
+ assertEquals(capturedIntent.getAction(),
+ ProvisioningManager.ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE);
+ assertEquals(FAKE_SUB_ID_BASE, capturedIntent.getIntExtra(
+ ProvisioningManager.EXTRA_SUBSCRIPTION_ID, -1));
+ assertEquals(ProvisioningManager.STATUS_CAPABLE,
+ capturedIntent.getIntExtra(ProvisioningManager.EXTRA_STATUS, -1));
+
+ mBundle.putBoolean(
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, false);
+ broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
+ processAllMessages();
+ verify(mPhone, atLeastOnce()).sendBroadcast(captorIntent.capture());
+ capturedIntent = captorIntent.getValue();
+ assertEquals(capturedIntent.getAction(),
+ ProvisioningManager.ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE);
+ assertEquals(FAKE_SUB_ID_BASE, capturedIntent.getIntExtra(
+ ProvisioningManager.EXTRA_SUBSCRIPTION_ID, -1));
+ assertEquals(ProvisioningManager.STATUS_CARRIER_NOT_CAPABLE,
+ capturedIntent.getIntExtra(ProvisioningManager.EXTRA_STATUS, -1));
+
+
+ when(mResources.getBoolean(
+ eq(R.bool.config_rcsVolteSingleRegistrationEnabled))).thenReturn(false);
+ broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
+ processAllMessages();
+ verify(mPhone, atLeastOnce()).sendBroadcast(captorIntent.capture());
+ capturedIntent = captorIntent.getValue();
+ assertEquals(capturedIntent.getAction(),
+ ProvisioningManager.ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE);
+ assertEquals(FAKE_SUB_ID_BASE, capturedIntent.getIntExtra(
+ ProvisioningManager.EXTRA_SUBSCRIPTION_ID, -1));
+ assertEquals(ProvisioningManager.STATUS_CARRIER_NOT_CAPABLE
+ | ProvisioningManager.STATUS_DEVICE_NOT_CAPABLE,
+ capturedIntent.getIntExtra(ProvisioningManager.EXTRA_STATUS, -1));
+ }
+
+ @Test
+ @SmallTest
+ public void testUpdateConfig() throws Exception {
+ createMonitor(1);
+ final ArgumentCaptor<byte[]> argumentBytes = ArgumentCaptor.forClass(byte[].class);
+
+ mRcsProvisioningMonitor.updateConfig(FAKE_SUB_ID_BASE, SAMPLE_CONFIG.getBytes(), false);
+ processAllMessages();
+
+ verify(mImsResolver, atLeastOnce()).getImsConfig(
+ anyInt(), eq(ImsFeature.FEATURE_RCS));
+ verify(mIImsConfig, atLeastOnce()).notifyRcsAutoConfigurationReceived(
+ argumentBytes.capture(), eq(false));
+ assertTrue(Arrays.equals(SAMPLE_CONFIG.getBytes(), argumentBytes.getValue()));
+ }
+
+ @Test
+ @SmallTest
+ public void testRequestReconfig() throws Exception {
+ createMonitor(1);
+
+ mRcsProvisioningMonitor.requestReconfig(FAKE_SUB_ID_BASE);
+ processAllMessages();
+
+ verify(mImsResolver, atLeastOnce()).getImsConfig(
+ anyInt(), eq(ImsFeature.FEATURE_RCS));
+ verify(mIImsConfig, times(1)).notifyRcsAutoConfigurationRemoved();
+ verify(mIImsConfig, times(1)).triggerRcsReconfiguration();
+ }
+
+
+ @Test
+ @SmallTest
+ public void testIsRcsVolteSingleRegistrationEnabled() throws Exception {
+ createMonitor(1);
+
+ when(mResources.getBoolean(
+ eq(R.bool.config_rcsVolteSingleRegistrationEnabled))).thenReturn(true);
+ mBundle.putBoolean(
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
+ broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
+ processAllMessages();
+ assertTrue(mRcsProvisioningMonitor.isRcsVolteSingleRegistrationEnabled(FAKE_SUB_ID_BASE));
+
+ mBundle.putBoolean(
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, false);
+ broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
+ processAllMessages();
+ assertFalse(mRcsProvisioningMonitor.isRcsVolteSingleRegistrationEnabled(FAKE_SUB_ID_BASE));
+
+
+ when(mResources.getBoolean(
+ eq(R.bool.config_rcsVolteSingleRegistrationEnabled))).thenReturn(false);
+ mBundle.putBoolean(
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
+ broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
+ processAllMessages();
+ assertFalse(mRcsProvisioningMonitor.isRcsVolteSingleRegistrationEnabled(FAKE_SUB_ID_BASE));
+ }
+
+ private void createMonitor(int subCount) {
+ if (Looper.myLooper() == null) {
+ Looper.prepare();
+ }
+ makeFakeActiveSubIds(subCount);
+ mRcsProvisioningMonitor = new RcsProvisioningMonitor(mPhone, mHandlerThread.getLooper());
+ mHandler = mRcsProvisioningMonitor.getHandler();
+ try {
+ mLooper = new TestableLooper(mHandler.getLooper());
+ } catch (Exception e) {
+ logd("Unable to create looper from handler.");
+ }
+ processAllMessages();
+ }
+
+ private void broadcastCarrierConfigChange(int subId) {
+ Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
+ intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, subId);
+ mExecutor.execute(() -> {
+ mReceiver.onReceive(mPhone, intent);
+ });
+ }
+
+ private void makeFakeActiveSubIds(int count) {
+ final int[] subIds = new int[count];
+ for (int i = 0; i < count; i++) {
+ subIds[i] = FAKE_SUB_ID_BASE + i;
+ }
+ when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(subIds);
+ }
+
+ private void updateDefaultMessageApplication(String packageName) throws Exception {
+ List<String> dmas = new ArrayList<>();
+ dmas.add(packageName);
+ when(mIRoleManager.getRoleHoldersAsUser(any(), anyInt())).thenReturn(dmas);
+ mExecutor.execute(() -> {
+ try {
+ mRoleHolderChangedListener.onRoleHoldersChanged(
+ RoleManager.ROLE_SMS, UserHandle.USER_ALL);
+ } catch (RemoteException e) {
+ logd("exception to call onRoleHoldersChanged " + e);
+ }
+ });
+ }
+
+ private void replaceService(final String serviceName,
+ final IInterface serviceInstance) throws Exception {
+ IBinder binder = mock(IBinder.class);
+ when(binder.queryLocalInterface(anyString())).thenReturn(serviceInstance);
+ Field field = ServiceManager.class.getDeclaredField("sCache");
+ field.setAccessible(true);
+ ((Map<String, IBinder>) field.get(null)).put(serviceName, binder);
+ }
+
+
+ private void processAllMessages() {
+ while (!mLooper.getLooper().getQueue().isIdle()) {
+ mLooper.processAllMessages();
+ }
+ }
+
+ private static void logd(String str) {
+ Log.d(TAG, str);
+ }
+}
diff --git a/tests/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionTest.java b/tests/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionTest.java
index fa439dc..360fa21 100644
--- a/tests/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionTest.java
+++ b/tests/src/com/android/services/telephony/rcs/SipDelegateBinderConnectionTest.java
@@ -32,6 +32,7 @@
import android.telephony.ims.FeatureTagState;
import android.telephony.ims.SipDelegateImsConfiguration;
import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.IImsRegistration;
import android.telephony.ims.aidl.ISipDelegate;
import android.telephony.ims.aidl.ISipDelegateMessageCallback;
import android.telephony.ims.aidl.ISipDelegateStateCallback;
@@ -61,6 +62,7 @@
@Mock private ISipDelegate mMockDelegate;
@Mock private ISipTransport mMockTransport;
+ @Mock private IImsRegistration mMockRegistration;
@Mock private IBinder mTransportBinder;
@Mock private ISipDelegateMessageCallback mMessageCallback;
@Mock private DelegateBinderStateManager.StateCallback mMockStateCallback;
@@ -107,7 +109,8 @@
DelegateRequest request = getDelegateRequest();
ArraySet<FeatureTagState> deniedTags = getMmTelDeniedTag();
SipDelegateBinderConnection connection = new SipDelegateBinderConnection(TEST_SUB_ID,
- mMockTransport, request, deniedTags, Runnable::run, mStateCallbackList);
+ mMockTransport, mMockRegistration, request, deniedTags, Runnable::run,
+ mStateCallbackList);
ISipDelegateStateCallback cb = createDelegateCaptureStateCallback(request, connection);
// Send onCreated callback from SipDelegate
@@ -130,7 +133,8 @@
DelegateRequest request = getDelegateRequest();
ArraySet<FeatureTagState> deniedTags = getMmTelDeniedTag();
SipDelegateBinderConnection connection = new SipDelegateBinderConnection(TEST_SUB_ID,
- mMockTransport, request, deniedTags, Runnable::run, mStateCallbackList);
+ mMockTransport, mMockRegistration, request, deniedTags, Runnable::run,
+ mStateCallbackList);
doThrow(new RemoteException()).when(mMockTransport).createSipDelegate(eq(TEST_SUB_ID),
any(), any(), any());
ISipDelegateStateCallback cb = createDelegateCaptureStateCallback(request, connection);
@@ -143,7 +147,8 @@
DelegateRequest request = getDelegateRequest();
ArraySet<FeatureTagState> deniedTags = getMmTelDeniedTag();
SipDelegateBinderConnection connection = new SipDelegateBinderConnection(TEST_SUB_ID,
- mMockTransport, request, deniedTags, Runnable::run, mStateCallbackList);
+ mMockTransport, mMockRegistration, request, deniedTags, Runnable::run,
+ mStateCallbackList);
ISipDelegateStateCallback cb = createDelegateCaptureStateCallback(request, connection);
assertNotNull(cb);
cb.onCreated(mMockDelegate, null /*denied*/);
@@ -162,7 +167,8 @@
DelegateRequest request = getDelegateRequest();
ArraySet<FeatureTagState> deniedTags = getMmTelDeniedTag();
SipDelegateBinderConnection connection = new SipDelegateBinderConnection(TEST_SUB_ID,
- mMockTransport, request, deniedTags, Runnable::run, mStateCallbackList);
+ mMockTransport, mMockRegistration, request, deniedTags, Runnable::run,
+ mStateCallbackList);
ISipDelegateStateCallback cb = createDelegateCaptureStateCallback(request, connection);
assertNotNull(cb);
cb.onCreated(mMockDelegate, null /*denied*/);
@@ -181,7 +187,8 @@
DelegateRequest request = getDelegateRequest();
ArraySet<FeatureTagState> deniedTags = getMmTelDeniedTag();
SipDelegateBinderConnection connection = new SipDelegateBinderConnection(TEST_SUB_ID,
- mMockTransport, request, deniedTags, Runnable::run, mStateCallbackList);
+ mMockTransport, mMockRegistration, request, deniedTags, Runnable::run,
+ mStateCallbackList);
ISipDelegateStateCallback cb = createDelegateCaptureStateCallback(request, connection);
assertNotNull(cb);
cb.onCreated(mMockDelegate, new ArrayList<>(deniedTags));
diff --git a/tests/src/com/android/services/telephony/rcs/SipDelegateControllerTest.java b/tests/src/com/android/services/telephony/rcs/SipDelegateControllerTest.java
index 47b4808..27f896b 100644
--- a/tests/src/com/android/services/telephony/rcs/SipDelegateControllerTest.java
+++ b/tests/src/com/android/services/telephony/rcs/SipDelegateControllerTest.java
@@ -36,7 +36,6 @@
import android.telephony.ims.SipDelegateManager;
import android.telephony.ims.aidl.ISipDelegate;
import android.telephony.ims.aidl.ISipDelegateMessageCallback;
-import android.telephony.ims.aidl.ISipTransport;
import android.util.ArraySet;
import androidx.test.filters.SmallTest;
@@ -65,7 +64,6 @@
private static final int TEST_SUB_ID = 1;
@Mock private ISipDelegate mMockSipDelegate;
- @Mock private ISipTransport mMockSipTransport;
@Mock private MessageTransportStateTracker mMockMessageTracker;
@Mock private ISipDelegateMessageCallback mMockMessageCallback;
@Mock private DelegateStateTracker mMockDelegateStateTracker;
@@ -243,9 +241,9 @@
private SipDelegateController getTestDelegateController(DelegateRequest request,
Set<FeatureTagState> deniedSet) {
- return new SipDelegateController(TEST_SUB_ID, request, "", mMockSipTransport,
- mExecutorService, mMockMessageTracker, mMockDelegateStateTracker,
- (a, b, c, deniedFeatureSet, e, f) -> {
+ return new SipDelegateController(TEST_SUB_ID, request, "", mExecutorService,
+ mMockMessageTracker, mMockDelegateStateTracker,
+ (a, b, deniedFeatureSet, d, e) -> {
assertEquals(deniedSet, deniedFeatureSet);
return mMockBinderConnection;
});
diff --git a/tests/src/com/android/services/telephony/rcs/SipTransportControllerTest.java b/tests/src/com/android/services/telephony/rcs/SipTransportControllerTest.java
index 8e10757..fa27775 100644
--- a/tests/src/com/android/services/telephony/rcs/SipTransportControllerTest.java
+++ b/tests/src/com/android/services/telephony/rcs/SipTransportControllerTest.java
@@ -40,6 +40,7 @@
import android.telephony.ims.FeatureTagState;
import android.telephony.ims.ImsException;
import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.IImsRegistration;
import android.telephony.ims.aidl.ISipDelegate;
import android.telephony.ims.aidl.ISipDelegateConnectionStateCallback;
import android.telephony.ims.aidl.ISipDelegateMessageCallback;
@@ -102,6 +103,7 @@
@Mock private RcsFeatureManager mRcsManager;
@Mock private ISipTransport mSipTransport;
+ @Mock private IImsRegistration mImsRegistration;
@Mock private ISipDelegateConnectionStateCallback mMockStateCallback;
@Mock private ISipDelegateMessageCallback mMockMessageCallback;
@Mock private SipTransportController.SipDelegateControllerFactory
@@ -116,6 +118,7 @@
public void setUp() throws Exception {
super.setUp();
doReturn(mSmsPackageName).when(mMockRoleManager).getRoleHolders(RoleManager.ROLE_SMS);
+ doReturn(mImsRegistration).when(mRcsManager).getImsRegistration();
mSmsPackageName.add(TEST_PACKAGE_NAME);
doAnswer(invocation -> {
Integer subId = invocation.getArgument(0);
@@ -124,7 +127,7 @@
SipDelegateController c = getMockDelegateController(subId, packageName, request);
assertNotNull("create called with no corresponding controller set up", c);
return c;
- }).when(mMockDelegateControllerFactory).create(anyInt(), any(), anyString(), any(),
+ }).when(mMockDelegateControllerFactory).create(anyInt(), any(), anyString(), any(), any(),
any(), any(), any());
}
@@ -289,6 +292,8 @@
SipDelegateController c = injectMockDelegateController(TEST_PACKAGE_NAME, r);
createDelegateAndVerify(controller, c, r, r.getFeatureTags(), Collections.emptySet(),
TEST_PACKAGE_NAME);
+ verifyDelegateRegistrationChangedEvent(1 /*times*/, 0 /*waitMs*/);
+ triggerFullNetworkRegistrationAndVerify(controller, c);
}
@SmallTest
@@ -300,9 +305,12 @@
SipDelegateController c = injectMockDelegateController(TEST_PACKAGE_NAME, r);
createDelegateAndVerify(controller, c, r, r.getFeatureTags(), Collections.emptySet(),
TEST_PACKAGE_NAME);
+ verifyDelegateRegistrationChangedEvent(1, 0 /*throttle*/);
destroyDelegateAndVerify(controller, c, false,
SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ verifyDelegateRegistrationChangedEvent(2 /*times*/, 0 /*waitMs*/);
+ triggerFullNetworkRegistrationAndVerifyNever(controller, c);
}
@SmallTest
@@ -323,7 +331,8 @@
@SmallTest
@Test
public void createTwoAndDenyOverlappingTags() throws Exception {
- SipTransportController controller = setupLiveTransportController();
+ SipTransportController controller = setupLiveTransportController(0 /*reeval*/,
+ THROTTLE_MS);
// First delegate requests RCS message + File transfer
ArraySet<String> firstDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
@@ -333,6 +342,8 @@
firstDelegateRequest);
createDelegateAndVerify(controller, c1, firstDelegateRequest, firstDelegate,
Collections.emptySet(), TEST_PACKAGE_NAME);
+ // there is a delay in the indication to update reg, so it should not happen yet.
+ verifyNoDelegateRegistrationChangedEvent();
// First delegate requests RCS message + Group RCS message. For this delegate, single RCS
// message should be denied.
@@ -346,12 +357,14 @@
secondDelegateRequest);
createDelegateAndVerify(controller, c2, secondDelegateRequest, grantedAndDenied.first,
grantedAndDenied.second, TEST_PACKAGE_NAME, 1);
+ // a reg changed event should happen after wait.
+ verifyDelegateRegistrationChangedEvent(1, 2 * THROTTLE_MS);
}
@SmallTest
@Test
public void createTwoAndTriggerRoleChange() throws Exception {
- SipTransportController controller = setupLiveTransportController();
+ SipTransportController controller = setupLiveTransportController(0 /*reeval*/, THROTTLE_MS);
DelegateRequest firstDelegateRequest = getBaseDelegateRequest();
Set<FeatureTagState> firstDeniedTags = getDeniedTagsForReason(
@@ -361,6 +374,7 @@
firstDelegateRequest);
createDelegateAndVerify(controller, c1, firstDelegateRequest,
firstDelegateRequest.getFeatureTags(), Collections.emptySet(), TEST_PACKAGE_NAME);
+ verifyDelegateRegistrationChangedEvent(1 /*times*/, THROTTLE_MS);
DelegateRequest secondDelegateRequest = getBaseDelegateRequest();
Set<FeatureTagState> secondDeniedTags = getDeniedTagsForReason(
@@ -378,6 +392,10 @@
CompletableFuture<Boolean> pendingC2Change = setChangeSupportedFeatureTagsFuture(c2,
secondDelegateRequest.getFeatureTags(), Collections.emptySet());
setSmsRoleAndEvaluate(controller, TEST_PACKAGE_NAME_2);
+ // swapping roles should trigger a deregistration event on the ImsService side.
+ verifyDelegateDeregistrationEvent();
+ // there should also not be any new registration changed events
+ verifyDelegateRegistrationChangedEvent(1 /*times*/, THROTTLE_MS);
// trigger completion stage to run
waitForExecutorAction(mExecutorService, TIMEOUT_MS);
verify(c1).changeSupportedFeatureTags(Collections.emptySet(), firstDeniedTags);
@@ -394,12 +412,14 @@
// ensure we are not blocking executor here
waitForExecutorAction(mExecutorService, TIMEOUT_MS);
completePendingChange(pendingC2Change, true);
+ // verify we now get a second registration changed event
+ verifyDelegateRegistrationChangedEvent(2 /*times*/, THROTTLE_MS);
}
@SmallTest
@Test
public void createTwoAndDestroyOlder() throws Exception {
- SipTransportController controller = setupLiveTransportController();
+ SipTransportController controller = setupLiveTransportController(0 /*reeval*/, THROTTLE_MS);
// First delegate requests RCS message + File transfer
ArraySet<String> firstDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
@@ -409,6 +429,7 @@
firstDelegateRequest);
createDelegateAndVerify(controller, c1, firstDelegateRequest, firstDelegate,
Collections.emptySet(), TEST_PACKAGE_NAME);
+ verifyNoDelegateRegistrationChangedEvent();
// First delegate requests RCS message + Group RCS message. For this delegate, single RCS
// message should be denied.
@@ -422,6 +443,7 @@
secondDelegateRequest);
createDelegateAndVerify(controller, c2, secondDelegateRequest, grantedAndDenied.first,
grantedAndDenied.second, TEST_PACKAGE_NAME, 1);
+ verifyNoDelegateRegistrationChangedEvent();
// Destroy the firstDelegate, which should now cause all previously denied tags to be
// granted to the new delegate.
@@ -433,12 +455,14 @@
assertTrue(waitForExecutorAction(mExecutorService, TIMEOUT_MS));
verify(c2).changeSupportedFeatureTags(secondDelegate, Collections.emptySet());
completePendingChange(pendingC2Change, true);
+
+ verifyDelegateRegistrationChangedEvent(1 /*times*/, THROTTLE_MS);
}
@SmallTest
@Test
public void testThrottling() throws Exception {
- SipTransportController controller = setupLiveTransportController(THROTTLE_MS);
+ SipTransportController controller = setupLiveTransportController(THROTTLE_MS, THROTTLE_MS);
// First delegate requests RCS message + File transfer
ArraySet<String> firstDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
@@ -477,12 +501,14 @@
thirdDelegateRequest, grantedAndDeniedC3.first, grantedAndDeniedC3.second,
TEST_PACKAGE_NAME);
+ verifyNoDelegateRegistrationChangedEvent();
assertTrue(scheduleDelayedWait(2 * THROTTLE_MS));
verifyDelegateChanged(c1, pendingC1Change, firstDelegate, Collections.emptySet(), 0);
verifyDelegateChanged(c2, pendingC2Change, grantedAndDeniedC2.first,
grantedAndDeniedC2.second, 0);
verifyDelegateChanged(c3, pendingC3Change, grantedAndDeniedC3.first,
grantedAndDeniedC3.second, 0);
+ verifyDelegateRegistrationChangedEvent(1, 2 * THROTTLE_MS);
// Destroy the first and second controller in quick succession, this should only generate
// one reevaluate for the third controller.
@@ -505,6 +531,7 @@
verify(c3).changeSupportedFeatureTags(thirdDelegate, Collections.emptySet());
// In total reeval should have only been called twice.
verify(c3, times(2)).changeSupportedFeatureTags(any(), any());
+ verifyDelegateRegistrationChangedEvent(2 /*times*/, 2 * THROTTLE_MS);
}
@SmallTest
@@ -518,6 +545,7 @@
firstDelegateRequest);
createDelegateAndVerify(controller, c1, firstDelegateRequest, firstDelegate,
Collections.emptySet(), TEST_PACKAGE_NAME);
+ verifyDelegateRegistrationChangedEvent(1 /*times*/, 0 /*waitMs*/);
CompletableFuture<Integer> pendingDestroy = setDestroyFuture(c1, true,
SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN);
@@ -525,6 +553,7 @@
waitForExecutorAction(mExecutorService, TIMEOUT_MS);
verifyDestroyDelegate(controller, c1, pendingDestroy, true /*force*/,
SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN);
+ verifyDelegateRegistrationChangedEvent(2 /*times*/, 0 /*waitMs*/);
}
@SmallTest
@@ -545,6 +574,7 @@
waitForExecutorAction(mExecutorService, TIMEOUT_MS);
verifyDestroyDelegate(controller, c1, pendingDestroy, true /*force*/,
SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD);
+ verifyDelegateRegistrationChangedEvent(1, 0 /*waitMs*/);
}
@SmallTest
@@ -563,6 +593,7 @@
SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN);
controller.onDestroy();
waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verifyDelegateDeregistrationEvent();
// verify change was called.
verify(c1).destroy(true /*force*/,
SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SUBSCRIPTION_TORN_DOWN);
@@ -575,7 +606,7 @@
@SmallTest
@Test
public void testTimingSubIdChangedAndCreateNewSubId() throws Exception {
- SipTransportController controller = setupLiveTransportController(THROTTLE_MS);
+ SipTransportController controller = setupLiveTransportController(THROTTLE_MS, 0);
ArraySet<String> firstDelegate = new ArraySet<>(getBaseDelegateRequest().getFeatureTags());
DelegateRequest firstDelegateRequest = new DelegateRequest(firstDelegate);
@@ -638,13 +669,14 @@
}
private SipTransportController setupLiveTransportController() throws Exception {
- return setupLiveTransportController(0 /*throttleMs*/);
+ return setupLiveTransportController(0 /*throttleMs*/, 0 /*regDelayMs*/);
}
- private SipTransportController setupLiveTransportController(int throttleMs) throws Exception {
+ private SipTransportController setupLiveTransportController(int throttleMs, int regDelayMs)
+ throws Exception {
mExecutorService = Executors.newSingleThreadScheduledExecutor();
SipTransportController controller = createControllerAndThrottle(mExecutorService,
- throttleMs);
+ throttleMs, regDelayMs);
doReturn(mSipTransport).when(mRcsManager).getSipTransport();
controller.onAssociatedSubscriptionUpdated(TEST_SUB_ID);
controller.onRcsConnected(mRcsManager);
@@ -743,6 +775,24 @@
completePendingDestroy(pendingDestroy, reason);
}
+ private void triggerFullNetworkRegistrationAndVerify(SipTransportController controller,
+ SipDelegateController delegateController) {
+ controller.triggerFullNetworkRegistration(TEST_SUB_ID,
+ delegateController.getSipDelegateInterface(), 403, "forbidden");
+ // move to internal & trigger event
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verify(delegateController).triggerFullNetworkRegistration(403, "forbidden");
+ }
+
+ private void triggerFullNetworkRegistrationAndVerifyNever(SipTransportController controller,
+ SipDelegateController delegateController) {
+ controller.triggerFullNetworkRegistration(TEST_SUB_ID,
+ delegateController.getSipDelegateInterface(), 403, "forbidden");
+ // move to internal & potentially trigger event
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verify(delegateController, never()).triggerFullNetworkRegistration(anyInt(), anyString());
+ }
+
private DelegateRequest getBaseDelegateRequest() {
Set<String> featureTags = new ArraySet<>();
featureTags.add(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG);
@@ -807,12 +857,31 @@
waitForExecutorAction(mExecutorService, TIMEOUT_MS);
}
+ private void verifyNoDelegateRegistrationChangedEvent() throws Exception {
+ // event is scheduled and then executed.
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verify(mImsRegistration, never()).triggerUpdateSipDelegateRegistration();
+ }
+
+ private void verifyDelegateRegistrationChangedEvent(int times, int waitMs)
+ throws Exception {
+ // event is scheduled and then executed.
+ assertTrue(scheduleDelayedWait(waitMs));
+ waitForExecutorAction(mExecutorService, TIMEOUT_MS);
+ verify(mImsRegistration, times(times)).triggerUpdateSipDelegateRegistration();
+ }
+
+
+ private void verifyDelegateDeregistrationEvent() throws Exception {
+ verify(mImsRegistration).triggerSipDelegateDeregistration();
+ }
+
private SipTransportController createController(ScheduledExecutorService e) {
- return createControllerAndThrottle(e, 0 /*throttleMs*/);
+ return createControllerAndThrottle(e, 0 /*throttleMs*/, 0 /*regDelayMs*/);
}
private SipTransportController createControllerAndThrottle(ScheduledExecutorService e,
- int throttleMs) {
+ int throttleMs, int regDelayMs) {
return new SipTransportController(mContext, 0 /*slotId*/, TEST_SUB_ID,
mMockDelegateControllerFactory, mMockRoleManager,
// Remove delays for testing.
@@ -824,7 +893,7 @@
@Override
public int getUpdateRegistrationDelayMilliseconds() {
- return 0;
+ return regDelayMs;
}
}, e);
}