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;
