From df458fa19018253980f8e44de20a31c97b27355a Mon Sep 17 00:00:00 2001 From: Sese Schneider Date: Thu, 3 Apr 2025 15:28:09 +0200 Subject: [PATCH 1/3] fix(mobile): Video player restarting when device rotates --- mobile/lib/pages/common/gallery_viewer.page.dart | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mobile/lib/pages/common/gallery_viewer.page.dart b/mobile/lib/pages/common/gallery_viewer.page.dart index ab780eeb75351..45dbd3c512dd5 100644 --- a/mobile/lib/pages/common/gallery_viewer.page.dart +++ b/mobile/lib/pages/common/gallery_viewer.page.dart @@ -12,8 +12,8 @@ import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/scroll_extensions.dart'; import 'package:immich_mobile/pages/common/download_panel.dart'; -import 'package:immich_mobile/pages/common/native_video_viewer.page.dart'; import 'package:immich_mobile/pages/common/gallery_stacked_children.dart'; +import 'package:immich_mobile/pages/common/native_video_viewer.page.dart'; import 'package:immich_mobile/providers/app_settings.provider.dart'; import 'package:immich_mobile/providers/asset_viewer/asset_stack.provider.dart'; import 'package:immich_mobile/providers/asset_viewer/current_asset.provider.dart'; @@ -225,8 +225,6 @@ class GalleryViewerPage extends HookConsumerWidget { } PhotoViewGalleryPageOptions buildVideo(BuildContext context, Asset asset) { - // This key is to prevent the video player from being re-initialized during the hero animation - final key = GlobalKey(); return PhotoViewGalleryPageOptions.customChild( onDragStart: (_, details, __) => localPosition.value = details.localPosition, @@ -241,7 +239,8 @@ class GalleryViewerPage extends HookConsumerWidget { width: context.width, height: context.height, child: NativeVideoViewerPage( - key: key, + // This key is to prevent the video player from being re-initialized during the hero animation + key: const ValueKey('video-player'), asset: asset, image: Image( key: ValueKey(asset), From 8133ef594b55d0638ca5ec767e8c9a74aab9f0f2 Mon Sep 17 00:00:00 2001 From: Sese Schneider Date: Thu, 3 Apr 2025 16:32:03 +0200 Subject: [PATCH 2/3] use global key in state --- mobile/lib/pages/common/gallery_viewer.page.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mobile/lib/pages/common/gallery_viewer.page.dart b/mobile/lib/pages/common/gallery_viewer.page.dart index 45dbd3c512dd5..18e1f9c08ce57 100644 --- a/mobile/lib/pages/common/gallery_viewer.page.dart +++ b/mobile/lib/pages/common/gallery_viewer.page.dart @@ -63,6 +63,10 @@ class GalleryViewerPage extends HookConsumerWidget { final loadAsset = renderList.loadAsset; final isPlayingMotionVideo = ref.watch(isPlayingMotionVideoProvider); + // This key is to prevent the video player from being re-initialized during + // hero animation or device rotation. + final videoPlayerKey = useState(GlobalKey()); + Future precacheNextImage(int index) async { if (!context.mounted) { return; @@ -239,8 +243,7 @@ class GalleryViewerPage extends HookConsumerWidget { width: context.width, height: context.height, child: NativeVideoViewerPage( - // This key is to prevent the video player from being re-initialized during the hero animation - key: const ValueKey('video-player'), + key: videoPlayerKey.value, asset: asset, image: Image( key: ValueKey(asset), From a20a75537ef99c8d19275ad4c63b752e6f44d64e Mon Sep 17 00:00:00 2001 From: Sese Schneider Date: Mon, 7 Apr 2025 10:26:07 +0200 Subject: [PATCH 3/3] Implement suggestions from code review --- mobile/lib/pages/common/gallery_viewer.page.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/pages/common/gallery_viewer.page.dart b/mobile/lib/pages/common/gallery_viewer.page.dart index 18e1f9c08ce57..7392a4d3401de 100644 --- a/mobile/lib/pages/common/gallery_viewer.page.dart +++ b/mobile/lib/pages/common/gallery_viewer.page.dart @@ -65,7 +65,7 @@ class GalleryViewerPage extends HookConsumerWidget { // This key is to prevent the video player from being re-initialized during // hero animation or device rotation. - final videoPlayerKey = useState(GlobalKey()); + final videoPlayerKey = useMemoized(() => GlobalKey()); Future precacheNextImage(int index) async { if (!context.mounted) { @@ -243,7 +243,7 @@ class GalleryViewerPage extends HookConsumerWidget { width: context.width, height: context.height, child: NativeVideoViewerPage( - key: videoPlayerKey.value, + key: videoPlayerKey, asset: asset, image: Image( key: ValueKey(asset),