package com.clj.fastble.scan;
|
|
import android.bluetooth.BluetoothDevice;
|
import android.text.TextUtils;
|
|
import com.clj.fastble.data.ScanResult;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
/**
|
* scan a known name device, then connect
|
*/
|
public abstract class NameScanCallback extends PeriodScanCallback {
|
|
private String mName = null;
|
private String[] mNames = null;
|
private boolean mFuzzy = false;
|
private AtomicBoolean hasFound = new AtomicBoolean(false);
|
|
public NameScanCallback(String name, long timeoutMillis, boolean fuzzy) {
|
super(timeoutMillis);
|
this.mName = name;
|
this.mFuzzy = fuzzy;
|
if (TextUtils.isEmpty(name)) {
|
onDeviceNotFound();
|
}
|
}
|
|
public NameScanCallback(String[] names, long timeoutMillis, boolean fuzzy) {
|
super(timeoutMillis);
|
this.mNames = names;
|
this.mFuzzy = fuzzy;
|
if (names == null || names.length < 1) {
|
onDeviceNotFound();
|
}
|
}
|
|
@Override
|
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
|
if (device == null)
|
return;
|
|
if (TextUtils.isEmpty(device.getName())) {
|
return;
|
}
|
|
if (!hasFound.get()) {
|
|
ScanResult scanResult = new ScanResult(device, rssi, scanRecord,
|
System.currentTimeMillis());
|
|
if (mName != null) {
|
if (mFuzzy ? device.getName().contains(mName) : mName.equalsIgnoreCase(device.getName())) {
|
hasFound.set(true);
|
bleBluetooth.stopScan(NameScanCallback.this);
|
onDeviceFound(scanResult);
|
}
|
} else if (mNames != null) {
|
for (String name : mNames) {
|
if (mFuzzy ? device.getName().contains(name) : name.equalsIgnoreCase(device.getName())) {
|
hasFound.set(true);
|
bleBluetooth.stopScan(NameScanCallback.this);
|
onDeviceFound(scanResult);
|
return;
|
}
|
}
|
}
|
}
|
}
|
|
@Override
|
public void onScanTimeout() {
|
onDeviceNotFound();
|
}
|
|
@Override
|
public void onScanCancel() {
|
|
}
|
|
public abstract void onDeviceFound(ScanResult sanResult);
|
|
public abstract void onDeviceNotFound();
|
}
|