import 'dart:math'; import 'package:get/get.dart'; import 'package:starcloud/entity/star_cloud_lock_list.dart'; import 'package:starcloud/entity/star_cloud_scan_result.dart'; import 'package:starcloud/sdk/entity/cloud_user_info.dart'; import 'package:starcloud/sdk/sdk_device_operate_extension.dart'; import 'package:starcloud/sdk/starcloud.dart'; import 'package:starwork_flutter/base/app_logger.dart'; import 'package:starwork_flutter/base/app_permission.dart'; import 'package:starwork_flutter/base/base_controller.dart'; import 'package:starwork_flutter/common/constant/app_toast_messages.dart'; import 'package:starwork_flutter/common/constant/cache_keys.dart'; import 'package:starwork_flutter/common/events/refresh_device_list_event.dart'; import 'package:starwork_flutter/common/utils/event_bus_util.dart'; import 'package:starwork_flutter/common/utils/shared_preferences_utils.dart'; class SearchDeviceController extends BaseController { // 搜索状态管理 final RxBool isSearching = false.obs; // 设备列表管理 final RxList deviceList = [].obs; // 权限状态标识 final RxBool permissionsGranted = false.obs; @override void onInit() async { super.onInit(); // 异步初始化权限 _initializePermissions(); } @override void onClose() { StarCloudSDK.instance.stopScan(onError: (err) {}); isSearching.value = false; deviceList.clear(); super.onClose(); } /// 初始化权限 Future _initializePermissions() async { try { AppLogger.highlight('🔐 开始检查权限...'); // 使用 BleService 中的统一权限申请方法 bool hasPermissions = await _checkAndRequestBlePermission(); if (!hasPermissions) { AppLogger.error('❌ 蓝牙相关权限被拒绝'); showToast('蓝牙功能需要相关权限,请在设置中开启'); return; } AppLogger.highlight('✅ 所有权限已获得'); // 所有权限都获得了,标记为可以开始搜索 permissionsGranted.value = true; AppLogger.highlight('🎉 所有权限已就绪,准备开始搜索'); // 开始搜索 _startBluetoothSearch(); } catch (e, stackTrace) { AppLogger.error('权限初始化失败', error: e, stackTrace: stackTrace); showToast('权限初始化失败,请重试'); } } /// 启动蓝牙搜索 Future _startBluetoothSearch() async { try { // 清空设备列表 deviceList.clear(); // 更新搜索状态 isSearching.value = true; // 启动搜索设备 await StarCloudSDK.instance.scanDeviceList( onScan: (List deviceListResult) { AppLogger.highlight('deviceListResult:${deviceListResult}'); deviceList.value = deviceListResult; }, timeout: 10, ); } catch (e, stackTrace) { AppLogger.error('启动蓝牙搜索失败', error: e, stackTrace: stackTrace); isSearching.value = false; showToast('启动搜索失败,请刷新并重试'); } } /// 刷新设备数据 Future refreshDevices() async { AppLogger.highlight('🔄 开始刷新设备列表'); try { await StarCloudSDK.instance.stopScan(onError: (err) {}); isSearching.value = false; // 清空设备列表 deviceList.clear(); // 模拟网络请求延迟 await Future.delayed(const Duration(seconds: 1)); // 重新开始搜索前检查权限 await _initializePermissions(); AppLogger.highlight('✅ 设备列表刷新完成'); } catch (e, stackTrace) { AppLogger.error('刷新设备列表失败', error: e, stackTrace: stackTrace); showToast('刷新失败,请重试'); } } /// 连接设备 /// 1.获取锁公钥 /// 2.获取锁私钥 /// 3.注册管理员密码 void connectingDevices(StarCloudScanResult device) async { showLoading(); try { await StarCloudSDK.instance.pairDevice( onError: (err) { AppLogger.error('连接设备时出现错误:${err}'); hideLoading(); }, onSuccess: (StarCloudLock lockInfo) { // 设备连接成功 showSuccess(message: '设备添加成功'.tr); hideLoading(); // 触发刷新设备列表 EventBusUtil().instance.fire(RefreshDeviceListEvent()); Get.back(); }, scanResult: device, ); } catch (e, stackTrace) { AppLogger.error('连接设备失败', error: e, stackTrace: stackTrace); showToast('连接失败,请重试'); hideLoading(); } } /// 检查并申请权限 Future _checkAndRequestBlePermission() async { var locationPermission = await AppPermission.requestLocationPermission(); if (!locationPermission) { showToast(AppToastMessages.notLocationPermission); return false; } var bluetoothPermissions = await AppPermission.requestBluetoothPermissions(); if (!bluetoothPermissions) { showToast(AppToastMessages.notBluetoothPermissions); return false; } return true; } }