Merge "Import translations. DO NOT MERGE ANYWHERE" into udc-mainline-prod
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d36dfec..8d03ed7 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -164,6 +164,9 @@
     <!-- Needed to set user association to a certain sim -->
     <uses-permission android:name="android.permission.MANAGE_SUBSCRIPTION_USER_ASSOCIATION"/>
 
+    <!-- Needed to register for UWB state changes for satellite communication -->
+    <uses-permission android:name="android.permission.UWB_PRIVILEGED"/>
+
     <permission android:name="com.android.phone.permission.ACCESS_LAST_KNOWN_CELL_ID"
                 android:label="Access last known cell identity."
                 android:protectionLevel="signature"/>
diff --git a/assets/CarrierRestrictionOperatorDetails.json b/assets/CarrierRestrictionOperatorDetails.json
index 166cc39..f3da100 100644
--- a/assets/CarrierRestrictionOperatorDetails.json
+++ b/assets/CarrierRestrictionOperatorDetails.json
@@ -1,4 +1,5 @@
 {
   "_comment": "Operator should register with its application package name, carrierId and all the corresponding  SHAIDs",
-  "_comment": "Example format :: << \"packageName\" : {\"carrierId\":<int>, \"callerSHA1Id\":[<SHAID1>, <SHAID2>]} >>"
+  "_comment": "Example format :: << \"packageName\" : {\"carrierId\":<int>, \"callerSHA1Id\":[<SHAID1>, <SHAID2>]} >>",
+  "com.vzw.hss.myverizon":{"carrierId":1839,"callerSHA1Id":["C58EE7871896786F8BF70EBDB137DE10074043E9","AE23A03436DF07B0CD70FE881CDA2EC1D21215D7B7B0CC68E67B67F5DF89526A"]}
 }
\ No newline at end of file
diff --git a/ecc/input/eccdata.txt b/ecc/input/eccdata.txt
index 3b860dd..e78c48b 100644
--- a/ecc/input/eccdata.txt
+++ b/ecc/input/eccdata.txt
@@ -1150,14 +1150,17 @@
   eccs {
     phone_number: "17"
     types: POLICE
+    routing: NORMAL
   }
   eccs {
     phone_number: "15"
     types: AMBULANCE
+    routing: NORMAL
   }
   eccs {
     phone_number: "18"
     types: FIRE
+    routing: NORMAL
   }
   ecc_fallback: "112"
 }
@@ -2413,14 +2416,17 @@
   eccs {
     phone_number: "17"
     types: POLICE
+    routing: NORMAL
   }
   eccs {
     phone_number: "15"
     types: AMBULANCE
+    routing: NORMAL
   }
   eccs {
     phone_number: "18"
     types: FIRE
+    routing: NORMAL
   }
   ecc_fallback: "112"
 }
diff --git a/ecc/output/eccdata b/ecc/output/eccdata
index e34e47b..5633c41 100644
--- a/ecc/output/eccdata
+++ b/ecc/output/eccdata
Binary files differ
diff --git a/src/com/android/phone/slice/SlicePurchaseController.java b/src/com/android/phone/slice/SlicePurchaseController.java
index 4166b1e..ef8780c 100644
--- a/src/com/android/phone/slice/SlicePurchaseController.java
+++ b/src/com/android/phone/slice/SlicePurchaseController.java
@@ -679,8 +679,8 @@
         }
     }
 
-    /*
-      return a new PremiumNetworkEntitlementApi object.
+    /**
+     * @return A new PremiumNetworkEntitlementApi object.
      */
     @VisibleForTesting
     public PremiumNetworkEntitlementApi getPremiumNetworkEntitlementApi() {
@@ -987,6 +987,7 @@
         int[] supportedCapabilities = getCarrierConfigs().getIntArray(
                 CarrierConfigManager.KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY);
         if (supportedCapabilities == null) {
+            logd("No premium capabilities are supported by the carrier.");
             return false;
         }
         return Arrays.stream(supportedCapabilities)
@@ -1015,8 +1016,13 @@
     private boolean arePremiumCapabilitiesSupportedByDevice() {
         if ((mPhone.getCachedAllowedNetworkTypesBitmask()
                 & TelephonyManager.NETWORK_TYPE_BITMASK_NR) == 0) {
+            logd("Premium capabilities unsupported because NR is not allowed on the device.");
             return false;
         }
+        if (!mIsSlicingUpsellEnabled) {
+            logd("Premium capabilities unsupported because "
+                    + "slicing upsell is disabled on the device.");
+        }
         return mIsSlicingUpsellEnabled;
     }
 
@@ -1048,7 +1054,13 @@
 
     private boolean isNetworkAvailable() {
         if (mPhone.getServiceState().getDataRoaming()) {
-            logd("Network unavailable because it is roaming.");
+            logd("Network unavailable because device is roaming.");
+            return false;
+        }
+
+        if (!mPhone.getDataSettingsManager().isDataEnabledForReason(
+                TelephonyManager.DATA_ENABLED_REASON_USER)) {
+            logd("Network unavailable because user data is disabled.");
             return false;
         }
 
diff --git a/tests/src/com/android/phone/slice/SlicePurchaseControllerTest.java b/tests/src/com/android/phone/slice/SlicePurchaseControllerTest.java
index a29ed09..d79b305 100644
--- a/tests/src/com/android/phone/slice/SlicePurchaseControllerTest.java
+++ b/tests/src/com/android/phone/slice/SlicePurchaseControllerTest.java
@@ -57,6 +57,7 @@
 import com.android.TelephonyTestBase;
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.data.DataSettingsManager;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -88,6 +89,7 @@
     @Mock CarrierConfigManager mCarrierConfigManager;
     @Mock CommandsInterface mCommandsInterface;
     @Mock ServiceState mServiceState;
+    @Mock DataSettingsManager mDataSettingsManager;
     @Mock PremiumNetworkEntitlementApi mPremiumNetworkEntitlementApi;
     @Mock SharedPreferences mSharedPreferences;
     @Mock SharedPreferences.Editor mEditor;
@@ -116,6 +118,7 @@
         doReturn(PHONE_ID).when(mPhone).getPhoneId();
         doReturn(mContext).when(mPhone).getContext();
         doReturn(mServiceState).when(mPhone).getServiceState();
+        doReturn(mDataSettingsManager).when(mPhone).getDataSettingsManager();
         mPhone.mCi = mCommandsInterface;
 
         doReturn(mCarrierConfigManager).when(mContext)
@@ -357,6 +360,7 @@
 
         // retry with valid network
         doReturn(TelephonyManager.NETWORK_TYPE_NR).when(mServiceState).getDataNetworkType();
+        doReturn(true).when(mDataSettingsManager).isDataEnabledForReason(anyInt());
 
         mSlicePurchaseController.purchasePremiumCapability(
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, mHandler.obtainMessage());
@@ -375,6 +379,7 @@
                 SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
         doReturn(SubscriptionManager.getDefaultDataSubscriptionId()).when(mPhone).getSubId();
         doReturn(TelephonyManager.NETWORK_TYPE_NR).when(mServiceState).getDataNetworkType();
+        doReturn(true).when(mDataSettingsManager).isDataEnabledForReason(anyInt());
         doReturn(null).when(mPremiumNetworkEntitlementApi).checkEntitlementStatus(anyInt());
 
         mSlicePurchaseController.purchasePremiumCapability(
@@ -713,6 +718,7 @@
         doReturn(SubscriptionManager.getDefaultDataSubscriptionId()).when(mPhone).getSubId();
         // network available
         doReturn(TelephonyManager.NETWORK_TYPE_NR).when(mServiceState).getDataNetworkType();
+        doReturn(true).when(mDataSettingsManager).isDataEnabledForReason(anyInt());
         // entitlement check passed
         mEntitlementResponse.mEntitlementStatus =
                 PremiumNetworkEntitlementResponse.PREMIUM_NETWORK_ENTITLEMENT_STATUS_DISABLED;