diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2019-09-20 04:06:19 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-09-20 04:06:19 +0000 |
commit | 9f2eaa1ef86324e632c8e9e4eeb638420df4fe5e (patch) | |
tree | 33efdc5fd1e249be598bfd4c109d840b4564a098 | |
parent | 3114144f258898f71ba085a4c1115869b844a5e2 (diff) | |
parent | 2297803e9e31178e66aa0e944172778fedc385e4 (diff) | |
download | ManagedProvisioning-android10-release.tar.gz |
Merge cherrypicks of [9428111, 9427928, 9427929, 9428294, 9428403, 9428295, 9428355, 9428112, 9428113, 9428356, 9428152, 9428153, 9428154, 9427868, 9428357, 9428358, 9427373] into qt-releaseandroid-10.0.0_r11android-10.0.0_r10android10-release
Change-Id: Ie019cf2596e54eecb1a3cf43dee1607a0868d663
3 files changed, 85 insertions, 25 deletions
diff --git a/src/com/android/managedprovisioning/common/Utils.java b/src/com/android/managedprovisioning/common/Utils.java index 987e11705..413ed79ee 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.MIME_TYPE_PROVISIONING_NFC; 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.PROVISION 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.IOException; 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 @@ public class Utils { 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 82d6fd325..62d44149d 100644 --- a/src/com/android/managedprovisioning/preprovisioning/PreProvisioningController.java +++ b/src/com/android/managedprovisioning/preprovisioning/PreProvisioningController.java @@ -288,9 +288,7 @@ public class PreProvisioningController { 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 @@ public class PreProvisioningController { } } + 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 c9034e6e8..396187685 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.verify; 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.graphics.drawable.VectorDrawable; 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 @@ public class PreProvisioningControllerTest extends AndroidTestCase { 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, never()).requestWifiPick(); + verify(mUi).requestWifiPick(); } - public void testInitiateProvisioning_doWithDownloadInfoAndUseMobileDataTrue_noWifiPicker() - throws Exception { - final ProvisioningParams params = createProvisioningParamsBuilder() - .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE) - .setDeviceAdminDownloadInfo(PACKAGE_DOWNLOAD_INFO) + 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_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 { |