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.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); if (!EventBus.getDefault().isRegistered(this)) { 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 perms) { startScan(); } @Override public void onPermissionsDenied(int requestCode, @NonNull List 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(); if (EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this); } if (scanManager != null) { scanManager.setScanCallbackCompat(null); scanManager.setScanOverListener(null); } } }