blob: 716053351edd7be9592ea67bad17c79cae93353b [file] [log] [blame]
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.nearby;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
* A class represents a Fast Pair device that can be discovered by multiple mediums.
*
* @hide
*/
public class FastPairDevice extends NearbyDevice implements Parcelable {
/**
* Used to read a FastPairDevice from a Parcel.
*/
public static final Creator<FastPairDevice> CREATOR = new Creator<FastPairDevice>() {
@Override
public FastPairDevice createFromParcel(Parcel in) {
FastPairDevice.Builder builder = new FastPairDevice.Builder();
if (in.readInt() == 1) {
builder.setName(in.readString());
}
int size = in.readInt();
for (int i = 0; i < size; i++) {
builder.addMedium(in.readInt());
}
builder.setRssi(in.readInt());
builder.setTxPower(in.readInt());
if (in.readInt() == 1) {
builder.setModelId(in.readString());
}
builder.setBluetoothAddress(in.readString());
if (in.readInt() == 1) {
int dataLength = in.readInt();
byte[] data = new byte[dataLength];
in.readByteArray(data);
builder.setData(data);
}
return builder.build();
}
@Override
public FastPairDevice[] newArray(int size) {
return new FastPairDevice[size];
}
};
// The transmit power in dBm. Valid range is [-127, 126]. a
// See android.bluetooth.le.ScanResult#getTxPower
private int mTxPower;
// Some OEM devices devices don't have model Id.
@Nullable private final String mModelId;
// Bluetooth hardware address as string. Can be read from BLE ScanResult.
private final String mBluetoothAddress;
@Nullable
private final byte[] mData;
/**
* Creates a new FastPairDevice.
*
* @param name Name of the FastPairDevice. Can be {@code null} if there is no name.
* @param mediums The {@link Medium}s over which the device is discovered.
* @param rssi The received signal strength in dBm.
* @param txPower The transmit power in dBm. Valid range is [-127, 126].
* @param modelId The identifier of the Fast Pair device.
* Can be {@code null} if there is no Model ID.
* @param bluetoothAddress The hardware address of this BluetoothDevice.
* @param data Extra data for a Fast Pair device.
*/
public FastPairDevice(@Nullable String name,
List<Integer> mediums,
int rssi,
int txPower,
@Nullable String modelId,
@NonNull String bluetoothAddress,
@Nullable byte[] data) {
super(name, mediums, rssi);
this.mTxPower = txPower;
this.mModelId = modelId;
this.mBluetoothAddress = bluetoothAddress;
this.mData = data;
}
/**
* Gets the transmit power in dBm. A value of
* android.bluetooth.le.ScanResult#TX_POWER_NOT_PRESENT
* indicates that the TX power is not present.
*/
@IntRange(from = -127, to = 126)
public int getTxPower() {
return mTxPower;
}
/**
* Gets the identifier of the Fast Pair device. Can be {@code null} if there is no Model ID.
*/
@Nullable
public String getModelId() {
return this.mModelId;
}
/**
* Gets the hardware address of this BluetoothDevice.
*/
@NonNull
public String getBluetoothAddress() {
return mBluetoothAddress;
}
/**
* Gets the extra data for a Fast Pair device. Can be {@code null} if there is extra data.
*
* @hide
*/
@Nullable
public byte[] getData() {
return mData;
}
/**
* No special parcel contents.
*/
@Override
public int describeContents() {
return 0;
}
/**
* Returns a string representation of this FastPairDevice.
*/
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("FastPairDevice [");
String name = getName();
if (getName() != null && !name.isEmpty()) {
stringBuilder.append("name=").append(name).append(", ");
}
stringBuilder.append("medium={");
for (int medium: getMediums()) {
stringBuilder.append(mediumToString(medium));
}
stringBuilder.append("} rssi=").append(getRssi());
stringBuilder.append(" txPower=").append(mTxPower);
stringBuilder.append(" modelId=").append(mModelId);
stringBuilder.append(" bluetoothAddress=").append(mBluetoothAddress);
stringBuilder.append("]");
return stringBuilder.toString();
}
@Override
public boolean equals(Object other) {
if (other instanceof FastPairDevice) {
FastPairDevice otherDevice = (FastPairDevice) other;
if (!super.equals(other)) {
return false;
}
return mTxPower == otherDevice.mTxPower
&& Objects.equals(mModelId, otherDevice.mModelId)
&& Objects.equals(mBluetoothAddress, otherDevice.mBluetoothAddress)
&& Arrays.equals(mData, otherDevice.mData);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(
getName(), getMediums(), getRssi(), mTxPower, mModelId, mBluetoothAddress,
Arrays.hashCode(mData));
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
String name = getName();
dest.writeInt(name == null ? 0 : 1);
if (name != null) {
dest.writeString(name);
}
List<Integer> mediums = getMediums();
dest.writeInt(mediums.size());
for (int medium : mediums) {
dest.writeInt(medium);
}
dest.writeInt(getRssi());
dest.writeInt(mTxPower);
dest.writeInt(mModelId == null ? 0 : 1);
if (mModelId != null) {
dest.writeString(mModelId);
}
dest.writeString(mBluetoothAddress);
dest.writeInt(mData == null ? 0 : 1);
if (mData != null) {
dest.writeInt(mData.length);
dest.writeByteArray(mData);
}
}
/**
* A builder class for {@link FastPairDevice}
*
* @hide
*/
public static final class Builder {
private final List<Integer> mMediums;
@Nullable private String mName;
private int mRssi;
private int mTxPower;
@Nullable private String mModelId;
private String mBluetoothAddress;
@Nullable private byte[] mData;
public Builder() {
mMediums = new ArrayList<>();
}
/**
* Sets the name of the Fast Pair device.
*
* @param name Name of the FastPairDevice. Can be {@code null} if there is no name.
*/
@NonNull
public Builder setName(@Nullable String name) {
mName = name;
return this;
}
/**
* Sets the medium over which the Fast Pair device is discovered.
*
* @param medium The {@link Medium} over which the device is discovered.
*/
@NonNull
public Builder addMedium(@Medium int medium) {
mMediums.add(medium);
return this;
}
/**
* Sets the RSSI between the scan device and the discovered Fast Pair device.
*
* @param rssi The received signal strength in dBm.
*/
@NonNull
public Builder setRssi(@IntRange(from = -127, to = 126) int rssi) {
mRssi = rssi;
return this;
}
/**
* Sets the txPower.
*
* @param txPower The transmit power in dBm
*/
@NonNull
public Builder setTxPower(@IntRange(from = -127, to = 126) int txPower) {
mTxPower = txPower;
return this;
}
/**
* Sets the model Id of this Fast Pair device.
*
* @param modelId The identifier of the Fast Pair device. Can be {@code null}
* if there is no Model ID.
*/
@NonNull
public Builder setModelId(@Nullable String modelId) {
mModelId = modelId;
return this;
}
/**
* Sets the hardware address of this BluetoothDevice.
*
* @param bluetoothAddress The hardware address of this BluetoothDevice.
*/
@NonNull
public Builder setBluetoothAddress(@NonNull String bluetoothAddress) {
Objects.requireNonNull(bluetoothAddress);
mBluetoothAddress = bluetoothAddress;
return this;
}
/**
* Sets the raw data for a FastPairDevice. Can be {@code null} if there is no extra data.
*
* @hide
*/
@NonNull
public Builder setData(@Nullable byte[] data) {
mData = data;
return this;
}
/**
* Builds a FastPairDevice and return it.
*/
@NonNull
public FastPairDevice build() {
return new FastPairDevice(mName, mMediums, mRssi, mTxPower, mModelId,
mBluetoothAddress, mData);
}
}
}