diff --git a/lib/photo_sync_manager.dart b/lib/photo_sync_manager.dart index 99799a681..f10c932a6 100644 --- a/lib/photo_sync_manager.dart +++ b/lib/photo_sync_manager.dart @@ -58,6 +58,11 @@ class PhotoSyncManager { return _existingSync; } + Future hasScannedDisk() async { + final prefs = await SharedPreferences.getInstance(); + return prefs.containsKey(_lastDBUpdateTimestampKey); + } + Future _doSync() async { final prefs = await SharedPreferences.getInstance(); final syncStartTimestamp = DateTime.now().microsecondsSinceEpoch; diff --git a/lib/ui/home_widget.dart b/lib/ui/home_widget.dart index 9af242117..c17fb7d16 100644 --- a/lib/ui/home_widget.dart +++ b/lib/ui/home_widget.dart @@ -13,6 +13,7 @@ import 'package:photos/photo_sync_manager.dart'; 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_photos_widget.dart'; import 'package:photos/ui/loading_widget.dart'; import 'package:photos/ui/remote_folder_gallery_widget.dart'; import 'package:photos/ui/search_page.dart'; @@ -32,11 +33,14 @@ class HomeWidget extends StatefulWidget { class _HomeWidgetState extends State { static final importantItemsFilter = ImportantItemsFilter(); final _logger = Logger("HomeWidgetState"); + final _remoteFolderGalleryWidget = RemoteFolderGalleryWidget(); + final _deviceFolderGalleryWidget = DeviceFolderGalleryWidget(); + ShakeDetector _detector; int _selectedNavBarItem = 0; Set _selectedPhotos = HashSet(); - final _deviceFolderGalleryWidget = DeviceFolderGalleryWidget(); - final _remoteFolderGalleryWidget = RemoteFolderGalleryWidget(); + StreamSubscription + _localPhotosUpdatedEventSubscription; @override void initState() { @@ -46,6 +50,10 @@ class _HomeWidgetState extends State { _logger.info("Emailing logs"); LoggingUtil.instance.emailLogs(); }); + _localPhotosUpdatedEventSubscription = + Bus.instance.on().listen((event) { + setState(() {}); + }); super.initState(); } @@ -61,19 +69,19 @@ class _HomeWidgetState extends State { ), bottomNavigationBar: _buildBottomNavigationBar(), body: FutureBuilder( - future: PhotoRepository.instance.loadPhotos(), + future: PhotoSyncManager.instance.hasScannedDisk(), builder: (context, snapshot) { if (snapshot.hasData) { return IndexedStack( children: [ - _getMainGalleryWidget(), + snapshot.data ? _getMainGalleryWidget() : LoadingPhotosWidget(), _deviceFolderGalleryWidget, _remoteFolderGalleryWidget, ], index: _selectedNavBarItem, ); } else if (snapshot.hasError) { - return Text("Error!"); + return Center(child: Text(snapshot.error.toString())); } else { return loadWidget; } @@ -100,19 +108,31 @@ class _HomeWidgetState extends State { ); } - Gallery _getMainGalleryWidget() { - return Gallery( - () => Future.value(_getFilteredPhotos(PhotoRepository.instance.photos)), - selectedPhotos: _selectedPhotos, - photoSelectionChangeCallback: (Set selectedPhotos) { - setState(() { - _selectedPhotos = selectedPhotos; - }); + Widget _getMainGalleryWidget() { + return FutureBuilder( + future: PhotoRepository.instance.loadPhotos(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return Gallery( + () => Future.value( + _getFilteredPhotos(PhotoRepository.instance.photos)), + selectedPhotos: _selectedPhotos, + photoSelectionChangeCallback: (Set selectedPhotos) { + setState(() { + _selectedPhotos = selectedPhotos; + }); + }, + syncFunction: () { + return PhotoSyncManager.instance.sync(); + }, + reloadTrigger: Bus.instance.on(), + ); + } else if (snapshot.hasError) { + return Center(child: Text(snapshot.error.toString())); + } else { + return loadWidget; + } }, - syncFunction: () { - return PhotoSyncManager.instance.sync(); - }, - reloadTrigger: Bus.instance.on(), ); } @@ -161,6 +181,7 @@ class _HomeWidgetState extends State { @override void dispose() { _detector.stopListening(); + _localPhotosUpdatedEventSubscription.cancel(); super.dispose(); } } diff --git a/lib/ui/loading_photos_widget.dart b/lib/ui/loading_photos_widget.dart new file mode 100644 index 000000000..742cd9b12 --- /dev/null +++ b/lib/ui/loading_photos_widget.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:photos/ui/loading_widget.dart'; + +class LoadingPhotosWidget extends StatefulWidget { + @override + _LoadingPhotosWidgetState createState() => _LoadingPhotosWidgetState(); +} + +class _LoadingPhotosWidgetState extends State { + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + loadWidget, + Padding(padding: EdgeInsets.all(16)), + Text( + "Hang on tight, your photos will appear in a jiffy! 🐣", + ) + ], + ), + ); + } +}