package com.clj.fastble.scan;
|
|
import android.bluetooth.BluetoothDevice;
|
|
import com.clj.fastble.data.ScanResult;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
/**
|
* scan for a period of time
|
*/
|
public abstract class ListScanCallback extends PeriodScanCallback {
|
|
private List<ScanResult> resultList = new ArrayList<>();
|
private AtomicBoolean hasFound = new AtomicBoolean(false);
|
|
public ListScanCallback(long timeoutMillis) {
|
super(timeoutMillis);
|
}
|
|
@Override
|
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
|
if (device == null)
|
return;
|
|
ScanResult scanResult = new ScanResult(device, rssi, scanRecord,
|
System.currentTimeMillis());
|
|
synchronized (this) {
|
hasFound.set(false);
|
for (ScanResult result : resultList) {
|
if (result.getDevice().equals(device)) {
|
hasFound.set(true);
|
}
|
}
|
if (!hasFound.get()) {
|
resultList.add(scanResult);
|
onScanning(scanResult);
|
}
|
}
|
}
|
|
@Override
|
public void onScanTimeout() {
|
ScanResult[] results = new ScanResult[resultList.size()];
|
for (int i = 0; i < results.length; i++) {
|
results[i] = resultList.get(i);
|
}
|
onScanComplete(results);
|
}
|
|
@Override
|
public void onScanCancel() {
|
ScanResult[] resultArr = resultList.toArray(new ScanResult[resultList.size()]);
|
onScanComplete(resultArr);
|
}
|
|
public abstract void onScanning(ScanResult result);
|
|
public abstract void onScanComplete(ScanResult[] results);
|
|
}
|