package com.uxxu.konashi.lib;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import com.uxxu.konashi.lib.ui.BleDeviceListAdapter;
import com.uxxu.konashi.lib.ui.BleDeviceSelectionDialog;
import com.uxxu.konashi.lib.util.BtUtils;
import com.uxxu.konashi.lib.util.KonashiUtils;
/**
* Created by izumin on 10/7/15.
*/
class ConnectionHelper implements BleDeviceSelectionDialog.OnBleDeviceSelectListener, BluetoothAdapter.LeScanCallback {
private final ConnectionHelper self = this;
private static final long SCAN_PERIOD = 3000;
private static final String KONAHSHI_DEVICE_NAME = "konashi2";
private Callback mCallback;
private Handler mHandler;
private boolean mIsScanning;
private String mKonashiName;
private boolean mIsShowKonashiOnly;
private BluetoothManager mBluetoothManager;
private BluetoothAdapter mBluetoothAdapter;
private BleDeviceListAdapter mBleDeviceListAdapter;
private BleDeviceSelectionDialog mDialog;
private Activity mActivity;
public ConnectionHelper(Callback callback, Context context) {
mCallback = callback;
mHandler = new Handler(Looper.getMainLooper());
mBleDeviceListAdapter = new BleDeviceListAdapter(context);
mBluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = mBluetoothManager.getAdapter();
mDialog = new BleDeviceSelectionDialog(mBleDeviceListAdapter, this);
}
public void find(Activity activity, boolean isShowKonashiOnly, String name) {
mActivity = activity;
if (!BtUtils.isBluetoothSupported() || !BtUtils.isBluetoothEnabled()) {
BtUtils.startRequestEnableBluetoothActivityForResult(activity);
}
mIsShowKonashiOnly = isShowKonashiOnly;
mHandler.postDelayed(mFindRunnable, SCAN_PERIOD);
mBleDeviceListAdapter.clearDevices();
mBluetoothAdapter.stopLeScan(this);
mBluetoothAdapter.startLeScan(this);
mIsScanning = true;
mKonashiName = name;
if (mKonashiName == null) {
mDialog.show(mActivity);
}
}
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) {
KonashiUtils.log("DeviceName: " + device.getName());
if (device.getName() == null) {
return;
}
if ((mKonashiName != null) && device.getName().equals(mKonashiName)) {
onSelectBleDevice(device);
return;
}
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (!mIsShowKonashiOnly || device.getName().startsWith(KONAHSHI_DEVICE_NAME)) {
mBleDeviceListAdapter.addDevice(device, rssi);
mBleDeviceListAdapter.notifyDataSetChanged();
}
}
});
}
@Override
public void onSelectBleDevice(BluetoothDevice device) {
KonashiUtils.log("Selected device: " + device.getName());
stop();
mCallback.onSelectBleDevice(device);
}
@Override
public void onCancelSelectingBleDevice() {
stop();
}
private void stop(){
if (mIsScanning) {
mHandler.removeCallbacks(mFindRunnable);
mBluetoothAdapter.stopLeScan(self);
mIsScanning = false;
}
}
private final Runnable mFindRunnable = new Runnable() {
@Override
public void run() {
if (mIsScanning) {
mBluetoothAdapter.stopLeScan(self);
mIsScanning = false;
if (mKonashiName == null) {
mDialog.finishFinding();
}
}
}
};
public interface Callback {
void onSelectBleDevice(BluetoothDevice device);
}
}