From 3f728e3d19e98726a847a20b1afbfb735576020a Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Tue, 28 Dec 2021 20:04:26 +0100 Subject: [PATCH] chore: Fix videoplayer in stories --- lib/pages/story/story_page.dart | 37 ++++++++++++++++++++++++++------- lib/pages/story/story_view.dart | 3 ++- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/lib/pages/story/story_page.dart b/lib/pages/story/story_page.dart index fcaf1ca08..8ec38ce14 100644 --- a/lib/pages/story/story_page.dart +++ b/lib/pages/story/story_page.dart @@ -181,7 +181,7 @@ class StoryPageController extends State { } }); final max = _videoPlayerController?.value.duration ?? maxProgress; - if (progress > max) { + if (progress >= max) { skip(); } }); @@ -196,14 +196,26 @@ class StoryPageController extends State { String get roomId => VRouter.of(context).pathParameters['roomid'] ?? ''; + Future? loadVideoControllerFuture; + Future loadVideoController(Event event) async { - final matrixFile = await event.downloadAndDecryptAttachment(); - final tmpDirectory = await getTemporaryDirectory(); - final file = File(tmpDirectory.path + matrixFile.name); - final videoPlayerController = VideoPlayerController.file(file); - await videoPlayerController.initialize(); - videoPlayerController.play(); - return videoPlayerController; + try { + final matrixFile = await event.downloadAndDecryptAttachment(); + final tmpDirectory = await getTemporaryDirectory(); + final fileName = + event.content.tryGet('filename') ?? 'unknown_story_video.mp4'; + final file = File(tmpDirectory.path + '/' + fileName); + await file.writeAsBytes(matrixFile.bytes); + final videoPlayerController = + _videoPlayerController = VideoPlayerController.file(file); + await videoPlayerController.initialize(); + await videoPlayerController.play(); + return videoPlayerController; + } catch (e, s) { + Logs().w('Unable to load video story. Try again...', e, s); + await Future.delayed(const Duration(seconds: 3)); + return loadVideoController(event); + } } void skip() { @@ -212,6 +224,9 @@ class StoryPageController extends State { return; } setState(() { + _videoPlayerController?.dispose(); + _videoPlayerController = null; + loadVideoControllerFuture = null; index++; }); _restartTimer(); @@ -222,6 +237,12 @@ class StoryPageController extends State { bool isHold = false; + @override + void dispose() { + _videoPlayerController?.dispose(); + super.dispose(); + } + void hold([_]) { _holdedAt = DateTime.now(); if (loadingMode) return; diff --git a/lib/pages/story/story_view.dart b/lib/pages/story/story_view.dart index 6226cb71d..482dee528 100644 --- a/lib/pages/story/story_view.dart +++ b/lib/pages/story/story_view.dart @@ -160,7 +160,8 @@ class StoryView extends StatelessWidget { if (event.messageType == MessageTypes.Video && PlatformInfos.isMobile) FutureBuilder( - future: controller.loadVideoController(event), + future: controller.loadVideoControllerFuture ??= + controller.loadVideoController(event), builder: (context, snapshot) { final videoPlayerController = snapshot.data; if (videoPlayerController == null) {