|
|
|
@ -10,6 +10,7 @@ import 'package:get_storage/get_storage.dart'; |
|
|
|
import 'package:intl/intl.dart'; |
|
|
|
import 'package:path_provider/path_provider.dart'; |
|
|
|
import 'package:permission_handler/permission_handler.dart'; |
|
|
|
import '../../../data/services/music_manager.dart'; |
|
|
|
import '../../../data/services/volcano_translation_service.dart'; |
|
|
|
import '../../../data/services/tts_service.dart'; |
|
|
|
import '../../../data/services/language_manager.dart'; |
|
|
|
@ -35,6 +36,8 @@ class TranslationController extends GetxController { |
|
|
|
final GetStorage _storage = GetStorage(); |
|
|
|
// 蓝牙服务 |
|
|
|
final bleManager = Get.find<BleManager>(); |
|
|
|
//音乐播放管理 |
|
|
|
final _musiceManager = Get.find<MusicManager>(); |
|
|
|
// 音频输入源 |
|
|
|
bool _audioSourceType = false; |
|
|
|
//是否开启播放 |
|
|
|
@ -58,6 +61,7 @@ class TranslationController extends GetxController { |
|
|
|
|
|
|
|
RxInt activeSpeaker = 0.obs; // 0=无激活, 1=按钮1, 2=按钮2 |
|
|
|
RxInt lastActiveSpeaker = 0.obs; // 上一次状态 |
|
|
|
bool isContinuePlaying = false; // 是否继续播放 |
|
|
|
// 状态变量 |
|
|
|
final isRecognizing = false.obs; |
|
|
|
final isTranslating = false.obs; |
|
|
|
@ -177,7 +181,7 @@ class TranslationController extends GetxController { |
|
|
|
|
|
|
|
// 初始化服务 |
|
|
|
_initServices(); |
|
|
|
|
|
|
|
suspendOtherServices(); |
|
|
|
// 使用微任务在布局完成后自动滚动到底部 |
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) { |
|
|
|
_scrollToBottom(); |
|
|
|
@ -252,6 +256,32 @@ class TranslationController extends GetxController { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 暂停其他服务 |
|
|
|
Future<void> suspendOtherServices() async { |
|
|
|
try { |
|
|
|
var status = await _musiceManager.getStatus(); |
|
|
|
var isPlaying = status['isPlaying'] ?? false; |
|
|
|
|
|
|
|
if (isPlaying == true) { |
|
|
|
isContinuePlaying = true; |
|
|
|
await _musiceManager.pause(); // 暂停音乐 |
|
|
|
} else { |
|
|
|
isContinuePlaying = false; |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
Logger.error('初始化服务失败: ${e.toString()}'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 恢复其他服务 |
|
|
|
Future<void> restoreOtherServices() async { |
|
|
|
try { |
|
|
|
if (isContinuePlaying) await _musiceManager.resume(); // 暂停音乐 |
|
|
|
} catch (e) { |
|
|
|
Logger.error('初始化服务失败: ${e.toString()}'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 初始化服务 |
|
|
|
Future<void> _initServices() async { |
|
|
|
try { |
|
|
|
@ -290,6 +320,7 @@ class TranslationController extends GetxController { |
|
|
|
_voiceInteractionSubscription?.cancel(); |
|
|
|
_translationDebounceTimer?.cancel(); |
|
|
|
scrollController.dispose(); |
|
|
|
restoreOtherServices(); |
|
|
|
super.onClose(); |
|
|
|
} |
|
|
|
|
|
|
|
@ -639,8 +670,7 @@ class TranslationController extends GetxController { |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
Logger.info( |
|
|
|
'未找到匹配的历史项 $sourceText ${timestamp.toIso8601String()}'); |
|
|
|
Logger.info('未找到匹配的历史项 $sourceText ${timestamp.toIso8601String()}'); |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
@ -873,14 +903,14 @@ class TranslationController extends GetxController { |
|
|
|
void saveTranslationHistory() { |
|
|
|
try { |
|
|
|
// 只保存当前内存中的完成态记录,过滤掉中间态记录 |
|
|
|
final List<TranslationItem> finalRecords = translationHistory |
|
|
|
.where((item) => !item.isIntermediate) |
|
|
|
.toList(); |
|
|
|
final List<TranslationItem> finalRecords = |
|
|
|
translationHistory.where((item) => !item.isIntermediate).toList(); |
|
|
|
|
|
|
|
// 应用存储限制,保留最新的1000条完成态记录 |
|
|
|
List<TranslationItem> historyToSave = finalRecords; |
|
|
|
if (finalRecords.length > _maxStorageItems) { |
|
|
|
historyToSave = finalRecords.sublist(finalRecords.length - _maxStorageItems); |
|
|
|
historyToSave = |
|
|
|
finalRecords.sublist(finalRecords.length - _maxStorageItems); |
|
|
|
} |
|
|
|
|
|
|
|
// 保存到本地存储 |
|
|
|
@ -909,7 +939,8 @@ class TranslationController extends GetxController { |
|
|
|
historyList.map((item) => TranslationItem.fromJson(item)).toList(); |
|
|
|
|
|
|
|
for (final item in storedHistory) { |
|
|
|
final id = '${item.sessionId}_${item.timestamp.millisecondsSinceEpoch}'; |
|
|
|
final id = |
|
|
|
'${item.sessionId}_${item.timestamp.millisecondsSinceEpoch}'; |
|
|
|
if (!existingIds.contains(id)) { |
|
|
|
existingIds.add(id); |
|
|
|
result.add(item); |
|
|
|
@ -920,7 +951,8 @@ class TranslationController extends GetxController { |
|
|
|
// 添加当前内存中的完成态记录(排除中间态记录) |
|
|
|
for (final item in translationHistory) { |
|
|
|
if (!item.isIntermediate) { |
|
|
|
final id = '${item.sessionId}_${item.timestamp.millisecondsSinceEpoch}'; |
|
|
|
final id = |
|
|
|
'${item.sessionId}_${item.timestamp.millisecondsSinceEpoch}'; |
|
|
|
if (!existingIds.contains(id)) { |
|
|
|
existingIds.add(id); |
|
|
|
result.add(item); |
|
|
|
@ -974,7 +1006,8 @@ class TranslationController extends GetxController { |
|
|
|
// 3. 刷新UI显示 |
|
|
|
translationHistory.refresh(); |
|
|
|
|
|
|
|
Logger.info('删除会话历史成功: sessionId=$sessionId, 内存删除${removedFromMemory}条, 存储删除${removedFromStorage}条'); |
|
|
|
Logger.info( |
|
|
|
'删除会话历史成功: sessionId=$sessionId, 内存删除${removedFromMemory}条, 存储删除${removedFromStorage}条'); |
|
|
|
} catch (e) { |
|
|
|
Logger.error('删除会话历史失败: ${e.toString()}'); |
|
|
|
rethrow; // 重新抛出异常,让调用方处理 |
|
|
|
@ -988,7 +1021,8 @@ class TranslationController extends GetxController { |
|
|
|
final originalCount = translationHistory.length; |
|
|
|
translationHistory.removeWhere((item) => |
|
|
|
item.sessionId == sessionId && |
|
|
|
item.timestamp.millisecondsSinceEpoch == timestamp.millisecondsSinceEpoch); |
|
|
|
item.timestamp.millisecondsSinceEpoch == |
|
|
|
timestamp.millisecondsSinceEpoch); |
|
|
|
final removedFromMemory = originalCount - translationHistory.length; |
|
|
|
|
|
|
|
// 2. 从本地存储中删除指定的翻译记录 |
|
|
|
@ -1003,7 +1037,8 @@ class TranslationController extends GetxController { |
|
|
|
final originalStoredCount = storedHistory.length; |
|
|
|
storedHistory.removeWhere((item) => |
|
|
|
item.sessionId == sessionId && |
|
|
|
item.timestamp.millisecondsSinceEpoch == timestamp.millisecondsSinceEpoch); |
|
|
|
item.timestamp.millisecondsSinceEpoch == |
|
|
|
timestamp.millisecondsSinceEpoch); |
|
|
|
removedFromStorage = originalStoredCount - storedHistory.length; |
|
|
|
|
|
|
|
// 重新保存更新后的存储数据 |
|
|
|
@ -1015,7 +1050,8 @@ class TranslationController extends GetxController { |
|
|
|
// 3. 刷新UI显示 |
|
|
|
translationHistory.refresh(); |
|
|
|
|
|
|
|
Logger.info('删除单条翻译记录成功: sessionId=$sessionId, timestamp=${timestamp.toIso8601String()}, 内存删除${removedFromMemory}条, 存储删除${removedFromStorage}条'); |
|
|
|
Logger.info( |
|
|
|
'删除单条翻译记录成功: sessionId=$sessionId, timestamp=${timestamp.toIso8601String()}, 内存删除${removedFromMemory}条, 存储删除${removedFromStorage}条'); |
|
|
|
} catch (e) { |
|
|
|
Logger.error('删除单条翻译记录失败: ${e.toString()}'); |
|
|
|
rethrow; // 重新抛出异常,让调用方处理 |
|
|
|
@ -1026,10 +1062,6 @@ class TranslationController extends GetxController { |
|
|
|
void scrollToBottom({bool animate = true}) { |
|
|
|
_scrollToBottom(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// 翻译项模型 |
|
|
|
|