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">"&lt;सेट नहीं है&gt;"</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);
     }