Loading api/current.txt +8 −22 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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"; Loading @@ -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 { api/system-current.txt +8 −22 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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"; Loading @@ -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 { api/test-current.txt +8 −22 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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"; Loading @@ -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 { core/java/android/bluetooth/le/ScanFilter.java +9 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading core/java/android/companion/AssociationRequest.java +82 −25 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 */ Loading @@ -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 Loading @@ -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; Loading @@ -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
api/current.txt +8 −22 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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"; Loading @@ -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 {
api/system-current.txt +8 −22 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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"; Loading @@ -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 {
api/test-current.txt +8 −22 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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"; Loading @@ -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 {
core/java/android/bluetooth/le/ScanFilter.java +9 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading
core/java/android/companion/AssociationRequest.java +82 −25 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 */ Loading @@ -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 Loading @@ -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; Loading @@ -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); } } }