Merge pull request #832 from GetStream/video-fix

feat(ui): added autoplay to videos
This commit is contained in:
Salvatore Giordano
2021-12-20 11:00:12 +01:00
committed by GitHub
5 changed files with 55 additions and 8 deletions
@@ -1,3 +1,9 @@
## Upcoming
✅ Added
- Videos can now be auto-played in `FullScreenMedia`
## 3.3.2 ## 3.3.2
- Updated `stream_chat_flutter_core` dependency to [`3.3.1`](https://pub.dev/packages/stream_chat_flutter_core/changelog). - Updated `stream_chat_flutter_core` dependency to [`3.3.1`](https://pub.dev/packages/stream_chat_flutter_core/changelog).
@@ -246,7 +246,8 @@ class GiphyAttachment extends AttachmentWidget {
return StreamChannel( return StreamChannel(
channel: channel, channel: channel,
child: FullScreenMedia( child: FullScreenMedia(
mediaAttachments: [attachment], mediaAttachments: message.attachments,
startIndex: message.attachments.indexOf(attachment),
userName: message.user?.name, userName: message.user?.name,
message: message, message: message,
onShowMessage: onShowMessage, onShowMessage: onShowMessage,
@@ -141,7 +141,9 @@ class ImageAttachment extends AttachmentWidget {
return StreamChannel( return StreamChannel(
channel: channel, channel: channel,
child: FullScreenMedia( child: FullScreenMedia(
mediaAttachments: [attachment], mediaAttachments: message.attachments,
startIndex:
message.attachments.indexOf(attachment),
userName: message.user?.name, userName: message.user?.name,
message: message, message: message,
onShowMessage: onShowMessage, onShowMessage: onShowMessage,
@@ -87,7 +87,9 @@ class VideoAttachment extends AttachmentWidget {
builder: (_) => StreamChannel( builder: (_) => StreamChannel(
channel: channel, channel: channel,
child: FullScreenMedia( child: FullScreenMedia(
mediaAttachments: [attachment], mediaAttachments: message.attachments,
startIndex:
message.attachments.indexOf(attachment),
userName: message.user?.name, userName: message.user?.name,
message: message, message: message,
onShowMessage: onShowMessage, onShowMessage: onShowMessage,
@@ -34,6 +34,7 @@ class FullScreenMedia extends StatefulWidget {
String? userName, String? userName,
this.onShowMessage, this.onShowMessage,
this.attachmentActionsModalBuilder, this.attachmentActionsModalBuilder,
this.autoplayVideos = false,
}) : userName = userName ?? '', }) : userName = userName ?? '',
super(key: key); super(key: key);
@@ -57,6 +58,9 @@ class FullScreenMedia extends StatefulWidget {
/// Use [defaultActionsModal.copyWith] to easily customize it /// Use [defaultActionsModal.copyWith] to easily customize it
final AttachmentActionsBuilder? attachmentActionsModalBuilder; final AttachmentActionsBuilder? attachmentActionsModalBuilder;
/// Auto-play videos when page is opened
final bool autoplayVideos;
@override @override
_FullScreenMediaState createState() => _FullScreenMediaState(); _FullScreenMediaState createState() => _FullScreenMediaState();
} }
@@ -81,7 +85,8 @@ class _FullScreenMediaState extends State<FullScreenMedia>
); );
_pageController = PageController(initialPage: widget.startIndex); _pageController = PageController(initialPage: widget.startIndex);
_currentPage = widget.startIndex; _currentPage = widget.startIndex;
for (final attachment in widget.mediaAttachments) { for (var i = 0; i < widget.mediaAttachments.length; i++) {
final attachment = widget.mediaAttachments[i];
if (attachment.type != 'video') continue; if (attachment.type != 'video') continue;
final package = VideoPackage(attachment, showControls: true); final package = VideoPackage(attachment, showControls: true);
videoPackages[attachment.id] = package; videoPackages[attachment.id] = package;
@@ -90,9 +95,21 @@ class _FullScreenMediaState extends State<FullScreenMedia>
} }
Future<void> initializePlayers() async { Future<void> initializePlayers() async {
if (videoPackages.isEmpty) {
return;
}
final currentAttachment = widget.mediaAttachments[widget.startIndex];
await Future.wait(videoPackages.values.map( await Future.wait(videoPackages.values.map(
(it) => it.initialize(), (it) => it.initialize(),
)); ));
if (widget.autoplayVideos && currentAttachment.type == 'video') {
final package = videoPackages.values
.firstWhere((e) => e._attachment == currentAttachment);
package._chewieController?.play();
}
setState(() {}); // ignore: no-empty-block setState(() {}); // ignore: no-empty-block
} }
@@ -109,6 +126,24 @@ class _FullScreenMediaState extends State<FullScreenMedia>
setState(() { setState(() {
_currentPage = val; _currentPage = val;
}); });
if (videoPackages.isEmpty) {
return;
}
final currentAttachment = widget.mediaAttachments[val];
for (final e in videoPackages.values) {
if (e._attachment != currentAttachment) {
e._chewieController?.pause();
}
}
if (widget.autoplayVideos &&
currentAttachment.type == 'video') {
final controller = videoPackages[currentAttachment.id]!;
controller._chewieController?.play();
}
}, },
itemBuilder: (context, index) { itemBuilder: (context, index) {
final attachment = widget.mediaAttachments[index]; final attachment = widget.mediaAttachments[index];
@@ -243,15 +278,16 @@ class _FullScreenMediaState extends State<FullScreenMedia>
class VideoPackage { class VideoPackage {
/// Constructor for creating [VideoPackage] /// Constructor for creating [VideoPackage]
VideoPackage( VideoPackage(
Attachment attachment, { this._attachment, {
bool showControls = false, bool showControls = false,
bool autoInitialize = true, bool autoInitialize = true,
}) : _showControls = showControls, }) : _showControls = showControls,
_autoInitialize = autoInitialize, _autoInitialize = autoInitialize,
_videoPlayerController = attachment.localUri != null _videoPlayerController = _attachment.localUri != null
? VideoPlayerController.file(File.fromUri(attachment.localUri!)) ? VideoPlayerController.file(File.fromUri(_attachment.localUri!))
: VideoPlayerController.network(attachment.assetUrl!); : VideoPlayerController.network(_attachment.assetUrl!);
final Attachment _attachment;
final bool _showControls; final bool _showControls;
final bool _autoInitialize; final bool _autoInitialize;
final VideoPlayerController _videoPlayerController; final VideoPlayerController _videoPlayerController;