From 858f81d05ee87ad9776edf3426afaeaf6c37c81c Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Thu, 11 Mar 2021 20:31:06 +0100 Subject: [PATCH] Add a video player --- lib/ui/routes/video_player_route.dart | 68 ++++++++++++++++++++++ lib/ui/widgets/conversation_file_tile.dart | 10 ++++ pubspec.lock | 7 +++ pubspec.yaml | 1 + 4 files changed, 86 insertions(+) create mode 100644 lib/ui/routes/video_player_route.dart diff --git a/lib/ui/routes/video_player_route.dart b/lib/ui/routes/video_player_route.dart new file mode 100644 index 0000000..f534e5b --- /dev/null +++ b/lib/ui/routes/video_player_route.dart @@ -0,0 +1,68 @@ +import 'package:chewie/chewie.dart'; +import 'package:comunic/ui/widgets/async_screen_widget.dart'; +import 'package:comunic/ui/widgets/comunic_back_button_widget.dart'; +import 'package:comunic/utils/intl_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:video_player/video_player.dart'; + +/// Video player route +/// +/// @author Pierre Hubert + +class VideoPlayerRoute extends StatefulWidget { + final String url; + + const VideoPlayerRoute({ + Key key, + @required this.url, + }) : assert(url != null), + super(key: key); + + @override + _VideoPlayerRouteState createState() => _VideoPlayerRouteState(); +} + +class _VideoPlayerRouteState extends State { + VideoPlayerController _videoPlayerController; + ChewieController _chewieController; + + Future _initialize() async { + _videoPlayerController = VideoPlayerController.network(widget.url); + + await _videoPlayerController.initialize(); + + _chewieController = ChewieController( + videoPlayerController: _videoPlayerController, + looping: false, + allowFullScreen: true, + allowMuting: true, + allowedScreenSleep: false, + ); + } + + @override + void dispose() { + if (_videoPlayerController != null) _videoPlayerController.dispose(); + if (_chewieController != null) _chewieController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: ComunicBackButton(), + title: Text("Video"), + ), + body: _buildBody(), + ); + } + + Widget _buildBody() => AsyncScreenWidget( + onReload: _initialize, + onBuild: _showBody, + errorMessage: tr("Failed to initialize video!"), + ); + + Widget _showBody() => Chewie(controller: _chewieController); +} diff --git a/lib/ui/widgets/conversation_file_tile.dart b/lib/ui/widgets/conversation_file_tile.dart index cf899ad..4e567b5 100644 --- a/lib/ui/widgets/conversation_file_tile.dart +++ b/lib/ui/widgets/conversation_file_tile.dart @@ -3,6 +3,8 @@ /// @author Pierre Hubert import 'package:comunic/models/conversation_message.dart'; import 'package:comunic/ui/dialogs/audio_player_dialog.dart'; +import 'package:comunic/ui/routes/main_route/main_route.dart'; +import 'package:comunic/ui/routes/video_player_route.dart'; import 'package:comunic/ui/widgets/network_image_widget.dart'; import 'package:filesize/filesize.dart'; import 'package:flutter/material.dart'; @@ -84,6 +86,14 @@ class _ConversationFileWidgetState extends State { showAudioPlayerDialog(context, file.url); break; + case ConversationMessageFileType.VIDEO: + MainController.of(context).push( + VideoPlayerRoute(url: file.url), + hideNavBar: true, + canShowAsDialog: true, + ); + break; + default: launch(file.url); } diff --git a/pubspec.lock b/pubspec.lock index 15cfefb..df40425 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -50,6 +50,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0-nullsafety.1" + chewie: + dependency: "direct main" + description: + name: chewie + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.2" chewie_audio: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index f3f8937..a054404 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -106,6 +106,7 @@ dependencies: # Video / Audio player video_player: ^1.0.1 chewie_audio: ^1.1.2 + chewie: ^0.12.2 dev_dependencies: flutter_test: