From 03ed3daa3191d04a1881566932f72b97d4fbdf38 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 17 May 2026 10:54:21 -0500 Subject: [PATCH] chore: improve mobile slideshow (#28460) --- .../pages/drift_slideshow.page.dart | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/mobile/lib/presentation/pages/drift_slideshow.page.dart b/mobile/lib/presentation/pages/drift_slideshow.page.dart index 693a4d201f..4c4ee48cf9 100644 --- a/mobile/lib/presentation/pages/drift_slideshow.page.dart +++ b/mobile/lib/presentation/pages/drift_slideshow.page.dart @@ -21,6 +21,7 @@ import 'package:immich_mobile/providers/infrastructure/metadata.provider.dart'; import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/widgets/common/immich_loading_indicator.dart'; import 'package:immich_mobile/widgets/photo_view/photo_view.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; @RoutePage() class DriftSlideshowPage extends ConsumerStatefulWidget { @@ -33,7 +34,7 @@ class DriftSlideshowPage extends ConsumerStatefulWidget { } class _DriftSlideshowPageState extends ConsumerState { - late final SlideshowConfig _config; + late SlideshowConfig _config; late final PageController _pageController; late final Stopwatch _stopwatch; late Timer _timer; @@ -52,8 +53,10 @@ class _DriftSlideshowPageState extends ConsumerState { _stopwatch = Stopwatch(); _createTimer(); _updateNextIndex(); + ref.listenManual(appConfigProvider.select((s) => s.slideshow), _onConfigChanged); SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); + unawaited(WakelockPlus.enable()); } @override @@ -61,6 +64,7 @@ class _DriftSlideshowPageState extends ConsumerState { _timer.cancel(); _stopwatch.stop(); _pageController.dispose(); + unawaited(WakelockPlus.disable()); SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); super.dispose(); } @@ -98,6 +102,24 @@ class _DriftSlideshowPageState extends ConsumerState { }); } + void _onConfigChanged(SlideshowConfig? previous, SlideshowConfig next) { + if (_config == next) { + return; + } + + final durationChanged = _config.duration != next.duration; + _config = next; + _updateNextIndex(); + + final asset = widget.timeline.getAssetSafe(_index); + if (durationChanged && !_paused && asset?.isImage == true) { + _timer.cancel(); + _createTimer(); + } + + setState(() {}); + } + void _updateNextIndex() { _nextIndex = switch (_config.direction) { SlideshowDirection.forward => _index + 1, @@ -116,6 +138,10 @@ class _DriftSlideshowPageState extends ConsumerState { final wrapped = _config.direction == SlideshowDirection.forward ? 0 : widget.timeline.totalAssets - 1; await widget.timeline.preloadAssets(wrapped); _pageController.jumpToPage(wrapped); + } else { + setState(() { + _paused = true; + }); } return; }