diff options
| author | 2017-08-15 14:29:49 -0400 | |
|---|---|---|
| committer | 2017-08-15 14:29:49 -0400 | |
| commit | 0f5d402c1e893dbddb9eb629cfeb9ece153f9b16 (patch) | |
| tree | dc6f3829139d11f6f725e19713099d8fdef88b23 | |
| parent | e33e796d26beff1d98cb827735934ac1673d635b (diff) | |
Protect against weak pointer crash.
Because assuming GC won't run within any period of time is not a
valid testing strategy.
Test: runtest systemui
Change-Id: Id29ab777a70ca27b6ca33bd2a44cfb4c38f0fd09
Fixes: 64581449
2 files changed, 29 insertions, 4 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 fc7495213165..5b24f9cd97bf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java @@ -296,10 +296,13 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa @Override public void run() { - mBondState = mDevice.get().getBondState(); - mMaxConnectionState = mDevice.get().getMaxConnectionState(); - mUiHandler.removeMessages(H.MSG_PAIRED_DEVICES_CHANGED); - mUiHandler.sendEmptyMessage(H.MSG_PAIRED_DEVICES_CHANGED); + CachedBluetoothDevice device = mDevice.get(); + if (device != null) { + mBondState = device.getBondState(); + mMaxConnectionState = device.getMaxConnectionState(); + mUiHandler.removeMessages(H.MSG_PAIRED_DEVICES_CHANGED); + mUiHandler.sendEmptyMessage(H.MSG_PAIRED_DEVICES_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 4cc8bcae541a..4e7550b20659 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 @@ -137,4 +137,26 @@ public class BluetoothControllerImplTest extends SysuiTestCase { verify(callback).onBluetoothDevicesChanged(); mainLooper.destroy(); } + + @Test + public void testNullAsync_DoesNotCrash() throws Exception { + CachedBluetoothDevice device = mock(CachedBluetoothDevice.class); + when(device.getMaxConnectionState()).thenReturn(BluetoothProfile.STATE_CONNECTED); + BluetoothController.Callback callback = mock(BluetoothController.Callback.class); + mBluetoothControllerImpl.addCallback(callback); + + // Grab the main looper, we'll need it later. + TestableLooper mainLooper = new TestableLooper(Looper.getMainLooper()); + + try { + // Trigger the state getting. + assertEquals(BluetoothProfile.STATE_DISCONNECTED, + mBluetoothControllerImpl.getMaxConnectionState(null)); + + mTestableLooper.processMessages(1); + mainLooper.processAllMessages(); + } finally { + mainLooper.destroy(); + } + } } |