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

Commit 7986b529 authored by Hector Tellez's avatar Hector Tellez Committed by Android (Google) Code Review
Browse files

Merge "Revert "Support multiple filters per association request""

parents 70c8e868 d66c95fa
Loading
Loading
Loading
Loading
+8 −22
Original line number Diff line number Diff line
@@ -8183,17 +8183,18 @@ package android.bluetooth.le {
package android.companion {
  public final class AssociationRequest implements android.os.Parcelable {
  public final class AssociationRequest<F extends android.companion.DeviceFilter> 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 {
    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 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 final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
@@ -8214,20 +8215,17 @@ 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";
@@ -8242,18 +8240,6 @@ 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 {
+8 −22
Original line number Diff line number Diff line
@@ -8683,17 +8683,18 @@ package android.bluetooth.le {
package android.companion {
  public final class AssociationRequest implements android.os.Parcelable {
  public final class AssociationRequest<F extends android.companion.DeviceFilter> 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 {
    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 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 final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
@@ -8714,20 +8715,17 @@ 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";
@@ -8742,18 +8740,6 @@ 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 {
+8 −22
Original line number Diff line number Diff line
@@ -8210,17 +8210,18 @@ package android.bluetooth.le {
package android.companion {
  public final class AssociationRequest implements android.os.Parcelable {
  public final class AssociationRequest<F extends android.companion.DeviceFilter> 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 {
    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 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 final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
@@ -8241,20 +8242,17 @@ 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";
@@ -8269,18 +8267,6 @@ 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 {
+9 −3
Original line number Diff line number Diff line
@@ -23,8 +23,6 @@ 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;
@@ -347,7 +345,15 @@ 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) {
        return BitUtils.maskedEquals(data, uuid, mask);
        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()));
    }

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

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 com.android.internal.util.ArrayUtils;

import java.util.ArrayList;
import java.util.List;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * A request for the user to select a companion device to associate with.
 *
 * You can optionally set {@link Builder#addDeviceFilter filters} for which devices to show to the
 * You can optionally set a {@link Builder#setDeviceFilter filter} 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
@@ -38,22 +37,38 @@ import java.util.List;
 *
 * 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 implements Parcelable {
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 {}

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

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

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

    /** @hide */
@@ -62,15 +77,22 @@ public final class AssociationRequest implements Parcelable {
    }

    /** @hide */
    @NonNull
    public List<DeviceFilter<?>> getDeviceFilters() {
        return mDeviceFilters;
    @MediumType
    public int getMediumType() {
        return mMediumType;
    }

    /** @hide */
    @Nullable
    public F getDeviceFilter() {
        return mDeviceFilter;
    }

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

    @Override
@@ -92,19 +114,45 @@ public final class AssociationRequest implements Parcelable {

    /**
     * A builder for {@link AssociationRequest}
     *
     * @param <F> the type of filter for the request.
     */
    public static final class Builder extends OneTimeUseBuilder<AssociationRequest> {
    public static final class Builder<F extends DeviceFilter>
            extends OneTimeUseBuilder<AssociationRequest<F>> {
        private boolean mSingleDevice = false;
        @Nullable private ArrayList<DeviceFilter<?>> mDeviceFilters = null;
        @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);
        }

        public Builder() {}
        /**
         * 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()

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

        /**
         * @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 build() {
        public AssociationRequest<F> build() {
            markUsed();
            return new AssociationRequest(mSingleDevice, mDeviceFilters);
            return new AssociationRequest<>(mSingleDevice, mMediumType, mDeviceFilter);
        }
    }
}
Loading