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)
This commit is contained in:
Nitin Shivpure
2018-05-11 13:26:58 +05:30
committed by Myles Watson
parent 46338558e1
commit 1b0afb9d1c
2 changed files with 15 additions and 3 deletions

View File

@@ -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);
}

View File

@@ -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