Merge "Increase character limit for FRP segment."
diff --git a/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java b/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
index df547a5..d9ff8ee 100644
--- a/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
+++ b/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
@@ -438,6 +438,9 @@
         if (mDownloadPackageTask != null) {
             mDownloadPackageTask.cleanUp();
         }
+        if (mBluetoothConnectTask != null) {
+            mBluetoothConnectTask.cleanUp();
+        }
     }
 
     @Override
diff --git a/src/com/android/managedprovisioning/proxy/BluetoothConnectionService.java b/src/com/android/managedprovisioning/proxy/BluetoothConnectionService.java
index ce7433b..2a3da54 100644
--- a/src/com/android/managedprovisioning/proxy/BluetoothConnectionService.java
+++ b/src/com/android/managedprovisioning/proxy/BluetoothConnectionService.java
@@ -24,10 +24,10 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.net.wifi.WifiManager;
 import android.os.IBinder;
 import android.support.v4.content.LocalBroadcastManager;
 
+import com.android.managedprovisioning.NetworkMonitor;
 import com.android.managedprovisioning.ProvisionLogger;
 
 
@@ -37,7 +37,7 @@
 /**
  * Service that establishes and manages a Bluetooth connection during device setup.
  */
-public class BluetoothConnectionService extends Service {
+public class BluetoothConnectionService extends Service implements NetworkMonitor.Callback {
 
     /**
      * Local broadcast sent when a status update should be sent. Broadcasts with this action will
@@ -78,7 +78,7 @@
     /**
      * Listen for changes in the Wi-Fi state.
      */
-    private BroadcastReceiver mWifiStateReceiver;
+    private NetworkMonitor mNetworkMonitor;
     private ClientTetherConnection mBluetoothClient;
 
     /**
@@ -117,8 +117,9 @@
                     mBluetoothDeviceId, mBluetoothMac, mBluetoothUuid);
             // Receives local broadcasts
             mLocalStatusReceiver = createLocalStatusReceiver();
-            LocalBroadcastManager.getInstance(this).registerReceiver(mLocalStatusReceiver,
-                    new IntentFilter(ACTION_LOCAL_PROVISIONING_STATUS));
+            IntentFilter filter = new IntentFilter(ACTION_LOCAL_PROVISIONING_STATUS);
+            filter.addAction(ACTION_LOCAL_SHUTDOWN_BLUETOOTH);
+            LocalBroadcastManager.getInstance(this).registerReceiver(mLocalStatusReceiver, filter);
             // Receives status updates from the device initializer
             mStatusReceiver = createStatusReceiver();
             registerReceiver(mStatusReceiver, new IntentFilter(
@@ -169,23 +170,6 @@
     }
 
     /**
-     * Create a receiver which shuts down the Bluetooth Proxy when a Wi-Fi network is connected.
-     * @return a Broadcast receiver that listens for Wi-Fi state changes
-     */
-    private BroadcastReceiver createWifiStateChangeReceiver() {
-        return new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                if (intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
-                    if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)) {
-                        clearProxy();
-                    }
-                }
-            }
-        };
-    }
-
-    /**
      * Create a {@code BroadcastReceiver} that handles local broadcasts that affect the Bluetooth
      * connection. Accepted broadcasts by action:
      * <ul>
@@ -201,6 +185,7 @@
         return new BroadcastReceiver() {
             @Override
             public void onReceive(Context context, Intent intent) {
+                ProvisionLogger.logd("Got local Bluetooth action: " + intent.getAction());
                 switch (intent.getAction()) {
                     case ACTION_LOCAL_PROVISIONING_STATUS:
                         // Get a status update from managedprovisioning
@@ -230,20 +215,33 @@
         }
         mBluetoothClient.sendStatusUpdate(
                 DeviceInitializerStatus.STATUS_STATE_CONNECT_BLUETOOTH_PROXY, "Started proxy.");
-        mWifiStateReceiver = createWifiStateChangeReceiver();
-        registerReceiver(mWifiStateReceiver, new IntentFilter(
-                WifiManager.SUPPLICANT_STATE_CHANGED_ACTION));
+        mNetworkMonitor = new NetworkMonitor(this, this);
     }
 
+    @Override
+    public void onNetworkConnected() {
+        ProvisionLogger.logw("Received Wi-Fi broadcast. Connected: " + NetworkMonitor.isConnectedToWifi(this));
+        if (NetworkMonitor.isConnectedToWifi(this)) {
+            ProvisionLogger.logd("Connected to a Wi-Fi network");
+            clearProxy();
+        }
+    }
+
+    @Override
+    public void onNetworkDisconnected() {
+        // Do nothing. Only care about network connect.
+    }
+
+
     /**
      * Stop Bluetooth network proxy. The network proxy should be removed once a Wi-Fi connection
      * is available.
      */
     private void clearProxy() {
         ProvisionLogger.logd("Clear proxy.");
-        if (mWifiStateReceiver != null) {
-            unregisterReceiver(mWifiStateReceiver);
-            mWifiStateReceiver = null;
+        if (mNetworkMonitor != null) {
+            mNetworkMonitor.close();
+            mNetworkMonitor = null;
         }
         mBluetoothClient.sendStatusUpdate(
                 DeviceInitializerStatus.STATUS_STATE_DISCONNECT_BLUETOOTH_PROXY, "Removing proxy.");
@@ -254,7 +252,7 @@
     public void onDestroy() {
         clearProxy();
         if (mLocalStatusReceiver != null) {
-            unregisterReceiver(mLocalStatusReceiver);
+            LocalBroadcastManager.getInstance(this).unregisterReceiver(mLocalStatusReceiver);
             mLocalStatusReceiver = null;
         }
         if (mStatusReceiver != null) {
diff --git a/src/com/android/managedprovisioning/task/BluetoothConnectTask.java b/src/com/android/managedprovisioning/task/BluetoothConnectTask.java
index af597ed..44144b1 100644
--- a/src/com/android/managedprovisioning/task/BluetoothConnectTask.java
+++ b/src/com/android/managedprovisioning/task/BluetoothConnectTask.java
@@ -105,6 +105,7 @@
                         return;
                     }
                     ProvisionLogger.loge("Timed out waiting for Bluetooth.");
+                    cleanUp();
                     mCallback.onError();
                 }
             },
@@ -171,6 +172,7 @@
         intent.putExtra(BluetoothConnectionService.EXTRA_BLUETOOTH_DEVICE_ID, mBluetoothDeviceId);
         intent.putExtra(BluetoothConnectionService.EXTRA_BLUETOOTH_USE_PROXY, useProxy);
         mContext.startService(intent);
+        cleanUp();
         mCallback.onSuccess();
     }