import 'dart:async'; import 'dart:io'; import 'package:ble_service/ble_service.dart'; import 'package:flutter_intro/flutter_intro.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:permission_handler/permission_handler.dart'; import '../../core/utils/permission_util.dart'; class NoviceGuideService extends GetxService { final GetStorage _storage = GetStorage(); final BleService _bleService = BleService(); StreamSubscription? _statusSubscription; bool isHomeGuide = false; //false代表未完成新手引导,true代表已经完成 bool isAIGuide = false; RxBool isWakeup = false.obs; int aiStep = 0; List aiStepsList = [ { 'startKey': 'guideWeatherStart', 'inputKey': 'guideWeatherInput', 'sendKey': 'guideWeatherSend', 'endKey': 'guideWeatherEnd', 'method': () async { // 天气查询需要位置权限 await PermissionUtil.instance.requestPermission( permissionType: Permission.location, permissionName: 'locationInfo'.tr, // 位置信息 explanationText: 'locationPermissionDesc'.tr, // 用于获取当前位置信息 permanentDenialText: 'locationPermissionDetailDesc'.tr, // 获取位置信息需要位置权限 ); }, }, { 'startKey': 'guideMusicStart', 'inputKey': 'guideMusicInput', 'sendKey': 'guideMusicSend', 'endKey': 'guideMusicEnd', 'method': () async {}, }, { 'startKey': 'guideNavStart', 'inputKey': 'guideNavInput', 'sendKey': 'guideNavSend', 'endKey': 'guideNavEnd', 'method': () async { // 导航功能需要位置权限 await PermissionUtil.instance.requestPermission( permissionType: Permission.location, permissionName: 'locationInfo'.tr, // 位置信息 explanationText: 'locationPermissionDesc'.tr, // 用于获取当前位置信息 permanentDenialText: 'locationPermissionDetailDesc'.tr, // 获取位置信息需要位置权限 ); }, }, { 'startKey': 'guideMeetingStart', 'inputKey': 'guideMeetingInput', 'sendKey': 'guideMeetingSend', 'endKey': 'guideMeetingEnd', 'method': () async { //创建会议提醒需要日历权限 await PermissionUtil.instance.requestPermission( permissionType: Permission.calendarFullAccess, permissionName: 'calendarFullAccess'.tr, // 日历写入 explanationText: 'calendarFullAccessPermissionDesc'.tr, // 用于创建日历事件和提醒 permanentDenialText: 'calendarFullAccessPermissionDetailDesc'.tr, // 创建日历事件需要日历写入权限 ); }, }, { 'startKey': 'guidePhoneStart', 'inputKey': 'guidePhoneInput', 'sendKey': 'guidePhoneSend', 'endKey': 'guidePhoneEnd', 'method': () async { if (Platform.isAndroid) { // 拨打电话需要电话权限 await PermissionUtil.instance.requestPermission( permissionType: Permission.phone, permissionName: 'phone'.tr, // 电话 explanationText: 'phonePermissionDesc'.tr, // 用于拨打电话功能 permanentDenialText: 'phonePermissionDetailDesc'.tr, // 拨打电话功能需要电话权限 ); //拨打电话还需要联系人权限 await PermissionUtil.instance.requestPermission( permissionType: Permission.contacts, permissionName: 'contacts'.tr, // 联系人 explanationText: 'contactsPermissionDesc'.tr, // 用于访问联系人信息 permanentDenialText: 'contactsPermissionDetailDesc'.tr, // 拨打电话功能需要联系人权限 ); } }, }, { 'startKey': 'guideSmsStart', 'inputKey': 'guideSmsInput', 'sendKey': 'guideSmsSend', 'endKey': 'guideSmsEnd', 'method': () async { if (Platform.isAndroid) { //发送短信还需要联系人权限 await PermissionUtil.instance.requestPermission( permissionType: Permission.contacts, permissionName: 'contacts'.tr, // 联系人 explanationText: 'contactsPermissionDesc'.tr, // 用于访问联系人信息 permanentDenialText: 'contactsPermissionDetailDesc'.tr, // 发送短信功能需要联系人权限 ); } }, }, ]; @override void onInit() { super.onInit(); isHomeGuide = _storage.read('home_guide') ?? false; isAIGuide = _storage.read('ai_guide') ?? false; } @override void onClose() { closeWakeupListen(); super.onClose(); } void startHomeGuide() async { if (!isHomeGuide) { await Future.delayed(const Duration(milliseconds: 200)); isHomeGuide = true; _storage.write('home_guide', true); Intro.of(Get.context!).start(group: 'home'); } } void startAIGuide() async { if (!isAIGuide) { await Future.delayed(const Duration(milliseconds: 300)); isAIGuide = true; _storage.write('ai_guide', true); Intro.of(Get.context!).start(group: 'ai'); } } void startWakeupListen() { _bleService.setWakeup(false); _statusSubscription = _bleService.onStatusUpdated.listen((event) { if (event is Map && event['type'] == 'wakeup') { isWakeup.value = true; } }); } void closeWakeupListen() { _bleService.setWakeup(true); _statusSubscription?.cancel(); } }