diff --git a/src/com/android/managedprovisioning/common/Utils.java b/src/com/android/managedprovisioning/common/Utils.java
index 987e117..413ed79 100644
--- a/src/com/android/managedprovisioning/common/Utils.java
+++ b/src/com/android/managedprovisioning/common/Utils.java
@@ -25,6 +25,9 @@
 import static android.app.admin.DevicePolicyManager.PROVISIONING_TRIGGER_CLOUD_ENROLLMENT;
 import static android.app.admin.DevicePolicyManager.PROVISIONING_TRIGGER_QR_CODE;
 import static android.app.admin.DevicePolicyManager.PROVISIONING_TRIGGER_UNSPECIFIED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
 import static android.nfc.NfcAdapter.ACTION_NDEF_DISCOVERED;
 
 import static com.android.managedprovisioning.common.Globals.ACTION_PROVISION_MANAGED_DEVICE_SILENTLY;
@@ -33,6 +36,7 @@
 import static com.android.managedprovisioning.model.ProvisioningParams.PROVISIONING_MODE_MANAGED_PROFILE_ON_FULLY_NAMAGED_DEVICE;
 
 import android.annotation.WorkerThread;
+import android.net.NetworkCapabilities;
 import android.os.Handler;
 import android.os.Looper;
 import com.android.managedprovisioning.R;
@@ -90,8 +94,10 @@
 import java.io.InputStream;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 
 import com.google.android.setupdesign.GlifLayout;
@@ -598,6 +604,27 @@
         return info != null && info.isConnected();
     }
 
+    public boolean isMobileNetworkConnectedToInternet(Context context) {
+        final ConnectivityManager connectivityManager =
+                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        return Arrays.stream(connectivityManager.getAllNetworks())
+                .filter(network -> {
+                    return Objects.nonNull(connectivityManager.getNetworkCapabilities(network));
+                })
+                .map(connectivityManager::getNetworkCapabilities)
+                .filter(this::isCellularNetwork)
+                .anyMatch(this::isConnectedToInternet);
+    }
+
+    private boolean isConnectedToInternet(NetworkCapabilities capabilities) {
+        return capabilities.hasCapability(NET_CAPABILITY_INTERNET)
+                && capabilities.hasCapability(NET_CAPABILITY_VALIDATED);
+    }
+
+    private boolean isCellularNetwork(NetworkCapabilities capabilities) {
+        return capabilities.hasTransport(TRANSPORT_CELLULAR);
+    }
+
     /**
      * Returns whether the device is currently connected to a wifi.
      */
diff --git a/src/com/android/managedprovisioning/preprovisioning/PreProvisioningController.java b/src/com/android/managedprovisioning/preprovisioning/PreProvisioningController.java
index 82d6fd3..62d4414 100644
--- a/src/com/android/managedprovisioning/preprovisioning/PreProvisioningController.java
+++ b/src/com/android/managedprovisioning/preprovisioning/PreProvisioningController.java
@@ -288,9 +288,7 @@
         if (isDeviceOwnerProvisioning()) {
             // TODO: make a general test based on deviceAdminDownloadInfo field
             // PO doesn't ever initialize that field, so OK as a general case
-            if (!mUtils.isConnectedToNetwork(mContext) && mParams.wifiInfo == null
-                    && mParams.deviceAdminDownloadInfo != null
-                    && !mParams.useMobileData) {
+            if (shouldShowWifiPicker()) {
                 // Have the user pick a wifi network if necessary.
                 // It is not possible to ask the user to pick a wifi network if
                 // the screen is locked.
@@ -326,6 +324,22 @@
         }
     }
 
+    private boolean shouldShowWifiPicker() {
+        if (mParams.wifiInfo != null) {
+            return false;
+        }
+        if (mParams.deviceAdminDownloadInfo == null) {
+            return false;
+        }
+        if (mUtils.isConnectedToWifi(mContext)) {
+            return false;
+        }
+        if (mParams.useMobileData) {
+            return !mUtils.isMobileNetworkConnectedToInternet(mContext);
+        }
+        return true;
+    }
+
     void showUserConsentScreen() {
         // Check whether provisioning is allowed for the current action
         if (!checkDevicePolicyPreconditions()) {
diff --git a/tests/instrumentation/src/com/android/managedprovisioning/preprovisioning/PreProvisioningControllerTest.java b/tests/instrumentation/src/com/android/managedprovisioning/preprovisioning/PreProvisioningControllerTest.java
index c9034e6..3961876 100644
--- a/tests/instrumentation/src/com/android/managedprovisioning/preprovisioning/PreProvisioningControllerTest.java
+++ b/tests/instrumentation/src/com/android/managedprovisioning/preprovisioning/PreProvisioningControllerTest.java
@@ -16,8 +16,7 @@
 package com.android.managedprovisioning.preprovisioning;
 
 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE;
-import static android.app.admin.DevicePolicyManager
-        .ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE;
+import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE;
 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE;
 import static android.app.admin.DevicePolicyManager.CODE_MANAGED_USERS_NOT_SUPPORTED;
 import static android.app.admin.DevicePolicyManager.CODE_OK;
@@ -36,8 +35,6 @@
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
-import static java.util.Collections.emptyList;
-
 import android.app.ActivityManager;
 import android.app.KeyguardManager;
 import android.app.admin.DevicePolicyManager;
@@ -53,11 +50,12 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.service.persistentdata.PersistentDataBlockManager;
-import androidx.test.InstrumentationRegistry;
-import androidx.test.filters.SmallTest;
 import android.test.AndroidTestCase;
 import android.text.TextUtils;
 
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
 import com.android.managedprovisioning.R;
 import com.android.managedprovisioning.analytics.TimeLogger;
 import com.android.managedprovisioning.common.IllegalProvisioningArgumentException;
@@ -647,38 +645,59 @@
         verify(mUi).startProvisioning(mUserManager.getUserHandle(), mParams);
     }
 
-    public void testInitiateProvisioning_doWithDownloadInfoAndUseMobileDataFalse_showsWifiPicker()
-            throws Exception {
-        final ProvisioningParams params = createProvisioningParamsBuilder()
-                .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE)
-                .setDeviceAdminDownloadInfo(PACKAGE_DOWNLOAD_INFO)
-                .setUseMobileData(false)
+    public void testInitiateProvisioning_showsWifiPicker() {
+        final ProvisioningParams params = createProvisioningParamsBuilderForInitiateProvisioning()
                 .build();
         initiateProvisioning(params);
         verify(mUi).requestWifiPick();
     }
 
-    public void testInitiateProvisioning_doWithNoDownloadInfoAndUseMobileDataFalse_noWifiPicker()
-            throws Exception {
-        final ProvisioningParams params = createProvisioningParamsBuilder()
-                .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE)
+    public void testInitiateProvisioning_useMobileData_showsWifiPicker() {
+        final ProvisioningParams params = createProvisioningParamsBuilderForInitiateProvisioning()
+                .setUseMobileData(true)
+                .build();
+        initiateProvisioning(params);
+        verify(mUi).requestWifiPick();
+    }
+
+    public void testInitiateProvisioning_useMobileData_noWifiPicker() {
+        when(mUtils.isMobileNetworkConnectedToInternet(mContext)).thenReturn(true);
+        final ProvisioningParams params = createProvisioningParamsBuilderForInitiateProvisioning()
                 .setUseMobileData(true)
                 .build();
         initiateProvisioning(params);
         verify(mUi, never()).requestWifiPick();
     }
 
-    public void testInitiateProvisioning_doWithDownloadInfoAndUseMobileDataTrue_noWifiPicker()
-            throws Exception {
-        final ProvisioningParams params = createProvisioningParamsBuilder()
-                .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE)
-                .setDeviceAdminDownloadInfo(PACKAGE_DOWNLOAD_INFO)
-                .setUseMobileData(true)
+    public void testInitiateProvisioning_connectedToWifi_noWifiPicker() {
+        when(mUtils.isConnectedToWifi(mContext)).thenReturn(true);
+        final ProvisioningParams params = createProvisioningParamsBuilderForInitiateProvisioning()
                 .build();
         initiateProvisioning(params);
         verify(mUi, never()).requestWifiPick();
     }
 
+    public void testInitiateProvisioning_noAdminDownloadInfo_noWifiPicker() {
+        final ProvisioningParams params = createProvisioningParamsBuilderForInitiateProvisioning()
+                .setDeviceAdminDownloadInfo(null)
+                .build();
+        initiateProvisioning(params);
+        verify(mUi, never()).requestWifiPick();
+    }
+
+    public void testInitiateProvisioning_wifiInfo_noWifiPicker() {
+        final ProvisioningParams params = createProvisioningParamsBuilderForInitiateProvisioning()
+                .setWifiInfo(new WifiInfo.Builder().setSsid(TEST_WIFI_SSID).build())
+                .build();
+        initiateProvisioning(params);
+        verify(mUi, never()).requestWifiPick();
+    }
+
+    private ProvisioningParams.Builder createProvisioningParamsBuilderForInitiateProvisioning() {
+        return createProvisioningParamsBuilder()
+                .setDeviceAdminDownloadInfo(PACKAGE_DOWNLOAD_INFO);
+    }
+
     private void prepareMocksForMaybeStartProvisioning(
             boolean skipUserConsent, boolean skipEncryption, boolean managedProfileExists)
             throws IllegalProvisioningArgumentException {
