Pārlūkot izejas kodu

Improve efficiency of fetching latest files across collections

Vishnu Mohandas 4 gadi atpakaļ
vecāks
revīzija
62bc2de3da

+ 0 - 2
lib/models/collection_items.dart

@@ -12,12 +12,10 @@ class CollectionItems {
 class CollectionWithThumbnail {
   final Collection collection;
   final File thumbnail;
-  final File lastUpdatedFile;
 
   CollectionWithThumbnail(
     this.collection,
     this.thumbnail,
-    this.lastUpdatedFile,
   );
 }
 

+ 17 - 2
lib/services/collections_service.dart

@@ -34,6 +34,7 @@ class CollectionsService {
   FilesDB _filesDB;
   Configuration _config;
   SharedPreferences _prefs;
+  Future<List<File>> _cachedLatestFiles;
   final _dio = Network.instance.getDio();
   final _localCollections = Map<String, Collection>();
   final _collectionIDToCollections = Map<int, Collection>();
@@ -54,6 +55,14 @@ class CollectionsService {
     for (final collection in collections) {
       _cacheCollectionAttributes(collection);
     }
+    Bus.instance.on<LocalPhotosUpdatedEvent>().listen((event) {
+      _cachedLatestFiles = null;
+      getLatestCollectionFiles();
+    });
+    Bus.instance.on<CollectionUpdatedEvent>().listen((event) {
+      _cachedLatestFiles = null;
+      getLatestCollectionFiles();
+    });
   }
 
   Future<List<Collection>> sync() async {
@@ -71,8 +80,7 @@ class CollectionsService {
         await _filesDB.deleteCollection(collection.id);
         await _db.deleteCollection(collection.id);
         await setCollectionSyncTime(collection.id, null);
-        Bus.instance.fire(
-            LocalPhotosUpdatedEvent(List<File>.empty()));
+        Bus.instance.fire(LocalPhotosUpdatedEvent(List<File>.empty()));
       } else {
         updatedCollections.add(collection);
       }
@@ -119,6 +127,13 @@ class CollectionsService {
     return syncTime;
   }
 
+  Future<List<File>> getLatestCollectionFiles() {
+    if (_cachedLatestFiles == null) {
+      _cachedLatestFiles = _filesDB.getLatestCollectionFiles();
+    }
+    return _cachedLatestFiles;
+  }
+
   Future<void> setCollectionSyncTime(int collectionID, int time) async {
     final key = _collectionSyncTimeKeyPrefix + collectionID.toString();
     if (time == null) {

+ 5 - 3
lib/ui/collections_gallery_widget.dart

@@ -91,11 +91,12 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget>
         second.thumbnail.creationTime.compareTo(first.thumbnail.creationTime));
 
     final List<CollectionWithThumbnail> collectionsWithThumbnail = [];
-    final latestCollectionFiles = await filesDB.getLatestCollectionFiles();
+    final latestCollectionFiles =
+        await collectionsService.getLatestCollectionFiles();
     for (final file in latestCollectionFiles) {
       final c = collectionsService.getCollectionByID(file.collectionID);
       if (c.owner.id == userID) {
-        collectionsWithThumbnail.add(CollectionWithThumbnail(c, file, null));
+        collectionsWithThumbnail.add(CollectionWithThumbnail(c, file));
       }
     }
     collectionsWithThumbnail.sort((first, second) {
@@ -290,7 +291,8 @@ class DeviceFolderIcon extends StatelessWidget {
 }
 
 class CollectionItem extends StatelessWidget {
-  CollectionItem(this.c, {
+  CollectionItem(
+    this.c, {
     Key key,
   }) : super(key: Key(c.collection.id.toString()));
 

+ 4 - 5
lib/ui/create_collection_page.dart

@@ -146,18 +146,17 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
   Future<List<CollectionWithThumbnail>> _getCollectionsWithThumbnail() async {
     final List<CollectionWithThumbnail> collectionsWithThumbnail = [];
     final latestCollectionFiles =
-        await FilesDB.instance.getLatestCollectionFiles();
+        await CollectionsService.instance.getLatestCollectionFiles();
     for (final file in latestCollectionFiles) {
       final c =
           CollectionsService.instance.getCollectionByID(file.collectionID);
       if (c.owner.id == Configuration.instance.getUserID()) {
-        collectionsWithThumbnail.add(CollectionWithThumbnail(c, file,
-            await FilesDB.instance.getLastModifiedFileInCollection(c.id)));
+        collectionsWithThumbnail.add(CollectionWithThumbnail(c, file));
       }
     }
     collectionsWithThumbnail.sort((first, second) {
-      return second.lastUpdatedFile.updationTime
-          .compareTo(first.lastUpdatedFile.updationTime);
+      return second.collection.updationTime
+          .compareTo(first.collection.updationTime);
     });
     return collectionsWithThumbnail;
   }

+ 17 - 11
lib/ui/shared_collections_gallery.dart

@@ -6,8 +6,8 @@ import 'package:fluttertoast/fluttertoast.dart';
 import 'package:logging/logging.dart';
 import 'package:photos/core/configuration.dart';
 import 'package:photos/core/event_bus.dart';
-import 'package:photos/db/files_db.dart';
 import 'package:photos/events/collection_updated_event.dart';
+import 'package:photos/events/local_photos_updated_event.dart';
 import 'package:photos/events/tab_changed_event.dart';
 import 'package:photos/events/user_logged_out_event.dart';
 import 'package:photos/models/collection_items.dart';
@@ -31,12 +31,19 @@ class SharedCollectionGallery extends StatefulWidget {
 class _SharedCollectionGalleryState extends State<SharedCollectionGallery>
     with AutomaticKeepAliveClientMixin {
   Logger _logger = Logger("SharedCollectionGallery");
-  StreamSubscription<CollectionUpdatedEvent> _subscription;
+  StreamSubscription<LocalPhotosUpdatedEvent> _localFilesSubscription;
+  StreamSubscription<CollectionUpdatedEvent> _collectionUpdatesSubscription;
   StreamSubscription<UserLoggedOutEvent> _loggedOutEvent;
 
   @override
   void initState() {
-    _subscription = Bus.instance.on<CollectionUpdatedEvent>().listen((event) {
+    _localFilesSubscription =
+        Bus.instance.on<LocalPhotosUpdatedEvent>().listen((event) {
+      _logger.info("Files updated");
+      setState(() {});
+    });
+    _collectionUpdatesSubscription =
+        Bus.instance.on<CollectionUpdatedEvent>().listen((event) {
       setState(() {});
     });
     _loggedOutEvent = Bus.instance.on<UserLoggedOutEvent>().listen((event) {
@@ -49,7 +56,7 @@ class _SharedCollectionGalleryState extends State<SharedCollectionGallery>
   Widget build(BuildContext context) {
     super.build(context);
     return FutureBuilder<SharedCollections>(
-      future: Future.value(FilesDB.instance.getLatestCollectionFiles())
+      future: Future.value(CollectionsService.instance.getLatestCollectionFiles())
           .then((files) async {
         final List<CollectionWithThumbnail> outgoing = [];
         final List<CollectionWithThumbnail> incoming = [];
@@ -62,7 +69,6 @@ class _SharedCollectionGalleryState extends State<SharedCollectionGallery>
                 CollectionWithThumbnail(
                   c,
                   file,
-                  await FilesDB.instance.getLastModifiedFileInCollection(c.id),
                 ),
               );
             }
@@ -71,18 +77,17 @@ class _SharedCollectionGalleryState extends State<SharedCollectionGallery>
               CollectionWithThumbnail(
                 c,
                 file,
-                await FilesDB.instance.getLastModifiedFileInCollection(c.id),
               ),
             );
           }
         }
         outgoing.sort((first, second) {
-          return second.lastUpdatedFile.updationTime
-              .compareTo(first.lastUpdatedFile.updationTime);
+          return second.collection.updationTime
+              .compareTo(first.collection.updationTime);
         });
         incoming.sort((first, second) {
-          return second.lastUpdatedFile.updationTime
-              .compareTo(first.lastUpdatedFile.updationTime);
+          return second.collection.updationTime
+              .compareTo(first.collection.updationTime);
         });
         return SharedCollections(outgoing, incoming);
       }),
@@ -253,7 +258,8 @@ class _SharedCollectionGalleryState extends State<SharedCollectionGallery>
 
   @override
   void dispose() {
-    _subscription.cancel();
+    _localFilesSubscription.cancel();
+    _collectionUpdatesSubscription.cancel();
     _loggedOutEvent.cancel();
     super.dispose();
   }