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

Commit 0ef8f2fa authored by William Escande's avatar William Escande
Browse files

SystemServer: enable/disable from main thread earlier

Bug: 262605980
Bug: 288450479
Test: atest ServiceBluetoothTests
Change-Id: I2c18c1f08af8269ee4eb7e7808529a4066a8c115
parent 206f009e
Loading
Loading
Loading
Loading
+24 −19
Original line number Original line Diff line number Diff line
@@ -955,6 +955,10 @@ class BluetoothManagerService {
        return appCount;
        return appCount;
    }
    }


    boolean enableBleFromBinder(String packageName, IBinder token) {
        return postAndWait(() -> enableBle(packageName, token));
    }

    boolean enableBle(String packageName, IBinder token) {
    boolean enableBle(String packageName, IBinder token) {
        Log.i(
        Log.i(
                TAG,
                TAG,
@@ -985,7 +989,6 @@ class BluetoothManagerService {
            return false;
            return false;
        }
        }


        // TODO(b/262605980): enableBle/disableBle should be on handler thread
        updateBleAppCount(token, true, packageName);
        updateBleAppCount(token, true, packageName);


        if (mState.oneOf(
        if (mState.oneOf(
@@ -998,12 +1001,15 @@ class BluetoothManagerService {
            return true;
            return true;
        }
        }
        synchronized (mReceiver) {
        synchronized (mReceiver) {
            // waive WRITE_SECURE_SETTINGS permission check
            sendEnableMsg(false, ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName, true);
            sendEnableMsg(false, ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName, true);
        }
        }
        return true;
        return true;
    }
    }


    boolean disableBleFromBinder(String packageName, IBinder token) {
        return postAndWait(() -> disableBle(packageName, token));
    }

    boolean disableBle(String packageName, IBinder token) {
    boolean disableBle(String packageName, IBinder token) {
        Log.i(
        Log.i(
                TAG,
                TAG,
@@ -1022,7 +1028,6 @@ class BluetoothManagerService {
            Log.i(TAG, "disableBle: Already disabled");
            Log.i(TAG, "disableBle: Already disabled");
            return false;
            return false;
        }
        }
        // TODO(b/262605980): enableBle/disableBle should be on handler thread
        updateBleAppCount(token, false, packageName);
        updateBleAppCount(token, false, packageName);


        if (mState.oneOf(STATE_BLE_ON) && !isBleAppPresent()) {
        if (mState.oneOf(STATE_BLE_ON) && !isBleAppPresent()) {
@@ -1120,6 +1125,10 @@ class BluetoothManagerService {
        return Unit.INSTANCE;
        return Unit.INSTANCE;
    }
    }


    boolean enableNoAutoConnectFromBinder(String packageName) {
        return postAndWait(() -> enableNoAutoConnect(packageName));
    }

    boolean enableNoAutoConnect(String packageName) {
    boolean enableNoAutoConnect(String packageName) {
        if (isSatelliteModeOn()) {
        if (isSatelliteModeOn()) {
            Log.d(TAG, "enableNoAutoConnect(" + packageName + "): Blocked by satellite mode");
            Log.d(TAG, "enableNoAutoConnect(" + packageName + "): Blocked by satellite mode");
@@ -1134,6 +1143,10 @@ class BluetoothManagerService {
        return true;
        return true;
    }
    }


    boolean enableFromBinder(String packageName) {
        return postAndWait(() -> enable(packageName));
    }

    boolean enable(String packageName) {
    boolean enable(String packageName) {
        Log.d(
        Log.d(
                TAG,
                TAG,
@@ -1150,19 +1163,17 @@ class BluetoothManagerService {
        synchronized (mReceiver) {
        synchronized (mReceiver) {
            mQuietEnableExternal = false;
            mQuietEnableExternal = false;
            mEnableExternal = true;
            mEnableExternal = true;
            // TODO(b/288450479): Remove clearCallingIdentity when threading is fixed
            final long callingIdentity = Binder.clearCallingIdentity();
            try {
            AirplaneModeListener.notifyUserToggledBluetooth(
            AirplaneModeListener.notifyUserToggledBluetooth(
                    mContentResolver, mCurrentUserContext, true);
                    mContentResolver, mCurrentUserContext, true);
            } finally {
                Binder.restoreCallingIdentity(callingIdentity);
            }
            sendEnableMsg(false, ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName);
            sendEnableMsg(false, ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName);
        }
        }
        return true;
        return true;
    }
    }


    boolean disableFromBinder(String packageName, boolean persist) {
        return postAndWait(() -> disable(packageName, persist));
    }

    boolean disable(String packageName, boolean persist) {
    boolean disable(String packageName, boolean persist) {
        Log.d(
        Log.d(
                TAG,
                TAG,
@@ -1172,14 +1183,8 @@ class BluetoothManagerService {
                        + (" mState=" + mState));
                        + (" mState=" + mState));


        synchronized (mReceiver) {
        synchronized (mReceiver) {
            // TODO(b/288450479): Remove clearCallingIdentity when threading is fixed
            final long callingIdentity = Binder.clearCallingIdentity();
            try {
            AirplaneModeListener.notifyUserToggledBluetooth(
            AirplaneModeListener.notifyUserToggledBluetooth(
                    mContentResolver, mCurrentUserContext, false);
                    mContentResolver, mCurrentUserContext, false);
            } finally {
                Binder.restoreCallingIdentity(callingIdentity);
            }


            if (persist) {
            if (persist) {
                setBluetoothPersistedState(BLUETOOTH_OFF);
                setBluetoothPersistedState(BLUETOOTH_OFF);
+5 −5
Original line number Original line Diff line number Diff line
@@ -113,7 +113,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub {
            return false;
            return false;
        }
        }


        return mBluetoothManagerService.enable(source.getPackageName());
        return mBluetoothManagerService.enableFromBinder(source.getPackageName());
    }
    }


    @Override
    @Override
@@ -138,7 +138,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub {
            throw new SecurityException("No permission to enable Bluetooth quietly");
            throw new SecurityException("No permission to enable Bluetooth quietly");
        }
        }


        return mBluetoothManagerService.enableNoAutoConnect(source.getPackageName());
        return mBluetoothManagerService.enableNoAutoConnectFromBinder(source.getPackageName());
    }
    }


    @Override
    @Override
@@ -163,7 +163,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub {
            return false;
            return false;
        }
        }


        return mBluetoothManagerService.disable(source.getPackageName(), persist);
        return mBluetoothManagerService.disableFromBinder(source.getPackageName(), persist);
    }
    }


    @Override
    @Override
@@ -260,7 +260,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub {
            return false;
            return false;
        }
        }


        return mBluetoothManagerService.enableBle(source.getPackageName(), token);
        return mBluetoothManagerService.enableBleFromBinder(source.getPackageName(), token);
    }
    }


    @Override
    @Override
@@ -283,7 +283,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub {
            return false;
            return false;
        }
        }


        return mBluetoothManagerService.disableBle(source.getPackageName(), token);
        return mBluetoothManagerService.disableBleFromBinder(source.getPackageName(), token);
    }
    }


    @Override
    @Override
+8 −8
Original line number Original line Diff line number Diff line
@@ -146,10 +146,10 @@ public class BluetoothServiceBinderTest {


        checkDisabled(() -> mBinder.enable(mSource));
        checkDisabled(() -> mBinder.enable(mSource));
        checkHardDenied(() -> mBinder.enable(mSource), true);
        checkHardDenied(() -> mBinder.enable(mSource), true);
        doReturn(true).when(mManagerService).enable(any());
        doReturn(true).when(mManagerService).enableFromBinder(any());
        checkGranted(() -> mBinder.enable(mSource), true);
        checkGranted(() -> mBinder.enable(mSource), true);
        verify(mUserManager).getProfileParent(any());
        verify(mUserManager).getProfileParent(any());
        verify(mManagerService).enable(eq(TAG));
        verify(mManagerService).enableFromBinder(eq(TAG));
        verifyMock();
        verifyMock();
    }
    }


@@ -193,10 +193,10 @@ public class BluetoothServiceBinderTest {


        checkDisabled(() -> mBinder.disable(mSource, true));
        checkDisabled(() -> mBinder.disable(mSource, true));
        checkHardDenied(() -> mBinder.disable(mSource, true), true);
        checkHardDenied(() -> mBinder.disable(mSource, true), true);
        doReturn(true).when(mManagerService).disable(any(), anyBoolean());
        doReturn(true).when(mManagerService).disableFromBinder(any(), anyBoolean());
        checkGranted(() -> mBinder.disable(mSource, true), true);
        checkGranted(() -> mBinder.disable(mSource, true), true);
        verify(mUserManager).getProfileParent(any());
        verify(mUserManager).getProfileParent(any());
        verify(mManagerService).disable(eq(TAG), anyBoolean());
        verify(mManagerService).disableFromBinder(eq(TAG), anyBoolean());
        verifyMock();
        verifyMock();
    }
    }


@@ -308,9 +308,9 @@ public class BluetoothServiceBinderTest {


        checkDisabled(() -> mBinder.enableBle(mSource, token));
        checkDisabled(() -> mBinder.enableBle(mSource, token));
        checkHardDenied(() -> mBinder.enableBle(mSource, token), false);
        checkHardDenied(() -> mBinder.enableBle(mSource, token), false);
        doReturn(true).when(mManagerService).enableBle(eq(TAG), eq(token));
        doReturn(true).when(mManagerService).enableBleFromBinder(eq(TAG), eq(token));
        checkGranted(() -> mBinder.enableBle(mSource, token), true);
        checkGranted(() -> mBinder.enableBle(mSource, token), true);
        verify(mManagerService).enableBle(eq(TAG), eq(token));
        verify(mManagerService).enableBleFromBinder(eq(TAG), eq(token));
        verifyMock();
        verifyMock();
    }
    }


@@ -322,9 +322,9 @@ public class BluetoothServiceBinderTest {


        checkDisabled(() -> mBinder.disableBle(mSource, token));
        checkDisabled(() -> mBinder.disableBle(mSource, token));
        checkHardDenied(() -> mBinder.disableBle(mSource, token), false);
        checkHardDenied(() -> mBinder.disableBle(mSource, token), false);
        doReturn(true).when(mManagerService).disableBle(eq(TAG), eq(token));
        doReturn(true).when(mManagerService).disableBleFromBinder(eq(TAG), eq(token));
        checkGranted(() -> mBinder.disableBle(mSource, token), true);
        checkGranted(() -> mBinder.disableBle(mSource, token), true);
        verify(mManagerService).disableBle(eq(TAG), eq(token));
        verify(mManagerService).disableBleFromBinder(eq(TAG), eq(token));
        verifyMock();
        verifyMock();
    }
    }