Browse Source

Optimize the startup time further

Vishnu Mohandas 4 years ago
parent
commit
d4e1754ca4

+ 25 - 6
lib/repositories/file_repository.dart

@@ -15,7 +15,32 @@ class FileRepository {
     return _files;
     return _files;
   }
   }
 
 
+  bool _hasLoadedFiles = false;
+
+  bool get hasLoadedFiles {
+    return _hasLoadedFiles;
+  }
+
+  Future<List<File>> _cachedFuture;
+
   Future<List<File>> loadFiles() async {
   Future<List<File>> loadFiles() async {
+    if (_cachedFuture == null) {
+      _cachedFuture = _loadFiles().then((value) {
+        _hasLoadedFiles = true;
+        _cachedFuture = null;
+        return value;
+      });
+    }
+    return _cachedFuture;
+  }
+
+  Future<void> reloadFiles() async {
+    _logger.info("Reloading...");
+    await loadFiles();
+    Bus.instance.fire(LocalPhotosUpdatedEvent());
+  }
+
+  Future<List<File>> _loadFiles() async {
     final files = await FilesDB.instance.getFiles();
     final files = await FilesDB.instance.getFiles();
     final deduplicatedFiles = List<File>();
     final deduplicatedFiles = List<File>();
     for (int index = 0; index < files.length; index++) {
     for (int index = 0; index < files.length; index++) {
@@ -34,10 +59,4 @@ class FileRepository {
     _files.addAll(deduplicatedFiles);
     _files.addAll(deduplicatedFiles);
     return _files;
     return _files;
   }
   }
-
-  Future<void> reloadFiles() async {
-    _logger.info("Reloading...");
-    await loadFiles();
-    Bus.instance.fire(LocalPhotosUpdatedEvent());
-  }
 }
 }

+ 15 - 14
lib/ui/collections_gallery_widget.dart

@@ -107,23 +107,26 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget> {
 
 
   Future<CollectionItems> _getCollections() async {
   Future<CollectionItems> _getCollections() async {
     final filesDB = FilesDB.instance;
     final filesDB = FilesDB.instance;
+    final filesRepo = FileRepository.instance;
     final collectionsService = CollectionsService.instance;
     final collectionsService = CollectionsService.instance;
     final userID = Configuration.instance.getUserID();
     final userID = Configuration.instance.getUserID();
-    // Query takes ~3 seconds, find out why
-    final paths = await filesDB.getLocalPaths();
     final folders = List<DeviceFolder>();
     final folders = List<DeviceFolder>();
-    for (final path in paths) {
-      final files = List<File>();
-      for (File file in FileRepository.instance.files) {
-        if ((file.ownerID == null || file.ownerID == userID) &&
-            file.deviceFolder == path) {
-          files.add(file);
-        }
+    final files = filesRepo.hasLoadedFiles
+        ? filesRepo.files
+        : await filesRepo.loadFiles();
+    final filePathMap = Map<String, List<File>>();
+    for (final file in files) {
+      final path = file.deviceFolder;
+      if (filePathMap[path] == null) {
+        filePathMap[path] = List<File>();
       }
       }
+      filePathMap[path].add(file);
+    }
+    for (final path in filePathMap.keys) {
       final folderName = p.basename(path);
       final folderName = p.basename(path);
-      folders.add(DeviceFolder(folderName, path, () => files, files[0]));
+      folders.add(DeviceFolder(
+          folderName, path, () => filePathMap[path], filePathMap[path][0]));
     }
     }
-
     folders.sort((first, second) {
     folders.sort((first, second) {
       return second.thumbnail.creationTime
       return second.thumbnail.creationTime
           .compareTo(first.thumbnail.creationTime);
           .compareTo(first.thumbnail.creationTime);
@@ -132,9 +135,7 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget> {
     final collections = collectionsService.getCollections();
     final collections = collectionsService.getCollections();
     final ownedCollectionIDs = List<int>();
     final ownedCollectionIDs = List<int>();
     for (final c in collections) {
     for (final c in collections) {
-      if (c.ownerID != userID) {
-        continue;
-      } else {
+      if (c.ownerID == userID) {
         ownedCollectionIDs.add(c.id);
         ownedCollectionIDs.add(c.id);
       }
       }
     }
     }

+ 1 - 10
lib/ui/home_widget.dart

@@ -43,16 +43,10 @@ class _HomeWidgetState extends State<HomeWidget> {
   final _memoriesWidget = MemoriesWidget();
   final _memoriesWidget = MemoriesWidget();
 
 
   int _selectedNavBarItem = 0;
   int _selectedNavBarItem = 0;
-  StreamSubscription<LocalPhotosUpdatedEvent>
-      _localPhotosUpdatedEventSubscription;
   StreamSubscription<TabChangedEvent> _tabChangedEventSubscription;
   StreamSubscription<TabChangedEvent> _tabChangedEventSubscription;
 
 
   @override
   @override
   void initState() {
   void initState() {
-    _localPhotosUpdatedEventSubscription =
-        Bus.instance.on<LocalPhotosUpdatedEvent>().listen((event) {
-      setState(() {});
-    });
     _tabChangedEventSubscription =
     _tabChangedEventSubscription =
         Bus.instance.on<TabChangedEvent>().listen((event) {
         Bus.instance.on<TabChangedEvent>().listen((event) {
       setState(() {
       setState(() {
@@ -143,9 +137,7 @@ class _HomeWidgetState extends State<HomeWidget> {
 
 
   Widget _getMainGalleryWidget() {
   Widget _getMainGalleryWidget() {
     return FutureBuilder(
     return FutureBuilder(
-      future: FileRepository.instance.loadFiles().then((files) {
-        return _getFilteredPhotos(files);
-      }),
+      future: FileRepository.instance.loadFiles(),
       builder: (context, snapshot) {
       builder: (context, snapshot) {
         if (snapshot.hasData) {
         if (snapshot.hasData) {
           return Gallery(
           return Gallery(
@@ -207,7 +199,6 @@ class _HomeWidgetState extends State<HomeWidget> {
 
 
   @override
   @override
   void dispose() {
   void dispose() {
-    _localPhotosUpdatedEventSubscription.cancel();
     _tabChangedEventSubscription.cancel();
     _tabChangedEventSubscription.cancel();
     super.dispose();
     super.dispose();
   }
   }