diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index b3515294f..6ee5dc1dd 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -1651,6 +1651,13 @@ class ChatController extends State showEmojiPicker = false; }); } + + void setSelectedEvent(Event event) { + setState(() { + selectedEvents.clear(); + selectedEvents.add(event); + }); + } // Pangea# void clearSingleSelectedEvent() { diff --git a/lib/pangea/toolbar/controllers/tts_controller.dart b/lib/pangea/toolbar/controllers/tts_controller.dart index 32e575ae1..80ae1a080 100644 --- a/lib/pangea/toolbar/controllers/tts_controller.dart +++ b/lib/pangea/toolbar/controllers/tts_controller.dart @@ -35,7 +35,7 @@ class TtsController { static final StreamController loadingChoreoStream = StreamController.broadcast(); - static final audioPlayer = AudioPlayer(); + static AudioPlayer? audioPlayer; static bool get _useAlternativeTTS { return PlatformInfos.isWindows; @@ -122,7 +122,7 @@ class TtsController { // https://pub.dev/packages/flutter_tts final result = await (_useAlternativeTTS ? _alternativeTTS.stop() : _tts.stop()); - audioPlayer.stop(); + audioPlayer?.stop(); if (!_useAlternativeTTS && result != 1) { ErrorHandler.logError( @@ -173,8 +173,6 @@ class TtsController { onStart: onStart, onStop: onStop, ); - - onStop?.call(); } /// A safer version of speak, that handles the case of @@ -314,13 +312,15 @@ class TtsController { try { Logs().i('Speaking from choreo: $text, langCode: $langCode'); final audioContent = base64Decode(ttsRes.audioContent); - await audioPlayer.setAudioSource( + audioPlayer?.dispose(); + audioPlayer = AudioPlayer(); + await audioPlayer!.setAudioSource( BytesAudioSource( audioContent, ttsRes.mimeType, ), ); - await audioPlayer.play(); + await audioPlayer!.play(); } catch (e, s) { ErrorHandler.logError( e: 'Error playing audio', @@ -330,6 +330,9 @@ class TtsController { 'text': text, }, ); + } finally { + audioPlayer?.dispose(); + audioPlayer = null; } } diff --git a/lib/pangea/toolbar/widgets/message_selection_overlay.dart b/lib/pangea/toolbar/widgets/message_selection_overlay.dart index 08a756476..cdacaa4bb 100644 --- a/lib/pangea/toolbar/widgets/message_selection_overlay.dart +++ b/lib/pangea/toolbar/widgets/message_selection_overlay.dart @@ -109,8 +109,19 @@ class MessageOverlayController extends State @override void initState() { - initializeTokensAndMode(); super.initState(); + initializeTokensAndMode(); + WidgetsBinding.instance.addPostFrameCallback( + (_) => widget.chatController.setSelectedEvent(event), + ); + } + + @override + void dispose() { + WidgetsBinding.instance.addPostFrameCallback( + (_) => widget.chatController.clearSelectedEvents(), + ); + super.dispose(); } Future initializeTokensAndMode() async { diff --git a/lib/pangea/toolbar/widgets/overlay_header.dart b/lib/pangea/toolbar/widgets/overlay_header.dart index ff85e6b0b..a13e1c2a4 100644 --- a/lib/pangea/toolbar/widgets/overlay_header.dart +++ b/lib/pangea/toolbar/widgets/overlay_header.dart @@ -36,9 +36,10 @@ class OverlayHeaderState extends State { Widget build(BuildContext context) { final l10n = L10n.of(context); final theme = Theme.of(context); - final pinned = controller.room.pinnedEventIds.contains( - controller.selectedEvents.first.eventId, - ); + final pinned = controller.selectedEvents.length == 1 && + controller.room.pinnedEventIds.contains( + controller.selectedEvents.first.eventId, + ); return Container( padding: const EdgeInsets.symmetric(horizontal: 10), decoration: BoxDecoration(