feat: Fixed download
This commit is contained in:
@@ -79,7 +79,8 @@ class _FullScreenMediaState extends State<FullScreenMedia>
|
|||||||
},
|
},
|
||||||
itemBuilder: (context, position) {
|
itemBuilder: (context, position) {
|
||||||
print(widget.mediaAttachments[position].type);
|
print(widget.mediaAttachments[position].type);
|
||||||
if (widget.mediaAttachments[position].type == 'image' || widget.mediaAttachments[position].type == 'giphy') {
|
if (widget.mediaAttachments[position].type == 'image' ||
|
||||||
|
widget.mediaAttachments[position].type == 'giphy') {
|
||||||
return PhotoView(
|
return PhotoView(
|
||||||
imageProvider: CachedNetworkImageProvider(
|
imageProvider: CachedNetworkImageProvider(
|
||||||
widget.mediaAttachments[position].imageUrl ??
|
widget.mediaAttachments[position].imageUrl ??
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
import 'package:chewie/chewie.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
|
||||||
import 'package:video_player/video_player.dart';
|
|
||||||
|
|
||||||
import 'utils.dart';
|
|
||||||
|
|
||||||
class FullScreenVideo extends StatefulWidget {
|
|
||||||
final Attachment attachment;
|
|
||||||
|
|
||||||
FullScreenVideo({
|
|
||||||
Key key,
|
|
||||||
@required this.attachment,
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
_FullScreenVideoState createState() => _FullScreenVideoState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _FullScreenVideoState extends State<FullScreenVideo> {
|
|
||||||
ChewieController _chewieController;
|
|
||||||
VideoPlayerController _videoPlayerController;
|
|
||||||
bool initialized = false;
|
|
||||||
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
appBar: AppBar(
|
|
||||||
backgroundColor: Colors.black,
|
|
||||||
iconTheme: IconThemeData(
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
body: Builder(
|
|
||||||
key: _scaffoldKey,
|
|
||||||
builder: (context) {
|
|
||||||
if (!initialized) {
|
|
||||||
return Center(
|
|
||||||
child: CircularProgressIndicator(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return Chewie(
|
|
||||||
controller: _chewieController,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
_videoPlayerController =
|
|
||||||
VideoPlayerController.network(widget.attachment.assetUrl);
|
|
||||||
_videoPlayerController.initialize().whenComplete(() {
|
|
||||||
setState(() {
|
|
||||||
initialized = true;
|
|
||||||
_chewieController = ChewieController(
|
|
||||||
videoPlayerController: _videoPlayerController,
|
|
||||||
autoInitialize: false,
|
|
||||||
aspectRatio: _videoPlayerController.value.aspectRatio,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
VoidCallback errorListener;
|
|
||||||
errorListener = () {
|
|
||||||
if (_videoPlayerController.value.hasError) {
|
|
||||||
Navigator.pop(context);
|
|
||||||
launchURL(_scaffoldKey.currentContext, widget.attachment.titleLink);
|
|
||||||
}
|
|
||||||
_videoPlayerController.removeListener(errorListener);
|
|
||||||
};
|
|
||||||
_videoPlayerController.addListener(errorListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
_videoPlayerController?.dispose();
|
|
||||||
_chewieController?.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
|
|||||||
|
|
||||||
import '../stream_chat_flutter.dart';
|
import '../stream_chat_flutter.dart';
|
||||||
import 'attachment_error.dart';
|
import 'attachment_error.dart';
|
||||||
import 'full_screen_image.dart';
|
import 'full_screen_media.dart';
|
||||||
|
|
||||||
class GiphyAttachment extends StatelessWidget {
|
class GiphyAttachment extends StatelessWidget {
|
||||||
final Attachment attachment;
|
final Attachment attachment;
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import 'dart:io';
|
import 'dart:typed_data';
|
||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gallery_saver/gallery_saver.dart';
|
import 'package:dio/dio.dart';
|
||||||
|
import 'package:image_gallery_saver/image_gallery_saver.dart';
|
||||||
import '../stream_chat_flutter.dart';
|
import '../stream_chat_flutter.dart';
|
||||||
import 'stream_icons.dart';
|
import 'stream_icons.dart';
|
||||||
|
|
||||||
@@ -122,14 +122,21 @@ class ImageActionsModal extends StatelessWidget {
|
|||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
}),
|
}),
|
||||||
_buildButton(context, 'Save Image', StreamIcons.save_1,
|
_buildButton(
|
||||||
() async {
|
context,
|
||||||
|
'Save ${urls[currentIndex].type == 'video' ? 'Video' : 'Image'}',
|
||||||
|
StreamIcons.save_1, () async {
|
||||||
var url = urls[currentIndex].imageUrl ??
|
var url = urls[currentIndex].imageUrl ??
|
||||||
urls[currentIndex].assetUrl ??
|
urls[currentIndex].assetUrl ??
|
||||||
urls[currentIndex].thumbUrl;
|
urls[currentIndex].thumbUrl;
|
||||||
var file = await _downloadFile(url);
|
|
||||||
|
|
||||||
Navigator.pop(context);
|
if (urls[currentIndex].type == 'video') {
|
||||||
|
await _saveVideo(url);
|
||||||
|
Navigator.pop(context);
|
||||||
|
} else {
|
||||||
|
await _saveImage(url);
|
||||||
|
Navigator.pop(context);
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
if (StreamChat.of(context).user.id == message.user.id)
|
if (StreamChat.of(context).user.id == message.user.id)
|
||||||
_buildButton(context, 'Delete', StreamIcons.delete,
|
_buildButton(context, 'Delete', StreamIcons.delete,
|
||||||
@@ -181,13 +188,22 @@ class ImageActionsModal extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<File> _downloadFile(String url) async {
|
Future<void> _saveImage(String url) async {
|
||||||
var _client = http.Client();
|
var response = await Dio()
|
||||||
var req = await _client.get(Uri.parse(url));
|
.get(url, options: Options(responseType: ResponseType.bytes));
|
||||||
var bytes = req.bodyBytes;
|
final result = await ImageGallerySaver.saveImage(
|
||||||
var dir = (await getTemporaryDirectory()).path;
|
Uint8List.fromList(response.data),
|
||||||
var file = File('$dir/${basename(url)}');
|
quality: 60,
|
||||||
await file.writeAsBytes(bytes);
|
name: "${DateTime.now().millisecondsSinceEpoch}");
|
||||||
return file;
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _saveVideo(String url) async {
|
||||||
|
var appDocDir = await getTemporaryDirectory();
|
||||||
|
var savePath =
|
||||||
|
appDocDir.path + "/${DateTime.now().millisecondsSinceEpoch}.mp4";
|
||||||
|
await Dio().download(url, savePath);
|
||||||
|
final result = await ImageGallerySaver.saveFile(savePath);
|
||||||
|
print(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
|
|||||||
import '../stream_chat_flutter.dart';
|
import '../stream_chat_flutter.dart';
|
||||||
import 'attachment_error.dart';
|
import 'attachment_error.dart';
|
||||||
import 'attachment_title.dart';
|
import 'attachment_title.dart';
|
||||||
import 'full_screen_image.dart';
|
import 'full_screen_media.dart';
|
||||||
import 'utils.dart';
|
import 'utils.dart';
|
||||||
|
|
||||||
class ImageAttachment extends StatelessWidget {
|
class ImageAttachment extends StatelessWidget {
|
||||||
|
|||||||
+37
-10
@@ -6,7 +6,10 @@ import 'package:cached_network_image/cached_network_image.dart';
|
|||||||
import 'package:esys_flutter_share/esys_flutter_share.dart';
|
import 'package:esys_flutter_share/esys_flutter_share.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gallery_saver/gallery_saver.dart';
|
import 'package:dio/dio.dart';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
import 'package:image_gallery_saver/image_gallery_saver.dart';
|
||||||
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:stream_chat/stream_chat.dart';
|
import 'package:stream_chat/stream_chat.dart';
|
||||||
import 'package:stream_chat_flutter/src/back_button.dart';
|
import 'package:stream_chat_flutter/src/back_button.dart';
|
||||||
import 'package:stream_chat_flutter/src/channel_info.dart';
|
import 'package:stream_chat_flutter/src/channel_info.dart';
|
||||||
@@ -380,15 +383,20 @@ class _ImageFooterState extends State<ImageFooter> {
|
|||||||
child: Material(
|
child: Material(
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
await GallerySaver.saveImage((widget
|
var url = widget
|
||||||
.urls[widget.currentPage]
|
.urls[widget.currentPage].imageUrl ??
|
||||||
.imageUrl ??
|
widget
|
||||||
widget.urls[widget.currentPage]
|
.urls[widget.currentPage].assetUrl ??
|
||||||
.assetUrl ??
|
widget.urls[widget.currentPage].thumbUrl;
|
||||||
widget.urls[widget.currentPage]
|
|
||||||
.thumbUrl)
|
if (widget.urls[widget.currentPage].type ==
|
||||||
.split('?')[0]);
|
'video') {
|
||||||
Navigator.pop(context);
|
await _saveVideo(url);
|
||||||
|
Navigator.pop(context);
|
||||||
|
} else {
|
||||||
|
await _saveImage(url);
|
||||||
|
Navigator.pop(context);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
child: SizedBox.expand(
|
child: SizedBox.expand(
|
||||||
child: Center(
|
child: Center(
|
||||||
@@ -697,6 +705,25 @@ class _ImageFooterState extends State<ImageFooter> {
|
|||||||
_selectedUsers.clear();
|
_selectedUsers.clear();
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _saveImage(String url) async {
|
||||||
|
var response = await Dio()
|
||||||
|
.get(url, options: Options(responseType: ResponseType.bytes));
|
||||||
|
final result = await ImageGallerySaver.saveImage(
|
||||||
|
Uint8List.fromList(response.data),
|
||||||
|
quality: 60,
|
||||||
|
name: "${DateTime.now().millisecondsSinceEpoch}");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _saveVideo(String url) async {
|
||||||
|
var appDocDir = await getTemporaryDirectory();
|
||||||
|
var savePath =
|
||||||
|
appDocDir.path + "/${DateTime.now().millisecondsSinceEpoch}.mp4";
|
||||||
|
await Dio().download(url, savePath);
|
||||||
|
final result = await ImageGallerySaver.saveFile(savePath);
|
||||||
|
print(result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Used for clipping textfield prefix icon
|
/// Used for clipping textfield prefix icon
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import 'package:carousel_slider/carousel_options.dart';
|
|||||||
import 'package:carousel_slider/carousel_slider.dart';
|
import 'package:carousel_slider/carousel_slider.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:stream_chat/stream_chat.dart';
|
import 'package:stream_chat/stream_chat.dart';
|
||||||
import 'package:stream_chat_flutter/src/full_screen_image.dart';
|
import 'package:stream_chat_flutter/src/full_screen_media.dart';
|
||||||
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
||||||
|
|
||||||
class ImageGroup extends StatelessWidget {
|
class ImageGroup extends StatelessWidget {
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import 'package:cached_network_image/cached_network_image.dart';
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
import 'package:chewie/chewie.dart';
|
import 'package:chewie/chewie.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:stream_chat_flutter/src/full_screen_image.dart';
|
import 'package:stream_chat_flutter/src/full_screen_media.dart';
|
||||||
import 'package:stream_chat_flutter/src/full_screen_video.dart';
|
|
||||||
import 'package:stream_chat_flutter/src/utils.dart';
|
import 'package:stream_chat_flutter/src/utils.dart';
|
||||||
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
||||||
import 'package:video_player/video_player.dart';
|
import 'package:video_player/video_player.dart';
|
||||||
@@ -84,14 +83,19 @@ class _VideoAttachmentState extends State<VideoAttachment> {
|
|||||||
|
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
final channel = StreamChannel.of(context).channel;
|
||||||
|
|
||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
MaterialPageRoute(
|
MaterialPageRoute(
|
||||||
builder: (_) => FullScreenMedia(
|
builder: (_) => StreamChannel(
|
||||||
mediaAttachments: [widget.attachment],
|
channel: channel,
|
||||||
userName: widget.message.user.name,
|
child: FullScreenMedia(
|
||||||
sentAt: widget.message.createdAt,
|
mediaAttachments: [widget.attachment],
|
||||||
message: widget.message,
|
userName: widget.message.user.name,
|
||||||
|
sentAt: widget.message.createdAt,
|
||||||
|
message: widget.message,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -10,7 +10,9 @@ export 'src/channels_bloc.dart';
|
|||||||
export 'src/date_divider.dart';
|
export 'src/date_divider.dart';
|
||||||
export 'src/deleted_message.dart';
|
export 'src/deleted_message.dart';
|
||||||
export 'src/file_attachment.dart';
|
export 'src/file_attachment.dart';
|
||||||
export 'src/full_screen_video.dart';
|
export 'src/full_screen_media.dart';
|
||||||
|
export 'src/image_header.dart';
|
||||||
|
export 'src/image_footer.dart';
|
||||||
export 'src/giphy_attachment.dart';
|
export 'src/giphy_attachment.dart';
|
||||||
export 'src/image_attachment.dart';
|
export 'src/image_attachment.dart';
|
||||||
export 'src/message_input.dart';
|
export 'src/message_input.dart';
|
||||||
|
|||||||
+1
-1
@@ -36,7 +36,7 @@ dependencies:
|
|||||||
flutter_slidable: ^0.5.4
|
flutter_slidable: ^0.5.4
|
||||||
carousel_slider: ^2.2.1
|
carousel_slider: ^2.2.1
|
||||||
clipboard: ^0.1.2+8
|
clipboard: ^0.1.2+8
|
||||||
gallery_saver: ^2.0.1
|
image_gallery_saver: ^1.6.6
|
||||||
esys_flutter_share: ^1.0.2
|
esys_flutter_share: ^1.0.2
|
||||||
media_gallery:
|
media_gallery:
|
||||||
git: https://github.com/imtoori/media_gallery.git
|
git: https://github.com/imtoori/media_gallery.git
|
||||||
|
|||||||
Reference in New Issue
Block a user