import com.android.internal.util.ObjectUtils;
import com.android.internal.util.Preconditions;
+import java.nio.ByteOrder;
import java.util.Arrays;
import java.util.Objects;
import java.util.regex.Pattern;
private final String mRenamePrefix;
private final String mRenameSuffix;
private final int mRenameBytesFrom;
- private final int mRenameBytesTo;
+ private final int mRenameBytesLength;
private final int mRenameNameFrom;
- private final int mRenameNameTo;
+ private final int mRenameNameLength;
private final boolean mRenameBytesReverseOrder;
private BluetoothLeDeviceFilter(Pattern namePattern, ScanFilter scanFilter,
byte[] rawDataFilter, byte[] rawDataFilterMask, String renamePrefix,
- String renameSuffix, int renameBytesFrom, int renameBytesTo,
- int renameNameFrom, int renameNameTo, boolean renameBytesReverseOrder) {
+ String renameSuffix, int renameBytesFrom, int renameBytesLength,
+ int renameNameFrom, int renameNameLength, boolean renameBytesReverseOrder) {
mNamePattern = namePattern;
mScanFilter = ObjectUtils.firstNotNull(scanFilter, ScanFilter.EMPTY);
mRawDataFilter = rawDataFilter;
mRenamePrefix = renamePrefix;
mRenameSuffix = renameSuffix;
mRenameBytesFrom = renameBytesFrom;
- mRenameBytesTo = renameBytesTo;
+ mRenameBytesLength = renameBytesLength;
mRenameNameFrom = renameNameFrom;
- mRenameNameTo = renameNameTo;
+ mRenameNameLength = renameNameLength;
mRenameBytesReverseOrder = renameBytesReverseOrder;
}
}
/** @hide */
- public int getRenameBytesTo() {
- return mRenameBytesTo;
+ public int getRenameBytesLength() {
+ return mRenameBytesLength;
}
/** @hide */
if (mRenameBytesFrom >= 0) {
final byte[] bytes = sr.getScanRecord().getBytes();
int startInclusive = mRenameBytesFrom;
- int endInclusive = mRenameBytesTo - 1;
+ int endInclusive = mRenameBytesFrom + mRenameBytesLength -1;
int initial = mRenameBytesReverseOrder ? endInclusive : startInclusive;
int step = mRenameBytesReverseOrder ? -1 : 1;
for (int i = initial; startInclusive <= i && i <= endInclusive; i += step) {
} else {
sb.append(
getDeviceDisplayNameInternal(sr.getDevice())
- .substring(mRenameNameFrom, mRenameNameTo));
+ .substring(mRenameNameFrom, mRenameNameFrom + mRenameNameLength));
}
return sb.append(TextUtils.emptyIfNull(mRenameSuffix)).toString();
}
if (o == null || getClass() != o.getClass()) return false;
BluetoothLeDeviceFilter that = (BluetoothLeDeviceFilter) o;
return mRenameBytesFrom == that.mRenameBytesFrom &&
- mRenameBytesTo == that.mRenameBytesTo &&
+ mRenameBytesLength == that.mRenameBytesLength &&
+ mRenameNameFrom == that.mRenameNameFrom &&
+ mRenameNameLength == that.mRenameNameLength &&
mRenameBytesReverseOrder == that.mRenameBytesReverseOrder &&
Objects.equals(mNamePattern, that.mNamePattern) &&
Objects.equals(mScanFilter, that.mScanFilter) &&
@Override
public int hashCode() {
return Objects.hash(mNamePattern, mScanFilter, mRawDataFilter, mRawDataFilterMask,
- mRenamePrefix, mRenameSuffix, mRenameBytesFrom, mRenameBytesTo,
- mRenameBytesReverseOrder);
+ mRenamePrefix, mRenameSuffix, mRenameBytesFrom, mRenameBytesLength,
+ mRenameNameFrom, mRenameNameLength, mRenameBytesReverseOrder);
}
@Override
dest.writeString(mRenamePrefix);
dest.writeString(mRenameSuffix);
dest.writeInt(mRenameBytesFrom);
- dest.writeInt(mRenameBytesTo);
+ dest.writeInt(mRenameBytesLength);
dest.writeInt(mRenameNameFrom);
- dest.writeInt(mRenameNameTo);
+ dest.writeInt(mRenameNameLength);
dest.writeBoolean(mRenameBytesReverseOrder);
}
", mRenamePrefix='" + mRenamePrefix + '\'' +
", mRenameSuffix='" + mRenameSuffix + '\'' +
", mRenameBytesFrom=" + mRenameBytesFrom +
- ", mRenameBytesTo=" + mRenameBytesTo +
+ ", mRenameBytesLength=" + mRenameBytesLength +
", mRenameNameFrom=" + mRenameNameFrom +
- ", mRenameNameTo=" + mRenameNameTo +
+ ", mRenameNameLength=" + mRenameNameLength +
", mRenameBytesReverseOrder=" + mRenameBytesReverseOrder +
'}';
}
if (renamePrefix != null) {
if (bytesFrom >= 0) {
builder.setRenameFromBytes(renamePrefix, suffix, bytesFrom, bytesTo,
- bytesReverseOrder);
+ bytesReverseOrder ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN);
} else {
builder.setRenameFromName(renamePrefix, suffix, nameFrom, nameTo);
}
private String mRenamePrefix;
private String mRenameSuffix;
private int mRenameBytesFrom = -1;
- private int mRenameBytesTo;
+ private int mRenameBytesLength;
private int mRenameNameFrom = -1;
- private int mRenameNameTo;
+ private int mRenameNameLength;
private boolean mRenameBytesReverseOrder = false;
/**
* @param prefix to be displayed before the byte data
* @param suffix to be displayed after the byte data
* @param bytesFrom the start byte index to be displayed (inclusive)
- * @param bytesTo the end byte index to be displayed (exclusive)
- * @param bytesReverseOrder if true, the byte order of the provided range will be flipped
- * when displaying
+ * @param bytesLength the number of bytes to be displayed from the given index
+ * @param byteOrder whether the given range of bytes is big endian (will be displayed
+ * in same order) or little endian (will be flipped before displaying)
* @return self for chaining
*/
@NonNull
public Builder setRenameFromBytes(@NonNull String prefix, @NonNull String suffix,
- int bytesFrom, int bytesTo, boolean bytesReverseOrder) {
+ int bytesFrom, int bytesLength, ByteOrder byteOrder) {
checkRenameNotSet();
- checkRangeNotEmpty(bytesFrom, bytesTo);
+ checkRangeNotEmpty(bytesLength);
mRenameBytesFrom = bytesFrom;
- mRenameBytesTo = bytesTo;
- mRenameBytesReverseOrder = bytesReverseOrder;
+ mRenameBytesLength = bytesLength;
+ mRenameBytesReverseOrder = byteOrder == ByteOrder.LITTLE_ENDIAN;
return setRename(prefix, suffix);
}
* @param prefix to be displayed before the byte data
* @param suffix to be displayed after the byte data
* @param nameFrom the start name character index to be displayed (inclusive)
- * @param nameTo the end name character index to be displayed (exclusive)
+ * @param nameLength the number of characters to be displayed from the given index
* @return self for chaining
*/
@NonNull
public Builder setRenameFromName(@NonNull String prefix, @NonNull String suffix,
- int nameFrom, int nameTo) {
+ int nameFrom, int nameLength) {
checkRenameNotSet();
- checkRangeNotEmpty(nameFrom, nameTo);
+ checkRangeNotEmpty(nameLength);
mRenameNameFrom = nameFrom;
- mRenameNameTo = nameTo;
+ mRenameNameLength = nameLength;
mRenameBytesReverseOrder = false;
return setRename(prefix, suffix);
}
checkState(mRenamePrefix == null, "Renaming rule can only be set once");
}
- private void checkRangeNotEmpty(int bytesFrom, int bytesTo) {
- checkArgument(bytesFrom < bytesTo, "Range must be non-empty");
+ private void checkRangeNotEmpty(int length) {
+ checkArgument(length > 0, "Range must be non-empty");
}
@NonNull
return new BluetoothLeDeviceFilter(mNamePattern, mScanFilter,
mRawDataFilter, mRawDataFilterMask,
mRenamePrefix, mRenameSuffix,
- mRenameBytesFrom, mRenameBytesTo,
- mRenameNameFrom, mRenameNameTo,
+ mRenameBytesFrom, mRenameBytesLength,
+ mRenameNameFrom, mRenameNameLength,
mRenameBytesReverseOrder);
}
}