Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ba33d1f authored by Nitin Shivpure's avatar Nitin Shivpure Committed by Myles Watson
Browse files

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
Merged-In: I85208f48ce4dded94020cb156fcdb98b2cc873f9
parent ea74edc9
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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);
        }
+13 −2
Original line number Diff line number Diff line
@@ -78,10 +78,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