From e318d7a5df0a01642b0f23c10c567df2f574aac3 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Tue, 8 Jul 2025 13:45:48 -0400 Subject: [PATCH] chore: don't try to play video for not supported video file type, show download button on play error --- lib/l10n/intl_en.arb | 3 +- lib/pages/chat/events/video_player.dart | 14 +++++- lib/pages/image_viewer/video_player.dart | 62 ++++++++++++++++++++++-- 3 files changed, 74 insertions(+), 5 deletions(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 019fcf6e9..cef7ecac0 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -5036,5 +5036,6 @@ "mySavedActivities": "My Saved Activities", "noSavedActivities": "No saved activities", "saveActivity": "Save this activity", - "yourSavedActivities": "Saved Activities" + "yourSavedActivities": "Saved Activities", + "failedToPlayVideo": "Failed to play video" } diff --git a/lib/pages/chat/events/video_player.dart b/lib/pages/chat/events/video_player.dart index 6b31eb774..1940abc33 100644 --- a/lib/pages/chat/events/video_player.dart +++ b/lib/pages/chat/events/video_player.dart @@ -30,9 +30,21 @@ class EventVideoPlayer extends StatelessWidget { static const String fallbackBlurHash = 'L5H2EC=PM+yV0g-mq.wG9c010J}I'; + // #Pangea + bool get _supportedFormat { + final infoMap = event.content.tryGetMap('info'); + final mimetype = infoMap?.tryGet('mimetype'); + return PlatformInfos.isAndroid ? mimetype != "video/quicktime" : true; + } + // Pangea# + @override Widget build(BuildContext context) { - final supportsVideoPlayer = PlatformInfos.supportsVideoPlayer; + // #Pangea + // final supportsVideoPlayer = PlatformInfos.supportsVideoPlayer; + final supportsVideoPlayer = + PlatformInfos.supportsVideoPlayer && _supportedFormat; + // Pangea# final blurHash = (event.infoMap as Map) .tryGet('xyz.amorgan.blurhash') ?? diff --git a/lib/pages/image_viewer/video_player.dart b/lib/pages/image_viewer/video_player.dart index 29c48275e..b90fcd1f8 100644 --- a/lib/pages/image_viewer/video_player.dart +++ b/lib/pages/image_viewer/video_player.dart @@ -9,6 +9,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:universal_html/html.dart' as html; import 'package:video_player/video_player.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; @@ -32,9 +33,22 @@ class EventVideoPlayerState extends State { ChewieController? _chewieController; VideoPlayerController? _videoPlayerController; + // #Pangea + Object? _error; + + bool get _supportedFormat { + final infoMap = widget.event.content.tryGetMap('info'); + final mimetype = infoMap?.tryGet('mimetype'); + return PlatformInfos.isAndroid ? mimetype != "video/quicktime" : true; + } + // Pangea# + // The video_player package only doesn't support Windows and Linux. - final _supportsVideoPlayer = - !PlatformInfos.isWindows && !PlatformInfos.isLinux; + // #Pangea + // final _supportsVideoPlayer = + // !PlatformInfos.isWindows && !PlatformInfos.isLinux; + bool get _supportsVideoPlayer => !PlatformInfos.isLinux && _supportedFormat; + // Pangea# void _downloadAction() async { if (!_supportsVideoPlayer) { @@ -43,6 +57,9 @@ class EventVideoPlayerState extends State { } try { + // #Pangea + setState(() => _error = null); + // Pangea# final videoFile = await widget.event.downloadAndDecryptAttachment(); // Dispose the controllers if we already have them. @@ -90,8 +107,14 @@ class EventVideoPlayerState extends State { content: Text(e.toLocalizedString(context)), ), ); + // #Pangea + setState(() => _error = e); + // Pangea# } catch (e, s) { ErrorReporter(context, 'Unable to play video').onErrorCallback(e, s); + // #Pangea + setState(() => _error = e); + // Pangea# } } @@ -165,7 +188,40 @@ class EventVideoPlayerState extends State { ), ), ), - const Center(child: CircularProgressIndicator.adaptive()), + // #Pangea + // const Center(child: CircularProgressIndicator.adaptive()), + _error != null + ? Center( + child: Column( + spacing: 8.0, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + spacing: 8.0, + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.error, + color: Theme.of(context).colorScheme.error, + ), + Text(L10n.of(context).failedToPlayVideo), + ], + ), + IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(200), + foregroundColor: Colors.white, + ), + icon: const Icon(Icons.download_outlined), + onPressed: () => widget.event.saveFile(context), + color: Colors.white, + tooltip: L10n.of(context).downloadFile, + ), + ], + ), + ) + : const Center(child: CircularProgressIndicator.adaptive()), + // Pangea# ], ); }