Skip to content

Commit 026d7f2

Browse files
jzhangdevzackpollard
authored andcommitted
feat(mobile): play motion video with long press gesture support
1 parent 9bce341 commit 026d7f2

File tree

6 files changed

+52
-0
lines changed

6 files changed

+52
-0
lines changed

Diff for: mobile/lib/modules/asset_viewer/views/gallery_viewer.dart

+5
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,11 @@ class GalleryViewerPage extends HookConsumerWidget {
331331
onTapDown: (_, __, ___) {
332332
ref.read(showControlsProvider.notifier).toggle();
333333
},
334+
onLongPressStart: (_, __, ___) {
335+
if (asset.livePhotoVideoId != null) {
336+
isPlayingVideo.value = true;
337+
}
338+
},
334339
imageProvider: provider,
335340
heroAttributes: PhotoViewHeroAttributes(
336341
tag: isFromDto

Diff for: mobile/lib/shared/ui/photo_view/photo_view.dart

+15
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ class PhotoView extends StatefulWidget {
256256
this.onDragEnd,
257257
this.onDragUpdate,
258258
this.onScaleEnd,
259+
this.onLongPressStart,
259260
this.customSize,
260261
this.gestureDetectorBehavior,
261262
this.tightMode,
@@ -294,6 +295,7 @@ class PhotoView extends StatefulWidget {
294295
this.onDragEnd,
295296
this.onDragUpdate,
296297
this.onScaleEnd,
298+
this.onLongPressStart,
297299
this.customSize,
298300
this.gestureDetectorBehavior,
299301
this.tightMode,
@@ -401,6 +403,10 @@ class PhotoView extends StatefulWidget {
401403
/// particular location.
402404
final PhotoViewImageScaleEndCallback? onScaleEnd;
403405

406+
/// A pointer that might cause a tap has contacted the screen at a particular
407+
/// location.
408+
final PhotoViewImageLongPressStartCallback? onLongPressStart;
409+
404410
/// [HitTestBehavior] to be passed to the internal gesture detector.
405411
final HitTestBehavior? gestureDetectorBehavior;
406412

@@ -537,6 +543,7 @@ class _PhotoViewState extends State<PhotoView>
537543
onDragEnd: widget.onDragEnd,
538544
onDragUpdate: widget.onDragUpdate,
539545
onScaleEnd: widget.onScaleEnd,
546+
onLongPressStart: widget.onLongPressStart,
540547
outerSize: computedOuterSize,
541548
gestureDetectorBehavior: widget.gestureDetectorBehavior,
542549
tightMode: widget.tightMode,
@@ -566,6 +573,7 @@ class _PhotoViewState extends State<PhotoView>
566573
onDragEnd: widget.onDragEnd,
567574
onDragUpdate: widget.onDragUpdate,
568575
onScaleEnd: widget.onScaleEnd,
576+
onLongPressStart: widget.onLongPressStart,
569577
outerSize: computedOuterSize,
570578
gestureDetectorBehavior: widget.gestureDetectorBehavior,
571579
tightMode: widget.tightMode,
@@ -649,6 +657,13 @@ typedef PhotoViewImageScaleEndCallback = Function(
649657
PhotoViewControllerValue controllerValue,
650658
);
651659

660+
/// A type definition for a callback when the user long press start
661+
typedef PhotoViewImageLongPressStartCallback = Function(
662+
BuildContext context,
663+
LongPressStartDetails details,
664+
PhotoViewControllerValue controllerValue,
665+
);
666+
652667
/// A type definition for a callback to show a widget while the image is loading, a [ImageChunkEvent] is passed to inform progress
653668
typedef LoadingBuilder = Widget Function(
654669
BuildContext context,

Diff for: mobile/lib/shared/ui/photo_view/photo_view_gallery.dart

+8
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import 'package:immich_mobile/shared/ui/photo_view/photo_view.dart'
1212
PhotoViewImageDragEndCallback,
1313
PhotoViewImageDragUpdateCallback,
1414
PhotoViewImageScaleEndCallback,
15+
PhotoViewImageLongPressStartCallback,
1516
ScaleStateCycle;
1617

1718
import 'package:immich_mobile/shared/ui/photo_view/src/controller/photo_view_controller.dart';
@@ -269,6 +270,7 @@ class _PhotoViewGalleryState extends State<PhotoViewGallery> {
269270
onDragEnd: pageOption.onDragEnd,
270271
onDragUpdate: pageOption.onDragUpdate,
271272
onScaleEnd: pageOption.onScaleEnd,
273+
onLongPressStart: pageOption.onLongPressStart,
272274
gestureDetectorBehavior: pageOption.gestureDetectorBehavior,
273275
tightMode: pageOption.tightMode,
274276
filterQuality: pageOption.filterQuality,
@@ -300,6 +302,7 @@ class _PhotoViewGalleryState extends State<PhotoViewGallery> {
300302
onDragEnd: pageOption.onDragEnd,
301303
onDragUpdate: pageOption.onDragUpdate,
302304
onScaleEnd: pageOption.onScaleEnd,
305+
onLongPressStart: pageOption.onLongPressStart,
303306
gestureDetectorBehavior: pageOption.gestureDetectorBehavior,
304307
tightMode: pageOption.tightMode,
305308
filterQuality: pageOption.filterQuality,
@@ -347,6 +350,7 @@ class PhotoViewGalleryPageOptions {
347350
this.onDragEnd,
348351
this.onDragUpdate,
349352
this.onScaleEnd,
353+
this.onLongPressStart,
350354
this.gestureDetectorBehavior,
351355
this.tightMode,
352356
this.filterQuality,
@@ -373,6 +377,7 @@ class PhotoViewGalleryPageOptions {
373377
this.onDragEnd,
374378
this.onDragUpdate,
375379
this.onScaleEnd,
380+
this.onLongPressStart,
376381
this.gestureDetectorBehavior,
377382
this.tightMode,
378383
this.filterQuality,
@@ -431,6 +436,9 @@ class PhotoViewGalleryPageOptions {
431436
/// Mirror to [PhotoView.onScaleEnd]
432437
final PhotoViewImageScaleEndCallback? onScaleEnd;
433438

439+
/// Mirror to [PhotoView.onLongPressStart]
440+
final PhotoViewImageLongPressStartCallback? onLongPressStart;
441+
434442
/// Mirror to [PhotoView.gestureDetectorBehavior]
435443
final HitTestBehavior? gestureDetectorBehavior;
436444

Diff for: mobile/lib/shared/ui/photo_view/src/core/photo_view_core.dart

+8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:immich_mobile/shared/ui/photo_view/photo_view.dart'
99
PhotoViewImageDragEndCallback,
1010
PhotoViewImageDragStartCallback,
1111
PhotoViewImageDragUpdateCallback,
12+
PhotoViewImageLongPressStartCallback,
1213
ScaleStateCycle;
1314
import 'package:immich_mobile/shared/ui/photo_view/src/controller/photo_view_controller.dart';
1415
import 'package:immich_mobile/shared/ui/photo_view/src/controller/photo_view_controller_delegate.dart';
@@ -37,6 +38,7 @@ class PhotoViewCore extends StatefulWidget {
3738
required this.onDragEnd,
3839
required this.onDragUpdate,
3940
required this.onScaleEnd,
41+
required this.onLongPressStart,
4042
required this.gestureDetectorBehavior,
4143
required this.controller,
4244
required this.scaleBoundaries,
@@ -61,6 +63,7 @@ class PhotoViewCore extends StatefulWidget {
6163
this.onDragEnd,
6264
this.onDragUpdate,
6365
this.onScaleEnd,
66+
this.onLongPressStart,
6467
this.gestureDetectorBehavior,
6568
required this.controller,
6669
required this.scaleBoundaries,
@@ -95,6 +98,8 @@ class PhotoViewCore extends StatefulWidget {
9598
final PhotoViewImageDragEndCallback? onDragEnd;
9699
final PhotoViewImageDragUpdateCallback? onDragUpdate;
97100

101+
final PhotoViewImageLongPressStartCallback? onLongPressStart;
102+
98103
final HitTestBehavior? gestureDetectorBehavior;
99104
final bool tightMode;
100105
final bool disableGestures;
@@ -373,6 +378,9 @@ class PhotoViewCoreState extends State<PhotoViewCore>
373378
onTapDown: widget.onTapDown != null
374379
? (details) => widget.onTapDown!(context, details, value)
375380
: null,
381+
onLongPressStart: widget.onLongPressStart != null
382+
? (details) => widget.onLongPressStart!(context, details, value)
383+
: null,
376384
child: child,
377385
);
378386
} else {

Diff for: mobile/lib/shared/ui/photo_view/src/core/photo_view_gesture_detector.dart

+10
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class PhotoViewGestureDetector extends StatelessWidget {
1616
this.onDragStart,
1717
this.onDragEnd,
1818
this.onDragUpdate,
19+
this.onLongPressStart,
1920
this.child,
2021
this.onTapUp,
2122
this.onTapDown,
@@ -36,6 +37,8 @@ class PhotoViewGestureDetector extends StatelessWidget {
3637
final GestureTapUpCallback? onTapUp;
3738
final GestureTapDownCallback? onTapDown;
3839

40+
final GestureLongPressStartCallback? onLongPressStart;
41+
3942
final Widget? child;
4043

4144
final HitTestBehavior? behavior;
@@ -99,6 +102,13 @@ class PhotoViewGestureDetector extends StatelessWidget {
99102
},
100103
);
101104

105+
gestures[LongPressGestureRecognizer] =
106+
GestureRecognizerFactoryWithHandlers<LongPressGestureRecognizer>(
107+
() => LongPressGestureRecognizer(debugOwner: this),
108+
(LongPressGestureRecognizer instance) {
109+
instance.onLongPressStart = onLongPressStart;
110+
});
111+
102112
return RawGestureDetector(
103113
behavior: behavior,
104114
gestures: gestures,

Diff for: mobile/lib/shared/ui/photo_view/src/photo_view_wrappers.dart

+6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class ImageWrapper extends StatefulWidget {
2828
required this.onDragEnd,
2929
required this.onDragUpdate,
3030
required this.onScaleEnd,
31+
required this.onLongPressStart,
3132
required this.outerSize,
3233
required this.gestureDetectorBehavior,
3334
required this.tightMode,
@@ -59,6 +60,7 @@ class ImageWrapper extends StatefulWidget {
5960
final PhotoViewImageDragEndCallback? onDragEnd;
6061
final PhotoViewImageDragUpdateCallback? onDragUpdate;
6162
final PhotoViewImageScaleEndCallback? onScaleEnd;
63+
final PhotoViewImageLongPressStartCallback? onLongPressStart;
6264
final Size outerSize;
6365
final HitTestBehavior? gestureDetectorBehavior;
6466
final bool? tightMode;
@@ -205,6 +207,7 @@ class _ImageWrapperState extends State<ImageWrapper> {
205207
onDragEnd: widget.onDragEnd,
206208
onDragUpdate: widget.onDragUpdate,
207209
onScaleEnd: widget.onScaleEnd,
210+
onLongPressStart: widget.onLongPressStart,
208211
gestureDetectorBehavior: widget.gestureDetectorBehavior,
209212
tightMode: widget.tightMode ?? false,
210213
filterQuality: widget.filterQuality ?? FilterQuality.none,
@@ -257,6 +260,7 @@ class CustomChildWrapper extends StatelessWidget {
257260
this.onDragEnd,
258261
this.onDragUpdate,
259262
this.onScaleEnd,
263+
this.onLongPressStart,
260264
required this.outerSize,
261265
this.gestureDetectorBehavior,
262266
required this.tightMode,
@@ -287,6 +291,7 @@ class CustomChildWrapper extends StatelessWidget {
287291
final PhotoViewImageDragEndCallback? onDragEnd;
288292
final PhotoViewImageDragUpdateCallback? onDragUpdate;
289293
final PhotoViewImageScaleEndCallback? onScaleEnd;
294+
final PhotoViewImageLongPressStartCallback? onLongPressStart;
290295
final Size outerSize;
291296
final HitTestBehavior? gestureDetectorBehavior;
292297
final bool? tightMode;
@@ -320,6 +325,7 @@ class CustomChildWrapper extends StatelessWidget {
320325
onDragEnd: onDragEnd,
321326
onDragUpdate: onDragUpdate,
322327
onScaleEnd: onScaleEnd,
328+
onLongPressStart: onLongPressStart,
323329
gestureDetectorBehavior: gestureDetectorBehavior,
324330
tightMode: tightMode ?? false,
325331
filterQuality: filterQuality ?? FilterQuality.none,

0 commit comments

Comments
 (0)