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

Commit 56853771 authored by Marie Janssen's avatar Marie Janssen Committed by android-build-merger
Browse files

Merge "Bluetooth: BLE app tracking fixes" am: 21747314

am: 3d8d5dbb

Change-Id: Ia9b8950f66f31b0d3b78f6e2f6c2314cf0b931f0
parents fd91fcc9 3d8d5dbb
Loading
Loading
Loading
Loading
+46 −50
Original line number Original line Diff line number Diff line
@@ -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;


@@ -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.
@@ -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 {
@@ -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();
@@ -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() {
@@ -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 {
@@ -504,7 +505,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
                    mBluetoothLock.readLock().unlock();
                    mBluetoothLock.readLock().unlock();
                }
                }
            }
            }
            }
        };
        };


        mContentResolver.registerContentObserver(
        mContentResolver.registerContentObserver(
@@ -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");
            }
            }


@@ -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;
    }
    }


    /**
    /**
@@ -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
@@ -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();
@@ -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) {