diff --git a/lib/controllers/image_viewer_controller.dart b/lib/controllers/image_viewer_controller.dart new file mode 100644 index 00000000..773b6091 --- /dev/null +++ b/lib/controllers/image_viewer_controller.dart @@ -0,0 +1,42 @@ +import 'package:adaptive_page_layout/adaptive_page_layout.dart'; +import 'package:famedlysdk/famedlysdk.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/views/image_viewer_view.dart'; +import 'package:fluffychat/views/widgets/matrix.dart'; +import 'package:flutter/material.dart'; + +import '../utils/event_extension.dart'; + +class ImageViewer extends StatefulWidget { + final Event event; + final void Function() onLoaded; + + const ImageViewer(this.event, {Key key, this.onLoaded}) : super(key: key); + + @override + ImageViewerController createState() => ImageViewerController(); +} + +class ImageViewerController extends State { + /// Forward this image to another room. + void forwardAction() { + Matrix.of(context).shareContent = widget.event.content; + AdaptivePageLayout.of(context).popUntilIsFirst(); + } + + /// Open this file with a system call. + void openFileAction() => widget.event.openFile(context, downloadOnly: true); + + /// Go back if user swiped it away + void onInteractionEnds(ScaleEndDetails endDetails) { + if (PlatformInfos.usesTouchscreen == false) { + if (endDetails.velocity.pixelsPerSecond.dy > + MediaQuery.of(context).size.height * 1.50) { + Navigator.of(context, rootNavigator: false).pop(); + } + } + } + + @override + Widget build(BuildContext context) => ImageViewerView(this); +} diff --git a/lib/utils/event_extension.dart b/lib/utils/event_extension.dart index e0626087..03bc0425 100644 --- a/lib/utils/event_extension.dart +++ b/lib/utils/event_extension.dart @@ -4,14 +4,14 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'matrix_file_extension.dart'; -import '../views/image_view.dart'; +import '../controllers/image_viewer_controller.dart'; extension LocalizedBody on Event { void openFile(BuildContext context, {bool downloadOnly = false}) async { if (!downloadOnly && [MessageTypes.Image, MessageTypes.Sticker].contains(messageType)) { await Navigator.of(context, rootNavigator: false).push( - MaterialPageRoute(builder: (_) => ImageView(this)), + MaterialPageRoute(builder: (_) => ImageViewer(this)), ); return; } diff --git a/lib/views/homeserver_picker_view.dart b/lib/views/homeserver_picker_view.dart index a77b325a..a19b788b 100644 --- a/lib/views/homeserver_picker_view.dart +++ b/lib/views/homeserver_picker_view.dart @@ -1,4 +1,4 @@ -import 'package:fluffychat/controllers/homeserver_picker_controller.dart'; +import '../controllers/homeserver_picker_controller.dart'; import 'package:fluffychat/views/widgets/default_app_bar_search_field.dart'; import 'package:fluffychat/views/widgets/fluffy_banner.dart'; import 'package:fluffychat/config/app_config.dart'; diff --git a/lib/views/image_view.dart b/lib/views/image_viewer_view.dart similarity index 51% rename from lib/views/image_view.dart rename to lib/views/image_viewer_view.dart index c0dd5172..2b79cce4 100644 --- a/lib/views/image_view.dart +++ b/lib/views/image_viewer_view.dart @@ -1,27 +1,15 @@ -import 'package:adaptive_page_layout/adaptive_page_layout.dart'; -import 'package:famedlysdk/famedlysdk.dart'; +import '../controllers/image_viewer_controller.dart'; import 'package:fluffychat/views/widgets/image_bubble.dart'; -import 'package:fluffychat/views/widgets/matrix.dart'; import 'package:flutter/material.dart'; -import '../utils/event_extension.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import '../utils/platform_infos.dart'; -class ImageView extends StatelessWidget { - final Event event; - final void Function() onLoaded; +class ImageViewerView extends StatelessWidget { + final ImageViewerController controller; - const ImageView(this.event, {Key key, this.onLoaded}) : super(key: key); - - void _forwardAction(BuildContext context) async { - Matrix.of(context).shareContent = event.content; - AdaptivePageLayout.of(context).popUntilIsFirst(); - } + const ImageViewerView(this.controller, {Key key}) : super(key: key); @override Widget build(BuildContext context) { - var calcVelocity = MediaQuery.of(context).size.height * 1.50; - return Scaffold( backgroundColor: Colors.black, extendBodyBehindAppBar: true, @@ -29,7 +17,7 @@ class ImageView extends StatelessWidget { elevation: 0, leading: IconButton( icon: Icon(Icons.close), - onPressed: () => Navigator.of(context, rootNavigator: false).pop(), + onPressed: Navigator.of(context, rootNavigator: false).pop, color: Colors.white, tooltip: L10n.of(context).close, ), @@ -37,13 +25,13 @@ class ImageView extends StatelessWidget { actions: [ IconButton( icon: Icon(Icons.reply_outlined), - onPressed: () => _forwardAction(context), + onPressed: () => controller.forwardAction, color: Colors.white, tooltip: L10n.of(context).share, ), IconButton( icon: Icon(Icons.download_outlined), - onPressed: () => event.openFile(context, downloadOnly: true), + onPressed: () => controller.openFileAction, color: Colors.white, tooltip: L10n.of(context).downloadFile, ), @@ -52,18 +40,12 @@ class ImageView extends StatelessWidget { body: InteractiveViewer( minScale: 1.0, maxScale: 10.0, - onInteractionEnd: (ScaleEndDetails endDetails) { - if (PlatformInfos.usesTouchscreen == false) { - if (endDetails.velocity.pixelsPerSecond.dy > calcVelocity) { - Navigator.of(context, rootNavigator: false).pop(); - } - } - }, + onInteractionEnd: controller.onInteractionEnds, child: Center( child: ImageBubble( - event, + controller.widget.event, tapToView: false, - onLoaded: onLoaded, + onLoaded: controller.widget.onLoaded, fit: BoxFit.contain, backgroundColor: Colors.black, maxSize: false, diff --git a/lib/views/widgets/image_bubble.dart b/lib/views/widgets/image_bubble.dart index 10cd412f..f4d62370 100644 --- a/lib/views/widgets/image_bubble.dart +++ b/lib/views/widgets/image_bubble.dart @@ -1,5 +1,5 @@ import 'package:famedlysdk/famedlysdk.dart'; -import 'package:fluffychat/views/image_view.dart'; +import 'package:fluffychat/controllers/image_viewer_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_blurhash/flutter_blurhash.dart'; @@ -235,7 +235,7 @@ class _ImageBubbleState extends State { if (!widget.tapToView) return; Navigator.of(context, rootNavigator: false).push( MaterialPageRoute( - builder: (_) => ImageView(widget.event, onLoaded: () { + builder: (_) => ImageViewer(widget.event, onLoaded: () { // If the original file didn't load yet, we want to do that now. // This is so that the original file displays after going on the image viewer, // waiting for it to load, and then hitting back. This ensures that we always