diff --git a/lib/ui/device_folders_gallery_widget.dart b/lib/ui/device_folders_gallery_widget.dart index 41a629251..7c67519f2 100644 --- a/lib/ui/device_folders_gallery_widget.dart +++ b/lib/ui/device_folders_gallery_widget.dart @@ -5,16 +5,13 @@ import 'package:photos/favorite_photos_repository.dart'; import 'package:photos/models/device_folder.dart'; import 'package:photos/models/filters/favorite_items_filter.dart'; import 'package:photos/models/filters/folder_name_filter.dart'; -import 'package:photos/models/photo.dart'; import 'package:photos/ui/device_folder_page.dart'; import 'package:photos/ui/loading_widget.dart'; import 'package:photos/ui/thumbnail_widget.dart'; import 'package:path/path.dart' as p; class DeviceFolderGalleryWidget extends StatefulWidget { - final List photos; - - const DeviceFolderGalleryWidget(this.photos, {Key key}) : super(key: key); + const DeviceFolderGalleryWidget({Key key}) : super(key: key); @override _DeviceFolderGalleryWidgetState createState() => diff --git a/lib/ui/home_widget.dart b/lib/ui/home_widget.dart index ef2ebc522..136dd2aa9 100644 --- a/lib/ui/home_widget.dart +++ b/lib/ui/home_widget.dart @@ -13,6 +13,7 @@ import 'package:photos/ui/device_folders_gallery_widget.dart'; import 'package:photos/ui/gallery.dart'; import 'package:photos/ui/gallery_app_bar_widget.dart'; import 'package:photos/ui/loading_widget.dart'; +import 'package:photos/ui/remote_folder_gallery_widget.dart'; import 'package:photos/utils/logging_util.dart'; import 'package:shake/shake.dart'; import 'package:logging/logging.dart'; @@ -74,7 +75,8 @@ class _HomeWidgetState extends State { }); }, ), - DeviceFolderGalleryWidget(PhotoRepository.instance.photos) + DeviceFolderGalleryWidget(), + RemoteFolderGalleryWidget(), ], index: _selectedNavBarItem, ); @@ -99,6 +101,10 @@ class _HomeWidgetState extends State { icon: Icon(Icons.photo_library), title: Text('Gallery'), ), + BottomNavigationBarItem( + icon: Icon(Icons.folder_shared), + title: Text('Shared'), + ), ], currentIndex: _selectedNavBarItem, selectedItemColor: Colors.yellow[800], diff --git a/lib/ui/remote_folder_gallery_widget.dart b/lib/ui/remote_folder_gallery_widget.dart new file mode 100644 index 000000000..9190aff00 --- /dev/null +++ b/lib/ui/remote_folder_gallery_widget.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:photos/db/photo_db.dart'; +import 'package:photos/favorite_photos_repository.dart'; +import 'package:photos/models/device_folder.dart'; +import 'package:photos/models/filters/favorite_items_filter.dart'; +import 'package:photos/models/filters/folder_name_filter.dart'; +import 'package:photos/ui/device_folder_page.dart'; +import 'package:photos/ui/loading_widget.dart'; +import 'package:photos/ui/thumbnail_widget.dart'; +import 'package:path/path.dart' as p; + +class RemoteFolderGalleryWidget extends StatefulWidget { + const RemoteFolderGalleryWidget({Key key}) : super(key: key); + + @override + _RemoteFolderGalleryWidgetState createState() => + _RemoteFolderGalleryWidgetState(); +} + +class _RemoteFolderGalleryWidgetState extends State { + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _getDeviceFolders(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return _getDeviceFolderGalleryWidget(snapshot.data); + } else if (snapshot.hasError) { + return Text(snapshot.error.toString()); + } else { + return loadWidget; + } + }, + ); + } + + Widget _getDeviceFolderGalleryWidget(List folders) { + return Container( + margin: EdgeInsets.only(top: 24), + child: GridView.builder( + shrinkWrap: true, + padding: EdgeInsets.only(bottom: 12), + physics: ScrollPhysics(), // to disable GridView's scrolling + itemBuilder: (context, index) { + return _buildFolder(context, folders[index]); + }, + itemCount: folders.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + ), + ), + ); + } + + Future> _getDeviceFolders() async { + final paths = await PhotoDB.instance.getDistinctPaths(); + final folders = List(); + for (final path in paths) { + final photo = await PhotoDB.instance.getLatestPhotoInPath(path); + final folderName = p.basename(path); + folders + .add(DeviceFolder(folderName, photo, FolderNameFilter(folderName))); + } + folders.sort((first, second) { + return second.thumbnailPhoto.createTimestamp + .compareTo(first.thumbnailPhoto.createTimestamp); + }); + if (FavoritePhotosRepository.instance.hasFavorites()) { + final photo = await PhotoDB.instance.getLatestPhotoAmongGeneratedIds( + FavoritePhotosRepository.instance.getLiked().toList()); + folders.insert( + 0, DeviceFolder("Favorites", photo, FavoriteItemsFilter())); + } + return folders; + } + + Widget _buildFolder(BuildContext context, DeviceFolder folder) { + return GestureDetector( + child: Column( + children: [ + Container( + child: ThumbnailWidget(folder.thumbnailPhoto), + height: 150, + width: 150, + ), + Padding(padding: EdgeInsets.all(2)), + Expanded( + child: Text( + folder.name, + style: TextStyle( + fontSize: 16, + ), + ), + ), + ], + ), + onTap: () { + final page = DeviceFolderPage(folder); + Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) { + return page; + }, + ), + ); + }, + ); + } +}