From 7f27b8ee653cc124ff4a931cc3d1f3c0a43ea3cf Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Tue, 7 May 2019 16:18:15 -0400 Subject: [PATCH] Add BluetoothControllerImpl#onACLConnectionStateChanged In some cases, a BT device can change its ACL connection state without going through proper disconnection and then BluetoothControllerImpl would not be updated without this. Listening to this changes makes BluetoothControllerImpl aware of more state changes in BT state. In the BR, there is an ACL_DISCONNECTED right before the screenshots time, that does not have a CONNECTION_STATE_CHANGED so this seems to be the issue. Also added DEBUG logs for the different state changes Test: atest BluetoothControllerImpl Bug: 130058055 Change-Id: I40449dba4fb30673fc21ce6b9955d66261776ea2 --- .../policy/BluetoothControllerImpl.java | 20 +++++++++++++++++++ .../policy/BluetoothControllerImplTest.java | 20 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java index 8916242b682bb..78e845a68445a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java @@ -243,6 +243,7 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa @Override public void onBluetoothStateChanged(int bluetoothState) { + if (DEBUG) Log.d(TAG, "BluetoothStateChanged=" + stateToString(bluetoothState)); mEnabled = bluetoothState == BluetoothAdapter.STATE_ON || bluetoothState == BluetoothAdapter.STATE_TURNING_ON; mState = bluetoothState; @@ -252,6 +253,7 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa @Override public void onDeviceAdded(CachedBluetoothDevice cachedDevice) { + if (DEBUG) Log.d(TAG, "DeviceAdded=" + cachedDevice.getAddress()); cachedDevice.registerCallback(this); updateConnected(); mHandler.sendEmptyMessage(H.MSG_PAIRED_DEVICES_CHANGED); @@ -259,6 +261,7 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa @Override public void onDeviceDeleted(CachedBluetoothDevice cachedDevice) { + if (DEBUG) Log.d(TAG, "DeviceDeleted=" + cachedDevice.getAddress()); mCachedState.remove(cachedDevice); updateConnected(); mHandler.sendEmptyMessage(H.MSG_PAIRED_DEVICES_CHANGED); @@ -266,6 +269,7 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa @Override public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) { + if (DEBUG) Log.d(TAG, "DeviceBondStateChanged=" + cachedDevice.getAddress()); mCachedState.remove(cachedDevice); updateConnected(); mHandler.sendEmptyMessage(H.MSG_PAIRED_DEVICES_CHANGED); @@ -273,12 +277,28 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa @Override public void onDeviceAttributesChanged() { + if (DEBUG) Log.d(TAG, "DeviceAttributesChanged"); updateConnected(); mHandler.sendEmptyMessage(H.MSG_PAIRED_DEVICES_CHANGED); } @Override public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) { + if (DEBUG) { + Log.d(TAG, "ConnectionStateChanged=" + cachedDevice.getAddress() + " " + + stateToString(state)); + } + mCachedState.remove(cachedDevice); + updateConnected(); + mHandler.sendEmptyMessage(H.MSG_STATE_CHANGED); + } + + @Override + public void onAclConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) { + if (DEBUG) { + Log.d(TAG, "ACLConnectionStateChanged=" + cachedDevice.getAddress() + " " + + stateToString(state)); + } mCachedState.remove(cachedDevice); updateConnected(); mHandler.sendEmptyMessage(H.MSG_STATE_CHANGED); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java index 7f3c34e5eb1bc..913654a62d62f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java @@ -17,7 +17,10 @@ package com.android.systemui.statusbar.policy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -198,4 +201,21 @@ public class BluetoothControllerImplTest extends SysuiTestCase { assertFalse(mBluetoothControllerImpl.isBluetoothConnecting()); assertFalse(mBluetoothControllerImpl.isBluetoothConnected()); } + + @Test + public void testOnACLConnectionStateChange_updatesBluetoothStateOnConnection() { + BluetoothController.Callback callback = mock(BluetoothController.Callback.class); + mBluetoothControllerImpl.addCallback(callback); + + assertFalse(mBluetoothControllerImpl.isBluetoothConnected()); + CachedBluetoothDevice device = mock(CachedBluetoothDevice.class); + mDevices.add(device); + when(device.isConnected()).thenReturn(true); + when(device.getMaxConnectionState()).thenReturn(BluetoothProfile.STATE_CONNECTED); + reset(callback); + mBluetoothControllerImpl.onAclConnectionStateChanged(device, + BluetoothProfile.STATE_CONNECTED); + assertTrue(mBluetoothControllerImpl.isBluetoothConnected()); + verify(callback, atLeastOnce()).onBluetoothStateChange(anyBoolean()); + } }