diff --git a/GoogleService-Info.plist b/GoogleService-Info.plist index c90ada3a3..590c85a5f 100644 --- a/GoogleService-Info.plist +++ b/GoogleService-Info.plist @@ -3,9 +3,9 @@ CLIENT_ID - 907754492821-oc9e77svgmmlgouo0op7vv00e1hb8278.apps.googleusercontent.com + 907754492821-tl2blr39g82re40sttkve36ovt6qcu6c.apps.googleusercontent.com REVERSED_CLIENT_ID - com.googleusercontent.apps.907754492821-oc9e77svgmmlgouo0op7vv00e1hb8278 + com.googleusercontent.apps.907754492821-tl2blr39g82re40sttkve36ovt6qcu6c ANDROID_CLIENT_ID 907754492821-9jakqvathu61e6b8g95i41ssi7o4dnka.apps.googleusercontent.com API_KEY @@ -15,7 +15,7 @@ PLIST_VERSION 1 BUNDLE_ID - com.yunqiinnovation.deepsound + com.chuangxiangyunqi.deapsound PROJECT_ID deepsound-e0e3d STORAGE_BUCKET @@ -31,6 +31,6 @@ IS_SIGNIN_ENABLED GOOGLE_APP_ID - 1:907754492821:ios:246794fc44b23174145c9c + 1:907754492821:ios:e4b4f3b37e58a7d1145c9c \ No newline at end of file diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index 3ee98f3a1..10cf3dfc0 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -106,7 +106,7 @@ class MeetingDetailsController extends GetxController final GetStorage storage = GetStorage(); Map userInfo = storage.read("user_info"); _userId = userInfo['user']['uid']; - _systemPrompt = AppConfig.agentsystemPrompt("personal_assistant") ?? ''; + _systemPrompt = AppConfig.agentsystemPrompt("meet_ assistant") ?? ''; } void _getDataDetails() async { @@ -335,7 +335,9 @@ class MeetingDetailsController extends GetxController if (element['additions'].isNotEmpty) { speaker = 'Speaker ${element['additions']['speaker']}'; text += '$speaker:'; - personnel += '[$speaker] '; + if (!personnel.contains(speaker)) { + personnel += '[$speaker] '; + } } list.add({ 'meetingid': id, @@ -357,4 +359,4 @@ class MeetingDetailsController extends GetxController } allText = text; } -} \ No newline at end of file +} diff --git a/lib/modules/meeting/views/meeting_details_view.dart b/lib/modules/meeting/views/meeting_details_view.dart index 4e974e27d..d1b2ec7a5 100644 --- a/lib/modules/meeting/views/meeting_details_view.dart +++ b/lib/modules/meeting/views/meeting_details_view.dart @@ -22,139 +22,7 @@ class MeetingDetailsView extends GetView { () => Scaffold( backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], appBar: _buildAppBar(isDarkMode), - body: NestedScrollView( - controller: controller.scrollController, - headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { - return [ - SliverAppBar( - automaticallyImplyLeading: false, - expandedHeight: 210.w, - backgroundColor: Colors.transparent, - flexibleSpace: FlexibleSpaceBar( - collapseMode: CollapseMode.pin, - background: Align( - alignment: Alignment.topCenter, - child: Container( - height: 200.w, - decoration: BoxDecoration( - color: Colors.grey[200]!, - borderRadius: BorderRadius.vertical( - bottom: Radius.circular(20.r), - ), - ), - child: Column( - children: [ - Container( - margin: EdgeInsets.only(bottom: 5.w), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8.r), - ), - child: AudioFileWaveforms( - size: Size(350.w, 120.w), - playerController: controller.playerController, - playerWaveStyle: PlayerWaveStyle( - fixedWaveColor: Colors.grey[300]!, - liveWaveColor: Colors.red, - seekLineColor: Colors.red, - scaleFactor: 600, - ), - ), - ), - SizedBox( - width: 350.w, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - StreamBuilder( - stream: controller.playerController - .onCurrentDurationChanged, - builder: (context, snapshot) { - final position = snapshot.data ?? 0; - return Text( - DateUtil.formatDateMs( - position, - format: 'HH:mm:ss', - isUtc: true, - ), - style: TextStyle( - color: isDarkMode - ? Colors.grey[400] - : Colors.grey[500], - fontSize: 12.sp, - ), - ); - }, - ), - Obx( - () => Text( - DateUtil.formatDateMs( - controller.durationMax.value, - format: 'HH:mm:ss', - isUtc: true, - ), - style: TextStyle( - color: isDarkMode - ? Colors.grey[400] - : Colors.grey[500], - fontSize: 12.sp, - ), - ), - ), - ], - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Icon( - Icons.replay_10, - color: Colors.black, - size: 30.w, - ), - StreamBuilder( - stream: controller - .playerController.onPlayerStateChanged, - builder: (context, snapshot) { - bool isPlay = - snapshot.data?.isPlaying ?? false; - return GestureDetector( - onTap: () { - if (isPlay) { - controller.playerController - .pausePlayer(); - } else { - controller.playerController - .startPlayer(); - } - }, - child: Icon( - isPlay - ? Icons.pause_circle - : Icons.play_circle, - color: Colors.black, - size: 48.w, - ), - ); - }, - ), - Icon( - Icons.forward_10, - color: Colors.black, - size: 30.w, - ), - ], - ), - ], - ), - ), - ), - ), - ), - ]; - }, - body: _buildBody(context, isDarkMode), - ), + body: _buildBody(context, isDarkMode), ), ); } @@ -295,6 +163,7 @@ class MeetingDetailsView extends GetView { Widget _buildBody(BuildContext context, bool isDarkMode) { return Column( children: [ + _soundWave(isDarkMode), Container( padding: EdgeInsets.symmetric(horizontal: 8.w), margin: EdgeInsets.symmetric(vertical: 10.w), @@ -328,6 +197,113 @@ class MeetingDetailsView extends GetView { ); } + Widget _soundWave(bool isDarkMode) { + return Container( + height: 200.w, + margin: EdgeInsets.only(bottom: 10.w), + decoration: BoxDecoration( + color: Colors.grey[200]!, + borderRadius: BorderRadius.vertical( + bottom: Radius.circular(20.r), + ), + ), + child: Column( + children: [ + Container( + margin: EdgeInsets.only(bottom: 5.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.r), + ), + child: AudioFileWaveforms( + size: Size(350.w, 120.w), + playerController: controller.playerController, + playerWaveStyle: PlayerWaveStyle( + fixedWaveColor: Colors.grey[300]!, + liveWaveColor: Colors.red, + seekLineColor: Colors.red, + scaleFactor: 600, + ), + ), + ), + SizedBox( + width: 350.w, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + StreamBuilder( + stream: controller.playerController.onCurrentDurationChanged, + builder: (context, snapshot) { + final position = snapshot.data ?? 0; + return Text( + DateUtil.formatDateMs( + position, + format: 'HH:mm:ss', + isUtc: true, + ), + style: TextStyle( + color: isDarkMode ? Colors.grey[400] : Colors.grey[500], + fontSize: 12.sp, + ), + ); + }, + ), + Obx( + () => Text( + DateUtil.formatDateMs( + controller.durationMax.value, + format: 'HH:mm:ss', + isUtc: true, + ), + style: TextStyle( + color: isDarkMode ? Colors.grey[400] : Colors.grey[500], + fontSize: 12.sp, + ), + ), + ), + ], + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Icon( + Icons.replay_10, + color: Colors.black, + size: 30.w, + ), + StreamBuilder( + stream: controller.playerController.onPlayerStateChanged, + builder: (context, snapshot) { + bool isPlay = snapshot.data?.isPlaying ?? false; + return GestureDetector( + onTap: () { + if (isPlay) { + controller.playerController.pausePlayer(); + } else { + controller.playerController.startPlayer(); + } + }, + child: Icon( + isPlay ? Icons.pause_circle : Icons.play_circle, + color: Colors.black, + size: 48.w, + ), + ); + }, + ), + Icon( + Icons.forward_10, + color: Colors.black, + size: 30.w, + ), + ], + ), + ], + ), + ); + } + Widget _iconItem(IconData icon, String title, int index) { bool isActive = controller.currentIndex.value == index; diff --git a/lib/modules/meeting/views/mind_map_tab.dart b/lib/modules/meeting/views/mind_map_tab.dart index a4e783ba9..51de6ccdb 100644 --- a/lib/modules/meeting/views/mind_map_tab.dart +++ b/lib/modules/meeting/views/mind_map_tab.dart @@ -1,12 +1,98 @@ import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:webview_flutter/webview_flutter.dart'; -class MindMapTab extends StatelessWidget { +import '../controllers/meeting_details_controller.dart'; + +class MindMapTab extends StatefulWidget { const MindMapTab({super.key}); + @override + State createState() => _MindMapTabState(); +} + +class _MindMapTabState extends State { + late final WebViewController _controller; + final _meetingDetailsController = Get.find(); + + @override + void initState() { + super.initState(); + String html = ''' + + + + + + + MindMap + + + + + + +
+ +
+ + + + '''; + _controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..loadHtmlString(html); + } + @override Widget build(BuildContext context) { - return SingleChildScrollView( - child: Text(''), + return WebViewWidget( + controller: _controller, ); } } diff --git a/local_plugins/agent_service/android/build.gradle.kts b/local_plugins/agent_service/android/build.gradle.kts index 2a67d0ba0..79cb9fcde 100644 --- a/local_plugins/agent_service/android/build.gradle.kts +++ b/local_plugins/agent_service/android/build.gradle.kts @@ -47,6 +47,6 @@ dependencies { add("compileOnly", project(":chat_storage")) add("compileOnly", project(":ble_service")) add("compileOnly", project(":music_service")) - add("compileOnly", project(":amap_service")) + // add("compileOnly", project(":amap_service")) add("compileOnly", project(":speech")) } \ No newline at end of file diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index bda9b148b..a3ef740d6 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -7,7 +7,6 @@ import com.yunqiinnovation.azure_speech.AzureAsrHelper import com.yunqiinnovation.open_ai_service.OpenAIService import com.yunqiinnovation.chat_storage.ChatStorageHelper import com.yunqiinnovation.music_service.MusicServiceStarter -import com.yunqiinnovation.amap_service.NavigationServiceStarter import android.util.Log import io.flutter.plugin.common.MethodChannel import kotlinx.coroutines.* @@ -1191,7 +1190,7 @@ object AgentService : CoroutineScope { // 如果 playlist 中有有效的歌曲,开始播放 if (!start.isNullOrEmpty() && !end.isNullOrEmpty()) { Log.i(TAG, "启动导航服务 ${start} ${end}") - NavigationServiceStarter.startServiceWithCommand(context, command = "start", startpos = start, endpos = end) + // NavigationServiceStarter.startServiceWithCommand(context, command = "start", startpos = start, endpos = end) } else { Log.i(TAG, "启动导航服务失败") } diff --git a/pubspec.yaml b/pubspec.yaml index 3fe578180..7a8bbb5c2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,7 +31,7 @@ dependencies: logger: ^2.0.2+1 flutter_blue_plus: ^1.31.16 just_audio: ^0.9.36 - webview_flutter: ^4.10.0 + webview_flutter: ^4.12.0 flutter_easyloading: ^3.0.5 package_info_plus: ^8.3.0 file_picker: ^10.1.5 @@ -65,8 +65,8 @@ dependencies: dio: ^5.8.0+1 sqflite: ^2.4.2 path: ^1.9.1 -# azure_speech: -# path: local_plugins/azure_speech + azure_speech: + path: local_plugins/azure_speech open_ai_service: path: local_plugins/open_ai_service chat_storage: