|
|
|
@ -1,6 +1,11 @@ |
|
|
|
import 'dart:async'; |
|
|
|
|
|
|
|
import 'package:flutter/material.dart'; |
|
|
|
import 'package:agent_service/agent_service.dart'; |
|
|
|
import 'package:get/get.dart'; |
|
|
|
import 'package:get_storage/get_storage.dart'; |
|
|
|
import '../../modules/meeting/controllers/meeting_record_controller.dart'; |
|
|
|
import '../../routes/app_routes.dart'; |
|
|
|
import 'logger.dart'; |
|
|
|
import '../translations/app_translations.dart'; |
|
|
|
//import '../../modules/settings/controllers/settings_controller.dart'; |
|
|
|
@ -23,17 +28,19 @@ class AppLifecycleManager extends GetxService with WidgetsBindingObserver { |
|
|
|
final RxBool _isInForeground = true.obs; |
|
|
|
bool get isInForeground => _isInForeground.value; |
|
|
|
|
|
|
|
bool? _lastCanWakeUp; |
|
|
|
|
|
|
|
@override |
|
|
|
void onInit() { |
|
|
|
super.onInit(); |
|
|
|
// 注册应用生命周期观察者 |
|
|
|
WidgetsBinding.instance.addObserver(this); |
|
|
|
Logger.info('AppLifecycleManager 已初始化'); |
|
|
|
unawaited(refreshBleWakeupPolicy()); |
|
|
|
} |
|
|
|
|
|
|
|
@override |
|
|
|
void didChangeAppLifecycleState(AppLifecycleState state) { |
|
|
|
final previousState = _appLifecycleState.value; |
|
|
|
_appLifecycleState.value = state; |
|
|
|
_lifecycleStateStream.value = state; |
|
|
|
|
|
|
|
@ -44,6 +51,7 @@ class AppLifecycleManager extends GetxService with WidgetsBindingObserver { |
|
|
|
case AppLifecycleState.resumed: |
|
|
|
_isInForeground.value = true; |
|
|
|
_handleAppResumed(); |
|
|
|
unawaited(refreshBleWakeupPolicy()); |
|
|
|
break; |
|
|
|
case AppLifecycleState.paused: |
|
|
|
case AppLifecycleState.inactive: |
|
|
|
@ -56,6 +64,48 @@ class AppLifecycleManager extends GetxService with WidgetsBindingObserver { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Future<void> refreshBleWakeupPolicy({String? route}) async { |
|
|
|
final currentRoute = route ?? Get.currentRoute; |
|
|
|
|
|
|
|
final bool hasMeetingRecordingTask = _hasMeetingRecordingTask(); |
|
|
|
final bool shouldDisableWakeup = hasMeetingRecordingTask || |
|
|
|
_isMeetingRoute(currentRoute) || |
|
|
|
_isTranslationRoute(currentRoute); |
|
|
|
|
|
|
|
final bool canWakeUp = !shouldDisableWakeup; |
|
|
|
if (_lastCanWakeUp == canWakeUp) return; |
|
|
|
_lastCanWakeUp = canWakeUp; |
|
|
|
|
|
|
|
try { |
|
|
|
Logger.info('lxm---设置是否可以ble唤醒agent: $canWakeUp'); |
|
|
|
await AgentService.setCanWakeUp(canWakeUp); |
|
|
|
} catch (e) { |
|
|
|
Logger.warning('setCanWakeUp失败: $e'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
bool _isMeetingRoute(String route) { |
|
|
|
if (route.isEmpty) return false; |
|
|
|
if (route == Routes.profileMeeting) return true; |
|
|
|
return route == Routes.meeting || route.startsWith('${Routes.meeting}/'); |
|
|
|
} |
|
|
|
|
|
|
|
bool _isTranslationRoute(String route) { |
|
|
|
if (route.isEmpty) return false; |
|
|
|
if (route == Routes.translationMiddleware) return true; |
|
|
|
if (route == Routes.pictureTranslation) return true; |
|
|
|
if (route == Routes.textTranslation) return true; |
|
|
|
return route == Routes.translation || |
|
|
|
route.startsWith('${Routes.translation}/'); |
|
|
|
} |
|
|
|
|
|
|
|
bool _hasMeetingRecordingTask() { |
|
|
|
if (!Get.isRegistered<MeetingRecordController>()) return false; |
|
|
|
final mrc = Get.find<MeetingRecordController>(); |
|
|
|
return mrc.isRecording.value || |
|
|
|
mrc.timerStatus.value != TimerStatus.stopped; |
|
|
|
} |
|
|
|
|
|
|
|
/// 处理应用进入前台 |
|
|
|
void _handleAppResumed() { |
|
|
|
// Logger.info('应用进入前台'); |
|
|
|
|