summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jason Monk <jmonk@google.com> 2017-08-15 14:29:49 -0400
committer Jason Monk <jmonk@google.com> 2017-08-15 14:29:49 -0400
commit0f5d402c1e893dbddb9eb629cfeb9ece153f9b16 (patch)
treedc6f3829139d11f6f725e19713099d8fdef88b23
parente33e796d26beff1d98cb827735934ac1673d635b (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
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java22
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();
+ }
+ }
}