diff --git a/mobile/lib/db/local/db.dart b/mobile/lib/db/local/db.dart index 75c6575093..3ed295389b 100644 --- a/mobile/lib/db/local/db.dart +++ b/mobile/lib/db/local/db.dart @@ -4,6 +4,7 @@ import "package:path/path.dart"; import "package:path_provider/path_provider.dart"; import "package:photos/db/local/migration.dart"; import "package:photos/log/devlog.dart"; +import "package:photos/services/remote_pull/local/import/model.dart"; import "package:sqlite_async/sqlite_async.dart"; class LocalDB { @@ -23,6 +24,8 @@ class LocalDB { devLog("LocalDB init complete $path"); } + Future storeIncrementalDiff(IncrementalDiffWithOnDevice diff) async {} + Future> getAssetsIDs() async { final result = await _sqliteDB.execute("SELECT id FROM assets"); final ids = {}; diff --git a/mobile/lib/db/local/mappers.dart b/mobile/lib/db/local/mappers.dart new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mobile/lib/services/remote_pull/local/import/local_assets.service.dart b/mobile/lib/services/remote_pull/local/import/local_assets.service.dart index 6d28b0917c..7342c3cf9a 100644 --- a/mobile/lib/services/remote_pull/local/import/local_assets.service.dart +++ b/mobile/lib/services/remote_pull/local/import/local_assets.service.dart @@ -20,7 +20,7 @@ class DeviceAssetsService { required int fromTimeInMs, required int toTimeInMs, }) async { - final newOrUpdatedDevicePaths = await getDevicePathAssets( + final newOrUpdatedDevicePaths = await _getDevicePathAssets( fromTimeInMs: fromTimeInMs, toTimeInMs: toTimeInMs, ); @@ -46,7 +46,7 @@ class DeviceAssetsService { Map> inAppPathToLocalIDs, TimeLogger tL, ) async { - final allOnDeviceAssets = await getDevicePathAssets(); + final allOnDeviceAssets = await _getDevicePathAssets(); final String logMsg = "fetched allDeviceAssets $tL"; final r = await Computer.shared() .compute( @@ -62,7 +62,7 @@ class DeviceAssetsService { return r; } - Future> getDevicePathAssets({ + Future> _getDevicePathAssets({ int? fromTimeInMs, int? toTimeInMs, }) async { @@ -226,19 +226,38 @@ class DeviceAssetsService { Future _computeIncrementalDiffWithOnDevice( IncrementalDiffReqParams req, ) async { - final assetList = args["assetList"]; - final fromTimeInMs = args["fromTimeInMs"]; - final List filteredAssets = []; - for (AssetEntity entity in assetList) { - final bool assetCreatedOrUpdatedAfterGivenTime = max( - entity.createDateTime.millisecondsSinceEpoch, - entity.modifiedDateTime.millisecondsSinceEpoch, - ) >= - (fromTimeInMs); - if (assetCreatedOrUpdatedAfterGivenTime) { - filteredAssets.add(entity); + final List addedOrModifiedPaths = []; + final List addedOrModifiedAssets = []; + final Set processedAssetIds = {}; + final Set updatedInAppAssetIds = {}; + final Map> newOrUpdatedPathToLocalIDs = {}; + final int fromInSec = req.fromTimeInMs ~/ 1000; + for (final DevicePathAssets pathAssets in req.newOrUpdatedLocalPaths) { + final String pathID = pathAssets.path.id; + final Set localIDs = {}; + for (final AssetEntity asset in pathAssets.assets) { + final String assetID = asset.id; + localIDs.add(assetID); + if (processedAssetIds.contains(assetID) || + max(asset.createDateSecond ?? 0, asset.modifiedDateSecond ?? 0) < + fromInSec) { + continue; + } + + processedAssetIds.add(assetID); + addedOrModifiedAssets.add(asset); + if (req.inAppAssetIDs.contains(assetID)) { + updatedInAppAssetIds.add(assetID); + } } + + newOrUpdatedPathToLocalIDs[pathID] = localIDs; } - return filteredAssets; + return IncrementalDiffWithOnDevice( + addedOrModifiedPaths, + newOrUpdatedPathToLocalIDs, + addedOrModifiedAssets, + updatedInAppAssetIds, + ); } } diff --git a/mobile/lib/services/remote_pull/local/local_import.dart b/mobile/lib/services/remote_pull/local/local_import.dart index 5813343506..121cb13c10 100644 --- a/mobile/lib/services/remote_pull/local/local_import.dart +++ b/mobile/lib/services/remote_pull/local/local_import.dart @@ -73,9 +73,9 @@ class LocalImportService { final syncTime = DateTime.now().microsecondsSinceEpoch; final Set inAppAssetIds = await localDB.getAssetsIDs(); _log.info("${inAppAssetIds.length} assets in app $tl"); - final IncrementalDiffWithOnDevice diff = - await _deviceAssetsService.incrementalDiffWithOnDevice( + final diff = await _deviceAssetsService.incrementalDiffWithOnDevice( inAppAssetIds, + tl, fromTimeInMs: _prefs.getInt(lastLocalDBSyncTime) ?? 0, toTimeInMs: syncTime, ); @@ -90,7 +90,6 @@ class LocalImportService { _log.info("incrementalSync completed $tl"); } }); - _existingSync?.complete(); _existingSync = null; }