From 995c90aa1856e8ef7b3397b775720941d3dcb133 Mon Sep 17 00:00:00 2001 From: Christine Hallstrom Date: Wed, 25 May 2016 15:49:08 -0700 Subject: [PATCH] Properly check if BT is off when shutting down radios Use BluetoothAdapter#getState() instead of BluetoothAdapter#isEnabled() when checking if Bluetooth has turned off, as isEnabled() is set to false early in the shutdown process and getState() provides a better indication of the state of BT. Bug: 27354612 Change-Id: Ic7828f0726491d49c9a14ba5d654b24f66743662 --- .../android/bluetooth/IBluetoothManager.aidl | 1 + .../server/BluetoothManagerService.java | 18 ++++++++++++++++++ .../android/server/power/ShutdownThread.java | 5 +++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/core/java/android/bluetooth/IBluetoothManager.aidl b/core/java/android/bluetooth/IBluetoothManager.aidl index 0b81ee8c547e3..2b853a373b522 100644 --- a/core/java/android/bluetooth/IBluetoothManager.aidl +++ b/core/java/android/bluetooth/IBluetoothManager.aidl @@ -37,6 +37,7 @@ interface IBluetoothManager boolean enable(); boolean enableNoAutoConnect(); boolean disable(boolean persist); + int getState(); IBluetoothGatt getBluetoothGatt(); boolean bindBluetoothProfileService(int profile, IBluetoothProfileServiceConnection proxy); diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 1f88be55ec6b6..831ce01dacafb 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -425,6 +425,24 @@ class BluetoothManagerService extends IBluetoothManager.Stub { return false; } + public int getState() { + if ((Binder.getCallingUid() != Process.SYSTEM_UID) && + (!checkIfCallerIsForegroundUser())) { + Slog.w(TAG, "getState(): not allowed for non-active and non system user"); + return BluetoothAdapter.STATE_OFF; + } + + try { + mBluetoothLock.readLock().lock(); + if (mBluetooth != null) return mBluetooth.getState(); + } catch (RemoteException e) { + Slog.e(TAG, "getState()", e); + } finally { + mBluetoothLock.readLock().unlock(); + } + return BluetoothAdapter.STATE_OFF; + } + class ClientDeathRecipient implements IBinder.DeathRecipient { public void binderDied() { if (DBG) Slog.d(TAG, "Binder is dead - unregister Ble App"); diff --git a/services/core/java/com/android/server/power/ShutdownThread.java b/services/core/java/com/android/server/power/ShutdownThread.java index 5b9d139a3e0e6..8ce2fd9c2a831 100644 --- a/services/core/java/com/android/server/power/ShutdownThread.java +++ b/services/core/java/com/android/server/power/ShutdownThread.java @@ -543,7 +543,8 @@ public final class ShutdownThread extends Thread { } try { - bluetoothOff = bluetooth == null || !bluetooth.isEnabled(); + bluetoothOff = bluetooth == null || + bluetooth.getState() == BluetoothAdapter.STATE_OFF; if (!bluetoothOff) { Log.w(TAG, "Disabling Bluetooth..."); bluetooth.disable(false); // disable but don't persist new state @@ -577,7 +578,7 @@ public final class ShutdownThread extends Thread { if (!bluetoothOff) { try { - bluetoothOff = !bluetooth.isEnabled(); + bluetoothOff = bluetooth.getState() == BluetoothAdapter.STATE_OFF; } catch (RemoteException ex) { Log.e(TAG, "RemoteException during bluetooth shutdown", ex); bluetoothOff = true;