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

Commit 36582c19 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Refine BluetoothLeAdvertiser permissions.

Technically these APIs required both ADVERTISE and CONNECT, since
internally it would attempt getting the device name as part of
calculating packet lengths.  These methods shouldn't require the
CONNECT permission, so we add a getNameLengthForAdvertise() method
internally to remove this dependency.

Bug: 183626724
Test: ./build/soong/soong_ui.bash --make-mode Bluetooth RUN_ERROR_PRONE=true
Change-Id: I245417bfc26d6d3a4f8be14077c7f1d271b5959e
parent 02ebd8c0
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -1251,6 +1251,18 @@ public final class BluetoothAdapter {
        return null;
    }

    /** {@hide} */
    @RequiresBluetoothAdvertisePermission
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
    public int getNameLengthForAdvertise() {
        try {
            return mService.getNameLengthForAdvertise();
        } catch (RemoteException e) {
            Log.e(TAG, "", e);
        }
        return -1;
    }

    /**
     * Factory reset bluetooth settings.
     *
+12 −27
Original line number Diff line number Diff line
@@ -89,10 +89,7 @@ public final class BluetoothLeAdvertiser {
     */
    @RequiresLegacyBluetoothAdminPermission
    @RequiresBluetoothAdvertisePermission
    @RequiresPermission(allOf = {
            android.Manifest.permission.BLUETOOTH_ADVERTISE,
            android.Manifest.permission.BLUETOOTH_CONNECT,
    })
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
    public void startAdvertising(AdvertiseSettings settings,
            AdvertiseData advertiseData, final AdvertiseCallback callback) {
        startAdvertising(settings, advertiseData, null, callback);
@@ -111,10 +108,7 @@ public final class BluetoothLeAdvertiser {
     */
    @RequiresLegacyBluetoothAdminPermission
    @RequiresBluetoothAdvertisePermission
    @RequiresPermission(allOf = {
            android.Manifest.permission.BLUETOOTH_ADVERTISE,
            android.Manifest.permission.BLUETOOTH_CONNECT,
    })
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
    public void startAdvertising(AdvertiseSettings settings,
            AdvertiseData advertiseData, AdvertiseData scanResponse,
            final AdvertiseCallback callback) {
@@ -247,10 +241,7 @@ public final class BluetoothLeAdvertiser {
     */
    @RequiresLegacyBluetoothAdminPermission
    @RequiresBluetoothAdvertisePermission
    @RequiresPermission(allOf = {
            android.Manifest.permission.BLUETOOTH_ADVERTISE,
            android.Manifest.permission.BLUETOOTH_CONNECT,
    })
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
    public void startAdvertisingSet(AdvertisingSetParameters parameters,
            AdvertiseData advertiseData, AdvertiseData scanResponse,
            PeriodicAdvertisingParameters periodicParameters,
@@ -283,10 +274,7 @@ public final class BluetoothLeAdvertiser {
     */
    @RequiresLegacyBluetoothAdminPermission
    @RequiresBluetoothAdvertisePermission
    @RequiresPermission(allOf = {
            android.Manifest.permission.BLUETOOTH_ADVERTISE,
            android.Manifest.permission.BLUETOOTH_CONNECT,
    })
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
    public void startAdvertisingSet(AdvertisingSetParameters parameters,
            AdvertiseData advertiseData, AdvertiseData scanResponse,
            PeriodicAdvertisingParameters periodicParameters,
@@ -324,10 +312,7 @@ public final class BluetoothLeAdvertiser {
     */
    @RequiresLegacyBluetoothAdminPermission
    @RequiresBluetoothAdvertisePermission
    @RequiresPermission(allOf = {
            android.Manifest.permission.BLUETOOTH_ADVERTISE,
            android.Manifest.permission.BLUETOOTH_CONNECT,
    })
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
    public void startAdvertisingSet(AdvertisingSetParameters parameters,
            AdvertiseData advertiseData, AdvertiseData scanResponse,
            PeriodicAdvertisingParameters periodicParameters,
@@ -370,10 +355,7 @@ public final class BluetoothLeAdvertiser {
     */
    @RequiresLegacyBluetoothAdminPermission
    @RequiresBluetoothAdvertisePermission
    @RequiresPermission(allOf = {
            android.Manifest.permission.BLUETOOTH_ADVERTISE,
            android.Manifest.permission.BLUETOOTH_CONNECT,
    })
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
    public void startAdvertisingSet(AdvertisingSetParameters parameters,
            AdvertiseData advertiseData, AdvertiseData scanResponse,
            PeriodicAdvertisingParameters periodicParameters,
@@ -516,7 +498,7 @@ public final class BluetoothLeAdvertiser {
    }

    // Compute the size of advertisement data or scan resp
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
    private int totalBytes(AdvertiseData data, boolean isFlagsIncluded) {
        if (data == null) return 0;
        // Flags field is omitted if the advertising is not connectable.
@@ -587,8 +569,11 @@ public final class BluetoothLeAdvertiser {
        if (data.getIncludeTxPowerLevel()) {
            size += OVERHEAD_BYTES_PER_FIELD + 1; // tx power level value is one byte.
        }
        if (data.getIncludeDeviceName() && mBluetoothAdapter.getName() != null) {
            size += OVERHEAD_BYTES_PER_FIELD + mBluetoothAdapter.getName().length();
        if (data.getIncludeDeviceName()) {
            final int length = mBluetoothAdapter.getNameLengthForAdvertise();
            if (length >= 0) {
                size += OVERHEAD_BYTES_PER_FIELD + length;
            }
        }
        return size;
    }