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.

169 lines
5.5 KiB

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<dynamic>? _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();
}
}