diff --git a/lib/models/photo.dart b/lib/models/photo.dart index f02d3adb5..1c8ea6817 100644 --- a/lib/models/photo.dart +++ b/lib/models/photo.dart @@ -91,23 +91,11 @@ class Photo { return o is Photo && o.generatedId == generatedId && o.uploadedFileId == uploadedFileId && - o.localId == localId && - o.title == title && - o.deviceFolder == deviceFolder && - o.remotePath == remotePath && - o.createTimestamp == createTimestamp && - o.updateTimestamp == updateTimestamp; + o.localId == localId; } @override int get hashCode { - return generatedId.hashCode ^ - uploadedFileId.hashCode ^ - localId.hashCode ^ - title.hashCode ^ - deviceFolder.hashCode ^ - remotePath.hashCode ^ - createTimestamp.hashCode ^ - updateTimestamp.hashCode; + return generatedId.hashCode ^ uploadedFileId.hashCode ^ localId.hashCode; } } diff --git a/lib/photo_provider.dart b/lib/photo_provider.dart index 2cdc3c9d5..842e6ba90 100644 --- a/lib/photo_provider.dart +++ b/lib/photo_provider.dart @@ -14,7 +14,10 @@ class PhotoProvider { final filterOptionGroup = FilterOptionGroup(); filterOptionGroup.setOption(AssetType.image, FilterOption(needTitle: true)); var galleryList = await PhotoManager.getAssetPathList( - type: RequestType.image, filterOption: filterOptionGroup); + hasAll: true, + type: RequestType.image, + filterOption: filterOptionGroup, + ); galleryList.sort((s1, s2) { return s2.assetCount.compareTo(s1.assetCount); diff --git a/lib/photo_sync_manager.dart b/lib/photo_sync_manager.dart index d0f3f690f..df5de28e8 100644 --- a/lib/photo_sync_manager.dart +++ b/lib/photo_sync_manager.dart @@ -54,23 +54,18 @@ class PhotoSyncManager { await PhotoProvider.instance.refreshGalleryList(); final pathEntities = PhotoProvider.instance.list; final photos = List(); + AssetPathEntity recents; for (AssetPathEntity pathEntity in pathEntities) { - if (Platform.isIOS || pathEntity.name != "Recent") { - // "Recents" contain duplicate information on Android - var assetList = await pathEntity.assetList; - for (AssetEntity entity in assetList) { - if (max(entity.createDateTime.microsecondsSinceEpoch, - entity.modifiedDateTime.microsecondsSinceEpoch) > - lastDBUpdateTimestamp) { - try { - photos.add(await Photo.fromAsset(pathEntity, entity)); - } catch (e) { - _logger.severe(e); - } - } - } + if (pathEntity.name == "Recent" || pathEntity.name == "Recents") { + recents = pathEntity; + } else { + await _addToPhotos(pathEntity, lastDBUpdateTimestamp, photos); } } + if (recents != null) { + await _addToPhotos(recents, lastDBUpdateTimestamp, photos); + } + if (photos.isEmpty) { _isSyncInProgress = false; _syncWithRemote(prefs); @@ -84,6 +79,25 @@ class PhotoSyncManager { } } + Future _addToPhotos(AssetPathEntity pathEntity, int lastDBUpdateTimestamp, + List photos) async { + final assetList = await pathEntity.assetList; + for (AssetEntity entity in assetList) { + if (max(entity.createDateTime.microsecondsSinceEpoch, + entity.modifiedDateTime.microsecondsSinceEpoch) > + lastDBUpdateTimestamp) { + try { + final photo = await Photo.fromAsset(pathEntity, entity); + if (!photos.contains(photo)) { + photos.add(photo); + } + } catch (e) { + _logger.severe(e); + } + } + } + } + Future _syncWithRemote(SharedPreferences prefs) { // TODO: Fix race conditions triggered due to concurrent syncs. // Add device_id/last_sync_timestamp to the upload request?