You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

190 lines
5.8 KiB

import 'package:deep_voice/data/services/voice_interaction_service.dart';
import 'package:get/get.dart';
import 'dart:async';
import '../../../routes/app_routes.dart';
import '../../../data/services/classic_bluetooth_service.dart' as classic;
import '../../../core/utils/logger.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
/// 简化的配对控制器,仅用于显示已连接经典蓝牙设备和处理基本配对流程
class PairingController extends GetxController {
static PairingController get to => Get.find();
// 经典蓝牙服务
late classic.ClassicBluetoothService _bluetoothService;
// 是否开始搜索
final _isSearching = false.obs;
bool get isSearching => _isSearching.value;
// 设备连接状态
final _isConnecting = false.obs;
bool get isConnecting => _isConnecting.value;
// 蓝牙服务是否可用
final _isBluetoothServiceAvailable = true.obs;
bool get isBluetoothServiceAvailable => _isBluetoothServiceAvailable.value;
// 当前连接设备
Rx<classic.BluetoothDevice?> get currentDevice =>
_bluetoothService.currentDevice;
// 连接设备列表
RxList<classic.BluetoothDevice> get connectedDevices =>
_bluetoothService.connectedDevices;
// 错误信息
RxString get errorMessage => _bluetoothService.errorMessage;
// 连接设备列表(兼容旧代码)
List<classic.BluetoothDevice> get connectedClassicDevices =>
_bluetoothService.currentDevice.value != null
? [_bluetoothService.currentDevice.value!]
: [];
// 状态描述(用于UI显示)
final statusDescription = 'initializing'.tr.obs; // 正在初始化...
// 加载状态
final isLoading = false.obs;
@override
void onInit() {
super.onInit();
_initialize();
}
/// 完整的初始化流程
Future<void> _initialize() async {
try {
VoiceInteractionService.to.initialize();
VoiceInteractionService.to.startService();
isLoading.value = true;
statusDescription.value = 'initializing'.tr; // 正在初始化...
// 1. 获取蓝牙服务
_bluetoothService = Get.find<classic.ClassicBluetoothService>();
// 确保蓝牙服务已初始化
if (!await _bluetoothService.initialize()) {
Logger.error('蓝牙服务初始化失败');
statusDescription.value =
'bluetoothInitializationFailure'.tr; // 蓝牙服务初始化失败
_isBluetoothServiceAvailable.value = false;
isLoading.value = false;
return;
}
// 设置连接监听器,确保在页面完全加载后设置,避免过早监听可能导致的问题
_setupDeviceListeners();
// 2. 检查权限
statusDescription.value = 'checkingPermissions'.tr; // 正在检查权限...
final hasPermission =
await _bluetoothService.checkAndRequestPermissions();
if (!hasPermission) {
statusDescription.value = 'lackPermissions'.tr; // 缺少蓝牙权限
isLoading.value = false;
return;
}
// 3. 刷新设备列表
statusDescription.value = 'searchingDevice'.tr; // 正在搜索设备...
await refreshConnectedDevices();
// 4. 处理结果
if (_bluetoothService.connectedDevices.isNotEmpty) {
statusDescription.value = 'findConnectedDevice'.tr; // 找到已连接的设备
// 延迟跳转到主页
_autoNavigateToHome();
} else {
// 没有找到设备
statusDescription.value = 'notFound'.tr; // 未找到已连接的蓝牙设备
}
} catch (e) {
Logger.error('初始化配对控制器失败: $e');
statusDescription.value = 'initializationFailure'.tr; // 初始化失败
_isBluetoothServiceAvailable.value = false;
} finally {
isLoading.value = false;
}
}
/// 设置设备监听器
void _setupDeviceListeners() {
try {
if (!_isBluetoothServiceAvailable.value) return;
// 监听设备连接事件
_bluetoothService.onDeviceConnected((device) {
Logger.info('检测到蓝牙设备连接: ${device.name}');
// 更新状态并跳转到主页
statusDescription.value =
'${'connectedDevice'.tr} ${device.name}'; // 已连接到设备:
// 立即跳转到主页
_navigateToHome();
});
} catch (e) {
Logger.error('设置设备监听器失败: $e');
}
}
/// 立即跳转到主页
void _navigateToHome() {
Get.offAllNamed(Routes.home);
}
/// 刷新设备
Future<void> refreshConnectedDevices() async {
try {
isLoading.value = true;
statusDescription.value = 'searchingDevice'.tr; // 正在搜索设备...
final hasDevices = await _bluetoothService.refreshConnectedDevices();
if (hasDevices) {
statusDescription.value = 'findConnectedDevice'.tr; // 找到已连接的设备
// 延迟跳转到主页
_autoNavigateToHome();
} else {
// 没有找到设备
statusDescription.value = 'notFound'.tr; // 未找到已连接的蓝牙设备
}
} catch (e) {
Logger.error('刷新设备失败: $e');
statusDescription.value = 'failedRefreshDevice'.tr; // 刷新设备失败
} finally {
isLoading.value = false;
}
}
/// 自动跳转到主页
void _autoNavigateToHome() {
if (_bluetoothService.connectedDevices.isEmpty) return;
Logger.info('已找到连接的设备,自动跳转到主页');
Future.delayed(const Duration(milliseconds: 500), () {
Get.offAllNamed(Routes.home);
});
}
/// 打开系统蓝牙设置
void openBluetoothSettings() {
_bluetoothService.openBluetoothSettings();
}
/// 刷新设备(兼容旧代码)
Future<void> refreshDevices() async {
await refreshConnectedDevices();
}
/// 跳过连接
void skipConnecting() {
Get.offAllNamed(Routes.home);
}
}