Bläddra i källkod

Encapsulate file load results in a model

Vishnu Mohandas 4 år sedan
förälder
incheckning
d6f7ad5020

+ 11 - 8
lib/db/files_db.dart

@@ -2,6 +2,7 @@ import 'dart:io';
 
 import 'package:logging/logging.dart';
 import 'package:photos/models/backup_status.dart';
+import 'package:photos/models/file_load_result.dart';
 import 'package:photos/models/file_type.dart';
 import 'package:photos/models/location.dart';
 import 'package:photos/models/file.dart';
@@ -231,7 +232,7 @@ class FilesDB {
     return BackedUpFileIDs(localIDs.toList(), uploadedIDs.toList());
   }
 
-  Future<List<File>> getAllFiles(int startTime, int endTime,
+  Future<FileLoadResult> getAllFiles(int startTime, int endTime,
       {int limit, bool asc}) async {
     final db = await instance.database;
     final order = (asc ?? false ? 'ASC' : 'DESC');
@@ -244,10 +245,11 @@ class FilesDB {
           '$columnCreationTime ' + order + ', $columnModificationTime ' + order,
       limit: limit,
     );
-    return _convertToFiles(results);
+    final files = _convertToFiles(results);
+    return FileLoadResult(files, files.length == limit);
   }
 
-  Future<List<File>> getFilesInPaths(
+  Future<FileLoadResult> getFilesInPaths(
       int startTime, int endTime, List<String> paths,
       {int limit, bool asc}) async {
     final db = await instance.database;
@@ -277,10 +279,10 @@ class FilesDB {
       uploadedFileIDs.add(id);
       deduplicatedFiles.add(file);
     }
-    return deduplicatedFiles;
+    return FileLoadResult(deduplicatedFiles, files.length == limit);
   }
 
-  Future<List<File>> getFilesInCollection(
+  Future<FileLoadResult> getFilesInCollection(
       int collectionID, int startTime, int endTime,
       {int limit, bool asc}) async {
     final db = await instance.database;
@@ -296,10 +298,10 @@ class FilesDB {
     );
     final files = _convertToFiles(results);
     _logger.info("Fetched " + files.length.toString() + " files");
-    return files;
+    return FileLoadResult(files, files.length == limit);
   }
 
-  Future<List<File>> getFilesInPath(String path, int startTime, int endTime,
+  Future<FileLoadResult> getFilesInPath(String path, int startTime, int endTime,
       {int limit, bool asc}) async {
     final db = await instance.database;
     final order = (asc ?? false ? 'ASC' : 'DESC');
@@ -313,7 +315,8 @@ class FilesDB {
       groupBy: '$columnLocalID',
       limit: limit,
     );
-    return _convertToFiles(results);
+    final files = _convertToFiles(results);
+    return FileLoadResult(files, files.length == limit);
   }
 
   Future<List<File>> getAllVideos() async {

+ 8 - 0
lib/models/file_load_result.dart

@@ -0,0 +1,8 @@
+import 'package:photos/models/file.dart';
+
+class FileLoadResult {
+  final List<File> files;
+  final bool hasMore;
+
+  FileLoadResult(this.files, this.hasMore);
+}

+ 21 - 26
lib/ui/detail_page.dart

@@ -149,36 +149,31 @@ class _DetailPageState extends State<DetailPage> {
     );
   }
 
-  void _preloadEntries(int index) {
+  void _preloadEntries(int index) async {
     if (index == 0 && !_hasLoadedTillStart) {
-      widget.config
-          .asyncLoader(_files[index].creationTime + 1,
-              DateTime.now().microsecondsSinceEpoch,
-              limit: kLoadLimit, asc: true)
-          .then((reversed) {
-        setState(() {
-          final files = reversed.reversed.toList();
-          if (files.length < kLoadLimit) {
-            _hasLoadedTillStart = true;
-          }
-          final length = files.length;
-          files.addAll(_files);
-          _files = files;
-          _pageController.jumpToPage(length);
-          _selectedIndex = length;
-        });
+      final result = await widget.config.asyncLoader(
+          _files[index].creationTime + 1, DateTime.now().microsecondsSinceEpoch,
+          limit: kLoadLimit, asc: true);
+      setState(() {
+        final files = result.files.reversed.toList();
+        if (!result.hasMore) {
+          _hasLoadedTillStart = true;
+        }
+        final length = files.length;
+        files.addAll(_files);
+        _files = files;
+        _pageController.jumpToPage(length);
+        _selectedIndex = length;
       });
     }
     if (index == _files.length - 1 && !_hasLoadedTillEnd) {
-      widget.config
-          .asyncLoader(0, _files[index].creationTime - 1, limit: kLoadLimit)
-          .then((files) {
-        setState(() {
-          if (files.length < kLoadLimit) {
-            _hasLoadedTillEnd = true;
-          }
-          _files.addAll(files);
-        });
+      final result = await widget.config
+          .asyncLoader(0, _files[index].creationTime - 1, limit: kLoadLimit);
+      setState(() {
+        if (!result.hasMore) {
+          _hasLoadedTillEnd = true;
+        }
+        _files.addAll(result.files);
       });
     }
   }

+ 15 - 14
lib/ui/gallery.dart

@@ -7,6 +7,7 @@ import 'package:photos/core/event_bus.dart';
 import 'package:photos/events/event.dart';
 import 'package:photos/events/files_updated_event.dart';
 import 'package:photos/models/file.dart';
+import 'package:photos/models/file_load_result.dart';
 import 'package:photos/models/selected_files.dart';
 import 'package:photos/ui/common_elements.dart';
 import 'package:photos/ui/huge_listview/huge_listview.dart';
@@ -15,7 +16,7 @@ import 'package:photos/ui/loading_widget.dart';
 import 'package:photos/utils/date_time_util.dart';
 import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
 
-typedef GalleryLoader = Future<List<File>>
+typedef GalleryLoader = Future<FileLoadResult>
     Function(int creationStartTime, int creationEndTime, {int limit, bool asc});
 
 class Gallery extends StatefulWidget {
@@ -64,26 +65,26 @@ class _GalleryState extends State<Gallery> {
     if (widget.reloadEvent != null) {
       _reloadEventSubscription = widget.reloadEvent.listen((event) async {
         _logger.info("Building gallery because reload event fired");
-        _loadFiles().then((files) => _onFilesLoaded(files));
+        final result = await _loadFiles();
+        _onFilesLoaded(result.files);
       });
     }
     if (widget.forceReloadEvent != null) {
       _forceReloadEventSubscription =
           widget.forceReloadEvent.listen((event) async {
         _logger.info("Force reload triggered");
-        final files = await _loadFiles();
-        _setFilesAndReload(files);
+        final result = await _loadFiles();
+        _setFilesAndReload(result.files);
       });
     }
     if (widget.initialFiles != null) {
       _onFilesLoaded(widget.initialFiles);
     }
-    _loadFiles(limit: kInitialLoadLimit).then((files) {
-      _setFilesAndReload(files);
-      if (files.length == kInitialLoadLimit) {
-        _loadFiles().then((files) {
-          _setFilesAndReload(files);
-        });
+    _loadFiles(limit: kInitialLoadLimit).then((result) async {
+      _setFilesAndReload(result.files);
+      if (result.hasMore) {
+        final result = await _loadFiles();
+        _setFilesAndReload(result.files);
       }
     });
     super.initState();
@@ -96,19 +97,19 @@ class _GalleryState extends State<Gallery> {
     }
   }
 
-  Future<List<File>> _loadFiles({int limit}) async {
+  Future<FileLoadResult> _loadFiles({int limit}) async {
     _logger.info("Loading files");
     final startTime = DateTime.now().microsecondsSinceEpoch;
-    final files = await widget
+    final result = await widget
         .asyncLoader(0, DateTime.now().microsecondsSinceEpoch, limit: limit);
     final endTime = DateTime.now().microsecondsSinceEpoch;
     final duration = Duration(microseconds: endTime - startTime);
     _logger.info("Time taken to load " +
-        files.length.toString() +
+        result.files.length.toString() +
         " files :" +
         duration.inMilliseconds.toString() +
         "ms");
-    return files;
+    return result;
   }
 
   // Collates files and returns `true` if it resulted in a gallery reload

+ 3 - 3
lib/ui/huge_listview/lazy_loading_gallery.dart

@@ -97,15 +97,15 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
       if (event.type == EventType.added_or_updated) {
         final dayStartTime =
             DateTime(galleryDate.year, galleryDate.month, galleryDate.day);
-        final files = await widget.asyncLoader(
+        final result = await widget.asyncLoader(
             dayStartTime.microsecondsSinceEpoch,
             dayStartTime.microsecondsSinceEpoch + MICRO_SECONDS_IN_DAY - 1);
-        if (files.isEmpty) {
+        if (result.files.isEmpty) {
           // All files on this day were deleted, let gallery trigger the reload
         } else {
           if (mounted) {
             setState(() {
-              _files = files;
+              _files = result.files;
             });
           }
         }

+ 4 - 4
lib/ui/image_editor_page.dart

@@ -333,10 +333,10 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
       _logger.info("Original file " + widget.originalFile.toString());
       _logger.info("Saved edits to file " + newFile.toString());
       final existingFiles = widget.detailPageConfig.files;
-      final files = await widget.detailPageConfig.asyncLoader(
-        existingFiles[existingFiles.length - 1].creationTime,
-        existingFiles[0].creationTime,
-      );
+      final files = (await widget.detailPageConfig.asyncLoader(
+              existingFiles[existingFiles.length - 1].creationTime,
+              existingFiles[0].creationTime))
+          .files;
       replacePage(
         context,
         DetailPage(