Merge "Modify ImsRegistrationUpdate"
diff --git a/Android.bp b/Android.bp
index 0a7ccdc..dc35c5d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -43,6 +43,7 @@
"PlatformProperties",
"modules-utils-os",
"nist-sip",
+ "service-entitlement"
],
srcs: [
@@ -79,11 +80,14 @@
},
}
-// Allow other applications to use public constants from SliceStore
+// Allow other applications to use public constants from SlicePurchaseController
java_library {
- name: "SliceStore",
- srcs: ["src/com/android/phone/slicestore/SliceStore.java",],
- libs: ["telephony-common"],
+ name: "SlicePurchaseController",
+ srcs: ["src/com/android/phone/slice/*.java",],
+ libs: [
+ "telephony-common",
+ "service-entitlement"
+ ],
}
platform_compat_config {
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 5599a50..0e32e40 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -21,9 +21,9 @@
android:sharedUserId="android.uid.phone"
android:sharedUserLabel="@string/phoneAppLabel">
- <!-- Allows broadcasting for SliceStore events. -->
- <protected-broadcast android:name="com.android.phone.slicestore.action.START_SLICE_STORE" />
- <protected-broadcast android:name="com.android.phone.slicestore.action.SLICE_STORE_RESPONSE_TIMEOUT" />
+ <!-- Allows broadcasting for SlicePurchaseController events. -->
+ <protected-broadcast android:name="com.android.phone.slice.action.START_SLICE_PURCHASE_APP" />
+ <protected-broadcast android:name="com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_TIMEOUT" />
<original-package android:name="com.android.phone" />
<!-- Allows granting runtime permissions to telephony related components. -->
@@ -159,6 +159,9 @@
<!-- Needed to block unwanted malicious pop up overlays -->
<uses-permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS"/>
+ <!-- Needed to set user association to a certain sim -->
+ <uses-permission android:name="android.permission.MANAGE_SUBSCRIPTION_USER_ASSOCIATION"/>
+
<permission android:name="com.android.phone.permission.ACCESS_LAST_KNOWN_CELL_ID"
android:label="Access last known cell identity."
android:protectionLevel="signature"/>
@@ -196,6 +199,7 @@
android:label="@string/emergencyDialerIconLabel"
android:theme="@style/EmergencyDialerTheme"
android:screenOrientation="portrait"
+ android:showWhenLocked="true"
android:exported="true"
android:resizeableActivity="false">
<intent-filter>
diff --git a/ecc/conversion_toolset_v1/proto/protobuf_ecc_data.proto b/ecc/conversion_toolset_v1/proto/protobuf_ecc_data.proto
index 528e4b0..088b5b7 100644
--- a/ecc/conversion_toolset_v1/proto/protobuf_ecc_data.proto
+++ b/ecc/conversion_toolset_v1/proto/protobuf_ecc_data.proto
@@ -19,6 +19,12 @@
AIEC = 7;
}
+ enum Routing {
+ UNKNOWN = 0;
+ EMERGENCY = 1;
+ NORMAL= 2;
+ }
+
// Required: Every EccInfo shall contain a phone number.
optional string phone_number = 1;
@@ -26,11 +32,11 @@
repeated Type types = 2 [packed=true];
- //Optional: By default, the emergency number is assumed to be 'emergency routed'
- optional bool is_normal_routed = 3 [default = false];
+ //Optional: By default, routing is assumed to be 'UNKNOWN'
+ optional Routing routing = 3 [default = UNKNOWN];
- //Optional: This field is evaluated only if is_normal_routed is set to true
- //If the field is empty, normal routing is used for all MNCs
+ //Optional: This field is evaluated only if routing is set to NORMAL
+ //If the field is empty, NORMAL routing is used for all MNCs
//Else normal routing is used only for list of MNCs specified
repeated string normal_routing_mncs = 4;
diff --git a/ecc/input/OWNERS b/ecc/input/OWNERS
index d9ecbb7..5685875 100644
--- a/ecc/input/OWNERS
+++ b/ecc/input/OWNERS
@@ -1,5 +1,4 @@
set noparent
-djkrause@google.com
-satk@google.com
-somakala@google.com
\ No newline at end of file
+tgunn@google.com
+chinmayd@google.com
\ No newline at end of file
diff --git a/ecc/input/eccdata.txt b/ecc/input/eccdata.txt
index a8b021e..ddf3505 100644
--- a/ecc/input/eccdata.txt
+++ b/ecc/input/eccdata.txt
@@ -627,6 +627,7 @@
types: POLICE
types: AMBULANCE
types: FIRE
+ routing: EMERGENCY
}
ecc_fallback: "112"
}
@@ -739,6 +740,7 @@
types: POLICE
types: AMBULANCE
types: FIRE
+ routing: EMERGENCY
}
ecc_fallback: "112"
}
@@ -792,26 +794,32 @@
types: POLICE
types: AMBULANCE
types: FIRE
+ routing: EMERGENCY
}
eccs {
phone_number: "15"
types: AMBULANCE
+ routing: NORMAL
}
eccs {
phone_number: "17"
types: POLICE
+ routing: NORMAL
}
eccs {
phone_number: "18"
types: FIRE
+ routing:NORMAL
}
eccs {
phone_number: "115"
types: TYPE_UNSPECIFIED
+ routing: NORMAL
}
eccs {
phone_number: "116000"
types: TYPE_UNSPECIFIED
+ routing: NORMAL
}
eccs {
phone_number: "114"
@@ -819,27 +827,28 @@
}
eccs {
phone_number: "191"
- types: TYPE_UNSPECIFIED
+ types: MOUNTAIN_RESCUE
+ routing: NORMAL
}
eccs {
phone_number: "196"
types: MARINE_GUARD
+ routing: NORMAL
}
eccs {
phone_number: "197"
types: TYPE_UNSPECIFIED
+ routing: NORMAL
}
eccs {
phone_number: "116117"
types: TYPE_UNSPECIFIED
- }
- eccs {
- phone_number: "116111"
- types: TYPE_UNSPECIFIED
+ routing: NORMAL
}
eccs {
phone_number: "119"
types: TYPE_UNSPECIFIED
+ routing: NORMAL
}
ecc_fallback: "112"
}
@@ -1252,11 +1261,18 @@
eccs {
phone_number: "110"
types: POLICE
+ routing: EMERGENCY
+ }
+ eccs {
+ phone_number: "118"
+ types: MARINE_GUARD
+ routing: EMERGENCY
}
eccs {
phone_number: "119"
types: AMBULANCE
types: FIRE
+ routing: EMERGENCY
}
ecc_fallback: "112"
}
@@ -1955,6 +1971,21 @@
types: POLICE
types: AMBULANCE
types: FIRE
+ routing: EMERGENCY
+ }
+ eccs {
+ phone_number: "112"
+ types: POLICE
+ types: AMBULANCE
+ types: FIRE
+ routing: EMERGENCY
+ }
+ eccs {
+ phone_number: "911"
+ types: POLICE
+ types: AMBULANCE
+ types: FIRE
+ routing: EMERGENCY
}
ecc_fallback: "112"
}
@@ -2114,6 +2145,14 @@
types: POLICE
types: AMBULANCE
types: FIRE
+ routing: EMERGENCY
+ }
+ eccs {
+ phone_number: "911"
+ types: POLICE
+ types: AMBULANCE
+ types: FIRE
+ routing: EMERGENCY
}
ecc_fallback: "112"
}
@@ -2274,6 +2313,7 @@
types: POLICE
types: AMBULANCE
types: FIRE
+ routing: EMERGENCY
}
ecc_fallback: "112"
}
@@ -2694,6 +2734,7 @@
types: POLICE
types: AMBULANCE
types: FIRE
+ routing: EMERGENCY
}
ecc_fallback: "911"
}
diff --git a/ecc/output/OWNERS b/ecc/output/OWNERS
index d9ecbb7..5685875 100644
--- a/ecc/output/OWNERS
+++ b/ecc/output/OWNERS
@@ -1,5 +1,4 @@
set noparent
-djkrause@google.com
-satk@google.com
-somakala@google.com
\ No newline at end of file
+tgunn@google.com
+chinmayd@google.com
\ No newline at end of file
diff --git a/ecc/output/eccdata b/ecc/output/eccdata
index 8427603..c916c77 100644
--- a/ecc/output/eccdata
+++ b/ecc/output/eccdata
Binary files differ
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 01799a9..24e634f 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -566,7 +566,7 @@
<string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"جارٍ تفعيل اللاسلكي..."</string>
<string name="emergency_enable_radio_dialog_retry" msgid="4329131876852608587">"لا تتوفر خدمة. جارٍ إعادة المحاولة…"</string>
<string name="radio_off_during_emergency_call" msgid="8011154134040481609">"لا يمكن دخول وضع الطيران أثناء إجراء مكالمة طوارئ."</string>
- <string name="dial_emergency_error" msgid="825822413209026039">"يتعذر الاتصال. لا يعد <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> رقم طوارئ."</string>
+ <string name="dial_emergency_error" msgid="825822413209026039">"يتعذر الاتصال. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ليس رقم طوارئ."</string>
<string name="dial_emergency_empty_error" msgid="2785803395047793634">"يتعذر الاتصال. يمكنك طلب رقم طوارئ."</string>
<string name="dial_emergency_calling_not_available" msgid="6485846193794727823">"مكالمة الطوارئ غير متوفرة"</string>
<string name="pin_puk_system_user_only" msgid="1045147220686867922">"يمكن لمالك الجهاز فقط إدخال رمزَي PIN/PUK."</string>
diff --git a/res/values-en-rCA/arrays.xml b/res/values-en-rCA/arrays.xml
index 08bac75..d8479e7 100644
--- a/res/values-en-rCA/arrays.xml
+++ b/res/values-en-rCA/arrays.xml
@@ -19,8 +19,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="preferred_network_mode_choices_world_mode">
<item msgid="8359756926680194770">"Global"</item>
- <item msgid="7497128470871581354">"LTE/CDMA"</item>
- <item msgid="1732367262765147258">"LTE/GSM/UMTS"</item>
+ <item msgid="7497128470871581354">"LTE / CDMA"</item>
+ <item msgid="1732367262765147258">"LTE / GSM / UMTS"</item>
</string-array>
<string-array name="preferred_network_mode_values_world_mode">
<item msgid="7956157363792248686">"10"</item>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index b861ae4..e605117 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -18,7 +18,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="phoneAppLabel" product="tablet" msgid="1916019789885839910">"Mobile Data"</string>
<string name="phoneAppLabel" product="default" msgid="130465039375347763">"Phone Services"</string>
- <string name="emergencyDialerIconLabel" msgid="8668005772339436680">"Emergency Dialler"</string>
+ <string name="emergencyDialerIconLabel" msgid="8668005772339436680">"Emergency Dialer"</string>
<string name="phoneIconLabel" msgid="3015941229249651419">"Phone"</string>
<string name="fdnListLabel" msgid="4119121875004244097">"FDN list"</string>
<string name="unknown" msgid="8279698889921830815">"Unknown"</string>
@@ -26,10 +26,10 @@
<string name="payphone" msgid="7936735771836716941">"Payphone"</string>
<string name="onHold" msgid="6132725550015899006">"On hold"</string>
<string name="carrier_mmi_msg_title" msgid="6050165242447507034">"<xliff:g id="MMICARRIER">%s</xliff:g> Message"</string>
- <string name="default_carrier_mmi_msg_title" msgid="7754317179938537213">"Operator message"</string>
+ <string name="default_carrier_mmi_msg_title" msgid="7754317179938537213">"Carrier Message"</string>
<string name="mmiStarted" msgid="9212975136944568623">"MMI code started"</string>
<string name="ussdRunning" msgid="1163586813106772717">"USSD code running…"</string>
- <string name="mmiCancelled" msgid="5339191899200678272">"MMI code cancelled"</string>
+ <string name="mmiCancelled" msgid="5339191899200678272">"MMI code canceled"</string>
<string name="cancel" msgid="8984206397635155197">"Cancel"</string>
<string name="enter_input" msgid="6193628663039958990">"USSD message must be between <xliff:g id="MIN_LEN">%1$d</xliff:g> and <xliff:g id="MAX_LEN">%2$d</xliff:g> characters. Please try again."</string>
<string name="manageConferenceLabel" msgid="8415044818156353233">"Manage conference call"</string>
@@ -47,7 +47,7 @@
<string name="no_vm_number" msgid="6623853880546176930">"Missing voicemail number"</string>
<string name="no_vm_number_msg" msgid="5165161462411372504">"No voicemail number is stored on the SIM card."</string>
<string name="add_vm_number_str" msgid="7368168964435881637">"Add number"</string>
- <string name="voice_number_setting_primary_user_only" msgid="3394706575741912843">"Voicemail settings can only be modified by the primary user."</string>
+ <string name="voice_number_setting_primary_user_only" msgid="3394706575741912843">"Voicemail Settings can only be modified by the Primary User."</string>
<string name="puk_unlocked" msgid="4627340655215746511">"Your SIM card has been unblocked. Your phone is unlocking…"</string>
<string name="label_ndp" msgid="7617392683877410341">"SIM network unlock PIN"</string>
<string name="label_phoneid" msgid="8775611434123577808">"SIM locked for operator"</string>
@@ -61,7 +61,7 @@
<string name="labelGsmMore_with_label" msgid="3206015314393246224">"GSM call settings (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCDMAMore" msgid="7937441382611224632">"CDMA call settings"</string>
<string name="labelCdmaMore_with_label" msgid="7759692829160238152">"CDMA call settings (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
- <string name="apn_settings" msgid="1978652203074756623">"Access point names"</string>
+ <string name="apn_settings" msgid="1978652203074756623">"Access Point Names"</string>
<string name="settings_label" msgid="9101778088412567956">"Network settings"</string>
<string name="phone_accounts" msgid="1216879437523774604">"Calling accounts"</string>
<string name="phone_accounts_make_calls_with" msgid="16747814788918145">"Make calls with"</string>
@@ -81,16 +81,16 @@
<string name="voicemail_settings_with_label" msgid="4228431668214894138">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="voicemail_abbreviated" msgid="7746778673131551185">"VM:"</string>
<string name="make_and_receive_calls" msgid="4868913166494621109">"Make & receive calls"</string>
- <string name="smart_forwarding_settings_menu" msgid="8850429887958938540">"Smart forwarding"</string>
+ <string name="smart_forwarding_settings_menu" msgid="8850429887958938540">"Smart Forwarding"</string>
<string name="smart_forwarding_settings_menu_summary" msgid="5096947726032885325">"When one number isn\'t reachable, always forward calls to your other number"</string>
<string name="voicemail_notifications_preference_title" msgid="7829238858063382977">"Notifications"</string>
<string name="cell_broadcast_settings" msgid="8135324242541809924">"Emergency broadcasts"</string>
<string name="call_settings" msgid="3677282690157603818">"Call settings"</string>
<string name="additional_gsm_call_settings" msgid="1561980168685658846">"Additional settings"</string>
<string name="additional_gsm_call_settings_with_label" msgid="7973920539979524908">"Additional settings (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
- <string name="sum_gsm_call_settings" msgid="7964692601608878138">"Additional GSM-only call settings"</string>
+ <string name="sum_gsm_call_settings" msgid="7964692601608878138">"Additional GSM only call settings"</string>
<string name="additional_cdma_call_settings" msgid="2178016561980611304">"Additional CDMA call settings"</string>
- <string name="sum_cdma_call_settings" msgid="3185825305136993636">"Additional CDMA-only call settings"</string>
+ <string name="sum_cdma_call_settings" msgid="3185825305136993636">"Additional CDMA only call settings"</string>
<string name="labelNwService" msgid="6015891883487125120">"Network service settings"</string>
<string name="labelCallerId" msgid="2090540744550903172">"Caller ID"</string>
<string name="sum_loading_settings" msgid="434063780286688775">"Loading settings…"</string>
@@ -100,7 +100,7 @@
<string name="labelCW" msgid="8449327023861428622">"Call waiting"</string>
<string name="sum_cw_enabled" msgid="3977308526187139996">"During a call, notify me of incoming calls"</string>
<string name="sum_cw_disabled" msgid="3658094589461768637">"During a call, notify me of incoming calls"</string>
- <string name="call_forwarding_settings" msgid="8937130467468257671">"Call-forwarding settings"</string>
+ <string name="call_forwarding_settings" msgid="8937130467468257671">"Call forwarding settings"</string>
<string name="call_forwarding_settings_with_label" msgid="2345432813399564272">"Call forwarding settings (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="labelCF" msgid="3578719437928476078">"Call forwarding"</string>
<string name="labelCFU" msgid="8870170873036279706">"Always forward"</string>
@@ -123,14 +123,14 @@
<string name="messageCFNRc" msgid="6980340731313007250">"Number when unreachable"</string>
<string name="sum_cfnrc_enabled" msgid="1799069234006073477">"Forwarding to <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfnrc_disabled" msgid="739289696796917683">"Off"</string>
- <string name="disable_cfnrc_forbidden" msgid="775348748084726890">"Your operator doesn\'t support disabling call forwarding when your phone is unreachable."</string>
- <string name="registration_cf_forbidden" msgid="4386482610771190420">"Your operator doesn\'t support call forwarding."</string>
+ <string name="disable_cfnrc_forbidden" msgid="775348748084726890">"Your carrier doesn\'t support disabling call forwarding when your phone is unreachable."</string>
+ <string name="registration_cf_forbidden" msgid="4386482610771190420">"Your carrier doesn\'t support call forwarding."</string>
<string name="cdma_call_waiting" msgid="4565070960879673216">"Turn on call waiting?"</string>
<string name="enable_cdma_call_waiting_setting" msgid="5906811747921744307">"During a call, you\'ll be notified about incoming calls"</string>
<string name="enable_cdma_cw" msgid="811047045863422232">"Turn on"</string>
<string name="disable_cdma_cw" msgid="7119290446496301734">"Cancel"</string>
- <string name="cdma_call_waiting_in_ims_on" msgid="6390979414188659218">"CDMA call waiting under IMS on"</string>
- <string name="cdma_call_waiting_in_ims_off" msgid="1099246114368636334">"CDMA call waiting under IMS off"</string>
+ <string name="cdma_call_waiting_in_ims_on" msgid="6390979414188659218">"CDMA Call Waiting under IMS On"</string>
+ <string name="cdma_call_waiting_in_ims_off" msgid="1099246114368636334">"CDMA Call Waiting under IMS Off"</string>
<string name="updating_title" msgid="6130548922615719689">"Call settings"</string>
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"Call settings can only be changed by the admin user."</string>
<string name="call_settings_with_label" msgid="8460230435361579511">"Settings (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
@@ -144,8 +144,8 @@
<string name="stk_cc_ss_to_ussd_error" msgid="8330749347425752192">"SS request changed to USSD request"</string>
<string name="stk_cc_ss_to_ss_error" msgid="8297155544652134278">"Changed to new SS request"</string>
<string name="stk_cc_ss_to_dial_video_error" msgid="4255261231466032505">"SS request changed to video call"</string>
- <string name="fdn_check_failure" msgid="1833769746374185247">"Your Phone app\'s fixed dialling numbers setting is turned on. As a result, some call-related features aren\'t working."</string>
- <string name="radio_off_error" msgid="8321564164914232181">"Please turn on the radio before viewing these settings."</string>
+ <string name="fdn_check_failure" msgid="1833769746374185247">"Your Phone app\'s Fixed Dialing Numbers setting is turned on. As a result, some call-related features aren\'t working."</string>
+ <string name="radio_off_error" msgid="8321564164914232181">"Turn on the radio before viewing these settings."</string>
<string name="close_dialog" msgid="1074977476136119408">"OK"</string>
<string name="enable" msgid="2636552299455477603">"Turn on"</string>
<string name="disable" msgid="1122698860799462116">"Turn off"</string>
@@ -156,22 +156,22 @@
<item msgid="9150034130629852635">"Show number"</item>
</string-array>
<string name="vm_changed" msgid="4739599044379692505">"Voicemail number changed."</string>
- <string name="vm_change_failed" msgid="7877733929455763566">"Couldn\'t change the voicemail number.\nContact your operator if this problem persists."</string>
- <string name="fw_change_failed" msgid="9179241823460192148">"Couldn\'t change the forwarding number.\nContact your operator if this problem persists."</string>
+ <string name="vm_change_failed" msgid="7877733929455763566">"Couldn\'t change the voicemail number.\nContact your carrier if this problem persists."</string>
+ <string name="fw_change_failed" msgid="9179241823460192148">"Couldn\'t change the forwarding number.\nContact your carrier if this problem persists."</string>
<string name="fw_get_in_vm_failed" msgid="2432678237218183844">"Couldn\'t retrieve and save current forwarding number settings.\nSwitch to the new provider anyway?"</string>
<string name="no_change" msgid="3737264882821031892">"No changes were made."</string>
<string name="sum_voicemail_choose_provider" msgid="6750824719081403773">"Choose voicemail service"</string>
- <string name="voicemail_default" msgid="6427575113775462077">"Your operator"</string>
+ <string name="voicemail_default" msgid="6427575113775462077">"Your carrier"</string>
<string name="vm_change_pin_old_pin" msgid="7154951790929009241">"Old PIN"</string>
<string name="vm_change_pin_new_pin" msgid="2656200418481288069">"New PIN"</string>
<string name="vm_change_pin_progress_message" msgid="626015184502739044">"Please wait."</string>
<string name="vm_change_pin_error_too_short" msgid="1789139338449945483">"The new PIN is too short."</string>
<string name="vm_change_pin_error_too_long" msgid="3634907034310018954">"The new PIN is too long."</string>
- <string name="vm_change_pin_error_too_weak" msgid="8581892952627885719">"The new PIN is too weak. A strong password should not have a continuous sequence or repeated digits."</string>
- <string name="vm_change_pin_error_mismatch" msgid="5364847280026257331">"The old PIN doesn\'t match."</string>
+ <string name="vm_change_pin_error_too_weak" msgid="8581892952627885719">"The new PIN is too weak. A strong password should not have continuous sequence or repeated digits."</string>
+ <string name="vm_change_pin_error_mismatch" msgid="5364847280026257331">"The old PIN does not match."</string>
<string name="vm_change_pin_error_invalid" msgid="5230002671175580674">"The new PIN contains invalid characters."</string>
<string name="vm_change_pin_error_system_error" msgid="9116483527909681791">"Unable to change PIN"</string>
- <string name="vvm_unsupported_message_format" msgid="4206402558577739713">"Unsupported message type. Call <xliff:g id="NUMBER">%s</xliff:g> to listen."</string>
+ <string name="vvm_unsupported_message_format" msgid="4206402558577739713">"Unsupported message type, call <xliff:g id="NUMBER">%s</xliff:g> to listen."</string>
<string name="network_settings_title" msgid="7560807107123171541">"Mobile network"</string>
<string name="label_available" msgid="1316084116670821258">"Available networks"</string>
<string name="load_networks_progress" msgid="4051433047717401683">"Searching…"</string>
@@ -179,13 +179,13 @@
<string name="network_query_error" msgid="3862515805115145124">"Couldn\'t find networks. Try again."</string>
<string name="register_on_network" msgid="4194770527833960423">"Registering on <xliff:g id="NETWORK">%s</xliff:g>…"</string>
<string name="not_allowed" msgid="8541221928746104798">"Your SIM card doesn\'t allow a connection to this network."</string>
- <string name="connect_later" msgid="1950138106010005425">"Can\'t connect to this network at the moment. Try again later."</string>
+ <string name="connect_later" msgid="1950138106010005425">"Can\'t connect to this network right now. Try again later."</string>
<string name="registration_done" msgid="5337407023566953292">"Registered on network."</string>
<string name="already_auto" msgid="8607068290733079336">"Already in automatic selection."</string>
<string name="select_automatically" msgid="779750291257872651">"Automatically select network"</string>
<string name="manual_mode_disallowed_summary" msgid="3970048592179890197">"Unavailable when connected to %1$s"</string>
<string name="network_select_title" msgid="4117305053881611988">"Network"</string>
- <string name="register_automatically" msgid="3907580547590554834">"Automatic registration..."</string>
+ <string name="register_automatically" msgid="3907580547590554834">"Automatic registration…"</string>
<string name="preferred_network_mode_title" msgid="5253395265169539830">"Preferred network type"</string>
<string name="preferred_network_mode_summary" msgid="3787989000044330064">"Change the network operating mode"</string>
<string name="preferred_network_mode_dialogtitle" msgid="2781447433514459696">"Preferred network type"</string>
@@ -193,7 +193,7 @@
<string name="choose_network_title" msgid="5335832663422653082">"Choose network"</string>
<string name="network_disconnected" msgid="8844141106841160825">"Disconnected"</string>
<string name="network_connected" msgid="2760235679963580224">"Connected"</string>
- <string name="network_connecting" msgid="160901383582774987">"Connecting…"</string>
+ <string name="network_connecting" msgid="160901383582774987">"Connecting..."</string>
<string name="network_could_not_connect" msgid="6547460848093727998">"Couldn’t connect"</string>
<string-array name="preferred_network_mode_choices">
<item msgid="4531933377509551889">"GSM/WCDMA preferred"</item>
@@ -208,7 +208,7 @@
<item msgid="1694517610683571748">"GSM/WCDMA/LTE"</item>
<item msgid="2431844716050955858">"Global"</item>
<item msgid="8522859526931346931">"LTE"</item>
- <item msgid="7852977970279215000">"LTE/WCDMA"</item>
+ <item msgid="7852977970279215000">"LTE / WCDMA"</item>
<item msgid="5779210256161024981">"TDSCDMA only"</item>
<item msgid="611913646308951205">"TDSCDMA/WCDMA"</item>
<item msgid="1738977207573340604">"LTE/TDSCDMA"</item>
@@ -234,9 +234,9 @@
<string name="preferred_network_mode_wcdma_perf_summary" msgid="7851493369130750126">"Preferred network mode: WCDMA preferred"</string>
<string name="preferred_network_mode_gsm_only_summary" msgid="4323367929994392830">"Preferred network mode: GSM only"</string>
<string name="preferred_network_mode_wcdma_only_summary" msgid="3585482191951442207">"Preferred network mode: WCDMA only"</string>
- <string name="preferred_network_mode_gsm_wcdma_summary" msgid="2988950751948316810">"Preferred network mode: GSM/WCDMA"</string>
+ <string name="preferred_network_mode_gsm_wcdma_summary" msgid="2988950751948316810">"Preferred network mode: GSM / WCDMA"</string>
<string name="preferred_network_mode_cdma_summary" msgid="9127141320343936911">"Preferred network mode: CDMA"</string>
- <string name="preferred_network_mode_cdma_evdo_summary" msgid="3629440709757307077">"Preferred network mode: CDMA/EvDo"</string>
+ <string name="preferred_network_mode_cdma_evdo_summary" msgid="3629440709757307077">"Preferred network mode: CDMA / EvDo"</string>
<string name="preferred_network_mode_cdma_only_summary" msgid="211164451887102568">"Preferred network mode: CDMA only"</string>
<string name="preferred_network_mode_evdo_only_summary" msgid="939116631952132878">"Preferred network mode: EvDo only"</string>
<string name="preferred_network_mode_cdma_evdo_gsm_wcdma_summary" msgid="7891131456022601976">"Preferred network mode: CDMA/EvDo/GSM/WCDMA"</string>
@@ -245,13 +245,13 @@
<string name="preferred_network_mode_lte_cdma_evdo_summary" msgid="5559198623419981805">"Preferred network mode: CDMA+LTE/EVDO"</string>
<string name="preferred_network_mode_lte_cdma_evdo_gsm_wcdma_summary" msgid="6707224437925495615">"Preferred network mode: LTE/CDMA/EvDo/GSM/WCDMA"</string>
<string name="preferred_network_mode_global_summary" msgid="3847086258439582411">"Preferred network mode: Global"</string>
- <string name="preferred_network_mode_lte_wcdma_summary" msgid="7001804022020813865">"Preferred network mode: LTE/WCDMA"</string>
- <string name="preferred_network_mode_lte_gsm_umts_summary" msgid="6484203890156282179">"Preferred network mode: LTE/GSM/UMTS"</string>
- <string name="preferred_network_mode_lte_cdma_summary" msgid="8187929456614068518">"Preferred network mode: LTE/CDMA"</string>
+ <string name="preferred_network_mode_lte_wcdma_summary" msgid="7001804022020813865">"Preferred network mode: LTE / WCDMA"</string>
+ <string name="preferred_network_mode_lte_gsm_umts_summary" msgid="6484203890156282179">"Preferred network mode: LTE / GSM / UMTS"</string>
+ <string name="preferred_network_mode_lte_cdma_summary" msgid="8187929456614068518">"Preferred network mode: LTE / CDMA"</string>
<string name="preferred_network_mode_tdscdma_summary" msgid="3602127224234207206">"Preferred network mode: TDSCDMA"</string>
- <string name="preferred_network_mode_tdscdma_wcdma_summary" msgid="7076968749402201123">"Preferred network mode: TDSCDMA/WCDMA"</string>
- <string name="preferred_network_mode_lte_tdscdma_summary" msgid="3001058390866953624">"Preferred network mode: LTE/TDSCDMA"</string>
- <string name="preferred_network_mode_tdscdma_gsm_summary" msgid="1716983444872465309">"Preferred network mode: TDSCDMA/GSM"</string>
+ <string name="preferred_network_mode_tdscdma_wcdma_summary" msgid="7076968749402201123">"Preferred network mode: TDSCDMA / WCDMA"</string>
+ <string name="preferred_network_mode_lte_tdscdma_summary" msgid="3001058390866953624">"Preferred network mode: LTE / TDSCDMA"</string>
+ <string name="preferred_network_mode_tdscdma_gsm_summary" msgid="1716983444872465309">"Preferred network mode: TDSCDMA / GSM"</string>
<string name="preferred_network_mode_lte_tdscdma_gsm_summary" msgid="1349057007230669585">"Preferred network mode: LTE/GSM/TDSCDMA"</string>
<string name="preferred_network_mode_tdscdma_gsm_wcdma_summary" msgid="2092262901885164194">"Preferred network mode: TDSCDMA/GSM/WCDMA"</string>
<string name="preferred_network_mode_lte_tdscdma_wcdma_summary" msgid="56422129430744466">"Preferred network mode: LTE/TDSCDMA/WCDMA"</string>
@@ -259,7 +259,7 @@
<string name="preferred_network_mode_tdscdma_cdma_evdo_gsm_wcdma_summary" msgid="2779089629254220257">"Preferred network mode: TDSCDMA/CDMA/EvDo/GSM/WCDMA"</string>
<string name="preferred_network_mode_lte_tdscdma_cdma_evdo_gsm_wcdma_summary" msgid="9065672185435798587">"Preferred network mode: LTE/TDSCDMA/CDMA/EvDo/GSM/WCDMA"</string>
<string name="preferred_network_mode_nr_only_summary" msgid="1467452233297987391">"Preferred network mode: NR only"</string>
- <string name="preferred_network_mode_nr_lte_summary" msgid="5890170406507535976">"Preferred network mode: NR/LTE"</string>
+ <string name="preferred_network_mode_nr_lte_summary" msgid="5890170406507535976">"Preferred network mode: NR / LTE"</string>
<string name="preferred_network_mode_nr_lte_cdma_evdo_summary" msgid="5507940227264296616">"Preferred network mode: NR/LTE/CDMA/EvDo"</string>
<string name="preferred_network_mode_nr_lte_gsm_wcdma_summary" msgid="2811179121638665248">"Preferred network mode: NR/LTE/GSM/WCDMA"</string>
<string name="preferred_network_mode_nr_lte_cdma_evdo_gsm_wcdma_summary" msgid="7631365223836621902">"Preferred network mode: NR/LTE/CDMA/EvDo/GSM/WCDMA"</string>
@@ -295,13 +295,13 @@
<string name="limited_sim_function_with_phone_num_notification_message" msgid="5928988883403677610">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> calls and data services may be blocked while using <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>."</string>
<string name="limited_sim_function_notification_message" msgid="5338638075496721160">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> calls and data services may be blocked while using another SIM."</string>
<string name="sip_accounts_removed_notification_title" msgid="3528076957535736095">"Deprecated SIP accounts found and removed"</string>
- <string name="sip_accounts_removed_notification_message" msgid="1916856744869791592">"SIP calling is no longer supported by the Android platform.\nYour existing SIP accounts <xliff:g id="REMOVED_SIP_ACCOUNTS">%s</xliff:g> have been removed.\nPlease confirm your default calling account setting."</string>
+ <string name="sip_accounts_removed_notification_message" msgid="1916856744869791592">"SIP calling is no longer supported by Android platform.\nYour existing SIP accounts <xliff:g id="REMOVED_SIP_ACCOUNTS">%s</xliff:g> have been removed.\nPlease confirm your default calling account setting."</string>
<string name="sip_accounts_removed_notification_action" msgid="3772778402370555562">"Go to settings"</string>
<string name="data_usage_title" msgid="8438592133893837464">"App data usage"</string>
<string name="data_usage_template" msgid="6287906680674061783">"<xliff:g id="ID_1">%1$s</xliff:g> mobile data used <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="advanced_options_title" msgid="9208195294513520934">"Advanced"</string>
<string name="carrier_settings_euicc" msgid="1190237227261337749">"Carrier"</string>
- <string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"operator, esim, sim, euicc, switch operators, add operator"</string>
+ <string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"carrier, esim, sim, euicc, switch carriers, add carrier"</string>
<string name="carrier_settings_euicc_summary" msgid="2027941166597330117">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
<string name="mobile_data_settings_title" msgid="7228249980933944101">"Mobile data"</string>
<string name="mobile_data_settings_summary" msgid="5012570152029118471">"Access data using mobile network"</string>
@@ -315,20 +315,20 @@
<string name="cdma_options" msgid="3669592472226145665">"CDMA Options"</string>
<string name="throttle_data_usage" msgid="1944145350660420711">"Data usage"</string>
<string name="throttle_current_usage" msgid="7483859109708658613">"Data used in current period"</string>
- <string name="throttle_time_frame" msgid="1813452485948918791">"Data usage period"</string>
+ <string name="throttle_time_frame" msgid="1813452485948918791">"Data use period"</string>
<string name="throttle_rate" msgid="7641913901133634905">"Data rate policy"</string>
<string name="throttle_help" msgid="2624535757028809735">"Learn more"</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>٪) of <xliff:g id="USED_2">%3$s</xliff:g> period maximum\nNext period starts in <xliff:g id="USED_3">%4$d</xliff:g> days (<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>٪) of <xliff:g id="USED_2">%3$s</xliff:g> period maximum"</string>
<string name="throttle_data_rate_reduced_subtext" msgid="8369839346277847725">"<xliff:g id="USED_0">%1$s</xliff:g> maximum exceeded\nData rate reduced to <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
<string name="throttle_time_frame_subtext" msgid="6462089615392402127">"<xliff:g id="USED_0">%1$d</xliff:g>٪ of cycle elapsed\nNext period starts in <xliff:g id="USED_1">%2$d</xliff:g> days (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="7221971817325779535">"Data rate reduced to <xliff:g id="USED">%1$d</xliff:g> Kb/s if data usage limit is exceeded"</string>
- <string name="throttle_help_subtext" msgid="2817114897095534807">"More information about your operator\'s mobile network data usage policy"</string>
- <string name="cell_broadcast_sms" msgid="4053449797289031063">"Mobile Broadcast SMS"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4759958924031721350">"Mobile Broadcast SMS"</string>
- <string name="cell_bc_sms_enable" msgid="2019708772024632073">"Mobile Broadcast SMS enabled"</string>
- <string name="cell_bc_sms_disable" msgid="1214238639910875347">"Mobile Broadcast SMS disabled"</string>
- <string name="cb_sms_settings" msgid="6858093721831312036">"Mobile Broadcast SMS settings"</string>
+ <string name="throttle_rate_subtext" msgid="7221971817325779535">"Data rate reduced to <xliff:g id="USED">%1$d</xliff:g> Kb/s if data use limit is exceeded"</string>
+ <string name="throttle_help_subtext" msgid="2817114897095534807">"More information about your carrier\'s mobile network data use policy"</string>
+ <string name="cell_broadcast_sms" msgid="4053449797289031063">"Cell Broadcast SMS"</string>
+ <string name="enable_disable_cell_bc_sms" msgid="4759958924031721350">"Cell Broadcast SMS"</string>
+ <string name="cell_bc_sms_enable" msgid="2019708772024632073">"Cell Broadcast SMS enabled"</string>
+ <string name="cell_bc_sms_disable" msgid="1214238639910875347">"Cell Broadcast SMS disabled"</string>
+ <string name="cb_sms_settings" msgid="6858093721831312036">"Cell Broadcast SMS settings"</string>
<string name="enable_disable_emergency_broadcast" msgid="6325655044472196496">"Emergency Broadcast"</string>
<string name="emergency_broadcast_enable" msgid="5759610647771102442">"Emergency Broadcast enabled"</string>
<string name="emergency_broadcast_disable" msgid="2844904734469323266">"Emergency Broadcast disabled"</string>
@@ -396,15 +396,15 @@
<string name="enable_disable_advertisements" msgid="8704125663718797151">"Advertisements"</string>
<string name="advertisements_enable" msgid="8651409664217899145">"Advertisements enabled"</string>
<string name="advertisements_disable" msgid="2999957360508271492">"Advertisements disabled"</string>
- <string name="enable_disable_stock_quotes" msgid="631498357725951825">"Share Quotes"</string>
- <string name="stock_quotes_enable" msgid="5104318195579771947">"Share Quotes enabled"</string>
- <string name="stock_quotes_disable" msgid="3126423481704498278">"Share Quotes disabled"</string>
+ <string name="enable_disable_stock_quotes" msgid="631498357725951825">"Stock Quotes"</string>
+ <string name="stock_quotes_enable" msgid="5104318195579771947">"Stock Quotes enabled"</string>
+ <string name="stock_quotes_disable" msgid="3126423481704498278">"Stock Quotes disabled"</string>
<string name="enable_disable_eo" msgid="5730223317238970819">"Employment Opportunities"</string>
<string name="eo_enable" msgid="107713355461019817">"Employment Opportunities enabled"</string>
<string name="eo_disable" msgid="3955421278929647485">"Employment Opportunities disabled"</string>
- <string name="enable_disable_mhh" msgid="715930476289202466">"Medical, Health and Hospital"</string>
- <string name="mhh_enable" msgid="7224396815285147008">"Medical, Health and Hospital enabled"</string>
- <string name="mhh_disable" msgid="5503643028885686265">"Medical, Health and Hospital disabled"</string>
+ <string name="enable_disable_mhh" msgid="715930476289202466">"Medical, Health, and Hospital"</string>
+ <string name="mhh_enable" msgid="7224396815285147008">"Medical, Health, and Hospital enabled"</string>
+ <string name="mhh_disable" msgid="5503643028885686265">"Medical, Health, and Hospital disabled"</string>
<string name="enable_disable_technology_news" msgid="2794845609698078400">"Technology News"</string>
<string name="technology_news_enable" msgid="1908991199492598311">"Technology News enabled"</string>
<string name="technology_news_disable" msgid="8388582607149800889">"Technology News disabled"</string>
@@ -435,20 +435,20 @@
</string-array>
<string name="cdma_activate_device" msgid="5914720276140097632">"Activate device"</string>
<string name="cdma_lte_data_service" msgid="359786441782404562">"Set up data service"</string>
- <string name="carrier_settings_title" msgid="6292869148169850220">"Provider settings"</string>
- <string name="fdn" msgid="2545904344666098749">"Fixed dialling numbers"</string>
- <string name="fdn_with_label" msgid="6412087553365709494">"Fixed dialling numbers (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+ <string name="carrier_settings_title" msgid="6292869148169850220">"Carrier settings"</string>
+ <string name="fdn" msgid="2545904344666098749">"Fixed Dialing Numbers"</string>
+ <string name="fdn_with_label" msgid="6412087553365709494">"Fixed Dialing Numbers (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="manage_fdn_list" msgid="3341716430375195441">"FDN list"</string>
<string name="fdn_list_with_label" msgid="1409655283510382556">"FDN list (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="fdn_activation" msgid="2178637004710435895">"FDN activation"</string>
- <string name="fdn_enabled" msgid="7017355494808056447">"Fixed dialling numbers are enabled"</string>
- <string name="fdn_disabled" msgid="6696468878037736600">"Fixed dialling numbers are disabled"</string>
+ <string name="fdn_enabled" msgid="7017355494808056447">"Fixed Dialing Numbers are enabled"</string>
+ <string name="fdn_disabled" msgid="6696468878037736600">"Fixed Dialing Numbers are disabled"</string>
<string name="enable_fdn" msgid="4830555730418033723">"Enable FDN"</string>
<string name="disable_fdn" msgid="3918794950264647541">"Disable FDN"</string>
<string name="change_pin2" msgid="3110844547237754871">"Change PIN2"</string>
<string name="enable_fdn_ok" msgid="5080925177369329827">"Disable FDN"</string>
<string name="disable_fdn_ok" msgid="3745475926874838676">"Enable FDN"</string>
- <string name="sum_fdn" msgid="6152246141642323582">"Manage fixed dialling numbers"</string>
+ <string name="sum_fdn" msgid="6152246141642323582">"Manage Fixed Dialing Numbers"</string>
<string name="sum_fdn_change_pin" msgid="3510994280557335727">"Change PIN for FDN access"</string>
<string name="sum_fdn_manage_list" msgid="3311397063233992907">"Manage phone number list"</string>
<string name="voice_privacy" msgid="7346935172372181951">"Voice privacy"</string>
@@ -466,18 +466,18 @@
<string name="name" msgid="1347432469852527784">"Name"</string>
<string name="number" msgid="1564053487748491000">"Number"</string>
<string name="save" msgid="983805790346099749">"Save"</string>
- <string name="add_fdn_contact" msgid="1169713422306640887">"Add fixed dialling number"</string>
- <string name="adding_fdn_contact" msgid="3112531600824361259">"Adding fixed dialling number…"</string>
- <string name="fdn_contact_added" msgid="2840016151693394596">"Fixed dialling number added."</string>
- <string name="edit_fdn_contact" msgid="6030829994819587408">"Edit fixed dialling number"</string>
- <string name="updating_fdn_contact" msgid="6989341376868227150">"Updating fixed dialling number…"</string>
- <string name="fdn_contact_updated" msgid="6876330243323118937">"Fixed dialling number updated."</string>
- <string name="delete_fdn_contact" msgid="7027405651994507077">"Delete fixed dialling number"</string>
- <string name="deleting_fdn_contact" msgid="6872320570844460428">"Deleting fixed dialling number…"</string>
- <string name="fdn_contact_deleted" msgid="1680714996763848838">"Fixed dialling number deleted."</string>
+ <string name="add_fdn_contact" msgid="1169713422306640887">"Add fixed dialing number"</string>
+ <string name="adding_fdn_contact" msgid="3112531600824361259">"Adding fixed dialing number…"</string>
+ <string name="fdn_contact_added" msgid="2840016151693394596">"Fixed dialing number added."</string>
+ <string name="edit_fdn_contact" msgid="6030829994819587408">"Edit fixed dialing number"</string>
+ <string name="updating_fdn_contact" msgid="6989341376868227150">"Updating fixed dialing number…"</string>
+ <string name="fdn_contact_updated" msgid="6876330243323118937">"Fixed dialing number updated."</string>
+ <string name="delete_fdn_contact" msgid="7027405651994507077">"Delete fixed dialing number"</string>
+ <string name="deleting_fdn_contact" msgid="6872320570844460428">"Deleting fixed dialing number…"</string>
+ <string name="fdn_contact_deleted" msgid="1680714996763848838">"Fixed dialing number deleted."</string>
<string name="pin2_invalid" msgid="2313954262684494442">"FDN wasn\'t updated because you typed an incorrect PIN."</string>
<string name="fdn_invalid_number" msgid="9067189814657840439">"FDN wasn\'t updated because the number exceeds <xliff:g id="FDN_NUMBER_LIMIT_LENGTH">%d</xliff:g> digits."</string>
- <string name="pin2_or_fdn_invalid" msgid="7542639487955868181">"FDN wasn\'t updated. The PIN2 was incorrect or the phone number was rejected."</string>
+ <string name="pin2_or_fdn_invalid" msgid="7542639487955868181">"FDN wasn\'t updated. The PIN2 was incorrect, or the phone number was rejected."</string>
<string name="fdn_failed" msgid="216592346853420250">"FDN operation failed."</string>
<string name="simContacts_emptyLoading" msgid="4989040293858675483">"Reading from SIM card…"</string>
<string name="simContacts_empty" msgid="1135632055473689521">"No contacts on your SIM card."</string>
@@ -489,8 +489,8 @@
<string name="oldPinLabel" msgid="8618515202411987721">"Old PIN"</string>
<string name="newPinLabel" msgid="3585899083055354732">"New PIN"</string>
<string name="confirmPinLabel" msgid="7783531218662473778">"Confirm new PIN"</string>
- <string name="badPin" msgid="4549286285015892321">"The old PIN that you typed isn\'t correct. Try again."</string>
- <string name="mismatchPin" msgid="1467254768290323845">"The PINs that you typed don\'t match. Try again."</string>
+ <string name="badPin" msgid="4549286285015892321">"The old PIN you typed isn\'t correct. Try again."</string>
+ <string name="mismatchPin" msgid="1467254768290323845">"The PINs you typed don\'t match. Try again."</string>
<string name="invalidPin" msgid="7363723429414001979">"Type a PIN that is 4 to 8 numbers."</string>
<string name="disable_sim_pin" msgid="3112303905548613752">"Clear SIM PIN"</string>
<string name="enable_sim_pin" msgid="445461050748318980">"Set SIM PIN"</string>
@@ -520,8 +520,8 @@
<string name="pin2_error_exception" msgid="8116103864600823641">"Network or SIM card error"</string>
<string name="doneButton" msgid="7371209609238460207">"Done"</string>
<string name="voicemail_settings_number_label" msgid="1265118640154688162">"Voicemail number"</string>
- <string name="card_title_dialing" msgid="8742182654254431781">"Dialling"</string>
- <string name="card_title_redialing" msgid="18130232613559964">"Redialling"</string>
+ <string name="card_title_dialing" msgid="8742182654254431781">"Dialing"</string>
+ <string name="card_title_redialing" msgid="18130232613559964">"Redialing"</string>
<string name="card_title_conf_call" msgid="901197309274457427">"Conference call"</string>
<string name="card_title_incoming_call" msgid="881424648458792430">"Incoming call"</string>
<string name="card_title_call_ended" msgid="650223980095026340">"Call ended"</string>
@@ -541,10 +541,10 @@
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Exit emergency callback mode to make a non-emergency call."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"Not registered on network."</string>
<string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobile network not available."</string>
- <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobile network isn\'t available. Connect to a wireless network to make a call."</string>
+ <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobile network is not available. Connect to a wireless network to make a call."</string>
<string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"To place a call, enter a valid number."</string>
<string name="incall_error_call_failed" msgid="393508653582682539">"Call failed."</string>
- <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Call cannot be added at this time. You can try to get in touch by sending a message."</string>
+ <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Call cannot be added at this time. You can try to reach out by sending a message."</string>
<string name="incall_error_supp_service_unknown" msgid="8751177117194592623">"Service not supported"</string>
<string name="incall_error_supp_service_switch" msgid="5272822448189448479">"Can\'t switch calls."</string>
<string name="incall_error_supp_service_resume" msgid="1276861499306817035">"Can\'t resume call."</string>
@@ -577,7 +577,7 @@
<string name="dialerKeyboardHintText" msgid="1115266533703764049">"Use keyboard to dial"</string>
<string name="onscreenHoldText" msgid="4025348842151665191">"Hold"</string>
<string name="onscreenEndCallText" msgid="6138725377654842757">"End"</string>
- <string name="onscreenShowDialpadText" msgid="658465753816164079">"Dial pad"</string>
+ <string name="onscreenShowDialpadText" msgid="658465753816164079">"Dialpad"</string>
<string name="onscreenMuteText" msgid="5470306116733843621">"Mute"</string>
<string name="onscreenAddCallText" msgid="9075675082903611677">"Add call"</string>
<string name="onscreenMergeCallsText" msgid="3692389519611225407">"Merge calls"</string>
@@ -593,14 +593,14 @@
<string name="singleContactImportedMsg" msgid="3619804066300998934">"Imported contact"</string>
<string name="failedToImportSingleContactMsg" msgid="228095510489830266">"Failed to import contact"</string>
<string name="hac_mode_title" msgid="4127986689621125468">"Hearing aids"</string>
- <string name="hac_mode_summary" msgid="7774989500136009881">"Turn on hearing-aid compatibility"</string>
+ <string name="hac_mode_summary" msgid="7774989500136009881">"Turn on hearing aid compatibility"</string>
<string name="rtt_mode_title" msgid="3075948111362818043">"Real-time text (RTT) call"</string>
<string name="rtt_mode_summary" msgid="8631541375609989562">"Allow messaging within a voice call"</string>
- <string name="rtt_mode_more_information" msgid="587500128658756318">"RTT assists callers who are deaf, hard of hearing, have a speech disability or need more than voice alone.<br> <a href=<xliff:g id="URL">http://support.google.com/mobile?p=telephony_rtt</xliff:g>>Learn more</a>\n <br><br> – RTT calls are saved as a message transcript\n <br> – RTT is not available for video calls"</string>
+ <string name="rtt_mode_more_information" msgid="587500128658756318">"RTT assists callers who are deaf, hard of hearing, have a speech disability, or need more than voice alone.<br> <a href=<xliff:g id="URL">http://support.google.com/mobile?p=telephony_rtt</xliff:g>>Learn more</a>\n <br><br> - RTT calls are saved as a message transcript\n <br> - RTT is not available for video calls"</string>
<string name="no_rtt_when_roaming" msgid="5268008247378355389">"Note: RTT is not available while roaming"</string>
<string-array name="tty_mode_entries">
- <item msgid="3238070884803849303">"TTY off"</item>
- <item msgid="1449091874731375214">"TTY full"</item>
+ <item msgid="3238070884803849303">"TTY Off"</item>
+ <item msgid="1449091874731375214">"TTY Full"</item>
<item msgid="1044179293199519425">"TTY HCO"</item>
<item msgid="2131559553795606483">"TTY VCO"</item>
</string-array>
@@ -617,7 +617,7 @@
<string name="ota_hfa_activation_title" msgid="3300556778212729671">"Activating..."</string>
<string name="ota_hfa_activation_dialog_message" msgid="7921718445773342996">"The phone is activating your mobile data service.\n\nThis can take up to 5 minutes."</string>
<string name="ota_skip_activation_dialog_title" msgid="7666611236789203797">"Skip activation?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"If you skip activation, you can\'t place calls or connect to mobile data networks (though you can connect to Wi-Fi networks). Until you activate your phone, you are asked to activate it each time that you turn it on."</string>
+ <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"If you skip activation, you can\'t place calls or connect to mobile data networks (though you can connect to Wi-Fi networks). Until you activate your phone, you are asked to activate it each time you turn it on."</string>
<string name="ota_skip_activation_dialog_skip_label" msgid="5908029466817825633">"Skip"</string>
<string name="ota_activate" msgid="7939695753665438357">"Activate"</string>
<string name="ota_title_activate_success" msgid="1272135024761004889">"Phone is activated."</string>
@@ -625,9 +625,9 @@
<string name="ota_listen" msgid="2772252405488894280">"Follow the spoken instructions until you hear that activation is complete."</string>
<string name="ota_speaker" msgid="1086766980329820528">"Speaker"</string>
<string name="ota_progress" msgid="8837259285255700132">"Programming your phone…"</string>
- <string name="ota_failure" msgid="5674217489921481576">"Couldn\'t programme your phone"</string>
+ <string name="ota_failure" msgid="5674217489921481576">"Couldn\'t program your phone"</string>
<string name="ota_successful" msgid="1106825981548107774">"Your phone is now activated. It may take up to 15 minutes for service to start."</string>
- <string name="ota_unsuccessful" msgid="8531037653803955754">"Your phone didn\'t activate. \nYou may need to find an area with better coverage (near a window or outside). \n\nTry again or call customer service for more options."</string>
+ <string name="ota_unsuccessful" msgid="8531037653803955754">"Your phone didn\'t activate. \nYou may need to find an area with better coverage (near a window, or outside). \n\nTry again or call customer service for more options."</string>
<string name="ota_spc_failure" msgid="904092035241370080">"EXCESS SPC FAILURES"</string>
<string name="ota_call_end" msgid="8657746378290737034">"Back"</string>
<string name="ota_try_again" msgid="6914781945599998550">"Try again"</string>
@@ -637,9 +637,9 @@
<string name="phone_in_ecm_notification_title" msgid="6825016389926367946">"Emergency Callback Mode"</string>
<string name="phone_in_ecm_call_notification_text" msgid="653972232922670335">"Data connection disabled"</string>
<string name="phone_in_ecm_notification_complete_time" msgid="7341624337163082759">"No data connection until <xliff:g id="COMPLETETIME">%s</xliff:g>"</string>
- <string name="alert_dialog_exit_ecm" msgid="7661603870224398025">"{count,plural, =1{The phone will be in emergency callback mode for one minute. While in this mode, no apps using a data connection can be used. Do you want to exit now?}other{The phone will be in emergency callback mode for %s minutes. While in this mode, no applications using a data connection can be used. Do you want to exit now?}}"</string>
- <string name="alert_dialog_not_avaialble_in_ecm" msgid="8717711120099503279">"{count,plural, =1{The selected action isn\'t available while in the emergency callback mode. The phone will be in this mode for one minute. Do you want to exit now?}other{The selected action isn\'t available while in the emergency callback mode. The phone will be in this mode for %s minutes. Do you want to exit now?}}"</string>
- <string name="alert_dialog_in_ecm_call" msgid="1207545603149771978">"The action selected isn\'t available during an emergency call."</string>
+ <string name="alert_dialog_exit_ecm" msgid="7661603870224398025">"{count,plural, =1{The phone will be in Emergency Callback mode for one minute. While in this mode no apps using a data connection can be used. Do you want to exit now?}other{The phone will be in Emergency Callback mode for %s minutes. While in this mode no applications using a data connection can be used. Do you want to exit now?}}"</string>
+ <string name="alert_dialog_not_avaialble_in_ecm" msgid="8717711120099503279">"{count,plural, =1{The selected action isn\'t available while in the Emergency Callback mode. The phone will be in this mode for one minute. Do you want to exit now?}other{The selected action isn\'t available while in the Emergency Callback mode. The phone will be in this mode for %s minutes. Do you want to exit now?}}"</string>
+ <string name="alert_dialog_in_ecm_call" msgid="1207545603149771978">"The selected action isn\'t available while in an emergency call."</string>
<string name="progress_dialog_exiting_ecm" msgid="9159080081676927217">"Exiting Emergency Callback mode"</string>
<string name="alert_dialog_yes" msgid="3532525979632841417">"Yes"</string>
<string name="alert_dialog_no" msgid="1075632654085988420">"No"</string>
@@ -657,8 +657,8 @@
<string name="selectContact" msgid="1527612842599767382">"select contact"</string>
<string name="not_voice_capable" msgid="2819996734252084253">"Voice calling not supported"</string>
<string name="description_dial_button" msgid="8614631902795087259">"dial"</string>
- <string name="description_dialpad_button" msgid="7395114120463883623">"show dial pad"</string>
- <string name="pane_title_emergency_dialpad" msgid="3627372514638694401">"Emergency dial pad"</string>
+ <string name="description_dialpad_button" msgid="7395114120463883623">"show dialpad"</string>
+ <string name="pane_title_emergency_dialpad" msgid="3627372514638694401">"Emergency Dialpad"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="6610414098912832120">"Visual Voicemail"</string>
<string name="voicemail_set_pin_dialog_title" msgid="7005128605986960003">"Set PIN"</string>
<string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"Change PIN"</string>
@@ -677,7 +677,7 @@
<string name="message_decode_error" msgid="1061856591500290887">"There was an error while decoding the message."</string>
<string name="callFailed_cdma_activation" msgid="5392057031552253550">"A SIM card has activated your service and updated your phone\'s roaming capabilities."</string>
<string name="callFailed_cdma_call_limit" msgid="1074219746093031412">"There are too many active calls. Please end or merge existing calls before placing a new one."</string>
- <string name="callFailed_imei_not_accepted" msgid="7257903653685147251">"Unable to connect. Please insert a valid SIM card."</string>
+ <string name="callFailed_imei_not_accepted" msgid="7257903653685147251">"Unable to connect, please insert a valid SIM card."</string>
<string name="callFailed_wifi_lost" msgid="1788036730589163141">"Wi-Fi connection lost. Call ended."</string>
<string name="dialFailed_low_battery" msgid="6857904237423407056">"Your video call cannot be placed due to low battery."</string>
<string name="callFailed_low_battery" msgid="4056828320214416182">"Video call ended due to low battery."</string>
@@ -686,11 +686,11 @@
<string name="change_pin_title" msgid="3564254326626797321">"Change Voicemail PIN"</string>
<string name="change_pin_continue_label" msgid="5177011752453506371">"Continue"</string>
<string name="change_pin_cancel_label" msgid="2301711566758827936">"Cancel"</string>
- <string name="change_pin_ok_label" msgid="6861082678817785330">"OK"</string>
+ <string name="change_pin_ok_label" msgid="6861082678817785330">"Ok"</string>
<string name="change_pin_enter_old_pin_header" msgid="853151335217594829">"Confirm your old PIN"</string>
<string name="change_pin_enter_old_pin_hint" msgid="8801292976275169367">"Enter your voicemail PIN to continue."</string>
<string name="change_pin_enter_new_pin_header" msgid="4739465616733486118">"Set a new PIN"</string>
- <string name="change_pin_enter_new_pin_hint" msgid="2326038476516364210">"PIN must be <xliff:g id="MIN">%1$d</xliff:g>-<xliff:g id="MAX">%2$d</xliff:g> digits long."</string>
+ <string name="change_pin_enter_new_pin_hint" msgid="2326038476516364210">"PIN must be <xliff:g id="MIN">%1$d</xliff:g>-<xliff:g id="MAX">%2$d</xliff:g> digits."</string>
<string name="change_pin_confirm_pin_header" msgid="2606303906320705726">"Confirm your PIN"</string>
<string name="change_pin_confirm_pins_dont_match" msgid="305164501222587215">"PINs don\'t match"</string>
<string name="change_pin_succeeded" msgid="2504705600693014403">"Voicemail PIN updated"</string>
@@ -787,14 +787,14 @@
<string name="call_barring_change_pwd_description" msgid="1274245130382054227">"Change call barring password"</string>
<string name="call_barring_change_pwd_description_disabled" msgid="2911647051915343920">"Cannot change call barring password"</string>
<string name="call_barring_pwd_not_match" msgid="7638198747579019826">"Passwords do not match"</string>
- <string name="call_barring_right_pwd_number" msgid="3860630926460851330">"Enter a password with four numbers"</string>
+ <string name="call_barring_right_pwd_number" msgid="3860630926460851330">"Enter a password with 4 numbers"</string>
<string name="call_barring_change_pwd_success" msgid="1837437691277936903">"Password changed"</string>
<string name="call_barring_old_pwd" msgid="5500085633281388281">"Old password"</string>
<string name="call_barring_new_pwd" msgid="2515524903813227732">"New password"</string>
<string name="call_barring_confirm_pwd" msgid="7552526161616461858">"Confirm password"</string>
<string name="messageCallBarring" msgid="5537730400652466912">"Enter password"</string>
<string name="call_barring_settings" msgid="4616607285790258919">"Call barring settings"</string>
- <string name="callFailed_NetworkBusy" msgid="5437103975842913681">"Network is busy. Please try placing your call again later."</string>
+ <string name="callFailed_NetworkBusy" msgid="5437103975842913681">"Network is busy. Please try your call again later."</string>
<string name="callFailed_NetworkCongested" msgid="6801283142342775380">"Network is congested. Contact your mobile operator for assistance."</string>
<string name="supp_service_notification_call_deflected" msgid="4980942818105909813">"Call deflected."</string>
<string name="supp_service_notification_call_forwarded" msgid="7102930311735433088">"Call forwarded."</string>
@@ -814,49 +814,49 @@
<string name="supp_service_conference_call" msgid="4004193534408317148">"Joining conference call."</string>
<string name="supp_service_held_call_released" msgid="2847835124639112410">"Held call has been released."</string>
<string name="callFailed_otasp_provisioning_in_process" msgid="3345666183602879326">"Cannot place a call as the device is currently being provisioned."</string>
- <string name="callFailed_already_dialing" msgid="7250591188960691086">"Cannot place a call as another outgoing call is already dialling."</string>
+ <string name="callFailed_already_dialing" msgid="7250591188960691086">"Cannot place a call as another outgoing call is already dialing."</string>
<string name="callFailed_already_ringing" msgid="2376603543544289303">"Cannot place a call as there is an unanswered incoming call. Answer or reject the incoming call prior to placing a new call."</string>
<string name="callFailed_calling_disabled" msgid="5010992739401206283">"Cannot place a call as calling has been disabled using the ro.telephony.disable-call system property."</string>
<string name="callFailed_too_many_calls" msgid="2761754044990799580">"Cannot place a call as there are already two calls in progress. Disconnect one of the calls or merge them into a conference prior to placing a new call."</string>
- <string name="supp_service_over_ut_precautions" msgid="2145018231396701311">"To use <xliff:g id="SUPP_SERVICE">%s</xliff:g>, make sure that mobile data is turned on. You can change this in mobile network settings."</string>
- <string name="supp_service_over_ut_precautions_roaming" msgid="670342104569972327">"To use <xliff:g id="SUPP_SERVICE">%s</xliff:g>, make sure that mobile data and data roaming are turned on. You can change these in mobile network settings."</string>
- <string name="supp_service_over_ut_precautions_dual_sim" msgid="5166866975550910474">"To use <xliff:g id="SUPP_SERVICE">%1$s</xliff:g>, make sure that mobile data is turned on for SIM <xliff:g id="SIM_NUMBER">%2$d</xliff:g>. You can change this in mobile network settings."</string>
- <string name="supp_service_over_ut_precautions_roaming_dual_sim" msgid="6627654855191817965">"To use <xliff:g id="SUPP_SERVICE">%1$s</xliff:g>, make sure that mobile data and data roaming are turned on for SIM <xliff:g id="SIM_NUMBER">%2$d</xliff:g>. You can change these in mobile network settings."</string>
+ <string name="supp_service_over_ut_precautions" msgid="2145018231396701311">"To use <xliff:g id="SUPP_SERVICE">%s</xliff:g>, make sure mobile data is turned on. You can change this in mobile network settings."</string>
+ <string name="supp_service_over_ut_precautions_roaming" msgid="670342104569972327">"To use <xliff:g id="SUPP_SERVICE">%s</xliff:g>, make sure mobile data and data roaming are turned on. You can change these in mobile network settings."</string>
+ <string name="supp_service_over_ut_precautions_dual_sim" msgid="5166866975550910474">"To use <xliff:g id="SUPP_SERVICE">%1$s</xliff:g>, make sure mobile data is turned on for SIM <xliff:g id="SIM_NUMBER">%2$d</xliff:g>. You can change this in mobile network settings."</string>
+ <string name="supp_service_over_ut_precautions_roaming_dual_sim" msgid="6627654855191817965">"To use <xliff:g id="SUPP_SERVICE">%1$s</xliff:g>, make sure mobile data and data roaming are turned on for SIM <xliff:g id="SIM_NUMBER">%2$d</xliff:g>. You can change these in mobile network settings."</string>
<string name="supp_service_over_ut_precautions_dialog_dismiss" msgid="5934541487903081652">"Dismiss"</string>
- <string name="radio_info_data_connection_enable" msgid="6183729739783252840">"Enable data connection"</string>
- <string name="radio_info_data_connection_disable" msgid="6404751291511368706">"Disable data connection"</string>
- <string name="volte_provisioned_switch_string" msgid="4812874990480336178">"VoLTE provisioned"</string>
- <string name="vt_provisioned_switch_string" msgid="8295542122512195979">"Video calling provisioned"</string>
- <string name="wfc_provisioned_switch_string" msgid="3835004640321078988">"Wi-Fi calling provisioned"</string>
- <string name="eab_provisioned_switch_string" msgid="4449676720736033035">"EAB/Presence provisioned"</string>
- <string name="cbrs_data_switch_string" msgid="6060356430838077653">"CBRS data"</string>
+ <string name="radio_info_data_connection_enable" msgid="6183729739783252840">"Enable Data Connection"</string>
+ <string name="radio_info_data_connection_disable" msgid="6404751291511368706">"Disable Data Connection"</string>
+ <string name="volte_provisioned_switch_string" msgid="4812874990480336178">"VoLTE Provisioned"</string>
+ <string name="vt_provisioned_switch_string" msgid="8295542122512195979">"Video Calling Provisioned"</string>
+ <string name="wfc_provisioned_switch_string" msgid="3835004640321078988">"Wifi Calling Provisioned"</string>
+ <string name="eab_provisioned_switch_string" msgid="4449676720736033035">"EAB/Presence Provisioned"</string>
+ <string name="cbrs_data_switch_string" msgid="6060356430838077653">"Cbrs Data"</string>
<string name="dsds_switch_string" msgid="7564769822086764796">"Enable DSDS"</string>
- <string name="dsds_dialog_title" msgid="8494569893941847575">"Restart device?"</string>
+ <string name="dsds_dialog_title" msgid="8494569893941847575">"Restart Device?"</string>
<string name="dsds_dialog_message" msgid="4047480385678538850">"You need to restart your device to change this setting."</string>
<string name="dsds_dialog_confirm" msgid="9032004888134129885">"Restart"</string>
<string name="dsds_dialog_cancel" msgid="3245958947099586655">"Cancel"</string>
- <string name="removable_esim_string" msgid="7931369811671787649">"Set removable eSIM as default"</string>
- <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobile radio power"</string>
- <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulate out of service (debug build only)"</string>
- <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"View SIM address book"</string>
- <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"View fixed dialling numbers"</string>
- <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"View service dialling numbers"</string>
- <string name="radioInfo_menu_getIMS" msgid="1950869267853198232">"IMS service status"</string>
- <string name="radio_info_ims_reg_status_title" msgid="6875885401313992007">"IMS status"</string>
+ <string name="removable_esim_string" msgid="7931369811671787649">"Set Removable eSIM as Default"</string>
+ <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobile Radio Power"</string>
+ <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulate Out of Service (Debug Build only)"</string>
+ <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"View SIM Address Book"</string>
+ <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"View Fixed Dialing Numbers"</string>
+ <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"View Service Dialing Numbers"</string>
+ <string name="radioInfo_menu_getIMS" msgid="1950869267853198232">"IMS Service Status"</string>
+ <string name="radio_info_ims_reg_status_title" msgid="6875885401313992007">"IMS Status"</string>
<string name="radio_info_ims_reg_status_registered" msgid="7095182114078864326">"Registered"</string>
- <string name="radio_info_ims_reg_status_not_registered" msgid="8045821447288876085">"Not registered"</string>
+ <string name="radio_info_ims_reg_status_not_registered" msgid="8045821447288876085">"Not Registered"</string>
<string name="radio_info_ims_feature_status_available" msgid="6493200914756969292">"Available"</string>
<string name="radio_info_ims_feature_status_unavailable" msgid="8930391136839759778">"Unavailable"</string>
- <string name="radio_info_ims_reg_status" msgid="25582845222446390">"IMS registration: <xliff:g id="STATUS">%1$s</xliff:g>\nVoice over LTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nVoice over Wi-Fi: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nVideo calling: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT interface: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
- <string name="radioInfo_service_in" msgid="45753418231446400">"In service"</string>
- <string name="radioInfo_service_out" msgid="287972405416142312">"Out of service"</string>
- <string name="radioInfo_service_emergency" msgid="4763879891415016848">"Emergency calls only"</string>
- <string name="radioInfo_service_off" msgid="3456583511226783064">"Radio off"</string>
+ <string name="radio_info_ims_reg_status" msgid="25582845222446390">"IMS Registration: <xliff:g id="STATUS">%1$s</xliff:g>\nVoice over LTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nVoice over WiFi: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nVideo Calling: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT Interface: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
+ <string name="radioInfo_service_in" msgid="45753418231446400">"In Service"</string>
+ <string name="radioInfo_service_out" msgid="287972405416142312">"Out of Service"</string>
+ <string name="radioInfo_service_emergency" msgid="4763879891415016848">"Emergency Calls Only"</string>
+ <string name="radioInfo_service_off" msgid="3456583511226783064">"Radio Off"</string>
<string name="radioInfo_roaming_in" msgid="3156335577793145965">"Roaming"</string>
- <string name="radioInfo_roaming_not" msgid="1904547918725478110">"Not roaming"</string>
+ <string name="radioInfo_roaming_not" msgid="1904547918725478110">"Not Roaming"</string>
<string name="radioInfo_phone_idle" msgid="2191653783170757819">"Idle"</string>
<string name="radioInfo_phone_ringing" msgid="8100354169567413370">"Ringing"</string>
- <string name="radioInfo_phone_offhook" msgid="7564601639749936170">"Call in progress"</string>
+ <string name="radioInfo_phone_offhook" msgid="7564601639749936170">"Call in Progress"</string>
<string name="radioInfo_data_disconnected" msgid="8085447971880814541">"Disconnected"</string>
<string name="radioInfo_data_connecting" msgid="925092271092152472">"Connecting"</string>
<string name="radioInfo_data_connected" msgid="7637335645634239508">"Connected"</string>
@@ -868,56 +868,56 @@
<string name="radioInfo_display_asu" msgid="2247752203249646956">"asu"</string>
<string name="radioInfo_lac" msgid="3892986460272607013">"LAC"</string>
<string name="radioInfo_cid" msgid="1423185536264406705">"CID"</string>
- <string name="radio_info_subid" msgid="6839966868621703203">"Current subID:"</string>
+ <string name="radio_info_subid" msgid="6839966868621703203">"Current subId:"</string>
<string name="radio_info_dds" msgid="1122593144425697126">"SubId of default data SIM:"</string>
- <string name="radio_info_dl_kbps" msgid="2382922659525318726">"DL bandwidth (kbps):"</string>
- <string name="radio_info_ul_kbps" msgid="2102225400904799036">"UL bandwidth (kbps):"</string>
- <string name="radio_info_phy_chan_config" msgid="1277949603275436081">"LTE physical channel configuration:"</string>
- <string name="radio_info_cell_info_refresh_rate" msgid="670511448975997340">"Mobile info refresh rate:"</string>
- <string name="radio_info_cellinfo_label" msgid="8199062974670377659">"All mobile measurement info:"</string>
- <string name="radio_info_gprs_service_label" msgid="6819204246355412952">"Data service:"</string>
+ <string name="radio_info_dl_kbps" msgid="2382922659525318726">"DL Bandwidth (kbps):"</string>
+ <string name="radio_info_ul_kbps" msgid="2102225400904799036">"UL Bandwidth (kbps):"</string>
+ <string name="radio_info_phy_chan_config" msgid="1277949603275436081">"LTE Physical Channel Configuration:"</string>
+ <string name="radio_info_cell_info_refresh_rate" msgid="670511448975997340">"Cell Info Refresh Rate:"</string>
+ <string name="radio_info_cellinfo_label" msgid="8199062974670377659">"All Cell Measurement Info:"</string>
+ <string name="radio_info_gprs_service_label" msgid="6819204246355412952">"Data Service:"</string>
<string name="radio_info_roaming_label" msgid="6636932886446857120">"Roaming:"</string>
<string name="radio_info_imei_label" msgid="8947899706930120368">"IMEI:"</string>
- <string name="radio_info_call_redirect_label" msgid="4526480903023362276">"Call redirect:"</string>
- <string name="radio_info_ppp_resets_label" msgid="9131901102339077661">"Number of PPP reset since boot:"</string>
- <string name="radio_info_current_network_label" msgid="3052098695239642450">"Current network:"</string>
- <string name="radio_info_ppp_received_label" msgid="5753592451640644889">"Data received:"</string>
- <string name="radio_info_gsm_service_label" msgid="6443348321714241328">"Voice service:"</string>
- <string name="radio_info_signal_strength_label" msgid="5545444702102543260">"Signal strength"</string>
- <string name="radio_info_call_status_label" msgid="7693575431923095487">"Voice call status:"</string>
- <string name="radio_info_ppp_sent_label" msgid="6542208429356199695">"Data sent"</string>
- <string name="radio_info_message_waiting_label" msgid="1886549432566952078">"Message waiting:"</string>
- <string name="radio_info_phone_number_label" msgid="2533852539562512203">"Phone number:"</string>
- <string name="radio_info_band_mode_label" msgid="23480556225515290">"Select radio band"</string>
- <string name="radio_info_voice_network_type_label" msgid="2395347336419593265">"Voice network type:"</string>
- <string name="radio_info_data_network_type_label" msgid="8886597029237501929">"Data network type:"</string>
- <string name="radio_info_override_network_type_label" msgid="4176280017221092005">"Override network type:"</string>
+ <string name="radio_info_call_redirect_label" msgid="4526480903023362276">"Call Redirect:"</string>
+ <string name="radio_info_ppp_resets_label" msgid="9131901102339077661">"Number of PPP Reset Since Boot:"</string>
+ <string name="radio_info_current_network_label" msgid="3052098695239642450">"Current Network:"</string>
+ <string name="radio_info_ppp_received_label" msgid="5753592451640644889">"Data Received:"</string>
+ <string name="radio_info_gsm_service_label" msgid="6443348321714241328">"Voice Service:"</string>
+ <string name="radio_info_signal_strength_label" msgid="5545444702102543260">"Signal Strength:"</string>
+ <string name="radio_info_call_status_label" msgid="7693575431923095487">"Voice Call Status:"</string>
+ <string name="radio_info_ppp_sent_label" msgid="6542208429356199695">"Data Sent:"</string>
+ <string name="radio_info_message_waiting_label" msgid="1886549432566952078">"Message Waiting:"</string>
+ <string name="radio_info_phone_number_label" msgid="2533852539562512203">"Phone Number:"</string>
+ <string name="radio_info_band_mode_label" msgid="23480556225515290">"Select Radio Band"</string>
+ <string name="radio_info_voice_network_type_label" msgid="2395347336419593265">"Voice Network Type:"</string>
+ <string name="radio_info_data_network_type_label" msgid="8886597029237501929">"Data Network Type:"</string>
+ <string name="radio_info_override_network_type_label" msgid="4176280017221092005">"Override Network Type:"</string>
<string name="phone_index_label" msgid="6222406512768964268">"Select phone index"</string>
- <string name="radio_info_set_perferred_label" msgid="7408131389363136210">"Set preferred network type:"</string>
- <string name="radio_info_ping_hostname_v4" msgid="6951237885381284790">"Ping hostname(www.google.com) IPv4:"</string>
- <string name="radio_info_ping_hostname_v6" msgid="2748637889486554603">"Ping hostname(www.google.com) IPv6:"</string>
- <string name="radio_info_http_client_test" msgid="1329583721088428238">"HTTP client test:"</string>
- <string name="ping_test_label" msgid="448617502935719694">"Run ping test"</string>
+ <string name="radio_info_set_perferred_label" msgid="7408131389363136210">"Set Preferred Network Type:"</string>
+ <string name="radio_info_ping_hostname_v4" msgid="6951237885381284790">"Ping Hostname(www.google.com) IPv4:"</string>
+ <string name="radio_info_ping_hostname_v6" msgid="2748637889486554603">"Ping Hostname(www.google.com) IPv6:"</string>
+ <string name="radio_info_http_client_test" msgid="1329583721088428238">"HTTP Client Test:"</string>
+ <string name="ping_test_label" msgid="448617502935719694">"Run Ping Test"</string>
<string name="radio_info_smsc_label" msgid="3749927072726033763">"SMSC:"</string>
<string name="radio_info_smsc_update_label" msgid="5141996256097115753">"Update"</string>
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Refresh"</string>
- <string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Toggle DNS check"</string>
- <string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-specific info/settings"</string>
- <string name="radio_info_endc_available" msgid="2983767110681230019">"EN-DC available (NSA):"</string>
- <string name="radio_info_dcnr_restricted" msgid="7147511536420148173">"DCNR restricted (NSA):"</string>
- <string name="radio_info_nr_available" msgid="3383388088451237182">"NR available (NSA):"</string>
- <string name="radio_info_nr_state" msgid="4158805093187555149">"NR state (NSA):"</string>
- <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR frequency:"</string>
- <string name="band_mode_title" msgid="7988822920724576842">"Set radio band mode"</string>
- <string name="band_mode_loading" msgid="795923726636735967">"Loading band list…"</string>
+ <string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"Toggle DNS Check"</string>
+ <string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-specific Info/Settings"</string>
+ <string name="radio_info_endc_available" msgid="2983767110681230019">"EN-DC Available (NSA):"</string>
+ <string name="radio_info_dcnr_restricted" msgid="7147511536420148173">"DCNR Restricted (NSA):"</string>
+ <string name="radio_info_nr_available" msgid="3383388088451237182">"NR Available (NSA):"</string>
+ <string name="radio_info_nr_state" msgid="4158805093187555149">"NR State (NSA):"</string>
+ <string name="radio_info_nr_frequency" msgid="1201156032796584128">"NR Frequency:"</string>
+ <string name="band_mode_title" msgid="7988822920724576842">"Set Radio Band Mode"</string>
+ <string name="band_mode_loading" msgid="795923726636735967">"Loading Band List…"</string>
<string name="band_mode_set" msgid="6657819412803771421">"Set"</string>
<string name="band_mode_failed" msgid="1707488541847192924">"Unsuccessful"</string>
<string name="band_mode_succeeded" msgid="2230018000534761063">"Successful"</string>
<string name="phone_info_label" product="tablet" msgid="7477478709388477397">"Tablet info"</string>
<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="8348950331707346711">"Your Bluetooth signal is weak. Try switching to speakerphone."</string>
- <string name="call_quality_notification_name" msgid="3476828289553948830">"Call quality notification"</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="8348950331707346711">"Your bluetooth signal is weak. Try switching to speakerphone."</string>
+ <string name="call_quality_notification_name" msgid="3476828289553948830">"Call Quality Notification"</string>
<string name="notification_channel_sip_account" msgid="1261816025156179637">"Deprecated SIP accounts"</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index f8e97eb..2ba08e9 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -34,7 +34,7 @@
<string name="enter_input" msgid="6193628663039958990">"El mensaje USSD debe tener entre <xliff:g id="MIN_LEN">%1$d</xliff:g> y <xliff:g id="MAX_LEN">%2$d</xliff:g> caracteres. Vuelve a intentarlo."</string>
<string name="manageConferenceLabel" msgid="8415044818156353233">"Administrar conferencia telefónica"</string>
<string name="ok" msgid="7818974223666140165">"Aceptar"</string>
- <string name="audio_mode_speaker" msgid="243689733219312360">"Altavoz"</string>
+ <string name="audio_mode_speaker" msgid="243689733219312360">"Bocina"</string>
<string name="audio_mode_earpiece" msgid="2823700267171134282">"Auricular"</string>
<string name="audio_mode_wired_headset" msgid="5028010823105817443">"Auriculares con cable"</string>
<string name="audio_mode_bluetooth" msgid="25732183428018809">"Bluetooth"</string>
@@ -917,7 +917,7 @@
<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>
- <string name="call_quality_notification_bluetooth_details" msgid="8348950331707346711">"Tu señal de Bluetooth es débil. Intenta cambiar al altavoz."</string>
+ <string name="call_quality_notification_bluetooth_details" msgid="8348950331707346711">"Tu señal de Bluetooth es débil. Intenta cambiar a la bocina."</string>
<string name="call_quality_notification_name" msgid="3476828289553948830">"Notificación de calidad de llamada"</string>
<string name="notification_channel_sip_account" msgid="1261816025156179637">"Cuentas SIP obsoletas"</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 98579aa..4d9f50d 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -662,7 +662,7 @@
<string name="voicemail_visual_voicemail_switch_title" msgid="6610414098912832120">"ビジュアル留守番電話"</string>
<string name="voicemail_set_pin_dialog_title" msgid="7005128605986960003">"PIN の設定"</string>
<string name="voicemail_change_pin_dialog_title" msgid="4633077715231764435">"PIN の変更"</string>
- <string name="preference_category_ringtone" msgid="8787281191375434976">"着信音とバイブレーション"</string>
+ <string name="preference_category_ringtone" msgid="8787281191375434976">"サウンドとバイブレーション"</string>
<string name="pstn_connection_service_label" msgid="9200102709997537069">"内蔵のSIMカード"</string>
<string name="enable_video_calling_title" msgid="7246600931634161830">"ビデオハングアウトを有効にする"</string>
<string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"ビデオハングアウトをONにするには、ネットワーク設定で4G LTE拡張モードを有効にする必要があります。"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index fd8a7ee..6cbc051 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -579,7 +579,7 @@
<string name="onscreenEndCallText" msgid="6138725377654842757">"Finalizar"</string>
<string name="onscreenShowDialpadText" msgid="658465753816164079">"Teclado"</string>
<string name="onscreenMuteText" msgid="5470306116733843621">"Desativar som"</string>
- <string name="onscreenAddCallText" msgid="9075675082903611677">"Adicionar chamada"</string>
+ <string name="onscreenAddCallText" msgid="9075675082903611677">"Adicionar ligação"</string>
<string name="onscreenMergeCallsText" msgid="3692389519611225407">"Juntar chamadas"</string>
<string name="onscreenSwapCallsText" msgid="2682542150803377991">"Trocar"</string>
<string name="onscreenManageCallsText" msgid="1162047856081836469">"Gerenciar chamadas"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 85a8ded..9aa0800 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -582,8 +582,8 @@
<string name="onscreenAddCallText" msgid="9075675082903611677">"కాల్ను జోడించు"</string>
<string name="onscreenMergeCallsText" msgid="3692389519611225407">"కాల్స్ను విలీనం చేయి"</string>
<string name="onscreenSwapCallsText" msgid="2682542150803377991">"స్వాప్ చేయి"</string>
- <string name="onscreenManageCallsText" msgid="1162047856081836469">"కాల్స్ను నిర్వహించు"</string>
- <string name="onscreenManageConferenceText" msgid="4700574060601755137">"కాన్ఫరెన్స్ను నిర్వహించు"</string>
+ <string name="onscreenManageCallsText" msgid="1162047856081836469">"కాల్స్ను మేనేజ్ చేయండి"</string>
+ <string name="onscreenManageConferenceText" msgid="4700574060601755137">"కాన్ఫరెన్స్ను మేనేజ్ చేయండి"</string>
<string name="onscreenAudioText" msgid="7224226735052019986">"ఆడియో"</string>
<string name="onscreenVideoCallText" msgid="1743992456126258698">"వీడియో కాల్"</string>
<string name="importSimEntry" msgid="3892354284082689894">"దిగుమతి చేయండి"</string>
diff --git a/src/com/android/phone/CLIRListPreference.java b/src/com/android/phone/CLIRListPreference.java
old mode 100755
new mode 100644
diff --git a/src/com/android/phone/CallNotifier.java b/src/com/android/phone/CallNotifier.java
index 7f61f78..14db930 100644
--- a/src/com/android/phone/CallNotifier.java
+++ b/src/com/android/phone/CallNotifier.java
@@ -40,10 +40,12 @@
import com.android.internal.telephony.CallManager;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.SubscriptionController;
import com.android.internal.telephony.cdma.CdmaInformationRecords.CdmaDisplayInfoRec;
import com.android.internal.telephony.cdma.CdmaInformationRecords.CdmaSignalInfoRec;
import com.android.internal.telephony.cdma.SignalToneUtil;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
import java.util.ArrayList;
import java.util.Collections;
@@ -487,9 +489,16 @@
}
public void updatePhoneStateListeners(boolean isRefresh, int updateType, int subIdToUpdate) {
- List<SubscriptionInfo> subInfos = SubscriptionController.getInstance()
- .getActiveSubscriptionInfoList(mApplication.getOpPackageName(),
- mApplication.getAttributionTag());
+ List<SubscriptionInfo> subInfos;
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ subInfos = SubscriptionManagerService.getInstance()
+ .getActiveSubscriptionInfoList(mApplication.getOpPackageName(),
+ mApplication.getAttributionTag());
+ } else {
+ subInfos = SubscriptionController.getInstance()
+ .getActiveSubscriptionInfoList(mApplication.getOpPackageName(),
+ mApplication.getAttributionTag());
+ }
// Sort sub id list based on slot id, so that CFI/MWI notifications will be updated for
// slot 0 first then slot 1. This is needed to ensure that when CFI or MWI is enabled for
@@ -498,8 +507,8 @@
List<Integer> subIdList = new ArrayList<Integer>(mTelephonyCallback.keySet());
Collections.sort(subIdList, new Comparator<Integer>() {
public int compare(Integer sub1, Integer sub2) {
- int slotId1 = SubscriptionController.getInstance().getSlotIndex(sub1);
- int slotId2 = SubscriptionController.getInstance().getSlotIndex(sub2);
+ int slotId1 = SubscriptionManager.getSlotIndex(sub1);
+ int slotId2 = SubscriptionManager.getSlotIndex(sub2);
return slotId1 > slotId2 ? 0 : -1;
}
});
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index 5d9928e..44375bb 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -804,10 +804,10 @@
Intent.FLAG_RECEIVER_FOREGROUND);
if (addSubIdExtra) {
int simApplicationState = TelephonyManager.SIM_STATE_UNKNOWN;
- int[] subIds = SubscriptionManager.getSubId(phoneId);
- if (!ArrayUtils.isEmpty(subIds)) {
+ int subId = SubscriptionManager.getSubscriptionId(phoneId);
+ if (SubscriptionManager.isValidSubscriptionId(subId)) {
TelephonyManager telMgr = TelephonyManager.from(mContext)
- .createForSubscriptionId(subIds[0]);
+ .createForSubscriptionId(subId);
simApplicationState = telMgr.getSimApplicationState();
}
logd("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId
@@ -825,9 +825,9 @@
intent.putExtra(CarrierConfigManager.EXTRA_REBROADCAST_ON_UNLOCK,
mFromSystemUnlocked[phoneId]);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
- int[] subIds = SubscriptionManager.getSubId(phoneId);
- if (subIds != null && subIds.length > 0) {
- logd("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId + ", subId=" + subIds[0]);
+ int subId = SubscriptionManager.getSubscriptionId(phoneId);
+ if (SubscriptionManager.isValidSubscriptionId(subId)) {
+ logd("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId + ", subId=" + subId);
} else {
logd("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId);
}
@@ -978,7 +978,7 @@
if (isNoSimConfig) {
fileName = getFilenameForNoSimConfig(packageName);
} else {
- if (SubscriptionManager.getSimStateForSlotIndex(phoneId)
+ if (TelephonyManager.getSimStateForSlotIndex(phoneId)
!= TelephonyManager.SIM_STATE_LOADED) {
loge("Skip save config because SIM records are not loaded.");
return;
@@ -1069,7 +1069,7 @@
if (isNoSimConfig) {
fileName = getFilenameForNoSimConfig(packageName);
} else {
- if (SubscriptionManager.getSimStateForSlotIndex(phoneId)
+ if (TelephonyManager.getSimStateForSlotIndex(phoneId)
!= TelephonyManager.SIM_STATE_LOADED) {
loge("Skip restore config because SIM records are not loaded.");
return null;
@@ -1686,12 +1686,12 @@
}
private boolean hasCarrierPrivileges(@NonNull String pkgName, int phoneId) {
- int[] subIds = SubscriptionManager.getSubId(phoneId);
- if (ArrayUtils.isEmpty(subIds)) {
+ int subId = SubscriptionManager.getSubscriptionId(phoneId);
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
return false;
}
- return TelephonyManager.from(mContext).createForSubscriptionId(
- subIds[0]).checkCarrierPrivilegesForPackage(pkgName)
+ return TelephonyManager.from(mContext).createForSubscriptionId(subId)
+ .checkCarrierPrivilegesForPackage(pkgName)
== TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
}
diff --git a/src/com/android/phone/EmergencyDialer.java b/src/com/android/phone/EmergencyDialer.java
index 9b7a43e..5fe8708 100644
--- a/src/com/android/phone/EmergencyDialer.java
+++ b/src/com/android/phone/EmergencyDialer.java
@@ -259,8 +259,6 @@
mEntryType = getIntent().getIntExtra(EXTRA_ENTRY_TYPE, ENTRY_TYPE_UNKNOWN);
Log.d(LOG_TAG, "Launched from " + entryTypeToString(mEntryType));
- // Allow this activity to be displayed in front of the keyguard / lockscreen.
- setShowWhenLocked(true);
// Allow turning screen on
setTurnScreenOn(true);
diff --git a/src/com/android/phone/ImsUtil.java b/src/com/android/phone/ImsUtil.java
index ba4ad38..d90c256 100644
--- a/src/com/android/phone/ImsUtil.java
+++ b/src/com/android/phone/ImsUtil.java
@@ -154,12 +154,7 @@
}
private static int getSubId(int phoneId) {
- final int[] subIds = SubscriptionManager.getSubId(phoneId);
- int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
- if (subIds != null && subIds.length >= 1) {
- subId = subIds[0];
- }
- return subId;
+ return SubscriptionManager.getSubscriptionId(phoneId);
}
private static boolean getLastKnownRoamingState(int phoneId) {
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index f18535c..bc6a7ae 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -17,6 +17,7 @@
package com.android.phone;
import android.annotation.IntDef;
+import android.annotation.Nullable;
import android.app.Activity;
import android.app.KeyguardManager;
import android.app.ProgressDialog;
@@ -49,6 +50,7 @@
import android.telephony.TelephonyCallback;
import android.telephony.TelephonyLocalConnection;
import android.telephony.TelephonyManager;
+import android.util.ArraySet;
import android.util.LocalLog;
import android.util.Log;
import android.widget.Toast;
@@ -81,7 +83,6 @@
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
import java.util.List;
/**
@@ -189,6 +190,9 @@
@RoamingNotification
private int mPrevRoamingNotification = ROAMING_NOTIFICATION_NO_NOTIFICATION;
+ /** Operator numerics for which we've shown is-roaming notifications. **/
+ private ArraySet<String> mPrevRoamingOperatorNumerics = new ArraySet<>();
+
private WakeState mWakeState = WakeState.SLEEP;
private PowerManager mPowerManager;
@@ -376,7 +380,7 @@
.unregisterTelephonyCallback(callback);
callback = new PhoneAppCallback(subId);
tm.createForSubscriptionId(subId).registerTelephonyCallback(
- TelephonyManager.INCLUDE_LOCATION_DATA_NONE, mHandler::post,
+ TelephonyManager.INCLUDE_LOCATION_DATA_COARSE, mHandler::post,
callback);
mTelephonyCallbacks[phone.getPhoneId()] = callback;
}
@@ -737,6 +741,13 @@
Settings.Global.putInt(getContentResolver(), Settings.Global.ENABLE_CELLULAR_ON_BOOT, 0);
TelephonyProperties.airplane_mode_on(true); // true means int value 1
PhoneUtils.setRadioPower(false);
+ clearCacheOnRadioOff();
+ }
+
+ /** Clear fields on power off radio **/
+ private void clearCacheOnRadioOff() {
+ // Re-show is-roaming notifications after APM mode
+ mPrevRoamingOperatorNumerics.clear();
}
private void setRadioPowerOn() {
@@ -860,26 +871,27 @@
+ mDefaultDataSubId + ", ss roaming=" + serviceState.getDataRoaming());
}
if (subId == mDefaultDataSubId) {
- updateDataRoamingStatus();
+ updateDataRoamingStatus(serviceState.getOperatorNumeric());
}
}
/**
- * @return whether or not we should show a notification when connecting to data roaming if the
- * user has data roaming enabled
- */
- private boolean shouldShowDataConnectedRoaming(int subId) {
- PersistableBundle config = getCarrierConfigForSubId(subId);
- return config.getBoolean(CarrierConfigManager
- .KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL);
- }
-
- /**
* When roaming, if mobile data cannot be established due to data roaming not enabled, we need
* to notify the user so they can enable it through settings. Vise versa if the condition
* changes, we need to dismiss the notification.
*/
private void updateDataRoamingStatus() {
+ updateDataRoamingStatus(null /*roamingOperatorNumeric*/);
+ }
+
+ /**
+ * When roaming, if mobile data cannot be established due to data roaming not enabled, we need
+ * to notify the user so they can enable it through settings. Vise versa if the condition
+ * changes, we need to dismiss the notification.
+ * @param roamingOperatorNumeric The operator numeric for the current roaming. {@code null} if
+ * the current roaming operator numeric didn't change.
+ */
+ private void updateDataRoamingStatus(@Nullable String roamingOperatorNumeric) {
if (VDBG) Log.v(LOG_TAG, "updateDataRoamingStatus");
Phone phone = getPhone(mDefaultDataSubId);
if (phone == null) {
@@ -889,17 +901,26 @@
boolean dataAllowed;
boolean notAllowedDueToRoamingOff;
- List<DataDisallowedReason> reasons = new ArrayList<>();
- if (phone.getDataNetworkController() != null) {
- reasons = phone.getDataNetworkController().getInternetDataDisallowedReasons();
- }
+ List<DataDisallowedReason> reasons = phone.getDataNetworkController()
+ .getInternetDataDisallowedReasons();
dataAllowed = reasons.isEmpty();
notAllowedDueToRoamingOff = (reasons.size() == 1
&& reasons.contains(DataDisallowedReason.ROAMING_DISABLED));
- mDataRoamingNotifLog.log("dataAllowed=" + dataAllowed + ", reasons=" + reasons);
- if (VDBG) Log.v(LOG_TAG, "dataAllowed=" + dataAllowed + ", reasons=" + reasons);
+ mDataRoamingNotifLog.log("dataAllowed=" + dataAllowed + ", reasons=" + reasons
+ + ", roamingOperatorNumeric=" + roamingOperatorNumeric);
+ if (VDBG) {
+ Log.v(LOG_TAG, "dataAllowed=" + dataAllowed + ", reasons=" + reasons
+ + ", roamingOperatorNumeric=" + roamingOperatorNumeric);
+ }
if (!dataAllowed && notAllowedDueToRoamingOff) {
+ // Don't show roaming notification if we've already shown for this MccMnc
+ if (roamingOperatorNumeric != null
+ && !mPrevRoamingOperatorNumerics.add(roamingOperatorNumeric)) {
+ Log.d(LOG_TAG, "Skip roaming disconnected notification since already shown in "
+ + "MccMnc " + roamingOperatorNumeric);
+ return;
+ }
// No need to show it again if we never cancelled it explicitly.
if (mPrevRoamingNotification == ROAMING_NOTIFICATION_DISCONNECTED) return;
// If the only reason of no data is data roaming disabled, then we notify the user
@@ -910,8 +931,18 @@
Message msg = mHandler.obtainMessage(EVENT_DATA_ROAMING_DISCONNECTED);
msg.arg1 = mDefaultDataSubId;
msg.sendToTarget();
- } else if (dataAllowed && dataIsNowRoaming(mDefaultDataSubId)
- && shouldShowDataConnectedRoaming(mDefaultDataSubId)) {
+ } else if (dataAllowed && dataIsNowRoaming(mDefaultDataSubId)) {
+ boolean isShowRoamingNotificationEnabled = getCarrierConfigForSubId(mDefaultDataSubId)
+ .getBoolean(CarrierConfigManager
+ .KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL);
+ if (!isShowRoamingNotificationEnabled) return;
+ // Don't show roaming notification if we've already shown for this MccMnc
+ if (roamingOperatorNumeric != null
+ && !mPrevRoamingOperatorNumerics.add(roamingOperatorNumeric)) {
+ Log.d(LOG_TAG, "Skip roaming connected notification since already shown in "
+ + "MccMnc " + roamingOperatorNumeric);
+ return;
+ }
// No need to show it again if we never cancelled it explicitly, or carrier config
// indicates this is not needed.
if (mPrevRoamingNotification == ROAMING_NOTIFICATION_CONNECTED) return;
@@ -938,11 +969,7 @@
* @return whether we have transitioned to dataRoaming
*/
private boolean dataIsNowRoaming(int subId) {
- if (getPhone(subId).getServiceState() == null) {
- return false;
- } else {
- return getPhone(subId).getServiceState().getDataRoaming();
- }
+ return getPhone(subId).getServiceState().getDataRoaming();
}
private void updateLimitedSimFunctionForDualSim() {
@@ -1060,6 +1087,7 @@
e.printStackTrace();
}
pw.decreaseIndent();
+ pw.println("mPrevRoamingOperatorNumerics:" + mPrevRoamingOperatorNumerics);
pw.println("------- End PhoneGlobals -------");
}
}
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
old mode 100755
new mode 100644
index 3f05f0a..0124ee1
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -17,6 +17,8 @@
package com.android.phone;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.telephony.TelephonyManager.HAL_SERVICE_NETWORK;
+import static android.telephony.TelephonyManager.HAL_SERVICE_RADIO;
import static com.android.internal.telephony.PhoneConstants.PHONE_TYPE_CDMA;
import static com.android.internal.telephony.PhoneConstants.PHONE_TYPE_GSM;
@@ -110,6 +112,7 @@
import android.telephony.TelephonyFrameworkInitializer;
import android.telephony.TelephonyHistogram;
import android.telephony.TelephonyManager;
+import android.telephony.TelephonyManager.SimState;
import android.telephony.TelephonyScanManager;
import android.telephony.ThermalMitigationRequest;
import android.telephony.UiccCardInfo;
@@ -166,6 +169,7 @@
import com.android.internal.telephony.INumberVerificationCallback;
import com.android.internal.telephony.ITelephony;
import com.android.internal.telephony.IccCard;
+import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.IccLogicalChannelRequest;
import com.android.internal.telephony.LocaleTracker;
import com.android.internal.telephony.NetworkScanRequestTracker;
@@ -180,6 +184,7 @@
import com.android.internal.telephony.RILConstants;
import com.android.internal.telephony.RadioInterfaceCapabilityController;
import com.android.internal.telephony.ServiceStateTracker;
+import com.android.internal.telephony.SmsApplication;
import com.android.internal.telephony.SmsController;
import com.android.internal.telephony.SmsPermissions;
import com.android.internal.telephony.SubscriptionController;
@@ -193,6 +198,8 @@
import com.android.internal.telephony.imsphone.ImsPhoneCallTracker;
import com.android.internal.telephony.metrics.RcsStats;
import com.android.internal.telephony.metrics.TelephonyMetrics;
+import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType;
import com.android.internal.telephony.uicc.IccIoResult;
import com.android.internal.telephony.uicc.IccUtils;
@@ -204,6 +211,7 @@
import com.android.internal.telephony.uicc.UiccProfile;
import com.android.internal.telephony.uicc.UiccSlot;
import com.android.internal.telephony.util.LocaleUtils;
+import com.android.internal.telephony.util.TelephonyUtils;
import com.android.internal.telephony.util.VoicemailNotificationSettingsUtil;
import com.android.internal.util.FunctionalUtils;
import com.android.internal.util.HexDump;
@@ -211,7 +219,7 @@
import com.android.phone.callcomposer.CallComposerPictureTransfer;
import com.android.phone.callcomposer.ImageData;
import com.android.phone.settings.PickSmsSubscriptionActivity;
-import com.android.phone.slicestore.SliceStore;
+import com.android.phone.slice.SlicePurchaseController;
import com.android.phone.vvm.PhoneAccountHandleConverter;
import com.android.phone.vvm.RemoteVvmTaskManager;
import com.android.phone.vvm.VisualVoicemailSettingsUtil;
@@ -370,6 +378,9 @@
private static final int SELECT_P2 = 0;
private static final int SELECT_P3 = 0x10;
+ // Toggling null cipher and integrity support was added in IRadioNetwork 2.1
+ private static final int MIN_NULL_CIPHER_AND_INTEGRITY_VERSION = 201;
+
/** The singleton instance. */
private static PhoneInterfaceManager sInstance;
private static List<String> sThermalMitigationAllowlistedPackages = new ArrayList<>();
@@ -385,6 +396,7 @@
private SharedPreferences mTelephonySharedPreferences;
private PhoneConfigurationManager mPhoneConfigurationManager;
private final RadioInterfaceCapabilityController mRadioInterfaceCapabilities;
+ private final Telephony2gUpdater mTelephony2gUpdater;
/** User Activity */
private AtomicBoolean mNotifyUserActivity;
@@ -1435,6 +1447,7 @@
request = (MainThreadRequest) ar.userObj;
ResultReceiver result = (ResultReceiver) request.argument;
int error = 0;
+ ModemActivityInfo ret = null;
if (mLastModemActivityInfo == null) {
mLastModemActivitySpecificInfo = new ActivityStatsTechSpecificInfo[1];
mLastModemActivitySpecificInfo[0] =
@@ -1453,12 +1466,14 @@
if (isModemActivityInfoValid(info)) {
mergeModemActivityInfo(info);
}
- mLastModemActivityInfo =
- new ModemActivityInfo(
- mLastModemActivityInfo.getTimestampMillis(),
- mLastModemActivityInfo.getSleepTimeMillis(),
- mLastModemActivityInfo.getIdleTimeMillis(),
- mLastModemActivitySpecificInfo);
+ // This is needed to decouple ret from mLastModemActivityInfo
+ // We don't want to return mLastModemActivityInfo which is updated
+ // inside mergeModemActivityInfo()
+ ret = new ModemActivityInfo(
+ mLastModemActivityInfo.getTimestampMillis(),
+ mLastModemActivityInfo.getSleepTimeMillis(),
+ mLastModemActivityInfo.getIdleTimeMillis(),
+ deepCopyModemActivitySpecificInfo(mLastModemActivitySpecificInfo));
} else {
if (ar.result == null) {
@@ -1476,10 +1491,10 @@
}
}
Bundle bundle = new Bundle();
- if (mLastModemActivityInfo != null) {
+ if (ret != null) {
bundle.putParcelable(
TelephonyManager.MODEM_ACTIVITY_RESULT_KEY,
- mLastModemActivityInfo);
+ ret);
} else {
bundle.putInt(TelephonyManager.EXCEPTION_RESULT_KEY, error);
}
@@ -2159,7 +2174,7 @@
onCompleted = obtainMessage(EVENT_PURCHASE_PREMIUM_CAPABILITY_DONE, request);
PurchasePremiumCapabilityArgument arg =
(PurchasePremiumCapabilityArgument) request.argument;
- SliceStore.getInstance(request.phone).purchasePremiumCapability(
+ SlicePurchaseController.getInstance(request.phone).purchasePremiumCapability(
arg.capability, arg.appName, onCompleted);
break;
}
@@ -2401,9 +2416,17 @@
mRadioInterfaceCapabilities = RadioInterfaceCapabilityController.getInstance();
mNotifyUserActivity = new AtomicBoolean(false);
PropertyInvalidatedCache.invalidateCache(TelephonyManager.CACHE_KEY_PHONE_ACCOUNT_TO_SUBID);
+ mTelephony2gUpdater = new Telephony2gUpdater(
+ Executors.newSingleThreadExecutor(), mApp);
+ mTelephony2gUpdater.init();
publish();
}
+ @VisibleForTesting
+ public SharedPreferences getSharedPreferences() {
+ return mTelephonySharedPreferences;
+ }
+
private Phone getDefaultPhone() {
Phone thePhone = getPhone(getDefaultSubscription());
return (thePhone != null) ? thePhone : PhoneFactory.getDefaultPhone();
@@ -2440,7 +2463,7 @@
// returns phone associated with the subId.
private Phone getPhone(int subId) {
- return PhoneFactory.getPhone(mSubscriptionController.getPhoneId(subId));
+ return PhoneFactory.getPhone(SubscriptionManager.getPhoneId(subId));
}
private void sendEraseModemConfig(@NonNull Phone phone) {
@@ -3001,7 +3024,7 @@
final long identity = Binder.clearCallingIdentity();
try {
- int subId = mSubscriptionController.getDefaultDataSubId();
+ int subId = SubscriptionManager.getDefaultDataSubscriptionId();
final Phone phone = getPhone(subId);
if (phone != null) {
phone.getDataSettingsManager().setDataEnabled(
@@ -3022,7 +3045,7 @@
final long identity = Binder.clearCallingIdentity();
try {
- int subId = mSubscriptionController.getDefaultDataSubId();
+ int subId = SubscriptionManager.getDefaultDataSubscriptionId();
final Phone phone = getPhone(subId);
if (phone != null) {
phone.getDataSettingsManager().setDataEnabled(
@@ -3133,7 +3156,7 @@
@Override
public int getDataState() {
- return getDataStateForSubId(mSubscriptionController.getDefaultDataSubId());
+ return getDataStateForSubId(SubscriptionManager.getDefaultDataSubscriptionId());
}
@Override
@@ -3154,7 +3177,7 @@
@Override
public @DataActivityType int getDataActivity() {
- return getDataActivityForSubId(mSubscriptionController.getDefaultDataSubId());
+ return getDataActivityForSubId(SubscriptionManager.getDefaultDataSubscriptionId());
}
@Override
@@ -3200,7 +3223,7 @@
final long identity = Binder.clearCallingIdentity();
try {
if (DBG_LOC) log("getCellLocation: is active user");
- int subId = mSubscriptionController.getDefaultDataSubId();
+ int subId = SubscriptionManager.getDefaultDataSubscriptionId();
return (CellIdentity) sendRequest(CMD_GET_CELL_LOCATION, workSource, subId);
} finally {
Binder.restoreCallingIdentity(identity);
@@ -3217,7 +3240,7 @@
// Get default phone in this case.
phoneId = SubscriptionManager.DEFAULT_PHONE_INDEX;
}
- final int subId = mSubscriptionController.getSubIdUsingPhoneId(phoneId);
+ final int subId = SubscriptionManager.getSubscriptionId(phoneId);
Phone phone = PhoneFactory.getPhone(phoneId);
if (phone == null) return "";
ServiceStateTracker sst = phone.getServiceStateTracker();
@@ -3620,10 +3643,21 @@
*
* @throws SecurityException if the caller does not have the required permission
*/
- private void enforceModifyPermission() {
+ @VisibleForTesting
+ public void enforceModifyPermission() {
mApp.enforceCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE, null);
}
+ /**
+ * Make sure the caller has the MODIFY_PHONE_STATE permission.
+ *
+ * @throws SecurityException if the caller does not have the required permission
+ */
+ @VisibleForTesting
+ public void enforceReadPermission() {
+ mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE, null);
+ }
+
private void enforceActiveEmergencySessionPermission() {
mApp.enforceCallingOrSelfPermission(
android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION, null);
@@ -5164,7 +5198,7 @@
*/
@Override
public int getDataNetworkType(String callingPackage, String callingFeatureId) {
- return getDataNetworkTypeForSubscriber(mSubscriptionController.getDefaultDataSubId(),
+ return getDataNetworkTypeForSubscriber(SubscriptionManager.getDefaultDataSubscriptionId(),
callingPackage, callingFeatureId);
}
@@ -5229,7 +5263,7 @@
*/
public boolean hasIccCard() {
// FIXME Make changes to pass defaultSimId of type int
- return hasIccCardUsingSlotIndex(mSubscriptionController.getSlotIndex(
+ return hasIccCardUsingSlotIndex(SubscriptionManager.getSlotIndex(
getDefaultSubscription()));
}
@@ -5294,18 +5328,22 @@
* Returns Default subId, 0 in the case of single standby.
*/
private int getDefaultSubscription() {
- return mSubscriptionController.getDefaultSubId();
+ return SubscriptionManager.getDefaultSubscriptionId();
}
private int getSlotForDefaultSubscription() {
- return mSubscriptionController.getPhoneId(getDefaultSubscription());
+ return SubscriptionManager.getPhoneId(getDefaultSubscription());
}
private int getPreferredVoiceSubscription() {
- return mSubscriptionController.getDefaultVoiceSubId();
+ return SubscriptionManager.getDefaultVoiceSubscriptionId();
}
private boolean isActiveSubscription(int subId) {
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ return SubscriptionManagerService.getInstance().isActiveSubId(subId,
+ mApp.getOpPackageName(), mApp.getFeatureId());
+ }
return mSubscriptionController.isActiveSubId(subId);
}
@@ -5971,11 +6009,9 @@
*/
public boolean setBoundImsServiceOverride(int slotIndex, boolean isCarrierService,
int[] featureTypes, String packageName) {
- int[] subIds = SubscriptionManager.getSubId(slotIndex);
TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(), "setBoundImsServiceOverride");
TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(mApp,
- (subIds != null ? subIds[0] : SubscriptionManager.INVALID_SUBSCRIPTION_ID),
- "setBoundImsServiceOverride");
+ SubscriptionManager.getSubscriptionId(slotIndex), "setBoundImsServiceOverride");
final long identity = Binder.clearCallingIdentity();
try {
@@ -6005,12 +6041,10 @@
*/
@Override
public boolean clearCarrierImsServiceOverride(int slotIndex) {
- int[] subIds = SubscriptionManager.getSubId(slotIndex);
TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(),
"clearCarrierImsServiceOverride");
TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(mApp,
- (subIds != null ? subIds[0] : SubscriptionManager.INVALID_SUBSCRIPTION_ID),
- "clearCarrierImsServiceOverride");
+ SubscriptionManager.getSubscriptionId(slotIndex), "clearCarrierImsServiceOverride");
final long identity = Binder.clearCallingIdentity();
try {
@@ -6035,11 +6069,9 @@
*/
public String getBoundImsServicePackage(int slotId, boolean isCarrierImsService,
@ImsFeature.FeatureType int featureType) {
- int[] subIds = SubscriptionManager.getSubId(slotId);
TelephonyPermissions
- .enforceCallingOrSelfReadPrivilegedPhoneStatePermissionOrCarrierPrivilege(
- mApp, (subIds != null ? subIds[0] : SubscriptionManager.INVALID_SUBSCRIPTION_ID),
- "getBoundImsServicePackage");
+ .enforceCallingOrSelfReadPrivilegedPhoneStatePermissionOrCarrierPrivilege(mApp,
+ SubscriptionManager.getSubscriptionId(slotId), "getBoundImsServicePackage");
final long identity = Binder.clearCallingIdentity();
try {
@@ -6150,11 +6182,11 @@
TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
mApp, subId, "setNetworkSelectionModeManual");
+ final long identity = Binder.clearCallingIdentity();
if (!isActiveSubscription(subId)) {
return false;
}
- final long identity = Binder.clearCallingIdentity();
try {
ManualNetworkSelectionArgument arg = new ManualNetworkSelectionArgument(operatorInfo,
persistSelection);
@@ -6656,6 +6688,17 @@
@TelephonyManager.NetworkTypeBitMask long allowedNetworkTypes) {
TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
mApp, subId, "setAllowedNetworkTypesForReason");
+ // If the caller only has carrier privileges, then they should not be able to override
+ // any network types which were set for security reasons.
+ if (mApp.checkCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE)
+ != PERMISSION_GRANTED
+ && (reason == TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G
+ || reason == TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS)) {
+ throw new SecurityException(
+ "setAllowedNetworkTypesForReason cannot be called with carrier privileges for"
+ + " reason "
+ + reason);
+ }
if (!TelephonyManager.isValidAllowedNetworkTypesReason(reason)) {
loge("setAllowedNetworkTypesForReason: Invalid allowed network type reason: " + reason);
return false;
@@ -6754,7 +6797,7 @@
final long identity = Binder.clearCallingIdentity();
try {
- int phoneId = mSubscriptionController.getPhoneId(subId);
+ int phoneId = SubscriptionManager.getPhoneId(subId);
if (DBG) log("isUserDataEnabled: subId=" + subId + " phoneId=" + phoneId);
Phone phone = PhoneFactory.getPhone(phoneId);
if (phone != null) {
@@ -6801,15 +6844,10 @@
final long identity = Binder.clearCallingIdentity();
try {
- int phoneId = mSubscriptionController.getPhoneId(subId);
+ int phoneId = SubscriptionManager.getPhoneId(subId);
Phone phone = PhoneFactory.getPhone(phoneId);
if (phone != null) {
- boolean retVal;
- if (phone.getDataSettingsManager() == null) {
- retVal = false;
- } else {
- retVal = phone.getDataSettingsManager().isDataEnabled();
- }
+ boolean retVal = phone.getDataSettingsManager().isDataEnabled();
if (DBG) log("isDataEnabled: " + retVal + ", subId=" + subId);
return retVal;
} else {
@@ -6853,7 +6891,7 @@
final long identity = Binder.clearCallingIdentity();
try {
- int phoneId = mSubscriptionController.getPhoneId(subId);
+ int phoneId = SubscriptionManager.getPhoneId(subId);
if (DBG) {
log("isDataEnabledForReason: subId=" + subId + " phoneId=" + phoneId
+ " reason=" + reason);
@@ -7265,9 +7303,16 @@
return null;
}
- final SubscriptionInfo info = SubscriptionController.getInstance()
- .getSubscriptionInfo(subId);
- final ParcelUuid groupUuid = info.getGroupUuid();
+ ParcelUuid groupUuid;
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ final SubscriptionInfo info = SubscriptionManagerService.getInstance()
+ .getSubscriptionInfo(subId);
+ groupUuid = info.getGroupUuid();
+ } else {
+ final SubscriptionInfo info = mSubscriptionController
+ .getSubscriptionInfo(subId);
+ groupUuid = info.getGroupUuid();
+ }
// If it doesn't belong to any group, return just subscriberId of itself.
if (groupUuid == null) {
return new String[]{subscriberId};
@@ -7275,9 +7320,16 @@
// Get all subscriberIds from the group.
final List<String> mergedSubscriberIds = new ArrayList<>();
- final List<SubscriptionInfo> groupInfos = SubscriptionController.getInstance()
- .getSubscriptionsInGroup(groupUuid, mApp.getOpPackageName(),
- mApp.getAttributionTag());
+ List<SubscriptionInfo> groupInfos;
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ groupInfos = SubscriptionManagerService.getInstance()
+ .getSubscriptionsInGroup(groupUuid, mApp.getOpPackageName(),
+ mApp.getAttributionTag());
+ } else {
+ groupInfos = mSubscriptionController
+ .getSubscriptionsInGroup(groupUuid, mApp.getOpPackageName(),
+ mApp.getAttributionTag());
+ }
for (SubscriptionInfo subInfo : groupInfos) {
subscriberId = telephonyManager.getSubscriberId(subInfo.getSubscriptionId());
if (subscriberId != null) {
@@ -7837,11 +7889,23 @@
}
final long identity = Binder.clearCallingIdentity();
try {
- final SubscriptionInfo info = mSubscriptionController.getActiveSubscriptionInfo(subId,
- phone.getContext().getOpPackageName(), phone.getContext().getAttributionTag());
- if (info == null) {
- log("getSimLocaleForSubscriber, inactive subId: " + subId);
- return null;
+ SubscriptionInfo info;
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ info = SubscriptionManagerService.getInstance().getActiveSubscriptionInfo(subId,
+ phone.getContext().getOpPackageName(),
+ phone.getContext().getAttributionTag());
+ if (info == null) {
+ log("getSimLocaleForSubscriber, inactive subId: " + subId);
+ return null;
+ }
+ } else {
+ info = mSubscriptionController.getActiveSubscriptionInfo(subId,
+ phone.getContext().getOpPackageName(),
+ phone.getContext().getAttributionTag());
+ if (info == null) {
+ log("getSimLocaleForSubscriber, inactive subId: " + subId);
+ return null;
+ }
}
// Try and fetch the locale from the carrier properties or from the SIM language
// preferences (EF-PL and EF-LI)...
@@ -7852,7 +7916,7 @@
if (!localeFromDefaultSim.getCountry().isEmpty()) {
if (DBG) log("Using locale from subId: " + subId + " locale: "
+ localeFromDefaultSim);
- return matchLocaleFromSupportedLocaleList(localeFromDefaultSim);
+ return matchLocaleFromSupportedLocaleList(phone, localeFromDefaultSim);
} else {
simLanguage = localeFromDefaultSim.getLanguage();
}
@@ -7865,7 +7929,7 @@
final Locale mccLocale = LocaleUtils.getLocaleFromMcc(mApp, mcc, simLanguage);
if (mccLocale != null) {
if (DBG) log("No locale from SIM, using mcc locale:" + mccLocale);
- return matchLocaleFromSupportedLocaleList(mccLocale);
+ return matchLocaleFromSupportedLocaleList(phone, mccLocale);
}
if (DBG) log("No locale found - returning null");
@@ -7876,13 +7940,12 @@
}
@VisibleForTesting
- String matchLocaleFromSupportedLocaleList(@NonNull Locale inputLocale) {
+ String matchLocaleFromSupportedLocaleList(Phone phone, @NonNull Locale inputLocale) {
String[] supportedLocale = com.android.internal.app.LocalePicker.getSupportedLocales(
- getDefaultPhone().getContext());
+ phone.getContext());
for (String localeTag : supportedLocale) {
- if (LocaleList.matchesLanguageAndScript(
- inputLocale, Locale.forLanguageTag(localeTag))
- && inputLocale.getCountry().equals(
+ if (LocaleList.matchesLanguageAndScript(inputLocale, Locale.forLanguageTag(localeTag))
+ && TextUtils.equals(inputLocale.getCountry(),
Locale.forLanguageTag(localeTag).getCountry())) {
return localeTag;
}
@@ -7890,15 +7953,14 @@
return inputLocale.toLanguageTag();
}
- private List<SubscriptionInfo> getAllSubscriptionInfoList() {
- return mSubscriptionController.getAllSubInfoList(mApp.getOpPackageName(),
- mApp.getAttributionTag());
- }
-
/**
* NOTE: this method assumes permission checks are done and caller identity has been cleared.
*/
private List<SubscriptionInfo> getActiveSubscriptionInfoListPrivileged() {
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ return SubscriptionManagerService.getInstance().getActiveSubscriptionInfoList(
+ mApp.getOpPackageName(), mApp.getAttributionTag());
+ }
return mSubscriptionController.getActiveSubscriptionInfoList(mApp.getOpPackageName(),
mApp.getAttributionTag());
}
@@ -7981,7 +8043,7 @@
*/
private void mergeModemActivityInfo(ModemActivityInfo info) {
List<ActivityStatsTechSpecificInfo> merged = new ArrayList<>();
- ActivityStatsTechSpecificInfo mDeltaSpecificInfo;
+ ActivityStatsTechSpecificInfo deltaSpecificInfo;
boolean matched;
for (int i = 0; i < info.getSpecificInfoLength(); i++) {
matched = false;
@@ -8006,13 +8068,13 @@
}
if (!matched) {
- mDeltaSpecificInfo =
+ deltaSpecificInfo =
new ActivityStatsTechSpecificInfo(
rat,
freq,
info.getTransmitTimeMillis(rat, freq),
(int) info.getReceiveTimeMillis(rat, freq));
- merged.addAll(Arrays.asList(mDeltaSpecificInfo));
+ merged.addAll(Arrays.asList(deltaSpecificInfo));
}
}
merged.addAll(Arrays.asList(mLastModemActivitySpecificInfo));
@@ -8027,6 +8089,26 @@
mLastModemActivityInfo.setIdleTimeMillis(
info.getIdleTimeMillis()
+ mLastModemActivityInfo.getIdleTimeMillis());
+
+ mLastModemActivityInfo =
+ new ModemActivityInfo(
+ mLastModemActivityInfo.getTimestampMillis(),
+ mLastModemActivityInfo.getSleepTimeMillis(),
+ mLastModemActivityInfo.getIdleTimeMillis(),
+ mLastModemActivitySpecificInfo);
+ }
+
+ private ActivityStatsTechSpecificInfo[] deepCopyModemActivitySpecificInfo(
+ ActivityStatsTechSpecificInfo[] info) {
+ int infoSize = info.length;
+ ActivityStatsTechSpecificInfo[] ret = new ActivityStatsTechSpecificInfo[infoSize];
+ for (int i = 0; i < infoSize; i++) {
+ ret[i] = new ActivityStatsTechSpecificInfo(
+ info[i].getRat(), info[i].getFrequencyRange(),
+ info[i].getTransmitTimeMillis(),
+ (int) info[i].getReceiveTimeMillis());
+ }
+ return ret;
}
/**
@@ -8090,10 +8172,21 @@
.contains(callingPackage);
try {
// isActiveSubId requires READ_PHONE_STATE, which we already check for above
- if (!mSubscriptionController.isActiveSubId(subId, callingPackage, callingFeatureId)) {
- Rlog.d(LOG_TAG,
- "getServiceStateForSubscriber returning null for inactive subId=" + subId);
- return null;
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ SubscriptionInfoInternal subInfo = SubscriptionManagerService.getInstance()
+ .getSubscriptionInfoInternal(subId);
+ if (subInfo == null || !subInfo.isActive()) {
+ Rlog.d(LOG_TAG, "getServiceStateForSubscriber returning null for inactive "
+ + "subId=" + subId);
+ return null;
+ }
+ } else {
+ if (!mSubscriptionController.isActiveSubId(subId, callingPackage,
+ callingFeatureId)) {
+ Rlog.d(LOG_TAG, "getServiceStateForSubscriber returning null for inactive "
+ + "subId=" + subId);
+ return null;
+ }
}
ServiceState ss = phone.getServiceState();
@@ -8244,6 +8337,16 @@
}
/**
+ * Make sure either called from same process as self (phone) or IPC caller has interact across
+ * users permission.
+ *
+ * @throws SecurityException if the caller does not have the required permission
+ */
+ private void enforceInteractAcrossUsersPermission(String message) {
+ mApp.enforceCallingOrSelfPermission(permission.INTERACT_ACROSS_USERS, message);
+ }
+
+ /**
* Make sure called from the package in charge of visual voicemail.
*
* @throws SecurityException if the caller is not the visual voicemail package.
@@ -9232,7 +9335,7 @@
*/
private int getDefaultNetworkType(int subId) {
List<Integer> list = TelephonyProperties.default_network();
- int phoneId = mSubscriptionController.getPhoneId(subId);
+ int phoneId = SubscriptionManager.getPhoneId(subId);
if (phoneId >= 0 && phoneId < list.size() && list.get(phoneId) != null) {
return list.get(phoneId);
}
@@ -9781,12 +9884,22 @@
/**
* Get the IRadio HAL Version
+ * @deprecated use getHalVersion instead
*/
+ @Deprecated
@Override
public int getRadioHalVersion() {
+ return getHalVersion(HAL_SERVICE_RADIO);
+ }
+
+ /**
+ * Get the HAL Version of a specific service
+ */
+ @Override
+ public int getHalVersion(int service) {
Phone phone = getDefaultPhone();
if (phone == null) return -1;
- HalVersion hv = phone.getHalVersion();
+ HalVersion hv = phone.getHalVersion(service);
if (hv.equals(HalVersion.UNKNOWN)) return -1;
return hv.major * 100 + hv.minor;
}
@@ -11268,9 +11381,13 @@
}
Phone phone = getPhone(subId);
+ if (phone == null) {
+ loge("isPremiumCapabilityAvailableForPurchase: phone is null, subId=" + subId);
+ return false;
+ }
final long identity = Binder.clearCallingIdentity();
try {
- return SliceStore.getInstance(phone)
+ return SlicePurchaseController.getInstance(phone)
.isPremiumCapabilityAvailableForPurchase(capability);
} finally {
Binder.restoreCallingIdentity(identity);
@@ -11300,6 +11417,21 @@
}
Phone phone = getPhone(subId);
+ if (phone == null) {
+ try {
+ int result = TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_REQUEST_FAILED;
+ callback.accept(result);
+ loge("purchasePremiumCapability: phone is null, subId=" + subId);
+ } catch (RemoteException e) {
+ String logStr = "Purchase premium capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability)
+ + " failed due to RemoteException handling null phone: " + e;
+ if (DBG) log(logStr);
+ AnomalyReporter.reportAnomaly(
+ UUID.fromString(PURCHASE_PREMIUM_CAPABILITY_ERROR_UUID), logStr);
+ }
+ return;
+ }
String appName;
try {
appName = mApp.getPackageManager().getApplicationLabel(mApp.getPackageManager()
@@ -11516,5 +11648,112 @@
}
}
+ /**
+ * Get the component name of the default app to direct respond-via-message intent for the
+ * user associated with this subscription, update the cache if there is no respond-via-message
+ * application currently configured for this user.
+ * @return component name of the app and class to direct Respond Via Message intent to, or
+ * {@code null} if the functionality is not supported.
+ * @hide
+ */
+ @Override
+ public @Nullable ComponentName getDefaultRespondViaMessageApplication(int subId,
+ boolean updateIfNeeded) {
+ enforceInteractAcrossUsersPermission("getDefaultRespondViaMessageApplication");
-}
+ Context context = getPhone(subId).getContext();
+ UserHandle userHandle = null;
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ userHandle = TelephonyUtils.getSubscriptionUserHandle(context, subId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ return SmsApplication.getDefaultRespondViaMessageApplicationAsUser(context,
+ updateIfNeeded, userHandle);
+ }
+
+ /**
+ * Set whether the device is able to connect with null ciphering or integrity
+ * algorithms. This is a global setting and will apply to all active subscriptions
+ * and all new subscriptions after this.
+ *
+ * @param enabled when true, null cipher and integrity algorithms are allowed.
+ * @hide
+ */
+ @Override
+ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+ public void setNullCipherAndIntegrityEnabled(boolean enabled) {
+ enforceModifyPermission();
+ checkForNullCipherAndIntegritySupport();
+
+ // Persist the state of our preference. Each GsmCdmaPhone instance is responsible
+ // for listening to these preference changes and applying them immediately.
+ SharedPreferences.Editor editor = mTelephonySharedPreferences.edit();
+ editor.putBoolean(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED, enabled);
+ editor.apply();
+
+ for (Phone phone: PhoneFactory.getPhones()) {
+ phone.handleNullCipherEnabledChange();
+ }
+ }
+
+
+ /**
+ * Get whether the device is able to connect with null ciphering or integrity
+ * algorithms. Note that this retrieves the phone-global preference and not
+ * the state of the radio.
+ *
+ * @throws SecurityException if {@link permission#MODIFY_PHONE_STATE} is not satisfied
+ * @throws UnsupportedOperationException if the device does not support the minimum HAL
+ * version for this feature.
+ * @hide
+ */
+ @Override
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
+ public boolean isNullCipherAndIntegrityPreferenceEnabled() {
+ enforceReadPermission();
+ checkForNullCipherAndIntegritySupport();
+ return getDefaultPhone().getNullCipherAndIntegrityEnabledPreference();
+ }
+
+ private void checkForNullCipherAndIntegritySupport() {
+ if (getHalVersion(HAL_SERVICE_NETWORK) < MIN_NULL_CIPHER_AND_INTEGRITY_VERSION) {
+ throw new UnsupportedOperationException(
+ "Null cipher and integrity operations require HAL 2.1 or above");
+ }
+ }
+
+ /**
+ * Get the SIM state for the slot index.
+ * For Remote-SIMs, this method returns {@link IccCardConstants.State#UNKNOWN}
+ *
+ * @return SIM state as the ordinal of {@link IccCardConstants.State}
+ */
+ @Override
+ @SimState
+ public int getSimStateForSlotIndex(int slotIndex) {
+ IccCardConstants.State simState;
+ if (slotIndex < 0) {
+ simState = IccCardConstants.State.UNKNOWN;
+ } else {
+ Phone phone = null;
+ try {
+ phone = PhoneFactory.getPhone(slotIndex);
+ } catch (IllegalStateException e) {
+ // ignore
+ }
+ if (phone == null) {
+ simState = IccCardConstants.State.UNKNOWN;
+ } else {
+ IccCard icc = phone.getIccCard();
+ if (icc == null) {
+ simState = IccCardConstants.State.UNKNOWN;
+ } else {
+ simState = icc.getState();
+ }
+ }
+ }
+ return simState.ordinal();
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/phone/PhoneUtils.java b/src/com/android/phone/PhoneUtils.java
index d0aad4a..5f14387 100644
--- a/src/com/android/phone/PhoneUtils.java
+++ b/src/com/android/phone/PhoneUtils.java
@@ -31,6 +31,7 @@
import android.os.Handler;
import android.os.Message;
import android.os.PersistableBundle;
+import android.os.UserHandle;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.telecom.PhoneAccount;
@@ -701,31 +702,28 @@
Log.d(LOG_TAG, msg);
}
- public static PhoneAccountHandle makePstnPhoneAccountHandle(String id) {
- return makePstnPhoneAccountHandleWithPrefix(id, "", false);
- }
-
- public static PhoneAccountHandle makePstnPhoneAccountHandle(int phoneId) {
- return makePstnPhoneAccountHandle(PhoneFactory.getPhone(phoneId));
- }
-
public static PhoneAccountHandle makePstnPhoneAccountHandle(Phone phone) {
- return makePstnPhoneAccountHandleWithPrefix(phone, "", false);
+ return makePstnPhoneAccountHandleWithPrefix(phone, "",
+ false, phone.getUserHandle());
}
public static PhoneAccountHandle makePstnPhoneAccountHandleWithPrefix(
- Phone phone, String prefix, boolean isEmergency) {
+ Phone phone, String prefix, boolean isEmergency, UserHandle userHandle) {
// TODO: Should use some sort of special hidden flag to decorate this account as
// an emergency-only account
String id = isEmergency ? EMERGENCY_ACCOUNT_HANDLE_ID : prefix +
String.valueOf(phone.getSubId());
- return makePstnPhoneAccountHandleWithPrefix(id, prefix, isEmergency);
+ return makePstnPhoneAccountHandleWithPrefix(id, prefix, isEmergency, userHandle);
}
public static PhoneAccountHandle makePstnPhoneAccountHandleWithPrefix(
- String id, String prefix, boolean isEmergency) {
+ String id, String prefix, boolean isEmergency, UserHandle userHandle) {
ComponentName pstnConnectionServiceName = getPstnConnectionServiceName();
- return new PhoneAccountHandle(pstnConnectionServiceName, id);
+ // If user handle is null, resort to default constructor to use phone process's
+ // user handle
+ return userHandle == null
+ ? new PhoneAccountHandle(pstnConnectionServiceName, id)
+ : new PhoneAccountHandle(pstnConnectionServiceName, id, userHandle);
}
public static int getSubIdForPhoneAccount(PhoneAccount phoneAccount) {
diff --git a/src/com/android/phone/Telephony2gUpdater.java b/src/com/android/phone/Telephony2gUpdater.java
new file mode 100644
index 0000000..0919385
--- /dev/null
+++ b/src/com/android/phone/Telephony2gUpdater.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.UserManager;
+import android.telephony.RadioAccessFamily;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.RILConstants;
+
+import java.util.List;
+import java.util.concurrent.Executor;
+
+/**
+ * A {@link BroadcastReceiver} that ensures that user restrictions are correctly applied to
+ * telephony.
+ * This includes handling broadcasts from user restriction state changes, as well as ensuring that
+ * SIM-specific settings are correctly applied when new subscriptions become active.
+ *
+ * Callers are expected to call {@code init()} and keep an instance of this class alive.
+ */
+public class Telephony2gUpdater extends BroadcastReceiver {
+ private static final String TAG = "TelephonyUserManagerReceiver";
+
+ // We can't interact with the HAL on the main thread of the phone process (where
+ // receivers are run by default), so we execute our logic from a separate thread.
+ private final Executor mExecutor;
+ private final Context mContext;
+ private final long mBaseAllowedNetworks;
+
+ public Telephony2gUpdater(Executor executor, Context context) {
+ this(executor, context,
+ RadioAccessFamily.getRafFromNetworkType(RILConstants.PREFERRED_NETWORK_MODE));
+ }
+
+ public Telephony2gUpdater(Executor executor, Context context,
+ long baseAllowedNetworks) {
+ mExecutor = executor;
+ mContext = context;
+ mBaseAllowedNetworks = baseAllowedNetworks;
+ }
+
+ /**
+ * Register the given instance as a {@link BroadcastReceiver} and a {@link
+ * SubscriptionManager.OnSubscriptionsChangedListener}.
+ */
+ public void init() {
+ mContext.getSystemService(SubscriptionManager.class).addOnSubscriptionsChangedListener(
+ mExecutor, new SubscriptionListener());
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(UserManager.ACTION_USER_RESTRICTIONS_CHANGED);
+ mContext.registerReceiver(this, filter);
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (context == null || intent == null) return;
+ Log.i(TAG, "Received callback for action " + intent.getAction());
+ final PendingResult result = goAsync();
+ mExecutor.execute(() -> {
+ Log.i(TAG, "Running handler for action " + intent.getAction());
+ handleUserRestrictionsChanged(context);
+ result.finish();
+ });
+ }
+
+ /**
+ * Update all active subscriptions with allowed network types depending on the current state
+ * of the {@link UserManager.DISALLOW_2G}.
+ */
+ @VisibleForTesting
+ public void handleUserRestrictionsChanged(Context context) {
+ UserManager um = context.getSystemService(UserManager.class);
+ TelephonyManager tm = context.getSystemService(TelephonyManager.class);
+ SubscriptionManager sm = context.getSystemService(SubscriptionManager.class);
+ final long twoGBitmask = TelephonyManager.NETWORK_CLASS_BITMASK_2G;
+
+ boolean shouldDisable2g = um.hasUserRestriction(UserManager.DISALLOW_CELLULAR_2G);
+
+ // This is expected when subscription info cannot be determined. We'll get another
+ // callback in the future from our SubscriptionListener once we have valid subscriptions.
+ List<SubscriptionInfo> subscriptionInfoList = sm.getAvailableSubscriptionInfoList();
+ if (subscriptionInfoList == null) {
+ return;
+ }
+
+ long allowedNetworkTypes = mBaseAllowedNetworks;
+
+ // 2G device admin controls are global
+ for (SubscriptionInfo info : subscriptionInfoList) {
+ TelephonyManager telephonyManager = tm.createForSubscriptionId(
+ info.getSubscriptionId());
+ if (shouldDisable2g) {
+ allowedNetworkTypes &= ~twoGBitmask;
+ } else {
+ allowedNetworkTypes |= twoGBitmask;
+ }
+ telephonyManager.setAllowedNetworkTypesForReason(
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS,
+ allowedNetworkTypes);
+ }
+ }
+
+ private class SubscriptionListener extends SubscriptionManager.OnSubscriptionsChangedListener {
+ @Override
+ public void onSubscriptionsChanged() {
+ Log.i(TAG, "Running handler for subscription change.");
+ handleUserRestrictionsChanged(mContext);
+ }
+ }
+
+}
diff --git a/src/com/android/phone/TelephonyShellCommand.java b/src/com/android/phone/TelephonyShellCommand.java
index 0cf120a..fdaf1bb 100644
--- a/src/com/android/phone/TelephonyShellCommand.java
+++ b/src/com/android/phone/TelephonyShellCommand.java
@@ -1099,7 +1099,7 @@
private int handleBarringSendCommand() {
PrintWriter errPw = getErrPrintWriter();
int slotId = getDefaultSlot();
- int subId = SubscriptionManager.getSubId(slotId)[0];
+ int subId = SubscriptionManager.getSubscriptionId(slotId);
@BarringInfo.BarringServiceInfo.BarringType int barringType =
BarringInfo.BarringServiceInfo.BARRING_TYPE_UNCONDITIONAL;
boolean isConditionallyBarred = false;
@@ -1111,7 +1111,7 @@
case "-s": {
try {
slotId = Integer.parseInt(getNextArgRequired());
- subId = SubscriptionManager.getSubId(slotId)[0];
+ subId = SubscriptionManager.getSubscriptionId(slotId);
} catch (NumberFormatException e) {
errPw.println("barring send requires an integer as a SLOT_ID.");
return -1;
@@ -2162,8 +2162,7 @@
return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}
}
- int[] subIds = SubscriptionManager.getSubId(slotId);
- return subIds[0];
+ return SubscriptionManager.getSubscriptionId(slotId);
}
private int handleGbaSetServiceCommand() {
diff --git a/src/com/android/phone/settings/AccessibilitySettingsFragment.java b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
index 475d878..4c29e65 100644
--- a/src/com/android/phone/settings/AccessibilitySettingsFragment.java
+++ b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
@@ -40,6 +40,7 @@
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.SubscriptionController;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.phone.PhoneGlobals;
import com.android.phone.R;
@@ -183,10 +184,16 @@
// Update RTT config with IMS Manager if the always-on carrier config isn't set to true.
CarrierConfigManager configManager = (CarrierConfigManager) mContext.getSystemService(
Context.CARRIER_CONFIG_SERVICE);
- for (int subId : SubscriptionController.getInstance().getActiveSubIdList(true)) {
+ int[] activeSubIds;
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ activeSubIds = SubscriptionManagerService.getInstance().getActiveSubIdList(true);
+ } else {
+ activeSubIds = SubscriptionController.getInstance().getActiveSubIdList(true);
+ }
+ for (int subId : activeSubIds) {
if (!configManager.getConfigForSubId(subId).getBoolean(
CarrierConfigManager.KEY_IGNORE_RTT_MODE_SETTING_BOOL, false)) {
- int phoneId = SubscriptionController.getInstance().getPhoneId(subId);
+ int phoneId = SubscriptionManager.getPhoneId(subId);
ImsManager imsManager = ImsManager.getInstance(getContext(), phoneId);
imsManager.setRttEnabled(mButtonRtt.isChecked());
}
@@ -264,6 +271,14 @@
private boolean shouldShowRttSetting() {
// Go through all the subs -- if we want to display the RTT setting for any of them, do
// display it.
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ for (int subId : SubscriptionManagerService.getInstance().getActiveSubIdList(true)) {
+ if (PhoneGlobals.getInstance().phoneMgr.isRttSupported(subId)) {
+ return true;
+ }
+ }
+ return false;
+ }
for (int subId : SubscriptionController.getInstance().getActiveSubIdList(true)) {
if (PhoneGlobals.getInstance().phoneMgr.isRttSupported(subId)) {
return true;
diff --git a/src/com/android/phone/settings/PhoneAccountSettingsFragment.java b/src/com/android/phone/settings/PhoneAccountSettingsFragment.java
index 49e1379..7cc9235 100644
--- a/src/com/android/phone/settings/PhoneAccountSettingsFragment.java
+++ b/src/com/android/phone/settings/PhoneAccountSettingsFragment.java
@@ -6,7 +6,9 @@
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Icon;
+import android.os.Binder;
import android.os.Bundle;
+import android.os.UserHandle;
import android.os.UserManager;
import android.preference.Preference;
import android.preference.PreferenceCategory;
@@ -364,6 +366,7 @@
mTelecomManager.getCallCapablePhoneAccounts(includeDisabledAccounts);
for (Iterator<PhoneAccountHandle> i = accountHandles.iterator(); i.hasNext();) {
PhoneAccountHandle handle = i.next();
+ UserHandle userHandle = handle.getUserHandle();
if (handle.equals(emergencyAccountHandle)) {
// never include emergency call accounts in this piece of code.
i.remove();
@@ -376,6 +379,11 @@
} else if (!includeSims &&
account.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)) {
i.remove();
+ } else if (!userHandle.equals(Binder.getCallingUserHandle())
+ && !account.hasCapabilities(PhoneAccount.CAPABILITY_MULTI_USER)) {
+ // Only show accounts for the current user (unless account has
+ // CAPABILITY_MULTI_USER).
+ i.remove();
}
}
return accountHandles;
@@ -387,7 +395,7 @@
private PhoneAccountHandle getEmergencyPhoneAccount() {
return PhoneUtils.makePstnPhoneAccountHandleWithPrefix(
- (Phone) null, "" /* prefix */, true /* isEmergency */);
+ (Phone) null, "" /* prefix */, true /* isEmergency */, null /* userHandle */);
}
public static Intent buildPhoneAccountConfigureIntent(
diff --git a/src/com/android/phone/settings/RadioInfo.java b/src/com/android/phone/settings/RadioInfo.java
index c6dbfc6..ac3259a 100644
--- a/src/com/android/phone/settings/RadioInfo.java
+++ b/src/com/android/phone/settings/RadioInfo.java
@@ -72,6 +72,13 @@
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.telephony.data.NetworkSlicingConfig;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.ImsManager;
+import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.ImsRcsManager;
+import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.feature.MmTelFeature;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
@@ -92,9 +99,6 @@
import androidx.appcompat.app.AlertDialog.Builder;
import androidx.appcompat.app.AppCompatActivity;
-import com.android.ims.ImsConfig;
-import com.android.ims.ImsException;
-import com.android.ims.ImsManager;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.euicc.EuiccConnector;
@@ -177,18 +181,6 @@
*/
private static final int ALWAYS_ON_DSDS_MODE = 1;
- private static final int IMS_VOLTE_PROVISIONED_CONFIG_ID =
- ImsConfig.ConfigConstants.VLT_SETTING_ENABLED;
-
- private static final int IMS_VT_PROVISIONED_CONFIG_ID =
- ImsConfig.ConfigConstants.LVC_SETTING_ENABLED;
-
- private static final int IMS_WFC_PROVISIONED_CONFIG_ID =
- ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED;
-
- private static final int EAB_PROVISIONED_CONFIG_ID =
- ImsConfig.ConfigConstants.EAB_SETTING_ENABLED;
-
//Values in must match CELL_INFO_REFRESH_RATES
private static final String[] CELL_INFO_REFRESH_RATE_LABELS = {
"Disabled",
@@ -293,6 +285,7 @@
private TelephonyManager mTelephonyManager;
private ImsManager mImsManager = null;
private Phone mPhone = null;
+ private ProvisioningManager mProvisioningManager = null;
private String mPingHostnameResultV4;
private String mPingHostnameResultV6;
@@ -422,12 +415,23 @@
unregisterPhoneStateListener();
mTelephonyManager.setCellInfoListRate(sCellInfoListRateDisabled, mPhone.getSubId());
+ if (phoneIndex == SubscriptionManager.INVALID_PHONE_INDEX) {
+ log("Invalid phone index " + phoneIndex + ", subscription ID " + subId);
+ return;
+ }
+
// update the subId
mTelephonyManager = mTelephonyManager.createForSubscriptionId(subId);
// update the phoneId
- mImsManager = ImsManager.getInstance(getApplicationContext(), phoneIndex);
mPhone = PhoneFactory.getPhone(phoneIndex);
+ mImsManager = new ImsManager(mPhone.getContext());
+ try {
+ mProvisioningManager = ProvisioningManager.createForSubscriptionId(subId);
+ } catch (IllegalArgumentException e) {
+ log("updatePhoneIndex : IllegalArgumentException " + e.getMessage());
+ mProvisioningManager = null;
+ }
updateAllFields();
}
@@ -483,11 +487,17 @@
mQueuedWork = new ThreadPoolExecutor(1, 1, RUNNABLE_TIMEOUT_MS, TimeUnit.MICROSECONDS,
new LinkedBlockingDeque<Runnable>());
mConnectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
- mPhone = PhoneFactory.getDefaultPhone();
+ mPhone = getPhone(SubscriptionManager.getDefaultSubscriptionId());
mTelephonyManager = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
.createForSubscriptionId(mPhone.getSubId());
- mImsManager = ImsManager.getInstance(getApplicationContext(), mPhone.getPhoneId());
+ mImsManager = new ImsManager(mPhone.getContext());
+ try {
+ mProvisioningManager = ProvisioningManager.createForSubscriptionId(mPhone.getSubId());
+ } catch (IllegalArgumentException e) {
+ log("onCreate : IllegalArgumentException " + e.getMessage());
+ mProvisioningManager = null;
+ }
sPhoneIndexLabels = getPhoneIndexLabels(mTelephonyManager);
@@ -555,7 +565,7 @@
mImsWfcProvisionedSwitch = (Switch) findViewById(R.id.wfc_provisioned_switch);
mEabProvisionedSwitch = (Switch) findViewById(R.id.eab_provisioned_switch);
- if (!ImsManager.isImsSupportedOnDevice(mPhone.getContext())) {
+ if (!isImsSupportedOnDevice(mPhone.getContext())) {
mImsVolteProvisionedSwitch.setVisibility(View.GONE);
mImsVtProvisionedSwitch.setVisibility(View.GONE);
mImsWfcProvisionedSwitch.setVisibility(View.GONE);
@@ -635,7 +645,7 @@
mCellInfoRefreshRateIndex = 0; //disabled
mPreferredNetworkTypeResult = PREFERRED_NETWORK_LABELS.length - 1; //Unknown
- mSelectedPhoneIndex = 0; //phone 0
+ mSelectedPhoneIndex = mPhone.getPhoneId();
new Thread(() -> {
int networkType = (int) mTelephonyManager.getPreferredNetworkTypeBitmask();
@@ -786,7 +796,7 @@
R.string.radioInfo_menu_viewFDN).setOnMenuItemClickListener(mViewFDNCallback);
menu.add(1, MENU_ITEM_VIEW_SDN, 0,
R.string.radioInfo_menu_viewSDN).setOnMenuItemClickListener(mViewSDNCallback);
- if (ImsManager.isImsSupportedOnDevice(mPhone.getContext())) {
+ if (isImsSupportedOnDevice(mPhone.getContext())) {
menu.add(1, MENU_ITEM_GET_IMS_STATUS,
0, R.string.radioInfo_menu_getIMS).setOnMenuItemClickListener(mGetImsStatus);
}
@@ -1514,34 +1524,38 @@
mRadioPowerOnSwitch.setOnCheckedChangeListener(mRadioPowerOnChangeListener);
}
- void setImsVolteProvisionedState(boolean state) {
+ private void setImsVolteProvisionedState(boolean state) {
Log.d(TAG, "setImsVolteProvisioned state: " + ((state) ? "on" : "off"));
- setImsConfigProvisionedState(IMS_VOLTE_PROVISIONED_CONFIG_ID, state);
+ setImsConfigProvisionedState(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+ ImsRegistrationImplBase.REGISTRATION_TECH_LTE, state);
}
- void setImsVtProvisionedState(boolean state) {
+ private void setImsVtProvisionedState(boolean state) {
Log.d(TAG, "setImsVtProvisioned() state: " + ((state) ? "on" : "off"));
- setImsConfigProvisionedState(IMS_VT_PROVISIONED_CONFIG_ID, state);
+ setImsConfigProvisionedState(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO,
+ ImsRegistrationImplBase.REGISTRATION_TECH_LTE, state);
}
- void setImsWfcProvisionedState(boolean state) {
+ private void setImsWfcProvisionedState(boolean state) {
Log.d(TAG, "setImsWfcProvisioned() state: " + ((state) ? "on" : "off"));
- setImsConfigProvisionedState(IMS_WFC_PROVISIONED_CONFIG_ID, state);
+ setImsConfigProvisionedState(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+ ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN, state);
}
- void setEabProvisionedState(boolean state) {
+ private void setEabProvisionedState(boolean state) {
Log.d(TAG, "setEabProvisioned() state: " + ((state) ? "on" : "off"));
- setImsConfigProvisionedState(EAB_PROVISIONED_CONFIG_ID, state);
+ setRcsConfigProvisionedState(ImsRcsManager.CAPABILITY_TYPE_PRESENCE_UCE,
+ ImsRegistrationImplBase.REGISTRATION_TECH_LTE, state);
}
- void setImsConfigProvisionedState(int configItem, boolean state) {
- if (mPhone != null && mImsManager != null) {
+ private void setImsConfigProvisionedState(int capability, int tech, boolean state) {
+ if (mProvisioningManager != null) {
mQueuedWork.execute(new Runnable() {
public void run() {
try {
- mImsManager.getConfigInterface().setProvisionedValue(
- configItem, state ? 1 : 0);
- } catch (ImsException e) {
+ mProvisioningManager.setProvisioningStatusForCapability(
+ capability, tech, state);
+ } catch (RuntimeException e) {
Log.e(TAG, "setImsConfigProvisioned() exception:", e);
}
}
@@ -1549,6 +1563,71 @@
}
}
+ private void setRcsConfigProvisionedState(int capability, int tech, boolean state) {
+ if (mProvisioningManager != null) {
+ mQueuedWork.execute(new Runnable() {
+ public void run() {
+ try {
+ mProvisioningManager.setRcsProvisioningStatusForCapability(
+ capability, tech, state);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "setRcsConfigProvisioned() exception:", e);
+ }
+ }
+ });
+ }
+ }
+
+ private boolean isImsVolteProvisioningRequired() {
+ return isImsConfigProvisioningRequired(
+ MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+ ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
+ }
+
+ private boolean isImsVtProvisioningRequired() {
+ return isImsConfigProvisioningRequired(
+ MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO,
+ ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
+ }
+
+ private boolean isImsWfcProvisioningRequired() {
+ return isImsConfigProvisioningRequired(
+ MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+ ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN);
+ }
+
+ private boolean isEabProvisioningRequired() {
+ return isRcsConfigProvisioningRequired(
+ ImsRcsManager.CAPABILITY_TYPE_PRESENCE_UCE,
+ ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
+ }
+
+ private boolean isImsConfigProvisioningRequired(int capability, int tech) {
+ if (mProvisioningManager != null) {
+ try {
+ return mProvisioningManager.isProvisioningRequiredForCapability(
+ capability, tech);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "isImsConfigProvisioningRequired() exception:", e);
+ }
+ }
+
+ return false;
+ }
+
+ private boolean isRcsConfigProvisioningRequired(int capability, int tech) {
+ if (mProvisioningManager != null) {
+ try {
+ return mProvisioningManager.isRcsProvisioningRequiredForCapability(
+ capability, tech);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "isRcsConfigProvisioningRequired() exception:", e);
+ }
+ }
+
+ return false;
+ }
+
OnCheckedChangeListener mRadioPowerOnChangeListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
@@ -1584,11 +1663,8 @@
};
private boolean isImsVolteProvisioned() {
- if (mImsManager != null) {
- return mImsManager.isVolteEnabledByPlatform()
- && mImsManager.isVolteProvisionedOnDevice();
- }
- return false;
+ return getImsConfigProvisionedState(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+ ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
}
OnCheckedChangeListener mImsVolteCheckedChangeListener = new OnCheckedChangeListener() {
@@ -1599,11 +1675,8 @@
};
private boolean isImsVtProvisioned() {
- if (mImsManager != null) {
- return mImsManager.isVtEnabledByPlatform()
- && mImsManager.isVtProvisionedOnDevice();
- }
- return false;
+ return getImsConfigProvisionedState(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO,
+ ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
}
OnCheckedChangeListener mImsVtCheckedChangeListener = new OnCheckedChangeListener() {
@@ -1614,11 +1687,8 @@
};
private boolean isImsWfcProvisioned() {
- if (mImsManager != null) {
- return mImsManager.isWfcEnabledByPlatform()
- && mImsManager.isWfcProvisionedOnDevice();
- }
- return false;
+ return getImsConfigProvisionedState(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+ ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN);
}
OnCheckedChangeListener mImsWfcCheckedChangeListener = new OnCheckedChangeListener() {
@@ -1629,7 +1699,8 @@
};
private boolean isEabProvisioned() {
- return isFeatureProvisioned(EAB_PROVISIONED_CONFIG_ID, false);
+ return getRcsConfigProvisionedState(ImsRcsManager.CAPABILITY_TYPE_PRESENCE_UCE,
+ ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
}
OnCheckedChangeListener mEabCheckedChangeListener = new OnCheckedChangeListener() {
@@ -1639,23 +1710,30 @@
}
};
- private boolean isFeatureProvisioned(int featureId, boolean defaultValue) {
- boolean provisioned = defaultValue;
- if (mImsManager != null) {
+ private boolean getImsConfigProvisionedState(int capability, int tech) {
+ if (mProvisioningManager != null) {
try {
- ImsConfig imsConfig = mImsManager.getConfigInterface();
- if (imsConfig != null) {
- provisioned =
- (imsConfig.getProvisionedValue(featureId)
- == ImsConfig.FeatureValueConstants.ON);
- }
- } catch (ImsException ex) {
- Log.e(TAG, "isFeatureProvisioned() exception:", ex);
+ return mProvisioningManager.getProvisioningStatusForCapability(
+ capability, tech);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "getImsConfigProvisionedState() exception:", e);
}
}
- log("isFeatureProvisioned() featureId=" + featureId + " provisioned=" + provisioned);
- return provisioned;
+ return false;
+ }
+
+ private boolean getRcsConfigProvisionedState(int capability, int tech) {
+ if (mProvisioningManager != null) {
+ try {
+ return mProvisioningManager.getRcsProvisioningStatusForCapability(
+ capability, tech);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "getRcsConfigProvisionedState() exception:", e);
+ }
+ }
+
+ return false;
}
private boolean isEabEnabledByPlatform() {
@@ -1674,35 +1752,56 @@
}
private void updateImsProvisionedState() {
- if (!ImsManager.isImsSupportedOnDevice(mPhone.getContext())) {
+ if (!isImsSupportedOnDevice(mPhone.getContext())) {
return;
}
- log("updateImsProvisionedState isImsVolteProvisioned()=" + isImsVolteProvisioned());
- //delightful hack to prevent on-checked-changed calls from
- //actually forcing the ims provisioning to its transient/current value.
+
+ updateServiceEnabledByPlatform();
+
+ updateEabProvisionedSwitch(isEabEnabledByPlatform());
+ }
+
+ private void updateVolteProvisionedSwitch(boolean isEnabledByPlatform) {
+ boolean isProvisioned = isEnabledByPlatform && isImsVolteProvisioned();
+ log("updateVolteProvisionedSwitch isProvisioned" + isProvisioned);
+
mImsVolteProvisionedSwitch.setOnCheckedChangeListener(null);
- mImsVolteProvisionedSwitch.setChecked(isImsVolteProvisioned());
+ mImsVolteProvisionedSwitch.setChecked(isProvisioned);
mImsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
mImsVolteProvisionedSwitch.setEnabled(!IS_USER_BUILD
- && mImsManager.isVolteEnabledByPlatform());
+ && isEnabledByPlatform && isImsVolteProvisioningRequired());
+ }
+
+ private void updateVtProvisionedSwitch(boolean isEnabledByPlatform) {
+ boolean isProvisioned = isEnabledByPlatform && isImsVtProvisioned();
+ log("updateVtProvisionedSwitch isProvisioned" + isProvisioned);
mImsVtProvisionedSwitch.setOnCheckedChangeListener(null);
- mImsVtProvisionedSwitch.setChecked(isImsVtProvisioned());
+ mImsVtProvisionedSwitch.setChecked(isProvisioned);
mImsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
mImsVtProvisionedSwitch.setEnabled(!IS_USER_BUILD
- && mImsManager.isVtEnabledByPlatform());
+ && isEnabledByPlatform && isImsVtProvisioningRequired());
+ }
+
+ private void updateWfcProvisionedSwitch(boolean isEnabledByPlatform) {
+ boolean isProvisioned = isEnabledByPlatform && isImsWfcProvisioned();
+ log("updateWfcProvisionedSwitch isProvisioned" + isProvisioned);
mImsWfcProvisionedSwitch.setOnCheckedChangeListener(null);
- mImsWfcProvisionedSwitch.setChecked(isImsWfcProvisioned());
+ mImsWfcProvisionedSwitch.setChecked(isProvisioned);
mImsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
mImsWfcProvisionedSwitch.setEnabled(!IS_USER_BUILD
- && mImsManager.isWfcEnabledByPlatform());
+ && isEnabledByPlatform && isImsWfcProvisioningRequired());
+ }
+
+ private void updateEabProvisionedSwitch(boolean isEnabledByPlatform) {
+ log("updateEabProvisionedSwitch isEabWfcProvisioned()=" + isEabProvisioned());
mEabProvisionedSwitch.setOnCheckedChangeListener(null);
mEabProvisionedSwitch.setChecked(isEabProvisioned());
mEabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
mEabProvisionedSwitch.setEnabled(!IS_USER_BUILD
- && isEabEnabledByPlatform());
+ && isEnabledByPlatform && isEabProvisioningRequired());
}
OnClickListener mDnsCheckButtonHandler = new OnClickListener() {
@@ -1803,14 +1902,8 @@
return;
}
// getSubId says it takes a slotIndex, but it actually takes a phone index
- int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
- int[] subIds = SubscriptionManager.getSubId(phoneIndex);
- if (subIds != null && subIds.length > 0) {
- subId = subIds[0];
- }
mSelectedPhoneIndex = phoneIndex;
-
- updatePhoneIndex(phoneIndex, subId);
+ updatePhoneIndex(phoneIndex, SubscriptionManager.getSubscriptionId(phoneIndex));
}
}
@@ -1941,4 +2034,45 @@
intent.putExtra("isDefault", isChecked);
sendBroadcast(intent);
}
+
+ private boolean isImsSupportedOnDevice(Context context) {
+ return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS);
+ }
+
+ private void updateServiceEnabledByPlatform() {
+ int subId = mPhone.getSubId();
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ log("updateServiceEnabledByPlatform subscription ID is invalid");
+ return;
+ }
+
+ ImsMmTelManager imsMmTelManager = mImsManager.getImsMmTelManager(subId);
+ try {
+ imsMmTelManager.isSupported(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN, getMainExecutor(), (result) -> {
+ updateVolteProvisionedSwitch(result);
+ });
+ imsMmTelManager.isSupported(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO,
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN, getMainExecutor(), (result) -> {
+ updateVtProvisionedSwitch(result);
+ });
+ imsMmTelManager.isSupported(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+ AccessNetworkConstants.TRANSPORT_TYPE_WLAN, getMainExecutor(), (result) -> {
+ updateWfcProvisionedSwitch(result);
+ });
+ } catch (ImsException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private Phone getPhone(int subId) {
+ log("getPhone subId = " + subId);
+ Phone phone = PhoneFactory.getPhone(SubscriptionManager.getPhoneId(subId));
+ if (phone == null) {
+ log("return the default phone");
+ return PhoneFactory.getDefaultPhone();
+ }
+
+ return phone;
+ }
}
diff --git a/src/com/android/phone/slice/PremiumNetworkEntitlementApi.java b/src/com/android/phone/slice/PremiumNetworkEntitlementApi.java
new file mode 100644
index 0000000..2546023
--- /dev/null
+++ b/src/com/android/phone/slice/PremiumNetworkEntitlementApi.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2022 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.slice;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.PersistableBundle;
+import android.provider.DeviceConfig;
+import android.telephony.AnomalyReporter;
+import android.telephony.CarrierConfigManager;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+
+import com.android.internal.telephony.Phone;
+import com.android.libraries.entitlement.CarrierConfig;
+import com.android.libraries.entitlement.ServiceEntitlement;
+import com.android.libraries.entitlement.ServiceEntitlementException;
+import com.android.libraries.entitlement.ServiceEntitlementRequest;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.UUID;
+
+/**
+ * Premium network entitlement API class to check the premium network slice entitlement result
+ * from carrier API over the network.
+ */
+public class PremiumNetworkEntitlementApi {
+ private static final String TAG = "PremiumNwEntitlementApi";
+ private static final String ENTITLEMENT_STATUS_KEY = "EntitlementStatus";
+ private static final String PROVISION_STATUS_KEY = "ProvStatus";
+ private static final String SERVICE_FLOW_URL_KEY = "ServiceFlow_URL";
+ private static final String PROVISION_TIME_LEFT_KEY = "ProvisionTimeLeft";
+ private static final String DEFAULT_EAP_AKA_RESPONSE = "Default EAP AKA response";
+ /**
+ * UUID to report an anomaly if an unexpected error is received during entitlement check.
+ */
+ private static final String UUID_ENTITLEMENT_CHECK_UNEXPECTED_ERROR =
+ "f2b0661a-9114-4b1b-9add-a8d338f9c054";
+
+ /**
+ * Experiment flag to enable bypassing EAP-AKA authentication for Slice Purchase activities.
+ * The device will accept any challenge from the entitlement server and return a predefined
+ * string as a response.
+ *
+ * This flag should be enabled for testing only.
+ */
+ public static final String BYPASS_EAP_AKA_AUTH_FOR_SLICE_PURCHASE_ENABLED =
+ "bypass_eap_aka_auth_for_slice_purchase_enabled";
+
+ @NonNull private final Phone mPhone;
+ @NonNull private final ServiceEntitlement mServiceEntitlement;
+
+ public PremiumNetworkEntitlementApi(@NonNull Phone phone,
+ @NonNull PersistableBundle carrierConfig) {
+ mPhone = phone;
+ if (isBypassEapAkaAuthForSlicePurchaseEnabled()) {
+ mServiceEntitlement =
+ new ServiceEntitlement(
+ mPhone.getContext(),
+ getEntitlementServerCarrierConfig(carrierConfig),
+ mPhone.getSubId(),
+ true,
+ DEFAULT_EAP_AKA_RESPONSE);
+ } else {
+ mServiceEntitlement =
+ new ServiceEntitlement(
+ mPhone.getContext(),
+ getEntitlementServerCarrierConfig(carrierConfig),
+ mPhone.getSubId());
+ }
+ }
+
+ /**
+ * Returns premium network slice entitlement check result from carrier API (over network),
+ * or {@code null} on unrecoverable network issue or malformed server response.
+ * This is blocking call sending HTTP request and should not be called on main thread.
+ */
+ @Nullable public PremiumNetworkEntitlementResponse checkEntitlementStatus(
+ @TelephonyManager.PremiumCapability int capability) {
+ Log.d(TAG, "checkEntitlementStatus subId=" + mPhone.getSubId());
+ ServiceEntitlementRequest.Builder requestBuilder = ServiceEntitlementRequest.builder();
+ // Set fake device info to avoid leaking
+ requestBuilder.setTerminalVendor("vendorX");
+ requestBuilder.setTerminalModel("modelY");
+ requestBuilder.setTerminalSoftwareVersion("versionZ");
+ requestBuilder.setAcceptContentType(ServiceEntitlementRequest.ACCEPT_CONTENT_TYPE_JSON);
+ requestBuilder.setNetworkIdentifier(
+ TelephonyManager.convertPremiumCapabilityToString(capability));
+ ServiceEntitlementRequest request = requestBuilder.build();
+ PremiumNetworkEntitlementResponse premiumNetworkEntitlementResponse =
+ new PremiumNetworkEntitlementResponse();
+
+ String response = null;
+ try {
+ response = mServiceEntitlement.queryEntitlementStatus(
+ ServiceEntitlement.APP_PREMIUM_NETWORK_SLICE,
+ request);
+ } catch (ServiceEntitlementException e) {
+ Log.e(TAG, "queryEntitlementStatus failed", e);
+ reportAnomaly(UUID_ENTITLEMENT_CHECK_UNEXPECTED_ERROR,
+ "checkEntitlementStatus failed with ServiceEntitlementException");
+ }
+ if (response == null) {
+ return null;
+ }
+ try {
+ JSONObject jsonAuthResponse = new JSONObject(response);
+ String entitlementStatus = null;
+ String provisionStatus = null;
+ String provisionTimeLeft = null;
+ if (jsonAuthResponse.has(ServiceEntitlement.APP_PREMIUM_NETWORK_SLICE)) {
+ JSONObject jsonToken = jsonAuthResponse.getJSONObject(
+ ServiceEntitlement.APP_PREMIUM_NETWORK_SLICE);
+ if (jsonToken.has(ENTITLEMENT_STATUS_KEY)) {
+ entitlementStatus = jsonToken.getString(ENTITLEMENT_STATUS_KEY);
+ if (entitlementStatus == null) {
+ return null;
+ }
+ premiumNetworkEntitlementResponse.mEntitlementStatus =
+ Integer.parseInt(entitlementStatus);
+ }
+ if (jsonToken.has(PROVISION_STATUS_KEY)) {
+ provisionStatus = jsonToken.getString(PROVISION_STATUS_KEY);
+ if (provisionStatus != null) {
+ premiumNetworkEntitlementResponse.mProvisionStatus =
+ Integer.parseInt(provisionStatus);
+ }
+ }
+ if (jsonToken.has(PROVISION_TIME_LEFT_KEY)) {
+ provisionTimeLeft = jsonToken.getString(PROVISION_TIME_LEFT_KEY);
+ if (provisionTimeLeft != null) {
+ premiumNetworkEntitlementResponse.mProvisionTimeLeft =
+ Integer.parseInt(provisionTimeLeft);
+ }
+ }
+ if (jsonToken.has(SERVICE_FLOW_URL_KEY)) {
+ premiumNetworkEntitlementResponse.mServiceFlowURL =
+ jsonToken.getString(SERVICE_FLOW_URL_KEY);
+ }
+ }
+
+
+ } catch (JSONException e) {
+ Log.e(TAG, "queryEntitlementStatus failed", e);
+ reportAnomaly(UUID_ENTITLEMENT_CHECK_UNEXPECTED_ERROR,
+ "checkEntitlementStatus failed with JSONException");
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "queryEntitlementStatus failed", e);
+ reportAnomaly(UUID_ENTITLEMENT_CHECK_UNEXPECTED_ERROR,
+ "checkEntitlementStatus failed with NumberFormatException");
+ }
+
+ return premiumNetworkEntitlementResponse;
+ }
+
+ private void reportAnomaly(@NonNull String uuid, @NonNull String log) {
+ AnomalyReporter.reportAnomaly(UUID.fromString(uuid), log);
+ }
+
+ /**
+ * Returns entitlement server url from the given carrier configs or a default empty string
+ * if it is not available.
+ */
+ @NonNull public static String getEntitlementServerUrl(
+ @NonNull PersistableBundle carrierConfig) {
+ return carrierConfig.getString(
+ CarrierConfigManager.ImsServiceEntitlement.KEY_ENTITLEMENT_SERVER_URL_STRING,
+ "");
+ }
+
+ @NonNull private CarrierConfig getEntitlementServerCarrierConfig(
+ @NonNull PersistableBundle carrierConfig) {
+ String entitlementServiceUrl = getEntitlementServerUrl(carrierConfig);
+ return CarrierConfig.builder().setServerUrl(entitlementServiceUrl).build();
+ }
+
+ private boolean isBypassEapAkaAuthForSlicePurchaseEnabled() {
+ return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_TELEPHONY,
+ BYPASS_EAP_AKA_AUTH_FOR_SLICE_PURCHASE_ENABLED, false);
+ }
+}
diff --git a/src/com/android/phone/slice/PremiumNetworkEntitlementResponse.java b/src/com/android/phone/slice/PremiumNetworkEntitlementResponse.java
new file mode 100644
index 0000000..4e63e35
--- /dev/null
+++ b/src/com/android/phone/slice/PremiumNetworkEntitlementResponse.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2022 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.slice;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+
+/**
+ * Response class containing the entitlement status, provisioning status, and service flow URL
+ * for premium network entitlement checks.
+ */
+public class PremiumNetworkEntitlementResponse {
+ public static final int PREMIUM_NETWORK_ENTITLEMENT_STATUS_DISABLED = 0;
+ public static final int PREMIUM_NETWORK_ENTITLEMENT_STATUS_ENABLED = 1;
+ public static final int PREMIUM_NETWORK_ENTITLEMENT_STATUS_INCOMPATIBLE = 2;
+ public static final int PREMIUM_NETWORK_ENTITLEMENT_STATUS_PROVISIONING = 3;
+ public static final int PREMIUM_NETWORK_ENTITLEMENT_STATUS_INCLUDED = 4;
+
+ @IntDef(prefix = {"PREMIUM_NETWORK_ENTITLEMENT_STATUS_"},
+ value = {
+ PREMIUM_NETWORK_ENTITLEMENT_STATUS_DISABLED,
+ PREMIUM_NETWORK_ENTITLEMENT_STATUS_ENABLED,
+ PREMIUM_NETWORK_ENTITLEMENT_STATUS_INCOMPATIBLE,
+ PREMIUM_NETWORK_ENTITLEMENT_STATUS_PROVISIONING,
+ PREMIUM_NETWORK_ENTITLEMENT_STATUS_INCLUDED
+ })
+ public @interface PremiumNetworkEntitlementStatus {}
+
+ public static final int PREMIUM_NETWORK_PROVISION_STATUS_NOT_PROVISIONED = 0;
+ public static final int PREMIUM_NETWORK_PROVISION_STATUS_PROVISIONED = 1;
+ public static final int PREMIUM_NETWORK_PROVISION_STATUS_NOT_REQUIRED = 2;
+ public static final int PREMIUM_NETWORK_PROVISION_STATUS_IN_PROGRESS = 3;
+
+ @IntDef(prefix = {"PREMIUM_NETWORK_PROVISION_STATUS_"},
+ value = {
+ PREMIUM_NETWORK_PROVISION_STATUS_NOT_PROVISIONED,
+ PREMIUM_NETWORK_PROVISION_STATUS_PROVISIONED,
+ PREMIUM_NETWORK_PROVISION_STATUS_NOT_REQUIRED,
+ PREMIUM_NETWORK_PROVISION_STATUS_IN_PROGRESS
+ })
+ public @interface PremiumNetworkProvisionStatus {}
+
+ @PremiumNetworkEntitlementStatus public int mEntitlementStatus;
+ @PremiumNetworkProvisionStatus public int mProvisionStatus;
+ public int mProvisionTimeLeft;
+ @NonNull public String mServiceFlowURL;
+
+ /**
+ * @return {@code true} if the premium network is provisioned and {@code false} otherwise.
+ */
+ public boolean isProvisioned() {
+ return mProvisionStatus == PREMIUM_NETWORK_PROVISION_STATUS_PROVISIONED
+ || mEntitlementStatus == PREMIUM_NETWORK_ENTITLEMENT_STATUS_INCLUDED;
+ }
+
+ /**
+ * @return {@code true} if provisioning the premium network is in progress and
+ * {@code false} otherwise.
+ */
+ public boolean isProvisioningInProgress() {
+ return mProvisionStatus == PREMIUM_NETWORK_PROVISION_STATUS_IN_PROGRESS
+ || mEntitlementStatus == PREMIUM_NETWORK_ENTITLEMENT_STATUS_PROVISIONING;
+ }
+
+ /**
+ * @return {@code true} if the premium network capability is allowed and
+ * {@code false} otherwise.
+ */
+ public boolean isPremiumNetworkCapabilityAllowed() {
+ switch (mEntitlementStatus) {
+ case PREMIUM_NETWORK_ENTITLEMENT_STATUS_INCOMPATIBLE:
+ case PREMIUM_NETWORK_ENTITLEMENT_STATUS_DISABLED:
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/src/com/android/phone/slice/SlicePurchaseController.java b/src/com/android/phone/slice/SlicePurchaseController.java
new file mode 100644
index 0000000..ead6b8c
--- /dev/null
+++ b/src/com/android/phone/slice/SlicePurchaseController.java
@@ -0,0 +1,875 @@
+/*
+ * Copyright (C) 2022 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.slice;
+
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_DISABLED;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ENTITLEMENT_CHECK_FAILED;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_DEFAULT_DATA_SUBSCRIPTION;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.os.AsyncResult;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.PersistableBundle;
+import android.telephony.AnomalyReporter;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.telephony.data.NetworkSliceInfo;
+import android.telephony.data.NetworkSlicingConfig;
+import android.text.TextUtils;
+import android.util.Log;
+import android.webkit.URLUtil;
+import android.webkit.WebView;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.Phone;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+/**
+ * The SlicePurchaseController controls the purchase and availability of all cellular premium
+ * capabilities. Applications can check whether premium capabilities are available by calling
+ * {@link TelephonyManager#isPremiumCapabilityAvailableForPurchase(int)}. If this returns true,
+ * they can then call {@link TelephonyManager#purchasePremiumCapability(int, Executor, Consumer)}
+ * to purchase the premium capability. If all conditions are met, a notification will be displayed
+ * to the user prompting them to purchase the premium capability. If the user confirms on the
+ * notification, a {@link WebView} will open that allows the user to purchase the premium capability
+ * from the carrier. If the purchase is successful, the premium capability will be available for
+ * all applications to request through {@link ConnectivityManager#requestNetwork}.
+ */
+public class SlicePurchaseController extends Handler {
+ @NonNull private static final String TAG = "SlicePurchaseController";
+
+ /** Unknown failure code. */
+ public static final int FAILURE_CODE_UNKNOWN = 0;
+ /** Network boost purchase failed because the carrier URL is unavailable. */
+ public static final int FAILURE_CODE_CARRIER_URL_UNAVAILABLE = 1;
+ /** Network boost purchase failed because the server is unreachable. */
+ public static final int FAILURE_CODE_SERVER_UNREACHABLE = 2;
+ /** Network boost purchase failed because user authentication failed. */
+ public static final int FAILURE_CODE_AUTHENTICATION_FAILED = 3;
+ /** Network boost purchase failed because the payment failed. */
+ public static final int FAILURE_CODE_PAYMENT_FAILED = 4;
+
+ /**
+ * Failure codes that the carrier website can return when a premium capability purchase fails.
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = { "FAILURE_CODE_" }, value = {
+ FAILURE_CODE_UNKNOWN,
+ FAILURE_CODE_CARRIER_URL_UNAVAILABLE,
+ FAILURE_CODE_SERVER_UNREACHABLE,
+ FAILURE_CODE_AUTHENTICATION_FAILED,
+ FAILURE_CODE_PAYMENT_FAILED})
+ public @interface FailureCode {}
+
+ /** Value for an invalid premium capability. */
+ public static final int PREMIUM_CAPABILITY_INVALID = -1;
+
+ /** Asset URL for the slice_purchase_test.html file. */
+ public static final String SLICE_PURCHASE_TEST_FILE =
+ "file:///android_asset/slice_purchase_test.html";
+
+ /** Purchasing the premium capability is no longer throttled. */
+ private static final int EVENT_PURCHASE_UNTHROTTLED = 1;
+ /** Slicing config changed. */
+ private static final int EVENT_SLICING_CONFIG_CHANGED = 2;
+ /** Display booster notification. */
+ private static final int EVENT_DISPLAY_BOOSTER_NOTIFICATION = 3;
+ /**
+ * Premium capability was not purchased within the timeout specified by
+ * {@link CarrierConfigManager#KEY_PREMIUM_CAPABILITY_NOTIFICATION_DISPLAY_TIMEOUT_MILLIS_LONG}.
+ */
+ private static final int EVENT_PURCHASE_TIMEOUT = 4;
+ /**
+ * Network did not set up the slicing configuration within the timeout specified by
+ * {@link CarrierConfigManager#KEY_PREMIUM_CAPABILITY_NETWORK_SETUP_TIME_MILLIS_LONG}.
+ */
+ private static final int EVENT_SETUP_TIMEOUT = 5;
+
+ /** UUID to report an anomaly when a premium capability is throttled twice in a row. */
+ private static final String UUID_CAPABILITY_THROTTLED_TWICE =
+ "15574927-e2e2-4593-99d4-2f340d22b383";
+ /** UUID to report an anomaly when receiving an invalid phone ID. */
+ private static final String UUID_INVALID_PHONE_ID = "ced79f1a-8ac0-4260-8cf3-08b54c0494f3";
+ /** UUID to report an anomaly when receiving an unknown action. */
+ private static final String UUID_UNKNOWN_ACTION = "0197efb0-dab1-4b0a-abaf-ac9336ec7923";
+ /** UUID to report an anomaly when receiving an unknown failure code with a non-empty reason. */
+ private static final String UUID_UNKNOWN_FAILURE_CODE = "76943b23-4415-400c-9855-b534fc4fc62c";
+ /**
+ * UUID to report an anomaly when the network fails to set up a slicing configuration after
+ * the user purchases a premium capability.
+ */
+ private static final String UUID_NETWORK_SETUP_FAILED = "12eeffbf-08f8-40ed-9a00-d344199552fc";
+
+ /**
+ * Action to start the slice purchase application and display the network boost notification.
+ */
+ public static final String ACTION_START_SLICE_PURCHASE_APP =
+ "com.android.phone.slice.action.START_SLICE_PURCHASE_APP";
+ /** Action indicating the premium capability purchase was not completed in time. */
+ public static final String ACTION_SLICE_PURCHASE_APP_RESPONSE_TIMEOUT =
+ "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_TIMEOUT";
+ /** Action indicating the network boost notification or WebView was canceled. */
+ private static final String ACTION_SLICE_PURCHASE_APP_RESPONSE_CANCELED =
+ "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_CANCELED";
+ /** Action indicating a carrier error prevented premium capability purchase. */
+ private static final String ACTION_SLICE_PURCHASE_APP_RESPONSE_CARRIER_ERROR =
+ "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_CARRIER_ERROR";
+ /**
+ * Action indicating a Telephony or slice purchase application error prevented premium
+ * capability purchase.
+ */
+ private static final String ACTION_SLICE_PURCHASE_APP_RESPONSE_REQUEST_FAILED =
+ "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_REQUEST_FAILED";
+ /** Action indicating the purchase request was not made on the default data subscription. */
+ private static final String ACTION_SLICE_PURCHASE_APP_RESPONSE_NOT_DEFAULT_DATA_SUBSCRIPTION =
+ "com.android.phone.slice.action."
+ + "SLICE_PURCHASE_APP_RESPONSE_NOT_DEFAULT_DATA_SUBSCRIPTION";
+ /** Action indicating the purchase request was successful. */
+ private static final String ACTION_SLICE_PURCHASE_APP_RESPONSE_SUCCESS =
+ "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_SUCCESS";
+
+ /** Extra for the phone index to send to the slice purchase application. */
+ public static final String EXTRA_PHONE_ID = "com.android.phone.slice.extra.PHONE_ID";
+ /** Extra for the subscription ID to send to the slice purchase application. */
+ public static final String EXTRA_SUB_ID = "com.android.phone.slice.extra.SUB_ID";
+ /**
+ * Extra for the requested premium capability to purchase from the slice purchase application.
+ */
+ public static final String EXTRA_PREMIUM_CAPABILITY =
+ "com.android.phone.slice.extra.PREMIUM_CAPABILITY";
+ /** Extra for the duration of the purchased premium capability. */
+ public static final String EXTRA_PURCHASE_DURATION =
+ "com.android.phone.slice.extra.PURCHASE_DURATION";
+ /** Extra for the {@link FailureCode} why the premium capability purchase failed. */
+ public static final String EXTRA_FAILURE_CODE = "com.android.phone.slice.extra.FAILURE_CODE";
+ /** Extra for the human-readable reason why the premium capability purchase failed. */
+ public static final String EXTRA_FAILURE_REASON =
+ "com.android.phone.slice.extra.FAILURE_REASON";
+ /**
+ * Extra for the application name requesting to purchase the premium capability
+ * from the slice purchase application.
+ */
+ public static final String EXTRA_REQUESTING_APP_NAME =
+ "com.android.phone.slice.extra.REQUESTING_APP_NAME";
+ /**
+ * Extra for the canceled PendingIntent that the slice purchase application can send as a
+ * response if the network boost notification or WebView was canceled by the user.
+ * Sends {@link #ACTION_SLICE_PURCHASE_APP_RESPONSE_CANCELED}.
+ */
+ public static final String EXTRA_INTENT_CANCELED =
+ "com.android.phone.slice.extra.INTENT_CANCELED";
+ /**
+ * Extra for the carrier error PendingIntent that the slice purchase application can send as a
+ * response if the premium capability purchase request failed due to a carrier error.
+ * Sends {@link #ACTION_SLICE_PURCHASE_APP_RESPONSE_CARRIER_ERROR}.
+ * Sender can modify the intent to specify the failure code and reason for failure with
+ * {@link #EXTRA_FAILURE_CODE} and {@link #EXTRA_FAILURE_REASON}.
+ */
+ public static final String EXTRA_INTENT_CARRIER_ERROR =
+ "com.android.phone.slice.extra.INTENT_CARRIER_ERROR";
+ /**
+ * Extra for the request failed PendingIntent that the slice purchase application can send as a
+ * response if the premium capability purchase request failed due to an error in Telephony or
+ * the slice purchase application.
+ * Sends {@link #ACTION_SLICE_PURCHASE_APP_RESPONSE_REQUEST_FAILED}.
+ */
+ public static final String EXTRA_INTENT_REQUEST_FAILED =
+ "com.android.phone.slice.extra.INTENT_REQUEST_FAILED";
+ /**
+ * Extra for the not-default data subscription ID PendingIntent that the slice purchase
+ * application can send as a response if the premium capability purchase request failed because
+ * it was not requested on the default data subscription.
+ * Sends {@link #ACTION_SLICE_PURCHASE_APP_RESPONSE_NOT_DEFAULT_DATA_SUBSCRIPTION}.
+ */
+ public static final String EXTRA_INTENT_NOT_DEFAULT_DATA_SUBSCRIPTION =
+ "com.android.phone.slice.extra.INTENT_NOT_DEFAULT_DATA_SUBSCRIPTION";
+ /**
+ * Extra for the success PendingIntent that the slice purchase application can send as a
+ * response if the premium capability purchase request was successful.
+ * Sends {@link #ACTION_SLICE_PURCHASE_APP_RESPONSE_SUCCESS}.
+ * Sender can modify the intent to specify a purchase duration with
+ * {@link #EXTRA_PURCHASE_DURATION}.
+ */
+ public static final String EXTRA_INTENT_SUCCESS =
+ "com.android.phone.slice.extra.INTENT_SUCCESS";
+
+ /** Component name to send an explicit broadcast to SlicePurchaseBroadcastReceiver. */
+ private static final ComponentName SLICE_PURCHASE_APP_COMPONENT_NAME =
+ ComponentName.unflattenFromString(
+ "com.android.carrierdefaultapp/.SlicePurchaseBroadcastReceiver");
+
+ /** Map of phone ID -> SlicePurchaseController instances. */
+ @NonNull private static final Map<Integer, SlicePurchaseController> sInstances =
+ new HashMap<>();
+
+ /** The Phone instance used to create the SlicePurchaseController. */
+ @NonNull private final Phone mPhone;
+ /** The set of capabilities that are pending network setup. */
+ @NonNull private final Set<Integer> mPendingSetupCapabilities = new HashSet<>();
+ /** The set of throttled capabilities. */
+ @NonNull private final Set<Integer> mThrottledCapabilities = new HashSet<>();
+ /** A map of pending capabilities to the onComplete message for the purchase request. */
+ @NonNull private final Map<Integer, Message> mPendingPurchaseCapabilities = new HashMap<>();
+ /**
+ * A map of capabilities to the SlicePurchaseControllerBroadcastReceiver to handle
+ * slice purchase application responses.
+ */
+ @NonNull private final Map<Integer, SlicePurchaseControllerBroadcastReceiver>
+ mSlicePurchaseControllerBroadcastReceivers = new HashMap<>();
+ /** The current network slicing configuration. */
+ @Nullable private NetworkSlicingConfig mSlicingConfig;
+ /** Premium network entitlement query API */
+ @NonNull private final PremiumNetworkEntitlementApi mPremiumNetworkEntitlementApi;
+
+ /**
+ * BroadcastReceiver to receive responses from the slice purchase application.
+ */
+ @VisibleForTesting
+ public class SlicePurchaseControllerBroadcastReceiver extends BroadcastReceiver {
+ @TelephonyManager.PremiumCapability private final int mCapability;
+
+ SlicePurchaseControllerBroadcastReceiver(
+ @TelephonyManager.PremiumCapability int capability) {
+ mCapability = capability;
+ }
+
+ @Override
+ public void onReceive(@NonNull Context context, @NonNull Intent intent) {
+ String action = intent.getAction();
+ logd("SlicePurchaseControllerBroadcastReceiver("
+ + TelephonyManager.convertPremiumCapabilityToString(mCapability)
+ + ") received action: " + action);
+ int phoneId = intent.getIntExtra(EXTRA_PHONE_ID,
+ SubscriptionManager.INVALID_PHONE_INDEX);
+ int capability = intent.getIntExtra(EXTRA_PREMIUM_CAPABILITY,
+ PREMIUM_CAPABILITY_INVALID);
+ if (SlicePurchaseController.getInstance(phoneId) == null) {
+ reportAnomaly(UUID_INVALID_PHONE_ID, "SlicePurchaseControllerBroadcastReceiver( "
+ + TelephonyManager.convertPremiumCapabilityToString(mCapability)
+ + ") received invalid phoneId: " + phoneId);
+ return;
+ } else if (capability != mCapability) {
+ logd("SlicePurchaseControllerBroadcastReceiver("
+ + TelephonyManager.convertPremiumCapabilityToString(mCapability)
+ + ") ignoring intent for capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability));
+ return;
+ }
+ switch (action) {
+ case ACTION_SLICE_PURCHASE_APP_RESPONSE_CANCELED: {
+ logd("Slice purchase application canceled for capability: "
+ + TelephonyManager.convertPremiumCapabilityToString(capability));
+ SlicePurchaseController.getInstance(phoneId)
+ .handlePurchaseResult(capability,
+ TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED,
+ true);
+ break;
+ }
+ case ACTION_SLICE_PURCHASE_APP_RESPONSE_CARRIER_ERROR: {
+ int failureCode = intent.getIntExtra(EXTRA_FAILURE_CODE, FAILURE_CODE_UNKNOWN);
+ String failureReason = intent.getStringExtra(EXTRA_FAILURE_REASON);
+ SlicePurchaseController.getInstance(phoneId).onCarrierError(
+ capability, failureCode, failureReason);
+ break;
+ }
+ case ACTION_SLICE_PURCHASE_APP_RESPONSE_REQUEST_FAILED: {
+ logd("Purchase premium capability request failed for capability: "
+ + TelephonyManager.convertPremiumCapabilityToString(capability));
+ SlicePurchaseController.getInstance(phoneId)
+ .handlePurchaseResult(capability,
+ TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_REQUEST_FAILED,
+ false);
+ break;
+ }
+ case ACTION_SLICE_PURCHASE_APP_RESPONSE_NOT_DEFAULT_DATA_SUBSCRIPTION: {
+ logd("Purchase premium capability request was not made on the default data "
+ + "subscription for capability: "
+ + TelephonyManager.convertPremiumCapabilityToString(capability));
+ SlicePurchaseController.getInstance(phoneId)
+ .handlePurchaseResult(capability,
+ PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_DEFAULT_DATA_SUBSCRIPTION,
+ false);
+ break;
+ }
+ case ACTION_SLICE_PURCHASE_APP_RESPONSE_SUCCESS: {
+ long duration = intent.getLongExtra(EXTRA_PURCHASE_DURATION, 0);
+ SlicePurchaseController.getInstance(phoneId).onCarrierSuccess(
+ capability, duration);
+ break;
+ }
+ default:
+ reportAnomaly(UUID_UNKNOWN_ACTION, "SlicePurchaseControllerBroadcastReceiver("
+ + TelephonyManager.convertPremiumCapabilityToString(mCapability)
+ + ") received unknown action: " + action);
+ break;
+ }
+ }
+ }
+
+ /**
+ * Get the static SlicePurchaseController instance for the given phone or create one if it
+ * doesn't exist.
+ *
+ * @param phone The Phone to get the SlicePurchaseController for.
+ * @return The static SlicePurchaseController instance.
+ */
+ @NonNull public static synchronized SlicePurchaseController getInstance(@NonNull Phone phone) {
+ // TODO: Add listeners for multi sim setting changed (maybe carrier config changed too)
+ // that dismiss notifications and update SlicePurchaseController instance
+ int phoneId = phone.getPhoneId();
+ if (sInstances.get(phoneId) == null) {
+ HandlerThread handlerThread = new HandlerThread("SlicePurchaseController");
+ handlerThread.start();
+ sInstances.put(phoneId, new SlicePurchaseController(phone, handlerThread.getLooper()));
+ }
+ return sInstances.get(phoneId);
+ }
+
+ /**
+ * Get the static SlicePurchaseController instance for the given phone ID if it exists.
+ *
+ * @param phoneId The phone ID to get the SlicePurchaseController for.
+ * @return The static SlicePurchaseController instance or
+ * {@code null} if it hasn't been created yet.
+ */
+ @Nullable private static SlicePurchaseController getInstance(int phoneId) {
+ return sInstances.get(phoneId);
+ }
+
+ /**
+ * Create a SlicePurchaseController for the given phone on the given looper.
+ * @param phone The Phone to create the SlicePurchaseController for.
+ * @param looper The Looper to run the SlicePurchaseController on.
+ */
+ @VisibleForTesting
+ public SlicePurchaseController(@NonNull Phone phone, @NonNull Looper looper) {
+ super(looper);
+ mPhone = phone;
+ // TODO: Create a cached value for slicing config in DataIndication and initialize here
+ mPhone.mCi.registerForSlicingConfigChanged(this, EVENT_SLICING_CONFIG_CHANGED, null);
+ mPremiumNetworkEntitlementApi = new PremiumNetworkEntitlementApi(mPhone,
+ getCarrierConfigs());
+ }
+
+ @Override
+ public void handleMessage(@NonNull Message msg) {
+ switch (msg.what) {
+ case EVENT_PURCHASE_UNTHROTTLED: {
+ int capability = (int) msg.obj;
+ logd("EVENT_PURCHASE_UNTHROTTLED: for capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability));
+ mThrottledCapabilities.remove(capability);
+ break;
+ }
+ case EVENT_SLICING_CONFIG_CHANGED: {
+ AsyncResult ar = (AsyncResult) msg.obj;
+ NetworkSlicingConfig config = (NetworkSlicingConfig) ar.result;
+ logd("EVENT_SLICING_CONFIG_CHANGED: from " + mSlicingConfig + " to " + config);
+ mSlicingConfig = config;
+ onSlicingConfigChanged();
+ break;
+ }
+ case EVENT_DISPLAY_BOOSTER_NOTIFICATION: {
+ int capability = msg.arg1;
+ String appName = (String) msg.obj;
+ logd("EVENT_DISPLAY_BOOSTER_NOTIFICATION: " + appName + " requests capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability));
+ onDisplayBoosterNotification(capability, appName);
+ break;
+ }
+ case EVENT_PURCHASE_TIMEOUT: {
+ int capability = (int) msg.obj;
+ logd("EVENT_PURCHASE_TIMEOUT: for capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability));
+ onTimeout(capability);
+ break;
+ }
+ case EVENT_SETUP_TIMEOUT:
+ int capability = (int) msg.obj;
+ logd("EVENT_SETUP_TIMEOUT: for capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability));
+ onSetupTimeout(capability);
+ break;
+ default:
+ loge("Unknown event: " + msg.obj);
+ }
+ }
+
+ /**
+ * Check whether the given premium capability is available for purchase from the carrier.
+ *
+ * @param capability The premium capability to check.
+ * @return Whether the given premium capability is available to purchase.
+ */
+ public boolean isPremiumCapabilityAvailableForPurchase(
+ @TelephonyManager.PremiumCapability int capability) {
+ if (!arePremiumCapabilitiesSupportedByDevice()) {
+ logd("Premium capabilities unsupported by the device.");
+ return false;
+ }
+ if (!isPremiumCapabilitySupportedByCarrier(capability)) {
+ logd("Premium capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability)
+ + " unsupported by the carrier.");
+ return false;
+ }
+ if (!isDefaultDataSub()) {
+ logd("Premium capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability)
+ + " unavailable on the non-default data subscription.");
+ return false;
+ }
+ logd("Premium capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability)
+ + " is available for purchase.");
+ return true;
+ }
+
+ /**
+ * Purchase the given premium capability from the carrier.
+ *
+ * @param capability The premium capability to purchase.
+ * @param appName The name of the application requesting premium capabilities.
+ * @param onComplete The callback message to send when the purchase request is complete.
+ */
+ public synchronized void purchasePremiumCapability(
+ @TelephonyManager.PremiumCapability int capability, @NonNull String appName,
+ @NonNull Message onComplete) {
+ logd("purchasePremiumCapability: " + appName + " requests capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability));
+ // Check whether the premium capability can be purchased.
+ if (!arePremiumCapabilitiesSupportedByDevice()) {
+ sendPurchaseResult(capability,
+ TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_FEATURE_NOT_SUPPORTED,
+ onComplete);
+ return;
+ }
+ if (!isPremiumCapabilitySupportedByCarrier(capability)) {
+ sendPurchaseResult(capability,
+ PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_DISABLED,
+ onComplete);
+ return;
+ }
+ if (!isDefaultDataSub()) {
+ sendPurchaseResult(capability,
+ PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_DEFAULT_DATA_SUBSCRIPTION,
+ onComplete);
+ return;
+ }
+ if (isSlicingConfigActive(capability)) {
+ sendPurchaseResult(capability,
+ PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED,
+ onComplete);
+ return;
+ }
+ if (mPendingSetupCapabilities.contains(capability)) {
+ sendPurchaseResult(capability,
+ TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_PENDING_NETWORK_SETUP,
+ onComplete);
+ return;
+ }
+ if (mThrottledCapabilities.contains(capability)) {
+ sendPurchaseResult(capability,
+ TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED,
+ onComplete);
+ return;
+ }
+ if (!isNetworkAvailable()) {
+ sendPurchaseResult(capability,
+ TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_NOT_AVAILABLE,
+ onComplete);
+ return;
+ }
+
+ if (mPendingPurchaseCapabilities.containsKey(capability)) {
+ sendPurchaseResult(capability,
+ PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS,
+ onComplete);
+ return;
+ }
+
+ // All state checks passed. Mark purchase pending and display the booster notification to
+ // prompt user purchase. Process through the handler since this method is synchronized.
+ mPendingPurchaseCapabilities.put(capability, onComplete);
+ sendMessage(obtainMessage(EVENT_DISPLAY_BOOSTER_NOTIFICATION, capability, 0 /* unused */,
+ appName));
+ }
+
+ private void sendPurchaseResult(@TelephonyManager.PremiumCapability int capability,
+ @TelephonyManager.PurchasePremiumCapabilityResult int result,
+ @NonNull Message onComplete) {
+ // Send the onComplete message with the purchase result.
+ logd("Purchase result for capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability)
+ + ": " + TelephonyManager.convertPurchaseResultToString(result));
+ AsyncResult.forMessage(onComplete, result, null);
+ onComplete.sendToTarget();
+ }
+
+ private void handlePurchaseResult(
+ @TelephonyManager.PremiumCapability int capability,
+ @TelephonyManager.PurchasePremiumCapabilityResult int result, boolean throttle) {
+ SlicePurchaseControllerBroadcastReceiver receiver =
+ mSlicePurchaseControllerBroadcastReceivers.remove(capability);
+ if (receiver != null) {
+ mPhone.getContext().unregisterReceiver(receiver);
+ }
+ removeMessages(EVENT_PURCHASE_TIMEOUT, capability);
+ if (throttle) {
+ throttleCapability(capability, getThrottleDuration(result));
+ }
+ sendPurchaseResult(capability, result, mPendingPurchaseCapabilities.remove(capability));
+ }
+
+ private void throttleCapability(@TelephonyManager.PremiumCapability int capability,
+ long throttleDuration) {
+ // Throttle subsequent requests if necessary.
+ if (!mThrottledCapabilities.contains(capability)) {
+ if (throttleDuration > 0) {
+ logd("Throttle purchase requests for capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability) + " for "
+ + TimeUnit.MILLISECONDS.toMinutes(throttleDuration) + " minutes.");
+ mThrottledCapabilities.add(capability);
+ sendMessageDelayed(obtainMessage(EVENT_PURCHASE_UNTHROTTLED, capability),
+ throttleDuration);
+ }
+ } else {
+ reportAnomaly(UUID_CAPABILITY_THROTTLED_TWICE,
+ TelephonyManager.convertPremiumCapabilityToString(capability)
+ + " is already throttled.");
+ }
+ }
+
+ private void onSlicingConfigChanged() {
+ for (int capability : new int[] {TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY}) {
+ if (isSlicingConfigActive(capability) && hasMessages(EVENT_SETUP_TIMEOUT, capability)) {
+ logd("Successfully set up slicing configuration for "
+ + TelephonyManager.convertPremiumCapabilityToString(capability));
+ mPendingSetupCapabilities.remove(capability);
+ removeMessages(EVENT_SETUP_TIMEOUT, capability);
+ }
+ }
+ }
+
+ private void onDisplayBoosterNotification(@TelephonyManager.PremiumCapability int capability,
+ @NonNull String appName) {
+ PremiumNetworkEntitlementResponse premiumNetworkEntitlementResponse =
+ mPremiumNetworkEntitlementApi.checkEntitlementStatus(capability);
+
+ // invalid response for entitlement check
+ if (premiumNetworkEntitlementResponse == null) {
+ logd("Invalid response for entitlement check.");
+ handlePurchaseResult(capability,
+ PURCHASE_PREMIUM_CAPABILITY_RESULT_ENTITLEMENT_CHECK_FAILED, true);
+ return;
+ }
+
+ if (premiumNetworkEntitlementResponse.isProvisioned()) {
+ logd("Entitlement Check: Already provisioned.");
+ handlePurchaseResult(capability,
+ PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED, true);
+ return;
+ }
+
+ if (premiumNetworkEntitlementResponse.isProvisioningInProgress()) {
+ logd("Entitlement Check: In Progress");
+ handlePurchaseResult(capability,
+ PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS, true);
+ return;
+ }
+
+ if (!premiumNetworkEntitlementResponse.isPremiumNetworkCapabilityAllowed()) {
+ handlePurchaseResult(capability,
+ PURCHASE_PREMIUM_CAPABILITY_RESULT_ENTITLEMENT_CHECK_FAILED, true);
+ return;
+ }
+
+ // Start timeout for purchase completion.
+ long timeout = getCarrierConfigs().getLong(CarrierConfigManager
+ .KEY_PREMIUM_CAPABILITY_NOTIFICATION_DISPLAY_TIMEOUT_MILLIS_LONG);
+ logd("Start purchase timeout for "
+ + TelephonyManager.convertPremiumCapabilityToString(capability) + " for "
+ + TimeUnit.MILLISECONDS.toMinutes(timeout) + " minutes.");
+ sendMessageDelayed(obtainMessage(EVENT_PURCHASE_TIMEOUT, capability), timeout);
+
+ // Broadcast start intent to start the slice purchase application
+ Intent intent = new Intent(ACTION_START_SLICE_PURCHASE_APP);
+ intent.setComponent(SLICE_PURCHASE_APP_COMPONENT_NAME);
+ intent.putExtra(EXTRA_PHONE_ID, mPhone.getPhoneId());
+ intent.putExtra(EXTRA_SUB_ID, mPhone.getSubId());
+ intent.putExtra(EXTRA_PREMIUM_CAPABILITY, capability);
+ intent.putExtra(EXTRA_REQUESTING_APP_NAME, appName);
+ intent.putExtra(EXTRA_INTENT_CANCELED, createPendingIntent(
+ ACTION_SLICE_PURCHASE_APP_RESPONSE_CANCELED, capability, false));
+ intent.putExtra(EXTRA_INTENT_CARRIER_ERROR, createPendingIntent(
+ ACTION_SLICE_PURCHASE_APP_RESPONSE_CARRIER_ERROR, capability, true));
+ intent.putExtra(EXTRA_INTENT_REQUEST_FAILED, createPendingIntent(
+ ACTION_SLICE_PURCHASE_APP_RESPONSE_REQUEST_FAILED, capability, false));
+ intent.putExtra(EXTRA_INTENT_NOT_DEFAULT_DATA_SUBSCRIPTION, createPendingIntent(
+ ACTION_SLICE_PURCHASE_APP_RESPONSE_NOT_DEFAULT_DATA_SUBSCRIPTION, capability,
+ false));
+ intent.putExtra(EXTRA_INTENT_SUCCESS, createPendingIntent(
+ ACTION_SLICE_PURCHASE_APP_RESPONSE_SUCCESS, capability, true));
+ logd("Broadcasting start intent to SlicePurchaseBroadcastReceiver.");
+ mPhone.getContext().sendBroadcast(intent);
+
+ // Listen for responses from the slice purchase application
+ mSlicePurchaseControllerBroadcastReceivers.put(capability,
+ new SlicePurchaseControllerBroadcastReceiver(capability));
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(ACTION_SLICE_PURCHASE_APP_RESPONSE_CANCELED);
+ filter.addAction(ACTION_SLICE_PURCHASE_APP_RESPONSE_CARRIER_ERROR);
+ filter.addAction(ACTION_SLICE_PURCHASE_APP_RESPONSE_REQUEST_FAILED);
+ filter.addAction(ACTION_SLICE_PURCHASE_APP_RESPONSE_NOT_DEFAULT_DATA_SUBSCRIPTION);
+ filter.addAction(ACTION_SLICE_PURCHASE_APP_RESPONSE_SUCCESS);
+ mPhone.getContext().registerReceiver(
+ mSlicePurchaseControllerBroadcastReceivers.get(capability), filter);
+ }
+
+ /**
+ * Create the PendingIntent to allow the slice purchase application to send back responses.
+ *
+ * @param action The action that will be sent for this PendingIntent
+ * @param capability The premium capability that was requested.
+ * @param mutable {@code true} if the PendingIntent should be mutable and
+ * {@code false} if it should be immutable.
+ * @return The PendingIntent for the given action and capability.
+ */
+ @VisibleForTesting
+ @NonNull public PendingIntent createPendingIntent(@NonNull String action,
+ @TelephonyManager.PremiumCapability int capability, boolean mutable) {
+ Intent intent = new Intent(action);
+ intent.putExtra(EXTRA_PHONE_ID, mPhone.getPhoneId());
+ intent.putExtra(EXTRA_PREMIUM_CAPABILITY, capability);
+ return PendingIntent.getBroadcast(mPhone.getContext(), capability, intent,
+ PendingIntent.FLAG_CANCEL_CURRENT
+ | (mutable ? PendingIntent.FLAG_MUTABLE : PendingIntent.FLAG_IMMUTABLE));
+ }
+
+ private void onTimeout(@TelephonyManager.PremiumCapability int capability) {
+ logd("onTimeout: " + TelephonyManager.convertPremiumCapabilityToString(capability));
+ // Broadcast timeout intent to clean up the slice purchase notification and activity
+ Intent intent = new Intent(ACTION_SLICE_PURCHASE_APP_RESPONSE_TIMEOUT);
+ intent.setComponent(SLICE_PURCHASE_APP_COMPONENT_NAME);
+ intent.putExtra(EXTRA_PHONE_ID, mPhone.getPhoneId());
+ intent.putExtra(EXTRA_PREMIUM_CAPABILITY, capability);
+ logd("Broadcasting timeout intent to SlicePurchaseBroadcastReceiver.");
+ mPhone.getContext().sendBroadcast(intent);
+
+ handlePurchaseResult(
+ capability, TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT, true);
+ }
+
+ private void onCarrierError(@TelephonyManager.PremiumCapability int capability,
+ @FailureCode int failureCode, @Nullable String failureReason) {
+ logd("Carrier error for capability: "
+ + TelephonyManager.convertPremiumCapabilityToString(capability) + " with code: "
+ + convertFailureCodeToString(failureCode) + " and reason: " + failureReason);
+ if (failureCode == FAILURE_CODE_UNKNOWN && !TextUtils.isEmpty(failureReason)) {
+ reportAnomaly(UUID_UNKNOWN_FAILURE_CODE,
+ "Failure code needs to be added for: " + failureReason);
+ }
+ handlePurchaseResult(capability,
+ TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR, true);
+ }
+
+ private void onCarrierSuccess(@TelephonyManager.PremiumCapability int capability,
+ long duration) {
+ logd("Successfully purchased premium capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability) + (duration > 0
+ ? " for " + TimeUnit.MILLISECONDS.toMinutes(duration) + " minutes." : "."));
+ mPendingSetupCapabilities.add(capability);
+ long setupDuration = getCarrierConfigs().getLong(
+ CarrierConfigManager.KEY_PREMIUM_CAPABILITY_NETWORK_SETUP_TIME_MILLIS_LONG);
+ logd("Waiting " + TimeUnit.MILLISECONDS.toMinutes(setupDuration) + " minutes for the "
+ + "network to set up the slicing configuration.");
+ sendMessageDelayed(obtainMessage(EVENT_SETUP_TIMEOUT, capability), setupDuration);
+ handlePurchaseResult(
+ capability, TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS, false);
+ }
+
+ private void onSetupTimeout(@TelephonyManager.PremiumCapability int capability) {
+ logd("onSetupTimeout: " + TelephonyManager.convertPremiumCapabilityToString(capability));
+ mPendingSetupCapabilities.remove(capability);
+ if (!isSlicingConfigActive(capability)) {
+ reportAnomaly(UUID_NETWORK_SETUP_FAILED,
+ "Failed to set up slicing configuration for capability "
+ + TelephonyManager.convertPremiumCapabilityToString(capability)
+ + " within the time specified.");
+ }
+ }
+
+ @Nullable private PersistableBundle getCarrierConfigs() {
+ return mPhone.getContext().getSystemService(CarrierConfigManager.class)
+ .getConfigForSubId(mPhone.getSubId());
+ }
+
+ private long getThrottleDuration(@TelephonyManager.PurchasePremiumCapabilityResult int result) {
+ if (result == TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED
+ || result == TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT) {
+ return getCarrierConfigs().getLong(CarrierConfigManager
+ .KEY_PREMIUM_CAPABILITY_NOTIFICATION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG);
+ }
+ if (result == TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ENTITLEMENT_CHECK_FAILED
+ || result == TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR) {
+ return getCarrierConfigs().getLong(CarrierConfigManager
+ .KEY_PREMIUM_CAPABILITY_PURCHASE_CONDITION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG);
+ }
+ return 0;
+ }
+
+ private boolean isPremiumCapabilitySupportedByCarrier(
+ @TelephonyManager.PremiumCapability int capability) {
+ String url = getCarrierConfigs().getString(
+ CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING);
+ if (!isUrlValid(url)) {
+ return false;
+ }
+ int[] supportedCapabilities = getCarrierConfigs().getIntArray(
+ CarrierConfigManager.KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY);
+ if (supportedCapabilities == null) {
+ return false;
+ }
+ return Arrays.stream(supportedCapabilities)
+ .anyMatch(supportedCapability -> supportedCapability == capability);
+ }
+
+ private boolean isUrlValid(@Nullable String url) {
+ if (!URLUtil.isValidUrl(url)) {
+ loge("Invalid URL: " + url);
+ return false;
+ }
+ if (URLUtil.isAssetUrl(url) && !url.equals(SLICE_PURCHASE_TEST_FILE)) {
+ loge("Invalid asset: " + url);
+ return false;
+ }
+ try {
+ new URL(url).toURI();
+ } catch (MalformedURLException | URISyntaxException e) {
+ loge("Invalid URI: " + url);
+ return false;
+ }
+ logd("Valid URL: " + url);
+ return true;
+ }
+
+ private boolean arePremiumCapabilitiesSupportedByDevice() {
+ // TODO: Add more checks?
+ // Maybe device resource overlay to enable/disable in addition to carrier configs
+ return (mPhone.getCachedAllowedNetworkTypesBitmask()
+ & TelephonyManager.NETWORK_TYPE_BITMASK_NR) != 0;
+ }
+
+ private boolean isDefaultDataSub() {
+ return mPhone.getSubId() == SubscriptionManager.getDefaultDataSubscriptionId();
+ }
+
+ private boolean isSlicingConfigActive(@TelephonyManager.PremiumCapability int capability) {
+ if (mSlicingConfig == null) {
+ return false;
+ }
+ int capabilityServiceType = getSliceServiceType(capability);
+ for (NetworkSliceInfo sliceInfo : mSlicingConfig.getSliceInfo()) {
+ // TODO: check if TrafficDescriptor has realtime capability slice
+ if (sliceInfo.getSliceServiceType() == capabilityServiceType
+ && sliceInfo.getStatus() == NetworkSliceInfo.SLICE_STATUS_ALLOWED) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @NetworkSliceInfo.SliceServiceType private int getSliceServiceType(
+ @TelephonyManager.PremiumCapability int capability) {
+ // TODO: Implement properly -- potentially need to add new slice service types?
+ return NetworkSliceInfo.SLICE_SERVICE_TYPE_NONE;
+ }
+
+ private boolean isNetworkAvailable() {
+ // TODO (b/251558673): Create a listener for data network type changed to dismiss
+ // notification and activity when the network is no longer available.
+ switch (mPhone.getServiceState().getDataNetworkType()) {
+ case TelephonyManager.NETWORK_TYPE_NR:
+ return true;
+ case TelephonyManager.NETWORK_TYPE_LTE:
+ case TelephonyManager.NETWORK_TYPE_LTE_CA:
+ return getCarrierConfigs().getBoolean(
+ CarrierConfigManager.KEY_PREMIUM_CAPABILITY_SUPPORTED_ON_LTE_BOOL);
+ }
+ return false;
+ }
+
+ /**
+ * Returns the failure code {@link FailureCode} as a String.
+ *
+ * @param failureCode The failure code.
+ * @return The failure code as a String.
+ */
+ @NonNull private static String convertFailureCodeToString(@FailureCode int failureCode) {
+ switch (failureCode) {
+ case FAILURE_CODE_UNKNOWN: return "UNKNOWN";
+ case FAILURE_CODE_CARRIER_URL_UNAVAILABLE: return "CARRIER_URL_UNAVAILABLE";
+ case FAILURE_CODE_SERVER_UNREACHABLE: return "SERVER_UNREACHABLE";
+ case FAILURE_CODE_AUTHENTICATION_FAILED: return "AUTHENTICATION_FAILED";
+ case FAILURE_CODE_PAYMENT_FAILED: return "PAYMENT_FAILED";
+ default:
+ return "UNKNOWN(" + failureCode + ")";
+ }
+ }
+
+ private void reportAnomaly(@NonNull String uuid, @NonNull String log) {
+ loge(log);
+ AnomalyReporter.reportAnomaly(UUID.fromString(uuid), log);
+ }
+
+ private void logd(String s) {
+ Log.d(TAG + "-" + mPhone.getPhoneId(), s);
+ }
+
+ private void loge(String s) {
+ Log.e(TAG + "-" + mPhone.getPhoneId(), s);
+ }
+}
diff --git a/src/com/android/phone/slicestore/SliceStore.java b/src/com/android/phone/slicestore/SliceStore.java
deleted file mode 100644
index 20245f6..0000000
--- a/src/com/android/phone/slicestore/SliceStore.java
+++ /dev/null
@@ -1,638 +0,0 @@
-/*
- * Copyright (C) 2022 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.slicestore;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.PersistableBundle;
-import android.telephony.AnomalyReporter;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.telephony.data.NetworkSliceInfo;
-import android.telephony.data.NetworkSlicingConfig;
-import android.text.TextUtils;
-import android.util.Log;
-import android.webkit.WebView;
-
-import com.android.internal.telephony.Phone;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
-
-/**
- * The SliceStore controls the purchase and availability of all cellular premium capabilities.
- * Applications can check whether premium capabilities are available by calling
- * {@link TelephonyManager#isPremiumCapabilityAvailableForPurchase(int)}. If this returns true,
- * they can then call {@link TelephonyManager#purchasePremiumCapability(int, Executor, Consumer)}
- * to purchase the premium capability. If all conditions are met, a notification will be displayed
- * to the user prompting them to purchase the premium capability. If the user confirms on the
- * notification, a {@link WebView} will open that allows the user to purchase the premium capability
- * from the carrier. If the purchase is successful, the premium capability will be available for
- * all applications to request through {@link ConnectivityManager#requestNetwork}.
- */
-public class SliceStore extends Handler {
- @NonNull private static final String TAG = "SliceStore";
-
- /** Value for an invalid premium capability. */
- public static final int PREMIUM_CAPABILITY_INVALID = -1;
-
- /** Purchasing the premium capability is no longer throttled. */
- private static final int EVENT_PURCHASE_UNTHROTTLED = 1;
- /** Slicing config changed. */
- private static final int EVENT_SLICING_CONFIG_CHANGED = 2;
- /** Display booster notification. */
- private static final int EVENT_DISPLAY_BOOSTER_NOTIFICATION = 3;
- /** Boost was not purchased within the timeout specified by carrier configs. */
- private static final int EVENT_PURCHASE_TIMEOUT = 4;
-
- /** UUID to report an anomaly when a premium capability is throttled twice in a row. */
- private static final String UUID_CAPABILITY_THROTTLED_TWICE =
- "15574927-e2e2-4593-99d4-2f340d22b383";
- /** UUID to report an anomaly when receiving an invalid phone ID. */
- private static final String UUID_INVALID_PHONE_ID = "ced79f1a-8ac0-4260-8cf3-08b54c0494f3";
- /** UUID to report an anomaly when receiving an unknown action. */
- private static final String UUID_UNKNOWN_ACTION = "0197efb0-dab1-4b0a-abaf-ac9336ec7923";
-
- /** Action to start the SliceStore application and display the network boost notification. */
- public static final String ACTION_START_SLICE_STORE =
- "com.android.phone.slicestore.action.START_SLICE_STORE";
- /** Action indicating the SliceStore purchase was not completed in time. */
- public static final String ACTION_SLICE_STORE_RESPONSE_TIMEOUT =
- "com.android.phone.slicestore.action.SLICE_STORE_RESPONSE_TIMEOUT";
- /** Action indicating the network boost notification or WebView was canceled. */
- private static final String ACTION_SLICE_STORE_RESPONSE_CANCELED =
- "com.android.phone.slicestore.action.SLICE_STORE_RESPONSE_CANCELED";
- /** Action indicating a carrier error prevented premium capability purchase. */
- private static final String ACTION_SLICE_STORE_RESPONSE_CARRIER_ERROR =
- "com.android.phone.slicestore.action.SLICE_STORE_RESPONSE_CARRIER_ERROR";
- /** Action indicating a Telephony or SliceStore error prevented premium capability purchase. */
- private static final String ACTION_SLICE_STORE_RESPONSE_REQUEST_FAILED =
- "com.android.phone.slicestore.action.SLICE_STORE_RESPONSE_REQUEST_FAILED";
- /** Action indicating the purchase request was not made on the default data subscription. */
- private static final String ACTION_SLICE_STORE_RESPONSE_NOT_DEFAULT_DATA =
- "com.android.phone.slicestore.action.SLICE_STORE_RESPONSE_NOT_DEFAULT_DATA";
-
- /** Extra for the phone index to send to the SliceStore application. */
- public static final String EXTRA_PHONE_ID = "com.android.phone.slicestore.extra.PHONE_ID";
- /** Extra for the subscription ID to send to the SliceStore application. */
- public static final String EXTRA_SUB_ID = "com.android.phone.slicestore.extra.SUB_ID";
- /** Extra for the requested premium capability to purchase from the SliceStore application. */
- public static final String EXTRA_PREMIUM_CAPABILITY =
- "com.android.phone.slicestore.extra.PREMIUM_CAPABILITY";
- /**
- * Extra for the application name requesting to purchase the premium capability
- * from the SliceStore application.
- */
- public static final String EXTRA_REQUESTING_APP_NAME =
- "com.android.phone.slicestore.extra.REQUESTING_APP_NAME";
- /**
- * Extra for the canceled PendingIntent that the SliceStore application can send as a response
- * if the network boost notification or WebView was canceled by the user.
- * Sends {@link #ACTION_SLICE_STORE_RESPONSE_CANCELED}.
- */
- public static final String EXTRA_INTENT_CANCELED =
- "com.android.phone.slicestore.extra.INTENT_CANCELED";
- /**
- * Extra for the carrier error PendingIntent that the SliceStore application can send as a
- * response if the premium capability purchase request failed due to a carrier error.
- * Sends {@link #ACTION_SLICE_STORE_RESPONSE_CARRIER_ERROR}.
- */
- public static final String EXTRA_INTENT_CARRIER_ERROR =
- "com.android.phone.slicestore.extra.INTENT_CARRIER_ERROR";
- /**
- * Extra for the request failed PendingIntent that the SliceStore application can send as a
- * response if the premium capability purchase request failed due to an error in Telephony or
- * the SliceStore application.
- * Sends {@link #ACTION_SLICE_STORE_RESPONSE_REQUEST_FAILED}.
- */
- public static final String EXTRA_INTENT_REQUEST_FAILED =
- "com.android.phone.slicestore.extra.INTENT_REQUEST_FAILED";
- /**
- * Extra for the not-default data subscription ID PendingIntent that the SliceStore application
- * can send as a response if the premium capability purchase request failed because it was not
- * requested on the default data subscription.
- * Sends {@link #ACTION_SLICE_STORE_RESPONSE_NOT_DEFAULT_DATA}.
- */
- public static final String EXTRA_INTENT_NOT_DEFAULT_DATA =
- "com.android.phone.slicestore.extra.INTENT_NOT_DEFAULT_DATA";
-
- /** Component name to send an explicit broadcast to SliceStoreBroadcastReceiver. */
- private static final ComponentName SLICE_STORE_COMPONENT_NAME =
- ComponentName.unflattenFromString(
- "com.android.carrierdefaultapp/.SliceStoreBroadcastReceiver");
-
- /** Map of phone ID -> SliceStore instances. */
- @NonNull private static final Map<Integer, SliceStore> sInstances = new HashMap<>();
-
- /** The Phone instance used to create the SliceStore */
- @NonNull private final Phone mPhone;
- /** The set of purchased capabilities. */
- @NonNull private final Set<Integer> mPurchasedCapabilities = new HashSet<>();
- /** The set of throttled capabilities. */
- @NonNull private final Set<Integer> mThrottledCapabilities = new HashSet<>();
- /** A map of pending capabilities to the onComplete message for the purchase request. */
- @NonNull private final Map<Integer, Message> mPendingPurchaseCapabilities = new HashMap<>();
- /** A map of capabilities to the SliceStoreBroadcastReceiver for SliceStore responses. */
- @NonNull private final Map<Integer, SliceStoreBroadcastReceiver> mSliceStoreBroadcastReceivers =
- new HashMap<>();
- /** The current network slicing configuration. */
- @Nullable private NetworkSlicingConfig mSlicingConfig;
-
- private class SliceStoreBroadcastReceiver extends BroadcastReceiver {
- private final @TelephonyManager.PremiumCapability int mCapability;
-
- SliceStoreBroadcastReceiver(@TelephonyManager.PremiumCapability int capability) {
- mCapability = capability;
- }
-
- @Override
- public void onReceive(@NonNull Context context, @NonNull Intent intent) {
- String action = intent.getAction();
- logd("SliceStoreBroadcastReceiver("
- + TelephonyManager.convertPremiumCapabilityToString(mCapability)
- + ") received action: " + action);
- int phoneId = intent.getIntExtra(EXTRA_PHONE_ID,
- SubscriptionManager.INVALID_PHONE_INDEX);
- int capability = intent.getIntExtra(EXTRA_PREMIUM_CAPABILITY,
- PREMIUM_CAPABILITY_INVALID);
- if (SliceStore.getInstance(phoneId) == null) {
- String logStr = "SliceStoreBroadcastReceiver( "
- + TelephonyManager.convertPremiumCapabilityToString(mCapability)
- + ") received invalid phoneId: " + phoneId;
- loge(logStr);
- AnomalyReporter.reportAnomaly(UUID.fromString(UUID_INVALID_PHONE_ID), logStr);
- return;
- } else if (capability != mCapability) {
- logd("SliceStoreBroadcastReceiver("
- + TelephonyManager.convertPremiumCapabilityToString(mCapability)
- + ") ignoring intent for capability "
- + TelephonyManager.convertPremiumCapabilityToString(capability));
- return;
- }
- switch (action) {
- case ACTION_SLICE_STORE_RESPONSE_CANCELED: {
- logd("SliceStore canceled for capability: "
- + TelephonyManager.convertPremiumCapabilityToString(capability));
- SliceStore.getInstance(phoneId).sendPurchaseResultFromSliceStore(capability,
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED,
- true);
- break;
- }
- case ACTION_SLICE_STORE_RESPONSE_CARRIER_ERROR: {
- logd("Carrier error for capability: "
- + TelephonyManager.convertPremiumCapabilityToString(capability));
- SliceStore.getInstance(phoneId).sendPurchaseResultFromSliceStore(capability,
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR,
- true);
- break;
- }
- case ACTION_SLICE_STORE_RESPONSE_REQUEST_FAILED: {
- logd("Purchase premium capability request failed for capability: "
- + TelephonyManager.convertPremiumCapabilityToString(capability));
- SliceStore.getInstance(phoneId).sendPurchaseResultFromSliceStore(capability,
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_REQUEST_FAILED,
- false);
- break;
- }
- case ACTION_SLICE_STORE_RESPONSE_NOT_DEFAULT_DATA: {
- logd("Purchase premium capability request was not made on the default data "
- + "subscription for capability: "
- + TelephonyManager.convertPremiumCapabilityToString(capability));
- SliceStore.getInstance(phoneId).sendPurchaseResultFromSliceStore(capability,
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_DEFAULT_DATA,
- false);
- break;
- }
- default:
- String logStr = "SliceStoreBroadcastReceiver("
- + TelephonyManager.convertPremiumCapabilityToString(mCapability)
- + ") received unknown action: " + action;
- loge(logStr);
- AnomalyReporter.reportAnomaly(UUID.fromString(UUID_UNKNOWN_ACTION), logStr);
- break;
- }
- }
- }
-
- /**
- * Get the static SliceStore instance for the given phone or create one if it doesn't exist.
- *
- * @param phone The Phone to get the SliceStore for.
- * @return The static SliceStore instance.
- */
- @NonNull public static synchronized SliceStore getInstance(@NonNull Phone phone) {
- // TODO: Add listeners for multi sim setting changed (maybe carrier config changed too)
- // that dismiss notifications and update SliceStore instance
- int phoneId = phone.getPhoneId();
- if (sInstances.get(phoneId) == null) {
- sInstances.put(phoneId, new SliceStore(phone));
- }
- return sInstances.get(phoneId);
- }
-
- /**
- * Get the static SliceStore instance for the given phone ID if it exists.
- *
- * @param phoneId The phone ID to get the SliceStore for.
- * @return The static SliceStore instance or {@code null} if it hasn't been created yet.
- */
- @Nullable private static SliceStore getInstance(int phoneId) {
- return sInstances.get(phoneId);
- }
-
- private SliceStore(@NonNull Phone phone) {
- super(Looper.myLooper());
- mPhone = phone;
- // TODO: Create a cached value for slicing config in DataIndication and initialize here
- mPhone.mCi.registerForSlicingConfigChanged(this, EVENT_SLICING_CONFIG_CHANGED, null);
- }
-
- @Override
- public void handleMessage(@NonNull Message msg) {
- switch (msg.what) {
- case EVENT_PURCHASE_UNTHROTTLED: {
- int capability = (int) msg.obj;
- logd("EVENT_PURCHASE_UNTHROTTLED: for capability "
- + TelephonyManager.convertPremiumCapabilityToString(capability));
- mThrottledCapabilities.remove(capability);
- break;
- }
- case EVENT_SLICING_CONFIG_CHANGED: {
- AsyncResult ar = (AsyncResult) msg.obj;
- NetworkSlicingConfig config = (NetworkSlicingConfig) ar.result;
- logd("EVENT_SLICING_CONFIG_CHANGED: from " + mSlicingConfig + " to " + config);
- mSlicingConfig = config;
- break;
- }
- case EVENT_DISPLAY_BOOSTER_NOTIFICATION: {
- int capability = msg.arg1;
- String appName = (String) msg.obj;
- logd("EVENT_DISPLAY_BOOSTER_NOTIFICATION: " + appName + " requests capability "
- + TelephonyManager.convertPremiumCapabilityToString(capability));
- onDisplayBoosterNotification(capability, appName);
- break;
- }
- case EVENT_PURCHASE_TIMEOUT: {
- int capability = (int) msg.obj;
- logd("EVENT_PURCHASE_TIMEOUT: for capability "
- + TelephonyManager.convertPremiumCapabilityToString(capability));
- onTimeout(capability);
- break;
- }
- default:
- loge("Unknown event: " + msg.obj);
- }
- }
-
- /**
- * Check whether the given premium capability is available for purchase from the carrier.
- *
- * @param capability The premium capability to check.
- * @return Whether the given premium capability is available to purchase.
- */
- public boolean isPremiumCapabilityAvailableForPurchase(
- @TelephonyManager.PremiumCapability int capability) {
- if (!arePremiumCapabilitiesSupportedByDevice()) {
- logd("Premium capabilities unsupported by the device.");
- return false;
- }
- if (!isPremiumCapabilitySupportedByCarrier(capability)) {
- logd("Premium capability "
- + TelephonyManager.convertPremiumCapabilityToString(capability)
- + " unsupported by the carrier.");
- return false;
- }
- if (!isDefaultData()) {
- logd("Premium capability "
- + TelephonyManager.convertPremiumCapabilityToString(capability)
- + " unavailable on the non-default data subscription.");
- return false;
- }
- logd("Premium capability "
- + TelephonyManager.convertPremiumCapabilityToString(capability)
- + " is available for purchase.");
- return true;
- }
-
- /**
- * Purchase the given premium capability from the carrier.
- *
- * @param capability The premium capability to purchase.
- * @param appName The name of the application requesting premium capabilities.
- * @param onComplete The callback message to send when the purchase request is complete.
- */
- public synchronized void purchasePremiumCapability(
- @TelephonyManager.PremiumCapability int capability, @NonNull String appName,
- @NonNull Message onComplete) {
- logd("purchasePremiumCapability: " + appName + " requests capability "
- + TelephonyManager.convertPremiumCapabilityToString(capability));
- // Check whether the premium capability can be purchased.
- if (!arePremiumCapabilitiesSupportedByDevice()) {
- sendPurchaseResult(capability,
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_FEATURE_NOT_SUPPORTED,
- onComplete);
- return;
- }
- if (!isPremiumCapabilitySupportedByCarrier(capability)) {
- sendPurchaseResult(capability,
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_DISABLED,
- onComplete);
- return;
- }
- if (!isDefaultData()) {
- sendPurchaseResult(capability,
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_DEFAULT_DATA,
- onComplete);
- return;
- }
- if (mPurchasedCapabilities.contains(capability) || isSlicingConfigActive(capability)) {
- // TODO (b/245882601): Handle capability expiry
- sendPurchaseResult(capability,
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED,
- onComplete);
- return;
- }
- if (mThrottledCapabilities.contains(capability)) {
- sendPurchaseResult(capability,
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED,
- onComplete);
- return;
- }
- if (!isNetworkAvailable()) {
- sendPurchaseResult(capability,
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_NOT_AVAILABLE,
- onComplete);
- return;
- }
- if (isNetworkCongested(capability)) {
- throttleCapability(capability, getThrottleDuration(
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_CONGESTED));
- sendPurchaseResult(capability,
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_CONGESTED,
- onComplete);
- return;
- }
- if (mPendingPurchaseCapabilities.containsKey(capability)) {
- sendPurchaseResult(capability,
- TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS,
- onComplete);
- return;
- }
-
- // All state checks passed. Mark purchase pending and display the booster notification to
- // prompt user purchase. Process through the handler since this method is synchronized.
- mPendingPurchaseCapabilities.put(capability, onComplete);
- sendMessage(obtainMessage(EVENT_DISPLAY_BOOSTER_NOTIFICATION, capability, 0 /* unused */,
- appName));
- }
-
- private void sendPurchaseResult(@TelephonyManager.PremiumCapability int capability,
- @TelephonyManager.PurchasePremiumCapabilityResult int result,
- @NonNull Message onComplete) {
- // Send the onComplete message with the purchase result.
- logd("Purchase result for capability "
- + TelephonyManager.convertPremiumCapabilityToString(capability)
- + ": " + TelephonyManager.convertPurchaseResultToString(result));
- AsyncResult.forMessage(onComplete, result, null);
- onComplete.sendToTarget();
- }
-
- private void sendPurchaseResultFromSliceStore(
- @TelephonyManager.PremiumCapability int capability,
- @TelephonyManager.PurchasePremiumCapabilityResult int result, boolean throttle) {
- mPhone.getContext().unregisterReceiver(mSliceStoreBroadcastReceivers.remove(capability));
- removeMessages(EVENT_PURCHASE_TIMEOUT, capability);
- if (throttle) {
- throttleCapability(capability, getThrottleDuration(result));
- }
- sendPurchaseResult(capability, result, mPendingPurchaseCapabilities.remove(capability));
- }
-
- private void throttleCapability(@TelephonyManager.PremiumCapability int capability,
- long throttleDuration) {
- // Throttle subsequent requests if necessary.
- if (!mThrottledCapabilities.contains(capability)) {
- if (throttleDuration > 0) {
- logd("Throttle purchase requests for capability "
- + TelephonyManager.convertPremiumCapabilityToString(capability) + " for "
- + TimeUnit.MILLISECONDS.toMinutes(throttleDuration) + " minutes.");
- mThrottledCapabilities.add(capability);
- sendMessageDelayed(obtainMessage(EVENT_PURCHASE_UNTHROTTLED, capability),
- throttleDuration);
- }
- } else {
- String logStr = TelephonyManager.convertPremiumCapabilityToString(capability)
- + " is already throttled.";
- loge(logStr);
- AnomalyReporter.reportAnomaly(UUID.fromString(UUID_CAPABILITY_THROTTLED_TWICE), logStr);
- }
- }
-
- private void onDisplayBoosterNotification(@TelephonyManager.PremiumCapability int capability,
- @NonNull String appName) {
- // Start timeout for purchase completion.
- long timeout = getCarrierConfigs().getLong(CarrierConfigManager
- .KEY_PREMIUM_CAPABILITY_NOTIFICATION_DISPLAY_TIMEOUT_MILLIS_LONG);
- logd("Start purchase timeout for "
- + TelephonyManager.convertPremiumCapabilityToString(capability) + " for "
- + TimeUnit.MILLISECONDS.toMinutes(timeout) + " minutes.");
- sendMessageDelayed(obtainMessage(EVENT_PURCHASE_TIMEOUT, capability), timeout);
-
- // Broadcast start intent to start the SliceStore application
- Intent intent = new Intent(ACTION_START_SLICE_STORE);
- intent.setComponent(SLICE_STORE_COMPONENT_NAME);
- intent.putExtra(EXTRA_PHONE_ID, mPhone.getPhoneId());
- intent.putExtra(EXTRA_SUB_ID, mPhone.getSubId());
- intent.putExtra(EXTRA_PREMIUM_CAPABILITY, capability);
- intent.putExtra(EXTRA_REQUESTING_APP_NAME, appName);
- intent.putExtra(EXTRA_INTENT_CANCELED,
- createPendingIntent(ACTION_SLICE_STORE_RESPONSE_CANCELED, capability));
- intent.putExtra(EXTRA_INTENT_CARRIER_ERROR,
- createPendingIntent(ACTION_SLICE_STORE_RESPONSE_CARRIER_ERROR, capability));
- intent.putExtra(EXTRA_INTENT_REQUEST_FAILED,
- createPendingIntent(ACTION_SLICE_STORE_RESPONSE_REQUEST_FAILED, capability));
- intent.putExtra(EXTRA_INTENT_NOT_DEFAULT_DATA,
- createPendingIntent(ACTION_SLICE_STORE_RESPONSE_NOT_DEFAULT_DATA, capability));
- logd("Broadcasting start intent to SliceStoreBroadcastReceiver.");
- mPhone.getContext().sendBroadcast(intent);
-
- // Listen for responses from the SliceStore application
- mSliceStoreBroadcastReceivers.put(capability, new SliceStoreBroadcastReceiver(capability));
- IntentFilter filter = new IntentFilter();
- filter.addAction(ACTION_SLICE_STORE_RESPONSE_CANCELED);
- filter.addAction(ACTION_SLICE_STORE_RESPONSE_CARRIER_ERROR);
- filter.addAction(ACTION_SLICE_STORE_RESPONSE_REQUEST_FAILED);
- filter.addAction(ACTION_SLICE_STORE_RESPONSE_NOT_DEFAULT_DATA);
- mPhone.getContext().registerReceiver(mSliceStoreBroadcastReceivers.get(capability), filter);
- }
-
- /**
- * Create the PendingIntent to allow SliceStore to send back responses.
- *
- * @param action The action that will be sent for this PendingIntent
- * @param capability The premium capability that was requested.
- * @return The PendingIntent for the given action and capability.
- */
- @NonNull private PendingIntent createPendingIntent(@NonNull String action,
- @TelephonyManager.PremiumCapability int capability) {
- Intent intent = new Intent(action);
- intent.putExtra(EXTRA_PHONE_ID, mPhone.getPhoneId());
- intent.putExtra(EXTRA_PREMIUM_CAPABILITY, capability);
- return PendingIntent.getBroadcast(mPhone.getContext(), 0, intent,
- PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_MUTABLE);
- }
-
- private void onTimeout(@TelephonyManager.PremiumCapability int capability) {
- logd("onTimeout: " + TelephonyManager.convertPremiumCapabilityToString(capability));
- // Broadcast timeout intent to clean up the SliceStore notification and activity
- Intent intent = new Intent(ACTION_SLICE_STORE_RESPONSE_TIMEOUT);
- intent.setComponent(SLICE_STORE_COMPONENT_NAME);
- intent.putExtra(EXTRA_PHONE_ID, mPhone.getPhoneId());
- intent.putExtra(EXTRA_PREMIUM_CAPABILITY, capability);
- logd("Broadcasting timeout intent to SliceStoreBroadcastReceiver.");
- mPhone.getContext().sendBroadcast(intent);
-
- sendPurchaseResultFromSliceStore(
- capability, TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT, true);
- }
-
- private void onCarrierSuccess(@TelephonyManager.PremiumCapability int capability) {
- // TODO(b/245882601): Process and return success.
- // Probably need to handle capability expiry as well
- }
-
- @Nullable private PersistableBundle getCarrierConfigs() {
- return mPhone.getContext().getSystemService(CarrierConfigManager.class)
- .getConfigForSubId(mPhone.getSubId());
- }
-
- private long getThrottleDuration(@TelephonyManager.PurchasePremiumCapabilityResult int result) {
- if (result == TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED
- || result == TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT) {
- return getCarrierConfigs().getLong(CarrierConfigManager
- .KEY_PREMIUM_CAPABILITY_NOTIFICATION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG);
- }
- if (result == TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_CONGESTED
- || result == TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR) {
- return getCarrierConfigs().getLong(CarrierConfigManager
- .KEY_PREMIUM_CAPABILITY_PURCHASE_CONDITION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG);
- }
- return 0;
- }
-
- private boolean isPremiumCapabilitySupportedByCarrier(
- @TelephonyManager.PremiumCapability int capability) {
- String url = getCarrierConfigs().getString(
- CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING);
- if (TextUtils.isEmpty(url)) {
- return false;
- } else {
- try {
- new URL(url);
- } catch (MalformedURLException e) {
- return false;
- }
- }
- int[] supportedCapabilities = getCarrierConfigs().getIntArray(
- CarrierConfigManager.KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY);
- if (supportedCapabilities == null) {
- return false;
- }
- return Arrays.stream(supportedCapabilities)
- .anyMatch(supportedCapability -> supportedCapability == capability);
- }
-
- private boolean arePremiumCapabilitiesSupportedByDevice() {
- // TODO: Add more checks?
- // Maybe device resource overlay to enable/disable in addition to carrier configs
- return (mPhone.getCachedAllowedNetworkTypesBitmask()
- & TelephonyManager.NETWORK_TYPE_BITMASK_NR) != 0;
- }
-
- private boolean isDefaultData() {
- return mPhone.getSubId() == SubscriptionManager.getDefaultDataSubscriptionId();
- }
-
- private boolean isSlicingConfigActive(@TelephonyManager.PremiumCapability int capability) {
- if (mSlicingConfig == null) {
- return false;
- }
- int capabilityServiceType = getSliceServiceType(capability);
- for (NetworkSliceInfo sliceInfo : mSlicingConfig.getSliceInfo()) {
- // TODO: check if TrafficDescriptor has realtime capability slice
- if (sliceInfo.getSliceServiceType() == capabilityServiceType
- && sliceInfo.getStatus() == NetworkSliceInfo.SLICE_STATUS_ALLOWED) {
- return true;
- }
- }
- return false;
- }
-
- @NetworkSliceInfo.SliceServiceType private int getSliceServiceType(
- @TelephonyManager.PremiumCapability int capability) {
- // TODO: Implement properly -- potentially need to add new slice service types?
- return NetworkSliceInfo.SLICE_SERVICE_TYPE_NONE;
- }
-
- private boolean isNetworkAvailable() {
- // TODO (b/251558673): Create a listener for data network type changed to dismiss
- // notification and activity when the network is no longer available.
- switch (mPhone.getServiceState().getDataNetworkType()) {
- case TelephonyManager.NETWORK_TYPE_NR:
- return true;
- case TelephonyManager.NETWORK_TYPE_LTE:
- case TelephonyManager.NETWORK_TYPE_LTE_CA:
- return getCarrierConfigs().getBoolean(
- CarrierConfigManager.KEY_PREMIUM_CAPABILITY_SUPPORTED_ON_LTE_BOOL);
- }
- return false;
- }
-
- private boolean isNetworkCongested(@TelephonyManager.PremiumCapability int capability) {
- // TODO: Implement TS43
- return true;
- }
-
- private void logd(String s) {
- Log.d(TAG + "-" + mPhone.getPhoneId(), s);
- }
-
- private void loge(String s) {
- Log.e(TAG + "-" + mPhone.getPhoneId(), s);
- }
-}
diff --git a/src/com/android/services/telephony/PstnIncomingCallNotifier.java b/src/com/android/services/telephony/PstnIncomingCallNotifier.java
index 8615325..f78a9b9 100644
--- a/src/com/android/services/telephony/PstnIncomingCallNotifier.java
+++ b/src/com/android/services/telephony/PstnIncomingCallNotifier.java
@@ -403,7 +403,8 @@
// receives an MT call while in ECM. Use the Emergency PhoneAccount to receive the account
// if it exists.
PhoneAccountHandle emergencyHandle =
- PhoneUtils.makePstnPhoneAccountHandleWithPrefix(mPhone, "", true);
+ PhoneUtils.makePstnPhoneAccountHandleWithPrefix(mPhone,
+ "", true, mPhone.getUserHandle());
if(telecomAccountRegistry.hasAccountEntryForPhoneAccount(emergencyHandle)) {
Log.i(this, "Receiving MT call in ECM. Using Emergency PhoneAccount Instead.");
return emergencyHandle;
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 115c32b..d92b136 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -64,6 +64,7 @@
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.SubscriptionController;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.phone.PhoneGlobals;
import com.android.phone.PhoneUtils;
import com.android.phone.R;
@@ -285,13 +286,18 @@
private PhoneAccount buildPstnPhoneAccount(boolean isEmergency, boolean isTestAccount) {
String testPrefix = isTestAccount ? "Test " : "";
+ // Check if we are registering another user. If we are, ensure that the account
+ // is registered to that user handle.
+ int subId = mPhone.getSubId();
+ // Get user handle from phone's sub id (if we get null, then system user will be used)
+ UserHandle userToRegister = mPhone.getUserHandle();
+
// Build the Phone account handle.
PhoneAccountHandle phoneAccountHandle =
PhoneUtils.makePstnPhoneAccountHandleWithPrefix(
- mPhone, testPrefix, isEmergency);
+ mPhone, testPrefix, isEmergency, userToRegister);
// Populate the phone account data.
- int subId = mPhone.getSubId();
String subscriberId = mPhone.getSubscriberId();
int color = PhoneAccount.NO_HIGHLIGHT_COLOR;
int slotId = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
@@ -304,8 +310,8 @@
subNumber = "";
}
- String label;
- String description;
+ String label = "";
+ String description = "";
Icon icon = null;
// We can only get the real slotId from the SubInfoRecord, we can't calculate the
@@ -321,7 +327,9 @@
} else if (mTelephonyManager.getPhoneCount() == 1) {
// For single-SIM devices, we show the label and description as whatever the name of
// the network is.
- description = label = tm.getNetworkOperatorName();
+ if (record != null) {
+ description = label = String.valueOf(record.getDisplayName());
+ }
} else {
CharSequence subDisplayName = null;
@@ -355,8 +363,12 @@
// By default all SIM phone accounts can place emergency calls.
int capabilities = PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION |
- PhoneAccount.CAPABILITY_CALL_PROVIDER |
- PhoneAccount.CAPABILITY_MULTI_USER;
+ PhoneAccount.CAPABILITY_CALL_PROVIDER;
+
+ // This is enabled by default. To support work profiles, it should not be enabled.
+ if (userToRegister == null) {
+ capabilities |= PhoneAccount.CAPABILITY_MULTI_USER;
+ }
if (mContext.getResources().getBoolean(R.bool.config_pstnCanPlaceEmergencyCalls)) {
capabilities |= PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS;
@@ -536,18 +548,37 @@
return false;
}
- SubscriptionController controller = SubscriptionController.getInstance();
- if (controller == null) {
- Log.d(this, "isEmergencyPreferredAccount: SubscriptionController not available.");
- return false;
- }
- // Only set an emergency preference on devices with multiple active subscriptions
- // (include opportunistic subscriptions) in this check.
- // API says never null, but this can return null in testing.
- int[] activeSubIds = controller.getActiveSubIdList(false);
- if (activeSubIds == null || activeSubIds.length <= 1) {
- Log.d(this, "isEmergencyPreferredAccount: one or less active subscriptions.");
- return false;
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ if (SubscriptionManagerService.getInstance() == null) {
+ Log.d(this,
+ "isEmergencyPreferredAccount: SubscriptionManagerService not "
+ + "available.");
+ return false;
+ }
+ // Only set an emergency preference on devices with multiple active subscriptions
+ // (include opportunistic subscriptions) in this check.
+ // API says never null, but this can return null in testing.
+ int[] activeSubIds = SubscriptionManagerService.getInstance()
+ .getActiveSubIdList(false);
+ if (activeSubIds == null || activeSubIds.length <= 1) {
+ Log.d(this, "isEmergencyPreferredAccount: one or less active subscriptions.");
+ return false;
+ }
+ } else {
+ SubscriptionController controller = SubscriptionController.getInstance();
+ if (controller == null) {
+ Log.d(this,
+ "isEmergencyPreferredAccount: SubscriptionController not available.");
+ return false;
+ }
+ // Only set an emergency preference on devices with multiple active subscriptions
+ // (include opportunistic subscriptions) in this check.
+ // API says never null, but this can return null in testing.
+ int[] activeSubIds = controller.getActiveSubIdList(false);
+ if (activeSubIds == null || activeSubIds.length <= 1) {
+ Log.d(this, "isEmergencyPreferredAccount: one or less active subscriptions.");
+ return false;
+ }
}
// Check to see if this PhoneAccount is associated with the default Data subscription.
if (!SubscriptionManager.isValidSubscriptionId(subId)) {
@@ -555,10 +586,21 @@
+ "valid.");
return false;
}
- int userDefaultData = controller.getDefaultDataSubId();
+ int userDefaultData = SubscriptionManager.getDefaultDataSubscriptionId();
boolean isActiveDataValid = SubscriptionManager.isValidSubscriptionId(activeDataSubId);
- boolean isActiveDataOpportunistic = isActiveDataValid
- && controller.isOpportunistic(activeDataSubId);
+
+ boolean isActiveDataOpportunistic;
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ SubscriptionInfo subInfo;
+ subInfo = SubscriptionManagerService.getInstance()
+ .getSubscriptionInfo(activeDataSubId);
+ isActiveDataOpportunistic = isActiveDataValid && subInfo != null
+ && subInfo.isOpportunistic();
+ } else {
+ isActiveDataOpportunistic = isActiveDataValid
+ && SubscriptionController.getInstance().isOpportunistic(activeDataSubId);
+ }
+
// compare the activeDataSubId to the subId specified only if it is valid and not an
// opportunistic subscription (only supports data). If not, use the current default
// defined by the user.
diff --git a/src/com/android/services/telephony/TelephonyConferenceController.java b/src/com/android/services/telephony/TelephonyConferenceController.java
index 9aa3dbe..f0aa641 100644
--- a/src/com/android/services/telephony/TelephonyConferenceController.java
+++ b/src/com/android/services/telephony/TelephonyConferenceController.java
@@ -20,6 +20,8 @@
import android.telecom.Connection;
import android.telecom.DisconnectCause;
import android.telecom.PhoneAccountHandle;
+import android.text.TextUtils;
+import android.util.Patterns;
import com.android.internal.telephony.Call;
import com.android.phone.PhoneUtils;
@@ -40,7 +42,6 @@
*/
final class TelephonyConferenceController {
private static final int TELEPHONY_CONFERENCE_MAX_SIZE = 5;
- private static final String RIL_REPORTED_CONFERENCE_CALL_STRING = "Conference Call";
private final TelephonyConnection.TelephonyConnectionListener mTelephonyConnectionListener =
new TelephonyConnection.TelephonyConnectionListener() {
@@ -271,13 +272,13 @@
// Remove all instances of PROPERTY_IS_DOWNGRADED_CONFERENCE. This
// property should only be set on the parent call (i.e. the newly
// created TelephonyConference.
- // This doesn't apply to a connection whose address is "Conference
- // Call", which may be updated by some modem to create a connection
- // to represent a merged conference connection in SRVCC.
+ // This doesn't apply to a connection whose address is not an
+ // identifiable phone number, which may be updated by some modem
+ // to create a connection to represent a merged conference connection
+ // in SRVCC.
if (connection.getAddress() == null
- || !connection.getAddress().getSchemeSpecificPart()
- .equalsIgnoreCase(
- RIL_REPORTED_CONFERENCE_CALL_STRING)) {
+ || isPhoneNumber(
+ connection.getAddress().getSchemeSpecificPart())) {
Log.d(this, "Removing PROPERTY_IS_DOWNGRADED_CONFERENCE"
+ " from connection %s", connection);
int newProperties = connection.getConnectionProperties()
@@ -320,4 +321,11 @@
}
}
}
+
+ private boolean isPhoneNumber(String number) {
+ if (TextUtils.isEmpty(number)) {
+ return false;
+ }
+ return Patterns.PHONE.matcher(number).matches();
+ }
}
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index da918ad..e86a1ae 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -16,6 +16,8 @@
package com.android.services.telephony;
+import static android.telephony.TelephonyManager.HAL_SERVICE_VOICE;
+
import android.annotation.NonNull;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -65,6 +67,8 @@
import com.android.internal.telephony.imsphone.ImsExternalCallTracker;
import com.android.internal.telephony.imsphone.ImsPhone;
import com.android.internal.telephony.imsphone.ImsPhoneConnection;
+import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.phone.FrameworksUtils;
import com.android.phone.MMIDialogActivity;
import com.android.phone.PhoneUtils;
@@ -211,6 +215,7 @@
@VisibleForTesting
public interface SubscriptionManagerProxy {
int getDefaultVoicePhoneId();
+ int getDefaultDataPhoneId();
int getSimStateForSlotIdx(int slotId);
int getPhoneId(int subId);
}
@@ -222,8 +227,13 @@
}
@Override
+ public int getDefaultDataPhoneId() {
+ return getPhoneId(SubscriptionManager.getDefaultDataSubscriptionId());
+ }
+
+ @Override
public int getSimStateForSlotIdx(int slotId) {
- return SubscriptionManager.getSimStateForSlotIndex(slotId);
+ return TelephonyManager.getSimStateForSlotIndex(slotId);
}
@Override
@@ -360,7 +370,8 @@
@Override
public PhoneAccountHandle makePstnPhoneAccountHandleWithPrefix(Phone phone, String prefix,
boolean isEmergency) {
- return PhoneUtils.makePstnPhoneAccountHandleWithPrefix(phone, prefix, isEmergency);
+ return PhoneUtils.makePstnPhoneAccountHandleWithPrefix(
+ phone, prefix, isEmergency, phone.getUserHandle());
}
};
@@ -823,7 +834,8 @@
// an isTesting parameter. For HAL 1.4+, do not wait for IN_SERVICE, this will
// be handled at the RIL/vendor level by emergencyDial(...).
boolean waitForInServiceToDialEmergency = isTestEmergencyNumber
- && phone.getHalVersion().less(RIL.RADIO_HAL_VERSION_1_4);
+ && phone.getHalVersion(HAL_SERVICE_VOICE)
+ .less(RIL.RADIO_HAL_VERSION_1_4);
if (isEmergencyNumber && !waitForInServiceToDialEmergency) {
// We currently only look to make sure that the radio is on before dialing.
// We should be able to make emergency calls at any time after the radio has
@@ -832,6 +844,19 @@
return (phone.getState() == PhoneConstants.State.OFFHOOK)
|| phone.getServiceStateTracker().isRadioOn();
} else {
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ SubscriptionInfoInternal subInfo = SubscriptionManagerService
+ .getInstance().getSubscriptionInfoInternal(phone.getSubId());
+ // Wait until we are in service and ready to make calls. This can happen
+ // when we power down the radio on bluetooth to save power on watches or
+ // if it is a test emergency number and we have to wait for the device
+ // to move IN_SERVICE before the call can take place over normal
+ // routing.
+ return (phone.getState() == PhoneConstants.State.OFFHOOK)
+ // Do not wait for voice in service on opportunistic SIMs.
+ || (subInfo != null && subInfo.isOpportunistic())
+ || serviceState == ServiceState.STATE_IN_SERVICE;
+ }
// Wait until we are in service and ready to make calls. This can happen
// when we power down the radio on bluetooth to save power on watches or if
// it is a test emergency number and we have to wait for the device to move
@@ -992,9 +1017,16 @@
// Notify Telecom of the new Connection type.
// TODO: Switch out the underlying connection instead of creating a new
// one and causing UI Jank.
- boolean noActiveSimCard = SubscriptionController.getInstance()
- .getActiveSubInfoCount(phone.getContext().getOpPackageName(),
- phone.getContext().getAttributionTag()) == 0;
+ boolean noActiveSimCard;
+ if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+ noActiveSimCard = SubscriptionManagerService.getInstance()
+ .getActiveSubInfoCount(phone.getContext().getOpPackageName(),
+ phone.getContext().getAttributionTag()) == 0;
+ } else {
+ noActiveSimCard = SubscriptionController.getInstance()
+ .getActiveSubInfoCount(phone.getContext().getOpPackageName(),
+ phone.getContext().getAttributionTag()) == 0;
+ }
// If there's no active sim card and the device is in emergency mode, use E account.
addExistingConnection(mPhoneUtilsProxy.makePstnPhoneAccountHandleWithPrefix(
phone, "", isEmergencyNumber && noActiveSimCard), repConnection);
@@ -1737,9 +1769,8 @@
final com.android.internal.telephony.Connection originalConnection;
try {
if (phone != null) {
- EmergencyNumber emergencyNumber =
- phone.getEmergencyNumberTracker().getEmergencyNumber(number);
- if (emergencyNumber != null) {
+ boolean isEmergency = mTelephonyManagerProxy.isCurrentEmergencyNumber(number);
+ if (isEmergency) {
if (!getAllConnections().isEmpty()) {
if (!shouldHoldForEmergencyCall(phone)) {
// If we do not support holding ongoing calls for an outgoing
@@ -2165,39 +2196,57 @@
/**
* Retrieves the most sensible Phone to use for an emergency call using the following Priority
* list (for multi-SIM devices):
- * 1) The User's SIM preference for Voice calling
- * 2) The First Phone that is currently IN_SERVICE or is available for emergency calling
- * 3) Prioritize phones that have the dialed emergency number as part of their emergency
+ * 1) The Phone that is in emergency SMS mode
+ * 2) The phone based on User's SIM preference of Voice calling or Data in order
+ * 3) The First Phone that is currently IN_SERVICE or is available for emergency calling
+ * 4) Prioritize phones that have the dialed emergency number as part of their emergency
* number list
- * 4) If there is a PUK locked SIM, compare the SIMs that are not PUK locked. If all the SIMs
- * are locked, skip to condition 5).
- * 5) The Phone with more Capabilities.
- * 6) The First Phone that has a SIM card in it (Starting from Slot 0...N)
- * 7) The Default Phone (Currently set as Slot 0)
+ * 5) If there is a PUK locked SIM, compare the SIMs that are not PUK locked. If all the SIMs
+ * are locked, skip to condition 6).
+ * 6) The Phone with more Capabilities.
+ * 7) The First Phone that has a SIM card in it (Starting from Slot 0...N)
+ * 8) The Default Phone (Currently set as Slot 0)
*/
@VisibleForTesting
+ @NonNull
public Phone getFirstPhoneForEmergencyCall(List<Phone> phonesWithEmergencyNumber) {
- // 1)
+ int phoneCount = mTelephonyManagerProxy.getPhoneCount();
+ for (int i = 0; i < phoneCount; i++) {
+ Phone phone = mPhoneFactoryProxy.getPhone(i);
+ // 1)
+ if (phone != null && phone.isInEmergencySmsMode()) {
+ if (isAvailableForEmergencyCalls(phone)) {
+ if (phonesWithEmergencyNumber == null
+ || phonesWithEmergencyNumber.contains(phone)) {
+ return phone;
+ }
+ }
+ }
+ }
+
+ // 2)
int phoneId = mSubscriptionManagerProxy.getDefaultVoicePhoneId();
+ if (phoneId == SubscriptionManager.INVALID_PHONE_INDEX) {
+ phoneId = mSubscriptionManagerProxy.getDefaultDataPhoneId();
+ }
if (phoneId != SubscriptionManager.INVALID_PHONE_INDEX) {
- Phone defaultPhone = mPhoneFactoryProxy.getPhone(phoneId);
- if (defaultPhone != null && isAvailableForEmergencyCalls(defaultPhone)) {
+ Phone selectedPhone = mPhoneFactoryProxy.getPhone(phoneId);
+ if (selectedPhone != null && isAvailableForEmergencyCalls(selectedPhone)) {
if (phonesWithEmergencyNumber == null
- || phonesWithEmergencyNumber.contains(defaultPhone)) {
- return defaultPhone;
+ || phonesWithEmergencyNumber.contains(selectedPhone)) {
+ return selectedPhone;
}
}
}
Phone firstPhoneWithSim = null;
- int phoneCount = mTelephonyManagerProxy.getPhoneCount();
List<SlotStatus> phoneSlotStatus = new ArrayList<>(phoneCount);
for (int i = 0; i < phoneCount; i++) {
Phone phone = mPhoneFactoryProxy.getPhone(i);
if (phone == null) {
continue;
}
- // 2)
+ // 3)
if (isAvailableForEmergencyCalls(phone)) {
if (phonesWithEmergencyNumber == null
|| phonesWithEmergencyNumber.contains(phone)) {
@@ -2207,7 +2256,7 @@
return phone;
}
}
- // 5)
+ // 6)
// Store the RAF Capabilities for sorting later.
int radioAccessFamily = phone.getRadioAccessFamily();
SlotStatus status = new SlotStatus(i, radioAccessFamily, phone.getSubId());
@@ -2215,7 +2264,7 @@
Log.i(this, "getFirstPhoneForEmergencyCall, RAF:" +
Integer.toHexString(radioAccessFamily) + " saved for Phone Id:" + i + " subId:"
+ phone.getSubId());
- // 4)
+ // 5)
// Report Slot's PIN/PUK lock status for sorting later.
int simState = mSubscriptionManagerProxy.getSimStateForSlotIdx(i);
// Record SimState.
@@ -2225,7 +2274,7 @@
status.isLocked = true;
}
- // 3) Store if the Phone has the corresponding emergency number
+ // 4) Store if the Phone has the corresponding emergency number
if (phonesWithEmergencyNumber != null) {
for (Phone phoneWithEmergencyNumber : phonesWithEmergencyNumber) {
if (phoneWithEmergencyNumber != null
@@ -2234,7 +2283,7 @@
}
}
}
- // 6)
+ // 7)
if (firstPhoneWithSim == null &&
(phone.getSubId() != SubscriptionManager.INVALID_SIM_SLOT_INDEX)) {
// The slot has a SIM card inserted (and an active subscription), but is not in
@@ -2246,16 +2295,21 @@
firstPhoneWithSim.getPhoneId());
}
}
- // 7)
+ // 8)
if (firstPhoneWithSim == null && phoneSlotStatus.isEmpty()) {
- if (phonesWithEmergencyNumber == null || phonesWithEmergencyNumber.isEmpty()) {
- // No Phones available, get the default
- Log.i(this, "getFirstPhoneForEmergencyCall, return default phone");
- return mPhoneFactoryProxy.getDefaultPhone();
+ if (phonesWithEmergencyNumber != null) {
+ for (Phone phoneWithEmergencyNumber : phonesWithEmergencyNumber) {
+ if (phoneWithEmergencyNumber != null) {
+ return phoneWithEmergencyNumber;
+ }
+ }
}
- return phonesWithEmergencyNumber.get(0);
+
+ // No Phones available, get the default
+ Log.i(this, "getFirstPhoneForEmergencyCall, return default phone");
+ return mPhoneFactoryProxy.getDefaultPhone();
} else {
- // 5)
+ // 6)
final int defaultPhoneId = mPhoneFactoryProxy.getDefaultPhone().getPhoneId();
final Phone firstOccupiedSlot = firstPhoneWithSim;
if (!phoneSlotStatus.isEmpty()) {
@@ -2318,7 +2372,7 @@
"with highest capability");
return mPhoneFactoryProxy.getPhone(mostCapablePhoneId);
} else {
- // 6)
+ // 7)
return firstPhoneWithSim;
}
}
diff --git a/testapps/GbaTestApp/res/values-en-rCA/strings.xml b/testapps/GbaTestApp/res/values-en-rCA/strings.xml
index 6c4a199..0d5c727 100644
--- a/testapps/GbaTestApp/res/values-en-rCA/strings.xml
+++ b/testapps/GbaTestApp/res/values-en-rCA/strings.xml
@@ -3,12 +3,12 @@
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="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="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>
@@ -16,16 +16,16 @@
<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_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="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>
diff --git a/testapps/TestRcsApp/OWNERS b/testapps/TestRcsApp/OWNERS
index 1d0d52b..4261109 100644
--- a/testapps/TestRcsApp/OWNERS
+++ b/testapps/TestRcsApp/OWNERS
@@ -1,3 +1,5 @@
-allenwtsu@google.com
-calvinpan@google.com
-jamescflin@google.com
+breadley@google.com
+joonhunshin@google.com
+donaldahn@google.com
+hhshin@google.com
+schie@google.com
diff --git a/testapps/TestServerApp/app/src/main/res/values-am/strings.xml b/testapps/TestServerApp/app/src/main/res/values-am/strings.xml
new file mode 100644
index 0000000..8ec544c
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-am/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"ቅንብሮች"</string>
+ <string name="server_running" msgid="2780193626090379172">"አገልጋይ እያሄደ ነው..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"አገልጋይን አቁም"</string>
+ <string name="server_down" msgid="1030249207496490556">"አገልጋይ አይሰራም"</string>
+ <string name="start_server" msgid="3878573341408591975">"አገልጋይን አስጀምር"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"ተሰናክሏል"</item>
+ <item msgid="3193389681837907872">"ነቅቷል"</item>
+ <item msgid="3124590179479393815">"ተኳሃኝ አይደለም"</item>
+ <item msgid="1606753456265236910">"በማቅረብ ላይ"</item>
+ <item msgid="3930807209231347454">"ተካትቷል"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"አልቀረበም"</item>
+ <item msgid="7598231293776486217">"ቀርቧል"</item>
+ <item msgid="3720547957514534185">"አያስፈልግም"</item>
+ <item msgid="1264673582354896949">"በሂደት ላይ"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ar/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ar/strings.xml
new file mode 100644
index 0000000..c901917
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ar/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"الإعدادات"</string>
+ <string name="server_running" msgid="2780193626090379172">"الخادم قيد التشغيل…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"إيقاف الخادم"</string>
+ <string name="server_down" msgid="1030249207496490556">"الخادم معطّل"</string>
+ <string name="start_server" msgid="3878573341408591975">"بدء الخادم"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"غير مفعَّلة"</item>
+ <item msgid="3193389681837907872">"مفعّلة"</item>
+ <item msgid="3124590179479393815">"غير متوافق"</item>
+ <item msgid="1606753456265236910">"جارٍ توفير المتطلبات اللازمة"</item>
+ <item msgid="3930807209231347454">"متاحة"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"لم يتم توفير المتطلبات اللازمة"</item>
+ <item msgid="7598231293776486217">"توفير المتطلبات اللازمة"</item>
+ <item msgid="3720547957514534185">"غير مطلوب"</item>
+ <item msgid="1264673582354896949">"قيد التقدم"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-as/strings.xml b/testapps/TestServerApp/app/src/main/res/values-as/strings.xml
new file mode 100644
index 0000000..46ee915
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-as/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"ছেটিং"</string>
+ <string name="server_running" msgid="2780193626090379172">"ছাৰ্ভাৰটো চলি আছে..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"ছাৰ্ভাৰ বন্ধ কৰক"</string>
+ <string name="server_down" msgid="1030249207496490556">"ছাৰ্ভাৰটো কাৰ্যক্ষম হৈ থকা নাই"</string>
+ <string name="start_server" msgid="3878573341408591975">"ছাৰ্ভাৰ আৰম্ভ কৰক"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"অক্ষম কৰা আছে"</item>
+ <item msgid="3193389681837907872">"সক্ষম কৰা আছে"</item>
+ <item msgid="3124590179479393815">"অমিল"</item>
+ <item msgid="1606753456265236910">"প্ৰ’ভিজনিং"</item>
+ <item msgid="3930807209231347454">"অন্তৰ্ভুক্ত কৰা হ’ল"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"প্ৰ’ভিজন কৰা নাই"</item>
+ <item msgid="7598231293776486217">"প্ৰ’ভিজন কৰা হৈছে"</item>
+ <item msgid="3720547957514534185">"প্ৰয়োজনীয় নহয়"</item>
+ <item msgid="1264673582354896949">"চলি আছে"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-az/strings.xml b/testapps/TestServerApp/app/src/main/res/values-az/strings.xml
new file mode 100644
index 0000000..c7bdb24
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-az/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Ayarlar"</string>
+ <string name="server_running" msgid="2780193626090379172">"Server işləyir..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Serveri dayandırın"</string>
+ <string name="server_down" msgid="1030249207496490556">"Server işləmir"</string>
+ <string name="start_server" msgid="3878573341408591975">"Serveri başladın"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Deaktiv"</item>
+ <item msgid="3193389681837907872">"Aktiv"</item>
+ <item msgid="3124590179479393815">"Uyğun deyil"</item>
+ <item msgid="1606753456265236910">"Təmin edilir"</item>
+ <item msgid="3930807209231347454">"Daxildir"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Təmin edilmir"</item>
+ <item msgid="7598231293776486217">"Təmin edilib"</item>
+ <item msgid="3720547957514534185">"Tələb olunmur"</item>
+ <item msgid="1264673582354896949">"Davam edir"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-b+sr+Latn/strings.xml b/testapps/TestServerApp/app/src/main/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..62aeff1
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Podešavanja"</string>
+ <string name="server_running" msgid="2780193626090379172">"Server je pokrenut…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Zaustavi server"</string>
+ <string name="server_down" msgid="1030249207496490556">"Server je pao"</string>
+ <string name="start_server" msgid="3878573341408591975">"Pokreni server"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Onemogućeno"</item>
+ <item msgid="3193389681837907872">"Omogućeno"</item>
+ <item msgid="3124590179479393815">"Nekompatibilno"</item>
+ <item msgid="1606753456265236910">"Dodeljuje se"</item>
+ <item msgid="3930807209231347454">"Uvršteno"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Nije dodeljeno"</item>
+ <item msgid="7598231293776486217">"Dodeljeno"</item>
+ <item msgid="3720547957514534185">"Nije obavezno"</item>
+ <item msgid="1264673582354896949">"U toku"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-be/strings.xml b/testapps/TestServerApp/app/src/main/res/values-be/strings.xml
new file mode 100644
index 0000000..5f1f581
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-be/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Налады"</string>
+ <string name="server_running" msgid="2780193626090379172">"Сервер працуе..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Спыніць сервер"</string>
+ <string name="server_down" msgid="1030249207496490556">"Сервер не працуе"</string>
+ <string name="start_server" msgid="3878573341408591975">"Запусціць сервер"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Адключана"</item>
+ <item msgid="3193389681837907872">"Уключана"</item>
+ <item msgid="3124590179479393815">"Адсутнічае сумяшчальнасць"</item>
+ <item msgid="1606753456265236910">"Ініцыялізацыя"</item>
+ <item msgid="3930807209231347454">"Уключана"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Не ініцыялізавана"</item>
+ <item msgid="7598231293776486217">"Ініцыялізавана"</item>
+ <item msgid="3720547957514534185">"Не патрабуецца"</item>
+ <item msgid="1264673582354896949">"Выконваецца"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-bg/strings.xml b/testapps/TestServerApp/app/src/main/res/values-bg/strings.xml
new file mode 100644
index 0000000..542d0f7
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-bg/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Настройки"</string>
+ <string name="server_running" msgid="2780193626090379172">"Сървърът работи..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Спиране на сървъра"</string>
+ <string name="server_down" msgid="1030249207496490556">"Сървърът не работи"</string>
+ <string name="start_server" msgid="3878573341408591975">"Стартиране на сървъра"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Деактивирано"</item>
+ <item msgid="3193389681837907872">"Активирано"</item>
+ <item msgid="3124590179479393815">"Несъвместимо"</item>
+ <item msgid="1606753456265236910">"Обезпечава се"</item>
+ <item msgid="3930807209231347454">"Включено"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Не е обезпечено"</item>
+ <item msgid="7598231293776486217">"Обезпечено"</item>
+ <item msgid="3720547957514534185">"Не е задължително"</item>
+ <item msgid="1264673582354896949">"В ход"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-bn/strings.xml b/testapps/TestServerApp/app/src/main/res/values-bn/strings.xml
new file mode 100644
index 0000000..7244308
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-bn/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"সেটিংস"</string>
+ <string name="server_running" msgid="2780193626090379172">"সার্ভার রান করছে..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"সার্ভার বন্ধ করুন"</string>
+ <string name="server_down" msgid="1030249207496490556">"সার্ভার কাজ করছে না"</string>
+ <string name="start_server" msgid="3878573341408591975">"সার্ভার চালু করুন"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"বন্ধ আছে"</item>
+ <item msgid="3193389681837907872">"চালু আছে"</item>
+ <item msgid="3124590179479393815">"মানানসই নয়"</item>
+ <item msgid="1606753456265236910">"প্রস্তুতি চলছে"</item>
+ <item msgid="3930807209231347454">"অন্তর্ভুক্ত আছে"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"প্রস্তুত নেই"</item>
+ <item msgid="7598231293776486217">"প্রস্তুত আছে"</item>
+ <item msgid="3720547957514534185">"প্রয়োজন নেই"</item>
+ <item msgid="1264673582354896949">"কাজ চলছে"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-cs/strings.xml b/testapps/TestServerApp/app/src/main/res/values-cs/strings.xml
new file mode 100644
index 0000000..c8dfd8d
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-cs/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Nastavení"</string>
+ <string name="server_running" msgid="2780193626090379172">"Server běží…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Zastavit server"</string>
+ <string name="server_down" msgid="1030249207496490556">"Server je nedostupný"</string>
+ <string name="start_server" msgid="3878573341408591975">"Spustit server"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Vypnuto"</item>
+ <item msgid="3193389681837907872">"Zapnuto"</item>
+ <item msgid="3124590179479393815">"Nekompatibilní"</item>
+ <item msgid="1606753456265236910">"Zajišťování"</item>
+ <item msgid="3930807209231347454">"Zahrnuto"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Nezajištěno"</item>
+ <item msgid="7598231293776486217">"Zajištěno"</item>
+ <item msgid="3720547957514534185">"Nepovinné"</item>
+ <item msgid="1264673582354896949">"Probíhá"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-da/strings.xml b/testapps/TestServerApp/app/src/main/res/values-da/strings.xml
new file mode 100644
index 0000000..1d8e029
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-da/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"Testserverapp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Indstillinger"</string>
+ <string name="server_running" msgid="2780193626090379172">"Serveren kører…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Stop server"</string>
+ <string name="server_down" msgid="1030249207496490556">"Serveren er nede"</string>
+ <string name="start_server" msgid="3878573341408591975">"Start server"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Deaktiveret"</item>
+ <item msgid="3193389681837907872">"Aktiveret"</item>
+ <item msgid="3124590179479393815">"Ikke kompatibel"</item>
+ <item msgid="1606753456265236910">"Provisionerer"</item>
+ <item msgid="3930807209231347454">"Inkluderet"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Ikke provisioneret"</item>
+ <item msgid="7598231293776486217">"Provisioneret"</item>
+ <item msgid="3720547957514534185">"Ikke påkrævet"</item>
+ <item msgid="1264673582354896949">"I gang"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-de/strings.xml b/testapps/TestServerApp/app/src/main/res/values-de/strings.xml
new file mode 100644
index 0000000..4adc332
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-de/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Einstellungen"</string>
+ <string name="server_running" msgid="2780193626090379172">"Server ist in Betrieb…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Server anhalten"</string>
+ <string name="server_down" msgid="1030249207496490556">"Server ist ausgefallen"</string>
+ <string name="start_server" msgid="3878573341408591975">"Server starten"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Deaktiviert"</item>
+ <item msgid="3193389681837907872">"Aktiviert"</item>
+ <item msgid="3124590179479393815">"Nicht kompatibel"</item>
+ <item msgid="1606753456265236910">"Nutzerverwaltung"</item>
+ <item msgid="3930807209231347454">"Enthalten"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Noch nicht von einem Nutzer verwaltet"</item>
+ <item msgid="7598231293776486217">"Von einem Nutzer verwaltet"</item>
+ <item msgid="3720547957514534185">"Nicht erforderlich"</item>
+ <item msgid="1264673582354896949">"In Bearbeitung"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-el/strings.xml b/testapps/TestServerApp/app/src/main/res/values-el/strings.xml
new file mode 100644
index 0000000..540500d
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-el/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Ρυθμίσεις"</string>
+ <string name="server_running" msgid="2780193626090379172">"Ο διακομιστής λειτουργεί…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Διακοπή διακομιστή"</string>
+ <string name="server_down" msgid="1030249207496490556">"Ο διακομιστής είναι εκτός λειτουργίας"</string>
+ <string name="start_server" msgid="3878573341408591975">"Έναρξη διακομιστή"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Ανενεργό"</item>
+ <item msgid="3193389681837907872">"Ενεργό"</item>
+ <item msgid="3124590179479393815">"Μη συμβατό"</item>
+ <item msgid="1606753456265236910">"Παροχή"</item>
+ <item msgid="3930807209231347454">"Περιλαμβάνεται"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Χωρίς παροχή"</item>
+ <item msgid="7598231293776486217">"Παρέχεται"</item>
+ <item msgid="3720547957514534185">"Δεν απαιτείται"</item>
+ <item msgid="1264673582354896949">"Σε εξέλιξη"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-es-rUS/strings.xml b/testapps/TestServerApp/app/src/main/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..50c9ff2
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-es-rUS/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Configuración"</string>
+ <string name="server_running" msgid="2780193626090379172">"El servidor se está ejecutando…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Detener el servidor"</string>
+ <string name="server_down" msgid="1030249207496490556">"El servidor se encuentra inactivo"</string>
+ <string name="start_server" msgid="3878573341408591975">"Iniciar el servidor"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Inhabilitado"</item>
+ <item msgid="3193389681837907872">"Habilitado"</item>
+ <item msgid="3124590179479393815">"Incompatible"</item>
+ <item msgid="1606753456265236910">"Aprovisionando"</item>
+ <item msgid="3930807209231347454">"Incluido"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"No aprovisionado"</item>
+ <item msgid="7598231293776486217">"Aprovisionado"</item>
+ <item msgid="3720547957514534185">"No se necesita"</item>
+ <item msgid="1264673582354896949">"En curso"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-es/strings.xml b/testapps/TestServerApp/app/src/main/res/values-es/strings.xml
new file mode 100644
index 0000000..002fca7
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-es/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Ajustes"</string>
+ <string name="server_running" msgid="2780193626090379172">"El servidor se está ejecutando..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Detener servidor"</string>
+ <string name="server_down" msgid="1030249207496490556">"El servidor no está operativo"</string>
+ <string name="start_server" msgid="3878573341408591975">"Iniciar servidor"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Inhabilitado"</item>
+ <item msgid="3193389681837907872">"Habilitado"</item>
+ <item msgid="3124590179479393815">"No compatible"</item>
+ <item msgid="1606753456265236910">"En aprovisionamiento"</item>
+ <item msgid="3930807209231347454">"Incluido"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"No aprovisionado"</item>
+ <item msgid="7598231293776486217">"Aprovisionado"</item>
+ <item msgid="3720547957514534185">"No se requiere"</item>
+ <item msgid="1264673582354896949">"En curso"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-et/strings.xml b/testapps/TestServerApp/app/src/main/res/values-et/strings.xml
new file mode 100644
index 0000000..49c3209
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-et/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Seaded"</string>
+ <string name="server_running" msgid="2780193626090379172">"Server töötab ..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Peata server"</string>
+ <string name="server_down" msgid="1030249207496490556">"Serveris on katkestus"</string>
+ <string name="start_server" msgid="3878573341408591975">"Käivita server"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Keelatud"</item>
+ <item msgid="3193389681837907872">"Lubatud"</item>
+ <item msgid="3124590179479393815">"Ühildumatu"</item>
+ <item msgid="1606753456265236910">"Ettevalmistamine"</item>
+ <item msgid="3930807209231347454">"Kaasas"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Ettevalmistamata"</item>
+ <item msgid="7598231293776486217">"Ettevalmistatud"</item>
+ <item msgid="3720547957514534185">"Pole nõutav"</item>
+ <item msgid="1264673582354896949">"Töötluses"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-eu/strings.xml b/testapps/TestServerApp/app/src/main/res/values-eu/strings.xml
new file mode 100644
index 0000000..70f5423
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-eu/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Ezarpenak"</string>
+ <string name="server_running" msgid="2780193626090379172">"Zerbitzaria abian da…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Gelditu zerbitzaria"</string>
+ <string name="server_down" msgid="1030249207496490556">"Zerbitzaria ez dabil"</string>
+ <string name="start_server" msgid="3878573341408591975">"Abiarazi zerbitzaria"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Desgaituta"</item>
+ <item msgid="3193389681837907872">"Gaituta"</item>
+ <item msgid="3124590179479393815">"Bateraezina"</item>
+ <item msgid="1606753456265236910">"Hornitzen"</item>
+ <item msgid="3930807209231347454">"Barne"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Hornitu gabe"</item>
+ <item msgid="7598231293776486217">"Hornituta"</item>
+ <item msgid="3720547957514534185">"Ez da beharrezkoa"</item>
+ <item msgid="1264673582354896949">"Abian"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-fi/strings.xml b/testapps/TestServerApp/app/src/main/res/values-fi/strings.xml
new file mode 100644
index 0000000..9117e0c
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-fi/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Asetukset"</string>
+ <string name="server_running" msgid="2780193626090379172">"Palvelin on käytössä..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Keskeytä palvelin"</string>
+ <string name="server_down" msgid="1030249207496490556">"Palvelin on poissa käytöstä"</string>
+ <string name="start_server" msgid="3878573341408591975">"Käynnistä palvelin"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Ei käytössä"</item>
+ <item msgid="3193389681837907872">"Käytössä"</item>
+ <item msgid="3124590179479393815">"Yhteensopimaton"</item>
+ <item msgid="1606753456265236910">"Käsitellään"</item>
+ <item msgid="3930807209231347454">"Sisältyy"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Ei käsitelty"</item>
+ <item msgid="7598231293776486217">"Käsitelty"</item>
+ <item msgid="3720547957514534185">"Valinnainen"</item>
+ <item msgid="1264673582354896949">"Käynnissä"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-fr-rCA/strings.xml b/testapps/TestServerApp/app/src/main/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..97fd06a
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-fr-rCA/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Paramètres"</string>
+ <string name="server_running" msgid="2780193626090379172">"Le serveur est en cours d\'exécution…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Arrêter le serveur"</string>
+ <string name="server_down" msgid="1030249207496490556">"Le serveur est en panne"</string>
+ <string name="start_server" msgid="3878573341408591975">"Démarrer le serveur"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Désactivé"</item>
+ <item msgid="3193389681837907872">"Activé"</item>
+ <item msgid="3124590179479393815">"Incompatible"</item>
+ <item msgid="1606753456265236910">"Approvisionnement en cours…"</item>
+ <item msgid="3930807209231347454">"Inclus"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Non approvisionné"</item>
+ <item msgid="7598231293776486217">"Approvisionné"</item>
+ <item msgid="3720547957514534185">"Facultatif"</item>
+ <item msgid="1264673582354896949">"En cours de traitement"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-fr/strings.xml b/testapps/TestServerApp/app/src/main/res/values-fr/strings.xml
new file mode 100644
index 0000000..be70c79
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-fr/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Paramètres"</string>
+ <string name="server_running" msgid="2780193626090379172">"Serveur en cours d\'exécution…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Arrêter le serveur"</string>
+ <string name="server_down" msgid="1030249207496490556">"Serveur en panne"</string>
+ <string name="start_server" msgid="3878573341408591975">"Démarrer le serveur"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Désactivé"</item>
+ <item msgid="3193389681837907872">"Activé"</item>
+ <item msgid="3124590179479393815">"Incompatible"</item>
+ <item msgid="1606753456265236910">"Provisionnement…"</item>
+ <item msgid="3930807209231347454">"Inclus"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Non provisionné"</item>
+ <item msgid="7598231293776486217">"Provisionné"</item>
+ <item msgid="3720547957514534185">"Facultatif"</item>
+ <item msgid="1264673582354896949">"En cours"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-gl/strings.xml b/testapps/TestServerApp/app/src/main/res/values-gl/strings.xml
new file mode 100644
index 0000000..9de1ceb
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-gl/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Configuración"</string>
+ <string name="server_running" msgid="2780193626090379172">"O servidor está executándose…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Deter servidor"</string>
+ <string name="server_down" msgid="1030249207496490556">"O servidor non está operativo"</string>
+ <string name="start_server" msgid="3878573341408591975">"Iniciar servidor"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Desactivado"</item>
+ <item msgid="3193389681837907872">"Activado"</item>
+ <item msgid="3124590179479393815">"Incompatible"</item>
+ <item msgid="1606753456265236910">"En aprovisionamento"</item>
+ <item msgid="3930807209231347454">"Incluído"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Non aprovisionado"</item>
+ <item msgid="7598231293776486217">"Aprovisionado"</item>
+ <item msgid="3720547957514534185">"Non obrigatorio"</item>
+ <item msgid="1264673582354896949">"En curso"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-gu/strings.xml b/testapps/TestServerApp/app/src/main/res/values-gu/strings.xml
new file mode 100644
index 0000000..d2fc1d0
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-gu/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"સેટિંગ"</string>
+ <string name="server_running" msgid="2780193626090379172">"સર્વર ચાલુ છે..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"સર્વર રોકો"</string>
+ <string name="server_down" msgid="1030249207496490556">"સર્વર ડાઉન છે"</string>
+ <string name="start_server" msgid="3878573341408591975">"સર્વર શરૂ કરો"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"બંધ છે"</item>
+ <item msgid="3193389681837907872">"ચાલુ છે"</item>
+ <item msgid="3124590179479393815">"અસંગત છે"</item>
+ <item msgid="1606753456265236910">"જોગવાઈ કરી રહ્યું છે"</item>
+ <item msgid="3930807209231347454">"શામેલ છે"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"કોઈ જોગવાઈ કરેલી નથી"</item>
+ <item msgid="7598231293776486217">"જોગવાઈ કરેલી છે"</item>
+ <item msgid="3720547957514534185">"આવશ્યક નથી"</item>
+ <item msgid="1264673582354896949">"પ્રક્રિયા ચાલુ છે"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-hi/strings.xml b/testapps/TestServerApp/app/src/main/res/values-hi/strings.xml
new file mode 100644
index 0000000..d5be924
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-hi/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"सेटिंग"</string>
+ <string name="server_running" msgid="2780193626090379172">"सर्वर काम कर रहा है..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"सर्वर बंद करें"</string>
+ <string name="server_down" msgid="1030249207496490556">"सर्वर काम नहीं कर रहा है"</string>
+ <string name="start_server" msgid="3878573341408591975">"सर्वर चालू करें"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"बंद है"</item>
+ <item msgid="3193389681837907872">"चालू है"</item>
+ <item msgid="3124590179479393815">"काम नहीं करता"</item>
+ <item msgid="1606753456265236910">"प्रावधान"</item>
+ <item msgid="3930807209231347454">"पहले से मौजूद है"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"प्रावधान नहीं किया गया है"</item>
+ <item msgid="7598231293776486217">"प्रावधान किया गया है"</item>
+ <item msgid="3720547957514534185">"ज़रूरी नहीं है"</item>
+ <item msgid="1264673582354896949">"प्रावधान किया जा रहा है"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-hr/strings.xml b/testapps/TestServerApp/app/src/main/res/values-hr/strings.xml
new file mode 100644
index 0000000..492f2cc
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-hr/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Postavke"</string>
+ <string name="server_running" msgid="2780193626090379172">"Poslužitelj je aktivan..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Zaustavljanje poslužitelja"</string>
+ <string name="server_down" msgid="1030249207496490556">"Poslužitelj nije aktivan"</string>
+ <string name="start_server" msgid="3878573341408591975">"Pokretanje poslužitelja"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Onemogućeno"</item>
+ <item msgid="3193389681837907872">"Omogućeno"</item>
+ <item msgid="3124590179479393815">"Nije kompatibilno"</item>
+ <item msgid="1606753456265236910">"Omogućivanje"</item>
+ <item msgid="3930807209231347454">"Uključeno"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Nije omogućeno"</item>
+ <item msgid="7598231293776486217">"Omogućeno"</item>
+ <item msgid="3720547957514534185">"Nije obavezno"</item>
+ <item msgid="1264673582354896949">"U tijeku"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-hu/strings.xml b/testapps/TestServerApp/app/src/main/res/values-hu/strings.xml
new file mode 100644
index 0000000..286fae3
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-hu/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Beállítások"</string>
+ <string name="server_running" msgid="2780193626090379172">"A szerver fut..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Szerver leállítása"</string>
+ <string name="server_down" msgid="1030249207496490556">"A szerver leállt"</string>
+ <string name="start_server" msgid="3878573341408591975">"Szerver indítása"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Kikapcsolva"</item>
+ <item msgid="3193389681837907872">"Engedélyezve"</item>
+ <item msgid="3124590179479393815">"Nem kompatibilis"</item>
+ <item msgid="1606753456265236910">"Kiépítés"</item>
+ <item msgid="3930807209231347454">"Tartalmazza"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Nincs kiépítve"</item>
+ <item msgid="7598231293776486217">"Kiépítve"</item>
+ <item msgid="3720547957514534185">"Nem kötelező"</item>
+ <item msgid="1264673582354896949">"Folyamatban"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-hy/strings.xml b/testapps/TestServerApp/app/src/main/res/values-hy/strings.xml
new file mode 100644
index 0000000..03a382b
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-hy/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Կարգավորումներ"</string>
+ <string name="server_running" msgid="2780193626090379172">"Սերվերն աշխատում է..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Կանգնեցնել սերվերը"</string>
+ <string name="server_down" msgid="1030249207496490556">"Սերվերն անջատված է"</string>
+ <string name="start_server" msgid="3878573341408591975">"Գործարկել սերվերը"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Անջատված է"</item>
+ <item msgid="3193389681837907872">"Միացված է"</item>
+ <item msgid="3124590179479393815">"Անհամատեղելիություն"</item>
+ <item msgid="1606753456265236910">"Նախապատրաստում"</item>
+ <item msgid="3930807209231347454">"Ներառված է"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Նախապատրաստված չէ"</item>
+ <item msgid="7598231293776486217">"Նախապատրաստված է"</item>
+ <item msgid="3720547957514534185">"Ոչ պարտադիր"</item>
+ <item msgid="1264673582354896949">"Ընթացքում է"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-in/strings.xml b/testapps/TestServerApp/app/src/main/res/values-in/strings.xml
new file mode 100644
index 0000000..b918582
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-in/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Setelan"</string>
+ <string name="server_running" msgid="2780193626090379172">"Server sedang berjalan..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Hentikan Server"</string>
+ <string name="server_down" msgid="1030249207496490556">"Server tidak berfungsi"</string>
+ <string name="start_server" msgid="3878573341408591975">"Mulai Server"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Nonaktif"</item>
+ <item msgid="3193389681837907872">"Aktif"</item>
+ <item msgid="3124590179479393815">"Tidak kompatibel"</item>
+ <item msgid="1606753456265236910">"Penyediaan"</item>
+ <item msgid="3930807209231347454">"Disertakan"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Tidak Disediakan"</item>
+ <item msgid="7598231293776486217">"Disediakan"</item>
+ <item msgid="3720547957514534185">"Tidak Wajib"</item>
+ <item msgid="1264673582354896949">"Dalam Proses"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-is/strings.xml b/testapps/TestServerApp/app/src/main/res/values-is/strings.xml
new file mode 100644
index 0000000..610755a
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-is/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Stillingar"</string>
+ <string name="server_running" msgid="2780193626090379172">"Þjónn er í gangi..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Stöðva þjón"</string>
+ <string name="server_down" msgid="1030249207496490556">"Þjónn liggur niðri"</string>
+ <string name="start_server" msgid="3878573341408591975">"Ræsa þjón"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Slökkt"</item>
+ <item msgid="3193389681837907872">"Kveikt"</item>
+ <item msgid="3124590179479393815">"Ósamhæft"</item>
+ <item msgid="1606753456265236910">"Úthlutun"</item>
+ <item msgid="3930807209231347454">"Innifalið"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Ekki úthlutað"</item>
+ <item msgid="7598231293776486217">"Úthlutað"</item>
+ <item msgid="3720547957514534185">"Ekki áskilið"</item>
+ <item msgid="1264673582354896949">"Í vinnslu"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-it/strings.xml b/testapps/TestServerApp/app/src/main/res/values-it/strings.xml
new file mode 100644
index 0000000..6f4f3b1
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-it/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Settings"</string>
+ <string name="server_running" msgid="2780193626090379172">"Server is running..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Stop Server"</string>
+ <string name="server_down" msgid="1030249207496490556">"Server is down"</string>
+ <string name="start_server" msgid="3878573341408591975">"Start Server"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Disabled"</item>
+ <item msgid="3193389681837907872">"Enabled"</item>
+ <item msgid="3124590179479393815">"Incompatible"</item>
+ <item msgid="1606753456265236910">"Provisioning"</item>
+ <item msgid="3930807209231347454">"Included"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Not Provisioned"</item>
+ <item msgid="7598231293776486217">"Provisioned"</item>
+ <item msgid="3720547957514534185">"Not Required"</item>
+ <item msgid="1264673582354896949">"In Progress"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ja/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ja/strings.xml
new file mode 100644
index 0000000..1b962e4
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ja/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"設定"</string>
+ <string name="server_running" msgid="2780193626090379172">"サーバーが実行中です..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"サーバーを停止"</string>
+ <string name="server_down" msgid="1030249207496490556">"サーバーがダウンしています"</string>
+ <string name="start_server" msgid="3878573341408591975">"サーバーを起動"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"無効"</item>
+ <item msgid="3193389681837907872">"有効"</item>
+ <item msgid="3124590179479393815">"非対応"</item>
+ <item msgid="1606753456265236910">"プロビジョニング"</item>
+ <item msgid="3930807209231347454">"必須"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"未プロビジョニング"</item>
+ <item msgid="7598231293776486217">"プロビジョニング済み"</item>
+ <item msgid="3720547957514534185">"任意"</item>
+ <item msgid="1264673582354896949">"処理中"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-kk/strings.xml b/testapps/TestServerApp/app/src/main/res/values-kk/strings.xml
new file mode 100644
index 0000000..8a93c31
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-kk/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Параметрлер"</string>
+ <string name="server_running" msgid="2780193626090379172">"Сервер істеп тұр…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Серверді тоқтату"</string>
+ <string name="server_down" msgid="1030249207496490556">"Сервер істемей тұр"</string>
+ <string name="start_server" msgid="3878573341408591975">"Серверді іске қосу"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Өшірулі"</item>
+ <item msgid="3193389681837907872">"Қосулы"</item>
+ <item msgid="3124590179479393815">"Үйлеспейді"</item>
+ <item msgid="1606753456265236910">"Дайындау"</item>
+ <item msgid="3930807209231347454">"Қамтылды"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Дайындалмады"</item>
+ <item msgid="7598231293776486217">"Дайындалды"</item>
+ <item msgid="3720547957514534185">"Міндетті емес"</item>
+ <item msgid="1264673582354896949">"Орындалып жатыр"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-kn/strings.xml b/testapps/TestServerApp/app/src/main/res/values-kn/strings.xml
new file mode 100644
index 0000000..227d44b
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-kn/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
+ <string name="server_running" msgid="2780193626090379172">"ಸರ್ವರ್ ರನ್ ಆಗುತ್ತಿದೆ..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"ಸರ್ವರ್ ನಿಲ್ಲಿಸಿ"</string>
+ <string name="server_down" msgid="1030249207496490556">"ಸರ್ವರ್ ಡೌನ್ ಆಗಿದೆ"</string>
+ <string name="start_server" msgid="3878573341408591975">"ಸರ್ವರ್ ಪ್ರಾರಂಭಿಸಿ"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</item>
+ <item msgid="3193389681837907872">"ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</item>
+ <item msgid="3124590179479393815">"ಹೊಂದಾಣಿಕೆಯಾಗುವುದಿಲ್ಲ"</item>
+ <item msgid="1606753456265236910">"ಒದಗಿಸಲಾಗುತ್ತಿದೆ"</item>
+ <item msgid="3930807209231347454">"ಒಳಗೊಂಡಿದೆ"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"ಒದಗಿಸಲಾಗಿಲ್ಲ"</item>
+ <item msgid="7598231293776486217">"ಒದಗಿಸಲಾಗಿದೆ"</item>
+ <item msgid="3720547957514534185">"ಅಗತ್ಯವಿಲ್ಲ"</item>
+ <item msgid="1264673582354896949">"ಪ್ರಗತಿಯಲ್ಲಿದೆ"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ko/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ko/strings.xml
new file mode 100644
index 0000000..ca9b15a
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ko/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"설정"</string>
+ <string name="server_running" msgid="2780193626090379172">"서버 실행 중…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"서버를 중지하시겠습니까?"</string>
+ <string name="server_down" msgid="1030249207496490556">"서버가 다운됨"</string>
+ <string name="start_server" msgid="3878573341408591975">"서버를 시작하시겠습니까?"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"사용 안함"</item>
+ <item msgid="3193389681837907872">"사용 설정됨"</item>
+ <item msgid="3124590179479393815">"호환되지 않음"</item>
+ <item msgid="1606753456265236910">"프로비저닝"</item>
+ <item msgid="3930807209231347454">"포함됨"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"프로비저닝되지 않음"</item>
+ <item msgid="7598231293776486217">"프로비저닝됨"</item>
+ <item msgid="3720547957514534185">"필요 없음"</item>
+ <item msgid="1264673582354896949">"진행 중"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ky/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ky/strings.xml
new file mode 100644
index 0000000..3d6c36f
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ky/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Параметрлер"</string>
+ <string name="server_running" msgid="2780193626090379172">"Сервер иштеп жатат..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Серверди токтотуу"</string>
+ <string name="server_down" msgid="1030249207496490556">"Сервер иштебей калды"</string>
+ <string name="start_server" msgid="3878573341408591975">"Серверди иштетип баштоо"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Өчүрүлдү"</item>
+ <item msgid="3193389681837907872">"Иштетилди"</item>
+ <item msgid="3124590179479393815">"Ылайык келбейт"</item>
+ <item msgid="1606753456265236910">"Камсыз кылууда"</item>
+ <item msgid="3930807209231347454">"Камтылган"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Камсыздалган эмес"</item>
+ <item msgid="7598231293776486217">"Камсыздалган"</item>
+ <item msgid="3720547957514534185">"Талап кылынбайт"</item>
+ <item msgid="1264673582354896949">"Аткарылууда"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-lt/strings.xml b/testapps/TestServerApp/app/src/main/res/values-lt/strings.xml
new file mode 100644
index 0000000..a7e79e9
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-lt/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Nustatymai"</string>
+ <string name="server_running" msgid="2780193626090379172">"Serveris veikia..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Sustabdyti serverį"</string>
+ <string name="server_down" msgid="1030249207496490556">"Serveris neveikia"</string>
+ <string name="start_server" msgid="3878573341408591975">"Paleisti serverį"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Išjungta"</item>
+ <item msgid="3193389681837907872">"Įgalinta"</item>
+ <item msgid="3124590179479393815">"Nesuderinama"</item>
+ <item msgid="1606753456265236910">"Parengiama"</item>
+ <item msgid="3930807209231347454">"Įtraukta"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Neparengta"</item>
+ <item msgid="7598231293776486217">"Parengta"</item>
+ <item msgid="3720547957514534185">"Nebūtina"</item>
+ <item msgid="1264673582354896949">"Vykdoma"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-lv/strings.xml b/testapps/TestServerApp/app/src/main/res/values-lv/strings.xml
new file mode 100644
index 0000000..a7bff51
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-lv/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"ServeraLietotneTestēšanai"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Iestatījumi"</string>
+ <string name="server_running" msgid="2780193626090379172">"Serveris darbojas…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Apturēt servera darbību"</string>
+ <string name="server_down" msgid="1030249207496490556">"Serveris nedarbojas"</string>
+ <string name="start_server" msgid="3878573341408591975">"Palaist serveri"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Atspējots"</item>
+ <item msgid="3193389681837907872">"Iespējots"</item>
+ <item msgid="3124590179479393815">"Nav saderīgs"</item>
+ <item msgid="1606753456265236910">"Notiek nodrošināšana"</item>
+ <item msgid="3930807209231347454">"Iekļauts"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Nav nodrošināts"</item>
+ <item msgid="7598231293776486217">"Nodrošināts"</item>
+ <item msgid="3720547957514534185">"Nav nepieciešams"</item>
+ <item msgid="1264673582354896949">"Notiek apstrāde"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-mk/strings.xml b/testapps/TestServerApp/app/src/main/res/values-mk/strings.xml
new file mode 100644
index 0000000..44a255c
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-mk/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Поставки"</string>
+ <string name="server_running" msgid="2780193626090379172">"Серверот се извршува…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Сопри го серверот"</string>
+ <string name="server_down" msgid="1030249207496490556">"Серверот е паднат"</string>
+ <string name="start_server" msgid="3878573341408591975">"Стартувај го серверот"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Оневозможено"</item>
+ <item msgid="3193389681837907872">"Овозможено"</item>
+ <item msgid="3124590179479393815">"Некомпатибилно"</item>
+ <item msgid="1606753456265236910">"Се обезбедува"</item>
+ <item msgid="3930807209231347454">"Опфатено"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Необезбедено"</item>
+ <item msgid="7598231293776486217">"Обезбедено"</item>
+ <item msgid="3720547957514534185">"Незадолжително"</item>
+ <item msgid="1264673582354896949">"Во тек"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ml/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ml/strings.xml
new file mode 100644
index 0000000..32b305a
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ml/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"ക്രമീകരണം"</string>
+ <string name="server_running" msgid="2780193626090379172">"സെർവർ പ്രവർത്തിക്കുന്നുണ്ട്..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"സെർവർ നിർത്തുക"</string>
+ <string name="server_down" msgid="1030249207496490556">"സെർവർ ലഭ്യമല്ല"</string>
+ <string name="start_server" msgid="3878573341408591975">"സെർവർ ആരംഭിക്കുക"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"പ്രവർത്തനരഹിതമാക്കി"</item>
+ <item msgid="3193389681837907872">"പ്രവർത്തനക്ഷമമാക്കി"</item>
+ <item msgid="3124590179479393815">"അനുയോജ്യമല്ല"</item>
+ <item msgid="1606753456265236910">"പ്രൊവിഷനിംഗ്"</item>
+ <item msgid="3930807209231347454">"ഉൾപ്പെടുത്തി"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"പ്രൊവിഷൻ ചെയ്തിട്ടില്ല"</item>
+ <item msgid="7598231293776486217">"പ്രൊവിഷൻ ചെയ്തു"</item>
+ <item msgid="3720547957514534185">"ആവശ്യമില്ല"</item>
+ <item msgid="1264673582354896949">"പുരോഗമിക്കുന്നു"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-mn/strings.xml b/testapps/TestServerApp/app/src/main/res/values-mn/strings.xml
new file mode 100644
index 0000000..6c131e2
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-mn/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Тохиргоо"</string>
+ <string name="server_running" msgid="2780193626090379172">"Сервер ажиллаж байна..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Серверийг зогсоох"</string>
+ <string name="server_down" msgid="1030249207496490556">"Сервер унтарсан байна"</string>
+ <string name="start_server" msgid="3878573341408591975">"Серверийг эхлүүлэх"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Идэвхгүй болгосон"</item>
+ <item msgid="3193389681837907872">"Идэвхжүүлсэн"</item>
+ <item msgid="3124590179479393815">"Тохирохгүй"</item>
+ <item msgid="1606753456265236910">"Бэлтгэж байна"</item>
+ <item msgid="3930807209231347454">"Багтсан"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Бэлтгээгүй"</item>
+ <item msgid="7598231293776486217">"Бэлтгэсэн"</item>
+ <item msgid="3720547957514534185">"Заавал биш"</item>
+ <item msgid="1264673582354896949">"Үргэлжилж байна"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-mr/strings.xml b/testapps/TestServerApp/app/src/main/res/values-mr/strings.xml
new file mode 100644
index 0000000..74a0f56
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-mr/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"सेटिंग्ज"</string>
+ <string name="server_running" msgid="2780193626090379172">"सर्व्हर रन होत आहे..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"सर्व्हर थांबवा"</string>
+ <string name="server_down" msgid="1030249207496490556">"सर्व्हर बंद आहे"</string>
+ <string name="start_server" msgid="3878573341408591975">"सर्व्हर सुरू करा"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"बंद आहे"</item>
+ <item msgid="3193389681837907872">"सुरू आहे"</item>
+ <item msgid="3124590179479393815">"कंपॅटिबल नाही"</item>
+ <item msgid="1606753456265236910">"तरतूद"</item>
+ <item msgid="3930807209231347454">"समावेश आहे"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"तरतूद केलेली नाही"</item>
+ <item msgid="7598231293776486217">"तरतूद केली आहे"</item>
+ <item msgid="3720547957514534185">"आवश्यक नाही"</item>
+ <item msgid="1264673582354896949">"प्रगतीपथावर आहे"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-my/strings.xml b/testapps/TestServerApp/app/src/main/res/values-my/strings.xml
new file mode 100644
index 0000000..9a0dcdf
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-my/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"ဆက်တင်များ"</string>
+ <string name="server_running" msgid="2780193626090379172">"ဆာဗာ လုပ်ဆောင်နေသည်…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"ဆာဗာ ရပ်ရန်"</string>
+ <string name="server_down" msgid="1030249207496490556">"ဆာဗာကျနေသည်"</string>
+ <string name="start_server" msgid="3878573341408591975">"ဆာဗာ စတင်ရန်"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"ပိတ်ထားသည်"</item>
+ <item msgid="3193389681837907872">"ဖွင့်ထားသည်"</item>
+ <item msgid="3124590179479393815">"တွဲဖက်မသုံးနိုင်ပါ"</item>
+ <item msgid="1606753456265236910">"ပံ့ပိုးပေးခြင်း"</item>
+ <item msgid="3930807209231347454">"ပါဝင်သည်"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"ပံ့ပိုးမထားပါ"</item>
+ <item msgid="7598231293776486217">"ပံ့ပိုးပေးထားသည်"</item>
+ <item msgid="3720547957514534185">"မလိုအပ်ပါ"</item>
+ <item msgid="1264673582354896949">"ဆောင်ရွက်နေဆဲ"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-nb/strings.xml b/testapps/TestServerApp/app/src/main/res/values-nb/strings.xml
new file mode 100644
index 0000000..d28a197
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-nb/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Innstillinger"</string>
+ <string name="server_running" msgid="2780193626090379172">"Tjeneren kjører …"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Stopp tjeneren"</string>
+ <string name="server_down" msgid="1030249207496490556">"Tjeneren er nede"</string>
+ <string name="start_server" msgid="3878573341408591975">"Start tjeneren"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Slått av"</item>
+ <item msgid="3193389681837907872">"Slått på"</item>
+ <item msgid="3124590179479393815">"Inkompatibel"</item>
+ <item msgid="1606753456265236910">"Klargjøring"</item>
+ <item msgid="3930807209231347454">"Inkludert"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Ikke klargjort"</item>
+ <item msgid="7598231293776486217">"Klargjort"</item>
+ <item msgid="3720547957514534185">"Ikke obligatorisk"</item>
+ <item msgid="1264673582354896949">"Under behandling"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ne/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ne/strings.xml
new file mode 100644
index 0000000..fe1f119
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ne/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"सेटिङ"</string>
+ <string name="server_running" msgid="2780193626090379172">"सर्भर चल्दै छ..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"सर्भर बन्द गर्नुहोस्"</string>
+ <string name="server_down" msgid="1030249207496490556">"सर्भर डाउन छ"</string>
+ <string name="start_server" msgid="3878573341408591975">"सर्भर प्रयोग गर्न थाल्नुहोस्"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"अफ गरिएको छ"</item>
+ <item msgid="3193389681837907872">"अन गरिएको छ"</item>
+ <item msgid="3124590179479393815">"नमिल्दो"</item>
+ <item msgid="1606753456265236910">"प्रावधान मिलाइँदै छ"</item>
+ <item msgid="3930807209231347454">"समावेश गरिएको छ"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"प्रावधान मिलाइएको छैन"</item>
+ <item msgid="7598231293776486217">"प्रावधान मिलाइएको छ"</item>
+ <item msgid="3720547957514534185">"आवश्यक छैन"</item>
+ <item msgid="1264673582354896949">"प्रक्रियामा छ"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-nl/strings.xml b/testapps/TestServerApp/app/src/main/res/values-nl/strings.xml
new file mode 100644
index 0000000..847dfca
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-nl/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Instellingen"</string>
+ <string name="server_running" msgid="2780193626090379172">"Server actief..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Server stoppen"</string>
+ <string name="server_down" msgid="1030249207496490556">"Server offline"</string>
+ <string name="start_server" msgid="3878573341408591975">"Server starten"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Uit"</item>
+ <item msgid="3193389681837907872">"Aan"</item>
+ <item msgid="3124590179479393815">"Niet geschikt"</item>
+ <item msgid="1606753456265236910">"Registratie"</item>
+ <item msgid="3930807209231347454">"Opgenomen"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Niet geregistreerd"</item>
+ <item msgid="7598231293776486217">"Geregistreerd"</item>
+ <item msgid="3720547957514534185">"Niet vereist"</item>
+ <item msgid="1264673582354896949">"In behandeling"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-pa/strings.xml b/testapps/TestServerApp/app/src/main/res/values-pa/strings.xml
new file mode 100644
index 0000000..f4509fc
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-pa/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"ਸੈਟਿੰਗਾਂ"</string>
+ <string name="server_running" msgid="2780193626090379172">"ਸਰਵਰ ਚੱਲ ਰਿਹਾ ਹੈ..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"ਸਰਵਰ ਬੰਦ ਕਰੋ"</string>
+ <string name="server_down" msgid="1030249207496490556">"ਸਰਵਰ ਨਹੀਂ ਚੱਲ ਰਿਹਾ"</string>
+ <string name="start_server" msgid="3878573341408591975">"ਸਰਵਰ ਚਾਲੂ ਕਰੋ"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"ਬੰਦ"</item>
+ <item msgid="3193389681837907872">"ਚਾਲੂ"</item>
+ <item msgid="3124590179479393815">"ਗੈਰ-ਅਨੁਰੂਪ"</item>
+ <item msgid="1606753456265236910">"ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</item>
+ <item msgid="3930807209231347454">"ਸ਼ਾਮਲ"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"ਪ੍ਰਬੰਧਿਤ ਨਹੀਂ ਹੈ"</item>
+ <item msgid="7598231293776486217">"ਪ੍ਰਬੰਧਿਤ ਹੈ"</item>
+ <item msgid="3720547957514534185">"ਲੋੜੀਂਦਾ ਨਹੀਂ"</item>
+ <item msgid="1264673582354896949">"ਜਾਰੀ ਹੈ"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-pl/strings.xml b/testapps/TestServerApp/app/src/main/res/values-pl/strings.xml
new file mode 100644
index 0000000..4a13003
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-pl/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Ustawienia"</string>
+ <string name="server_running" msgid="2780193626090379172">"Serwer działa…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"ZatrzymaJ serwer"</string>
+ <string name="server_down" msgid="1030249207496490556">"Serwer nie działa"</string>
+ <string name="start_server" msgid="3878573341408591975">"Uruchom serwer"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Wyłączono"</item>
+ <item msgid="3193389681837907872">"Włączono"</item>
+ <item msgid="3124590179479393815">"Brak zgodności"</item>
+ <item msgid="1606753456265236910">"Obsługa administracyjna"</item>
+ <item msgid="3930807209231347454">"Dostępne"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Nieobsługiwane"</item>
+ <item msgid="7598231293776486217">"Obsługiwane"</item>
+ <item msgid="3720547957514534185">"Niewymagane"</item>
+ <item msgid="1264673582354896949">"W toku"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-pt-rPT/strings.xml b/testapps/TestServerApp/app/src/main/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..e61c84d
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-pt-rPT/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Definições"</string>
+ <string name="server_running" msgid="2780193626090379172">"O servidor está em execução…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Parar servidor"</string>
+ <string name="server_down" msgid="1030249207496490556">"O servidor está indisponível"</string>
+ <string name="start_server" msgid="3878573341408591975">"Iniciar servidor"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Desativado"</item>
+ <item msgid="3193389681837907872">"Ativado"</item>
+ <item msgid="3124590179479393815">"Incompatível"</item>
+ <item msgid="1606753456265236910">"A aprovisionar"</item>
+ <item msgid="3930807209231347454">"Incluído"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Não aprovisionado"</item>
+ <item msgid="7598231293776486217">"Aprovisionado"</item>
+ <item msgid="3720547957514534185">"Não obrigatório"</item>
+ <item msgid="1264673582354896949">"Em curso"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-pt/strings.xml b/testapps/TestServerApp/app/src/main/res/values-pt/strings.xml
new file mode 100644
index 0000000..1d2310d
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-pt/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Configurações"</string>
+ <string name="server_running" msgid="2780193626090379172">"O servidor está em execução..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Interromper servidor"</string>
+ <string name="server_down" msgid="1030249207496490556">"O servidor está fora do ar."</string>
+ <string name="start_server" msgid="3878573341408591975">"Iniciar servidor"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Desativado"</item>
+ <item msgid="3193389681837907872">"Ativado"</item>
+ <item msgid="3124590179479393815">"Incompatível"</item>
+ <item msgid="1606753456265236910">"Provisionando"</item>
+ <item msgid="3930807209231347454">"Incluso"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Não provisionado"</item>
+ <item msgid="7598231293776486217">"Provisionado"</item>
+ <item msgid="3720547957514534185">"Não obrigatório"</item>
+ <item msgid="1264673582354896949">"Em andamento"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ro/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ro/strings.xml
new file mode 100644
index 0000000..a84085a
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ro/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Setări"</string>
+ <string name="server_running" msgid="2780193626090379172">"Serverul rulează..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Oprește serverul"</string>
+ <string name="server_down" msgid="1030249207496490556">"Serverul nu funcționează"</string>
+ <string name="start_server" msgid="3878573341408591975">"Pornește serverul"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Dezactivat"</item>
+ <item msgid="3193389681837907872">"Activat"</item>
+ <item msgid="3124590179479393815">"Incompatibil"</item>
+ <item msgid="1606753456265236910">"Configurarea accesului pentru utilizatori"</item>
+ <item msgid="3930807209231347454">"Inclus"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Nu a fost configurat accesul"</item>
+ <item msgid="7598231293776486217">"A fost configurat accesul"</item>
+ <item msgid="3720547957514534185">"Nu este obligatoriu"</item>
+ <item msgid="1264673582354896949">"În desfășurare"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ru/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ru/strings.xml
new file mode 100644
index 0000000..1242f96
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ru/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Настройки"</string>
+ <string name="server_running" msgid="2780193626090379172">"Сервер работает…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Остановить сервер"</string>
+ <string name="server_down" msgid="1030249207496490556">"Сервер не работает"</string>
+ <string name="start_server" msgid="3878573341408591975">"Запустить сервер"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Неактивно"</item>
+ <item msgid="3193389681837907872">"Активно"</item>
+ <item msgid="3124590179479393815">"Несовместимо"</item>
+ <item msgid="1606753456265236910">"Инициализация"</item>
+ <item msgid="3930807209231347454">"Включено"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Не подготовлено"</item>
+ <item msgid="7598231293776486217">"Подготовлено"</item>
+ <item msgid="3720547957514534185">"Необязательно"</item>
+ <item msgid="1264673582354896949">"На рассмотрении"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-si/strings.xml b/testapps/TestServerApp/app/src/main/res/values-si/strings.xml
new file mode 100644
index 0000000..47dba95
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-si/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"සැකසීම්"</string>
+ <string name="server_running" msgid="2780193626090379172">"සේවාදායකය ධාවනය වේ..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"සේවාදායකය නවත්වන්න"</string>
+ <string name="server_down" msgid="1030249207496490556">"සේවාදායකය බිඳ වැටී ඇත"</string>
+ <string name="start_server" msgid="3878573341408591975">"සේවාදායකය අරඹන්න"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"අබලයි"</item>
+ <item msgid="3193389681837907872">"සබලයි"</item>
+ <item msgid="3124590179479393815">"නොගැළපෙන"</item>
+ <item msgid="1606753456265236910">"ප්රතිපාදනය කරමින්"</item>
+ <item msgid="3930807209231347454">"ඇතුළත් වේ"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"ප්රතිපාදනය කර නැත"</item>
+ <item msgid="7598231293776486217">"ප්රතිපාදන ලත්"</item>
+ <item msgid="3720547957514534185">"අවශ්ය නැත"</item>
+ <item msgid="1264673582354896949">"ප්රගතියේ පවතී"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-sk/strings.xml b/testapps/TestServerApp/app/src/main/res/values-sk/strings.xml
new file mode 100644
index 0000000..ca4bd55
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-sk/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Nastavenia"</string>
+ <string name="server_running" msgid="2780193626090379172">"Server je spustený…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Zastaviť server"</string>
+ <string name="server_down" msgid="1030249207496490556">"Server je nedostupný"</string>
+ <string name="start_server" msgid="3878573341408591975">"Spustiť server"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Vypnuté"</item>
+ <item msgid="3193389681837907872">"Zapnuté"</item>
+ <item msgid="3124590179479393815">"Nekompatibilné"</item>
+ <item msgid="1606753456265236910">"Poskytovanie"</item>
+ <item msgid="3930807209231347454">"Zahrnuté"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Neposkytuje sa"</item>
+ <item msgid="7598231293776486217">"Poskytuje sa"</item>
+ <item msgid="3720547957514534185">"Nepovinné"</item>
+ <item msgid="1264673582354896949">"Spracúva sa"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-sl/strings.xml b/testapps/TestServerApp/app/src/main/res/values-sl/strings.xml
new file mode 100644
index 0000000..570e6e2
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-sl/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Nastavitve"</string>
+ <string name="server_running" msgid="2780193626090379172">"Strežnik se izvaja ..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Ustavi strežnik"</string>
+ <string name="server_down" msgid="1030249207496490556">"Strežnik ne deluje"</string>
+ <string name="start_server" msgid="3878573341408591975">"Zaženi strežnik"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Onemogočeno"</item>
+ <item msgid="3193389681837907872">"Omogočeno"</item>
+ <item msgid="3124590179479393815">"Nezdružljivo"</item>
+ <item msgid="1606753456265236910">"Omogočanje uporabe"</item>
+ <item msgid="3930807209231347454">"Vključeno"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Uporaba ni omogočena"</item>
+ <item msgid="7598231293776486217">"Omogočeno"</item>
+ <item msgid="3720547957514534185">"Ni zahtevano"</item>
+ <item msgid="1264673582354896949">"Poteka"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-sq/strings.xml b/testapps/TestServerApp/app/src/main/res/values-sq/strings.xml
new file mode 100644
index 0000000..fbcd4da
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-sq/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Cilësimet"</string>
+ <string name="server_running" msgid="2780193626090379172">"Serveri është në ekzekutim..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Ndalo serverin"</string>
+ <string name="server_down" msgid="1030249207496490556">"Serveri nuk po funksionon"</string>
+ <string name="start_server" msgid="3878573341408591975">"Nis serverin"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Çaktivizuar"</item>
+ <item msgid="3193389681837907872">"Aktivizuar"</item>
+ <item msgid="3124590179479393815">"I papërputhshëm"</item>
+ <item msgid="1606753456265236910">"Po përgatitet"</item>
+ <item msgid="3930807209231347454">"Përfshirë"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Nuk është përgatitur"</item>
+ <item msgid="7598231293776486217">"Përgatitur"</item>
+ <item msgid="3720547957514534185">"Nuk kërkohet"</item>
+ <item msgid="1264673582354896949">"Në vazhdim"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-sr/strings.xml b/testapps/TestServerApp/app/src/main/res/values-sr/strings.xml
new file mode 100644
index 0000000..e8fc322
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-sr/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Подешавања"</string>
+ <string name="server_running" msgid="2780193626090379172">"Сервер је покренут…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Заустави сервер"</string>
+ <string name="server_down" msgid="1030249207496490556">"Сервер је пао"</string>
+ <string name="start_server" msgid="3878573341408591975">"Покрени сервер"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Онемогућено"</item>
+ <item msgid="3193389681837907872">"Омогућено"</item>
+ <item msgid="3124590179479393815">"Некомпатибилно"</item>
+ <item msgid="1606753456265236910">"Додељује се"</item>
+ <item msgid="3930807209231347454">"Уврштено"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Није додељено"</item>
+ <item msgid="7598231293776486217">"Додељено"</item>
+ <item msgid="3720547957514534185">"Није обавезно"</item>
+ <item msgid="1264673582354896949">"У току"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-sv/strings.xml b/testapps/TestServerApp/app/src/main/res/values-sv/strings.xml
new file mode 100644
index 0000000..8470695
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-sv/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Inställningar"</string>
+ <string name="server_running" msgid="2780193626090379172">"Servern körs …"</string>
+ <string name="stop_server" msgid="6192029827529013598">"Stoppa servern"</string>
+ <string name="server_down" msgid="1030249207496490556">"Servern ligger nere"</string>
+ <string name="start_server" msgid="3878573341408591975">"Starta servern"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Inaktiverad"</item>
+ <item msgid="3193389681837907872">"Aktiverad"</item>
+ <item msgid="3124590179479393815">"Ej kompatibel"</item>
+ <item msgid="1606753456265236910">"Certifikaten installeras"</item>
+ <item msgid="3930807209231347454">"Inkluderat"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Ej administrerad"</item>
+ <item msgid="7598231293776486217">"Administrerad"</item>
+ <item msgid="3720547957514534185">"Ej obligatorisk"</item>
+ <item msgid="1264673582354896949">"Pågår"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-sw/strings.xml b/testapps/TestServerApp/app/src/main/res/values-sw/strings.xml
new file mode 100644
index 0000000..c1155b8
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-sw/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Mipangilio"</string>
+ <string name="server_running" msgid="2780193626090379172">"Seva inatekeleza..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Sitisha Seva"</string>
+ <string name="server_down" msgid="1030249207496490556">"Seva iko chini"</string>
+ <string name="start_server" msgid="3878573341408591975">"Washa Seva"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Imezimwa"</item>
+ <item msgid="3193389681837907872">"Imewashwa"</item>
+ <item msgid="3124590179479393815">"Haioani"</item>
+ <item msgid="1606753456265236910">"Inaandaa"</item>
+ <item msgid="3930807209231347454">"Imejumuishwa"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Haijatolewa"</item>
+ <item msgid="7598231293776486217">"Imetolewa"</item>
+ <item msgid="3720547957514534185">"Haihitajiki"</item>
+ <item msgid="1264673582354896949">"Inaendelea"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ta/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ta/strings.xml
new file mode 100644
index 0000000..adad427
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ta/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"அமைப்புகள்"</string>
+ <string name="server_running" msgid="2780193626090379172">"சேவையகம் இயக்கத்தில் உள்ளது..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"சேவையகத்தை நிறுத்து"</string>
+ <string name="server_down" msgid="1030249207496490556">"சேவையகம் இயங்கவில்லை"</string>
+ <string name="start_server" msgid="3878573341408591975">"சேவையகத்தைத் தொடங்கு"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"முடக்கப்பட்டது"</item>
+ <item msgid="3193389681837907872">"இயக்கப்பட்டது"</item>
+ <item msgid="3124590179479393815">"இணக்கமற்றது"</item>
+ <item msgid="1606753456265236910">"அமைக்கிறது"</item>
+ <item msgid="3930807209231347454">"சேர்க்கப்பட்டது"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"அமைக்கப்படவில்லை"</item>
+ <item msgid="7598231293776486217">"அமைக்கப்பட்டது"</item>
+ <item msgid="3720547957514534185">"அவசியமில்லை"</item>
+ <item msgid="1264673582354896949">"செயலிலுள்ளது"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-te/strings.xml b/testapps/TestServerApp/app/src/main/res/values-te/strings.xml
new file mode 100644
index 0000000..39cc2fe
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-te/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"టెస్ట్సర్వర్యాప్"</string>
+ <string name="action_settings" msgid="1335152369747372374">"సెట్టింగ్లు"</string>
+ <string name="server_running" msgid="2780193626090379172">"సర్వర్ రన్ అవుతోంది..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"సర్వర్ను ఆపివేయండి"</string>
+ <string name="server_down" msgid="1030249207496490556">"సర్వర్ డౌన్ అయింది"</string>
+ <string name="start_server" msgid="3878573341408591975">"సర్వర్ను ప్రారంభించండి"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"డిజేబుల్ చేయబడింది"</item>
+ <item msgid="3193389681837907872">"ఎనేబుల్ చేయబడింది"</item>
+ <item msgid="3124590179479393815">"అనుకూలంగా లేదు"</item>
+ <item msgid="1606753456265236910">"కేటాయిస్తోంది"</item>
+ <item msgid="3930807209231347454">"చేర్చబడింది"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"కేటాయించలేదు"</item>
+ <item msgid="7598231293776486217">"కేటాయించబడింది"</item>
+ <item msgid="3720547957514534185">"అవసరం లేదు"</item>
+ <item msgid="1264673582354896949">"ప్రోగ్రెస్లో ఉంది"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-th/strings.xml b/testapps/TestServerApp/app/src/main/res/values-th/strings.xml
new file mode 100644
index 0000000..78232ca
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-th/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"แอปเซิร์ฟเวอร์ทดสอบ"</string>
+ <string name="action_settings" msgid="1335152369747372374">"การตั้งค่า"</string>
+ <string name="server_running" msgid="2780193626090379172">"เซิร์ฟเวอร์กำลังทำงาน..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"หยุดเซิร์ฟเวอร์"</string>
+ <string name="server_down" msgid="1030249207496490556">"เซิร์ฟเวอร์ขัดข้อง"</string>
+ <string name="start_server" msgid="3878573341408591975">"เริ่มต้นเซิร์ฟเวอร์"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"ปิดใช้อยู่"</item>
+ <item msgid="3193389681837907872">"เปิดใช้อยู่"</item>
+ <item msgid="3124590179479393815">"ใช้งานร่วมกันไม่ได้"</item>
+ <item msgid="1606753456265236910">"การจัดสรร"</item>
+ <item msgid="3930807209231347454">"รวมอยู่ด้วย"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"ยังไม่ได้จัดสรร"</item>
+ <item msgid="7598231293776486217">"จัดสรรแล้ว"</item>
+ <item msgid="3720547957514534185">"ไม่บังคับ"</item>
+ <item msgid="1264673582354896949">"อยู่ในระหว่างดำเนินการ"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ur/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ur/strings.xml
new file mode 100644
index 0000000..5df75a7
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ur/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"ترتیبات"</string>
+ <string name="server_running" msgid="2780193626090379172">"سرور چل رہا ہے..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"سرور روکیں"</string>
+ <string name="server_down" msgid="1030249207496490556">"سرور ڈاؤن ہے"</string>
+ <string name="start_server" msgid="3878573341408591975">"سرور شروع کریں"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"غیر فعال ہے"</item>
+ <item msgid="3193389681837907872">"فعال ہے"</item>
+ <item msgid="3124590179479393815">"غیر مطابقت پذیر"</item>
+ <item msgid="1606753456265236910">"فراہمی"</item>
+ <item msgid="3930807209231347454">"شامل ہے"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"فراہم نہیں کیا گا"</item>
+ <item msgid="7598231293776486217">"فراہم کیا گیا"</item>
+ <item msgid="3720547957514534185">"غیر مطلوب"</item>
+ <item msgid="1264673582354896949">"پیشرفت میں ہے"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-vi/strings.xml b/testapps/TestServerApp/app/src/main/res/values-vi/strings.xml
new file mode 100644
index 0000000..78bd3d8
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-vi/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Cài đặt"</string>
+ <string name="server_running" msgid="2780193626090379172">"Máy chủ đang chạy..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Dừng máy chủ"</string>
+ <string name="server_down" msgid="1030249207496490556">"Máy chủ không hoạt động"</string>
+ <string name="start_server" msgid="3878573341408591975">"Khởi động máy chủ"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Đã tắt"</item>
+ <item msgid="3193389681837907872">"Đã bật"</item>
+ <item msgid="3124590179479393815">"Không tương thích"</item>
+ <item msgid="1606753456265236910">"Đang cung cấp"</item>
+ <item msgid="3930807209231347454">"Đã bao gồm"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Chưa được cung cấp"</item>
+ <item msgid="7598231293776486217">"Đã cung cấp"</item>
+ <item msgid="3720547957514534185">"Không bắt buộc"</item>
+ <item msgid="1264673582354896949">"Đang xử lý"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-zh-rCN/strings.xml b/testapps/TestServerApp/app/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..6e26819
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"设置"</string>
+ <string name="server_running" msgid="2780193626090379172">"服务器正在运行…"</string>
+ <string name="stop_server" msgid="6192029827529013598">"停止服务器"</string>
+ <string name="server_down" msgid="1030249207496490556">"服务器出现故障"</string>
+ <string name="start_server" msgid="3878573341408591975">"启动服务器"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"已停用"</item>
+ <item msgid="3193389681837907872">"已启用"</item>
+ <item msgid="3124590179479393815">"不兼容"</item>
+ <item msgid="1606753456265236910">"正在配置"</item>
+ <item msgid="3930807209231347454">"已包含"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"未配置"</item>
+ <item msgid="7598231293776486217">"已配置"</item>
+ <item msgid="3720547957514534185">"不需要"</item>
+ <item msgid="1264673582354896949">"进行中"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-zu/strings.xml b/testapps/TestServerApp/app/src/main/res/values-zu/strings.xml
new file mode 100644
index 0000000..fbb6262
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-zu/strings.xml
@@ -0,0 +1,23 @@
+<?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="2894617184221823208">"I-TestServerApp"</string>
+ <string name="action_settings" msgid="1335152369747372374">"Amasethingi"</string>
+ <string name="server_running" msgid="2780193626090379172">"Iseva iyaqhubeka..."</string>
+ <string name="stop_server" msgid="6192029827529013598">"Misa Iseva"</string>
+ <string name="server_down" msgid="1030249207496490556">"Iseva iphansi"</string>
+ <string name="start_server" msgid="3878573341408591975">"Qalisa Iseva"</string>
+ <string-array name="entitlement_status">
+ <item msgid="5560300387618996934">"Kukhutshaziwe"</item>
+ <item msgid="3193389681837907872">"Kunikwe amandla"</item>
+ <item msgid="3124590179479393815">"Ayisebenzisani"</item>
+ <item msgid="1606753456265236910">"Iyahlinzeka"</item>
+ <item msgid="3930807209231347454">"Kuhlanganisiwe"</item>
+ </string-array>
+ <string-array name="provision_status">
+ <item msgid="3486273747926710021">"Akulungiselelwanga"</item>
+ <item msgid="7598231293776486217">"Kulungiselelwe"</item>
+ <item msgid="3720547957514534185">"Akudingekile"</item>
+ <item msgid="1264673582354896949">"Kuyaqhubeka"</item>
+ </string-array>
+</resources>
diff --git a/testapps/TestSliceApp/.idea/.gitignore b/testapps/TestSliceApp/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/testapps/TestSliceApp/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/testapps/TestSliceApp/.idea/compiler.xml b/testapps/TestSliceApp/.idea/compiler.xml
new file mode 100644
index 0000000..fb7f4a8
--- /dev/null
+++ b/testapps/TestSliceApp/.idea/compiler.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="CompilerConfiguration">
+ <bytecodeTargetLevel target="11" />
+ </component>
+</project>
\ No newline at end of file
diff --git a/testapps/TestSliceApp/.idea/gradle.xml b/testapps/TestSliceApp/.idea/gradle.xml
new file mode 100644
index 0000000..a2d7c21
--- /dev/null
+++ b/testapps/TestSliceApp/.idea/gradle.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="GradleMigrationSettings" migrationVersion="1" />
+ <component name="GradleSettings">
+ <option name="linkedExternalProjectsSettings">
+ <GradleProjectSettings>
+ <option name="testRunner" value="GRADLE" />
+ <option name="distributionType" value="DEFAULT_WRAPPED" />
+ <option name="externalProjectPath" value="$PROJECT_DIR$" />
+ <option name="modules">
+ <set>
+ <option value="$PROJECT_DIR$" />
+ <option value="$PROJECT_DIR$/app" />
+ </set>
+ </option>
+ </GradleProjectSettings>
+ </option>
+ </component>
+</project>
\ No newline at end of file
diff --git a/testapps/TestSliceApp/.idea/misc.xml b/testapps/TestSliceApp/.idea/misc.xml
new file mode 100644
index 0000000..7c85865
--- /dev/null
+++ b/testapps/TestSliceApp/.idea/misc.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ExternalStorageConfigurationManager" enabled="true" />
+ <component name="NullableNotNullManager">
+ <option name="myDefaultNullable" value="androidx.annotation.Nullable" />
+ <option name="myDefaultNotNull" value="androidx.annotation.NonNull" />
+ <option name="myNullables">
+ <value>
+ <list size="15">
+ <item index="0" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
+ <item index="1" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
+ <item index="2" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
+ <item index="3" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.Nullable" />
+ <item index="4" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
+ <item index="5" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
+ <item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
+ <item index="7" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
+ <item index="8" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
+ <item index="9" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
+ <item index="10" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
+ <item index="11" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
+ <item index="12" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
+ <item index="13" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
+ <item index="14" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
+ </list>
+ </value>
+ </option>
+ <option name="myNotNulls">
+ <value>
+ <list size="14">
+ <item index="0" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
+ <item index="1" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
+ <item index="2" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
+ <item index="3" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
+ <item index="4" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
+ <item index="5" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
+ <item index="6" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
+ <item index="7" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
+ <item index="8" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
+ <item index="9" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
+ <item index="10" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.NonNull" />
+ <item index="11" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
+ <item index="12" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
+ <item index="13" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
+ </list>
+ </value>
+ </option>
+ </component>
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="JDK" project-jdk-type="JavaSDK">
+ <output url="file://$PROJECT_DIR$/build/classes" />
+ </component>
+ <component name="ProjectType">
+ <option name="id" value="Android" />
+ </component>
+</project>
\ No newline at end of file
diff --git a/testapps/TestSliceApp/.idea/vcs.xml b/testapps/TestSliceApp/.idea/vcs.xml
new file mode 100644
index 0000000..498ba99
--- /dev/null
+++ b/testapps/TestSliceApp/.idea/vcs.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="IssueNavigationConfiguration">
+ <option name="links">
+ <list>
+ <IssueNavigationLink>
+ <option name="issueRegexp" value="\bb/(\d+)(#\w+)?\b" />
+ <option name="linkRegexp" value="https://buganizer.corp.google.com/issues/$1$2" />
+ </IssueNavigationLink>
+ <IssueNavigationLink>
+ <option name="issueRegexp" value="\b(?:BUG=|FIXED=)(\d+)\b" />
+ <option name="linkRegexp" value="https://buganizer.corp.google.com/issues/$1" />
+ </IssueNavigationLink>
+ <IssueNavigationLink>
+ <option name="issueRegexp" value="\b(?:cl/|cr/|OCL=|DIFFBASE=|ROLLBACK_OF=)(\d+)\b" />
+ <option name="linkRegexp" value="https://critique.corp.google.com/$1" />
+ </IssueNavigationLink>
+ <IssueNavigationLink>
+ <option name="issueRegexp" value="\bomg/(\d+)\b" />
+ <option name="linkRegexp" value="https://omg.corp.google.com/$1" />
+ </IssueNavigationLink>
+ <IssueNavigationLink>
+ <option name="issueRegexp" value="\b(?:go/|goto/)([^,.<>()"\s]+(?:[.,][^,.<>()"\s]+)*)" />
+ <option name="linkRegexp" value="https://goto.google.com/$1" />
+ </IssueNavigationLink>
+ <IssueNavigationLink>
+ <option name="issueRegexp" value="\bcs/([^\s]+[\w$])" />
+ <option name="linkRegexp" value="https://cs.corp.google.com/search/?q=$1" />
+ </IssueNavigationLink>
+ <IssueNavigationLink>
+ <option name="issueRegexp" value="(LINT\.IfChange)|(LINT\.ThenChange)" />
+ <option name="linkRegexp" value="https://goto.google.com/ifthisthenthatlint" />
+ </IssueNavigationLink>
+ </list>
+ </option>
+ </component>
+ <component name="VcsDirectoryMappings">
+ <mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
+ </component>
+</project>
\ No newline at end of file
diff --git a/testapps/TestSliceApp/app/src/main/AndroidManifest.xml b/testapps/TestSliceApp/app/src/main/AndroidManifest.xml
index a34c254..53754de 100644
--- a/testapps/TestSliceApp/app/src/main/AndroidManifest.xml
+++ b/testapps/TestSliceApp/app/src/main/AndroidManifest.xml
@@ -4,6 +4,7 @@
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
+ <uses-permission android:name="android.permission.READ_BASIC_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
diff --git a/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/PrioritizeLatency.java b/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/PrioritizeLatency.java
index 45ea666..0f120f4 100644
--- a/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/PrioritizeLatency.java
+++ b/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/PrioritizeLatency.java
@@ -15,32 +15,64 @@
*/
package com.google.android.sample.testsliceapp;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_DISABLED;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ENTITLEMENT_CHECK_FAILED;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_FEATURE_NOT_SUPPORTED;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_NOT_AVAILABLE;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_DEFAULT_DATA_SUBSCRIPTION;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_OVERRIDDEN;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_PENDING_NETWORK_SETUP;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT;
+import static android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED;
+
+import android.annotation.TargetApi;
+import android.content.Context;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Bundle;
+import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
+import android.widget.TextView;
import androidx.fragment.app.Fragment;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
/**
* A simple {@link Fragment} subclass. Use the {@link PrioritizeLatency#newInstance} factory method
* to create an instance of this fragment.
*/
public class PrioritizeLatency extends Fragment {
- Button mRelease, mRequest, mPing;
- Network mNetwork;
+ Button mPurchase, mNetworkRequestRelease, mPing;
+ TextView mResultTextView;
+ Network mNetwork = null;
ConnectivityManager mConnectivityManager;
NetworkCallback mProfileCheckNetworkCallback;
+ TelephonyManager mTelephonyManager;
+ Context mContext;
+ private final ExecutorService mFixedThreadPool = Executors.newFixedThreadPool(3);
+
+ private static final String LOG_TAG = "PrioritizeLatency";
+ private static final int TIMEOUT_FOR_PURCHASE = 5 * 60; // 5 minutes
+
public PrioritizeLatency() {
- // Required empty public constructor
+ // Required empty public constructor
}
/**
@@ -62,7 +94,9 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mConnectivityManager = getContext().getSystemService(ConnectivityManager.class);
+ mContext = getContext();
+ mConnectivityManager = mContext.getSystemService(ConnectivityManager.class);
+ mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
}
@Override
@@ -70,56 +104,205 @@
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_prioritize_latency, container, false);
- mProfileCheckNetworkCallback =
- new NetworkCallback() {
- @Override
- public void onAvailable(final Network network) {
- mNetwork = network;
- }
- };
- mRelease = view.findViewById(R.id.releaselatency);
- mRelease.setOnClickListener(new OnClickListener() {
+ mResultTextView = view.findViewById(R.id.resultTextView);
+
+ mPurchase = view.findViewById(R.id.purchaseButton);
+ mPurchase.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
- try {
- mConnectivityManager.unregisterNetworkCallback(
- mProfileCheckNetworkCallback);
- } catch (Exception e) {
- Log.d("SliceTest", "Exception: " + e);
- }
+ Log.d(LOG_TAG, "Clicking purchase button");
+ onPurchaseButtonClick();
}
});
- mRequest = view.findViewById(R.id.requestlatency);
- mRequest.setOnClickListener(new OnClickListener() {
+
+ mNetworkRequestRelease = view.findViewById(R.id.requestReleaseButton);
+ mNetworkRequestRelease.setEnabled(false);
+ mNetworkRequestRelease.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
- mProfileCheckNetworkCallback = new NetworkCallback() {
- @Override
- public void onAvailable(final Network network) {
- Log.d("PrioritizeLatency", "onAvailable + " + network);
- mNetwork = network;
- }
- };
- NetworkRequest.Builder builder = new NetworkRequest.Builder();
- builder.addCapability(NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY);
- mConnectivityManager.requestNetwork(builder.build(), mProfileCheckNetworkCallback);
- Log.d("PrioritizeLatency", "onClick + " + builder.build());
+ Log.d(LOG_TAG, "Clicking Request/Release Network button");
+ onNetworkRequestReleaseClick();
}
});
+
mPing = view.findViewById(R.id.pinglatency);
+ mPing.setEnabled(false);
mPing.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
+ Log.d(LOG_TAG, "Clicking Ping button");
if (mNetwork != null) {
- //mNetwork.
- try {
- new RequestTask().ping(mNetwork);
- } catch (Exception e) {
- Log.d("SliceTest", "Exception: " + e);
- }
+ mFixedThreadPool.execute(() -> {
+ try {
+ RequestTask requestTask = new RequestTask();
+ requestTask.ping(mNetwork);
+ updateResultTextView("Result: Ping is done successfully!");
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "Exception at ping: " + e);
+ updateResultTextView("Result: Got exception with ping!!!");
+ }
+ });
}
}
});
return view;
}
+
+ private void onNetworkRequestReleaseClick() {
+ if (mNetwork == null) {
+ mProfileCheckNetworkCallback = new NetworkCallback() {
+ @Override
+ public void onAvailable(final Network network) {
+ Log.d(LOG_TAG, "onAvailable + " + network);
+ mNetwork = network;
+ updateUIOnNetworkAvailable();
+ }
+ };
+ NetworkRequest.Builder builder = new NetworkRequest.Builder();
+ builder.addCapability(NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY);
+ mConnectivityManager.requestNetwork(builder.build(),
+ mProfileCheckNetworkCallback);
+ Log.d(LOG_TAG, "Network Request/Release onClick + " + builder.build());
+ mResultTextView.setText(R.string.network_requested);
+ } else {
+ try {
+ mConnectivityManager.unregisterNetworkCallback(
+ mProfileCheckNetworkCallback);
+ mNetwork = null;
+ mNetworkRequestRelease.setText(R.string.request_network);
+ mResultTextView.setText(R.string.network_released);
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "Exception when releasing network: " + e);
+ mResultTextView.setText(R.string.network_release_failed);
+ }
+ }
+ }
+
+ @TargetApi(34)
+ private void onPurchaseButtonClick() {
+ try {
+ if (mTelephonyManager.isPremiumCapabilityAvailableForPurchase(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY)) {
+ LinkedBlockingQueue<Integer> purchaseRequest = new LinkedBlockingQueue<>(1);
+
+ // Try to purchase the capability
+ mTelephonyManager.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY,
+ mFixedThreadPool, purchaseRequest::offer);
+ mResultTextView.setText(R.string.purchase_in_progress);
+
+ mFixedThreadPool.execute(() -> {
+ try {
+ Integer result = purchaseRequest.poll(
+ TIMEOUT_FOR_PURCHASE, TimeUnit.SECONDS);
+ if (result == null) {
+ updateResultTextView(R.string.purchase_empty_result);
+ Log.d(LOG_TAG, "Got null result at purchasePremiumCapability");
+ return;
+ }
+
+ String purchaseResultText = "Result: "
+ + purchasePremiumResultToText(result.intValue());
+ updateResultTextView(purchaseResultText);
+ Log.d(LOG_TAG, purchaseResultText);
+
+ if (isPremiumCapacityAvailableForUse(result.intValue())) {
+ updateNetworkRequestReleaseButton(true);
+ }
+ } catch (InterruptedException e) {
+ Log.e(LOG_TAG, "InterruptedException at onPurchaseButtonClick: " + e);
+ updateResultTextView(R.string.purchase_exception);
+ }
+ });
+ } else {
+ mResultTextView.setText(R.string.premium_not_available);
+ }
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "Exception when purchasing network premium: " + e);
+ mResultTextView.setText(R.string.purchase_exception);
+ }
+ }
+
+ private void updateNetworkRequestReleaseButton(boolean enabled) {
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mNetworkRequestRelease.setEnabled(enabled);
+ }
+ });
+ }
+
+ private void updateResultTextView(int status) {
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mResultTextView.setText(status);
+ }
+ });
+ }
+
+ private void updateResultTextView(String status) {
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mResultTextView.setText(status);
+ }
+ });
+ }
+
+ private void updateUIOnNetworkAvailable() {
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mPing.setEnabled(true);
+ mNetworkRequestRelease.setText(R.string.release_network);
+ mResultTextView.setText(R.string.network_available);
+ }
+ });
+ }
+
+ private String purchasePremiumResultToText(int result) {
+ switch (result) {
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS:
+ return "Success";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED:
+ return "Throttled";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED:
+ return "Already purchased";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS:
+ return "Already in progress";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_OVERRIDDEN:
+ return "Overridden";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED:
+ return "User canceled";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_DISABLED:
+ return "Carrier disabled";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR:
+ return "Carrier error";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT:
+ return "Timeout";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_FEATURE_NOT_SUPPORTED:
+ return "Feature not supported";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_NOT_AVAILABLE:
+ return "Network not available";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_ENTITLEMENT_CHECK_FAILED:
+ return "Entitlement check failed";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_DEFAULT_DATA_SUBSCRIPTION:
+ return "Not default data subscription";
+ case PURCHASE_PREMIUM_CAPABILITY_RESULT_PENDING_NETWORK_SETUP:
+ return "Pending network setup";
+ default:
+ String errorStr = "Unknown purchasing result " + result;
+ Log.e(LOG_TAG, errorStr);
+ return errorStr;
+ }
+ }
+
+ private boolean isPremiumCapacityAvailableForUse(int purchaseResult) {
+ if (purchaseResult == PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS
+ || purchaseResult == PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED) {
+ return true;
+ }
+ return false;
+ }
}
diff --git a/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/RequestTask.java b/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/RequestTask.java
index 3849860..569c066 100644
--- a/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/RequestTask.java
+++ b/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/RequestTask.java
@@ -19,11 +19,11 @@
import android.os.AsyncTask;
import android.util.Log;
-import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
+import java.util.Scanner;
class RequestTask extends AsyncTask<Network, Integer, Integer> {
protected Integer doInBackground(Network... network) {
@@ -35,6 +35,7 @@
try {
url = new URL("http://www.google.com");
} catch (Exception e) {
+ Log.d("SliceTest", "exception: " + e);
}
if (url != null) {
try {
@@ -58,7 +59,8 @@
try {
InputStream inputStream = connection.getInputStream();
Log.d("httpGet", "httpUrl + " + httpUrl);
- return new BufferedInputStream(inputStream).toString();
+ Scanner scanner = new Scanner(inputStream).useDelimiter("\\A");
+ return scanner.hasNext() ? scanner.next() : "";
} finally {
connection.disconnect();
}
diff --git a/testapps/TestSliceApp/app/src/main/res/layout/activity_main.xml b/testapps/TestSliceApp/app/src/main/res/layout/activity_main.xml
index a723e6f..8a7d991 100644
--- a/testapps/TestSliceApp/app/src/main/res/layout/activity_main.xml
+++ b/testapps/TestSliceApp/app/src/main/res/layout/activity_main.xml
@@ -6,7 +6,6 @@
android:layout_height="match_parent"
tools:context=".MainActivity" >
<androidx.fragment.app.FragmentContainerView
- xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/frameLayoutMainFrag"
diff --git a/testapps/TestSliceApp/app/src/main/res/layout/fragment_c_b_s.xml b/testapps/TestSliceApp/app/src/main/res/layout/fragment_c_b_s.xml
index 5305b53..eff68ac 100644
--- a/testapps/TestSliceApp/app/src/main/res/layout/fragment_c_b_s.xml
+++ b/testapps/TestSliceApp/app/src/main/res/layout/fragment_c_b_s.xml
@@ -17,7 +17,7 @@
android:id="@+id/textView3"
android:layout_width="342dp"
android:layout_height="49dp"
- android:text="CBS"
+ android:text="@string/cbs_title"
tools:layout_editor_absoluteX="19dp"
tools:layout_editor_absoluteY="7dp" />
<Button
@@ -25,7 +25,7 @@
android:layout_width="186dp"
android:layout_height="57dp"
android:layout_marginTop="164dp"
- android:text="Request Network"
+ android:text="@string/request_network"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="112dp" />
<Button
@@ -33,14 +33,14 @@
android:layout_width="187dp"
android:layout_height="61dp"
android:layout_marginTop="124dp"
- android:text="Release Network"
+ android:text="@string/release_network"
app:layout_constraintTop_toBottomOf="@+id/requestcbs"
tools:layout_editor_absoluteX="119dp" />
<Button
android:id="@+id/pingcbs"
android:layout_width="186dp"
android:layout_height="55dp"
- android:text="Ping"
+ android:text="@string/ping"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/releasecbs"
tools:layout_editor_absoluteX="120dp" />
diff --git a/testapps/TestSliceApp/app/src/main/res/layout/fragment_main.xml b/testapps/TestSliceApp/app/src/main/res/layout/fragment_main.xml
index 11e95a8..5c12075 100644
--- a/testapps/TestSliceApp/app/src/main/res/layout/fragment_main.xml
+++ b/testapps/TestSliceApp/app/src/main/res/layout/fragment_main.xml
@@ -5,18 +5,17 @@
android:layout_height="match_parent"
tools:context=".MainFragment">
- <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ <androidx.constraintlayout.widget.ConstraintLayout
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:id="@+id/frameLayoutMain"
tools:context=".MainActivity">
<Button
android:id="@+id/cbs"
- android:layout_width="222dp"
- android:layout_height="51dp"
- android:text="CBS"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/cbs_title"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.493"
@@ -25,9 +24,9 @@
app:layout_constraintVertical_bias="0.751" />
<Button
android:id="@+id/latency"
- android:layout_width="222dp"
- android:layout_height="46dp"
- android:text="PRIORITIZE LATENCY"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/latency_title"
app:layout_constraintBottom_toTopOf="@+id/cbs"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
@@ -38,7 +37,7 @@
android:id="@+id/bw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="PRIORITIZE BANDWIDTH"
+ android:text="@string/bw_title"
app:layout_constraintBottom_toTopOf="@+id/latency"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
diff --git a/testapps/TestSliceApp/app/src/main/res/layout/fragment_prioritize_bandwidth.xml b/testapps/TestSliceApp/app/src/main/res/layout/fragment_prioritize_bandwidth.xml
index 8933e7a..412ec39 100644
--- a/testapps/TestSliceApp/app/src/main/res/layout/fragment_prioritize_bandwidth.xml
+++ b/testapps/TestSliceApp/app/src/main/res/layout/fragment_prioritize_bandwidth.xml
@@ -8,9 +8,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/frameLayoutBW">
-<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"
+<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/frameLayout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -19,7 +17,7 @@
android:id="@+id/textView2"
android:layout_width="371dp"
android:layout_height="52dp"
- android:text="Prioritize Bandwidth"
+ android:text="@string/bw_title"
tools:layout_editor_absoluteX="20dp"
tools:layout_editor_absoluteY="4dp" />
<Button
@@ -27,7 +25,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="64dp"
- android:text="Release Network"
+ android:text="@string/release_network"
app:layout_constraintBottom_toTopOf="@+id/requestbw"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@@ -38,7 +36,7 @@
android:layout_width="182dp"
android:layout_height="42dp"
android:layout_marginBottom="228dp"
- android:text="Ping"
+ android:text="@string/ping"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.493"
@@ -48,7 +46,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="308dp"
- android:text="RequestNetwork"
+ android:text="@string/request_network"
app:layout_constraintBottom_toTopOf="@+id/pingbw"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.495"
diff --git a/testapps/TestSliceApp/app/src/main/res/layout/fragment_prioritize_latency.xml b/testapps/TestSliceApp/app/src/main/res/layout/fragment_prioritize_latency.xml
index b040995..37a519f 100644
--- a/testapps/TestSliceApp/app/src/main/res/layout/fragment_prioritize_latency.xml
+++ b/testapps/TestSliceApp/app/src/main/res/layout/fragment_prioritize_latency.xml
@@ -14,44 +14,52 @@
android:layout_height="match_parent"
tools:context=".PrioritizeLatency">
<Button
- android:id="@+id/requestlatency"
- android:layout_width="183dp"
+ android:id="@+id/purchaseButton"
+ android:layout_width="233dp"
android:layout_height="50dp"
android:layout_marginTop="176dp"
- android:text="RequestNetwork"
- app:layout_constraintBottom_toTopOf="@+id/button6"
+ android:text="@string/purchase"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.495"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.717" />
<Button
- android:id="@+id/releaselatency"
+ android:id="@+id/requestReleaseButton"
android:layout_width="183dp"
android:layout_height="50dp"
android:layout_marginTop="84dp"
- android:text="ReleaseNetwork"
- app:layout_constraintBottom_toTopOf="@+id/button6"
+ android:text="@string/request_network"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/requestlatency"
+ app:layout_constraintTop_toBottomOf="@+id/purchaseButton"
app:layout_constraintVertical_bias="0.717" />
<Button
android:id="@+id/pinglatency"
android:layout_width="182dp"
android:layout_height="42dp"
android:layout_marginBottom="92dp"
- android:text="Ping"
+ android:text="@string/ping"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.493"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/releaselatency" />
+ app:layout_constraintTop_toBottomOf="@+id/requestReleaseButton" />
+ <TextView
+ android:id="@+id/resultTextView"
+ android:layout_width="283dp"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="84dp"
+ android:text="@string/result_prefix"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/pinglatency"
+ app:layout_constraintVertical_bias="0.717" />
<TextView
android:id="@+id/textView"
android:layout_width="371dp"
android:layout_height="52dp"
- android:text="Prioritize Latency"
+ android:text="@string/latency_title"
tools:layout_editor_absoluteX="16dp"
tools:layout_editor_absoluteY="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-af/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-af/strings.xml
index d172f0f..5e2a27f 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-af/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-af/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hallo leë fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Versoek netwerk"</string>
+ <string name="release_network" msgid="174252378593535238">"Stel netwerk vry"</string>
+ <string name="ping" msgid="7890607576220714932">"Pieng"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Resultaat:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritiseer traagheid"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritiseer bandwydte"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Koop netwerkpremium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Resultaat: Die netwerk wat versoek is, is nou beskikbaar!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Resultaat: Die netwerk is versoek!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Resultaat: Die netwerk is vrygestel!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Resultaat: Kon nie die netwerk vrystel nie!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Resultaat: Uitsondering wanneer netwerkpremium gekoop word!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Resultaat: Het leë resultaat gekry toe netwerkpremium gekoop is!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Resultaat: Die netwerkpremium kan nie gekoop word nie!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Resultaat: Die netwerkpremium word tans gekoop …"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-am/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-am/strings.xml
index 229ff5d..ff5e8fa 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-am/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-am/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"አውታረ መረብ ይጠይቁ"</string>
+ <string name="release_network" msgid="174252378593535238">"አውታረ መረብ ይልቀቁ"</string>
+ <string name="ping" msgid="7890607576220714932">"ፒንግ"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"ውጤት፦"</string>
+ <string name="latency_title" msgid="963052613947017009">"ለስርዓተ ምላሽ ጊዜ ቅድሚያ ይስጡ"</string>
+ <string name="bw_title" msgid="3902162973688221344">"ለመተላለፊያ ይዘት ቅድሚያ ይስጡ"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"የአውታረ መረብ Premiumን ይግዙ"</string>
+ <string name="network_available" msgid="4780293262690730734">"ውጤት፦ የተጠየቀው አውታረ መረብ አሁን ይገኛል!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"ውጤት፦ አውታረ መረቡ ተጠይቋል!"</string>
+ <string name="network_released" msgid="2992280481133877025">"ውጤት፦ አውታረ መረቡ ተለቅቋል!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"ውጤት፦ አውታረ መረቡን መልቀቅ አልተሳካም!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"ውጤት፦የአውታረ መረብ premium በሚገዛበት ጊዜ ያለ ለየት ያለ!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"ውጤት፦የአውታረ መረብ premium በሚገዛበት ጊዜ ባዶ ውጤት ተገኝቷል!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"ውጤት፦የአውታረ መረቡ premium ለግዢ አይገኝም!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"ውጤት፦ የአውታረ መረብ premium ግዢ በሂደት ላይ ነው ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ar/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ar/strings.xml
index 0cadb81..25fa479 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ar/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ar/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"جزء فارغ للترحيب"</string>
+ <string name="request_network" msgid="8945235490804849914">"طلب الشبكة"</string>
+ <string name="release_network" msgid="174252378593535238">"إطلاق الإصدار"</string>
+ <string name="ping" msgid="7890607576220714932">"فحص الاتصال"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"النتيجة:"</string>
+ <string name="latency_title" msgid="963052613947017009">"منح الأولوية لوقت الاستجابة"</string>
+ <string name="bw_title" msgid="3902162973688221344">"منح الأولوية لمعدّل نقل البيانات"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"شراء الاشتراك المميّز في الشبكة"</string>
+ <string name="network_available" msgid="4780293262690730734">"النتيجة: الشبكة المطلوبة متاحة الآن."</string>
+ <string name="network_requested" msgid="5646123922691865991">"النتيجة: تم طلب الشبكة."</string>
+ <string name="network_released" msgid="2992280481133877025">"النتيجة: تم إطلاق الشبكة."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"النتيجة: تعذَّر إطلاق الشبكة."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"النتيجة: حدث استثناء عند شراء اشتراك مميّز في الشبكة."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"النتيجة: لقد حصلْت على نتيجة فارغة عند شراء اشتراك مميّز في الشبكة."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"النتيجة: لا تتوفّر إمكانية شراء الاشتراك المميّز في الشبكة."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"النتيجة: عملية شراء الاشتراك المميّز في الشبكة جارية ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-as/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-as/strings.xml
index 229ff5d..350d8dd 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-as/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-as/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"নেটৱৰ্কৰ বাবে অনুৰোধ কৰক"</string>
+ <string name="release_network" msgid="174252378593535238">"নেটৱৰ্ক মুকলি কৰক"</string>
+ <string name="ping" msgid="7890607576220714932">"পিং"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"ফলাফল:"</string>
+ <string name="latency_title" msgid="963052613947017009">"বিলম্বতাক অগ্ৰাধিকাৰ দিয়ক"</string>
+ <string name="bw_title" msgid="3902162973688221344">"বেণ্ডৱিথক অগ্ৰাধিকাৰ দিয়ক"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"নেটৱৰ্ক প্ৰিমিয়াম ক্ৰয় কৰক"</string>
+ <string name="network_available" msgid="4780293262690730734">"ফলাফল: অনুৰোধ কৰা নেটৱৰ্কটো বৰ্তমান উপলব্ধ নহয়!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"ফলাফল: নেটৱৰ্কটোৰ বাবে অনুৰোধ কৰা হৈছে!"</string>
+ <string name="network_released" msgid="2992280481133877025">"ফলাফল: নেটৱৰ্কটো মুকলি কৰি দিয়া হৈছে!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"ফলাফল: নেটৱৰ্কটো মুকলি কৰি দিয়াত বিফল হৈছে!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"ফলাফল: নেটৱৰ্ক প্ৰিমিয়াম ক্ৰয় কৰাৰ সময়ত ব্যতিক্ৰম!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"ফলাফল: নেটৱৰ্ক প্ৰিমিয়াম ক্ৰয় কৰাৰ সময়ত খালী ফলাফল পোৱা গৈছে!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"ফলাফল: ক্ৰয় কৰিবলৈ নেটৱৰ্ক প্ৰিমিয়াম উপলব্ধ নহয়!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"ফলাফল: নেটৱৰ্ক প্ৰিমিয়াম ক্ৰয় কৰাৰ প্ৰক্ৰিয়া চলি আছে ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-az/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-az/strings.xml
index 3702d56..8d09fb9 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-az/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-az/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Boş salamlama fraqmenti"</string>
+ <string name="request_network" msgid="8945235490804849914">"Şəbəkə sorğusu göndərin"</string>
+ <string name="release_network" msgid="174252378593535238">"Şəbəkə ilə əlaqəni kəsin"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Nəticə:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Gecikməni prioritetləşdirin"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Ötürmə sürətini prioritetləşdirin"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Premium şəbəkə satın alın"</string>
+ <string name="network_available" msgid="4780293262690730734">"Nəticə: Tələb olunan şəbəkə indi əlçatandır!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Nəticə: Şəbəkə sorğusu göndərildi!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Nəticə: Şəbəkə ilə əlaqə kəsildi!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Nəticə: Şəbəkə ilə əlaqəni kəsmək alınmadı!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Nəticə: Premium şəbəkə satın alan zaman istisna baş verdi!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Nəticə: Premium şəbəkə satın alan zaman boş nəticə əldə edildi!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Nəticə: Premium şəbəkə satın almaq mümkün deyil!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Nəticə: Premium şəbəkə satın almaq prosesi davam edir ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-b+sr+Latn/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-b+sr+Latn/strings.xml
index 229ff5d..2ca99d3 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-b+sr+Latn/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-b+sr+Latn/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Zatražite mrežu"</string>
+ <string name="release_network" msgid="174252378593535238">"Objavite mrežu"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Rezultat:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Dajte prioritet kašnjenju"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Dajte prioritet propusnom opsegu"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Kupite Premium mrežu"</string>
+ <string name="network_available" msgid="4780293262690730734">"Rezultat: Zahtevana mreža je trenutno dostupna!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Rezultat: Mreža je zatražena!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Rezultat: Mreža je objavljena!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Rezultat: Objavljivanje mreže nije uspelo!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Rezultat: Izuzetak pri kupovini Premium mreže!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Rezultat: Rezultat je prazan kada kupujete Premium mrežu!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Rezultat: Premium mreža nije dostupna za kupovinu!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Rezultat: Kupovina Premium mreže je u toku..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-be/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-be/strings.xml
index 385f84e..4b8a613 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-be/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-be/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Вітаем,"</string>
+ <string name="request_network" msgid="8945235490804849914">"Запытаць сетку"</string>
+ <string name="release_network" msgid="174252378593535238">"Вызваліць сетку"</string>
+ <string name="ping" msgid="7890607576220714932">"Пінг"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Вынік:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Аддаванне прыярытэту затрымцы"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Аддаванне прыярытэту паласе прапускання"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Купіць прэміяльную падпіску на выкарыстанне сеткі"</string>
+ <string name="network_available" msgid="4780293262690730734">"Вынік: запытаная сетка даступная!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Вынік: сетка запытана!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Вынік: сетка вызвалена!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Вынік: не ўдалося вызваліць сетку!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Вынік: пры спробе купіць прэміяльную падпіску на выкарыстанне сеткі ўзнікла выключэнне!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Вынік: пры спробе купіць прэміяльную падпіску на выкарыстанне сеткі атрыманы пусты вынік!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Вынік: прэміяльная падпіска на выкарыстанне сеткі недаступная для куплі!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Вынік: выконваецца купля прэміяльнай падпіскі на выкарыстанне сеткі..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-bg/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-bg/strings.xml
index 943a70d..b2951f9 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-bg/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-bg/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Здравей, празен фрагмент"</string>
+ <string name="request_network" msgid="8945235490804849914">"Заявка за мрежа"</string>
+ <string name="release_network" msgid="174252378593535238">"Освобождаване на мрежата"</string>
+ <string name="ping" msgid="7890607576220714932">"Команда ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Резултат:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Даване на приоритет на забавянето"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Даване на приоритет на пропускателната способност"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Купете Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Резултат: Заявената мрежа е достъпна сега!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Резултат: Мрежата е заявена!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Резултат: Мрежата е освободена!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Резултат: Мрежата не бе освободена!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Резултат: Изключение при покупка на Network Premium!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Резултат: При покупката на Network Premium получихте празен резултат."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Резултат: Network Premium не е налице за покупка!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Резултат: Network Premium се купува..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-bn/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-bn/strings.xml
index 229ff5d..5280d16 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-bn/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-bn/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Network সংক্রান্ত অনুরোধ করুন"</string>
+ <string name="release_network" msgid="174252378593535238">"Network রিলিজ করুন"</string>
+ <string name="ping" msgid="7890607576220714932">"পিং"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"ফলাফল:"</string>
+ <string name="latency_title" msgid="963052613947017009">"লেটেন্সিকে অগ্রাধিকার দিন"</string>
+ <string name="bw_title" msgid="3902162973688221344">"ব্যান্ডউইথকে অগ্রাধিকার দিন"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Network Premium কিনুন"</string>
+ <string name="network_available" msgid="4780293262690730734">"ফলাফল: অনুরোধ করা নেটওয়ার্ক এখন উপলভ্য আছে!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"ফলাফল: নেটওয়ার্কের জন্য অনুরোধ জানানো হয়েছে!"</string>
+ <string name="network_released" msgid="2992280481133877025">"ফলাফলt: নেটওয়ার্ক রিলিজ করা হয়েছে!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"ফলাফল: নেটওয়ার্ক রিলিজ করা যায়নি!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"ফলাফল: Network Premium কেনার সময় ব্যতিক্রম!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"ফলাফল: Network Premium কেনার সময় কোনও ফলাফল পাওয়া যায়নি!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"ফলাফল: Network Premium কেনার জন্য উপলভ্য নেই!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"ফলাফল: Network Premium কেনার প্রক্রিয়া চলছে ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-bs/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-bs/strings.xml
index 229ff5d..e2ea203 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-bs/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-bs/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Zatraži mrežu"</string>
+ <string name="release_network" msgid="174252378593535238">"Otključaj mrežu"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Rezultat:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Dodijeli prioritet latentnosti"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Dodijeli prioritet propusnosti"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Kupite premium verziju mreže"</string>
+ <string name="network_available" msgid="4780293262690730734">"Rezultat: zatražena mreža je sada dostupna."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Rezultat: mreža je zatražena."</string>
+ <string name="network_released" msgid="2992280481133877025">"Rezultat: mreža je otključana."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Rezultat: otključavanje mreže nije uspjelo."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Rezultat: izuzetak prilikom kupovine premium verzije mreže."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Rezultat: dobijen je prazan rezultat prilikom kupovine premium verzije mreže."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Rezultat: premium verzija mreže nije dostupna za kupovinu."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Rezultat: kupovina premium verzije mreže je u toku…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ca/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ca/strings.xml
index 9799d39..05529e3 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ca/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ca/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Fragment de benvinguda en blanc"</string>
+ <string name="request_network" msgid="8945235490804849914">"Sol·licita la xarxa"</string>
+ <string name="release_network" msgid="174252378593535238">"Allibera la xarxa"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Resultat:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritza la latència"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritza l\'amplada de banda"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Compra la xarxa prèmium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Resultat: la xarxa sol·licitada ja està disponible."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Resultat: s\'ha sol·licitat la xarxa."</string>
+ <string name="network_released" msgid="2992280481133877025">"Resultat: s\'ha alliberat la xarxa."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Resultat: no s\'ha pogut alliberar la xarxa."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Resultat: s\'ha produït una excepció en comprar la xarxa prèmium."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Resultat: s\'ha obtingut un resultat buit en comprar la xarxa prèmium."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Resultat: la xarxa prèmium no es pot comprar."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Resultat: la compra de la xarxa prèmium està en curs..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-cs/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-cs/strings.xml
index 793ab6f..d25f77d 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-cs/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-cs/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Prázdný fragment pro pozdrav"</string>
+ <string name="request_network" msgid="8945235490804849914">"Odeslat požadavek na síť"</string>
+ <string name="release_network" msgid="174252378593535238">"Uvolnit síť"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Výsledek:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Upřednostnit latenci"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Upřednostnit rychlost připojení"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Pořiďte si bonus k síti"</string>
+ <string name="network_available" msgid="4780293262690730734">"Výsledek: Požadovaná síť je teď dostupná."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Výsledek: Byl odeslán požadavek na síť."</string>
+ <string name="network_released" msgid="2992280481133877025">"Výsledek: Síť byla uvolněna."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Výsledek: Síť se nepodařilo uvolnit."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Výsledek: Výjimka při nákupu bonusu k síti."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Výsledek: Při nákupu bonusu k síti se vrátil prázdný výsledek."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Výsledek: Bonus k síti není k prodeji."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Výsledek: Probíhá nákup bonusu k síti…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-da/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-da/strings.xml
index 229ff5d..6e074c2 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-da/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-da/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Anmod om tv-kanal"</string>
+ <string name="release_network" msgid="174252378593535238">"Udgiv tv-kanal"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Resultat:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioriter forsinkelse"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioriter båndbredde"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Køb Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Resultat: Den tv-kanal, der blev anmodet om, er tilgængelig nu!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Resultat: Der blev anmodet om tv-kanalen!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Resultat: Tv-kanalen er blevet udgivet!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Resultat: Tv-kanalen kunne ikke udgives!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Resultat: Undtagen, når du køber Network Premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Resultat: Der blev vist et tomt resultat ved køb af Network Premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Resultat: Network Premium kan ikke købes!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Resultat: Købet af Network Premium er i gang…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-de/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-de/strings.xml
index 229ff5d..4ff4b5f 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-de/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-de/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Netzwerk anfragen"</string>
+ <string name="release_network" msgid="174252378593535238">"Netzwerk freigeben"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Ergebnis:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Latenz priorisieren"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Bandbreite priorisieren"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Premium-Netzwerk erwerben"</string>
+ <string name="network_available" msgid="4780293262690730734">"Ergebnis: Das gewünschte Netzwerk ist jetzt verfügbar."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Ergebnis: Das Netzwerk wurde angefordert."</string>
+ <string name="network_released" msgid="2992280481133877025">"Ergebnis: Das Netzwerk wurde freigegeben."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Ergebnis: Netzwerk konnte nicht freigegeben werden."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Ergebnis: Ausnahme beim Kauf des Premium-Netzwerks."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Ergebnis: Beim Kauf des Premium-Netzwerks wurde ein leeres Ergebnis zurückgegeben."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Ergebnis: Premium-Netzwerk kann nicht erworben werden."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Ergebnis: Der Kauf des Premium-Netzwerks läuft..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-el/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-el/strings.xml
index 229ff5d..0d39d8b 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-el/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-el/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Υποβολή αιτήματος για δίκτυο"</string>
+ <string name="release_network" msgid="174252378593535238">"Κυκλοφορία δικτύου"</string>
+ <string name="ping" msgid="7890607576220714932">"Εφαρμογή Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Αποτέλεσμα:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Προτεραιότητα λανθάνοντος χρόνου"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Προτεραιότητα εύρους ζώνης"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Αγορά επιπλέον χρέωσης δικτύου"</string>
+ <string name="network_available" msgid="4780293262690730734">"Αποτέλεσμα: Το δίκτυο που ζητήθηκε είναι πλέον διαθέσιμο!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Αποτέλεσμα: Υποβλήθηκε αίτημα για το δίκτυο!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Αποτέλεσμα: Το δίκτυο κυκλοφόρησε!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Αποτέλεσμα: Αποτυχία κυκλοφορίας του δικτύου!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Αποτέλεσμα: Εξαίρεση κατά την αγορά δικτύου με επιπλέον χρέωση!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Αποτέλεσμα: Εμφανίστηκε κενό αποτέλεσμα κατά την αγορά δικτύου με επιπλέον χρέωση!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Αποτέλεσμα: Η επιπλέον χρέωση του δικτύου δεν είναι διαθέσιμη για αγορά!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Αποτέλεσμα: Η αγορά δικτύου με επιπλέον χρέωση βρίσκεται σε εξέλιξη …"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-en-rAU/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-en-rAU/strings.xml
index 229ff5d..fbb98d6 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-en-rAU/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-en-rAU/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Request network"</string>
+ <string name="release_network" msgid="174252378593535238">"Release network"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritise latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritise bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Purchase network premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-en-rCA/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-en-rCA/strings.xml
index 229ff5d..a5c81f6 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-en-rCA/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-en-rCA/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Request Network"</string>
+ <string name="release_network" msgid="174252378593535238">"Release Network"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritize Latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritize Bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Purchase Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-en-rGB/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-en-rGB/strings.xml
index 229ff5d..fbb98d6 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-en-rGB/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-en-rGB/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Request network"</string>
+ <string name="release_network" msgid="174252378593535238">"Release network"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritise latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritise bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Purchase network premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-en-rIN/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-en-rIN/strings.xml
index 229ff5d..fbb98d6 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-en-rIN/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-en-rIN/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Request network"</string>
+ <string name="release_network" msgid="174252378593535238">"Release network"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritise latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritise bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Purchase network premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-en-rXC/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-en-rXC/strings.xml
index dafc7d2..a24b28a 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-en-rXC/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-en-rXC/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Request Network"</string>
+ <string name="release_network" msgid="174252378593535238">"Release Network"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritize Latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritize Bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Purchase Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-es-rUS/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-es-rUS/strings.xml
index 229ff5d..39b1338 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-es-rUS/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-es-rUS/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Solicitar red"</string>
+ <string name="release_network" msgid="174252378593535238">"Publicar red"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Resultado:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioriza la latencia"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioriza el ancho de banda"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Comprar red premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Resultado: Ya está disponible la red solicitada."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Resultado: Se solicitó la red."</string>
+ <string name="network_released" msgid="2992280481133877025">"Resultado: Se liberó la red."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Resultado: No se pudo liberar la red."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Resultado: Excepción cuando se compra la red premium."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Resultado: Se obtuvo un resultado vacío durante la compra de la red premium."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Resultado: La red premium no está disponible para comprarse."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Resultado: La compra de la red premium está en curso…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-es/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-es/strings.xml
index 355b912..8f46501 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-es/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-es/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hola, (segmento en blanco):"</string>
+ <string name="request_network" msgid="8945235490804849914">"Solicitar red"</string>
+ <string name="release_network" msgid="174252378593535238">"Lanzar red"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Resultado:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Priorizar latencia"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Priorizar ancho de banda"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Comprar red premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Resultado: la red solicitada ya está disponible."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Resultado: se ha solicitado la red."</string>
+ <string name="network_released" msgid="2992280481133877025">"Resultado: la red se ha lanzado."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Resultado: no se ha podido lanzar la red."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Resultado: excepción al comprar la red premium."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Resultado: se ha obtenido un resultado vacío al comprar la red premium."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Resultado: no se puede comprar la red premium."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Resultado: la compra de la red premium está en curso..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-et/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-et/strings.xml
index 229ff5d..f5ff262 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-et/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-et/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Request Network"</string>
+ <string name="release_network" msgid="174252378593535238">"Release Network"</string>
+ <string name="ping" msgid="7890607576220714932">"Kõll"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Tulemus:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritize Latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritize Bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Purchase Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-eu/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-eu/strings.xml
index 229ff5d..ce566a1 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-eu/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-eu/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Eskatu sarea"</string>
+ <string name="release_network" msgid="174252378593535238">"Askatu sarea"</string>
+ <string name="ping" msgid="7890607576220714932">"Egin ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Emaitza:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Eman lehentasuna latentziari"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Eman lehentasuna banda-zabalerari"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Erosi sarearen premium bertsioa"</string>
+ <string name="network_available" msgid="4780293262690730734">"Emaitza: eskatutako sarea erabilgarri dago orain!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Emaitza: eskatu da sarea!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Emaitza: askatu da sarea!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Emaitza: ezin izan da askatu sarea!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Emaitza: salbuespena sarearen premium bertsioa erostean!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Emaitza: hutsik dauden emaitzak lortu dira sarearen premium bertsioa erostean!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Emaitza: ezin da erosi sarearen premium bertsioa!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Emaitza: abian da sarearen premium bertsioa erosteko prozesua…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-fa/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-fa/strings.xml
index 6f35108..5a51eaa 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-fa/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-fa/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"سلام بخش خالی"</string>
+ <string name="request_network" msgid="8945235490804849914">"درخواست شبکه"</string>
+ <string name="release_network" msgid="174252378593535238">"انتشار شبکه"</string>
+ <string name="ping" msgid="7890607576220714932">"پینگ"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"نتیجه:"</string>
+ <string name="latency_title" msgid="963052613947017009">"اولویتبندی تأخیر"</string>
+ <string name="bw_title" msgid="3902162973688221344">"اولویتبندی پهنای باند"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"خرید حساب ممتاز شبکه"</string>
+ <string name="network_available" msgid="4780293262690730734">"نتیجه: شبکه درخواستشده اکنون دردسترس است!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"نتیجه: شبکه درخواست شد!"</string>
+ <string name="network_released" msgid="2992280481133877025">"نتیجه: شبکه منتشر شد!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"نتیجه: شبکه منتشر نشد!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"نتیجه: هنگام خرید حساب ممتاز شبکهْ استثنائی پیش میآید!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"نتیجه: هنگام تلاش برای خرید حساب ممتاز شبکه نتیجه خالی برگردانده میشود!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"نتیجه: حساب ممتاز شبکه برای خرید دردسترس نیست!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"نتیجه: خرید حساب ممتاز شبکه درحال انجام است…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-fi/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-fi/strings.xml
index 229ff5d..df8ce6b 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-fi/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-fi/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Pyydä verkkoa"</string>
+ <string name="release_network" msgid="174252378593535238">"Vapauta verkko"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Tulos:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Priorisoi viive"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Priorisoi kaistanleveys"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Osta Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Tulos: Pyydetty verkko on nyt käytettävissä!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Tulos: Verkkoa on pyydetty!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Tulos: Verkko on vapautettu!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Tulos: Verkon vapautus epäonnistui!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Tulos: Poikkeus Network Premiumia ostettaessa!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Tulos: Tyhjä tulos Network Premiumia ostettaessa!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Tulos: Network Premium ei ole ostettavissa!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Tulos: Network Premiumin osto on käynnissä..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-fr-rCA/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-fr-rCA/strings.xml
index 229ff5d..70a891b 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-fr-rCA/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-fr-rCA/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Réseau de demande"</string>
+ <string name="release_network" msgid="174252378593535238">"Réseau de diffusion"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Résultat :"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioriser la latence"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioriser la bande passante"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Acheter le réseau Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Résultat : Le réseau demandé est maintenant disponible!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Résultat : Le réseau a été demandé!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Résultat : Le réseau est publié!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Résultat : Échec de la publication du réseau!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Résultat : Exception lors de l\'achat du réseau premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Résultat : Aucun résultat lors de l\'achat du réseau Premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Résultat : Le réseau Premium n\'est pas offert à l\'achat!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Résultat : L\'achat du réseau Premium est en cours…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-fr/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-fr/strings.xml
index e9b3b45..96d996b 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-fr/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-fr/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Bonjour fragment vierge"</string>
+ <string name="request_network" msgid="8945235490804849914">"Demander le réseau"</string>
+ <string name="release_network" msgid="174252378593535238">"Libérer le réseau"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Résultat :"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioriser la latence"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioriser la bande passante"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Souscrire au réseau premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Résultat : le réseau demandé est disponible."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Résultat : le réseau a été demandé."</string>
+ <string name="network_released" msgid="2992280481133877025">"Résultat : le réseau a été libéré."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Résultat : échec de la libération du réseau."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Résultat : une exception s\'est produite lors de la souscription au réseau premium."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Résultat : un résultat vide s\'est affiché lors de la souscription au réseau premium."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Résultat : le réseau premium n\'est pas disponible à l\'achat."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Résultat : la souscription au réseau premium est en cours…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-gl/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-gl/strings.xml
index 229ff5d..c505b21 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-gl/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-gl/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Solicitar rede"</string>
+ <string name="release_network" msgid="174252378593535238">"Liberar rede"</string>
+ <string name="ping" msgid="7890607576220714932">"Facer ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Resultado:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Darlle prioridade á latencia"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Darlle prioridade á largura de banda"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Comprar rede premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Resultado: A rede solicitada está dispoñible neste momento"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Resultado: Solicitouse a rede"</string>
+ <string name="network_released" msgid="2992280481133877025">"Resultado: Liberouse a rede"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Resultado: Produciuse un erro ao liberar a rede"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Resultado: Excepción ao comprar a rede premium"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Resultado: Recibiuse un resultado baleiro ao comprar a rede premium"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Resultado: A rede premium non está á venda"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Resultado: A compra da rede premium está en curso…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-gu/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-gu/strings.xml
index 229ff5d..675ac46 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-gu/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-gu/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"નેટવર્કની વિનંતી કરો"</string>
+ <string name="release_network" msgid="174252378593535238">"નેટવર્ક રિલીઝ કરો"</string>
+ <string name="ping" msgid="7890607576220714932">"પિંગ"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"પરિણામ:"</string>
+ <string name="latency_title" msgid="963052613947017009">"વિલંબતાને પ્રાધાન્યતા આપો"</string>
+ <string name="bw_title" msgid="3902162973688221344">"બૅન્ડવિડ્થને પ્રાધાન્યતા આપો"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Network Premium ખરીદો"</string>
+ <string name="network_available" msgid="4780293262690730734">"પરિણામ: વિનંતી કરવામાં આવેલું નેટવર્ક હવે ઉપલબ્ધ છે!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"પરિણામ: નેટવર્કની વિનંતી કરવામાં આવી છે!"</string>
+ <string name="network_released" msgid="2992280481133877025">"પરિણામ: નેટવર્ક રિલીઝ કરવામાં આવ્યું છે!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"પરિણામ: નેટવર્ક રિલીઝ કરવામાં નિષ્ફળ રહ્યાં!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"પરિણામ: network premium ખરીદતી વખતે અપવાદ!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"પરિણામ: network premium ખરીદતી વખતે ખાલી પરિણામ મળ્યું!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"પરિણામ: ખરીદી કરવા માટે network premium ઉપલબ્ધ નથી!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"પરિણામ: network premiumની ખરીદીની પ્રક્રિયા ચાલુ છે ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-hi/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-hi/strings.xml
index 229ff5d..0f13f68 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-hi/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-hi/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"नेटवर्क का अनुरोध करें"</string>
+ <string name="release_network" msgid="174252378593535238">"नेटवर्क रिलीज़ करें"</string>
+ <string name="ping" msgid="7890607576220714932">"पिंग करें"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"नतीजा:"</string>
+ <string name="latency_title" msgid="963052613947017009">"इंतज़ार के समय को प्राथमिकता दें"</string>
+ <string name="bw_title" msgid="3902162973688221344">"बैंडविड्थ को प्राथमिकता दें"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"नेटवर्क प्रीमियम खरीदें"</string>
+ <string name="network_available" msgid="4780293262690730734">"नतीजा: अनुरोध किया गया नेटवर्क अब उपलब्ध है!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"नतीजा: नेटवर्क के लिए अनुरोध किया गया है!"</string>
+ <string name="network_released" msgid="2992280481133877025">"नतीजा: नेटवर्क रिलीज़ हो गया है!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"नतीजा: नेटवर्क रिलीज़ नहीं किया जा सका!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"नतीजा: नेटवर्क प्रीमियम खरीदते समय अपवाद!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"नतीजा: नेटवर्क प्रीमियम खरीदते समय खाली नतीजा मिला!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"नतीजा: नेटवर्क प्रीमियम खरीदारी के लिए उपलब्ध नहीं है!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"नतीजा: नेटवर्क प्रीमियम खरीदारी चल रही है ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-hr/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-hr/strings.xml
index 229ff5d..dd4f3f5 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-hr/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-hr/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Zahtjev za mrežu"</string>
+ <string name="release_network" msgid="174252378593535238">"Otkazivanje mreže"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Rezultat:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prednost ima latencija"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prednost ima propusnost"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Kupnja premium sadržaja mreže"</string>
+ <string name="network_available" msgid="4780293262690730734">"Rezultat: zatražena mreža sada je dostupna!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Rezultat: mreža je zatražena!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Rezultat: mreža je otkazana!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Rezultat: otkazivanje mreže nije uspjelo!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Rezultat: iznimka pri kupnji premium sadržaja mreže!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Rezultat: dobiven je prazni rezultat pri kupnji premium sadržaja mreže!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Rezultat: premium sadržaj mreže nije dostupan za kupnju!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Rezultat: u tijeku je kupnja premium sadržaja mreže..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-hu/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-hu/strings.xml
index 0e73dba..524b271 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-hu/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-hu/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Üres üdvözlő rész"</string>
+ <string name="request_network" msgid="8945235490804849914">"Hálózat kérése"</string>
+ <string name="release_network" msgid="174252378593535238">"Hálózat felszabadítása"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Eredmény:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Várakozási idő előnyben"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Sávszélesség előnyben"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"A hálózati prémium megvásárlása"</string>
+ <string name="network_available" msgid="4780293262690730734">"Eredmény: A kért hálózat már rendelkezésre áll."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Eredmény: A hálózat igénylése megtörtént."</string>
+ <string name="network_released" msgid="2992280481133877025">"Eredmény: A hálózat felszabadult."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Eredmény: Nem sikerült felszabadítani a hálózatot."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Eredmény: Kivétel a hálózati prémium megvásárlásakor."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Eredmény: Üres eredmény érkezett vissza a hálózati prémium megvásárlásakor."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Eredmény: A hálózati prémium nem vásárolható meg."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Eredmény: A hálózati prémium megvásárlása folyamatban van..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-hy/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-hy/strings.xml
index 31a60c6..77ef65f 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-hy/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-hy/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Դատարկ հատված"</string>
+ <string name="request_network" msgid="8945235490804849914">"Ցանցն ազատելու հայտ ուղարկել"</string>
+ <string name="release_network" msgid="174252378593535238">"Ազատել ցանցը"</string>
+ <string name="ping" msgid="7890607576220714932">"Փինգ"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Արդյունքը՝"</string>
+ <string name="latency_title" msgid="963052613947017009">"Առաջնահերթություն տալ հապաղմանը"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Առաջնահերթություն տալ թողունակությանը"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Գնել ցանցի օգտագործման պրեմիում բաժանորդագրություն"</string>
+ <string name="network_available" msgid="4780293262690730734">"Արդյունքը՝ պահանջվող ցանցն այժմ հասանելի է։"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Արդյունքը՝ ցանցն ազատելու հայտն ուղարկվեց։"</string>
+ <string name="network_released" msgid="2992280481133877025">"Արդյունքը՝ ցանցն ազատվեց։"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Արդյունքը՝ չհաջողվեց ազատել ցանցը։"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Արդյունքը՝ ցանցի օգտագործման պրեմիում բաժանորդագրություն գնելու փորձի ժամանակ բացառություն է առաջացել։"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Արդյունքը՝ ցանցի օգտագործման պրեմիում բաժանորդագրություն գնելու փորձի ժամանակ ստացվել է դատարկ արդյունք։"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Արդյունքը՝ ցանցի օգտագործման պրեմիում բաժանորդագրությունը հասանելի չէ գնման համար։"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Արդյունքը՝ կատարվում է ցանցի օգտագործման պրեմիում բաժանորդագրության գնում ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-in/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-in/strings.xml
index 229ff5d..9e1aa19 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-in/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-in/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Meminta Jaringan"</string>
+ <string name="release_network" msgid="174252378593535238">"Melepaskan Jaringan"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Hasil:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Memprioritaskan Latensi"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Memprioritaskan Bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Membeli Jaringan Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Hasil: Jaringan yang diminta kini tersedia."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Hasil: Jaringan telah diminta."</string>
+ <string name="network_released" msgid="2992280481133877025">"Hasil: Jaringan telah dilepas."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Hasil: Gagal melepaskan jaringan."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Hasil: Pengecualian saat membeli jaringan premium."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Hasil: Mendapatkan hasil kosong saat membeli jaringan premium."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Hasil: Jaringan premium tidak dapat dibeli."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Hasil: Pembelian jaringan premium sedang berlangsung."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-is/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-is/strings.xml
index 229ff5d..61772de 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-is/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-is/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Biðja um netkerfi"</string>
+ <string name="release_network" msgid="174252378593535238">"Gefa út netkerfi"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping-prófun"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Niðurstaða:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Forgangsraða biðtíma"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Forgangsraða bandvídd"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Kaupa úrvalsnetkerfi"</string>
+ <string name="network_available" msgid="4780293262690730734">"Niðurstaða: Netkerfið sem beðið var um er nú í boði!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Niðurstaða: Beiðni um netkerfið hefur verið send!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Niðurstaða: Útgáfa netkerfisins tókst!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Niðurstaða: Ekki tókst að gefa netkerfið út!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Niðurstaða: Undantekning við kaup á úrvalsnetkerfi!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Niðurstaða: Fékk tóma niðurstöðu við kaup á úrvalsnetkerfi!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Niðurstaða: Það er ekki hægt að kaupa úrvalsnetkerfið!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Niðurstaða: Kaup á úrvalsnetkerfi eru í vinnslu..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-it/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-it/strings.xml
index 229ff5d..0c7b5f0 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-it/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-it/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Request Network"</string>
+ <string name="release_network" msgid="174252378593535238">"Release Network"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritize Latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritize Bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Purchase Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Risultato: la rete è stata richiesta."</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-iw/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-iw/strings.xml
index 4287a40..243e2c0 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-iw/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-iw/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"שלום קטע ריק"</string>
+ <string name="request_network" msgid="8945235490804849914">"שליחת בקשה לרשת"</string>
+ <string name="release_network" msgid="174252378593535238">"שחרור הרשת"</string>
+ <string name="ping" msgid="7890607576220714932">"פינג"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"תוצאה:"</string>
+ <string name="latency_title" msgid="963052613947017009">"עדיפות לזמן האחזור"</string>
+ <string name="bw_title" msgid="3902162973688221344">"עדיפות לרוחב הפס"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"רכישת רשת פרימיום"</string>
+ <string name="network_available" msgid="4780293262690730734">"תוצאה: הרשת המבוקשת זמינה"</string>
+ <string name="network_requested" msgid="5646123922691865991">"תוצאה: הבקשה לרשת נשלחה"</string>
+ <string name="network_released" msgid="2992280481133877025">"תוצאה: הרשת שוחררה"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"תוצאה: הרשת לא שוחררה"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"תוצאה: חריגה ברכישת פרמיה לרשת"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"תוצאה: התקבלה תוצאה ריקה בניסיון לרכוש פרמיה לרשת"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"תוצאה: אי אפשר לרכוש את הפרמיה לרשת"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"תוצאה: רכישת פרמיה לרשת מתבצעת…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ja/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ja/strings.xml
index 229ff5d..a265867 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ja/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ja/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"ネットワークをリクエストする"</string>
+ <string name="release_network" msgid="174252378593535238">"ネットワークを解放する"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"結果:"</string>
+ <string name="latency_title" msgid="963052613947017009">"レイテンシを優先する"</string>
+ <string name="bw_title" msgid="3902162973688221344">"帯域幅を優先する"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"ネットワーク プレミアムを購入"</string>
+ <string name="network_available" msgid="4780293262690730734">"結果: リクエストされたネットワークが利用できるようになりました。"</string>
+ <string name="network_requested" msgid="5646123922691865991">"結果: ネットワークがリクエストされました。"</string>
+ <string name="network_released" msgid="2992280481133877025">"結果: ネットワークが解放されました。"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"結果: ネットワークを解放できませんでした。"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"結果: ネットワーク プレミアム購入時に例外が発生しました。"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"結果: ネットワーク プレミアムの購入時に空の結果が返されました。"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"結果: ネットワーク プレミアムを購入できません。"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"結果: ネットワーク プレミアムの購入処理中です。"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ka/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ka/strings.xml
index 8d91ed0..1543a21 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ka/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ka/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"მოგესალმებით, ეს ცარიელი ფრაგმენტია"</string>
+ <string name="request_network" msgid="8945235490804849914">"მოთხოვნილი ქსელი"</string>
+ <string name="release_network" msgid="174252378593535238">"გამოშვების ქსელი"</string>
+ <string name="ping" msgid="7890607576220714932">"ზუზუნი"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"შედეგი:"</string>
+ <string name="latency_title" msgid="963052613947017009">"უპირატესობა მიანიჭეთ რეაგირების დროს"</string>
+ <string name="bw_title" msgid="3902162973688221344">"პრიორიტეტული გამტარუნარიანობა"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"შეიძინეთ ქსელის პრემიუმი"</string>
+ <string name="network_available" msgid="4780293262690730734">"შედეგი: მოთხოვნილი ქსელი უკვე ხელმისაწვდომია!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"შედეგი: ქსელი მოთხოვნილია!"</string>
+ <string name="network_released" msgid="2992280481133877025">"შედეგი: ქსელი გათავისუფლდა!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"შედეგი: ქსელის გათავისუფლება ვერ მოხერხდა"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"შედეგი: გამონაკლისი ქსელის პრემიუმის შეძენისას!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"შედეგი: მიიღეთ ცარიელი შედეგი ქსელის პრემიუმის შეძენისას!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"შედეგი: ქსელის პრემია არ არის ხელმისაწვდომი შესაძენად!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"შედეგი:მიმდინარეობს ქსელის პრემიუმ შესყიდვა ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-kk/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-kk/strings.xml
index 229ff5d..1dac729 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-kk/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-kk/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Желіні сұрау"</string>
+ <string name="release_network" msgid="174252378593535238">"Желіні шығару"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Нәтиже:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Кідіріске басымдық беру"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Өткізу мүмкіндігіне басымдық беру"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Премиум желіні сатып алу"</string>
+ <string name="network_available" msgid="4780293262690730734">"Нәтиже: сұралған желіні қазір пайдалануға болады!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Нәтиже: желі сұралды!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Нәтиже: желі шығарылды!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Нәтиже: желі шығарылмады!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Нәтиже: премиум желіні сатып алу кезінде ерекше жағдай шықты!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Нәтиже: премиум желіні сатып алу кезінде бос нәтиже шықты!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Нәтиже: премиум желіні сатып алу мүмкін емес!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Нәтиже: премиум желіні сатып алу процесі жүріп жатыр…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-km/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-km/strings.xml
index 229ff5d..1c4002a 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-km/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-km/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"ស្នើសុំបណ្ដាញ"</string>
+ <string name="release_network" msgid="174252378593535238">"ដកបណ្ដាញចេញ"</string>
+ <string name="ping" msgid="7890607576220714932">"ភីង"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"លទ្ធផល៖"</string>
+ <string name="latency_title" msgid="963052613947017009">"ផ្ដល់អាទិភាពការពន្យារ"</string>
+ <string name="bw_title" msgid="3902162973688221344">"ផ្ដល់អាទិភាពកម្រិតបញ្ជូន"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"ទិញបណ្ដាញលំដាប់ខ្ពស់"</string>
+ <string name="network_available" msgid="4780293262690730734">"លទ្ធផល៖ ឥឡូវនេះអាចប្រើបណ្ដាញដែលបានស្នើសុំបានហើយ!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"លទ្ធផល៖ បានស្នើសុំបណ្ដាញ!"</string>
+ <string name="network_released" msgid="2992280481133877025">"លទ្ធផល៖ បានដកបណ្ដាញចេញ!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"លទ្ធផល៖ ការលើកលែង នៅពេលទិញបណ្ដាញលំដាប់ខ្ពស់!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"លទ្ធផល៖ ការទិញបណ្ដាញលំដាប់ខ្ពស់កំពុងដំណើរការ ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-kn/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-kn/strings.xml
index 13a202b..1c06a91 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-kn/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-kn/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"ಹಲೋ, ಖಾಲಿ ಫ್ರಾಗ್ಮೆಂಟ್"</string>
+ <string name="request_network" msgid="8945235490804849914">"ನೆಟ್ವರ್ಕ್ಗಾಗಿ ವಿನಂತಿಸಿ"</string>
+ <string name="release_network" msgid="174252378593535238">"ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಬಿಡುಗಡೆ ಮಾಡಿ"</string>
+ <string name="ping" msgid="7890607576220714932">"ಪಿಂಗ್"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"ಫಲಿತಾಂಶ:"</string>
+ <string name="latency_title" msgid="963052613947017009">"ವಿಳಂಬವನ್ನು ಆದ್ಯತೆಗೊಳಿಸಿ"</string>
+ <string name="bw_title" msgid="3902162973688221344">"ಬ್ಯಾಂಡ್ವಿಡ್ತ್ ಆದ್ಯತೆಗೊಳಿಸಿ"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"ನೆಟ್ವರ್ಕ್ ಪ್ರೀಮಿಯಂ ಖರೀದಿಸಿ"</string>
+ <string name="network_available" msgid="4780293262690730734">"ಫಲಿತಾಂಶ: ವಿನಂತಿಸಿದ ನೆಟ್ವರ್ಕ್ ಈಗ ಲಭ್ಯವಿದೆ!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"ಫಲಿತಾಂಶ: ನೆಟ್ವರ್ಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗಿದೆ!"</string>
+ <string name="network_released" msgid="2992280481133877025">"ಫಲಿತಾಂಶ: ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಬಿಡುಗಡೆ ಮಾಡಲಾಗಿದೆ!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"ಫಲಿತಾಂಶ: ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಬಿಡುಗಡೆ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"ಫಲಿತಾಂಶ: ನೆಟ್ವರ್ಕ್ ಪ್ರೀಮಿಯಂ ಅನ್ನು ಖರೀದಿಸುವಾಗ ದೊರೆಯುವ ವಿನಾಯಿತಿ!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"ಫಲಿತಾಂಶ: ನೆಟ್ವರ್ಕ್ ಪ್ರೀಮಿಯಂ ಅನ್ನು ಖರೀದಿಸುವಾಗ ಫಲಿತಾಂಶವು ದೊರೆತಿಲ್ಲ!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"ಫಲಿತಾಂಶ: ನೆಟ್ವರ್ಕ್ ಪ್ರೀಮಿಯಂ ಖರೀದಿಗೆ ಲಭ್ಯವಿಲ್ಲ!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"ಫಲಿತಾಂಶ: ನೆಟ್ವರ್ಕ್ ಪ್ರೀಮಿಯಂ ಖರೀದಿ ಪ್ರಕ್ರಿಯೆ ಪ್ರಗತಿಯಲ್ಲಿದೆ ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ko/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ko/strings.xml
index 229ff5d..78199c8 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ko/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ko/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"네트워크 요청"</string>
+ <string name="release_network" msgid="174252378593535238">"네트워크 해제"</string>
+ <string name="ping" msgid="7890607576220714932">"핑"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"결과:"</string>
+ <string name="latency_title" msgid="963052613947017009">"지연 시간 우선순위 지정"</string>
+ <string name="bw_title" msgid="3902162973688221344">"대역폭의 우선순위 지정"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Network Premium 구매"</string>
+ <string name="network_available" msgid="4780293262690730734">"결과: 요청된 네트워크를 지금 사용할 수 있습니다."</string>
+ <string name="network_requested" msgid="5646123922691865991">"결과: 네트워크가 요청되었습니다."</string>
+ <string name="network_released" msgid="2992280481133877025">"결과: 네트워크가 해제되었습니다."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"결과: 네트워크 해제에 실패했습니다."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"결과: 네트워크 프리미엄 구매 시 예외 발생"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"결과: 네트워크 프리미엄을 구매할 때 결과가 비어 있습니다."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"결과: 네트워크 프리미엄을 구매할 수 없습니다."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"결과: 네트워크 프리미엄 구매가 진행 중입니다."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ky/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ky/strings.xml
index 229ff5d..8e9fd3d 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ky/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ky/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Тармак сурамы"</string>
+ <string name="release_network" msgid="174252378593535238">"Тармакты артка кайтаруу"</string>
+ <string name="ping" msgid="7890607576220714932">"Хрусталь"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Натыйжа:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Күтүү убакытына артыкчылык берүү"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Өткөрүү жөндөмдүүлүгүнө артыкчылык берүү"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Премиум тармагын сатып алуу"</string>
+ <string name="network_available" msgid="4780293262690730734">"Натыйжа: Суралган тармак азыр жеткиликтүү."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Натыйжа: Тармак суралды."</string>
+ <string name="network_released" msgid="2992280481133877025">"Натыйжа: Тармак артка кайтарылды."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Натыйжа: Тармак артка кайтарылган жок."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Натыйжа: Премиум тармагын сатып алууда өзгөчө учур чыкты."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Натыйжа: Премиум тармагын сатып алууда жыйынтык көрсөтүлгөн жок."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Натыйжа: Премиум тармагы сатылбайт."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Натыйжа: Премиум тармагы сатылып алынууда."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-lo/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-lo/strings.xml
index 3d47ad6..03812e7 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-lo/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-lo/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"ສະບາຍດີຈຸດແຕກທີ່ຫວ່າງເປົ່າ"</string>
+ <string name="request_network" msgid="8945235490804849914">"ຮ້ອງຂໍເຄືອຂ່າຍ"</string>
+ <string name="release_network" msgid="174252378593535238">"ປ່ອຍເຄືອຂ່າຍ"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+ <string name="latency_title" msgid="963052613947017009">"ຈັດລຳດັບຄວາມສຳຄັນເວລາຕອບສະໜອງ"</string>
+ <string name="bw_title" msgid="3902162973688221344">"ຈັດລຳດັບຄວາມສຳຄັນແບນວິດ"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"ຊື້ເຄືອຂ່າຍ Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"ຜົນຮັບ: ຕອນນີ້ເຄືອຂ່າຍທີ່ຮ້ອງຂໍໃຊ້ໄດ້ແລ້ວ!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-lt/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-lt/strings.xml
index 509fd2d..4d6c73e 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-lt/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-lt/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Sveiki, tuščias fragmentas"</string>
+ <string name="request_network" msgid="8945235490804849914">"Pateikti tinklo užklausą"</string>
+ <string name="release_network" msgid="174252378593535238">"Išleisti tinklą"</string>
+ <string name="ping" msgid="7890607576220714932">"Ryšio patikra"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Rezultatas:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Suteikti prioritetą delsai"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Suteikti prioritetą pralaidumui"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Įsigyti tinklą „Premium“"</string>
+ <string name="network_available" msgid="4780293262690730734">"Rezultatas: tinklas, dėl kurio pateikta užklausa, dabar pasiekiamas!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Rezultatas: pateikta tinklo užklausa!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Rezultatas: tinklas išleistas!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Rezultatas: nepavyko išleisti tinklo!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Rezultatas: išimtis įsigyjant tinklą „Premium“!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Rezultatas: gautas tuščias rezultatas įsigyjant tinklą „Premium“!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Rezultatas: tinklo „Premium“ negalima įsigyti!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Rezultatas: vykdomas tinklo „Premium“ įsigijimas..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-lv/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-lv/strings.xml
index 229ff5d..3f24cf5 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-lv/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-lv/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Pieprasīt tīklu"</string>
+ <string name="release_network" msgid="174252378593535238">"Atbrīvot tīklu"</string>
+ <string name="ping" msgid="7890607576220714932">"Ehotestēt"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Rezultāts:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritāte latentumam"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritāte joslas platumam"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Iegādāties tīkla maksas abonementu"</string>
+ <string name="network_available" msgid="4780293262690730734">"Rezultāts: pieprasītais tīkls tagad ir pieejams."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Rezultāts: tīkls ir pieprasīts."</string>
+ <string name="network_released" msgid="2992280481133877025">"Rezultāts: tīkls ir atbrīvots."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Rezultāts: neizdevās atbrīvot tīklu."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Rezultāts: iegādājoties tīkla maksas abonementu, radās izņēmums."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Rezultāts: iegādājoties tīkla maksas abonementu, tika iegūts tukšs rezultāts."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Rezultāts: tīkla maksas abonementu nevar iegādāties."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Rezultāts: notiek tīkla maksas abonementa iegāde…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-mk/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-mk/strings.xml
index 229ff5d..41c891f 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-mk/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-mk/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Побарајте мрежа"</string>
+ <string name="release_network" msgid="174252378593535238">"Исклучете мрежа"</string>
+ <string name="ping" msgid="7890607576220714932">"Пинг"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Резултат:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritize Latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritize Bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Купете премиум-мрежа"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Резултат: мрежата е побарана!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Резултат: мрежата е исклучена!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Резултат: исклучок при купување премиум-мрежа!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Резултат: се доби празен резултат при купување премиум-мрежа!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Резултат: премиум-мрежата не е достапна за купување!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Резултат: купувањето на премиум-мрежата е во тек …"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ml/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ml/strings.xml
index 47ca9c8..bc8e8c5 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ml/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ml/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"ഹലോ ബ്ലാങ്ക് ഫ്രാഗ്മെന്റ്"</string>
+ <string name="request_network" msgid="8945235490804849914">"ഒരു നെറ്റ്വർക്ക് അഭ്യർത്ഥിക്കുക"</string>
+ <string name="release_network" msgid="174252378593535238">"നെറ്റ്വർക്ക് റിലീസ് ചെയ്യുക"</string>
+ <string name="ping" msgid="7890607576220714932">"പിംഗ്"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"ഫലം:"</string>
+ <string name="latency_title" msgid="963052613947017009">"പ്രതികരണ സമയത്തിന് മുൻഗണന നൽകുക"</string>
+ <string name="bw_title" msgid="3902162973688221344">"ബാൻഡ്വിഡ്ത്തിന് മുൻഗണന നൽകുക"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"നെറ്റ്വർക്ക് പ്രീമിയം വാങ്ങുക"</string>
+ <string name="network_available" msgid="4780293262690730734">"ഫലം: അഭ്യർത്ഥിച്ച നെറ്റ്വർക്ക് ഇപ്പോൾ ലഭ്യമാണ്!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"ഫലം: നെറ്റ്വർക്കിന് അഭ്യർത്ഥിച്ചു!"</string>
+ <string name="network_released" msgid="2992280481133877025">"ഫലം: നെറ്റ്വർക്ക് റിലീസ് ചെയ്തിരിക്കുന്നു!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"ഫലം: നെറ്റ്വർക്ക് റിലീസ് ചെയ്യാനായില്ല!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"ഫലം: നെറ്റ്വർക്ക് പ്രീമിയം വാങ്ങുമ്പോൾ ഒഴിവാക്കുന്നവ!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"ഫലം: നെറ്റ്വർക്ക് പ്രീമിയം വാങ്ങുമ്പോൾ ഫലം ലഭിക്കുന്നില്ല!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"ഫലം: നെറ്റ്വർക്ക് പ്രീമിയം വാങ്ങുന്നതിന് ലഭ്യമല്ല!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"ഫലം: നെറ്റ്വർക്ക് പ്രീമിയം വാങ്ങൽ പുരോഗമിക്കുന്നു ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-mn/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-mn/strings.xml
index 1aa5138..117cd3a 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-mn/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-mn/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Сайн байна уу хоосон хэсэг"</string>
+ <string name="request_network" msgid="8945235490804849914">"Сүлжээний хүсэлт тавих"</string>
+ <string name="release_network" msgid="174252378593535238">"Сүлжээ шинээр гаргах"</string>
+ <string name="ping" msgid="7890607576220714932">"Пинг"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Үр дүн:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Хоцролтыг чухалчлах"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Зурвасын өргөнийг чухалчлах"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Сүлжээний премиумийг худалдан авах"</string>
+ <string name="network_available" msgid="4780293262690730734">"Үр дүн: Хүсэлт тавьсан сүлжээ одоо боломжтой боллоо!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Үр дүн: Сүлжээний хүсэлт тавьсан!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Үр дүн: Сүлжээг шинээр гаргалаа!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Үр дүн: Сүлжээг шинээр гаргаж чадсангүй!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Үр дүн: Сүлжээний премиумийг худалдан авах үед гажилт гарлаа!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Үр дүн: Сүлжээний премиумийг худалдан авах үед хоосон илэрц авсан!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Үр дүн: Сүлжээний премиумийг худалдан авах боломжгүй!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Үр дүн: Сүлжээний премиумийг худалдан авч байна ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-mr/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-mr/strings.xml
index 7fbe792..35347b6 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-mr/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-mr/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"हॅलो ब्लँक फ्रॅग्मेंट"</string>
+ <string name="request_network" msgid="8945235490804849914">"नेटवर्कची विनंती करा"</string>
+ <string name="release_network" msgid="174252378593535238">"नेटवर्क रिलीझ करा"</string>
+ <string name="ping" msgid="7890607576220714932">"पिंग"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"परिणाम:"</string>
+ <string name="latency_title" msgid="963052613947017009">"लेटन्सी ला प्राधान्य द्या"</string>
+ <string name="bw_title" msgid="3902162973688221344">"बँडविड्थ ला प्राधान्य द्या"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"नेटवर्क प्रीमियमची खरेदी"</string>
+ <string name="network_available" msgid="4780293262690730734">"परिणाम: विनंती केलेले नेटवर्क आता उपलब्ध आहे!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"परिणाम: नटवर्कची विनंती केली आहे!"</string>
+ <string name="network_released" msgid="2992280481133877025">"परिणाम: नेटवर्क रिलीझ केले आहे!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"परिणाम: नेटवर्क रिलीझ करता आले नाही!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"परिणाम: नेटवर्क प्रीमियम खरेदी करताना एक्सेप्शन!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"परिणाम: नेटवर्क प्रीमियम खरेदी करताना कोणताही परिणाम आढळला नाही!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"परिणाम: नेटवर्क प्रीमियम खरेदी करण्यासाठी उपलब्ध नाही!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"परिणाम: नेटवर्क प्रीमियम खरेदी करणे प्रगतीपथावर आहे..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ms/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ms/strings.xml
index b928cd6..cfb7de6 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ms/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ms/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Helo cebisan kosong"</string>
+ <string name="request_network" msgid="8945235490804849914">"Minta Rangkaian"</string>
+ <string name="release_network" msgid="174252378593535238">"Lepaskan Rangkaian"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Hasil:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Utamakan Kependaman"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Utamakan Lebar Jalur"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Beli Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Hasil: Rangkaian yang diminta kini tersedia!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Hasil: Rangkaian telah diminta!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Hasil: Rangkaian telah dilepaskan!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Hasil: Gagal mengeluarkan rangkaian!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Hasil: Pengecualian apabila membeli network premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Hasil: Tiada hasil apabila membeli network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Hasil: Network premium tidak tersedia untuk pembelian!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Hasil: Pembelian network premium sedang diproses ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-my/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-my/strings.xml
index 229ff5d..a5c81f6 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-my/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-my/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Request Network"</string>
+ <string name="release_network" msgid="174252378593535238">"Release Network"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritize Latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritize Bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Purchase Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-nb/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-nb/strings.xml
index 3d601ab..abb1af4 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-nb/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-nb/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hei, tomt fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Forespør nettverk"</string>
+ <string name="release_network" msgid="174252378593535238">"Frigi nettverk"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Resultat:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioriter tidsforsinkelser"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioriter båndbredde"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Kjøp premiumnettverk"</string>
+ <string name="network_available" msgid="4780293262690730734">"Resultat: Det forespurte nettverket er tilgjengelig nå."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Resultat: Nettverket er forespurt."</string>
+ <string name="network_released" msgid="2992280481133877025">"Resultat: Nettverket er frigitt."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Resultat: Kunne ikke frigi nettverket."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Resultat: Unntak ved kjøp av premiumnettverk."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Resultat: Fikk tomt resultat ved kjøp av premiumnettverk."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Resultat: Premiumnettverket er ikke tilgjengelig for kjøp."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Resultat: Kjøp av premiumnettverk pågår …"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ne/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ne/strings.xml
index 229ff5d..cb2d561 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ne/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ne/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"नेटवर्क अनुरोध गर्नुहोस्"</string>
+ <string name="release_network" msgid="174252378593535238">"नेटवर्क रिलिज गर्नुहोस्"</string>
+ <string name="ping" msgid="7890607576220714932">"पिङ"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"परिणाम:"</string>
+ <string name="latency_title" msgid="963052613947017009">"ल्याटेन्सीलाई प्राथमिकता दिनुहोस्"</string>
+ <string name="bw_title" msgid="3902162973688221344">"ब्यान्डविथलाई प्राथमिकता दिनुहोस्"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Network Premium खरिद गर्नुहोस्"</string>
+ <string name="network_available" msgid="4780293262690730734">"परिणाम: अनुरोध गरिएको नेटवर्क अब उपलब्ध भएको छ!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"परिणाम: नेटवर्क अनुरोध गरिएको छ!"</string>
+ <string name="network_released" msgid="2992280481133877025">"परिणाम: नेटवर्क रिलिज गरिएको छ!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"परिणाम: नेटवर्क रिलिज गर्न सकिएन!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"परिणाम: Network Premium खरिद गर्दा अपवाद भयो!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"परिणाम: Network Premium खरिद गर्दा कुनै पनि परिणाम प्राप्त भएन!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"परिणाम: Network Premium खरिद गर्न मिल्दैन!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"परिणाम: Network Premium खरिद गरिँदै छ …"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-nl/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-nl/strings.xml
index 5d10fc6..9d98130 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-nl/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-nl/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hallo leeg fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Netwerk aanvragen"</string>
+ <string name="release_network" msgid="174252378593535238">"Netwerk vrijgeven"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Resultaat:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Vertraging prioriteit geven"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Bandbreedte prioriteit geven"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Netwerkpremium kopen"</string>
+ <string name="network_available" msgid="4780293262690730734">"Resultaat: Het gevraagde netwerk is nu beschikbaar."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Resultaat: Het netwerk is aangevraagd."</string>
+ <string name="network_released" msgid="2992280481133877025">"Resultaat: Het netwerk is vrijgegeven."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Resultaat: Het netwerk kan niet worden vrijgegeven."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Resultaat: Uitzondering bij kopen van netwerkpremium."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Resultaat: Er is een leeg resultaat geretourneerd bij het kopen van netwerkpremium."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Resultaat: Het netwerkpremium kan niet worden gekocht."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Resultaat: Netwerkpremium wordt gekocht..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-or/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-or/strings.xml
index 229ff5d..287aa01 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-or/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-or/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Networkର ଅନୁରୋଧ କରନ୍ତୁ"</string>
+ <string name="release_network" msgid="174252378593535238">"Network ରିଲିଜ କରନ୍ତୁ"</string>
+ <string name="ping" msgid="7890607576220714932">"ପିଂ"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"ଫଳାଫଳ:"</string>
+ <string name="latency_title" msgid="963052613947017009">"ଲେଟେନ୍ସିକୁ ପ୍ରାଥମିକତା ଦିଅନ୍ତୁ"</string>
+ <string name="bw_title" msgid="3902162973688221344">"ବେଣ୍ଡୱିଡଥକୁ ପ୍ରାଥମିକତା ଦିଅନ୍ତୁ"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Network Premium କିଣନ୍ତୁ"</string>
+ <string name="network_available" msgid="4780293262690730734">"ଫଳାଫଳ: ଅନୁରୋଧ କରାଯାଇଥିବା ନେଟୱାର୍କଟି ବର୍ତ୍ତମାନ ଉପଲବ୍ଧ ଅଛି!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"ଫଳାଫଳ: ନେଟୱାର୍କର ଅନୁରୋଧ କରାଯାଇଛି!"</string>
+ <string name="network_released" msgid="2992280481133877025">"ଫଳାଫଳ: ନେଟୱାର୍କକୁ ରିଲିଜ କରାଯାଇଛି!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"ଫଳାଫଳ: ନେଟୱାର୍କକୁ ରିଲିଜ କରିବାରେ ବିଫଳ ହୋଇଛି!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"ଫଳାଫଳ: Network Premium କିଣିବା ବେଳେ ବ୍ୟତିକ୍ରମ!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"ଫଳାଫଳ: Network Premium କିଣିବା ବେଳେ ଖାଲି ଫଳାଫଳ ମିଳିଲା!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"ଫଳାଫଳ: Network Premium କ୍ରୟ ପାଇଁ ଉପଲବ୍ଧ ନାହିଁ!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"ଫଳାଫଳ: Network Premium କିଣିବାର ପ୍ରକ୍ରିୟା ଚାଲିଛି ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-pa/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-pa/strings.xml
index 229ff5d..e210500 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-pa/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-pa/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Network ਦੀ ਬੇਨਤੀ ਕਰੋ"</string>
+ <string name="release_network" msgid="174252378593535238">"Network ਰਿਲੀਜ਼ ਕਰੋ"</string>
+ <string name="ping" msgid="7890607576220714932">"ਪਿੰਗ"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"ਨਤੀਜਾ:"</string>
+ <string name="latency_title" msgid="963052613947017009">"ਵਿਲੰਬਤਾ ਨੂੰ ਤਰਜੀਹ ਦਿਓ"</string>
+ <string name="bw_title" msgid="3902162973688221344">"ਬੈਂਡਵਿਡਥ ਨੂੰ ਤਰਜੀਹ ਦਿਓ"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Network Premium ਖਰੀਦੋ"</string>
+ <string name="network_available" msgid="4780293262690730734">"ਨਤੀਜਾ: ਬੇਨਤੀ ਕੀਤਾ ਨੈੱਟਵਰਕ ਹੁਣ ਉਪਲਬਧ ਹੈ!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"ਨਤੀਜਾ: ਨੈੱਟਵਰਕ ਦੇ ਲਈ ਬੇਨਤੀ ਕੀਤੀ ਗਈ ਹੈ!"</string>
+ <string name="network_released" msgid="2992280481133877025">"ਨਤੀਜਾ: ਨੈੱਟਵਰਕ ਨੂੰ ਰਿਲੀਜ਼ ਕੀਤਾ ਗਿਆ ਹੈ!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"ਨਤੀਜਾ: ਨੈੱਟਵਰਕ ਨੂੰ ਰਿਲੀਜ਼ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"ਨਤੀਜਾ: ਨੈੱਟਵਰਕ ਪ੍ਰੀਮੀਅਮ ਖਰੀਦਣ ਵੇਲੇ ਅਪਵਾਦ!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"ਨਤੀਜਾ: ਨੈੱਟਵਰਕ ਪ੍ਰੀਮੀਅਮ ਖਰੀਦਣ ਵੇਲੇ ਖਾਲੀ ਨਤੀਜਾ ਮਿਲਿਆ!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"ਨਤੀਜਾ: ਨੈੱਟਵਰਕ ਪ੍ਰੀਮੀਅਮ ਖਰੀਦ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"ਨਤੀਜਾ: ਨੈੱਟਵਰਕ ਪ੍ਰੀਮੀਅਮ ਦੀ ਖਰੀਦ ਜਾਰੀ ਹੈ ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-pl/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-pl/strings.xml
index 0bf147b..21b1a78 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-pl/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-pl/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Tutaj jest pusty fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Poproś o dostęp do sieci"</string>
+ <string name="release_network" msgid="174252378593535238">"Zwolnij sieć"</string>
+ <string name="ping" msgid="7890607576220714932">"Dzyń"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Efekt:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Nadaj priorytet czasowi oczekiwania"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Nadaj priorytet przepustowości"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Kup sieć Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Efekt: żądana sieć jest już dostępna"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Efekt: zażądano dostępu do sieci"</string>
+ <string name="network_released" msgid="2992280481133877025">"Efekt: sieć została zwolniona"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Efekt: nie udało się zwolnić sieci"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Wynik: przy zakupie sieci premium pojawia się wyjątek"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Wynik: brak wyników w przypadku zakupu sieci premium"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Efekt: nie można kupić sieci premium"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Wynik: trwa kupowanie sieci premium…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-pt-rPT/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-pt-rPT/strings.xml
index b94a687..31c2720 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-pt-rPT/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-pt-rPT/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Olá, fragmento em branco"</string>
+ <string name="request_network" msgid="8945235490804849914">"Pedir rede"</string>
+ <string name="release_network" msgid="174252378593535238">"Lançar rede"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Resultado:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Priorizar latência"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Priorizar largura de banda"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Comprar serviço premium de rede"</string>
+ <string name="network_available" msgid="4780293262690730734">"Resultado: a rede pedida já está disponível!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Resultado: a rede foi pedida!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Resultado: a rede foi lançada!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Resultado: falha ao lançar a rede!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Resultado: exceção ao comprar o serviço premium de rede!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Resultado: obteve um resultado vazio ao comprar o serviço premium de rede!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Resultado: o serviço premium de rede não está disponível para compra!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Resultado: a compra do serviço premium de rede está em curso…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-pt/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-pt/strings.xml
index 229ff5d..b0b4b51 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-pt/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-pt/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Rede da solicitação"</string>
+ <string name="release_network" msgid="174252378593535238">"Rede de lançamento"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Resultado:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Priorizar a latência"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Priorizar a largura de banda"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Comprar Rede Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Resultado: a rede solicitada já está disponível."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Resultado: a rede foi solicitada."</string>
+ <string name="network_released" msgid="2992280481133877025">"Resultado: a rede foi liberada."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Resultado: falha ao liberar a rede."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Resultado: exceção ao comprar uma rede Premium."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Resultado: há um resultado vazio ao comprar a rede Premium."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Resultado: a rede Premium não está disponível para compra."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Resultado: a compra da rede Premium está em andamento..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ro/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ro/strings.xml
index 229ff5d..a5c81f6 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ro/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ro/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Request Network"</string>
+ <string name="release_network" msgid="174252378593535238">"Release Network"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritize Latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritize Bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Purchase Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ru/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ru/strings.xml
index 229ff5d..7763c62 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ru/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ru/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Запросить сеть"</string>
+ <string name="release_network" msgid="174252378593535238">"Освободить сеть"</string>
+ <string name="ping" msgid="7890607576220714932">"Запрос ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Результат."</string>
+ <string name="latency_title" msgid="963052613947017009">"Минимизировать задержку"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Минимизировать нагрузку на сеть"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Купить премиальную подписку на использование сети"</string>
+ <string name="network_available" msgid="4780293262690730734">"Результат: запрошенная сеть сейчас доступна."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Результат: сеть запрошена."</string>
+ <string name="network_released" msgid="2992280481133877025">"Результат: сеть освобождена."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Результат: не удалось освободить сеть."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Результат: при попытке купить премиальную подписку на использование сети возникло исключение."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Результат: получен пустой результат при попытке купить премиальную подписку на использование сети."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Результат: премиальная подписка на использование сети недоступна для покупки."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Результат: выполняется покупка премиальной подписки на использование сети."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-si/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-si/strings.xml
index 7c88afe..ed91dd7 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-si/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-si/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"ආයුබෝවන් හිස් කොටස"</string>
+ <string name="request_network" msgid="8945235490804849914">"ජාලය ඉල්ලන්න"</string>
+ <string name="release_network" msgid="174252378593535238">"ජාලය මුදා හරින්න"</string>
+ <string name="ping" msgid="7890607576220714932">"පිං"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"ප්රතිඵලය:"</string>
+ <string name="latency_title" msgid="963052613947017009">"පමාවට ප්රමුඛත්වය දෙන්න"</string>
+ <string name="bw_title" msgid="3902162973688221344">"කලාප පළලට ප්රමුඛත්වය දෙන්න"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"ජාල ප්රිමියම් මිල දී ගන්න"</string>
+ <string name="network_available" msgid="4780293262690730734">"ප්රතිඵලය: ඉල්ලූ ජාලය දැන් තිබේ!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"ප්රතිඵලය: ජාලය ඉල්ලා ඇත!"</string>
+ <string name="network_released" msgid="2992280481133877025">"ප්රතිඵලය: ජාලය මුදා හැර ඇත!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"ප්රතිඵලය: ජාලය මුදා හැරීමට අසමත් විය!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"ප්රතිඵලය: ජාල ප්රිමියම් මිල දී ගැනීමේ දී ව්යතිරේකයක්!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"ප්රතිඵලය: ජාල ප්රිමියම් මිල දී ගැනීමේ දී හිස් ප්රතිඵලයක් ලැබිණි!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"ප්රතිඵලය: ජාල ප්රිමියම් මිල දී ගැනීමට නොමැත!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"ප්රතිඵලය: ජාල ප්රිමියම් මිල දී ගැනීම සිදු වෙමින් පවතී ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-sk/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-sk/strings.xml
index 229ff5d..89628b4 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-sk/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-sk/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Vyžiadať sieť"</string>
+ <string name="release_network" msgid="174252378593535238">"Vydať sieť"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Výsledok:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Uprednostniť latenciu"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Uprednostniť rýchlosť pripojenia"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Kúpiť prémiovú sieť"</string>
+ <string name="network_available" msgid="4780293262690730734">"Výsledok: požadovaná sieť je už k dispozícii"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Výsledok: sieť bola vyžiadaná"</string>
+ <string name="network_released" msgid="2992280481133877025">"Výsledok: sieť bola vydaná"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Výsledok: sieť sa nepodarilo vydať"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Výsledok: výnimka pri nákupe prémiovej siete"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Výsledok: prázdny výsledok pri nákupe prémiovej siete"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Výsledok: prémiová sieť nie je k dispozícii na zakúpenie"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Výsledok: prebieha nákup prémiovej siete…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-sl/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-sl/strings.xml
index b3fd35a..0b94379 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-sl/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-sl/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Prazen del za pozdrav"</string>
+ <string name="request_network" msgid="8945235490804849914">"Zahtevanje omrežja"</string>
+ <string name="release_network" msgid="174252378593535238">"Sprostitev omrežja"</string>
+ <string name="ping" msgid="7890607576220714932">"Zven"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Rezultat:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Podelitev prednosti zakasnitvi"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Podelitev prednosti pasovni širini"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Nakup omrežne naročnine"</string>
+ <string name="network_available" msgid="4780293262690730734">"Rezultat: Zahtevano omrežje je zdaj na voljo."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Rezultat: Omrežje je bilo zahtevano."</string>
+ <string name="network_released" msgid="2992280481133877025">"Rezultat: Omrežje je sproščeno."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Rezultat: Sprostitev omrežja ni uspela."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Rezultat: Izjema pri nakupu omrežne naročnine."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Rezultat: Pri nakupu omrežne naročnine je prišlo do praznega rezultata."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Rezultat: Omrežna naročnina ni na voljo za nakup."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Rezultat: Nakup omrežne naročnine je v teku ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-sq/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-sq/strings.xml
index 229ff5d..ccbe35a 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-sq/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-sq/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Kërko rrjetin"</string>
+ <string name="release_network" msgid="174252378593535238">"Publiko rrjetin"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Rezultati:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Jepi përparësi vonesës"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Jepi përparësi gjerësisë së bandës"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Bli rrjetin premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Rezultati: Rrjeti i kërkuar ofrohet tani!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Rezultati: Rrjeti është kërkuar!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Rezultati: Rrjeti është publikuar!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Rezultati: Publikimi i rrjetit dështoi!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Rezultati: Përjashtim kur blihet rrjeti premium!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Rezultati: U mor një rezultat bosh kur u ble rrjeti premium!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Rezultati: Rrjeti premium nuk ofrohet për blerje!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Rezultati: Blerja e rrjetit premium është në vazhdim..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-sr/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-sr/strings.xml
index 229ff5d..60ba624 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-sr/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-sr/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Затражите мрежу"</string>
+ <string name="release_network" msgid="174252378593535238">"Објавите мрежу"</string>
+ <string name="ping" msgid="7890607576220714932">"Пинг"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Резултат:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Дајте приоритет кашњењу"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Дајте приоритет пропусном опсегу"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Купите Premium мрежу"</string>
+ <string name="network_available" msgid="4780293262690730734">"Резултат: Захтевана мрежа је тренутно доступна!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Резултат: Мрежа је затражена!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Резултат: Мрежа је објављена!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Резултат: Објављивање мреже није успело!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Резултат: Изузетак при куповини Premium мреже!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Резултат: Резултат је празан када купујете Premium мрежу!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Резултат: Premium мрежа није доступна за куповину!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Резултат: Куповина Premium мреже је у току..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-sv/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-sv/strings.xml
index 229ff5d..a5c81f6 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-sv/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-sv/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Request Network"</string>
+ <string name="release_network" msgid="174252378593535238">"Release Network"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritize Latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritize Bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Purchase Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-sw/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-sw/strings.xml
index 5cc6a6a..c01aa3a 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-sw/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-sw/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Kipande cha salamu kisichokuwa na kitu"</string>
+ <string name="request_network" msgid="8945235490804849914">"Request Network"</string>
+ <string name="release_network" msgid="174252378593535238">"Release Network"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritize Latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritize Bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Purchase Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ta/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ta/strings.xml
index 229ff5d..2a05673 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ta/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ta/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"நெட்வொர்க்கைக் கோரு"</string>
+ <string name="release_network" msgid="174252378593535238">"நெட்வொர்க்கை வெளியிடு"</string>
+ <string name="ping" msgid="7890607576220714932">"பிங்"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"முடிவு:"</string>
+ <string name="latency_title" msgid="963052613947017009">"தாமதத்திற்கு முன்னுரிமை வழங்கு"</string>
+ <string name="bw_title" msgid="3902162973688221344">"இணைய வேகத்திற்கு முன்னுரிமை வழங்கு"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"நெட்வொர்க் பிரீமியத்தை வாங்கு"</string>
+ <string name="network_available" msgid="4780293262690730734">"முடிவு: கோரப்பட்ட நெட்வொர்க் இப்போது கிடைக்கிறது!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"முடிவு: நெட்வொர்க் கோரப்பட்டுள்ளது!"</string>
+ <string name="network_released" msgid="2992280481133877025">"முடிவு: நெட்வொர்க் வெளியிடப்பட்டுள்ளது!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"முடிவு: நெட்வொர்க்கை வெளியிட முடியவில்லை!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"முடிவு: நெட்வொர்க் பிரீமியம் வாங்கும்போது விதிவிலக்கு!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"முடிவு: நெட்வொர்க் பிரீமியம் வாங்கும்போது முடிவு எதுவும் கிடைக்கவில்லை!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"முடிவு: வாங்குவதற்கு நெட்வொர்க் பிரீமியம் கிடைக்கவில்லை!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"முடிவு: நெட்வொர்க் பிரீமியம் வாங்கப்படுகிறது..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-te/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-te/strings.xml
index ad9cef8..43d9a00 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-te/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-te/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"హలో ఖాళీ విడిభాగము"</string>
+ <string name="request_network" msgid="8945235490804849914">"రిక్వెస్ట్ నెట్వర్క్"</string>
+ <string name="release_network" msgid="174252378593535238">"నెట్వర్క్ను రిలీజ్ చేయండి"</string>
+ <string name="ping" msgid="7890607576220714932">"పింగ్"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"ఫలితం:"</string>
+ <string name="latency_title" msgid="963052613947017009">"ప్రతిస్పందన సమయానికి ప్రాధాన్యత ఇవ్వండి"</string>
+ <string name="bw_title" msgid="3902162973688221344">"బ్యాండ్విడ్త్కు ప్రాధాన్యత ఇవ్వండి"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"ప్రీమియం నెట్వర్క్ను కొనుగోలు చేయండి"</string>
+ <string name="network_available" msgid="4780293262690730734">"ఫలితం: రిక్వెస్ట్ చేసిన నెట్వర్క్ ఇప్పుడు అందుబాటులో ఉంది!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"ఫలితం: నెట్వర్క్ రిక్వెస్ట్ చేయబడింది!"</string>
+ <string name="network_released" msgid="2992280481133877025">"ఫలితం: నెట్వర్క్ రిలీజ్ చేయబడింది!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"ఫలితం: నెట్వర్క్ను రిలీజ్ చేయడంలో విఫలమైంది!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"ఫలితం: ప్రీమియం నెట్వర్క్ను కొనుగోలు చేసేటప్పుడు అరుదైన ఘటన సంభవించింది!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"ఫలితం: ప్రీమియం నెట్వర్క్ను కొనుగోలు చేసినప్పుడు ఖాళీ ఫలితం వచ్చింది!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"ఫలితం: కొనుగోలు కోసం ప్రీమియం నెట్వర్క్ అందుబాటులో లేదు!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"ఫలితం: ప్రీమియం నెట్వర్క్ కొనుగోలు ప్రోగ్రెస్లో ఉంది ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-th/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-th/strings.xml
index 229ff5d..f0dbee8 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-th/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-th/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"ขอใช้งานเครือข่าย"</string>
+ <string name="release_network" msgid="174252378593535238">"เผยแพร่เครือข่าย"</string>
+ <string name="ping" msgid="7890607576220714932">"ใช้คำสั่ง ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"ผลลัพธ์:"</string>
+ <string name="latency_title" msgid="963052613947017009">"ตั้งเป็นเวลาในการตอบสนองสำคัญ"</string>
+ <string name="bw_title" msgid="3902162973688221344">"ตั้งเป็นแบนด์วิดท์สำคัญ"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"ซื้อเครือข่ายระดับพรีเมียม"</string>
+ <string name="network_available" msgid="4780293262690730734">"ผลลัพธ์: เครือข่ายที่ต้องการพร้อมใช้งานแล้ว"</string>
+ <string name="network_requested" msgid="5646123922691865991">"ผลลัพธ์: ขอใช้งานเครือข่ายแล้ว"</string>
+ <string name="network_released" msgid="2992280481133877025">"ผลลัพธ์: เผยแพร่เครือข่ายแล้ว"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"ผลลัพธ์: เผยแพร่เครือข่ายไม่สําเร็จ"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"ผลลัพธ์: ข้อยกเว้นในการซื้อเครือข่ายระดับพรีเมียม"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"ผลลัพธ์: ได้ผลลัพธ์ว่างเปล่าเมื่อซื้อเครือข่ายระดับพรีเมียม"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"ผลลัพธ์: เครือข่ายระดับพรีเมียมยังไม่พร้อมให้จำหน่าย"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"ผลลัพธ์: กําลังดําเนินการซื้อเครือข่ายระดับพรีเมียม ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-tl/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-tl/strings.xml
index 229ff5d..50897f6 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-tl/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-tl/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Hilingin ang Network"</string>
+ <string name="release_network" msgid="174252378593535238">"I-release ang Network"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Resulta:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Isapriyoridad ang Latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Isapriyoridad ang Bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Bilhin ang Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Resulta: Available na ang hiniling na network!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Resulta: Hiniling na ang network!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Resulta: Na-release na ang network!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Resulta: Hindi na-release ang network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Resulta: Nagkakaroon ng exception noong binili ang network premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Resulta: Walang nakuhang resulta noong binili ang network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Resulta: Hindi available ang network premium para bilhin!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Resulta: Kasalukuyang binibili ang network premium..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-tr/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-tr/strings.xml
index 1e18a88..d8c2751 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-tr/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-tr/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Merhaba boş bölüm"</string>
+ <string name="request_network" msgid="8945235490804849914">"Request Network"</string>
+ <string name="release_network" msgid="174252378593535238">"Release Network"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Prioritize Latency"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Prioritize Bandwidth"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Purchase Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-uk/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-uk/strings.xml
index 0219615..a5f6921 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-uk/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-uk/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Пустий фрагмент із привітанням"</string>
+ <string name="request_network" msgid="8945235490804849914">"Надіслати запит на мережу"</string>
+ <string name="release_network" msgid="174252378593535238">"Випустити мережу"</string>
+ <string name="ping" msgid="7890607576220714932">"Перевірити"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Результат:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Надати пріоритет затримці"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Надати пріоритет пропускній спроможності"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Придбати преміум-доступ до мережі"</string>
+ <string name="network_available" msgid="4780293262690730734">"Результат: потрібна мережа тепер доступна."</string>
+ <string name="network_requested" msgid="5646123922691865991">"Результат: надіслано запит на мережу."</string>
+ <string name="network_released" msgid="2992280481133877025">"Результат: мережу звільнено."</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Результат: не вдалося звільнити мережу."</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Результат: виняток під час покупки преміум-доступу до мережі."</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Результат: під час покупки преміум-доступу до мережі отримано пустий результат."</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Результат: преміум-доступ до мережі недоступний для купівлі."</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Результат: триває процес купівлі преміум-доступу до мережі."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-ur/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-ur/strings.xml
index 229ff5d..1068cf1 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-ur/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-ur/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"نیٹ ورک کی درخواست کریں"</string>
+ <string name="release_network" msgid="174252378593535238">"نیٹ ورک ریلیز کریں"</string>
+ <string name="ping" msgid="7890607576220714932">"پنگ"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"نتیجہ:"</string>
+ <string name="latency_title" msgid="963052613947017009">"تاخیر کو ترجیح دیں"</string>
+ <string name="bw_title" msgid="3902162973688221344">"بینڈوتھ کو ترجیح دیں"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"نیٹ ورک پریمیم خریدیں"</string>
+ <string name="network_available" msgid="4780293262690730734">"نتیجہ: درخواست کردہ نیٹ ورک اب دستیاب ہے!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"نتیجہ: نیٹ ورک کی درخواست کی گئی ہے!"</string>
+ <string name="network_released" msgid="2992280481133877025">"نتیجہ: نیٹ ورک ریلیز کر دیا گیا ہے!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"نتیجہ: نیٹ ورک ریلیز کرنے میں ناکام!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"نتیجہ: نیٹ ورک پریمیم کی خریداری کرتے وقت استثنا!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"نتیجہ: نیٹ ورک پریمیم کی خریداری کرتے وقت خالی نتیجہ ملا!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"نتیجہ: نیٹ ورک پریمیم خریداری کے لیے دستیاب نہیں ہے!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"نتیجہ: نیٹ ورک پریمیم خریداری جاری ہے..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-uz/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-uz/strings.xml
index 229ff5d..a0d4547 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-uz/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-uz/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Tarmoqni talab qilish"</string>
+ <string name="release_network" msgid="174252378593535238">"Tarmoqni chiqarish"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Natija:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Kechikish vaqti ustuvorligi"</string>
+ <string name="bw_title" msgid="3902162973688221344">"O‘tkazuvchanlik qobiliyati ustuvorligi"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Tarmoq premiumni xarid qilish"</string>
+ <string name="network_available" msgid="4780293262690730734">"Natija: Talab qilingan tarmoq hozir mavjud!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Natija: Tarmoq talab qilindi!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Natija: Tarmoq chiqarildi!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Natija: Tarmoqni chiqarib bo‘lmadi!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Natija: Tarmoq premiumni xarid qilishda istisno!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Natija: Tarmoq premiumni xarid qilayotganda bo‘sh natijaga erishildi!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Natija: Tarmoq premiumni xarid qilib bo‘lmaydi!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Natija: Tarmoq premium xaridi davom etmoqda ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-vi/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-vi/strings.xml
index 229ff5d..75bb2a3 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-vi/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-vi/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Yêu cầu mạng"</string>
+ <string name="release_network" msgid="174252378593535238">"Phát hành mạng"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Kết quả:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Ưu tiên độ trễ"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Ưu tiên băng thông"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Mua dịch vụ đặc biệt cho mạng"</string>
+ <string name="network_available" msgid="4780293262690730734">"Kết quả: Mạng bạn yêu cầu hiện đã sử dụng được!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Kết quả: Mạng đã được yêu cầu!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Kết quả: Mạng đã được phát hành!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Kết quả: Không phát hành được mạng!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Kết quả: Ngoại lệ khi mua dịch vụ đặc biệt cho mạng!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Kết quả: Đã nhận kết quả không có nội dung khi mua dịch vụ đặc biệt cho mạng!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Kết quả: Không thể mua dịch vụ đặc biệt cho mạng!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Kết quả: Đang xử lý yêu cầu mua dịch vụ đặc biệt cho mạng ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-zh-rCN/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-zh-rCN/strings.xml
index 229ff5d..0f22142 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-zh-rCN/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-zh-rCN/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"请求网络"</string>
+ <string name="release_network" msgid="174252378593535238">"释放网络"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"结果:"</string>
+ <string name="latency_title" msgid="963052613947017009">"划分延迟时间优先级"</string>
+ <string name="bw_title" msgid="3902162973688221344">"划分带宽优先级"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"购买 Network Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"结果:请求的网络现已可用!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"结果:已请求网络!"</string>
+ <string name="network_released" msgid="2992280481133877025">"结果:已释放网络!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"结果:未能释放网络!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"结果:购买 Network Premium 时出现异常!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"结果:购买 Network Premium 时获得空的结果!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"结果:无法购买 Network Premium!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"结果:正在购买 Network Premium…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-zh-rHK/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-zh-rHK/strings.xml
index 93c0492..18e7286 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-zh-rHK/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-zh-rHK/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"歡迎詞空白片段"</string>
+ <string name="request_network" msgid="8945235490804849914">"要求網絡"</string>
+ <string name="release_network" msgid="174252378593535238">"釋出網絡"</string>
+ <string name="ping" msgid="7890607576220714932">"Ping"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"結果:"</string>
+ <string name="latency_title" msgid="963052613947017009">"以延遲時間為優先"</string>
+ <string name="bw_title" msgid="3902162973688221344">"以頻寬為優先"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"購買進階網絡"</string>
+ <string name="network_available" msgid="4780293262690730734">"結果:要求的網絡現可使用!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"結果:已要求網絡!"</string>
+ <string name="network_released" msgid="2992280481133877025">"結果:已釋出網絡!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"結果:無法釋出網絡!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"結果:購買進階網絡時出現例外情況!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"結果:購買進階網絡時獲得空白結果!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"結果:進階網絡購買過程正在進行…"</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-zh-rTW/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-zh-rTW/strings.xml
index 229ff5d..3307122 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-zh-rTW/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-zh-rTW/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"要求網路"</string>
+ <string name="release_network" msgid="174252378593535238">"發布網路"</string>
+ <string name="ping" msgid="7890607576220714932">"連線偵測 (ping)"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"結果:"</string>
+ <string name="latency_title" msgid="963052613947017009">"優先處理延遲"</string>
+ <string name="bw_title" msgid="3902162973688221344">"優先處理頻寬"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"購買網路付費項目"</string>
+ <string name="network_available" msgid="4780293262690730734">"結果:要求的網路現已可供使用!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"結果:已要求網路!"</string>
+ <string name="network_released" msgid="2992280481133877025">"結果:已發布網路!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"結果:無法發布網路!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"結果:購買網路付費項目時發生例外狀況!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"結果:購買網路付費項目時收到空白結果!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"結果:無法購買網路付費項目!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"結果:正在購買網路付費項目..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values-zu/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-zu/strings.xml
index 229ff5d..3f329f3 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-zu/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-zu/strings.xml
@@ -3,4 +3,20 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
<string name="hello_blank_fragment" msgid="1245093642770491175">"Hello blank fragment"</string>
+ <string name="request_network" msgid="8945235490804849914">"Cela Inethiwekhi"</string>
+ <string name="release_network" msgid="174252378593535238">"Khulula Inethiwekhi"</string>
+ <string name="ping" msgid="7890607576220714932">"Qhweba"</string>
+ <string name="result_prefix" msgid="3522796186427501399">"Umphumela:"</string>
+ <string name="latency_title" msgid="963052613947017009">"Beka kuqala Ukubambezeleka"</string>
+ <string name="bw_title" msgid="3902162973688221344">"Beka kuqala Umkhawulokudonsa"</string>
+ <string name="cbs_title" msgid="5234410535569935600">"I-CBS"</string>
+ <string name="purchase" msgid="7843181995697372128">"Thenga Inethiwekhi ye-Premium"</string>
+ <string name="network_available" msgid="4780293262690730734">"Umphumela: Inethiwekhi eceliwe isiyatholakala manje!"</string>
+ <string name="network_requested" msgid="5646123922691865991">"Umphumela: Inethiwekhi iceliwe!"</string>
+ <string name="network_released" msgid="2992280481133877025">"Umphumela: Inethiwekhi isikhishiwe!"</string>
+ <string name="network_release_failed" msgid="256471231420029151">"Umphumela: Yehlulekile ukukhipha inethiwekhi!!!"</string>
+ <string name="purchase_exception" msgid="8876841120055716671">"Umphumela: Okuhlukile lapho uthenga nethiwekhi ye-premium!!!"</string>
+ <string name="purchase_empty_result" msgid="7497824191649973928">"Umphumela: Uthole umphumela ongenalutho lapho uthenga wenethiwekhi ye-premium!!!"</string>
+ <string name="premium_not_available" msgid="7346368693802644748">"Umphumela: Inethiwekhi ye-premium ayitholakaleli ukuthengwa!!!"</string>
+ <string name="purchase_in_progress" msgid="5450288183685032424">"Umphumela: Ukuthengwa kwenethiwekhi ye-premium kuyaqhubeka ..."</string>
</resources>
diff --git a/testapps/TestSliceApp/app/src/main/res/values/strings.xml b/testapps/TestSliceApp/app/src/main/res/values/strings.xml
index c2bb089..4990cec 100644
--- a/testapps/TestSliceApp/app/src/main/res/values/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values/strings.xml
@@ -1,5 +1,20 @@
-<resources>
+<resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">TestSliceApp</string>
- <!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
+ <string name="request_network">Request Network</string>
+ <string name="release_network">Release Network</string>
+ <string name="ping">Ping</string>
+ <string name="result_prefix">Result: </string>
+ <string name="latency_title">Prioritize Latency</string>
+ <string name="bw_title">Prioritize Bandwidth</string>
+ <string name="cbs_title">CBS</string>
+ <string name="purchase">Purchase Network Premium</string>
+ <string name="network_available">Result: The requested network is available now!</string>
+ <string name="network_requested">Result: The network has been requested!</string>
+ <string name="network_released">Result: The network has been released!</string>
+ <string name="network_release_failed">Result: Failed to release the network!!!</string>
+ <string name="purchase_exception">Result: Exception when purchasing network premium!!!</string>
+ <string name="purchase_empty_result">Result: Got empty result when purchasing network premium!!!</string>
+ <string name="premium_not_available">Result: The network premium is not available for purchase!!!</string>
+ <string name="purchase_in_progress">Result: The network premium purchase is in progress ...</string>
</resources>
\ No newline at end of file
diff --git a/tests/src/com/android/TelephonyTestBase.java b/tests/src/com/android/TelephonyTestBase.java
index ffda81b..d72d85e 100644
--- a/tests/src/com/android/TelephonyTestBase.java
+++ b/tests/src/com/android/TelephonyTestBase.java
@@ -24,10 +24,16 @@
import com.android.internal.telephony.PhoneConfigurationManager;
+import org.junit.After;
+import org.junit.Before;
import org.junit.Rule;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
@@ -40,6 +46,10 @@
protected TestContext mContext;
+ private final HashMap<InstanceKey, Object> mOldInstances = new HashMap<>();
+ private final LinkedList<InstanceKey> mInstanceKeys = new LinkedList<>();
+
+ @Before
public void setUp() throws Exception {
mContext = spy(new TestContext());
// Set up the looper if it does not exist on the test thread.
@@ -56,9 +66,11 @@
}
}
+ @After
public void tearDown() throws Exception {
// Ensure there are no static references to handlers after test completes.
PhoneConfigurationManager.unregisterAllMultiSimConfigChangeRegistrants();
+ restoreInstances();
}
protected final boolean waitForExecutorAction(Executor executor, long timeoutMillis) {
@@ -108,6 +120,61 @@
}
}
+ protected synchronized void replaceInstance(final Class c, final String instanceName,
+ final Object obj, final Object newValue)
+ throws Exception {
+ Field field = c.getDeclaredField(instanceName);
+ field.setAccessible(true);
+
+ InstanceKey key = new InstanceKey(c, instanceName, obj);
+ if (!mOldInstances.containsKey(key)) {
+ mOldInstances.put(key, field.get(obj));
+ mInstanceKeys.add(key);
+ }
+ field.set(obj, newValue);
+ }
+
+ private synchronized void restoreInstances() throws Exception {
+ Iterator<InstanceKey> it = mInstanceKeys.descendingIterator();
+
+ while (it.hasNext()) {
+ InstanceKey key = it.next();
+ Field field = key.mClass.getDeclaredField(key.mInstName);
+ field.setAccessible(true);
+ field.set(key.mObj, mOldInstances.get(key));
+ }
+
+ mInstanceKeys.clear();
+ mOldInstances.clear();
+ }
+
+ private static class InstanceKey {
+ public final Class mClass;
+ public final String mInstName;
+ public final Object mObj;
+ InstanceKey(final Class c, final String instName, final Object obj) {
+ mClass = c;
+ mInstName = instName;
+ mObj = obj;
+ }
+
+ @Override
+ public int hashCode() {
+ return (mClass.getName().hashCode() * 31 + mInstName.hashCode()) * 31;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null || obj.getClass() != getClass()) {
+ return false;
+ }
+
+ InstanceKey other = (InstanceKey) obj;
+ return (other.mClass == mClass && other.mInstName.equals(mInstName)
+ && other.mObj == mObj);
+ }
+ }
+
protected TestContext getTestContext() {
return mContext;
}
diff --git a/tests/src/com/android/TestContext.java b/tests/src/com/android/TestContext.java
index 7edbed9..7c3a842 100644
--- a/tests/src/com/android/TestContext.java
+++ b/tests/src/com/android/TestContext.java
@@ -31,6 +31,7 @@
import android.os.Looper;
import android.os.PersistableBundle;
import android.os.Process;
+import android.os.UserManager;
import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
@@ -58,6 +59,7 @@
@Mock TelephonyManager mMockTelephonyManager;
@Mock SubscriptionManager mMockSubscriptionManager;
@Mock ImsManager mMockImsManager;
+ @Mock UserManager mMockUserManager;
private SparseArray<PersistableBundle> mCarrierConfigs = new SparseArray<>();
@@ -147,6 +149,9 @@
case(Context.TELEPHONY_IMS_SERVICE) : {
return mMockImsManager;
}
+ case(Context.USER_SERVICE) : {
+ return mMockUserManager;
+ }
}
return null;
}
@@ -165,6 +170,9 @@
if (serviceClass == SubscriptionManager.class) {
return Context.TELEPHONY_SUBSCRIPTION_SERVICE;
}
+ if (serviceClass == UserManager.class) {
+ return Context.USER_SERVICE;
+ }
return null;
}
diff --git a/tests/src/com/android/phone/CarrierConfigLoaderTest.java b/tests/src/com/android/phone/CarrierConfigLoaderTest.java
index 60c3a84..9c425d6 100644
--- a/tests/src/com/android/phone/CarrierConfigLoaderTest.java
+++ b/tests/src/com/android/phone/CarrierConfigLoaderTest.java
@@ -192,6 +192,7 @@
* will return the right config in the XML.
*/
@Test
+ @Ignore("b/257169357")
public void testUpdateConfigForPhoneId_simLoaded_withCachedConfigInXml() throws Exception {
// Bypass case if default subId is not supported by device to reduce flakiness
if (!SubscriptionManager.isValidPhoneId(SubscriptionManager.getPhoneId(DEFAULT_SUB_ID))) {
diff --git a/tests/src/com/android/phone/ImsStateCallbackControllerTest.java b/tests/src/com/android/phone/ImsStateCallbackControllerTest.java
index 60374bc..2bd87be 100644
--- a/tests/src/com/android/phone/ImsStateCallbackControllerTest.java
+++ b/tests/src/com/android/phone/ImsStateCallbackControllerTest.java
@@ -52,6 +52,7 @@
import android.testing.TestableLooper;
import android.util.Log;
+import com.android.TelephonyTestBase;
import com.android.ims.FeatureConnector;
import com.android.ims.ImsManager;
import com.android.ims.RcsFeatureManager;
@@ -70,13 +71,12 @@
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
-import java.lang.reflect.Field;
import java.util.concurrent.Executor;
/**
* Unit tests for RcsProvisioningMonitor
*/
-public class ImsStateCallbackControllerTest {
+public class ImsStateCallbackControllerTest extends TelephonyTestBase {
private static final String TAG = "ImsStateCallbackControllerTest";
private static final int FAKE_SUB_ID_BASE = 0x0FFFFFF0;
@@ -189,6 +189,7 @@
mLooper.destroy();
mLooper = null;
}
+ super.tearDown();
}
@Test
@@ -952,13 +953,6 @@
}
}
- private static void replaceInstance(final Class c,
- final String instanceName, final Object obj, final Object newValue) throws Exception {
- Field field = c.getDeclaredField(instanceName);
- field.setAccessible(true);
- field.set(obj, newValue);
- }
-
private void makeFakeActiveSubIds(int count) {
final int[] subIds = new int[count];
for (int i = 0; i < count; i++) {
diff --git a/tests/src/com/android/phone/NotificationMgrTest.java b/tests/src/com/android/phone/NotificationMgrTest.java
index a6ee276..3e8cf28 100644
--- a/tests/src/com/android/phone/NotificationMgrTest.java
+++ b/tests/src/com/android/phone/NotificationMgrTest.java
@@ -62,6 +62,7 @@
import android.os.UserManager;
import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
+import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -69,9 +70,15 @@
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import com.android.TelephonyTestBase;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.ServiceStateTracker;
+import com.android.internal.telephony.SignalStrengthController;
+import com.android.internal.telephony.data.DataConfigManager;
+import com.android.internal.telephony.data.DataNetworkController;
+import com.android.internal.telephony.data.DataSettingsManager;
import com.android.internal.telephony.util.NotificationChannelController;
import org.junit.Before;
@@ -81,15 +88,14 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import java.lang.reflect.Field;
+import java.util.Collections;
/**
* Unit Test for NotificationMgr
*/
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
-public class NotificationMgrTest {
-
+public class NotificationMgrTest extends TelephonyTestBase {
private static final int TEST_SUB_ID = 1;
private static final long SERIAL_NUMBER_OF_USER = 1234567L;
private static final String TEST_LABEL_CF = "test_call_forwarding";
@@ -111,8 +117,14 @@
@Mock NotificationManager mNotificationManager;
@Mock SubscriptionInfo mSubscriptionInfo;
@Mock Resources mResources;
+ @Mock Context mMockedContext;
+ @Mock ServiceStateTracker mServiceStateTracker;
@Mock ServiceState mServiceState;
@Mock CarrierConfigManager mCarrierConfigManager;
+ @Mock DataNetworkController mDataNetworkController;
+ @Mock DataSettingsManager mDataSettingsManager;
+ @Mock DataConfigManager mDataConfigManager;
+ @Mock SignalStrengthController mSignalStrengthController;
private Phone[] mPhones;
private NotificationMgr mNotificationMgr;
@@ -123,6 +135,23 @@
mPhones = new Phone[]{mPhone};
replaceInstance(PhoneFactory.class, "sPhones", null, mPhones);
when(mPhone.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_GSM);
+ when(mPhone.getContext()).thenReturn(mMockedContext);
+ when(mMockedContext.getResources()).thenReturn(mResources);
+ when(mPhone.getServiceState()).thenReturn(mServiceState);
+ when(mServiceState.getNetworkRegistrationInfo(anyInt(), anyInt())).thenReturn(
+ new NetworkRegistrationInfo.Builder()
+ .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE)
+ .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME)
+ .build());
+ when(mPhone.getServiceStateTracker()).thenReturn(mServiceStateTracker);
+ mServiceStateTracker.mSS = mServiceState;
+ when(mPhone.getSignalStrengthController()).thenReturn(mSignalStrengthController);
+ when(mPhone.getDataNetworkController()).thenReturn(mDataNetworkController);
+ when(mDataNetworkController.getInternetDataDisallowedReasons()).thenReturn(
+ Collections.emptyList());
+ when(mDataNetworkController.getDataConfigManager()).thenReturn(mDataConfigManager);
+ when(mPhone.getDataSettingsManager()).thenReturn(mDataSettingsManager);
+ when(mDataSettingsManager.isDataEnabledForReason(anyInt())).thenReturn(true);
when(mApp.getSharedPreferences(anyString(), anyInt())).thenReturn(mSharedPreferences);
when(mApp.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
@@ -157,8 +186,7 @@
}
@Test
- public void testUpdateCfi_visible_noActiveSubscription_notificationNeverSent()
- throws Exception {
+ public void testUpdateCfi_visible_noActiveSubscription_notificationNeverSent() {
// Given no active subscription available
when(mSubscriptionManager.getActiveSubscriptionInfo(eq(TEST_SUB_ID))).thenReturn(null);
@@ -170,7 +198,7 @@
}
@Test
- public void testUpdateCfi_visible_hasActiveSub_singleSIM_notificationSent() throws Exception {
+ public void testUpdateCfi_visible_hasActiveSub_singleSIM_notificationSent() {
when(mTelephonyManager.getPhoneCount()).thenReturn(1);
when(mSubscriptionManager.getActiveSubscriptionInfo(eq(TEST_SUB_ID))).thenReturn(
mSubscriptionInfo);
@@ -181,8 +209,7 @@
}
@Test
- public void testUpdateCfi_visible_hasActiveSub_multiSIM_notificationSentWithoutDisplayName()
- throws Exception {
+ public void testUpdateCfi_visible_hasActiveSub_multiSIM_notificationSentWithoutDisplayName() {
when(mTelephonyManager.getPhoneCount()).thenReturn(2);
when(mSubscriptionManager.getActiveSubscriptionInfo(eq(TEST_SUB_ID))).thenReturn(
mSubscriptionInfo);
@@ -194,8 +221,7 @@
}
@Test
- public void testUpdateCfi_visible_hasActiveSub_multiSIM_notificationSentWithDisplayName()
- throws Exception {
+ public void testUpdateCfi_visible_hasActiveSub_multiSIM_notificationSentWithDisplayName() {
when(mTelephonyManager.getPhoneCount()).thenReturn(2);
when(mSubscriptionManager.getActiveSubscriptionInfo(eq(TEST_SUB_ID))).thenReturn(
mSubscriptionInfo);
@@ -207,8 +233,7 @@
}
@Test
- public void testUpdateCfi_invisible_hasUnmanagedProfile_notificationCanceled()
- throws Exception {
+ public void testUpdateCfi_invisible_hasUnmanagedProfile_notificationCanceled() {
when(mUserManager.isManagedProfile(anyInt())).thenReturn(false);
mNotificationMgr.updateCfi(TEST_SUB_ID, /*visible=*/false, /*isFresh=*/false);
@@ -217,8 +242,7 @@
}
@Test
- public void testUpdateCfi_invisible_allProfilesAreManaged_notificationNeverCanceled()
- throws Exception {
+ public void testUpdateCfi_invisible_allProfilesAreManaged_notificationNeverCanceled() {
when(mUserManager.isManagedProfile(anyInt())).thenReturn(true);
mNotificationMgr.updateCfi(TEST_SUB_ID, /*visible=*/false, /*isFresh=*/false);
@@ -227,7 +251,7 @@
}
@Test
- public void testShowDataRoamingNotification_roamingOn() throws Exception {
+ public void testShowDataRoamingNotification_roamingOn() {
mNotificationMgr.showDataRoamingNotification(TEST_SUB_ID, /*roamingOn=*/true);
verifyNotificationSentWithChannelId(
@@ -235,7 +259,7 @@
}
@Test
- public void testShowDataRoamingNotification_roamingOff() throws Exception {
+ public void testShowDataRoamingNotification_roamingOff() {
mNotificationMgr.showDataRoamingNotification(TEST_SUB_ID, /*roamingOn=*/false);
verifyNotificationSentWithChannelId(
@@ -250,8 +274,7 @@
}
@Test
- public void testUpdateNetworkSelection_justOutOfService_notificationNeverSent()
- throws Exception {
+ public void testUpdateNetworkSelection_justOutOfService_notificationNeverSent() {
prepareResourcesForNetworkSelection();
mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
@@ -265,8 +288,7 @@
}
@Test
- public void testUpdateNetworkSelection_oosEnoughTime_selectionVisibleToUser_notificationSent()
- throws Exception {
+ public void testUpdateNetworkSelection_oosEnoughTime_selectionVisibleToUser_notificationSent() {
prepareResourcesForNetworkSelection();
when(mTelephonyManager.isManualNetworkSelectionAllowed()).thenReturn(true);
PersistableBundle config = new PersistableBundle();
@@ -288,8 +310,7 @@
}
@Test
- public void testUpdateNetworkSelection_invalidSubscription_notificationNotSent()
- throws Exception {
+ public void testUpdateNetworkSelection_invalidSubscription_notificationNotSent() {
prepareResourcesForNetworkSelection();
when(mTelephonyManager.isManualNetworkSelectionAllowed()).thenReturn(true);
PersistableBundle config = new PersistableBundle();
@@ -312,8 +333,7 @@
}
@Test
- public void testUpdateNetworkSelection_nullCarrierConfig_notificationNotSent()
- throws Exception {
+ public void testUpdateNetworkSelection_nullCarrierConfig_notificationNotSent() {
prepareResourcesForNetworkSelection();
when(mCarrierConfigManager.getConfigForSubId(TEST_SUB_ID)).thenReturn(null);
@@ -329,8 +349,7 @@
}
@Test
- public void testUpdateNetworkSelection_userNotAllowedToChooseOperator_notificationNotSent()
- throws Exception {
+ public void testUpdateNetworkSelection_userNotAllowedToChooseOperator_notificationNotSent() {
prepareResourcesForNetworkSelection();
PersistableBundle config = new PersistableBundle();
@@ -353,8 +372,8 @@
}
@Test
- public void testUpdateNetworkSelection_OverrideHideCarrierNetworkSelection_notificationNotSent()
- throws Exception {
+ public void
+ testUpdateNetworkSelection_OverrideHideCarrierNetworkSelection_notificationNotSent() {
prepareResourcesForNetworkSelection();
PersistableBundle config = new PersistableBundle();
@@ -401,8 +420,7 @@
}
@Test
- public void testUpdateNetworkSelection_worldMode_userSetLTE_notificationNotSent()
- throws Exception {
+ public void testUpdateNetworkSelection_worldMode_userSetLTE_notificationNotSent() {
prepareResourcesForNetworkSelection();
PersistableBundle config = new PersistableBundle();
@@ -431,8 +449,7 @@
}
@Test
- public void testUpdateNetworkSelection_worldMode_userSetTDSCDMA_notSupported_notifNotSent()
- throws Exception {
+ public void testUpdateNetworkSelection_worldMode_userSetTDSCDMA_notSupported_notifNotSent() {
prepareResourcesForNetworkSelection();
PersistableBundle config = new PersistableBundle();
@@ -462,8 +479,7 @@
}
@Test
- public void testUpdateNetworkSelection_worldMode_userSetWCDMA_notificationSent()
- throws Exception {
+ public void testUpdateNetworkSelection_worldMode_userSetWCDMA_notificationSent() {
prepareResourcesForNetworkSelection();
PersistableBundle config = new PersistableBundle();
@@ -494,8 +510,7 @@
}
@Test
- public void testUpdateNetworkSelection_worldPhone_networkSelectionNotHide_notificationSent()
- throws Exception {
+ public void testUpdateNetworkSelection_worldPhone_networkSelectionNotHide_notificationSent() {
prepareResourcesForNetworkSelection();
PersistableBundle config = new PersistableBundle();
@@ -519,8 +534,7 @@
}
@Test
- public void testUpdateNetworkSelection_gsmBasicOptionOn_notificationSent()
- throws Exception {
+ public void testUpdateNetworkSelection_gsmBasicOptionOn_notificationSent() {
prepareResourcesForNetworkSelection();
PersistableBundle config = new PersistableBundle();
@@ -545,8 +559,7 @@
}
@Test
- public void testUpdateNetworkSelection_gsmBasicOptionOff_notificationNotSent()
- throws Exception {
+ public void testUpdateNetworkSelection_gsmBasicOptionOff_notificationNotSent() {
prepareResourcesForNetworkSelection();
PersistableBundle config = new PersistableBundle();
@@ -569,8 +582,7 @@
}
@Test
- public void testShowLimitedSimFunctionWarningNotification_forTheFirstTime_notificationSent()
- throws Exception {
+ public void testShowLimitedSimFunctionWarningNotification_forTheFirstTime_notificationSent() {
when(mResources.getText(R.string.limited_sim_function_notification_message)).thenReturn(
CARRIER_NAME);
when(mResources.getText(
@@ -584,8 +596,8 @@
}
@Test
- public void testShowLimitedSimFunctionWarningNotification_consecutiveCall_notificationSentOnce()
- throws Exception {
+ public void
+ testShowLimitedSimFunctionWarningNotification_consecutiveCall_notificationSentOnce() {
when(mResources.getText(R.string.limited_sim_function_notification_message)).thenReturn(
CARRIER_NAME);
when(mResources.getText(
@@ -602,8 +614,7 @@
}
@Test
- public void testDismissLimitedSimFunctionWarningNotification_noShowCalledBefore_noCancelSent()
- throws Exception {
+ public void testDismissLimitedSimFunctionWarningNotification_noShowCalledBefore_noCancelSent() {
// showLimitedSimFunctionWarningNotification was never called before
mNotificationMgr.dismissLimitedSimFunctionWarningNotification(TEST_SUB_ID);
@@ -612,8 +623,7 @@
}
@Test
- public void testDismissLimitedSimFunctionWarningNotification_showCalledBefore_cancelSent()
- throws Exception {
+ public void testDismissLimitedSimFunctionWarningNotification_showCalledBefore_cancelSent() {
when(mResources.getText(R.string.limited_sim_function_notification_message)).thenReturn(
CARRIER_NAME);
when(mResources.getText(
@@ -651,11 +661,4 @@
when(mApp.getString(R.string.mobile_network_settings_class)).thenReturn(
MOBILE_NETWORK_SELECTION_CLASS);
}
-
- private static void replaceInstance(final Class c,
- final String instanceName, final Object obj, final Object newValue) throws Exception {
- Field field = c.getDeclaredField(instanceName);
- field.setAccessible(true);
- field.set(obj, newValue);
- }
}
diff --git a/tests/src/com/android/phone/PhoneInterfaceManagerTest.java b/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
index 08bdb9b..6e4a65f 100644
--- a/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
+++ b/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
@@ -17,11 +17,22 @@
package com.android.phone;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
-import android.content.pm.PackageManager;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.res.Resources;
import android.telephony.RadioAccessFamily;
import android.telephony.TelephonyManager;
@@ -33,11 +44,9 @@
import com.android.internal.telephony.RILConstants;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
import java.util.Locale;
@@ -47,23 +56,24 @@
@RunWith(AndroidJUnit4.class)
public class PhoneInterfaceManagerTest extends TelephonyTestBase {
private PhoneInterfaceManager mPhoneInterfaceManager;
+ private SharedPreferences mSharedPreferences;
@Mock
PhoneGlobals mPhoneGlobals;
@Mock
Phone mPhone;
- @Mock
- PackageManager mPackageManager;
@Before
@UiThreadTest
public void setUp() throws Exception {
super.setUp();
- MockitoAnnotations.initMocks(this);
- doReturn(mPackageManager).when(mPhoneGlobals).getPackageManager();
- doReturn(false).when(mPackageManager).hasSystemFeature(
- PackageManager.FEATURE_TELEPHONY_IMS);
- mPhoneInterfaceManager = PhoneInterfaceManager.init(mPhoneGlobals);
+ // Note that PhoneInterfaceManager is a singleton. Calling init gives us a handle to the
+ // global singleton, but the context that is passed in is unused if the phone app is already
+ // alive on a test devices. You must use the spy to mock behavior. Mocks stemming from the
+ // passed context will remain unused.
+ mPhoneInterfaceManager = spy(PhoneInterfaceManager.init(mPhoneGlobals));
+ mSharedPreferences = mPhoneInterfaceManager.getSharedPreferences();
+ mSharedPreferences.edit().remove(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED).commit();
}
@Test
@@ -91,18 +101,126 @@
}
@Test
- @Ignore("b/254731907")
+ public void matchLocaleFromSupportedLocaleList_inputLocaleChangeToSupportedLocale_notMatched() {
+ Context context = mock(Context.class);
+ when(mPhone.getContext()).thenReturn(context);
+ Resources resources = mock(Resources.class);
+ when(context.getResources()).thenReturn(resources);
+ when(resources.getStringArray(anyInt()))
+ .thenReturn(new String[]{"fi-FI", "ff-Adlm-BF", "en-US"});
+
+ // Input empty string, then return default locale of ICU.
+ String resultInputEmpty = mPhoneInterfaceManager.matchLocaleFromSupportedLocaleList(mPhone,
+ Locale.forLanguageTag(""));
+
+ assertEquals("und", resultInputEmpty);
+
+ // Input en, then look up the matched supported locale. No matched, so return input locale.
+ String resultOnlyLanguage = mPhoneInterfaceManager.matchLocaleFromSupportedLocaleList(
+ mPhone,
+ Locale.forLanguageTag("en"));
+
+ assertEquals("en", resultOnlyLanguage);
+ }
+
+ @Test
public void matchLocaleFromSupportedLocaleList_inputLocaleChangeToSupportedLocale() {
+ Context context = mock(Context.class);
+ when(mPhone.getContext()).thenReturn(context);
+ Resources resources = mock(Resources.class);
+ when(context.getResources()).thenReturn(resources);
+ when(resources.getStringArray(anyInt())).thenReturn(new String[]{"zh-Hant-TW"});
+
// Input zh-TW, then look up the matched supported locale, zh-Hant-TW, instead.
- String result1 = mPhoneInterfaceManager.matchLocaleFromSupportedLocaleList(
+ String resultInputZhTw = mPhoneInterfaceManager.matchLocaleFromSupportedLocaleList(mPhone,
Locale.forLanguageTag("zh-TW"));
- assertEquals(result1, "zh-Hant-TW");
+ assertEquals("zh-Hant-TW", resultInputZhTw);
+
+ when(resources.getStringArray(anyInt())).thenReturn(
+ new String[]{"fi-FI", "ff-Adlm-BF", "ff-Latn-BF"});
// Input ff-BF, then find the matched supported locale, ff-Latn-BF, instead.
- String result2 = mPhoneInterfaceManager.matchLocaleFromSupportedLocaleList(
+ String resultFfBf = mPhoneInterfaceManager.matchLocaleFromSupportedLocaleList(mPhone,
Locale.forLanguageTag("ff-BF"));
- assertEquals(result2, "ff-Latn-BF");
+ assertEquals("ff-Latn-BF", resultFfBf);
+ }
+
+ @Test
+ public void setNullCipherAndIntegrityEnabled_successfullyEnable() {
+ doReturn(201).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+ doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
+ assertFalse(mSharedPreferences.contains(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED));
+
+ mPhoneInterfaceManager.setNullCipherAndIntegrityEnabled(true);
+
+ assertTrue(
+ mSharedPreferences.getBoolean(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED, false));
+ }
+
+ @Test
+ public void setNullCipherAndIntegrityEnabled_successfullyDisable() {
+ doReturn(201).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+ doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
+ assertFalse(mSharedPreferences.contains(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED));
+
+ mPhoneInterfaceManager.setNullCipherAndIntegrityEnabled(false);
+
+ assertFalse(
+ mSharedPreferences.getBoolean(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED, true));
+ }
+
+ @Test
+ public void setNullCipherAndIntegrityEnabled_lackingNecessaryHal() {
+ doReturn(101).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+ doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
+
+ assertThrows(UnsupportedOperationException.class, () -> {
+ mPhoneInterfaceManager.setNullCipherAndIntegrityEnabled(true);
+ });
+
+ }
+
+ @Test
+ public void setNullCipherAndIntegrityEnabled_lackingPermissions() {
+ doReturn(201).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+ doThrow(SecurityException.class).when(mPhoneInterfaceManager).enforceModifyPermission();
+
+ assertThrows(SecurityException.class, () -> {
+ mPhoneInterfaceManager.setNullCipherAndIntegrityEnabled(true);
+ });
+ }
+
+ @Test
+ public void isNullCipherAndIntegrityPreferenceEnabled() {
+ doReturn(201).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+ doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
+
+ assertTrue(mPhoneInterfaceManager.isNullCipherAndIntegrityPreferenceEnabled());
+ mPhoneInterfaceManager.setNullCipherAndIntegrityEnabled(false);
+ assertFalse(
+ mSharedPreferences.getBoolean(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED, true));
+ }
+
+ @Test
+ public void isNullCipherAndIntegrityPreferenceEnabled_lackingNecessaryHal() {
+ doReturn(101).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+ doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
+
+ assertThrows(UnsupportedOperationException.class, () -> {
+ mPhoneInterfaceManager.isNullCipherAndIntegrityPreferenceEnabled();
+ });
+
+ }
+
+ @Test
+ public void isNullCipherAndIntegrityPreferenceEnabled_lackingPermissions() {
+ doReturn(201).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+ doThrow(SecurityException.class).when(mPhoneInterfaceManager).enforceReadPermission();
+
+ assertThrows(SecurityException.class, () -> {
+ mPhoneInterfaceManager.isNullCipherAndIntegrityPreferenceEnabled();
+ });
}
}
diff --git a/tests/src/com/android/phone/PhoneUtilsTest.java b/tests/src/com/android/phone/PhoneUtilsTest.java
index eb4c248..b5ff0dc 100644
--- a/tests/src/com/android/phone/PhoneUtilsTest.java
+++ b/tests/src/com/android/phone/PhoneUtilsTest.java
@@ -22,29 +22,26 @@
import static org.mockito.Mockito.when;
import android.content.ComponentName;
+import android.os.UserHandle;
import android.telecom.PhoneAccountHandle;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import androidx.test.runner.AndroidJUnit4;
+import com.android.TelephonyTestBase;
import com.android.internal.telephony.GsmCdmaPhone;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.HashMap;
-
@RunWith(AndroidJUnit4.class)
-public class PhoneUtilsTest {
+public class PhoneUtilsTest extends TelephonyTestBase {
@Mock
private SubscriptionManager mMockSubscriptionManager;
@Mock
@@ -59,37 +56,6 @@
private PhoneAccountHandle mPhoneAccountHandleTest = new PhoneAccountHandle(
PSTN_CONNECTION_SERVICE_COMPONENT, mPhoneAccountHandleIdString);
- private HashMap<InstanceKey, Object> mOldInstances = new HashMap<InstanceKey, Object>();
-
- private ArrayList<InstanceKey> mInstanceKeys = new ArrayList<InstanceKey>();
-
- private static class InstanceKey {
- public final Class mClass;
- public final String mInstName;
- public final Object mObj;
- InstanceKey(final Class c, final String instName, final Object obj) {
- mClass = c;
- mInstName = instName;
- mObj = obj;
- }
-
- @Override
- public int hashCode() {
- return (mClass.getName().hashCode() * 31 + mInstName.hashCode()) * 31;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj == null || !(obj instanceof InstanceKey)) {
- return false;
- }
-
- InstanceKey other = (InstanceKey) obj;
- return (other.mClass == mClass && other.mInstName.equals(mInstName)
- && other.mObj == mObj);
- }
- }
-
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
@@ -100,37 +66,6 @@
replaceInstance(PhoneFactory.class, "sPhones", null, mPhones);
}
- @After
- public void tearDown() throws Exception {
- restoreInstance(PhoneFactory.class, "sPhones", null);
- }
-
- protected synchronized void replaceInstance(final Class c, final String instanceName,
- final Object obj, final Object newValue)
- throws Exception {
- Field field = c.getDeclaredField(instanceName);
- field.setAccessible(true);
-
- InstanceKey key = new InstanceKey(c, instanceName, obj);
- if (!mOldInstances.containsKey(key)) {
- mOldInstances.put(key, field.get(obj));
- mInstanceKeys.add(key);
- }
- field.set(obj, newValue);
- }
-
- protected synchronized void restoreInstance(final Class c, final String instanceName,
- final Object obj) throws Exception {
- InstanceKey key = new InstanceKey(c, instanceName, obj);
- if (mOldInstances.containsKey(key)) {
- Field field = c.getDeclaredField(instanceName);
- field.setAccessible(true);
- field.set(obj, mOldInstances.get(key));
- mOldInstances.remove(key);
- mInstanceKeys.remove(key);
- }
- }
-
@Test
public void testIsPhoneAccountActive() throws Exception {
assertTrue(PhoneUtils.isPhoneAccountActive(
@@ -148,6 +83,15 @@
PhoneAccountHandle phoneAccountHandleTest = new PhoneAccountHandle(
PSTN_CONNECTION_SERVICE_COMPONENT, mPhoneAccountHandleIdString);
assertEquals(phoneAccountHandleTest, PhoneUtils.makePstnPhoneAccountHandleWithPrefix(
- mPhoneAccountHandleIdString, "", false));
+ mPhoneAccountHandleIdString, "", false, null));
+ }
+
+ @Test
+ public void testMakePstnPhoneAccountHandleWithPrefixForAnotherUser() throws Exception {
+ UserHandle userHandle = new UserHandle(10);
+ PhoneAccountHandle phoneAccountHandleTest = new PhoneAccountHandle(
+ PSTN_CONNECTION_SERVICE_COMPONENT, mPhoneAccountHandleIdString, userHandle);
+ assertEquals(phoneAccountHandleTest, PhoneUtils.makePstnPhoneAccountHandleWithPrefix(
+ mPhoneAccountHandleIdString, "", false, userHandle));
}
}
diff --git a/tests/src/com/android/phone/SlicePurchaseControllerTest.java b/tests/src/com/android/phone/SlicePurchaseControllerTest.java
new file mode 100644
index 0000000..ebcf15d
--- /dev/null
+++ b/tests/src/com/android/phone/SlicePurchaseControllerTest.java
@@ -0,0 +1,649 @@
+/*
+ * Copyright (C) 2022 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 org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doCallRealMethod;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.AsyncResult;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Message;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.ServiceState;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.telephony.data.NetworkSliceInfo;
+import android.telephony.data.NetworkSlicingConfig;
+import android.testing.TestableLooper;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.TelephonyTestBase;
+import com.android.internal.telephony.CommandsInterface;
+import com.android.internal.telephony.Phone;
+import com.android.phone.slice.PremiumNetworkEntitlementApi;
+import com.android.phone.slice.PremiumNetworkEntitlementResponse;
+import com.android.phone.slice.SlicePurchaseController;
+import com.android.phone.slice.SlicePurchaseController.SlicePurchaseControllerBroadcastReceiver;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+
+import java.util.Collections;
+import java.util.Map;
+
+@RunWith(AndroidJUnit4.class)
+public class SlicePurchaseControllerTest extends TelephonyTestBase {
+ private static final String TAG = "SlicePurchaseControllerTest";
+ private static final int PHONE_ID = 0;
+ private static final long NOTIFICATION_TIMEOUT = 1000;
+ private static final long PURCHASE_CONDITION_TIMEOUT = 2000;
+ private static final long NETWORK_SETUP_TIMEOUT = 3000;
+ private static final long THROTTLE_TIMEOUT = 4000;
+
+ @Mock Phone mPhone;
+ @Mock Context mMockedContext;
+ @Mock CarrierConfigManager mCarrierConfigManager;
+ @Mock CommandsInterface mCommandsInterface;
+ @Mock ServiceState mServiceState;
+ @Mock PremiumNetworkEntitlementApi mPremiumNetworkEntitlementApi;
+
+ private SlicePurchaseController mSlicePurchaseController;
+ private SlicePurchaseControllerBroadcastReceiver mBroadcastReceiver;
+ private PersistableBundle mBundle;
+ private PremiumNetworkEntitlementResponse mEntitlementResponse;
+ private Handler mHandler;
+ private TestableLooper mTestableLooper;
+ @TelephonyManager.PurchasePremiumCapabilityResult private int mResult;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ HandlerThread handlerThread = new HandlerThread("SlicePurchaseControllerTest");
+ handlerThread.start();
+ mHandler = new Handler(handlerThread.getLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ AsyncResult ar = (AsyncResult) msg.obj;
+ mResult = (int) ar.result;
+ }
+ };
+ mTestableLooper = new TestableLooper(mHandler.getLooper());
+
+ doReturn(PHONE_ID).when(mPhone).getPhoneId();
+ doReturn(mMockedContext).when(mPhone).getContext();
+ doReturn(mServiceState).when(mPhone).getServiceState();
+ mPhone.mCi = mCommandsInterface;
+
+ doReturn(Context.CARRIER_CONFIG_SERVICE).when(mMockedContext)
+ .getSystemServiceName(eq(CarrierConfigManager.class));
+ doReturn(mCarrierConfigManager).when(mMockedContext)
+ .getSystemService(eq(Context.CARRIER_CONFIG_SERVICE));
+ mBundle = new PersistableBundle();
+ doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
+
+ // create a spy to mock final PendingIntent methods
+ SlicePurchaseController slicePurchaseController =
+ new SlicePurchaseController(mPhone, mHandler.getLooper());
+ mSlicePurchaseController = spy(slicePurchaseController);
+ doReturn(null).when(mSlicePurchaseController).createPendingIntent(
+ anyString(), anyInt(), anyBoolean());
+ replaceInstance(SlicePurchaseController.class, "sInstances", mSlicePurchaseController,
+ Map.of(PHONE_ID, mSlicePurchaseController));
+ replaceInstance(SlicePurchaseController.class, "mPremiumNetworkEntitlementApi",
+ mSlicePurchaseController, mPremiumNetworkEntitlementApi);
+ mEntitlementResponse = new PremiumNetworkEntitlementResponse();
+ doReturn(mEntitlementResponse).when(mPremiumNetworkEntitlementApi)
+ .checkEntitlementStatus(anyInt());
+ }
+
+ @Test
+ public void testCreatePendingIntent() {
+ doCallRealMethod().when(mSlicePurchaseController).createPendingIntent(
+ anyString(), anyInt(), anyBoolean());
+ try {
+ mSlicePurchaseController.createPendingIntent(
+ "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_CANCELED",
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY,
+ true);
+ } catch (Exception expected) {
+ return;
+ }
+ fail("Expected createPendingIntent to throw an exception");
+ }
+
+ @Test
+ public void testIsPremiumCapabilityAvailableForPurchase() {
+ assertFalse(mSlicePurchaseController.isPremiumCapabilityAvailableForPurchase(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY));
+
+ // all conditions met
+ doReturn((int) TelephonyManager.NETWORK_TYPE_BITMASK_NR).when(mPhone)
+ .getCachedAllowedNetworkTypesBitmask();
+ mBundle.putIntArray(CarrierConfigManager.KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY,
+ new int[]{TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY});
+ mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
+ SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
+ doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
+ doReturn(SubscriptionManager.getDefaultDataSubscriptionId()).when(mPhone).getSubId();
+
+ // retry to verify available
+ assertTrue(mSlicePurchaseController.isPremiumCapabilityAvailableForPurchase(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY));
+ }
+
+ @Test
+ public void testIsUrlValid() {
+ // all other conditions met
+ doReturn((int) TelephonyManager.NETWORK_TYPE_BITMASK_NR).when(mPhone)
+ .getCachedAllowedNetworkTypesBitmask();
+ mBundle.putIntArray(CarrierConfigManager.KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY,
+ new int[]{TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY});
+ doReturn(SubscriptionManager.getDefaultDataSubscriptionId()).when(mPhone).getSubId();
+
+ String[] invalidUrls = new String[] {
+ null,
+ "",
+ "www.google.com",
+ "htt://www.google.com",
+ "http//www.google.com",
+ "http:/www.google.com",
+ "file:///android_asset/",
+ "file:///android_asset/slice_store_test.html"
+ };
+ for (String url : invalidUrls) {
+ mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING, url);
+ doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
+ assertFalse(mSlicePurchaseController.isPremiumCapabilityAvailableForPurchase(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY));
+ }
+
+ mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
+ SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
+ doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
+ assertTrue(mSlicePurchaseController.isPremiumCapabilityAvailableForPurchase(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY));
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultFeatureNotSupported() {
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_FEATURE_NOT_SUPPORTED,
+ mResult);
+
+ // retry after enabling feature
+ doReturn((int) TelephonyManager.NETWORK_TYPE_BITMASK_NR).when(mPhone)
+ .getCachedAllowedNetworkTypesBitmask();
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertNotEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_FEATURE_NOT_SUPPORTED,
+ mResult);
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultCarrierDisabled() {
+ doReturn((int) TelephonyManager.NETWORK_TYPE_BITMASK_NR).when(mPhone)
+ .getCachedAllowedNetworkTypesBitmask();
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_DISABLED, mResult);
+
+ // retry after enabling carrier configs
+ mBundle.putIntArray(CarrierConfigManager.KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY,
+ new int[]{TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY});
+ mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
+ SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
+ doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertNotEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_DISABLED,
+ mResult);
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultNotDefaultDataSubscription() {
+ doReturn((int) TelephonyManager.NETWORK_TYPE_BITMASK_NR).when(mPhone)
+ .getCachedAllowedNetworkTypesBitmask();
+ mBundle.putIntArray(CarrierConfigManager.KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY,
+ new int[]{TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY});
+ mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
+ SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
+ doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(
+ TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_DEFAULT_DATA_SUBSCRIPTION,
+ mResult);
+
+ // retry on default data subscription
+ doReturn(SubscriptionManager.getDefaultDataSubscriptionId()).when(mPhone).getSubId();
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertNotEquals(
+ TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_DEFAULT_DATA_SUBSCRIPTION,
+ mResult);
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultNetworkNotAvailable() {
+ doReturn((int) TelephonyManager.NETWORK_TYPE_BITMASK_NR).when(mPhone)
+ .getCachedAllowedNetworkTypesBitmask();
+ mBundle.putIntArray(CarrierConfigManager.KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY,
+ new int[]{TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY});
+ mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
+ SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
+ doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
+ doReturn(SubscriptionManager.getDefaultDataSubscriptionId()).when(mPhone).getSubId();
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_NOT_AVAILABLE,
+ mResult);
+
+ // retry with valid network
+ doReturn(TelephonyManager.NETWORK_TYPE_NR).when(mServiceState).getDataNetworkType();
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertNotEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_NOT_AVAILABLE,
+ mResult);
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultEntitlementCheckFailed() {
+ doReturn((int) TelephonyManager.NETWORK_TYPE_BITMASK_NR).when(mPhone)
+ .getCachedAllowedNetworkTypesBitmask();
+ mBundle.putIntArray(CarrierConfigManager.KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY,
+ new int[]{TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY});
+ mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
+ SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
+ doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
+ doReturn(SubscriptionManager.getDefaultDataSubscriptionId()).when(mPhone).getSubId();
+ doReturn(TelephonyManager.NETWORK_TYPE_NR).when(mServiceState).getDataNetworkType();
+ doReturn(null).when(mPremiumNetworkEntitlementApi).checkEntitlementStatus(anyInt());
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ENTITLEMENT_CHECK_FAILED,
+ mResult);
+
+ // retry with provisioned response
+ mEntitlementResponse.mProvisionStatus =
+ PremiumNetworkEntitlementResponse.PREMIUM_NETWORK_PROVISION_STATUS_PROVISIONED;
+ doReturn(mEntitlementResponse).when(mPremiumNetworkEntitlementApi)
+ .checkEntitlementStatus(anyInt());
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED,
+ mResult);
+
+ // retry with provisioning response
+ mEntitlementResponse.mProvisionStatus =
+ PremiumNetworkEntitlementResponse.PREMIUM_NETWORK_PROVISION_STATUS_IN_PROGRESS;
+ doReturn(mEntitlementResponse).when(mPremiumNetworkEntitlementApi)
+ .checkEntitlementStatus(anyInt());
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS,
+ mResult);
+
+ // retry with disallowed response and throttling
+ mEntitlementResponse.mProvisionStatus =
+ PremiumNetworkEntitlementResponse.PREMIUM_NETWORK_PROVISION_STATUS_NOT_PROVISIONED;
+ mEntitlementResponse.mEntitlementStatus =
+ PremiumNetworkEntitlementResponse.PREMIUM_NETWORK_ENTITLEMENT_STATUS_INCOMPATIBLE;
+ doReturn(mEntitlementResponse).when(mPremiumNetworkEntitlementApi)
+ .checkEntitlementStatus(anyInt());
+ mBundle.putLong(CarrierConfigManager
+ .KEY_PREMIUM_CAPABILITY_PURCHASE_CONDITION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG,
+ PURCHASE_CONDITION_TIMEOUT);
+ doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ENTITLEMENT_CHECK_FAILED,
+ mResult);
+
+ // retry to verify throttled
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED, mResult);
+
+ // retry with valid entitlement check to verify unthrottled
+ mTestableLooper.moveTimeForward(PURCHASE_CONDITION_TIMEOUT);
+ mTestableLooper.processAllMessages();
+
+ testPurchasePremiumCapabilityResultSuccess();
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultAlreadyInProgress() {
+ sendValidPurchaseRequest();
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS,
+ mResult);
+
+ // retry to verify same result
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS,
+ mResult);
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultSuccess() {
+ sendValidPurchaseRequest();
+
+ Intent intent = new Intent();
+ intent.setAction("com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_SUCCESS");
+ intent.putExtra(SlicePurchaseController.EXTRA_PHONE_ID, PHONE_ID);
+ intent.putExtra(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY,
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY);
+ mBroadcastReceiver.onReceive(mMockedContext, intent);
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS, mResult);
+
+ // retry tested in testPurchasePremiumCapabilityResultPendingNetworkSetup
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultPendingNetworkSetup() {
+ testPurchasePremiumCapabilityResultSuccess();
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_PENDING_NETWORK_SETUP,
+ mResult);
+
+ // retry to verify unthrottled
+ mTestableLooper.moveTimeForward(NETWORK_SETUP_TIMEOUT);
+ mTestableLooper.processAllMessages();
+
+ testPurchasePremiumCapabilityResultSuccess();
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultAlreadyPurchased() {
+ testPurchasePremiumCapabilityResultSuccess();
+
+ // TODO: implement slicing config logic properly
+ NetworkSlicingConfig slicingConfig = new NetworkSlicingConfig(Collections.emptyList(),
+ Collections.singletonList(new NetworkSliceInfo.Builder()
+ .setStatus(NetworkSliceInfo.SLICE_STATUS_ALLOWED).build()));
+ mSlicePurchaseController.obtainMessage(2 /* EVENT_SLICING_CONFIG_CHANGED */,
+ new AsyncResult(null, slicingConfig, null)).sendToTarget();
+ mTestableLooper.processAllMessages();
+
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED,
+ mResult);
+
+ // retry to verify same result
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED,
+ mResult);
+
+ // retry to verify purchase expired
+ slicingConfig = new NetworkSlicingConfig(Collections.emptyList(), Collections.emptyList());
+ mSlicePurchaseController.obtainMessage(2 /* EVENT_SLICING_CONFIG_CHANGED */,
+ new AsyncResult(null, slicingConfig, null)).sendToTarget();
+ mTestableLooper.processAllMessages();
+
+ testPurchasePremiumCapabilityResultSuccess();
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultTimeout() {
+ sendValidPurchaseRequest();
+
+ mTestableLooper.moveTimeForward(NOTIFICATION_TIMEOUT);
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT, mResult);
+
+ // retry to verify throttled
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED, mResult);
+
+ // retry to verify unthrottled
+ mTestableLooper.moveTimeForward(THROTTLE_TIMEOUT);
+ mTestableLooper.processAllMessages();
+
+ testPurchasePremiumCapabilityResultSuccess();
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultUserCanceled() {
+ sendValidPurchaseRequest();
+
+ Intent intent = new Intent();
+ intent.setAction("com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_CANCELED");
+ intent.putExtra(SlicePurchaseController.EXTRA_PHONE_ID, PHONE_ID);
+ intent.putExtra(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY,
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY);
+ mBroadcastReceiver.onReceive(mMockedContext, intent);
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED, mResult);
+
+ // retry to verify throttled
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED, mResult);
+
+ // retry to verify unthrottled
+ mTestableLooper.moveTimeForward(THROTTLE_TIMEOUT);
+ mTestableLooper.processAllMessages();
+
+ testPurchasePremiumCapabilityResultSuccess();
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultCarrierError() {
+ sendValidPurchaseRequest();
+
+ Intent intent = new Intent();
+ intent.setAction(
+ "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_CARRIER_ERROR");
+ intent.putExtra(SlicePurchaseController.EXTRA_PHONE_ID, PHONE_ID);
+ intent.putExtra(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY,
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY);
+ intent.putExtra(SlicePurchaseController.EXTRA_FAILURE_CODE,
+ SlicePurchaseController.FAILURE_CODE_SERVER_UNREACHABLE);
+ mBroadcastReceiver.onReceive(mMockedContext, intent);
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR, mResult);
+
+ // retry to verify throttled
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED, mResult);
+
+ // retry to verify unthrottled
+ mTestableLooper.moveTimeForward(PURCHASE_CONDITION_TIMEOUT);
+ mTestableLooper.processAllMessages();
+
+ testPurchasePremiumCapabilityResultSuccess();
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultRequestFailed() {
+ sendValidPurchaseRequest();
+
+ Intent intent = new Intent();
+ intent.setAction(
+ "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_REQUEST_FAILED");
+ intent.putExtra(SlicePurchaseController.EXTRA_PHONE_ID, PHONE_ID);
+ intent.putExtra(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY,
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY);
+ mBroadcastReceiver.onReceive(mMockedContext, intent);
+ mTestableLooper.processAllMessages();
+ assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_REQUEST_FAILED, mResult);
+
+ // retry to verify no throttling
+ testPurchasePremiumCapabilityResultSuccess();
+ }
+
+ @Test
+ public void testPurchasePremiumCapabilityResultNotDefaultDataSubscriptionResponse() {
+ sendValidPurchaseRequest();
+
+ Intent intent = new Intent();
+ intent.setAction("com.android.phone.slice.action."
+ + "SLICE_PURCHASE_APP_RESPONSE_NOT_DEFAULT_DATA_SUBSCRIPTION");
+ intent.putExtra(SlicePurchaseController.EXTRA_PHONE_ID, PHONE_ID);
+ intent.putExtra(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY,
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY);
+ mBroadcastReceiver.onReceive(mMockedContext, intent);
+ mTestableLooper.processAllMessages();
+ assertEquals(
+ TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_DEFAULT_DATA_SUBSCRIPTION,
+ mResult);
+
+ // retry to verify no throttling
+ testPurchasePremiumCapabilityResultSuccess();
+ }
+
+ private void sendValidPurchaseRequest() {
+ clearInvocations(mMockedContext);
+
+ // feature supported
+ doReturn((int) TelephonyManager.NETWORK_TYPE_BITMASK_NR).when(mPhone)
+ .getCachedAllowedNetworkTypesBitmask();
+ // carrier supported
+ mBundle.putIntArray(CarrierConfigManager.KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY,
+ new int[]{TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY});
+ mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
+ SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
+ mBundle.putLong(CarrierConfigManager
+ .KEY_PREMIUM_CAPABILITY_NOTIFICATION_DISPLAY_TIMEOUT_MILLIS_LONG,
+ NOTIFICATION_TIMEOUT);
+ mBundle.putLong(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_NETWORK_SETUP_TIME_MILLIS_LONG,
+ NETWORK_SETUP_TIMEOUT);
+ mBundle.putLong(CarrierConfigManager
+ .KEY_PREMIUM_CAPABILITY_NOTIFICATION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG,
+ THROTTLE_TIMEOUT);
+ mBundle.putLong(CarrierConfigManager
+ .KEY_PREMIUM_CAPABILITY_PURCHASE_CONDITION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG,
+ PURCHASE_CONDITION_TIMEOUT);
+ doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
+ // default data subscription
+ doReturn(SubscriptionManager.getDefaultDataSubscriptionId()).when(mPhone).getSubId();
+ // network available
+ doReturn(TelephonyManager.NETWORK_TYPE_NR).when(mServiceState).getDataNetworkType();
+ // entitlement check passed
+ mEntitlementResponse.mEntitlementStatus =
+ PremiumNetworkEntitlementResponse.PREMIUM_NETWORK_ENTITLEMENT_STATUS_ENABLED;
+ doReturn(mEntitlementResponse).when(mPremiumNetworkEntitlementApi)
+ .checkEntitlementStatus(anyInt());
+
+ // send purchase request
+ mSlicePurchaseController.purchasePremiumCapability(
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+ mHandler.obtainMessage());
+ mTestableLooper.processAllMessages();
+
+ // verify that the purchase request was sent successfully
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mMockedContext).sendBroadcast(intentCaptor.capture());
+ Intent intent = intentCaptor.getValue();
+ assertEquals(SlicePurchaseController.ACTION_START_SLICE_PURCHASE_APP, intent.getAction());
+ assertTrue(mSlicePurchaseController.hasMessages(4 /* EVENT_PURCHASE_TIMEOUT */,
+ TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY));
+
+ // capture the broadcast receiver to fake responses from the slice purchase application
+ ArgumentCaptor<SlicePurchaseControllerBroadcastReceiver> broadcastReceiverCaptor =
+ ArgumentCaptor.forClass(SlicePurchaseControllerBroadcastReceiver.class);
+ verify(mMockedContext).registerReceiver(
+ broadcastReceiverCaptor.capture(), any(IntentFilter.class));
+ mBroadcastReceiver = broadcastReceiverCaptor.getValue();
+ }
+}
diff --git a/tests/src/com/android/phone/Telephony2gUpdaterTest.java b/tests/src/com/android/phone/Telephony2gUpdaterTest.java
new file mode 100644
index 0000000..3443767
--- /dev/null
+++ b/tests/src/com/android/phone/Telephony2gUpdaterTest.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2022 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 org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.os.UserManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.TelephonyTestBase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+@RunWith(AndroidJUnit4.class)
+public class Telephony2gUpdaterTest extends TelephonyTestBase {
+ private Telephony2gUpdater mTelephony2gUpdater;
+ private Executor mExecutor;
+
+ private UserManager mMockUserManager;
+ private TelephonyManager mMockTelephonyManager;
+ private SubscriptionManager mMockSubscriptionManager;
+
+ // 2G Bitmask is 0b10000000_01001011
+ private static final long BASE_NETWORK = 0b11111111_11111111;
+ private static final long EXPECTED_DISABLED = 0b01111111_10110100;
+ private static final long EXPECTED_ENABLED = 0b11111111_11111111;
+
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+
+ mMockTelephonyManager = mContext.getSystemService(TelephonyManager.class);
+ mMockUserManager = mContext.getSystemService(UserManager.class);
+ mMockSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
+
+ mExecutor = Executors.newSingleThreadExecutor();
+ mTelephony2gUpdater = new Telephony2gUpdater(mExecutor,
+ getTestContext(), BASE_NETWORK);
+ }
+
+ @Test
+ public void handleUserRestrictionsChanged_noSubscriptions_noAllowedNetworksChanged() {
+ when(mMockSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(
+ new ArrayList<>());
+ mTelephony2gUpdater.handleUserRestrictionsChanged(getTestContext());
+ verify(mMockTelephonyManager, never()).setAllowedNetworkTypesForReason(anyInt(), anyInt());
+ }
+
+ @Test
+ public void handleUserRestrictionsChanged_nullSubscriptions_noAllowedNetworksChanged() {
+ when(mMockSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(null);
+ mTelephony2gUpdater.handleUserRestrictionsChanged(getTestContext());
+ verify(mMockTelephonyManager, never()).setAllowedNetworkTypesForReason(anyInt(), anyInt());
+ }
+
+ @Test
+ public void handleUserRestrictionsChanged_oneSubscription_allowedNetworksUpdated() {
+ TelephonyManager tmSubscription1 = mock(TelephonyManager.class);
+ when(mMockSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(
+ Collections.singletonList(getSubInfo(1)));
+ when(mMockTelephonyManager.createForSubscriptionId(1)).thenReturn(tmSubscription1);
+ when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_CELLULAR_2G)).thenReturn(
+ true);
+
+ mTelephony2gUpdater.handleUserRestrictionsChanged(getTestContext());
+
+ System.out.println(TelephonyManager.convertNetworkTypeBitmaskToString(11L));
+ verify(tmSubscription1, times(1)).setAllowedNetworkTypesForReason(
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_DISABLED);
+ }
+
+ @Test
+ public void handleUserRestrictionsChanged_manySubscriptionsDisallow2g_allowedNetworkUpdated() {
+
+ // Two subscriptions are available
+ when(mMockSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(
+ Arrays.asList(getSubInfo(1), getSubInfo(2)));
+ TelephonyManager tmSubscription1 = mock(TelephonyManager.class);
+ TelephonyManager tmSubscription2 = mock(TelephonyManager.class);
+ when(mMockTelephonyManager.createForSubscriptionId(1)).thenReturn(tmSubscription1);
+ when(mMockTelephonyManager.createForSubscriptionId(2)).thenReturn(tmSubscription2);
+ // 2g is disallowed
+ when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_CELLULAR_2G)).thenReturn(
+ true);
+
+ mTelephony2gUpdater.handleUserRestrictionsChanged(getTestContext());
+
+ verify(tmSubscription1, times(1)).setAllowedNetworkTypesForReason(
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_DISABLED);
+ verify(tmSubscription1, times(1)).setAllowedNetworkTypesForReason(
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_DISABLED);
+ }
+
+ @Test
+ public void handleUserRestrictionsChanged_manySubscriptionsAllow2g_allowedNetworkUpdated() {
+
+ // Two subscriptions are available
+ when(mMockSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(
+ Arrays.asList(getSubInfo(1), getSubInfo(2)));
+ TelephonyManager tmSubscription1 = mock(TelephonyManager.class);
+ TelephonyManager tmSubscription2 = mock(TelephonyManager.class);
+ when(mMockTelephonyManager.createForSubscriptionId(1)).thenReturn(tmSubscription1);
+ when(mMockTelephonyManager.createForSubscriptionId(2)).thenReturn(tmSubscription2);
+
+ // 2g is allowed
+ when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_CELLULAR_2G)).thenReturn(
+ false);
+
+ mTelephony2gUpdater.handleUserRestrictionsChanged(getTestContext());
+
+ verify(tmSubscription1, times(1)).setAllowedNetworkTypesForReason(
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
+ verify(tmSubscription1, times(1)).setAllowedNetworkTypesForReason(
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
+ }
+
+ private SubscriptionInfo getSubInfo(int id) {
+ return new SubscriptionInfo(id, "890126042XXXXXXXXXXX", 0, "T-mobile", "T-mobile", 0, 255,
+ "12345", 0, null, "310", "260", "156", false, null, null);
+ }
+}
diff --git a/tests/src/com/android/phone/ecc/EccDataTest.java b/tests/src/com/android/phone/ecc/EccDataTest.java
index a52e2e7..baa4c7b 100644
--- a/tests/src/com/android/phone/ecc/EccDataTest.java
+++ b/tests/src/com/android/phone/ecc/EccDataTest.java
@@ -66,7 +66,7 @@
assertThat(loadedNumbers.contains(eccInfo.phoneNumber)).isFalse();
assertThat(eccInfo.types).isNotEmpty();
loadedNumbers.add(eccInfo.phoneNumber);
- if (eccInfo.isNormalRouted) {
+ if (eccInfo.routing == ProtobufEccData.EccInfo.Routing.NORMAL) {
loadedMncs.clear();
for (String mnc : eccInfo.normalRoutingMncs) {
assertThat(mnc).isNotEmpty();
diff --git a/tests/src/com/android/services/telephony/DisconnectCauseUtilTest.java b/tests/src/com/android/services/telephony/DisconnectCauseUtilTest.java
index 28a7b02..969622a 100644
--- a/tests/src/com/android/services/telephony/DisconnectCauseUtilTest.java
+++ b/tests/src/com/android/services/telephony/DisconnectCauseUtilTest.java
@@ -38,19 +38,14 @@
import com.android.internal.telephony.PhoneFactory;
import com.android.phone.common.R;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.Locale;
-
@RunWith(AndroidJUnit4.class)
public class DisconnectCauseUtilTest extends TelephonyTestBase {
@@ -60,42 +55,11 @@
// dynamic
private Context mContext;
- private HashMap<InstanceKey, Object> mOldInstances = new HashMap<InstanceKey, Object>();
- private ArrayList<InstanceKey> mInstanceKeys = new ArrayList<InstanceKey>();
//Mocks
@Mock
private GsmCdmaPhone mMockPhone;
- // inner classes
- private static class InstanceKey {
- public final Class mClass;
- public final String mInstName;
- public final Object mObj;
-
- InstanceKey(final Class c, final String instName, final Object obj) {
- mClass = c;
- mInstName = instName;
- mObj = obj;
- }
-
- @Override
- public int hashCode() {
- return (mClass.getName().hashCode() * 31 + mInstName.hashCode()) * 31;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj == null || !(obj instanceof InstanceKey)) {
- return false;
- }
-
- InstanceKey other = (InstanceKey) obj;
- return (other.mClass == mClass && other.mInstName.equals(mInstName)
- && other.mObj == mObj);
- }
- }
-
@Before
public void setUp() throws Exception {
super.setUp();
@@ -106,15 +70,6 @@
setSinglePhone();
}
- @After
- public void tearDown() throws Exception {
- // restoreInstance.
- // Not doing so will potentially "confuse" other tests with the mocked instance
- restoreInstance(PhoneFactory.class, "sPhones", null);
- super.tearDown();
- }
-
-
/**
* Verifies that a call drop due to loss of WIFI results in a disconnect cause of error and that
* the label, description and tone are all present.
@@ -176,33 +131,6 @@
replaceInstance(PhoneFactory.class, "sPhones", null, mPhones);
}
-
- protected synchronized void replaceInstance(final Class c, final String instanceName,
- final Object obj, final Object newValue)
- throws Exception {
- Field field = c.getDeclaredField(instanceName);
- field.setAccessible(true);
-
- InstanceKey key = new InstanceKey(c, instanceName, obj);
- if (!mOldInstances.containsKey(key)) {
- mOldInstances.put(key, field.get(obj));
- mInstanceKeys.add(key);
- }
- field.set(obj, newValue);
- }
-
- protected synchronized void restoreInstance(final Class c, final String instanceName,
- final Object obj) throws Exception {
- InstanceKey key = new InstanceKey(c, instanceName, obj);
- if (mOldInstances.containsKey(key)) {
- Field field = c.getDeclaredField(instanceName);
- field.setAccessible(true);
- field.set(obj, mOldInstances.get(key));
- mOldInstances.remove(key);
- mInstanceKeys.remove(key);
- }
- }
-
private Resources getResourcesForLocale(Context context, Locale locale) {
Configuration config = new Configuration();
config.setToDefaults();
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index f2209db..85be48d 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -192,6 +192,54 @@
/**
* Prerequisites:
* - MSIM Device, two slots with SIMs inserted
+ * - Slot 0 is IN_SERVICE, Slot 1 is OUT_OF_SERVICE (emergency calls only)
+ * - Slot 1 is in Emergency SMS Mode
+ *
+ * Result: getFirstPhoneForEmergencyCall returns the slot 1 phone
+ */
+ @Test
+ @SmallTest
+ public void testEmergencySmsModeSimEmergencyOnly() {
+ Phone slot0Phone = makeTestPhone(SLOT_0_PHONE_ID, ServiceState.STATE_IN_SERVICE,
+ false /*isEmergencyOnly*/);
+ Phone slot1Phone = makeTestPhone(SLOT_1_PHONE_ID, ServiceState.STATE_OUT_OF_SERVICE,
+ true /*isEmergencyOnly*/);
+ setDefaultPhone(slot0Phone);
+ setupDeviceConfig(slot0Phone, slot1Phone, SLOT_0_PHONE_ID);
+ setEmergencySmsMode(slot1Phone, true);
+
+ Phone resultPhone = mTestConnectionService.getFirstPhoneForEmergencyCall();
+
+ assertEquals(slot1Phone, resultPhone);
+ }
+
+ /**
+ * Prerequisites:
+ * - MSIM Device, two slots with SIMs inserted
+ * - Slot 0 is IN_SERVICE, Slot 1 is OUT_OF_SERVICE
+ * - Slot 1 is in Emergency SMS Mode
+ *
+ * Result: getFirstPhoneForEmergencyCall returns the slot 0 phone
+ */
+ @Test
+ @SmallTest
+ public void testEmergencySmsModeSimOutOfService() {
+ Phone slot0Phone = makeTestPhone(SLOT_0_PHONE_ID, ServiceState.STATE_IN_SERVICE,
+ false /*isEmergencyOnly*/);
+ Phone slot1Phone = makeTestPhone(SLOT_1_PHONE_ID, ServiceState.STATE_OUT_OF_SERVICE,
+ false /*isEmergencyOnly*/);
+ setDefaultPhone(slot0Phone);
+ setupDeviceConfig(slot0Phone, slot1Phone, SLOT_0_PHONE_ID);
+ setEmergencySmsMode(slot1Phone, true);
+
+ Phone resultPhone = mTestConnectionService.getFirstPhoneForEmergencyCall();
+
+ assertEquals(slot0Phone, resultPhone);
+ }
+
+ /**
+ * Prerequisites:
+ * - MSIM Device, two slots with SIMs inserted
* - Users default Voice SIM choice is IN_SERVICE
*
* Result: getFirstPhoneForEmergencyCall returns the default Voice SIM choice.
@@ -214,6 +262,52 @@
/**
* Prerequisites:
* - MSIM Device, two slots with SIMs inserted
+ * - Users default data SIM choice is OUT_OF_SERVICE (emergency calls only)
+ *
+ * Result: getFirstPhoneForEmergencyCall returns the default data SIM choice.
+ */
+ @Test
+ @SmallTest
+ public void testDefaultDataSimEmergencyOnly() {
+ Phone slot0Phone = makeTestPhone(SLOT_0_PHONE_ID, ServiceState.STATE_IN_SERVICE,
+ false /*isEmergencyOnly*/);
+ Phone slot1Phone = makeTestPhone(SLOT_1_PHONE_ID, ServiceState.STATE_OUT_OF_SERVICE,
+ true /*isEmergencyOnly*/);
+ setDefaultPhone(slot0Phone);
+ setupDeviceConfig(slot0Phone, slot1Phone, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ setDefaultDataPhoneId(SLOT_1_PHONE_ID);
+
+ Phone resultPhone = mTestConnectionService.getFirstPhoneForEmergencyCall();
+
+ assertEquals(slot1Phone, resultPhone);
+ }
+
+ /**
+ * Prerequisites:
+ * - MSIM Device, two slots with SIMs inserted
+ * - Users default data SIM choice is OUT_OF_SERVICE
+ *
+ * Result: getFirstPhoneForEmergencyCall does not return the default data SIM choice.
+ */
+ @Test
+ @SmallTest
+ public void testDefaultDataSimOutOfService() {
+ Phone slot0Phone = makeTestPhone(SLOT_0_PHONE_ID, ServiceState.STATE_IN_SERVICE,
+ false /*isEmergencyOnly*/);
+ Phone slot1Phone = makeTestPhone(SLOT_1_PHONE_ID, ServiceState.STATE_OUT_OF_SERVICE,
+ false /*isEmergencyOnly*/);
+ setDefaultPhone(slot0Phone);
+ setupDeviceConfig(slot0Phone, slot1Phone, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ setDefaultDataPhoneId(SLOT_1_PHONE_ID);
+
+ Phone resultPhone = mTestConnectionService.getFirstPhoneForEmergencyCall();
+
+ assertEquals(slot0Phone, resultPhone);
+ }
+
+ /**
+ * Prerequisites:
+ * - MSIM Device, two slots with SIMs inserted
* - Slot 0 is OUT_OF_SERVICE, Slot 1 is OUT_OF_SERVICE (emergency calls only)
*
* Result: getFirstPhoneForEmergencyCall returns the slot 1 phone
@@ -1433,6 +1527,24 @@
assertFalse(tc1.wasDisconnected);
}
+ /**
+ * Verifies that TelephonyManager is used to determine whether a connection is Emergency when
+ * creating an outgoing connection.
+ */
+ @Test
+ @SmallTest
+ public void testIsEmergencyDeterminedByTelephonyManager() {
+ ConnectionRequest connectionRequest = new ConnectionRequest.Builder()
+ .setAccountHandle(PHONE_ACCOUNT_HANDLE_1)
+ .setAddress(TEST_ADDRESS)
+ .build();
+ mConnection = mTestConnectionService.onCreateOutgoingConnection(
+ PHONE_ACCOUNT_HANDLE_1, connectionRequest);
+
+ verify(mTelephonyManagerProxy)
+ .isCurrentEmergencyNumber(TEST_ADDRESS.getSchemeSpecificPart());
+ }
+
private SimpleTelephonyConnection createTestConnection(PhoneAccountHandle handle,
int properties, boolean isEmergency) {
SimpleTelephonyConnection connection = new SimpleTelephonyConnection();
@@ -1615,10 +1727,18 @@
when(mPhoneFactoryProxy.getPhone(eq(SLOT_1_PHONE_ID))).thenReturn(slot1Phone);
}
+ private void setDefaultDataPhoneId(int defaultDataPhoneId) {
+ when(mSubscriptionManagerProxy.getDefaultDataPhoneId()).thenReturn(defaultDataPhoneId);
+ }
+
private void setPhoneRadioAccessFamily(Phone phone, int radioAccessFamily) {
when(phone.getRadioAccessFamily()).thenReturn(radioAccessFamily);
}
+ private void setEmergencySmsMode(Phone phone, boolean isInEmergencySmsMode) {
+ when(phone.isInEmergencySmsMode()).thenReturn(isInEmergencySmsMode);
+ }
+
private void setPhoneSlotState(int slotId, int slotState) {
when(mSubscriptionManagerProxy.getSimStateForSlotIdx(slotId)).thenReturn(slotState);
}