diff options
| author | 2019-05-07 16:18:15 -0400 | |
|---|---|---|
| committer | 2019-05-08 10:40:58 -0400 | |
| commit | 7f27b8ee653cc124ff4a931cc3d1f3c0a43ea3cf (patch) | |
| tree | 0be8c7de8f757fee57504734898aa8fe7598192b | |
| parent | 56c006f5a6238bc73731cc8d77009c72e9602c27 (diff) | |
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
2 files changed, 40 insertions, 0 deletions
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 8916242b682b..78e845a68445 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 7f3c34e5eb1b..913654a62d62 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()); + } } |