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

Commit acddd2c2 authored by Eugene Susla's avatar Eugene Susla Committed by Android (Google) Code Review
Browse files

Merge "Support multiple filters per association request"

parents 71b5526a e70e6aa6
Loading
Loading
Loading
Loading
+22 −8
Original line number Diff line number Diff line
@@ -8183,18 +8183,17 @@ package android.bluetooth.le {
package android.companion {
  public final class AssociationRequest<F extends android.companion.DeviceFilter> implements android.os.Parcelable {
  public final class AssociationRequest implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.AssociationRequest> CREATOR;
  }
  public static final class AssociationRequest.Builder<F extends android.companion.DeviceFilter> {
    method public android.companion.AssociationRequest<F> build();
    method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothDeviceFilter> createForBluetoothDevice();
    method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothLEDeviceFilter> createForBluetoothLEDevice();
    method public android.companion.AssociationRequest.Builder<F> setDeviceFilter(F);
    method public android.companion.AssociationRequest.Builder<F> setSingleDevice(boolean);
  public static final class AssociationRequest.Builder {
    ctor public AssociationRequest.Builder();
    method public android.companion.AssociationRequest.Builder addDeviceFilter(android.companion.DeviceFilter<?>);
    method public android.companion.AssociationRequest build();
    method public android.companion.AssociationRequest.Builder setSingleDevice(boolean);
  }
  public final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
@@ -8215,17 +8214,20 @@ package android.companion {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.BluetoothLEDeviceFilter> CREATOR;
    field public static final int RENAME_PREFIX_LENGTH_LIMIT = 10; // 0xa
  }
  public static final class BluetoothLEDeviceFilter.Builder {
    ctor public BluetoothLEDeviceFilter.Builder();
    method public android.companion.BluetoothLEDeviceFilter build();
    method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
    method public android.companion.BluetoothLEDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
    method public android.companion.BluetoothLEDeviceFilter.Builder setRename(java.lang.String, java.lang.String, int, int, boolean);
    method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
  }
  public final class CompanionDeviceManager {
    method public void associate(android.companion.AssociationRequest<?>, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
    method public void associate(android.companion.AssociationRequest, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
    method public void disassociate(java.lang.String);
    method public java.util.List<java.lang.String> getAssociations();
    field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE";
@@ -8240,6 +8242,18 @@ package android.companion {
  public abstract interface DeviceFilter<D extends android.os.Parcelable> implements android.os.Parcelable {
  }
  public final class WifiDeviceFilter implements android.companion.DeviceFilter {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.WifiDeviceFilter> CREATOR;
  }
  public static final class WifiDeviceFilter.Builder {
    ctor public WifiDeviceFilter.Builder();
    method public android.companion.WifiDeviceFilter build();
    method public android.companion.WifiDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
  }
}
package android.content {
+22 −8
Original line number Diff line number Diff line
@@ -8683,18 +8683,17 @@ package android.bluetooth.le {
package android.companion {
  public final class AssociationRequest<F extends android.companion.DeviceFilter> implements android.os.Parcelable {
  public final class AssociationRequest implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.AssociationRequest> CREATOR;
  }
  public static final class AssociationRequest.Builder<F extends android.companion.DeviceFilter> {
    method public android.companion.AssociationRequest<F> build();
    method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothDeviceFilter> createForBluetoothDevice();
    method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothLEDeviceFilter> createForBluetoothLEDevice();
    method public android.companion.AssociationRequest.Builder<F> setDeviceFilter(F);
    method public android.companion.AssociationRequest.Builder<F> setSingleDevice(boolean);
  public static final class AssociationRequest.Builder {
    ctor public AssociationRequest.Builder();
    method public android.companion.AssociationRequest.Builder addDeviceFilter(android.companion.DeviceFilter<?>);
    method public android.companion.AssociationRequest build();
    method public android.companion.AssociationRequest.Builder setSingleDevice(boolean);
  }
  public final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
@@ -8715,17 +8714,20 @@ package android.companion {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.BluetoothLEDeviceFilter> CREATOR;
    field public static final int RENAME_PREFIX_LENGTH_LIMIT = 10; // 0xa
  }
  public static final class BluetoothLEDeviceFilter.Builder {
    ctor public BluetoothLEDeviceFilter.Builder();
    method public android.companion.BluetoothLEDeviceFilter build();
    method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
    method public android.companion.BluetoothLEDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
    method public android.companion.BluetoothLEDeviceFilter.Builder setRename(java.lang.String, java.lang.String, int, int, boolean);
    method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
  }
  public final class CompanionDeviceManager {
    method public void associate(android.companion.AssociationRequest<?>, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
    method public void associate(android.companion.AssociationRequest, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
    method public void disassociate(java.lang.String);
    method public java.util.List<java.lang.String> getAssociations();
    field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE";
@@ -8740,6 +8742,18 @@ package android.companion {
  public abstract interface DeviceFilter<D extends android.os.Parcelable> implements android.os.Parcelable {
  }
  public final class WifiDeviceFilter implements android.companion.DeviceFilter {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.WifiDeviceFilter> CREATOR;
  }
  public static final class WifiDeviceFilter.Builder {
    ctor public WifiDeviceFilter.Builder();
    method public android.companion.WifiDeviceFilter build();
    method public android.companion.WifiDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
  }
}
package android.content {
+22 −8
Original line number Diff line number Diff line
@@ -8210,18 +8210,17 @@ package android.bluetooth.le {
package android.companion {
  public final class AssociationRequest<F extends android.companion.DeviceFilter> implements android.os.Parcelable {
  public final class AssociationRequest implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.AssociationRequest> CREATOR;
  }
  public static final class AssociationRequest.Builder<F extends android.companion.DeviceFilter> {
    method public android.companion.AssociationRequest<F> build();
    method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothDeviceFilter> createForBluetoothDevice();
    method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothLEDeviceFilter> createForBluetoothLEDevice();
    method public android.companion.AssociationRequest.Builder<F> setDeviceFilter(F);
    method public android.companion.AssociationRequest.Builder<F> setSingleDevice(boolean);
  public static final class AssociationRequest.Builder {
    ctor public AssociationRequest.Builder();
    method public android.companion.AssociationRequest.Builder addDeviceFilter(android.companion.DeviceFilter<?>);
    method public android.companion.AssociationRequest build();
    method public android.companion.AssociationRequest.Builder setSingleDevice(boolean);
  }
  public final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
@@ -8242,17 +8241,20 @@ package android.companion {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.BluetoothLEDeviceFilter> CREATOR;
    field public static final int RENAME_PREFIX_LENGTH_LIMIT = 10; // 0xa
  }
  public static final class BluetoothLEDeviceFilter.Builder {
    ctor public BluetoothLEDeviceFilter.Builder();
    method public android.companion.BluetoothLEDeviceFilter build();
    method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
    method public android.companion.BluetoothLEDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
    method public android.companion.BluetoothLEDeviceFilter.Builder setRename(java.lang.String, java.lang.String, int, int, boolean);
    method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
  }
  public final class CompanionDeviceManager {
    method public void associate(android.companion.AssociationRequest<?>, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
    method public void associate(android.companion.AssociationRequest, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
    method public void disassociate(java.lang.String);
    method public java.util.List<java.lang.String> getAssociations();
    field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE";
@@ -8267,6 +8269,18 @@ package android.companion {
  public abstract interface DeviceFilter<D extends android.os.Parcelable> implements android.os.Parcelable {
  }
  public final class WifiDeviceFilter implements android.companion.DeviceFilter {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.WifiDeviceFilter> CREATOR;
  }
  public static final class WifiDeviceFilter.Builder {
    ctor public WifiDeviceFilter.Builder();
    method public android.companion.WifiDeviceFilter build();
    method public android.companion.WifiDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
  }
}
package android.content {
+3 −9
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import android.os.Parcel;
import android.os.ParcelUuid;
import android.os.Parcelable;

import com.android.internal.util.BitUtils;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -345,15 +347,7 @@ public final class ScanFilter implements Parcelable {

    // Check if the uuid pattern matches the particular service uuid.
    private static boolean matchesServiceUuid(UUID uuid, UUID mask, UUID data) {
        if (mask == null) {
            return uuid.equals(data);
        }
        if ((uuid.getLeastSignificantBits() & mask.getLeastSignificantBits()) !=
                (data.getLeastSignificantBits() & mask.getLeastSignificantBits())) {
            return false;
        }
        return ((uuid.getMostSignificantBits() & mask.getMostSignificantBits()) ==
                (data.getMostSignificantBits() & mask.getMostSignificantBits()));
        return BitUtils.maskedEquals(data, uuid, mask);
    }

    // Check whether the data pattern matches the parsed data.
+25 −82
Original line number Diff line number Diff line
@@ -16,20 +16,21 @@

package android.companion;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.OneTimeUseBuilder;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import com.android.internal.util.ArrayUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * A request for the user to select a companion device to associate with.
 *
 * You can optionally set a {@link Builder#setDeviceFilter filter} for which devices to show to the
 * You can optionally set {@link Builder#addDeviceFilter filters} for which devices to show to the
 * user to select from.
 * The exact type and fields of the filter you can set depend on the
 * medium type. See {@link Builder}'s static factory methods for specific protocols that are
@@ -37,38 +38,22 @@ import java.lang.annotation.RetentionPolicy;
 *
 * You can also set {@link Builder#setSingleDevice single device} to request a popup with single
 * device to be shown instead of a list to choose from
 *
 * @param <F> Device filter type
 */
public final class AssociationRequest<F extends DeviceFilter> implements Parcelable {

    /** @hide */
    public static final int MEDIUM_TYPE_BLUETOOTH = 0;
    /** @hide */
    public static final int MEDIUM_TYPE_BLUETOOTH_LE = 1;
    /** @hide */
    public static final int MEDIUM_TYPE_WIFI = 2;

    /** @hide */
    @IntDef({MEDIUM_TYPE_BLUETOOTH, MEDIUM_TYPE_BLUETOOTH_LE, MEDIUM_TYPE_WIFI})
    @Retention(RetentionPolicy.SOURCE)
    public @interface MediumType {}
public final class AssociationRequest implements Parcelable {

    private final boolean mSingleDevice;
    private final int mMediumType;
    private final F mDeviceFilter;
    private final List<DeviceFilter<?>> mDeviceFilters;

    private AssociationRequest(boolean singleDevice, int mMediumType, F deviceFilter) {
    private AssociationRequest(
            boolean singleDevice, @Nullable List<DeviceFilter<?>> deviceFilters) {
        this.mSingleDevice = singleDevice;
        this.mMediumType = mMediumType;
        this.mDeviceFilter = deviceFilter;
        this.mDeviceFilters = ArrayUtils.emptyIfNull(deviceFilters);
    }

    private AssociationRequest(Parcel in) {
        this(
            in.readByte() != 0,
            in.readInt(),
            in.readParcelable(AssociationRequest.class.getClassLoader()));
            in.readParcelableList(new ArrayList<>(), AssociationRequest.class.getClassLoader()));
    }

    /** @hide */
@@ -77,22 +62,15 @@ public final class AssociationRequest<F extends DeviceFilter> implements Parcela
    }

    /** @hide */
    @MediumType
    public int getMediumType() {
        return mMediumType;
    }

    /** @hide */
    @Nullable
    public F getDeviceFilter() {
        return mDeviceFilter;
    @NonNull
    public List<DeviceFilter<?>> getDeviceFilters() {
        return mDeviceFilters;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeByte((byte) (mSingleDevice ? 1 : 0));
        dest.writeInt(mMediumType);
        dest.writeParcelable(mDeviceFilter, flags);
        dest.writeParcelableList(mDeviceFilters, flags);
    }

    @Override
@@ -114,45 +92,19 @@ public final class AssociationRequest<F extends DeviceFilter> implements Parcela

    /**
     * A builder for {@link AssociationRequest}
     *
     * @param <F> the type of filter for the request.
     */
    public static final class Builder<F extends DeviceFilter>
            extends OneTimeUseBuilder<AssociationRequest<F>> {
    public static final class Builder extends OneTimeUseBuilder<AssociationRequest> {
        private boolean mSingleDevice = false;
        @MediumType private int mMediumType;
        @Nullable private F mDeviceFilter = null;

        private Builder() {}

        /**
         * Create a new builder for an association request with a Bluetooth LE device
         */
        @NonNull
        public static Builder<BluetoothLEDeviceFilter> createForBluetoothLEDevice() {
            return new Builder<BluetoothLEDeviceFilter>()
                    .setMediumType(MEDIUM_TYPE_BLUETOOTH_LE);
        }
        @Nullable private ArrayList<DeviceFilter<?>> mDeviceFilters = null;

        /**
         * Create a new builder for an association request with a Bluetooth(non-LE) device
         */
        @NonNull
        public static Builder<BluetoothDeviceFilter> createForBluetoothDevice() {
            return new Builder<BluetoothDeviceFilter>()
                    .setMediumType(MEDIUM_TYPE_BLUETOOTH);
        }

        //TODO implement, once specific filter classes are available
//        public static Builder<> createForWiFiDevice()
//        public static Builder<> createForNanDevice()
        public Builder() {}

        /**
         * @param singleDevice if true, scanning for a device will stop as soon as at least one
         *                     fitting device is found
         */
        @NonNull
        public Builder<F> setSingleDevice(boolean singleDevice) {
        public Builder setSingleDevice(boolean singleDevice) {
            checkNotUsed();
            this.mSingleDevice = singleDevice;
            return this;
@@ -163,29 +115,20 @@ public final class AssociationRequest<F extends DeviceFilter> implements Parcela
         *                     user
         */
        @NonNull
        public Builder<F> setDeviceFilter(@Nullable F deviceFilter) {
        public Builder addDeviceFilter(@Nullable DeviceFilter<?> deviceFilter) {
            checkNotUsed();
            this.mDeviceFilter = deviceFilter;
            return this;
            if (deviceFilter != null) {
                mDeviceFilters = ArrayUtils.add(mDeviceFilters, deviceFilter);
            }

        /**
         * @param deviceType A type of medium over which to discover devices
         *
         * @see MediumType
         */
        @NonNull
        private Builder<F> setMediumType(@MediumType int deviceType) {
            mMediumType = deviceType;
            return this;
        }

        /** @inheritDoc */
        @NonNull
        @Override
        public AssociationRequest<F> build() {
        public AssociationRequest build() {
            markUsed();
            return new AssociationRequest<>(mSingleDevice, mMediumType, mDeviceFilter);
            return new AssociationRequest(mSingleDevice, mDeviceFilters);
        }
    }
}
Loading