From 1b0afb9d1cb5692929ce27723dbcc89aa5063217 Mon Sep 17 00:00:00 2001 From: Nitin Shivpure Date: Fri, 11 May 2018 13:26:58 +0530 Subject: [PATCH] Bluetooth: Fix to avoid BluetoothPan ServiceConnection leak Usecase: 1.) Make sure BT is turned off. 2.) Go to Settings -> Network & Internet 3.) Press back from Network & Internet. 4.) Repeat above step 2000 times Expected Result: No ANR/Crashed should be seen. Observed Result: ServiceConnection leak is happening & android setting app get crashed. Root cause: TetherPreferenceController tries to get pan Proxy object, when BT is oFF, which is leaking one service connection each time Fix: getProfileProxy for Pan must only be called, when BT is turned on. Test: lifeCycle_onCreate_shouldNotInitBluetoothPanWhenBluetoothOff Bug: 79561076 Change-Id: I85208f48ce4dded94020cb156fcdb98b2cc873f9 (cherry picked from commit 31bcf6225cdabee4f810d4fe55ea32d0d43a9c5c) (cherry picked from commit 31c799305b480e56bd083a48c6acca11572ebe16) --- .../network/TetherPreferenceController.java | 3 ++- .../network/TetherPreferenceControllerTest.java | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/network/TetherPreferenceController.java b/src/com/android/settings/network/TetherPreferenceController.java index 1c9959e5a88..1f19031587d 100644 --- a/src/com/android/settings/network/TetherPreferenceController.java +++ b/src/com/android/settings/network/TetherPreferenceController.java @@ -131,7 +131,8 @@ public class TetherPreferenceController extends AbstractPreferenceController imp @Override public void onCreate(Bundle savedInstanceState) { - if (mBluetoothAdapter != null) { + if (mBluetoothAdapter != null && + mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) { mBluetoothAdapter.getProfileProxy(mContext, mBtProfileServiceListener, BluetoothProfile.PAN); } diff --git a/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java index 6166d2950d5..ac573b4dc17 100644 --- a/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java @@ -75,10 +75,21 @@ public class TetherPreferenceControllerTest { @Test public void lifeCycle_onCreate_shouldInitBluetoothPan() { + when(mBluetoothAdapter.getState()).thenReturn(BluetoothAdapter.STATE_ON); mController.onCreate(null); - verify(mBluetoothAdapter) - .getProfileProxy(mContext, mController.mBtProfileServiceListener, BluetoothProfile.PAN); + verify(mBluetoothAdapter).getState(); + verify(mBluetoothAdapter).getProfileProxy(mContext, mController.mBtProfileServiceListener, + BluetoothProfile.PAN); + } + + @Test + public void lifeCycle_onCreate_shouldNotInitBluetoothPanWhenBluetoothOff() { + when(mBluetoothAdapter.getState()).thenReturn(BluetoothAdapter.STATE_OFF); + mController.onCreate(null); + + verify(mBluetoothAdapter).getState(); + verifyNoMoreInteractions(mBluetoothAdapter); } @Test