From 0de05143f4c427d71c5a16c3293726cf69926c00 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Thu, 5 Nov 2020 19:15:19 +0530 Subject: [PATCH] feat: Images and video are now dsplayed --- lib/src/message_input.dart | 138 ++++++++++++++++++++++--------------- 1 file changed, 83 insertions(+), 55 deletions(-) diff --git a/lib/src/message_input.dart b/lib/src/message_input.dart index 85878a40..3a8132e2 100644 --- a/lib/src/message_input.dart +++ b/lib/src/message_input.dart @@ -176,7 +176,6 @@ class MessageInputState extends State { bool _sendAsDm = false; bool _openFilePickerSection = false; int _filePickerIndex = 0; - Album _selectedAlbum; /// The editing controller passed to the input TextField TextEditingController textEditingController; @@ -598,59 +597,23 @@ class MessageInputState extends State { Widget _buildPickerSection() { switch (_filePickerIndex) { case 0: - if (_selectedAlbum != null) { - return FutureBuilder( - future: _selectedAlbum.listMedia(), - builder: (context, snapshot) { - if (!snapshot.hasData) { - return Center( - child: CircularProgressIndicator(), - ); - } - return GridView.builder( - itemCount: snapshot.data.total, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3), - itemBuilder: (context, position) { - return FutureBuilder( - future: snapshot.data.items[position].getFile(), - builder: (context, snapshot) { - if (!snapshot.hasData) { - return Center( - child: CircularProgressIndicator(), - ); - } - - return InkWell( - onTap: () { - - }, - child: AspectRatio( - child: Image.file(snapshot.data), - aspectRatio: 1.0, - ), - ); - }); - }, - ); - }); - } - - return FutureBuilder>( - future: PhotoGallery.listAlbums(mediumType: MediumType.image), - builder: (context, albumData) { - if (!albumData.hasData) { + return FutureBuilder>( + future: _getAllMedia(MediumType.image), + builder: (context, mediaData) { + if (!mediaData.hasData) { return Center( child: CircularProgressIndicator(), ); } + return GridView.builder( - itemCount: albumData.data.length, + itemCount: mediaData.data.length, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3), itemBuilder: (context, position) { - return FutureBuilder>( - future: albumData.data[position].getThumbnail(), + return FutureBuilder>( + future: PhotoGallery.getThumbnail( + mediumId: mediaData.data[position].id), builder: (context, snapshot) { if (!snapshot.hasData) { return Center( @@ -658,16 +621,22 @@ class MessageInputState extends State { ); } - return InkWell( - child: AspectRatio( - child: Image.memory(snapshot.data), - aspectRatio: 1.0, + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 1.0, vertical: 1.0), + child: InkWell( + child: AspectRatio( + child: Image.memory( + snapshot.data, + fit: mediaData.data[position].height > + mediaData.data[position].width + ? BoxFit.fitWidth + : BoxFit.fitHeight, + ), + aspectRatio: 1.0, + ), + onTap: () {}, ), - onTap: () { - setState(() { - _selectedAlbum = albumData.data[position]; - }); - }, ); }); }, @@ -675,12 +644,71 @@ class MessageInputState extends State { }); break; case 1: + return FutureBuilder>( + future: _getAllMedia(MediumType.video), + builder: (context, mediaData) { + if (!mediaData.hasData) { + return Center( + child: CircularProgressIndicator(), + ); + } + + return GridView.builder( + itemCount: mediaData.data.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3), + itemBuilder: (context, position) { + return FutureBuilder>( + future: PhotoGallery.getThumbnail( + mediumId: mediaData.data[position].id), + builder: (context, snapshot) { + if (!snapshot.hasData) { + return Center( + child: CircularProgressIndicator(), + ); + } + + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 1.0, vertical: 1.0), + child: InkWell( + child: AspectRatio( + child: Image.memory( + snapshot.data, + fit: mediaData.data[position].height > + mediaData.data[position].width + ? BoxFit.fitWidth + : BoxFit.fitHeight, + ), + aspectRatio: 1.0, + ), + onTap: () {}, + ), + ); + }); + }, + ); + }); break; case 2: break; } } + Future> _getAllMedia(MediumType type) async { + var allAlbums = await PhotoGallery.listAlbums(mediumType: type); + List resultList = []; + + for (var album in allAlbums) { + var data = await album.listMedia(); + resultList.addAll(data.items); + } + + resultList.sort((a, b) => a.modifiedDate.compareTo(b.modifiedDate)); + + return resultList; + } + OverlayEntry _buildMentionsOverlayEntry() { final splits = textEditingController.text .substring(0, textEditingController.value.selection.start)