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