Merge "Notify BluetoothRouteManager when Bluetooth turned off" am: b29a6fd37e am: ce193c831a
am: 37b5906957

Change-Id: I5e145490d3b6a8c94dfd96c3982a3f7b4dd6da5d
diff --git a/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java b/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java
index 5feacbc..665b956 100644
--- a/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java
+++ b/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java
@@ -29,8 +29,13 @@
 import com.android.server.telecom.BluetoothHeadsetProxy;
 import com.android.server.telecom.TelecomSystem;
 
+import java.util.Collection;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 public class BluetoothDeviceManager {
     private final BluetoothProfile.ServiceListener mBluetoothProfileServiceListener =
@@ -60,7 +65,14 @@
                     try {
                         synchronized (mLock) {
                             mBluetoothHeadsetService = null;
-                            Log.i(BluetoothDeviceManager.this, "Lost BluetoothHeadset service.");
+                            Log.i(BluetoothDeviceManager.this, "Lost BluetoothHeadset service. " +
+                                    "Removing all tracked devices.");
+                            List<BluetoothDevice> devicesToRemove = new LinkedList<>(
+                                    mConnectedDevicesByAddress.values());
+                            mConnectedDevicesByAddress.clear();
+                            for (BluetoothDevice device : devicesToRemove) {
+                                mBluetoothRouteManager.onDeviceLost(device);
+                            }
                         }
                     } finally {
                         Log.endSession();
diff --git a/tests/src/com/android/server/telecom/tests/BluetoothDeviceManagerTest.java b/tests/src/com/android/server/telecom/tests/BluetoothDeviceManagerTest.java
index c8cde98..68e76b8 100644
--- a/tests/src/com/android/server/telecom/tests/BluetoothDeviceManagerTest.java
+++ b/tests/src/com/android/server/telecom/tests/BluetoothDeviceManagerTest.java
@@ -131,6 +131,20 @@
                 mBluetoothDeviceManager.getMostRecentlyConnectedDevice(device3.getAddress()));
     }
 
+    @SmallTest
+    public void testHeadsetServiceDisconnect() {
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device1));
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device2));
+        serviceListenerUnderTest.onServiceDisconnected(0);
+
+        verify(mRouteManager).onDeviceLost(device1);
+        verify(mRouteManager).onDeviceLost(device2);
+        assertNull(mBluetoothDeviceManager.getHeadsetService());
+        assertEquals(0, mBluetoothDeviceManager.getNumConnectedDevices());
+    }
+
     private Intent buildConnectionActionIntent(int state, BluetoothDevice device) {
         Intent i = new Intent(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
         i.putExtra(BluetoothHeadset.EXTRA_STATE, state);