From f7d8a098453a8a3d5edcec9165a9dff063915851 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Tue, 10 Jun 2025 14:37:59 -0400 Subject: [PATCH] show overlay and play maudio with one click --- lib/pages/chat/events/audio_player.dart | 31 ++++++++++--------- lib/pages/chat/events/message_content.dart | 9 ++++++ .../practice_match_card.dart | 1 - .../toolbar/widgets/message_audio_card.dart | 3 -- .../widgets/message_selection_overlay.dart | 7 ----- .../widgets/message_selection_positioner.dart | 3 ++ .../multiple_choice_activity.dart | 4 +-- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index 9dae24462..9a82dce86 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -22,7 +22,7 @@ import 'package:fluffychat/utils/file_description.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; import 'package:fluffychat/utils/url_launcher.dart'; -import '../../../widgets/fluffy_chat_app.dart'; +import 'package:fluffychat/widgets/fluffy_chat_app.dart'; import '../../../widgets/matrix.dart'; class AudioPlayerWidget extends StatefulWidget { @@ -36,9 +36,10 @@ class AudioPlayerWidget extends StatefulWidget { final String roomId; final String senderId; final PangeaAudioFile? matrixFile; - final Function(bool)? setIsPlayingAudio; final ChatController chatController; final MessageOverlayController? overlayController; + final VoidCallback? onPlay; + final bool autoplay; // Pangea# static const int wavesCount = 40; @@ -53,9 +54,10 @@ class AudioPlayerWidget extends StatefulWidget { required this.roomId, required this.senderId, this.matrixFile, - this.setIsPlayingAudio, required this.chatController, this.overlayController, + this.onPlay, + this.autoplay = false, // Pangea# super.key, }); @@ -76,9 +78,7 @@ class AudioPlayerState extends State { String? _durationString; // #Pangea - StreamSubscription? _onShowToolbar; StreamSubscription? _onAudioPositionChanged; - StreamSubscription? _onPlayerStateChanged; // Pangea# @override @@ -163,9 +163,7 @@ class AudioPlayerState extends State { audioPlayer.dispose(); matrix.voiceMessageEventId.value = matrix.audioPlayer = null; // #Pangea - _onShowToolbar?.cancel(); _onAudioPositionChanged?.cancel(); - _onPlayerStateChanged?.cancel(); // Pangea# } } @@ -253,6 +251,8 @@ class AudioPlayerState extends State { // #Pangea // if (matrix.voiceMessageEventId.value != widget.event.eventId) return; if (matrix.voiceMessageEventId.value != widget.eventId) return; + + matrix.audioPlayer?.dispose(); // Pangea# final audioPlayer = matrix.audioPlayer = AudioPlayer(); @@ -269,13 +269,6 @@ class AudioPlayerState extends State { ); } }); - - _onPlayerStateChanged?.cancel(); - _onPlayerStateChanged = audioPlayer.playingStream.listen( - (isPlaying) => setState(() { - widget.setIsPlayingAudio?.call(isPlaying); - }), - ); // Pangea# // #Pangea @@ -394,6 +387,10 @@ class AudioPlayerState extends State { final duration = Duration(milliseconds: durationInt); _durationString = duration.minuteSecondString; } + + // #Pangea + if (widget.autoplay) _onButtonTap(); + // Pangea# } @override @@ -465,7 +462,11 @@ class AudioPlayerState extends State { onLongPress: () => widget.event?.saveFile(context), // Pangea# - onTap: _onButtonTap, + onTap: () { + widget.onPlay != null + ? widget.onPlay!.call() + : _onButtonTap(); + }, child: Material( color: widget.color.withAlpha(64), borderRadius: BorderRadius.circular(64), diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index 05c87bef8..a4098996c 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -225,6 +225,15 @@ class MessageContent extends StatelessWidget { eventId: event.eventId, roomId: event.room.id, senderId: event.senderId, + onPlay: overlayController == null + ? () { + controller.showToolbar( + pangeaMessageEvent!.event, + pangeaMessageEvent: pangeaMessageEvent, + ); + } + : null, + autoplay: overlayController != null, // Pangea# ); } diff --git a/lib/pangea/toolbar/reading_assistance_input_row/practice_match_card.dart b/lib/pangea/toolbar/reading_assistance_input_row/practice_match_card.dart index eb1421b15..4fbbc7384 100644 --- a/lib/pangea/toolbar/reading_assistance_input_row/practice_match_card.dart +++ b/lib/pangea/toolbar/reading_assistance_input_row/practice_match_card.dart @@ -74,7 +74,6 @@ class MatchActivityCard extends StatelessWidget { MessageAudioCard( messageEvent: overlayController.pangeaMessageEvent!, overlayController: overlayController, - setIsPlayingAudio: overlayController.setIsPlayingAudio, ), Wrap( alignment: WrapAlignment.center, diff --git a/lib/pangea/toolbar/widgets/message_audio_card.dart b/lib/pangea/toolbar/widgets/message_audio_card.dart index 0aea47efc..e50a6458c 100644 --- a/lib/pangea/toolbar/widgets/message_audio_card.dart +++ b/lib/pangea/toolbar/widgets/message_audio_card.dart @@ -18,14 +18,12 @@ import 'package:fluffychat/pangea/toolbar/widgets/message_selection_overlay.dart class MessageAudioCard extends StatefulWidget { final PangeaMessageEvent messageEvent; final MessageOverlayController overlayController; - final Function(bool) setIsPlayingAudio; final VoidCallback? onError; const MessageAudioCard({ super.key, required this.messageEvent, required this.overlayController, - required this.setIsPlayingAudio, this.onError, }); @@ -91,7 +89,6 @@ class MessageAudioCardState extends State { senderId: widget.messageEvent.senderId, matrixFile: audioFile, color: Theme.of(context).colorScheme.onPrimaryContainer, - setIsPlayingAudio: widget.setIsPlayingAudio, fontSize: AppConfig.messageFontSize * AppConfig.fontSizeFactor, chatController: widget.overlayController.widget.chatController, overlayController: widget.overlayController, diff --git a/lib/pangea/toolbar/widgets/message_selection_overlay.dart b/lib/pangea/toolbar/widgets/message_selection_overlay.dart index 4087457f6..0eaa7f65a 100644 --- a/lib/pangea/toolbar/widgets/message_selection_overlay.dart +++ b/lib/pangea/toolbar/widgets/message_selection_overlay.dart @@ -86,7 +86,6 @@ class MessageOverlayController extends State List? _highlightedTokens; bool initialized = false; - bool isPlayingAudio = false; final GlobalKey wordZoomKey = GlobalKey(); @@ -575,12 +574,6 @@ class MessageOverlayController extends State ); } - void setIsPlayingAudio(bool isPlaying) { - if (mounted) { - setState(() => isPlayingAudio = isPlaying); - } - } - void setShowTranslation(bool show, String? translation) { if (showTranslation == show) return; if (show && translation == null) return; diff --git a/lib/pangea/toolbar/widgets/message_selection_positioner.dart b/lib/pangea/toolbar/widgets/message_selection_positioner.dart index 555154ad8..8cca472de 100644 --- a/lib/pangea/toolbar/widgets/message_selection_positioner.dart +++ b/lib/pangea/toolbar/widgets/message_selection_positioner.dart @@ -138,6 +138,9 @@ class MessageSelectionPositionerState extends State void dispose() { _animationController.dispose(); _reactionSubscription?.cancel(); + MatrixState.pangeaController.matrixState.audioPlayer + ?..stop() + ..dispose(); super.dispose(); } diff --git a/lib/pangea/toolbar/widgets/practice_activity/multiple_choice_activity.dart b/lib/pangea/toolbar/widgets/practice_activity/multiple_choice_activity.dart index 3bf05cebf..b9c46062c 100644 --- a/lib/pangea/toolbar/widgets/practice_activity/multiple_choice_activity.dart +++ b/lib/pangea/toolbar/widgets/practice_activity/multiple_choice_activity.dart @@ -236,7 +236,6 @@ class MultipleChoiceActivityState extends State { messageEvent: widget.practiceCardController.widget.pangeaMessageEvent, overlayController: widget.overlayController, - setIsPlayingAudio: widget.overlayController.setIsPlayingAudio, onError: widget.onError, ), ChoicesArray( @@ -247,8 +246,7 @@ class MultipleChoiceActivityState extends State { choices: choices(context), isActive: true, id: currentRecordModel?.hashCode.toString(), - enableAudio: !widget.overlayController.isPlayingAudio && - practiceActivity.activityType.includeTTSOnClick, + enableAudio: practiceActivity.activityType.includeTTSOnClick, langCode: MatrixState.pangeaController.languageController.activeL2Code(), getDisplayCopy: _getDisplayCopy,