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

Commit b4bdee5f authored by Wei Wang's avatar Wei Wang
Browse files

Changes due to addressing BLE API review comments

Change-Id: I27b94952a243bf4fdbebdc103e7d541ce23efa3f
parent 1e89d2a2
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -1164,6 +1164,7 @@ static void gattClientScanFilterEnableNative(JNIEnv* env, jobject object, jboole
    if (!sGattIf) return;
    sGattIf->client->scan_filter_enable(enable ? 1 : 0);
}

static void gattClientScanFilterAddNative(JNIEnv* env, jobject object, jint type,
                jint company_id, jint company_mask, jlong uuid_lsb, jlong uuid_msb,
                jlong uuid_mask_lsb, jlong uuid_mask_msb,
+4 −4
Original line number Diff line number Diff line
@@ -2,20 +2,20 @@
package com.android.bluetooth.gatt;

import android.annotation.Nullable;
import android.bluetooth.BluetoothLeAdvertiseScanData.AdvertisementData;
import android.bluetooth.BluetoothLeAdvertiser.Settings;
import android.bluetooth.le.AdvertisementData;
import android.bluetooth.le.BluetoothLeAdvertiseSettings;

/**
 * @hide
 */
class AdvertiseClient {
    int clientIf;
    Settings settings;
    BluetoothLeAdvertiseSettings settings;
    AdvertisementData advertiseData;
    @Nullable
    AdvertisementData scanResponse;

    AdvertiseClient(int clientIf, Settings settings, AdvertisementData data,
    AdvertiseClient(int clientIf, BluetoothLeAdvertiseSettings settings, AdvertisementData data,
            AdvertisementData scanResponse) {
        this.clientIf = clientIf;
        this.settings = settings;
+25 −21
Original line number Diff line number Diff line
@@ -19,17 +19,17 @@ package com.android.bluetooth.gatt;
import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothLeAdvertiseScanData.AdvertisementData;
import android.bluetooth.BluetoothLeAdvertiser;
import android.bluetooth.BluetoothLeAdvertiser.AdvertiseCallback;
import android.bluetooth.BluetoothLeScanFilter;
import android.bluetooth.BluetoothLeScanner.ScanResult;
import android.bluetooth.BluetoothLeScanner.Settings;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothUuid;
import android.bluetooth.IBluetoothGatt;
import android.bluetooth.IBluetoothGattCallback;
import android.bluetooth.IBluetoothGattServerCallback;
import android.bluetooth.le.AdvertiseCallback;
import android.bluetooth.le.AdvertisementData;
import android.bluetooth.le.BluetoothLeAdvertiseSettings;
import android.bluetooth.le.BluetoothLeScanSettings;
import android.bluetooth.le.ScanFilter;
import android.bluetooth.le.ScanResult;
import android.content.Intent;
import android.os.IBinder;
import android.os.Message;
@@ -160,7 +160,7 @@ public class GattService extends ProfileService {
     * List of clients interested in scan results.
     */
    private List<ScanClient> mScanQueue = new ArrayList<ScanClient>();
    private Set<BluetoothLeScanFilter> mScanFilters = new HashSet<BluetoothLeScanFilter>();
    private Set<ScanFilter> mScanFilters = new HashSet<ScanFilter>();

    private GattServiceStateMachine mStateMachine;
    private ScanClient getScanClient(int appIf, boolean isServer) {
@@ -342,8 +342,8 @@ public class GattService extends ProfileService {
        }

        @Override
        public void startScanWithFilters(int appIf, boolean isServer, Settings settings,
                List<BluetoothLeScanFilter> filters) {
        public void startScanWithFilters(int appIf, boolean isServer, BluetoothLeScanSettings settings,
                List<ScanFilter> filters) {
            GattService service = getService();
            if (service == null) return;
            service.startScanWithFilters(appIf, isServer, settings, filters);
@@ -568,7 +568,7 @@ public class GattService extends ProfileService {
        @Override
        public void startMultiAdvertising(int clientIf, AdvertisementData advertiseData,
                AdvertisementData scanResponse,
                BluetoothLeAdvertiser.Settings settings) {
                BluetoothLeAdvertiseSettings settings) {
            GattService service = getService();
            if (service == null) return;
            service.startMultiAdvertising(clientIf, advertiseData, scanResponse, settings);
@@ -699,7 +699,8 @@ public class GattService extends ProfileService {
        if (client.filters == null || client.filters.isEmpty()) {
            return true;
        }
        for (BluetoothLeScanFilter filter : client.filters) {
        for (ScanFilter filter : client.filters) {
            if (DBG) Log.d(TAG, "filter: " + filter.toString());
            if (filter.matches(scanResult)) {
                return true;
            }
@@ -1126,7 +1127,8 @@ public class GattService extends ProfileService {
            if (status == 0) {
                app.callback.onMultiAdvertiseCallback(AdvertiseCallback.SUCCESS);
            } else {
                app.callback.onMultiAdvertiseCallback(AdvertiseCallback.CONTROLLER_FAILURE);
                app.callback.onMultiAdvertiseCallback(
                        AdvertiseCallback.ADVERTISE_FAILED_CONTROLLER_FAILURE);
            }
        }
    }
@@ -1141,7 +1143,8 @@ public class GattService extends ProfileService {
            if (status == 0) {
                app.callback.onMultiAdvertiseCallback(AdvertiseCallback.SUCCESS);
            } else {
                app.callback.onMultiAdvertiseCallback(AdvertiseCallback.CONTROLLER_FAILURE);
                app.callback.onMultiAdvertiseCallback(
                        AdvertiseCallback.ADVERTISE_FAILED_CONTROLLER_FAILURE);
            }
        }
    }
@@ -1235,8 +1238,8 @@ public class GattService extends ProfileService {
        configureScanParams();
    }

    void startScanWithFilters(int appIf, boolean isServer, Settings settings,
            List<BluetoothLeScanFilter> filters) {
    void startScanWithFilters(int appIf, boolean isServer, BluetoothLeScanSettings settings,
            List<ScanFilter> filters) {
        if (DBG) Log.d(TAG, "start scan with filters " + filters.size());
        enforceAdminPermission();
        // TODO: use settings to configure scan params.
@@ -1247,7 +1250,7 @@ public class GattService extends ProfileService {
                if (DBG) Log.d(TAG, "startScan() - adding client=" + appIf);
                mScanQueue.add(new ScanClient(appIf, isServer, settings, filters));
            }
            Set<BluetoothLeScanFilter> newFilters = configureScanFiltersLocked();
            Set<ScanFilter> newFilters = configureScanFiltersLocked();
            if (!Objects.deepEquals(newFilters, mScanFilters)) {
                mScanFilters = newFilters;
                // Restart scan using new filters.
@@ -1300,13 +1303,14 @@ public class GattService extends ProfileService {
            }
        } else {
            lastConfiguredDutyCycle = curDutyCycle;
            mScanFilters.clear();
            sendStopScanMessage();
            if (DBG) Log.d(TAG, "configureScanParams() - queue emtpy, scan stopped");
        }
    }

    private Set<BluetoothLeScanFilter> configureScanFiltersLocked() {
        Set<BluetoothLeScanFilter> filters = new HashSet<BluetoothLeScanFilter>();
    private Set<ScanFilter> configureScanFiltersLocked() {
        Set<ScanFilter> filters = new HashSet<ScanFilter>();
        for (ScanClient client : mScanQueue) {
            if (client.filters == null || client.filters.isEmpty()) {
                filters.clear();
@@ -1317,7 +1321,7 @@ public class GattService extends ProfileService {
        return filters;
    }

    private void sendStartScanMessage(Set<BluetoothLeScanFilter> filters) {
    private void sendStartScanMessage(Set<ScanFilter> filters) {
        Message message = mStateMachine.obtainMessage(GattServiceStateMachine.START_BLE_SCAN);
        message.obj = filters;
        mStateMachine.sendMessage(message);
@@ -1432,7 +1436,7 @@ public class GattService extends ProfileService {
    }

    synchronized List<ParcelUuid> getAdvServiceUuids() {
        enforcePrivilegedPermission();;
        enforcePrivilegedPermission();
        boolean fullUuidFound = false;
        List<ParcelUuid> serviceUuids = new ArrayList<ParcelUuid>();
        for (HandleMap.Entry entry : mHandleMap.mEntries) {
@@ -1511,7 +1515,7 @@ public class GattService extends ProfileService {
    }

    void startMultiAdvertising(int clientIf, AdvertisementData advertiseData,
            AdvertisementData scanResponse, BluetoothLeAdvertiser.Settings settings) {
            AdvertisementData scanResponse, BluetoothLeAdvertiseSettings settings) {
        enforceAdminPermission();
        Message message = mStateMachine.obtainMessage(GattServiceStateMachine.START_ADVERTISING);
        message.obj = new AdvertiseClient(clientIf, settings, advertiseData, scanResponse);
+25 −28
Original line number Diff line number Diff line

package com.android.bluetooth.gatt;

import android.bluetooth.BluetoothLeAdvertiseScanData;
import android.bluetooth.BluetoothLeAdvertiseScanData.AdvertisementData;
import android.bluetooth.BluetoothLeAdvertiser.AdvertiseCallback;
import android.bluetooth.BluetoothLeAdvertiser.Settings;
import android.bluetooth.BluetoothLeScanFilter;
import android.bluetooth.le.AdvertiseCallback;
import android.bluetooth.le.AdvertisementData;
import android.bluetooth.le.BluetoothLeAdvertiseSettings;
import android.bluetooth.le.ScanFilter;
import android.os.Message;
import android.os.ParcelUuid;
import android.os.RemoteException;
@@ -170,7 +169,7 @@ final class GattServiceStateMachine extends StateMachine {
                        log("advertising already started for client : " + client.clientIf);
                        try {
                            mService.onMultipleAdvertiseCallback(client.clientIf,
                                    AdvertiseCallback.ADVERTISING_ALREADY_STARTED);
                                    AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED);
                        } catch (RemoteException e) {
                            loge("failed to start advertising", e);
                        }
@@ -187,7 +186,7 @@ final class GattServiceStateMachine extends StateMachine {
                    if (!mAdvertiseClients.containsKey(clientIf)) {
                        try {
                            mService.onMultipleAdvertiseCallback(clientIf,
                                    AdvertiseCallback.ADVERISING_NOT_STARTED);
                                    AdvertiseCallback.ADVERTISE_FAILED_NOT_STARTED);
                        } catch (RemoteException e) {
                            loge("failed to stop advertising", e);
                        }
@@ -232,11 +231,11 @@ final class GattServiceStateMachine extends StateMachine {
                case CLEAR_SCAN_FILTER:
                    // TODO: Don't change anything if the filter did not change.
                    Object obj = message.obj;
                    if (obj == null || ((Set<BluetoothLeScanFilter>) obj).isEmpty()) {
                    if (obj == null || ((Set<ScanFilter>) obj).isEmpty()) {
                        mScanFilterQueue.clear();
                        hasFilter = false;
                    } else {
                        mScanFilterQueue.addAll((Set<BluetoothLeScanFilter>) message.obj);
                        mScanFilterQueue.addAll((Set<ScanFilter>) message.obj);
                        hasFilter = true;
                    }
                    gattClientScanFilterClearNative();
@@ -345,9 +344,9 @@ final class GattServiceStateMachine extends StateMachine {
                    int clientIf = message.arg1;
                    log("setting advertisement: " + clientIf);
                    client = mAdvertiseClients.get(clientIf);
                    setAdvertisingData(clientIf, client.advertiseData);
                    setAdvertisingData(clientIf, client.advertiseData, false);
                    if (client.scanResponse != null) {
                        setAdvertisingData(clientIf, client.scanResponse);
                        setAdvertisingData(clientIf, client.scanResponse, true);
                    }
                    transitionTo(mIdle);
                    break;
@@ -355,7 +354,7 @@ final class GattServiceStateMachine extends StateMachine {
                    clientIf = message.arg1;
                    try {
                        mService.onMultipleAdvertiseCallback(clientIf,
                                AdvertiseCallback.CONTROLLER_FAILURE);
                                AdvertiseCallback.ADVERTISE_FAILED_CONTROLLER_FAILURE);
                    } catch (RemoteException e) {
                        loge("failed to start advertising", e);
                    }
@@ -368,13 +367,11 @@ final class GattServiceStateMachine extends StateMachine {
        }
    }

    private void setAdvertisingData(int clientIf, AdvertisementData data) {
    private void setAdvertisingData(int clientIf, AdvertisementData data, boolean isScanResponse) {
        if (data == null) {
            return;
        }
        boolean includeName = false;
        boolean isScanResponse =
                data.getDataType() == BluetoothLeAdvertiseScanData.SCAN_RESPONSE_DATA;
        boolean includeTxPower = data.getIncludeTxPowerLevel();
        int appearance = 0;
        byte[] manufacturerData = data.getManufacturerSpecificData() == null ? new byte[0]
@@ -418,15 +415,15 @@ final class GattServiceStateMachine extends StateMachine {
    }

    // Convert settings tx power level to stack tx power level.
    private int getTxPowerLevel(Settings settings) {
    private int getTxPowerLevel(BluetoothLeAdvertiseSettings settings) {
        switch (settings.getTxPowerLevel()) {
            case Settings.ADVERTISE_TX_POWER_ULTRA_LOW:
            case BluetoothLeAdvertiseSettings.ADVERTISE_TX_POWER_ULTRA_LOW:
                return ADVERTISING_TX_POWER_MIN;
            case Settings.ADVERTISE_TX_POWER_LOW:
            case BluetoothLeAdvertiseSettings.ADVERTISE_TX_POWER_LOW:
                return ADVERTISING_TX_POWER_LOW;
            case Settings.ADVERTISE_TX_POWER_MEDIUM:
            case BluetoothLeAdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM:
                return ADVERTISING_TX_POWER_MID;
            case Settings.ADVERTISE_TX_POWER_HIGH:
            case BluetoothLeAdvertiseSettings.ADVERTISE_TX_POWER_HIGH:
                return ADVERTISING_TX_POWER_UPPER;
            default:
                // Shouldn't happen, just in case.
@@ -435,13 +432,13 @@ final class GattServiceStateMachine extends StateMachine {
    }

    // Convert advertising event type to stack advertising event type.
    private int getAdvertisingEventType(Settings settings) {
    private int getAdvertisingEventType(BluetoothLeAdvertiseSettings settings) {
        switch (settings.getType()) {
            case Settings.ADVERTISE_TYPE_CONNECTABLE:
            case BluetoothLeAdvertiseSettings.ADVERTISE_TYPE_CONNECTABLE:
                return ADVERTISING_EVENT_TYPE_CONNECTABLE;
            case Settings.ADVERTISE_TYPE_SCANNABLE:
            case BluetoothLeAdvertiseSettings.ADVERTISE_TYPE_SCANNABLE:
                return ADVERTISING_EVENT_TYPE_SCANNABLE;
            case Settings.ADVERTISE_TYPE_NON_CONNECTABLE:
            case BluetoothLeAdvertiseSettings.ADVERTISE_TYPE_NON_CONNECTABLE:
                return ADVERTISING_EVENT_TYPE_NON_CONNECTABLE;
            default:
                // Should't happen, just in case.
@@ -450,13 +447,13 @@ final class GattServiceStateMachine extends StateMachine {
    }

    // Convert advertising milliseconds to advertising units(one unit is 0.625 millisecond).
    private long getAdvertisingIntervalUnit(Settings settings) {
    private long getAdvertisingIntervalUnit(BluetoothLeAdvertiseSettings settings) {
        switch (settings.getMode()) {
            case Settings.ADVERTISE_MODE_LOW_POWER:
            case BluetoothLeAdvertiseSettings.ADVERTISE_MODE_LOW_POWER:
                return millsToUnit(ADVERTISING_INTERVAL_LOW_MILLS);
            case Settings.ADVERTISE_MODE_BALANCED:
            case BluetoothLeAdvertiseSettings.ADVERTISE_MODE_BALANCED:
                return millsToUnit(ADVERTISING_INTERVAL_MEDIUM_MILLS);
            case Settings.ADVERTISE_MODE_LOW_LATENCY:
            case BluetoothLeAdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY:
                return millsToUnit(ADVERTISING_INTERVAL_HIGH_MILLS);
            default:
                // Shouldn't happen, just in case.
+7 −7
Original line number Diff line number Diff line
@@ -16,8 +16,8 @@

package com.android.bluetooth.gatt;

import android.bluetooth.BluetoothLeScanFilter;
import android.bluetooth.BluetoothLeScanner.Settings;
import android.bluetooth.le.BluetoothLeScanSettings;
import android.bluetooth.le.ScanFilter;

import java.util.List;
import java.util.UUID;
@@ -43,8 +43,8 @@ import java.util.UUID;
    boolean isServer;
    UUID[] uuids;
    int scanWindow, scanInterval;
    Settings settings;
    List<BluetoothLeScanFilter> filters;
    BluetoothLeScanSettings settings;
    List<ScanFilter> filters;

    ScanClient(int appIf, boolean isServer) {
        this(appIf, isServer, new UUID[0], LE_SCAN_WINDOW_MS, LE_SCAN_INTERVAL_MS);
@@ -58,14 +58,14 @@ import java.util.UUID;
        this(appIf, isServer, uuids, scanWindow, scanInterval, null, null);
    }

    ScanClient(int appIf, boolean isServer, Settings settings,
            List<BluetoothLeScanFilter> filters) {
    ScanClient(int appIf, boolean isServer, BluetoothLeScanSettings settings,
            List<ScanFilter> filters) {
        this(appIf, isServer, new UUID[0], LE_SCAN_WINDOW_MS, LE_SCAN_INTERVAL_MS,
                settings, filters);
    }

    private ScanClient(int appIf, boolean isServer, UUID[] uuids, int scanWindow, int scanInterval,
            Settings settings, List<BluetoothLeScanFilter> filters) {
            BluetoothLeScanSettings settings, List<ScanFilter> filters) {
        this.appIf = appIf;
        this.isServer = isServer;
        this.uuids = uuids;
Loading