Browse Source

Merge branch 'new_dev' of https://github.com/deepcloud2048/deep_voice into new_dev

weicu
liwei1dao 1 year ago
parent
commit
35c8665000
  1. 2
      android/app/build.gradle.kts
  2. 5
      android/app/src/main/AndroidManifest.xml
  3. 9
      lib/data/services/ble_manager.dart
  4. 4
      lib/data/services/novice_guide_service.dart
  5. 12
      lib/data/services/version_update_service.dart
  6. 2
      lib/modules/explore/views/explore_view.dart
  7. 51
      lib/modules/home/controllers/home_controller.dart
  8. 2
      lib/modules/settings/views/settings_view.dart
  9. 492
      lib/modules/translation/views/translation_stats_view.dart
  10. 4
      lib/routes/app_pages.dart
  11. 6
      local_plugins/ble_service/android/build.gradle.kts
  12. 4
      local_plugins/bytedance_speech/android/build.gradle.kts
  13. 2
      local_plugins/chat_api/android/build.gradle.kts
  14. 4
      local_plugins/chat_storage/android/build.gradle.kts
  15. 2
      local_plugins/classic_bluetooth/android/build.gradle.kts
  16. 4
      local_plugins/jl_opus/android/build.gradle.kts
  17. 2
      local_plugins/open_ai_service/android/build.gradle.kts
  18. 4
      local_plugins/realtime/android/build.gradle.kts
  19. 2
      local_plugins/speech/android/build.gradle.kts

2
android/app/build.gradle.kts

@ -69,7 +69,7 @@ android {
// You can update the following values to match your application needs. // You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config. // For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = 26 // 更新为26以满足ble_service库的要求 minSdk = 26 // 更新为26以满足ble_service库的要求
targetSdk = 34 // 设置为 Android 13 (API 33),以匹配 FOREGROUND_SERVICE_MEDIA_PLAYBACK 权限的要求 targetSdk = 35 // 设置为 Android 15 (API 35),以满足应用市场要求
versionCode = flutter.versionCode // 对应构建号,自动同步flutter构建号 versionCode = flutter.versionCode // 对应构建号,自动同步flutter构建号
versionName = flutter.versionName // 对应版本号,自动同步flutter版本号 versionName = flutter.versionName // 对应版本号,自动同步flutter版本号
} }

5
android/app/src/main/AndroidManifest.xml

@ -9,6 +9,8 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"/>
<!-- Android 14+ 蓝牙设备连接前台服务权限 --> <!-- Android 14+ 蓝牙设备连接前台服务权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE"/>
<!-- Android 15+ 数据同步前台服务权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH"/>
@ -70,6 +72,9 @@
android:enableOnBackInvokedCallback="true" android:enableOnBackInvokedCallback="true"
tools:replace="android:label"> tools:replace="android:label">
<!-- 支持16KB内存页面大小,满足Android 15要求 -->
<property android:name="android.allow_16kb_memory_page" android:value="true" />
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/> <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
<meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/> <meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/>

9
lib/data/services/ble_manager.dart

@ -156,7 +156,7 @@ class BleManager extends GetxService {
/// 设置BLE事件监听 /// 设置BLE事件监听
void _setupBleListener() { void _setupBleListener() {
Logger.info('lxm--_setupBleListener被调用,开始设置BLE事件监听'); //Logger.info('lxm--_setupBleListener被调用,开始设置BLE事件监听');
_statusSubscription?.cancel(); _statusSubscription?.cancel();
_dataSubscription?.cancel(); _dataSubscription?.cancel();
@ -394,6 +394,7 @@ class BleManager extends GetxService {
Logger.info('lxm-- overallBattery: $overallBattery'); Logger.info('lxm-- overallBattery: $overallBattery');
Logger.info('lxm--准备调用_updateDeviceInfoIfNeeded'); Logger.info('lxm--准备调用_updateDeviceInfoIfNeeded');
// 更新设备信息 // 更新设备信息
_updateDeviceInfoIfNeeded( _updateDeviceInfoIfNeeded(
batteryLevel: overallBattery, batteryLevel: overallBattery,
@ -796,12 +797,12 @@ class BleManager extends GetxService {
/// 主动获取电池信息 /// 主动获取电池信息
Future<bool> fetchBatteryInfo() async { Future<bool> fetchBatteryInfo() async {
try { try {
Logger.info('lxm--fetchBatteryInfo被调用,准备向设备发送获取电池信息指令'); //Logger.info('lxm--fetchBatteryInfo被调用,准备向设备发送获取电池信息指令');
final result = await _bleService.getBatteryInfo(); final result = await _bleService.getBatteryInfo();
Logger.info('lxm--getBatteryInfo指令发送结果: $result'); //Logger.info('lxm--getBatteryInfo指令发送结果: $result');
return result; return result;
} catch (e) { } catch (e) {
Logger.error('lxm--获取电池信息失败: ${e.toString()}'); //Logger.error('lxm--获取电池信息失败: ${e.toString()}');
return false; return false;
} }
} }

4
lib/data/services/novice_guide_service.dart

@ -14,8 +14,8 @@ class NoviceGuideService extends GetxService {
final BleService _bleService = BleService(); final BleService _bleService = BleService();
StreamSubscription<dynamic>? _statusSubscription; StreamSubscription<dynamic>? _statusSubscription;
bool isHomeGuide = true; bool isHomeGuide = false;
bool isAIGuide = true; bool isAIGuide = false;
RxBool isWakeup = false.obs; RxBool isWakeup = false.obs;

12
lib/data/services/version_update_service.dart

@ -353,12 +353,12 @@ class VersionUpdateService extends GetxService {
/// 执行更新操作 /// 执行更新操作
Future<bool> performUpdate(VersionUpdateInfo updateInfo) async { Future<bool> performUpdate(VersionUpdateInfo updateInfo) async {
print('lxm---updateInfo详情:'); //print('lxm---updateInfo详情:');
print('lxm---hasUpdate: ${updateInfo.hasUpdate}'); //print('lxm---hasUpdate: ${updateInfo.hasUpdate}');
print('lxm---currentVersion: ${updateInfo.currentVersion}'); //print('lxm---currentVersion: ${updateInfo.currentVersion}');
print('lxm---latestVersion: ${updateInfo.latestVersion}'); //print('lxm---latestVersion: ${updateInfo.latestVersion}');
print('lxm---updateType: ${updateInfo.updateType}'); //print('lxm---updateType: ${updateInfo.updateType}');
print('lxm---appInfo: ${updateInfo.appInfo?.toJson()}'); //print('lxm---appInfo: ${updateInfo.appInfo?.toJson()}');
if (!updateInfo.hasUpdate || updateInfo.appInfo == null) { if (!updateInfo.hasUpdate || updateInfo.appInfo == null) {
return false; return false;
} }

2
lib/modules/explore/views/explore_view.dart

@ -99,7 +99,7 @@ class ExploreView extends GetView<ExploreController> {
Text( Text(
'explore'.tr, // 发现 'explore'.tr, // 发现
style: TextStyle( style: TextStyle(
fontSize: 24.sp, fontSize: 20.sp,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: isDarkMode ? Colors.white : Colors.grey[800], color: isDarkMode ? Colors.white : Colors.grey[800],
), ),

51
lib/modules/home/controllers/home_controller.dart

@ -1,4 +1,5 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
// 移除了dart:async导入,因为不再使用Timer // 移除了dart:async导入,因为不再使用Timer
import '../../../data/services/novice_guide_service.dart'; import '../../../data/services/novice_guide_service.dart';
import '../../../routes/app_routes.dart'; import '../../../routes/app_routes.dart';
@ -20,6 +21,7 @@ enum ConnectionStatus {
class HomeController extends GetxController { class HomeController extends GetxController {
static const String _tag = 'HomeCtrl'; static const String _tag = 'HomeCtrl';
static HomeController get to => Get.find(); static HomeController get to => Get.find();
final GetStorage _storage = GetStorage();
final _isFullyConnected = false.obs; final _isFullyConnected = false.obs;
String? _lastConnectedDeviceName; String? _lastConnectedDeviceName;
@ -46,13 +48,13 @@ class HomeController extends GetxController {
Logger.d(_tag, 'lxm--接收到的DeviceInfo: $newDeviceInfo'); Logger.d(_tag, 'lxm--接收到的DeviceInfo: $newDeviceInfo');
if (newDeviceInfo != null) { if (newDeviceInfo != null) {
Logger.d(_tag, 'lxm--原始数据 - 左耳电量: ${newDeviceInfo.leftEarBattery}'); // Logger.d(_tag, 'lxm--原始数据 - 左耳电量: ${newDeviceInfo.leftEarBattery}');
Logger.d(_tag, 'lxm--原始数据 - 右耳电量: ${newDeviceInfo.rightEarBattery}'); // Logger.d(_tag, 'lxm--原始数据 - 右耳电量: ${newDeviceInfo.rightEarBattery}');
Logger.d(_tag, 'lxm--原始数据 - 充电仓电量: ${newDeviceInfo.caseBattery}'); // Logger.d(_tag, 'lxm--原始数据 - 充电仓电量: ${newDeviceInfo.caseBattery}');
Logger.d(_tag, 'lxm--原始数据 - 左耳充电: ${newDeviceInfo.leftEarCharging}'); // Logger.d(_tag, 'lxm--原始数据 - 左耳充电: ${newDeviceInfo.leftEarCharging}');
Logger.d(_tag, 'lxm--原始数据 - 右耳充电: ${newDeviceInfo.rightEarCharging}'); // Logger.d(_tag, 'lxm--原始数据 - 右耳充电: ${newDeviceInfo.rightEarCharging}');
Logger.d(_tag, 'lxm--原始数据 - 充电仓充电: ${newDeviceInfo.caseCharging}'); // Logger.d(_tag, 'lxm--原始数据 - 充电仓充电: ${newDeviceInfo.caseCharging}');
Logger.d(_tag, 'lxm--原始数据 - 固件版本: ${newDeviceInfo.firmwareVersion}'); // Logger.d(_tag, 'lxm--原始数据 - 固件版本: ${newDeviceInfo.firmwareVersion}');
} else { } else {
Logger.d(_tag, 'lxm--接收到的DeviceInfo为null'); Logger.d(_tag, 'lxm--接收到的DeviceInfo为null');
} }
@ -72,13 +74,13 @@ class HomeController extends GetxController {
caseCharging.value = newDeviceInfo?.caseCharging ?? false; caseCharging.value = newDeviceInfo?.caseCharging ?? false;
firmwareVersion.value = newDeviceInfo?.firmwareVersion ?? ''; firmwareVersion.value = newDeviceInfo?.firmwareVersion ?? '';
Logger.d(_tag, 'lxm--更新后的值 - 左耳电量: ${leftEarBattery.value}'); // Logger.d(_tag, 'lxm--更新后的值 - 左耳电量: ${leftEarBattery.value}');
Logger.d(_tag, 'lxm--更新后的值 - 右耳电量: ${rightEarBattery.value}'); // Logger.d(_tag, 'lxm--更新后的值 - 右耳电量: ${rightEarBattery.value}');
Logger.d(_tag, 'lxm--更新后的值 - 充电仓电量: ${caseBattery.value}'); // Logger.d(_tag, 'lxm--更新后的值 - 充电仓电量: ${caseBattery.value}');
Logger.d(_tag, 'lxm--更新后的值 - 左耳充电: ${leftEarCharging.value}'); // Logger.d(_tag, 'lxm--更新后的值 - 左耳充电: ${leftEarCharging.value}');
Logger.d(_tag, 'lxm--更新后的值 - 右耳充电: ${rightEarCharging.value}'); // Logger.d(_tag, 'lxm--更新后的值 - 右耳充电: ${rightEarCharging.value}');
Logger.d(_tag, 'lxm--更新后的值 - 充电仓充电: ${caseCharging.value}'); // Logger.d(_tag, 'lxm--更新后的值 - 充电仓充电: ${caseCharging.value}');
Logger.d(_tag, 'lxm--更新后的值 - 固件版本: ${firmwareVersion.value}'); // Logger.d(_tag, 'lxm--更新后的值 - 固件版本: ${firmwareVersion.value}');
} }
Worker? _deviceInfoWorker; Worker? _deviceInfoWorker;
@ -140,7 +142,16 @@ class HomeController extends GetxController {
Future<void> refreshDeviceConnection() async { Future<void> refreshDeviceConnection() async {
await _checkConnectionStatus(); await _checkConnectionStatus();
// 移除了立即刷新电池信息的逻辑
// 如果设备已连接,主动刷新设备信息
if (_isFullyConnected.value) {
try {
Logger.d(_tag, '刷新设备信息');
await _bleManager.fetchDeviceInfo();
} catch (e) {
Logger.e(_tag, '刷新设备信息失败: $e');
}
}
} }
void rescanDevices() { void rescanDevices() {
@ -164,6 +175,8 @@ class HomeController extends GetxController {
bool wasConnected = _isFullyConnected.value; bool wasConnected = _isFullyConnected.value;
bool isNowConnected = hasClassicBluetooth && hasBleConnection; bool isNowConnected = hasClassicBluetooth && hasBleConnection;
bool isGuideCompleted = _storage.read('home_guide') ?? false;
if (isNowConnected && currentDevice == null) { if (isNowConnected && currentDevice == null) {
isNowConnected = false; isNowConnected = false;
} }
@ -182,9 +195,11 @@ class HomeController extends GetxController {
// 移除了连接成功后的电池信息刷新 // 移除了连接成功后的电池信息刷新
// 连接成功后检查OTA升级 // 连接成功后检查OTA升级
Future.delayed(const Duration(seconds: 2), () { if (isGuideCompleted) {
_checkOtaUpgrade(); Future.delayed(const Duration(seconds: 2), () {
}); _checkOtaUpgrade();
});
}
} }
// 移除了根据连接状态控制定时器的逻辑 // 移除了根据连接状态控制定时器的逻辑
} }

2
lib/modules/settings/views/settings_view.dart

@ -29,7 +29,7 @@ class SettingsView extends GetView<SettingsController> {
title: Text( title: Text(
'settings'.tr, // 设置 'settings'.tr, // 设置
style: TextStyle( style: TextStyle(
fontSize: 17.sp, fontSize: 18.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: isDarkMode ? Colors.white : Colors.black, color: isDarkMode ? Colors.white : Colors.black,
), ),

492
lib/modules/translation/views/translation_stats_view.dart

@ -24,6 +24,14 @@ class TranslationStatsView extends GetView<TranslationStatsController> {
/// 构建应用栏 /// 构建应用栏
PreferredSizeWidget _buildAppBar(bool isDarkMode) { PreferredSizeWidget _buildAppBar(bool isDarkMode) {
return AppBar( return AppBar(
leading: IconButton(
icon: Icon(
Icons.arrow_back_ios,
color: isDarkMode ? Colors.white : Colors.black,
size: 20.sp,
),
onPressed: () => Get.back(),
),
backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.white, backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.white,
elevation: 0.5, elevation: 0.5,
title: Text( title: Text(
@ -136,20 +144,20 @@ class TranslationStatsView extends GetView<TranslationStatsController> {
], ],
), ),
child: Obx(() => Row( child: Obx(() => Row(
children: [ children: [
_buildTimeRangeTab('今日', 0, isDarkMode), _buildTimeRangeTab('今日', 0, isDarkMode),
_buildTimeRangeTab('本周', 1, isDarkMode), _buildTimeRangeTab('本周', 1, isDarkMode),
_buildTimeRangeTab('本月', 2, isDarkMode), _buildTimeRangeTab('本月', 2, isDarkMode),
_buildTimeRangeTab('历史', 3, isDarkMode), _buildTimeRangeTab('历史', 3, isDarkMode),
], ],
)), )),
); );
} }
/// 构建时间范围标签 /// 构建时间范围标签
Widget _buildTimeRangeTab(String title, int index, bool isDarkMode) { Widget _buildTimeRangeTab(String title, int index, bool isDarkMode) {
final isSelected = controller.selectedTabIndex.value == index; final isSelected = controller.selectedTabIndex.value == index;
return Expanded( return Expanded(
child: GestureDetector( child: GestureDetector(
onTap: () => controller.switchTimeRange(index), onTap: () => controller.switchTimeRange(index),
@ -215,49 +223,50 @@ class TranslationStatsView extends GetView<TranslationStatsController> {
), ),
SizedBox(height: 16.h), SizedBox(height: 16.h),
Obx(() => Row( Obx(() => Row(
children: [ children: [
Expanded( Expanded(
child: _buildStatItem( child: _buildStatItem(
'翻译次数', '翻译次数',
controller.realtimeStats.translationCount.toString(), controller.realtimeStats.translationCount.toString(),
Icons.translate, Icons.translate,
isDarkMode, isDarkMode,
), ),
), ),
Expanded( Expanded(
child: _buildStatItem( child: _buildStatItem(
'会话时长', '会话时长',
'${controller.realtimeStats.sessionDurationMinutes}分钟', '${controller.realtimeStats.sessionDurationMinutes}分钟',
Icons.timer, Icons.timer,
isDarkMode, isDarkMode,
), ),
), ),
], ],
)), )),
SizedBox(height: 12.h), SizedBox(height: 12.h),
Obx(() => Row( Obx(() => Row(
children: [ children: [
Expanded( Expanded(
child: _buildStatItem( child: _buildStatItem(
'字符数', '字符数',
controller.formatNumber( controller.formatNumber(
controller.realtimeStats.sourceCharacters + controller.realtimeStats.sourceCharacters +
controller.realtimeStats.targetCharacters, controller.realtimeStats.targetCharacters,
),
Icons.text_fields,
isDarkMode,
),
), ),
Icons.text_fields, Expanded(
isDarkMode, child: _buildStatItem(
), '录音时长',
), controller.formatDuration(
Expanded( controller.realtimeStats.recordingDuration),
child: _buildStatItem( Icons.mic,
'录音时长', isDarkMode,
controller.formatDuration(controller.realtimeStats.recordingDuration), ),
Icons.mic, ),
isDarkMode, ],
), )),
),
],
)),
], ],
), ),
); );
@ -290,64 +299,68 @@ class TranslationStatsView extends GetView<TranslationStatsController> {
), ),
SizedBox(width: 8.w), SizedBox(width: 8.w),
Obx(() => Text( Obx(() => Text(
'${controller.selectedTimeRange.value}概览', '${controller.selectedTimeRange.value}概览',
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: isDarkMode ? Colors.white : Colors.black, color: isDarkMode ? Colors.white : Colors.black,
), ),
)), )),
], ],
), ),
SizedBox(height: 16.h), SizedBox(height: 16.h),
Obx(() => Row( Obx(() => Row(
children: [ children: [
Expanded( Expanded(
child: _buildStatItem( child: _buildStatItem(
'总调用次数', '总调用次数',
controller.formatNumber(controller.currentStats.totalApiCalls), controller
Icons.api, .formatNumber(controller.currentStats.totalApiCalls),
isDarkMode, Icons.api,
), isDarkMode,
), ),
Expanded( ),
child: _buildStatItem( Expanded(
'预估成本', child: _buildStatItem(
controller.formatCost(controller.currentStats.estimatedCost), '预估成本',
Icons.attach_money, controller
isDarkMode, .formatCost(controller.currentStats.estimatedCost),
), Icons.attach_money,
), isDarkMode,
], ),
)), ),
],
)),
SizedBox(height: 12.h), SizedBox(height: 12.h),
Obx(() => Row( Obx(() => Row(
children: [ children: [
Expanded( Expanded(
child: _buildStatItem( child: _buildStatItem(
'会话数量', '会话数量',
controller.currentStats.sessionCount.toString(), controller.currentStats.sessionCount.toString(),
Icons.chat, Icons.chat,
isDarkMode, isDarkMode,
), ),
), ),
Expanded( Expanded(
child: _buildStatItem( child: _buildStatItem(
'总字符数', '总字符数',
controller.formatNumber(controller.currentStats.totalCharacterCount), controller.formatNumber(
Icons.text_snippet, controller.currentStats.totalCharacterCount),
isDarkMode, Icons.text_snippet,
), isDarkMode,
), ),
], ),
)), ],
)),
], ],
), ),
); );
} }
/// 构建统计项 /// 构建统计项
Widget _buildStatItem(String label, String value, IconData icon, bool isDarkMode) { Widget _buildStatItem(
String label, String value, IconData icon, bool isDarkMode) {
return Column( return Column(
children: [ children: [
Icon( Icon(
@ -414,23 +427,34 @@ class TranslationStatsView extends GetView<TranslationStatsController> {
), ),
SizedBox(height: 16.h), SizedBox(height: 16.h),
Obx(() => Column( Obx(() => Column(
children: [ children: [
_buildApiCallRow('翻译API', controller.currentStats.translationApiCalls, Icons.translate, isDarkMode), _buildApiCallRow(
SizedBox(height: 12.h), '翻译API',
_buildApiCallRow('语音识别', controller.currentStats.asrApiCalls, Icons.mic, isDarkMode), controller.currentStats.translationApiCalls,
SizedBox(height: 12.h), Icons.translate,
_buildApiCallRow('语音合成', controller.currentStats.ttsApiCalls, Icons.volume_up, isDarkMode), isDarkMode),
SizedBox(height: 12.h), SizedBox(height: 12.h),
_buildApiCallRow('AI摘要', controller.currentStats.aiSummaryApiCalls, Icons.summarize, isDarkMode), _buildApiCallRow('语音识别', controller.currentStats.asrApiCalls,
], Icons.mic, isDarkMode),
)), SizedBox(height: 12.h),
_buildApiCallRow('语音合成', controller.currentStats.ttsApiCalls,
Icons.volume_up, isDarkMode),
SizedBox(height: 12.h),
_buildApiCallRow(
'AI摘要',
controller.currentStats.aiSummaryApiCalls,
Icons.summarize,
isDarkMode),
],
)),
], ],
), ),
); );
} }
/// 构建API调用行 /// 构建API调用行
Widget _buildApiCallRow(String label, int count, IconData icon, bool isDarkMode) { Widget _buildApiCallRow(
String label, int count, IconData icon, bool isDarkMode) {
return Row( return Row(
children: [ children: [
Icon( Icon(
@ -498,50 +522,54 @@ class TranslationStatsView extends GetView<TranslationStatsController> {
), ),
SizedBox(height: 16.h), SizedBox(height: 16.h),
Obx(() => Column( Obx(() => Column(
children: [
Row(
children: [
Expanded(
child: _buildStatItem(
'源文本字符',
controller.formatNumber(controller.currentStats.sourceTextCharacters),
Icons.text_fields,
isDarkMode,
),
),
Expanded(
child: _buildStatItem(
'TTS文本字符',
controller.formatNumber(controller.currentStats.ttsTextCharacters),
Icons.translate,
isDarkMode,
),
),
],
),
SizedBox(height: 16.h),
Row(
children: [ children: [
Expanded( Row(
child: _buildStatItem( children: [
'有效音频时长', Expanded(
controller.formatDuration(controller.currentStats.effectiveAudioDuration), child: _buildStatItem(
Icons.mic, '源文本字符',
isDarkMode, controller.formatNumber(
), controller.currentStats.sourceTextCharacters),
Icons.text_fields,
isDarkMode,
),
),
Expanded(
child: _buildStatItem(
'TTS文本字符',
controller.formatNumber(
controller.currentStats.ttsTextCharacters),
Icons.translate,
isDarkMode,
),
),
],
), ),
Expanded( SizedBox(height: 16.h),
child: _buildStatItem( Row(
'总会话时长', children: [
controller.formatDuration(controller.currentStats.totalSessionDuration), Expanded(
Icons.volume_up, child: _buildStatItem(
isDarkMode, '有效音频时长',
), controller.formatDuration(
controller.currentStats.effectiveAudioDuration),
Icons.mic,
isDarkMode,
),
),
Expanded(
child: _buildStatItem(
'总会话时长',
controller.formatDuration(
controller.currentStats.totalSessionDuration),
Icons.volume_up,
isDarkMode,
),
),
],
), ),
], ],
), )),
],
)),
], ],
), ),
); );
@ -585,79 +613,82 @@ class TranslationStatsView extends GetView<TranslationStatsController> {
), ),
SizedBox(height: 16.h), SizedBox(height: 16.h),
Obx(() => Column( Obx(() => Column(
children: [
// 当前成本
Container(
padding: EdgeInsets.all(12.w),
decoration: BoxDecoration(
color: AppColors.primary.withOpacity(0.1),
borderRadius: BorderRadius.circular(8.r),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'${controller.selectedTimeRange.value}预估成本',
style: TextStyle(
fontSize: 14.sp,
fontWeight: FontWeight.w500,
color: isDarkMode ? Colors.white : Colors.black,
),
),
Text(
controller.formatCost(controller.currentStats.estimatedCost),
style: TextStyle(
fontSize: 18.sp,
fontWeight: FontWeight.bold,
color: AppColors.primary,
),
),
],
),
),
SizedBox(height: 12.h),
// 预警阈值
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( // 当前成本
'日成本预警阈值', Container(
style: TextStyle( padding: EdgeInsets.all(12.w),
fontSize: 12.sp, decoration: BoxDecoration(
color: isDarkMode ? Colors.white70 : Colors.black54, color: AppColors.primary.withOpacity(0.1),
borderRadius: BorderRadius.circular(8.r),
), ),
), child: Row(
Text( mainAxisAlignment: MainAxisAlignment.spaceBetween,
controller.formatCost(controller.dailyCostThreshold.value), children: [
style: TextStyle( Text(
fontSize: 12.sp, '${controller.selectedTimeRange.value}预估成本',
color: isDarkMode ? Colors.white70 : Colors.black54, style: TextStyle(
fontSize: 14.sp,
fontWeight: FontWeight.w500,
color: isDarkMode ? Colors.white : Colors.black,
),
),
Text(
controller.formatCost(
controller.currentStats.estimatedCost),
style: TextStyle(
fontSize: 18.sp,
fontWeight: FontWeight.bold,
color: AppColors.primary,
),
),
],
), ),
), ),
], SizedBox(height: 12.h),
), // 预警阈值
SizedBox(height: 4.h), Row(
Row( mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
children: [ Text(
Text( '日成本预警阈值',
'月成本预警阈值', style: TextStyle(
style: TextStyle( fontSize: 12.sp,
fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54,
color: isDarkMode ? Colors.white70 : Colors.black54, ),
), ),
Text(
controller
.formatCost(controller.dailyCostThreshold.value),
style: TextStyle(
fontSize: 12.sp,
color: isDarkMode ? Colors.white70 : Colors.black54,
),
),
],
), ),
Text( SizedBox(height: 4.h),
controller.formatCost(controller.monthlyCostThreshold.value), Row(
style: TextStyle( mainAxisAlignment: MainAxisAlignment.spaceBetween,
fontSize: 12.sp, children: [
color: isDarkMode ? Colors.white70 : Colors.black54, Text(
), '月成本预警阈值',
style: TextStyle(
fontSize: 12.sp,
color: isDarkMode ? Colors.white70 : Colors.black54,
),
),
Text(
controller
.formatCost(controller.monthlyCostThreshold.value),
style: TextStyle(
fontSize: 12.sp,
color: isDarkMode ? Colors.white70 : Colors.black54,
),
),
],
), ),
], ],
), )),
],
)),
], ],
), ),
); );
@ -701,31 +732,32 @@ class TranslationStatsView extends GetView<TranslationStatsController> {
), ),
SizedBox(height: 16.h), SizedBox(height: 16.h),
Obx(() => Column( Obx(() => Column(
children: [ children: [
// 最常用语言对 // 最常用语言对
_buildUsageBehaviorRow( _buildUsageBehaviorRow(
'最常用语言对', '最常用语言对',
controller.currentStats.mostUsedLanguagePair, controller.currentStats.mostUsedLanguagePair,
Icons.language, Icons.language,
isDarkMode, isDarkMode,
), ),
SizedBox(height: 12.h), SizedBox(height: 12.h),
// 最常用翻译模式 // 最常用翻译模式
_buildUsageBehaviorRow( _buildUsageBehaviorRow(
'最常用模式', '最常用模式',
controller.currentStats.mostUsedMode, controller.currentStats.mostUsedMode,
Icons.settings, Icons.settings,
isDarkMode, isDarkMode,
), ),
], ],
)), )),
], ],
), ),
); );
} }
/// 构建使用行为行 /// 构建使用行为行
Widget _buildUsageBehaviorRow(String label, String value, IconData icon, bool isDarkMode) { Widget _buildUsageBehaviorRow(
String label, String value, IconData icon, bool isDarkMode) {
return Row( return Row(
children: [ children: [
Icon( Icon(

4
lib/routes/app_pages.dart

@ -122,6 +122,8 @@ abstract class AppPages {
name: Routes.OTA_UPGRADE, name: Routes.OTA_UPGRADE,
page: () => const OtaUpgradeView(), page: () => const OtaUpgradeView(),
binding: OtaUpgradeBinding(), binding: OtaUpgradeBinding(),
transition: Transition.rightToLeft,
transitionDuration: Duration(milliseconds: 250),
), ),
// GetPage( // GetPage(
// name: Routes.profile, // name: Routes.profile,
@ -273,6 +275,8 @@ abstract class AppPages {
name: Routes.devices, name: Routes.devices,
page: () => const DevicesView(), page: () => const DevicesView(),
binding: DevicesBinding(), binding: DevicesBinding(),
transition: Transition.rightToLeft,
transitionDuration: Duration(milliseconds: 250),
), ),
GetPage( GetPage(
name: Routes.ble, name: Routes.ble,

6
local_plugins/ble_service/android/build.gradle.kts

@ -9,11 +9,11 @@ plugins {
android { android {
namespace = "com.yunqiinnovation.ble_service" namespace = "com.yunqiinnovation.ble_service"
compileSdk = 34 compileSdk = 35
defaultConfig { defaultConfig {
minSdk = 26 minSdk = 26
targetSdk = 34 targetSdk = 35
} }
compileOptions { compileOptions {
@ -31,4 +31,4 @@ dependencies {
// 使用从本地Maven仓库引用的AAR依赖 // 使用从本地Maven仓库引用的AAR依赖
implementation("com.jieli.audio:jl_audio_decode:2.0.0") implementation("com.jieli.audio:jl_audio_decode:2.0.0")
implementation("com.jieli.jl_bt_ota:jl_bt_ota:1.9.2") implementation("com.jieli.jl_bt_ota:jl_bt_ota:1.9.2")
} }

4
local_plugins/bytedance_speech/android/build.gradle.kts

@ -29,7 +29,7 @@ android {
defaultConfig { defaultConfig {
minSdk = 26 minSdk = 26
targetSdk = 34 targetSdk = 35
} }
compileOptions { compileOptions {
@ -53,4 +53,4 @@ dependencies {
implementation(project(":speech")) implementation(project(":speech"))
} }

2
local_plugins/chat_api/android/build.gradle.kts

@ -10,7 +10,7 @@ android {
defaultConfig { defaultConfig {
minSdk = 21 minSdk = 21
targetSdk = 33 targetSdk = 35
} }
compileOptions { compileOptions {

4
local_plugins/chat_storage/android/build.gradle.kts

@ -11,12 +11,12 @@ android {
namespace = "com.yunqiinnovation.chat_storage" namespace = "com.yunqiinnovation.chat_storage"
// 目标 SDK 版本 // 目标 SDK 版本
compileSdk = 33 compileSdk = 35
defaultConfig { defaultConfig {
// 最低 SDK 版本 // 最低 SDK 版本
minSdk = 21 minSdk = 21
targetSdk = 33 targetSdk = 35
} }
// Java 语言级别兼容配置 // Java 语言级别兼容配置

2
local_plugins/classic_bluetooth/android/build.gradle.kts

@ -16,7 +16,7 @@ android {
defaultConfig { defaultConfig {
// 最低 SDK 版本 // 最低 SDK 版本
minSdk = 21 minSdk = 21
targetSdk = 33 targetSdk = 35
} }
// Java 语言级别兼容配置 // Java 语言级别兼容配置

4
local_plugins/jl_opus/android/build.gradle.kts

@ -18,12 +18,12 @@ android {
namespace = "com.yunqiinnovation.jl_opus" namespace = "com.yunqiinnovation.jl_opus"
// 目标 SDK 版本 // 目标 SDK 版本
compileSdk = 33 compileSdk = 35
defaultConfig { defaultConfig {
// 最低 SDK 版本 // 最低 SDK 版本
minSdk = 21 minSdk = 21
targetSdk = 33 targetSdk = 35
} }
// Java 语言级别兼容配置 // Java 语言级别兼容配置

2
local_plugins/open_ai_service/android/build.gradle.kts

@ -17,7 +17,7 @@ android {
defaultConfig { defaultConfig {
// 最低 SDK 版本 // 最低 SDK 版本
minSdk = 21 minSdk = 21
targetSdk = 33 targetSdk = 35
} }
// Java 语言级别兼容配置 // Java 语言级别兼容配置

4
local_plugins/realtime/android/build.gradle.kts

@ -10,7 +10,7 @@ android {
defaultConfig { defaultConfig {
minSdk = 21 minSdk = 21
targetSdk = 33 targetSdk = 35
} }
compileOptions { compileOptions {
@ -44,4 +44,4 @@ dependencies {
// OkHttp for WebSocket // OkHttp for WebSocket
implementation(platform("com.squareup.okhttp3:okhttp-bom:4.12.0")) implementation(platform("com.squareup.okhttp3:okhttp-bom:4.12.0"))
implementation("com.squareup.okhttp3:okhttp") implementation("com.squareup.okhttp3:okhttp")
} }

2
local_plugins/speech/android/build.gradle.kts

@ -17,7 +17,7 @@ android {
defaultConfig { defaultConfig {
// 最低 SDK 版本 // 最低 SDK 版本
minSdk = 21 minSdk = 21
targetSdk = 33 targetSdk = 35
} }
// Java 语言级别兼容配置 // Java 语言级别兼容配置

Loading…
Cancel
Save