Loading services/core/java/com/android/server/BluetoothManagerService.java +46 −50 Original line number Original line Diff line number Diff line Loading @@ -56,6 +56,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.io.FileDescriptor; import java.io.FileDescriptor; import java.io.PrintWriter; import java.io.PrintWriter; import java.util.concurrent.ConcurrentHashMap; import java.util.HashMap; import java.util.HashMap; import java.util.Map; import java.util.Map; Loading Loading @@ -115,7 +116,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private static final int SERVICE_IBLUETOOTHGATT = 2; private static final int SERVICE_IBLUETOOTHGATT = 2; private final Context mContext; private final Context mContext; private static int mBleAppCount = 0; // Locks are not provided for mName and mAddress. // Locks are not provided for mName and mAddress. // They are accessed in handler or broadcast receiver, same thread context. // They are accessed in handler or broadcast receiver, same thread context. Loading Loading @@ -207,10 +207,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { if (isAirplaneModeOn()) { if (isAirplaneModeOn()) { // Clear registered LE apps to force shut-off // Clear registered LE apps to force shut-off synchronized (this) { clearBleApps(); mBleAppCount = 0; mBleApps.clear(); } if (st == BluetoothAdapter.STATE_BLE_ON) { if (st == BluetoothAdapter.STATE_BLE_ON) { //if state is BLE_ON make sure you trigger disableBLE part //if state is BLE_ON make sure you trigger disableBLE part try { try { Loading Loading @@ -451,9 +448,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { class ClientDeathRecipient implements IBinder.DeathRecipient { class ClientDeathRecipient implements IBinder.DeathRecipient { public void binderDied() { public void binderDied() { if (DBG) Slog.d(TAG, "Binder is dead - unregister Ble App"); if (DBG) Slog.d(TAG, "Binder is dead - unregister Ble App"); if (mBleAppCount > 0) --mBleAppCount; if (isBleAppPresent()) { // Nothing to do, another app is here. if (mBleAppCount == 0) { return; } if (DBG) Slog.d(TAG, "Disabling LE only mode after application crash"); if (DBG) Slog.d(TAG, "Disabling LE only mode after application crash"); try { try { mBluetoothLock.readLock().lock(); mBluetoothLock.readLock().lock(); Loading @@ -469,10 +467,9 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } } } } } } } /** Internal death rec list */ /** Internal death rec list */ Map<IBinder, ClientDeathRecipient> mBleApps = new HashMap<IBinder, ClientDeathRecipient>(); Map<IBinder, ClientDeathRecipient> mBleApps = new ConcurrentHashMap<IBinder, ClientDeathRecipient>(); @Override @Override public boolean isBleScanAlwaysAvailable() { public boolean isBleScanAlwaysAvailable() { Loading @@ -492,7 +489,11 @@ class BluetoothManagerService extends IBluetoothManager.Stub { ContentObserver contentObserver = new ContentObserver(null) { ContentObserver contentObserver = new ContentObserver(null) { @Override @Override public void onChange(boolean selfChange) { public void onChange(boolean selfChange) { if (!isBleScanAlwaysAvailable()) { if (isBleScanAlwaysAvailable()) { // Nothing to do return; } // BLE scan is not available. disableBleScanMode(); disableBleScanMode(); clearBleApps(); clearBleApps(); try { try { Loading @@ -504,7 +505,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mBluetoothLock.readLock().unlock(); mBluetoothLock.readLock().unlock(); } } } } } }; }; mContentResolver.registerContentObserver( mContentResolver.registerContentObserver( Loading Loading @@ -538,9 +538,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { throw new IllegalArgumentException("Wake lock is already dead."); throw new IllegalArgumentException("Wake lock is already dead."); } } mBleApps.put(token, deathRec); mBleApps.put(token, deathRec); synchronized (this) { ++mBleAppCount; } if (DBG) Slog.d(TAG, "Registered for death Notification"); if (DBG) Slog.d(TAG, "Registered for death Notification"); } } Loading @@ -550,31 +547,26 @@ class BluetoothManagerService extends IBluetoothManager.Stub { // Unregister death recipient as the app goes away. // Unregister death recipient as the app goes away. token.unlinkToDeath(r, 0); token.unlinkToDeath(r, 0); mBleApps.remove(token); mBleApps.remove(token); synchronized (this) { if (mBleAppCount > 0) --mBleAppCount; } if (DBG) Slog.d(TAG, "Unregistered for death Notification"); if (DBG) Slog.d(TAG, "Unregistered for death Notification"); } } } } if (DBG) Slog.d(TAG, "Updated BleAppCount" + mBleAppCount); int appCount = mBleApps.size(); if (mBleAppCount == 0 && mEnable) { if (DBG) Slog.d(TAG, appCount + " registered Ble Apps"); if (appCount == 0 && mEnable) { disableBleScanMode(); disableBleScanMode(); } } return mBleAppCount; return appCount; } } // Clear all apps using BLE scan only mode. // Clear all apps using BLE scan only mode. private void clearBleApps() { private void clearBleApps() { synchronized (this) { mBleApps.clear(); mBleApps.clear(); mBleAppCount = 0; } } } /** @hide*/ /** @hide*/ public boolean isBleAppPresent() { public boolean isBleAppPresent() { if (DBG) Slog.d(TAG, "isBleAppPresent() count: " + mBleAppCount); if (DBG) Slog.d(TAG, "isBleAppPresent() count: " + mBleApps.size()); return (mBleAppCount > 0); return mBleApps.size() > 0; } } /** /** Loading Loading @@ -1384,12 +1376,12 @@ class BluetoothManagerService extends IBluetoothManager.Stub { if ((prevState == BluetoothAdapter.STATE_BLE_TURNING_ON) && if ((prevState == BluetoothAdapter.STATE_BLE_TURNING_ON) && (newState == BluetoothAdapter.STATE_OFF) && (newState == BluetoothAdapter.STATE_OFF) && (mBluetooth != null) && mEnable) { (mBluetooth != null) && mEnable) { recoverBluetoothServiceFromError(); recoverBluetoothServiceFromError(false); } } if ((prevState == BluetoothAdapter.STATE_TURNING_ON) && if ((prevState == BluetoothAdapter.STATE_TURNING_ON) && (newState == BluetoothAdapter.STATE_BLE_ON) && (newState == BluetoothAdapter.STATE_BLE_ON) && (mBluetooth != null) && mEnable) { (mBluetooth != null) && mEnable) { recoverBluetoothServiceFromError(); recoverBluetoothServiceFromError(true); } } // If we tried to enable BT while BT was in the process of shutting down, // If we tried to enable BT while BT was in the process of shutting down, // wait for the BT process to fully tear down and then force a restart // wait for the BT process to fully tear down and then force a restart Loading Loading @@ -1805,7 +1797,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { quietMode ? 1 : 0, 0)); quietMode ? 1 : 0, 0)); } } private void recoverBluetoothServiceFromError() { private void recoverBluetoothServiceFromError(boolean clearBle) { Slog.e(TAG,"recoverBluetoothServiceFromError"); Slog.e(TAG,"recoverBluetoothServiceFromError"); try { try { mBluetoothLock.readLock().lock(); mBluetoothLock.readLock().lock(); Loading Loading @@ -1843,6 +1835,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mHandler.removeMessages(MESSAGE_BLUETOOTH_STATE_CHANGE); mHandler.removeMessages(MESSAGE_BLUETOOTH_STATE_CHANGE); mState = BluetoothAdapter.STATE_OFF; mState = BluetoothAdapter.STATE_OFF; if (clearBle) { clearBleApps(); } mEnable = false; mEnable = false; if (mErrorRecoveryRetryCounter++ < MAX_ERROR_RESTART_RETRIES) { if (mErrorRecoveryRetryCounter++ < MAX_ERROR_RESTART_RETRIES) { Loading Loading
services/core/java/com/android/server/BluetoothManagerService.java +46 −50 Original line number Original line Diff line number Diff line Loading @@ -56,6 +56,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.io.FileDescriptor; import java.io.FileDescriptor; import java.io.PrintWriter; import java.io.PrintWriter; import java.util.concurrent.ConcurrentHashMap; import java.util.HashMap; import java.util.HashMap; import java.util.Map; import java.util.Map; Loading Loading @@ -115,7 +116,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private static final int SERVICE_IBLUETOOTHGATT = 2; private static final int SERVICE_IBLUETOOTHGATT = 2; private final Context mContext; private final Context mContext; private static int mBleAppCount = 0; // Locks are not provided for mName and mAddress. // Locks are not provided for mName and mAddress. // They are accessed in handler or broadcast receiver, same thread context. // They are accessed in handler or broadcast receiver, same thread context. Loading Loading @@ -207,10 +207,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { if (isAirplaneModeOn()) { if (isAirplaneModeOn()) { // Clear registered LE apps to force shut-off // Clear registered LE apps to force shut-off synchronized (this) { clearBleApps(); mBleAppCount = 0; mBleApps.clear(); } if (st == BluetoothAdapter.STATE_BLE_ON) { if (st == BluetoothAdapter.STATE_BLE_ON) { //if state is BLE_ON make sure you trigger disableBLE part //if state is BLE_ON make sure you trigger disableBLE part try { try { Loading Loading @@ -451,9 +448,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { class ClientDeathRecipient implements IBinder.DeathRecipient { class ClientDeathRecipient implements IBinder.DeathRecipient { public void binderDied() { public void binderDied() { if (DBG) Slog.d(TAG, "Binder is dead - unregister Ble App"); if (DBG) Slog.d(TAG, "Binder is dead - unregister Ble App"); if (mBleAppCount > 0) --mBleAppCount; if (isBleAppPresent()) { // Nothing to do, another app is here. if (mBleAppCount == 0) { return; } if (DBG) Slog.d(TAG, "Disabling LE only mode after application crash"); if (DBG) Slog.d(TAG, "Disabling LE only mode after application crash"); try { try { mBluetoothLock.readLock().lock(); mBluetoothLock.readLock().lock(); Loading @@ -469,10 +467,9 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } } } } } } } /** Internal death rec list */ /** Internal death rec list */ Map<IBinder, ClientDeathRecipient> mBleApps = new HashMap<IBinder, ClientDeathRecipient>(); Map<IBinder, ClientDeathRecipient> mBleApps = new ConcurrentHashMap<IBinder, ClientDeathRecipient>(); @Override @Override public boolean isBleScanAlwaysAvailable() { public boolean isBleScanAlwaysAvailable() { Loading @@ -492,7 +489,11 @@ class BluetoothManagerService extends IBluetoothManager.Stub { ContentObserver contentObserver = new ContentObserver(null) { ContentObserver contentObserver = new ContentObserver(null) { @Override @Override public void onChange(boolean selfChange) { public void onChange(boolean selfChange) { if (!isBleScanAlwaysAvailable()) { if (isBleScanAlwaysAvailable()) { // Nothing to do return; } // BLE scan is not available. disableBleScanMode(); disableBleScanMode(); clearBleApps(); clearBleApps(); try { try { Loading @@ -504,7 +505,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mBluetoothLock.readLock().unlock(); mBluetoothLock.readLock().unlock(); } } } } } }; }; mContentResolver.registerContentObserver( mContentResolver.registerContentObserver( Loading Loading @@ -538,9 +538,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { throw new IllegalArgumentException("Wake lock is already dead."); throw new IllegalArgumentException("Wake lock is already dead."); } } mBleApps.put(token, deathRec); mBleApps.put(token, deathRec); synchronized (this) { ++mBleAppCount; } if (DBG) Slog.d(TAG, "Registered for death Notification"); if (DBG) Slog.d(TAG, "Registered for death Notification"); } } Loading @@ -550,31 +547,26 @@ class BluetoothManagerService extends IBluetoothManager.Stub { // Unregister death recipient as the app goes away. // Unregister death recipient as the app goes away. token.unlinkToDeath(r, 0); token.unlinkToDeath(r, 0); mBleApps.remove(token); mBleApps.remove(token); synchronized (this) { if (mBleAppCount > 0) --mBleAppCount; } if (DBG) Slog.d(TAG, "Unregistered for death Notification"); if (DBG) Slog.d(TAG, "Unregistered for death Notification"); } } } } if (DBG) Slog.d(TAG, "Updated BleAppCount" + mBleAppCount); int appCount = mBleApps.size(); if (mBleAppCount == 0 && mEnable) { if (DBG) Slog.d(TAG, appCount + " registered Ble Apps"); if (appCount == 0 && mEnable) { disableBleScanMode(); disableBleScanMode(); } } return mBleAppCount; return appCount; } } // Clear all apps using BLE scan only mode. // Clear all apps using BLE scan only mode. private void clearBleApps() { private void clearBleApps() { synchronized (this) { mBleApps.clear(); mBleApps.clear(); mBleAppCount = 0; } } } /** @hide*/ /** @hide*/ public boolean isBleAppPresent() { public boolean isBleAppPresent() { if (DBG) Slog.d(TAG, "isBleAppPresent() count: " + mBleAppCount); if (DBG) Slog.d(TAG, "isBleAppPresent() count: " + mBleApps.size()); return (mBleAppCount > 0); return mBleApps.size() > 0; } } /** /** Loading Loading @@ -1384,12 +1376,12 @@ class BluetoothManagerService extends IBluetoothManager.Stub { if ((prevState == BluetoothAdapter.STATE_BLE_TURNING_ON) && if ((prevState == BluetoothAdapter.STATE_BLE_TURNING_ON) && (newState == BluetoothAdapter.STATE_OFF) && (newState == BluetoothAdapter.STATE_OFF) && (mBluetooth != null) && mEnable) { (mBluetooth != null) && mEnable) { recoverBluetoothServiceFromError(); recoverBluetoothServiceFromError(false); } } if ((prevState == BluetoothAdapter.STATE_TURNING_ON) && if ((prevState == BluetoothAdapter.STATE_TURNING_ON) && (newState == BluetoothAdapter.STATE_BLE_ON) && (newState == BluetoothAdapter.STATE_BLE_ON) && (mBluetooth != null) && mEnable) { (mBluetooth != null) && mEnable) { recoverBluetoothServiceFromError(); recoverBluetoothServiceFromError(true); } } // If we tried to enable BT while BT was in the process of shutting down, // If we tried to enable BT while BT was in the process of shutting down, // wait for the BT process to fully tear down and then force a restart // wait for the BT process to fully tear down and then force a restart Loading Loading @@ -1805,7 +1797,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { quietMode ? 1 : 0, 0)); quietMode ? 1 : 0, 0)); } } private void recoverBluetoothServiceFromError() { private void recoverBluetoothServiceFromError(boolean clearBle) { Slog.e(TAG,"recoverBluetoothServiceFromError"); Slog.e(TAG,"recoverBluetoothServiceFromError"); try { try { mBluetoothLock.readLock().lock(); mBluetoothLock.readLock().lock(); Loading Loading @@ -1843,6 +1835,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mHandler.removeMessages(MESSAGE_BLUETOOTH_STATE_CHANGE); mHandler.removeMessages(MESSAGE_BLUETOOTH_STATE_CHANGE); mState = BluetoothAdapter.STATE_OFF; mState = BluetoothAdapter.STATE_OFF; if (clearBle) { clearBleApps(); } mEnable = false; mEnable = false; if (mErrorRecoveryRetryCounter++ < MAX_ERROR_RESTART_RETRIES) { if (mErrorRecoveryRetryCounter++ < MAX_ERROR_RESTART_RETRIES) { Loading