package com.shlb.comb.fragment;
|
|
import android.Manifest;
|
import android.content.Intent;
|
import android.os.Bundle;
|
import android.text.TextUtils;
|
import android.view.LayoutInflater;
|
import android.view.View;
|
import android.view.ViewGroup;
|
import android.widget.AdapterView;
|
import android.widget.ListView;
|
import android.widget.Toast;
|
|
import androidx.annotation.NonNull;
|
import androidx.annotation.Nullable;
|
import androidx.fragment.app.Fragment;
|
|
import com.blakequ.bluetooth_manager_lib.device.BluetoothLeDevice;
|
import com.blakequ.bluetooth_manager_lib.scan.BluetoothScanManager;
|
import com.blakequ.bluetooth_manager_lib.scan.ScanOverListener;
|
import com.blakequ.bluetooth_manager_lib.scan.bluetoothcompat.ScanCallbackCompat;
|
import com.blakequ.bluetooth_manager_lib.scan.bluetoothcompat.ScanResultCompat;
|
import com.blakequ.bluetooth_manager_lib.util.BluetoothUtils;
|
import com.blankj.utilcode.util.LogUtils;
|
import com.qmuiteam.qmui.widget.QMUIEmptyView;
|
import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
|
import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction;
|
import com.shlb.comb.R;
|
import com.shlb.comb.activity.ConnActivity;
|
import com.shlb.comb.activity.TestActivity;
|
import com.shlb.comb.activity.HomeActivity;
|
import com.shlb.comb.adapter.HomeDeviceListAdapter;
|
import com.shlb.comb.base.BaseActivity;
|
import com.shlb.comb.event.UpdateEvent;
|
import com.shlb.comb.model.BluetoothLeDeviceStore;
|
import com.shlb.comb.util.Singletion;
|
|
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.Subscribe;
|
import org.greenrobot.eventbus.ThreadMode;
|
|
import java.util.List;
|
|
import pub.devrel.easypermissions.AfterPermissionGranted;
|
import pub.devrel.easypermissions.EasyPermissions;
|
|
public class DeviceListFragment extends Fragment implements AdapterView.OnItemClickListener, EasyPermissions.PermissionCallbacks {
|
private static final int BLUETOOTH_NEDD_PERMISSIONS = 1011;
|
|
public static final int MODE_RETURN_SETTINGS = 0;
|
public static final int MODE_GO_TO_TEST = 1;
|
private static int navigationMode = MODE_RETURN_SETTINGS;
|
private boolean isSwitchingDevice = false;
|
|
public static void setNavigationMode(int mode) {
|
navigationMode = mode;
|
}
|
|
private QMUIEmptyView mEmptyView;
|
private ListView homeList;
|
private BluetoothScanManager scanManager;
|
private BluetoothLeDeviceStore mDeviceStore;
|
private BluetoothUtils mBluetoothUtils;
|
private HomeDeviceListAdapter mLeDeviceListAdapter;
|
private com.qmuiteam.qmui.widget.dialog.QMUITipDialog mLoadingDialog;
|
|
private void showLoading(String message) {
|
if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
|
mLoadingDialog.dismiss();
|
}
|
mLoadingDialog = new com.qmuiteam.qmui.widget.dialog.QMUITipDialog.Builder(getContext())
|
.setIconType(com.qmuiteam.qmui.widget.dialog.QMUITipDialog.Builder.ICON_TYPE_LOADING)
|
.setTipWord(message)
|
.create();
|
mLoadingDialog.show();
|
}
|
|
private void dismissLoading() {
|
if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
|
mLoadingDialog.dismiss();
|
mLoadingDialog = null;
|
}
|
}
|
|
@Nullable
|
@Override
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
View view = inflater.inflate(R.layout.fragment_device_list, container, false);
|
mEmptyView = view.findViewById(R.id.emptyView);
|
homeList = view.findViewById(R.id.homeList);
|
return view;
|
}
|
|
@Override
|
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
super.onViewCreated(view, savedInstanceState);
|
EventBus.getDefault().register(this);
|
initView();
|
initData();
|
}
|
|
private void initView() {
|
mEmptyView.show(true, "搜索蓝牙", "", "重新扫描", new View.OnClickListener() {
|
@Override
|
public void onClick(View view) {
|
if (scanManager != null && !scanManager.isScanning()) {
|
startScan();
|
}
|
}
|
});
|
}
|
|
private void initData() {
|
if (getActivity() instanceof HomeActivity) {
|
HomeActivity activity = (HomeActivity) getActivity();
|
mBluetoothUtils = activity.getBluetoothUtils();
|
mDeviceStore = activity.getDeviceStore();
|
scanManager = activity.getScanManager();
|
}
|
|
mLeDeviceListAdapter = new HomeDeviceListAdapter(getContext(), new HomeDeviceListAdapter.setOnItemButtonClick() {
|
@Override
|
public void buttonClick(View view, int position) {
|
final BluetoothLeDevice device = (BluetoothLeDevice) mLeDeviceListAdapter.getItem(position);
|
if (device == null) {
|
Toast.makeText(getContext(), "连接设备不能为空!", Toast.LENGTH_SHORT).show();
|
return;
|
}
|
Singletion.getInstance().mDevice = device;
|
if (device.getAddress() == null) {
|
Toast.makeText(getContext(), "连接设备地址不能为空!", Toast.LENGTH_SHORT).show();
|
return;
|
}
|
|
if (com.shlb.comb.manager.BleGlobalManager.getInstance().isConnected()) {
|
new QMUIDialog.MessageDialogBuilder(getContext())
|
.setTitle("提示")
|
.setMessage("当前已连接设备,是否断开并连接新设备?")
|
.addAction("取消", (dialog, index) -> dialog.dismiss())
|
.addAction("确定", (dialog, index) -> {
|
dialog.dismiss();
|
isSwitchingDevice = true;
|
com.shlb.comb.manager.BleGlobalManager.getInstance().disconnect();
|
connectToDevice(device);
|
})
|
.create(com.qmuiteam.qmui.R.style.QMUI_Dialog).show();
|
} else {
|
connectToDevice(device);
|
}
|
}
|
});
|
homeList.setOnItemClickListener(this);
|
homeList.setAdapter(mLeDeviceListAdapter);
|
scanManager.setScanOverListener(new ScanOverListener() {
|
@Override
|
public void onScanOver() {
|
}
|
});
|
|
scanManager.setScanCallbackCompat(new ScanCallbackCompat() {
|
@Override
|
public void onScanFailed(final int errorCode) {
|
super.onScanFailed(errorCode);
|
Toast.makeText(getContext(), "扫描失败:" + errorCode, Toast.LENGTH_SHORT).show();
|
}
|
|
@Override
|
public void onScanResult(int callbackType, ScanResultCompat result) {
|
super.onScanResult(callbackType, result);
|
String deviceName = result.getScanRecord().getDeviceName();
|
LogUtils.i("scan device ", result.getLeDevice().getAddress() + " " + deviceName);
|
if (deviceName != null) deviceName = deviceName.toLowerCase();
|
|
if (!TextUtils.isEmpty(deviceName)) {
|
mDeviceStore.addDevice(result.getLeDevice());
|
EventBus.getDefault().post(new UpdateEvent(UpdateEvent.Type.SCAN_UPDATE));
|
}
|
}
|
});
|
startScan();
|
}
|
|
private void connectToDevice(BluetoothLeDevice device) {
|
if (navigationMode == MODE_RETURN_SETTINGS) {
|
com.shlb.comb.manager.BleGlobalManager.getInstance().connect(getContext(), device);
|
showLoading("正在连接 " + device.getName() + "...");
|
} else {
|
Intent intent = new Intent(getContext(), TestActivity.class);
|
startActivity(intent);
|
}
|
}
|
|
@Override
|
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
|
}
|
|
public void startScan() {
|
if (checkPermission()) {
|
if (checkIsBleState()) {
|
if (mDeviceStore != null && scanManager != null && scanManager.isScanning()) {
|
if (getActivity() instanceof BaseActivity) {
|
((BaseActivity) getActivity()).Toast("正在扫描中...");
|
}
|
return;
|
}
|
mDeviceStore.clear();
|
EventBus.getDefault().post(new UpdateEvent(UpdateEvent.Type.SCAN_UPDATE));
|
((BaseActivity) getActivity()).Toast("开始扫描...");
|
scanManager.startScanNow();
|
}
|
}
|
}
|
|
public void startScanOnce() {
|
if (checkPermission()) {
|
if (checkIsBleState()) {
|
if (mDeviceStore != null && scanManager != null && scanManager.isScanning()) return;
|
mDeviceStore.clear();
|
EventBus.getDefault().post(new UpdateEvent(UpdateEvent.Type.SCAN_UPDATE));
|
scanManager.startScanOnce();
|
}
|
}
|
}
|
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
public void onEventRefresh(UpdateEvent event) {
|
if (event.getType() == UpdateEvent.Type.CONN_STATU) {
|
int status = 0;
|
if (event.getObj() instanceof Integer) {
|
status = (int) event.getObj();
|
}
|
if (status == android.bluetooth.BluetoothProfile.STATE_CONNECTED) {
|
dismissLoading();
|
Toast.makeText(getContext(), "连接成功", Toast.LENGTH_SHORT).show();
|
if (getFragmentManager() != null) {
|
getFragmentManager().popBackStack();
|
}
|
} else if (status == android.bluetooth.BluetoothProfile.STATE_DISCONNECTED) {
|
if (isSwitchingDevice) {
|
isSwitchingDevice = false;
|
return;
|
}
|
dismissLoading();
|
Toast.makeText(getContext(), "连接断开", Toast.LENGTH_SHORT).show();
|
}
|
}
|
if (event.getType() == UpdateEvent.Type.SCAN_UPDATE) {
|
if (mLeDeviceListAdapter != null && mDeviceStore != null && mDeviceStore.getDeviceList() != null) {
|
mLeDeviceListAdapter.refreshData(mDeviceStore.getDeviceList());
|
}
|
if (mDeviceStore != null && mDeviceStore.getDeviceList() != null && mDeviceStore.getDeviceList().size() > 0) {
|
mEmptyView.hide();
|
homeList.setVisibility(View.VISIBLE);
|
} else {
|
homeList.setVisibility(View.GONE);
|
mEmptyView.show(true, "搜索蓝牙", "", "重新扫描", new View.OnClickListener() {
|
@Override
|
public void onClick(View view) {
|
if (scanManager != null && !scanManager.isScanning()) {
|
startScan();
|
}
|
}
|
});
|
}
|
}
|
}
|
|
@Override
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
|
}
|
|
@Override
|
public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
|
startScan();
|
}
|
|
@Override
|
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
|
Toast.makeText(getContext(), "未获得必要权限,无法扫描", Toast.LENGTH_SHORT).show();
|
}
|
|
private boolean checkIsBleState() {
|
if (!mBluetoothUtils.isBluetoothLeSupported(getContext())) {
|
Toast.makeText(getContext(), "当前手机不支持BLE低功耗蓝牙,无法使用!", Toast.LENGTH_SHORT).show();
|
} else if (!mBluetoothUtils.isBluetoothIsEnable()) {
|
new QMUIDialog.MessageDialogBuilder(getContext())
|
.setTitle("提示")
|
.setMessage("蓝牙未打开,确定打开蓝牙?")
|
.addAction("取消", new QMUIDialogAction.ActionListener() {
|
@Override
|
public void onClick(QMUIDialog dialog, int index) {
|
dialog.dismiss();
|
}
|
})
|
.addAction("确定", new QMUIDialogAction.ActionListener() {
|
@Override
|
public void onClick(QMUIDialog dialog, int index) {
|
mBluetoothUtils.askUserToEnableBluetoothIfNeeded(getActivity());
|
dialog.dismiss();
|
}
|
})
|
.create(com.qmuiteam.qmui.R.style.QMUI_Dialog).show();
|
} else {
|
return true;
|
}
|
return false;
|
}
|
|
@AfterPermissionGranted(BLUETOOTH_NEDD_PERMISSIONS)
|
private boolean checkPermission() {
|
String[] permissionList;
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
|
permissionList = new String[]{
|
Manifest.permission.BLUETOOTH_SCAN,
|
Manifest.permission.BLUETOOTH_CONNECT,
|
Manifest.permission.ACCESS_FINE_LOCATION
|
};
|
} else {
|
permissionList = new String[]{
|
Manifest.permission.BLUETOOTH,
|
Manifest.permission.BLUETOOTH_ADMIN,
|
Manifest.permission.ACCESS_COARSE_LOCATION,
|
Manifest.permission.ACCESS_FINE_LOCATION,
|
Manifest.permission.READ_EXTERNAL_STORAGE,
|
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
};
|
}
|
|
if (EasyPermissions.hasPermissions(getContext(), permissionList)) {
|
return true;
|
} else {
|
EasyPermissions.requestPermissions(this, "程序运行需要权限!",
|
BLUETOOTH_NEDD_PERMISSIONS, permissionList);
|
return false;
|
}
|
}
|
|
@Override
|
public void onPause() {
|
super.onPause();
|
if (scanManager != null && scanManager.isScanning()) {
|
scanManager.stopCycleScan();
|
}
|
}
|
|
@Override
|
public void onDestroyView() {
|
super.onDestroyView();
|
dismissLoading();
|
EventBus.getDefault().unregister(this);
|
if (scanManager != null) {
|
scanManager.setScanCallbackCompat(null);
|
scanManager.setScanOverListener(null);
|
}
|
}
|
}
|