Merge "Remove setWifiEnabled from CTS Multinetwork test"
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 7aa33da..e41b23a 100755
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -814,6 +814,7 @@
     <string name="multinetwork_status_mobile_connect_success">Mobile net connect success.</string>
     <string name="multinetwork_status_wifi_connect_timed_out">Wi-Fi connect timed out.</string>
     <string name="multinetwork_status_wifi_connect_wrong_ap">Wi-Fi connected to wrong access point.</string>
+    <string name="multinetwork_status_unable_to_toggle_wifi">User did not toggle wifi on and off.</string>
     <string name="multinetwork_status_mobile_connect_timed_out">Mobile network connect timed out.</string>
     <string name="multinetwork_status_mobile_restore_success">Mobile restore succeeded.</string>
     <string name="multinetwork_status_mobile_restore_failed">Mobile restore failed.</string>
@@ -826,6 +827,10 @@
     <string name="multinetwork_connectivity_overlay_permission_message">This test requires the CTS verifier to have the system overlay permission, please enable it in the next screen.</string>
     <string name="multinetwork_connectivity_overlay_permission_positive">Settings</string>
     <string name="multinetwork_connectivity_overlay_permission_negative">Cancel</string>
+    <string name="multinetwork_connectivity_turn_wifi_on">Please turn Wi-Fi on.</string>
+    <string name="multinetwork_connectivity_turn_wifi_off">Please turn Wi-Fi off.</string>
+    <string name="multinetwork_connectivity_turn_wifi_positive">OK</string>
+    <string name="multinetwork_connectivity_turn_wifi_negative">Cancel</string>
     <!-- Strings for NfcTestActivity -->
     <string name="nfc_test">NFC Test</string>
     <string name="nfc_test_info">The Peer-to-Peer Data Exchange tests require two devices with
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/net/MultiNetworkConnectivityTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/net/MultiNetworkConnectivityTestActivity.java
index b8ab5c4..d6ab01f 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/net/MultiNetworkConnectivityTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/net/MultiNetworkConnectivityTestActivity.java
@@ -79,7 +79,6 @@
  */
 public class MultiNetworkConnectivityTestActivity extends PassFailButtons.Activity {
     public static final String TAG = "MultinetworkTest";
-    public static final int ENABLE_DISABLE_WIFI_DELAY_MS = 3000;
     public static final int WIFI_NETWORK_CONNECT_TIMEOUT_MS = 45000;
     public static final int WIFI_NETWORK_CONNECT_TO_BE_ACTIVE_MS = 25000;
     public static final int CELLULAR_NETWORK_CONNECT_TIMEOUT_MS = 45000;
@@ -280,6 +279,44 @@
         return hadPermission;
     }
 
+    private void requestUserEnableWifiAsync(boolean enableWifi, SetWifiCallback callback) {
+        if (isWifiEnabled() == enableWifi) {
+          callback.onComplete(/* isSuccess = */ true);
+          return;
+        }
+
+        int wifiEnableMessage = enableWifi ? R.string.multinetwork_connectivity_turn_wifi_on :
+                                             R.string.multinetwork_connectivity_turn_wifi_off;
+
+        AlertDialog alertDialog = new AlertDialog.Builder(this)
+            .setMessage(wifiEnableMessage)
+            .setPositiveButton(R.string.multinetwork_connectivity_turn_wifi_positive,
+                (a, b) -> requestUserEnableWifiAsync(enableWifi, callback))
+            .setNegativeButton(R.string.multinetwork_connectivity_turn_wifi_negative,
+                (a, b) -> callback.onComplete(/* isSuccess = */ false))
+            .create();
+        alertDialog.show();
+    }
+
+    private void toggleWifiAsync(SetWifiCallback callback) {
+        // Turn off WiFi.
+        requestUserEnableWifiAsync(false, (isSuccess) -> {
+          if (isSuccess) {
+              // Turn on WiFi.
+              requestUserEnableWifiAsync(true, callback);
+          } else {
+              callback.onComplete(/* isSuccess = */ false);
+          }
+        });
+    }
+
+    private boolean isWifiEnabled() {
+      WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
+      int wifiState = wifiManager.getWifiState();
+      return wifiState == WifiManager.WIFI_STATE_ENABLED
+          || wifiState == WifiManager.WIFI_STATE_ENABLING;
+    }
+
     private void setupUserInterface() {
         setContentView(R.layout.multinetwork_connectivity);
         setInfoResources(
@@ -664,17 +701,18 @@
 
         /** Start test if not started. */
         void startTest() {
+            Handler uiThreadHandler = new Handler(Looper.getMainLooper());
             if (mValidatorState == NOT_STARTED) {
                 mTestCallback.testStarted();
-                WifiManager wifiManager = (WifiManager) getApplicationContext()
-                        .getSystemService(Context.WIFI_SERVICE);
-                wifiManager.setWifiEnabled(false);
-                mMainHandler.postDelayed(() -> {
-                    wifiManager.setWifiEnabled(true);
+                toggleWifiAsync(hasToggled -> {
+                    if (!hasToggled) {
+                        onUnableToSetWifi();
+                        return;
+                    }
                     mTestCallback.testProgress(
-                            R.string.multinetwork_connectivity_test_connect_cellular);
+                        R.string.multinetwork_connectivity_test_connect_cellular);
                     mConnectivityState.connectToCellularNetwork();
-                }, ENABLE_DISABLE_WIFI_DELAY_MS);
+                });
             }
         }
 
@@ -694,6 +732,10 @@
             endTest(false, R.string.multinetwork_status_mobile_connect_timed_out);
         }
 
+        void onUnableToSetWifi() {
+            endTest(false, R.string.multinetwork_status_unable_to_toggle_wifi);
+        }
+
         void endTest(boolean status, int messageResId) {
             Log.i(TAG, "Ending test with status " + status + " message " +
                 MultiNetworkConnectivityTestActivity.this.getResources().getString(messageResId));
@@ -996,4 +1038,8 @@
             }
         }
     }
+
+    private interface SetWifiCallback {
+        void onComplete(boolean isSuccess);
+    }
 }