Loading service/src/com/android/server/bluetooth/BluetoothManagerService.java +35 −20 Original line number Diff line number Diff line Loading @@ -262,6 +262,7 @@ class BluetoothManagerService { return postAndWait(() -> onFactoryReset()); } @VisibleForTesting boolean onFactoryReset() { // Clear registered LE apps to force shut-off Bluetooth clearBleApps(); Loading Loading @@ -953,6 +954,11 @@ class BluetoothManagerService { return appCount; } boolean enableBleFromBinder(String packageName, IBinder token) { return postAndWait(() -> enableBle(packageName, token)); } @VisibleForTesting boolean enableBle(String packageName, IBinder token) { Log.i( TAG, Loading Loading @@ -983,7 +989,6 @@ class BluetoothManagerService { return false; } // TODO(b/262605980): enableBle/disableBle should be on handler thread updateBleAppCount(token, true, packageName); if (mState.oneOf( Loading @@ -996,12 +1001,16 @@ class BluetoothManagerService { return true; } synchronized (mReceiver) { // waive WRITE_SECURE_SETTINGS permission check sendEnableMsg(false, ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName, true); } return true; } boolean disableBleFromBinder(String packageName, IBinder token) { return postAndWait(() -> disableBle(packageName, token)); } @VisibleForTesting boolean disableBle(String packageName, IBinder token) { Log.i( TAG, Loading @@ -1020,7 +1029,6 @@ class BluetoothManagerService { Log.i(TAG, "disableBle: Already disabled"); return false; } // TODO(b/262605980): enableBle/disableBle should be on handler thread updateBleAppCount(token, false, packageName); if (mState.oneOf(STATE_BLE_ON) && !isBleAppPresent()) { Loading Loading @@ -1118,6 +1126,11 @@ class BluetoothManagerService { return Unit.INSTANCE; } boolean enableNoAutoConnectFromBinder(String packageName) { return postAndWait(() -> enableNoAutoConnect(packageName)); } @VisibleForTesting boolean enableNoAutoConnect(String packageName) { if (isSatelliteModeOn()) { Log.d(TAG, "enableNoAutoConnect(" + packageName + "): Blocked by satellite mode"); Loading @@ -1132,6 +1145,11 @@ class BluetoothManagerService { return true; } boolean enableFromBinder(String packageName) { return postAndWait(() -> enable(packageName)); } @VisibleForTesting boolean enable(String packageName) { Log.d( TAG, Loading @@ -1148,19 +1166,18 @@ class BluetoothManagerService { synchronized (mReceiver) { mQuietEnableExternal = false; mEnableExternal = true; // TODO(b/288450479): Remove clearCallingIdentity when threading is fixed final long callingIdentity = Binder.clearCallingIdentity(); try { AirplaneModeListener.notifyUserToggledBluetooth( mContentResolver, mCurrentUserContext, true); } finally { Binder.restoreCallingIdentity(callingIdentity); } sendEnableMsg(false, ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName); } return true; } boolean disableFromBinder(String packageName, boolean persist) { return postAndWait(() -> disable(packageName, persist)); } @VisibleForTesting boolean disable(String packageName, boolean persist) { Log.d( TAG, Loading @@ -1170,14 +1187,8 @@ class BluetoothManagerService { + (" mState=" + mState)); synchronized (mReceiver) { // TODO(b/288450479): Remove clearCallingIdentity when threading is fixed final long callingIdentity = Binder.clearCallingIdentity(); try { AirplaneModeListener.notifyUserToggledBluetooth( mContentResolver, mCurrentUserContext, false); } finally { Binder.restoreCallingIdentity(callingIdentity); } if (persist) { setBluetoothPersistedState(BLUETOOTH_OFF); Loading Loading @@ -2529,7 +2540,11 @@ class BluetoothManagerService { mHandler.post(task); try { return task.get(1, TimeUnit.SECONDS); // Any method calling postAndWait should most likely be done in under 1 seconds. // But real life shows that the system server thread may sometimes be unwillingly busy. // By putting a 10 seconds timeout we make sure this will generate an ANR (on purpose), // and investigation on what is happening in the system server thread and be fixed return task.get(10, TimeUnit.SECONDS); } catch (TimeoutException | InterruptedException e) { SneakyThrow.sneakyThrow(e); } catch (ExecutionException e) { Loading service/src/com/android/server/bluetooth/BluetoothServiceBinder.java +5 −5 Original line number Diff line number Diff line Loading @@ -115,7 +115,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub { return false; } return mBluetoothManagerService.enable(source.getPackageName()); return mBluetoothManagerService.enableFromBinder(source.getPackageName()); } @Override Loading @@ -140,7 +140,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub { throw new SecurityException("No permission to enable Bluetooth quietly"); } return mBluetoothManagerService.enableNoAutoConnect(source.getPackageName()); return mBluetoothManagerService.enableNoAutoConnectFromBinder(source.getPackageName()); } @Override Loading @@ -165,7 +165,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub { return false; } return mBluetoothManagerService.disable(source.getPackageName(), persist); return mBluetoothManagerService.disableFromBinder(source.getPackageName(), persist); } @Override Loading Loading @@ -265,7 +265,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub { return false; } return mBluetoothManagerService.enableBle(source.getPackageName(), token); return mBluetoothManagerService.enableBleFromBinder(source.getPackageName(), token); } @Override Loading @@ -288,7 +288,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub { return false; } return mBluetoothManagerService.disableBle(source.getPackageName(), token); return mBluetoothManagerService.disableBleFromBinder(source.getPackageName(), token); } @Override Loading service/tests/src/com/android/server/bluetooth/BluetoothServiceBinderTest.java +8 −8 Original line number Diff line number Diff line Loading @@ -146,10 +146,10 @@ public class BluetoothServiceBinderTest { checkDisabled(() -> mBinder.enable(mSource)); checkHardDenied(() -> mBinder.enable(mSource), true); doReturn(true).when(mManagerService).enable(any()); doReturn(true).when(mManagerService).enableFromBinder(any()); checkGranted(() -> mBinder.enable(mSource), true); verify(mUserManager).getProfileParent(any()); verify(mManagerService).enable(eq(TAG)); verify(mManagerService).enableFromBinder(eq(TAG)); verifyMock(); } Loading Loading @@ -193,10 +193,10 @@ public class BluetoothServiceBinderTest { checkDisabled(() -> mBinder.disable(mSource, 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); verify(mUserManager).getProfileParent(any()); verify(mManagerService).disable(eq(TAG), anyBoolean()); verify(mManagerService).disableFromBinder(eq(TAG), anyBoolean()); verifyMock(); } Loading Loading @@ -308,9 +308,9 @@ public class BluetoothServiceBinderTest { checkDisabled(() -> mBinder.enableBle(mSource, token)); 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); verify(mManagerService).enableBle(eq(TAG), eq(token)); verify(mManagerService).enableBleFromBinder(eq(TAG), eq(token)); verifyMock(); } Loading @@ -322,9 +322,9 @@ public class BluetoothServiceBinderTest { checkDisabled(() -> mBinder.disableBle(mSource, token)); 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); verify(mManagerService).disableBle(eq(TAG), eq(token)); verify(mManagerService).disableBleFromBinder(eq(TAG), eq(token)); verifyMock(); } Loading Loading
service/src/com/android/server/bluetooth/BluetoothManagerService.java +35 −20 Original line number Diff line number Diff line Loading @@ -262,6 +262,7 @@ class BluetoothManagerService { return postAndWait(() -> onFactoryReset()); } @VisibleForTesting boolean onFactoryReset() { // Clear registered LE apps to force shut-off Bluetooth clearBleApps(); Loading Loading @@ -953,6 +954,11 @@ class BluetoothManagerService { return appCount; } boolean enableBleFromBinder(String packageName, IBinder token) { return postAndWait(() -> enableBle(packageName, token)); } @VisibleForTesting boolean enableBle(String packageName, IBinder token) { Log.i( TAG, Loading Loading @@ -983,7 +989,6 @@ class BluetoothManagerService { return false; } // TODO(b/262605980): enableBle/disableBle should be on handler thread updateBleAppCount(token, true, packageName); if (mState.oneOf( Loading @@ -996,12 +1001,16 @@ class BluetoothManagerService { return true; } synchronized (mReceiver) { // waive WRITE_SECURE_SETTINGS permission check sendEnableMsg(false, ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName, true); } return true; } boolean disableBleFromBinder(String packageName, IBinder token) { return postAndWait(() -> disableBle(packageName, token)); } @VisibleForTesting boolean disableBle(String packageName, IBinder token) { Log.i( TAG, Loading @@ -1020,7 +1029,6 @@ class BluetoothManagerService { Log.i(TAG, "disableBle: Already disabled"); return false; } // TODO(b/262605980): enableBle/disableBle should be on handler thread updateBleAppCount(token, false, packageName); if (mState.oneOf(STATE_BLE_ON) && !isBleAppPresent()) { Loading Loading @@ -1118,6 +1126,11 @@ class BluetoothManagerService { return Unit.INSTANCE; } boolean enableNoAutoConnectFromBinder(String packageName) { return postAndWait(() -> enableNoAutoConnect(packageName)); } @VisibleForTesting boolean enableNoAutoConnect(String packageName) { if (isSatelliteModeOn()) { Log.d(TAG, "enableNoAutoConnect(" + packageName + "): Blocked by satellite mode"); Loading @@ -1132,6 +1145,11 @@ class BluetoothManagerService { return true; } boolean enableFromBinder(String packageName) { return postAndWait(() -> enable(packageName)); } @VisibleForTesting boolean enable(String packageName) { Log.d( TAG, Loading @@ -1148,19 +1166,18 @@ class BluetoothManagerService { synchronized (mReceiver) { mQuietEnableExternal = false; mEnableExternal = true; // TODO(b/288450479): Remove clearCallingIdentity when threading is fixed final long callingIdentity = Binder.clearCallingIdentity(); try { AirplaneModeListener.notifyUserToggledBluetooth( mContentResolver, mCurrentUserContext, true); } finally { Binder.restoreCallingIdentity(callingIdentity); } sendEnableMsg(false, ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName); } return true; } boolean disableFromBinder(String packageName, boolean persist) { return postAndWait(() -> disable(packageName, persist)); } @VisibleForTesting boolean disable(String packageName, boolean persist) { Log.d( TAG, Loading @@ -1170,14 +1187,8 @@ class BluetoothManagerService { + (" mState=" + mState)); synchronized (mReceiver) { // TODO(b/288450479): Remove clearCallingIdentity when threading is fixed final long callingIdentity = Binder.clearCallingIdentity(); try { AirplaneModeListener.notifyUserToggledBluetooth( mContentResolver, mCurrentUserContext, false); } finally { Binder.restoreCallingIdentity(callingIdentity); } if (persist) { setBluetoothPersistedState(BLUETOOTH_OFF); Loading Loading @@ -2529,7 +2540,11 @@ class BluetoothManagerService { mHandler.post(task); try { return task.get(1, TimeUnit.SECONDS); // Any method calling postAndWait should most likely be done in under 1 seconds. // But real life shows that the system server thread may sometimes be unwillingly busy. // By putting a 10 seconds timeout we make sure this will generate an ANR (on purpose), // and investigation on what is happening in the system server thread and be fixed return task.get(10, TimeUnit.SECONDS); } catch (TimeoutException | InterruptedException e) { SneakyThrow.sneakyThrow(e); } catch (ExecutionException e) { Loading
service/src/com/android/server/bluetooth/BluetoothServiceBinder.java +5 −5 Original line number Diff line number Diff line Loading @@ -115,7 +115,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub { return false; } return mBluetoothManagerService.enable(source.getPackageName()); return mBluetoothManagerService.enableFromBinder(source.getPackageName()); } @Override Loading @@ -140,7 +140,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub { throw new SecurityException("No permission to enable Bluetooth quietly"); } return mBluetoothManagerService.enableNoAutoConnect(source.getPackageName()); return mBluetoothManagerService.enableNoAutoConnectFromBinder(source.getPackageName()); } @Override Loading @@ -165,7 +165,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub { return false; } return mBluetoothManagerService.disable(source.getPackageName(), persist); return mBluetoothManagerService.disableFromBinder(source.getPackageName(), persist); } @Override Loading Loading @@ -265,7 +265,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub { return false; } return mBluetoothManagerService.enableBle(source.getPackageName(), token); return mBluetoothManagerService.enableBleFromBinder(source.getPackageName(), token); } @Override Loading @@ -288,7 +288,7 @@ class BluetoothServiceBinder extends IBluetoothManager.Stub { return false; } return mBluetoothManagerService.disableBle(source.getPackageName(), token); return mBluetoothManagerService.disableBleFromBinder(source.getPackageName(), token); } @Override Loading
service/tests/src/com/android/server/bluetooth/BluetoothServiceBinderTest.java +8 −8 Original line number Diff line number Diff line Loading @@ -146,10 +146,10 @@ public class BluetoothServiceBinderTest { checkDisabled(() -> mBinder.enable(mSource)); checkHardDenied(() -> mBinder.enable(mSource), true); doReturn(true).when(mManagerService).enable(any()); doReturn(true).when(mManagerService).enableFromBinder(any()); checkGranted(() -> mBinder.enable(mSource), true); verify(mUserManager).getProfileParent(any()); verify(mManagerService).enable(eq(TAG)); verify(mManagerService).enableFromBinder(eq(TAG)); verifyMock(); } Loading Loading @@ -193,10 +193,10 @@ public class BluetoothServiceBinderTest { checkDisabled(() -> mBinder.disable(mSource, 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); verify(mUserManager).getProfileParent(any()); verify(mManagerService).disable(eq(TAG), anyBoolean()); verify(mManagerService).disableFromBinder(eq(TAG), anyBoolean()); verifyMock(); } Loading Loading @@ -308,9 +308,9 @@ public class BluetoothServiceBinderTest { checkDisabled(() -> mBinder.enableBle(mSource, token)); 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); verify(mManagerService).enableBle(eq(TAG), eq(token)); verify(mManagerService).enableBleFromBinder(eq(TAG), eq(token)); verifyMock(); } Loading @@ -322,9 +322,9 @@ public class BluetoothServiceBinderTest { checkDisabled(() -> mBinder.disableBle(mSource, token)); 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); verify(mManagerService).disableBle(eq(TAG), eq(token)); verify(mManagerService).disableBleFromBinder(eq(TAG), eq(token)); verifyMock(); } Loading