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

Commit 3d83b0e9 authored by Jakub Pawlowski's avatar Jakub Pawlowski Committed by Andre Eisenbach
Browse files

Bluetooth: advertising improvements

This patch removes isPeripheralModeSupported(), hidden public method
which is always returning true. It also modify the BluetoothLeAdvertiser
to be able to use advertising instance with instance id equal 0.

Bug: 30622771
Bug: 24099160
Change-Id: Id31582621dbe56d5c3a8d4ee5cd296af66a5f026
parent b828b6bf
Loading
Loading
Loading
Loading
+0 −22
Original line number Diff line number Diff line
@@ -601,10 +601,6 @@ public final class BluetoothAdapter {
     */
    public BluetoothLeAdvertiser getBluetoothLeAdvertiser() {
        if (!getLeAccess()) return null;
        if (!isMultipleAdvertisementSupported() && !isPeripheralModeSupported()) {
            Log.e(TAG, "Bluetooth LE advertising not supported");
            return null;
        }
        synchronized(mLock) {
            if (sBluetoothLeAdvertiser == null) {
                sBluetoothLeAdvertiser = new BluetoothLeAdvertiser(mManagerService);
@@ -1353,24 +1349,6 @@ public final class BluetoothAdapter {
        }
    }

    /**
     * Returns whether peripheral mode is supported.
     *
     * @hide
     */
    public boolean isPeripheralModeSupported() {
        if (getState() != STATE_ON) return false;
        try {
            mServiceLock.readLock().lock();
            if (mService != null) return mService.isPeripheralModeSupported();
        } catch (RemoteException e) {
            Log.e(TAG, "failed to get peripheral mode capability: ", e);
        } finally {
            mServiceLock.readLock().unlock();
        }
        return false;
    }

    /**
     * Return true if offloaded filters are supported
     *
+0 −1
Original line number Diff line number Diff line
@@ -100,7 +100,6 @@ interface IBluetooth
    boolean factoryReset();

    boolean isMultiAdvertisementSupported();
    boolean isPeripheralModeSupported();
    boolean isOffloadedFilteringSupported();
    boolean isOffloadedScanBatchingSupported();
    boolean isActivityAndEnergyReportingSupported();
+12 −18
Original line number Diff line number Diff line
@@ -111,12 +111,6 @@ public final class BluetoothLeAdvertiser {
            if (callback == null) {
                throw new IllegalArgumentException("callback cannot be null");
            }
            if (!mBluetoothAdapter.isMultipleAdvertisementSupported() &&
                    !mBluetoothAdapter.isPeripheralModeSupported()) {
                postStartFailure(callback,
                        AdvertiseCallback.ADVERTISE_FAILED_FEATURE_UNSUPPORTED);
                return;
            }
            boolean isConnectable = settings.isConnectable();
            if (totalBytes(advertiseData, isConnectable) > MAX_ADVERTISING_DATA_BYTES ||
                    totalBytes(scanResponse, false) > MAX_ADVERTISING_DATA_BYTES) {
@@ -236,9 +230,9 @@ public final class BluetoothLeAdvertiser {
        private final AdvertiseSettings mSettings;
        private final IBluetoothGatt mBluetoothGatt;

        // mAdvertiserId 0: not registered
        // -1: advertise stopped or registration timeout
        // >0: registered and advertising started
        // mAdvertiserId -1: not registered
        // -2: advertise stopped or registration timeout
        // >=0: registered and advertising started
        private int mAdvertiserId;
        private boolean mIsAdvertising = false;

@@ -251,12 +245,12 @@ public final class BluetoothLeAdvertiser {
            mScanResponse = scanResponse;
            mSettings = settings;
            mBluetoothGatt = bluetoothGatt;
            mAdvertiserId = 0;
            mAdvertiserId = -1;
        }

        public void startRegisteration() {
            synchronized (this) {
                if (mAdvertiserId == -1) return;
                if (mAdvertiserId == -2) return;

                try {
                    mBluetoothGatt.registerAdvertiser(this);
@@ -264,13 +258,13 @@ public final class BluetoothLeAdvertiser {
                } catch (InterruptedException | RemoteException e) {
                    Log.e(TAG, "Failed to start registeration", e);
                }
                if (mAdvertiserId > 0 && mIsAdvertising) {
                if (mAdvertiserId >= 0 && mIsAdvertising) {
                    mLeAdvertisers.put(mAdvertiseCallback, this);
                } else if (mAdvertiserId <= 0) {
                } else if (mAdvertiserId < 0) {

                    // Registration timeout, reset mClientIf to -1 so no subsequent operations can
                    // proceed.
                    if (mAdvertiserId == 0) mAdvertiserId = -1;
                    if (mAdvertiserId == 0) mAdvertiserId = -2;
                    // Post internal error if registration failed.
                    postStartFailure(mAdvertiseCallback,
                            AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR);
@@ -278,7 +272,7 @@ public final class BluetoothLeAdvertiser {
                    // Unregister application if it's already registered but advertise failed.
                    try {
                        mBluetoothGatt.unregisterAdvertiser(mAdvertiserId);
                        mAdvertiserId = -1;
                        mAdvertiserId = -2;
                    } catch (RemoteException e) {
                        Log.e(TAG, "remote exception when unregistering", e);
                    }
@@ -312,7 +306,7 @@ public final class BluetoothLeAdvertiser {
            synchronized (this) {
                if (status == BluetoothGatt.GATT_SUCCESS) {
                    try {
                        if (mAdvertiserId == -1) {
                        if (mAdvertiserId == -2) {
                            // Registration succeeds after timeout, unregister advertiser.
                            mBluetoothGatt.unregisterAdvertiser(advertiserId);
                        } else {
@@ -326,7 +320,7 @@ public final class BluetoothLeAdvertiser {
                    }
                }
                // Registration failed.
                mAdvertiserId = -1;
                mAdvertiserId = -2;
                notifyAll();
            }
        }
@@ -348,7 +342,7 @@ public final class BluetoothLeAdvertiser {
                    // unregister advertiser for stop.
                    try {
                        mBluetoothGatt.unregisterAdvertiser(mAdvertiserId);
                        mAdvertiserId = -1;
                        mAdvertiserId = -2;
                        mIsAdvertising = false;
                        mLeAdvertisers.remove(mAdvertiseCallback);
                    } catch (RemoteException e) {