[DO NOT MERGE] Add an opnion to use advertised name for renaming

Test: Use new API, make sure renaming works
Change-Id: I9251c5db24495b8594fadce2beab3347a1aec884
This commit is contained in:
Eugene Susla
2017-04-05 10:36:24 -07:00
committed by Svetoslav Ganov
parent 200c37f413
commit 75fb821029
4 changed files with 90 additions and 21 deletions

View File

@@ -8243,7 +8243,8 @@ package android.companion {
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 setRenameFromBytes(java.lang.String, java.lang.String, int, int, boolean);
method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int);
method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
}

View File

@@ -8737,7 +8737,8 @@ package android.companion {
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 setRenameFromBytes(java.lang.String, java.lang.String, int, int, boolean);
method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int);
method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
}

View File

@@ -8274,7 +8274,8 @@ package android.companion {
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 setRenameFromBytes(java.lang.String, java.lang.String, int, int, boolean);
method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int);
method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
}

View File

@@ -21,6 +21,7 @@ import static android.companion.BluetoothDeviceFilterUtils.patternFromString;
import static android.companion.BluetoothDeviceFilterUtils.patternToString;
import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.internal.util.Preconditions.checkState;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -61,12 +62,14 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
private final String mRenameSuffix;
private final int mRenameBytesFrom;
private final int mRenameBytesTo;
private final int mRenameNameFrom;
private final int mRenameNameTo;
private final boolean mRenameBytesReverseOrder;
private BluetoothLEDeviceFilter(Pattern namePattern, ScanFilter scanFilter,
byte[] rawDataFilter, byte[] rawDataFilterMask, String renamePrefix,
String renameSuffix, int renameBytesFrom, int renameBytesTo,
boolean renameBytesReverseOrder) {
int renameNameFrom, int renameNameTo, boolean renameBytesReverseOrder) {
mNamePattern = namePattern;
mScanFilter = ObjectUtils.firstNotNull(scanFilter, ScanFilter.EMPTY);
mRawDataFilter = rawDataFilter;
@@ -75,6 +78,8 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
mRenameSuffix = renameSuffix;
mRenameBytesFrom = renameBytesFrom;
mRenameBytesTo = renameBytesTo;
mRenameNameFrom = renameNameFrom;
mRenameNameTo = renameNameTo;
mRenameBytesReverseOrder = renameBytesReverseOrder;
}
@@ -133,15 +138,23 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
@Override
@Nullable
public String getDeviceDisplayName(ScanResult sr) {
if (mRenameBytesFrom < 0) return getDeviceDisplayNameInternal(sr.getDevice());
final byte[] bytes = sr.getScanRecord().getBytes();
if (mRenameBytesFrom < 0 && mRenameNameFrom < 0) {
return getDeviceDisplayNameInternal(sr.getDevice());
}
final StringBuilder sb = new StringBuilder(TextUtils.emptyIfNull(mRenamePrefix));
int startInclusive = mRenameBytesFrom;
int endInclusive = mRenameBytesTo - 1;
int initial = mRenameBytesReverseOrder ? endInclusive : startInclusive;
int step = mRenameBytesReverseOrder ? -1 : 1;
for (int i = initial; startInclusive <= i && i <= endInclusive; i+=step) {
sb.append(Byte.toHexString(bytes[i], true));
if (mRenameBytesFrom >= 0) {
final byte[] bytes = sr.getScanRecord().getBytes();
int startInclusive = mRenameBytesFrom;
int endInclusive = mRenameBytesTo - 1;
int initial = mRenameBytesReverseOrder ? endInclusive : startInclusive;
int step = mRenameBytesReverseOrder ? -1 : 1;
for (int i = initial; startInclusive <= i && i <= endInclusive; i += step) {
sb.append(Byte.toHexString(bytes[i], true));
}
} else {
sb.append(
getDeviceDisplayNameInternal(sr.getDevice())
.substring(mRenameNameFrom, mRenameNameTo));
}
return sb.append(TextUtils.emptyIfNull(mRenameSuffix)).toString();
}
@@ -202,6 +215,8 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
dest.writeString(mRenameSuffix);
dest.writeInt(mRenameBytesFrom);
dest.writeInt(mRenameBytesTo);
dest.writeInt(mRenameNameFrom);
dest.writeInt(mRenameNameTo);
dest.writeBoolean(mRenameBytesReverseOrder);
}
@@ -226,9 +241,16 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
String suffix = in.readString();
int bytesFrom = in.readInt();
int bytesTo = in.readInt();
int nameFrom = in.readInt();
int nameTo = in.readInt();
boolean bytesReverseOrder = in.readBoolean();
if (renamePrefix != null) {
builder.setRename(renamePrefix, suffix, bytesFrom, bytesTo, bytesReverseOrder);
if (bytesFrom >= 0) {
builder.setRenameFromBytes(renamePrefix, suffix, bytesFrom, bytesTo,
bytesReverseOrder);
} else {
builder.setRenameFromName(renamePrefix, suffix, nameFrom, nameTo);
}
}
return builder.build();
}
@@ -255,6 +277,8 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
private String mRenameSuffix;
private int mRenameBytesFrom = -1;
private int mRenameBytesTo;
private int mRenameNameFrom = -1;
private int mRenameNameTo;
private boolean mRenameBytesReverseOrder = false;
/**
@@ -320,17 +344,57 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
* @return self for chaining
*/
@NonNull
public Builder setRename(@NonNull String prefix, @NonNull String suffix,
public Builder setRenameFromBytes(@NonNull String prefix, @NonNull String suffix,
int bytesFrom, int bytesTo, boolean bytesReverseOrder) {
checkNotUsed();
checkArgument(TextUtils.length(prefix) >= getRenamePrefixLengthLimit(),
"Prefix is too short");
mRenamePrefix = prefix;
mRenameSuffix = suffix;
checkArgument(bytesFrom < bytesTo, "Byte range must be non-empty");
checkRenameNotSet();
checkRangeNotEmpty(bytesFrom, bytesTo);
mRenameBytesFrom = bytesFrom;
mRenameBytesTo = bytesTo;
mRenameBytesReverseOrder = bytesReverseOrder;
return setRename(prefix, suffix);
}
/**
* Rename the devices shown in the list, using specific characters from the advertised name,
* as well as a custom prefix/suffix around them
*
* Note that the prefix length is limited to {@link #getRenamePrefixLengthLimit} characters
* to ensure that there's enough space to display the byte data
*
* The range of name characters to be displayed cannot be empty
*
* @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)
* @return self for chaining
*/
@NonNull
public Builder setRenameFromName(@NonNull String prefix, @NonNull String suffix,
int nameFrom, int nameTo) {
checkRenameNotSet();
checkRangeNotEmpty(nameFrom, nameTo);
mRenameNameFrom = nameFrom;
mRenameNameTo = nameTo;
mRenameBytesReverseOrder = false;
return setRename(prefix, suffix);
}
private void checkRenameNotSet() {
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");
}
@NonNull
private Builder setRename(@NonNull String prefix, @NonNull String suffix) {
checkNotUsed();
checkArgument(TextUtils.length(prefix) <= getRenamePrefixLengthLimit(),
"Prefix is too long");
mRenamePrefix = prefix;
mRenameSuffix = suffix;
return this;
}
@@ -342,7 +406,9 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
return new BluetoothLEDeviceFilter(mNamePattern, mScanFilter,
mRawDataFilter, mRawDataFilterMask,
mRenamePrefix, mRenameSuffix,
mRenameBytesFrom, mRenameBytesTo, mRenameBytesReverseOrder);
mRenameBytesFrom, mRenameBytesTo,
mRenameNameFrom, mRenameNameTo,
mRenameBytesReverseOrder);
}
}
}