diff --git a/lib/services/collections_service.dart b/lib/services/collections_service.dart index b31ed7873..062b8d725 100644 --- a/lib/services/collections_service.dart +++ b/lib/services/collections_service.dart @@ -15,16 +15,21 @@ import 'package:photos/events/collection_updated_event.dart'; import 'package:photos/models/collection.dart'; import 'package:photos/models/collection_file_item.dart'; import 'package:photos/models/file.dart'; +import 'package:photos/repositories/file_repository.dart'; import 'package:photos/services/sync_service.dart'; import 'package:photos/utils/crypto_util.dart'; import 'package:photos/utils/file_util.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class CollectionsService { + static final _collectionSyncTimeKeyPrefix = "collection_sync_time_"; + final _logger = Logger("CollectionsService"); CollectionsDB _db; FilesDB _filesDB; Configuration _config; + SharedPreferences _prefs; final _dio = Network.instance.getDio(); final _localCollections = Map(); final _collectionIDToCollections = Map(); @@ -40,13 +45,14 @@ class CollectionsService { CollectionsService._privateConstructor(); Future init() async { + _prefs = await SharedPreferences.getInstance(); final collections = await _db.getAllCollections(); for (final collection in collections) { _cacheCollectionAttributes(collection); } } - Future sync() async { + Future> sync() async { _logger.info("Syncing"); final lastCollectionUpdationTime = await _db.getLastCollectionUpdationTime(); @@ -57,6 +63,8 @@ class CollectionsService { if (collection.isDeleted) { await _filesDB.deleteCollection(collection.id); await _db.deleteCollection(collection.id); + await setCollectionSyncTime(collection.id, null); + FileRepository.instance.reloadFiles(); } else { updatedCollections.add(collection); } @@ -70,6 +78,24 @@ class CollectionsService { _logger.info("Collections updated"); Bus.instance.fire(CollectionUpdatedEvent()); } + return updatedCollections; + } + + int getCollectionSyncTime(int collectionID) { + var syncTime = + _prefs.getInt(_collectionSyncTimeKeyPrefix + collectionID.toString()); + if (syncTime == null) { + syncTime = 0; + } + return syncTime; + } + + Future setCollectionSyncTime(int collectionID, int time) async { + final key = _collectionSyncTimeKeyPrefix + collectionID.toString(); + if (time == null) { + return _prefs.remove(key); + } + return _prefs.setInt(key, time); } Collection getCollectionForPath(String path) { @@ -103,18 +129,16 @@ class CollectionsService { Future share(int collectionID, String email, String publicKey) { final encryptedKey = CryptoUtil.sealSync( getCollectionKey(collectionID), Sodium.base642bin(publicKey)); - return _dio - .post( - Configuration.instance.getHttpEndpoint() + "/collections/share", - data: { - "collectionID": collectionID, - "email": email, - "encryptedKey": Sodium.bin2base64(encryptedKey), - }, - options: Options( - headers: {"X-Auth-Token": Configuration.instance.getToken()}), - ) - .then((value) => sync()); + return _dio.post( + Configuration.instance.getHttpEndpoint() + "/collections/share", + data: { + "collectionID": collectionID, + "email": email, + "encryptedKey": Sodium.bin2base64(encryptedKey), + }, + options: + Options(headers: {"X-Auth-Token": Configuration.instance.getToken()}), + ); } Future unshare(int collectionID, String email) { diff --git a/lib/services/sync_service.dart b/lib/services/sync_service.dart index f663ba3da..e3b68b679 100644 --- a/lib/services/sync_service.dart +++ b/lib/services/sync_service.dart @@ -39,7 +39,6 @@ class SyncService { SharedPreferences _prefs; SyncStatusUpdate _lastSyncStatusEvent; - static final _collectionSyncTimeKeyPrefix = "collection_sync_time_"; static final _dbUpdationTimeKey = "db_updation_time"; static final _diffLimit = 100; @@ -169,18 +168,17 @@ class SyncService { files.removeWhere((file) => existingLocalFileIDs.contains(file.localID)); await _db.insertMultiple(files); _logger.info("Inserted " + files.length.toString() + " files."); - await _prefs.setInt(_dbUpdationTimeKey, toTime); await FileRepository.instance.reloadFiles(); } + await _prefs.setInt(_dbUpdationTimeKey, toTime); } Future syncWithRemote() async { if (!Configuration.instance.hasConfiguredAccount()) { return Future.error("Account not configured yet"); } - await _collectionsService.sync(); - final collections = _collectionsService.getCollections(); - for (final collection in collections) { + final updatedCollections = await _collectionsService.sync(); + for (final collection in updatedCollections) { await _fetchEncryptedFilesDiff(collection.id); } await deleteFilesOnServer(); @@ -190,7 +188,7 @@ class SyncService { Future _fetchEncryptedFilesDiff(int collectionID) async { final diff = await _downloader.getEncryptedFilesDiff( collectionID, - _getCollectionSyncTime(collectionID), + _collectionsService.getCollectionSyncTime(collectionID), _diffLimit, ); if (diff.isNotEmpty) { @@ -204,20 +202,6 @@ class SyncService { } } - int _getCollectionSyncTime(int collectionID) { - var syncTime = - _prefs.getInt(_collectionSyncTimeKeyPrefix + collectionID.toString()); - if (syncTime == null) { - syncTime = 0; - } - return syncTime; - } - - Future _setCollectionSyncTime(int collectionID, int time) async { - return _prefs.setInt( - _collectionSyncTimeKeyPrefix + collectionID.toString(), time); - } - Future _uploadDiff() async { final foldersToBackUp = Configuration.instance.getPathsToBackUp(); final filesToBeUploaded = @@ -323,7 +307,8 @@ class SyncService { } } } - await _setCollectionSyncTime(collectionID, file.updationTime); + await _collectionsService.setCollectionSyncTime( + collectionID, file.updationTime); } } diff --git a/lib/utils/file_downloader.dart b/lib/utils/file_downloader.dart index 6135a5fca..77f147c37 100644 --- a/lib/utils/file_downloader.dart +++ b/lib/utils/file_downloader.dart @@ -10,6 +10,7 @@ import 'package:photos/db/files_db.dart'; import 'package:photos/events/collection_updated_event.dart'; import 'package:photos/events/remote_sync_event.dart'; import 'package:photos/models/file.dart'; +import 'package:photos/repositories/file_repository.dart'; import 'package:photos/utils/crypto_util.dart'; import 'package:photos/utils/file_util.dart'; @@ -45,6 +46,7 @@ class DiffFetcher { file.uploadedFileID, file.collectionID); Bus.instance.fire( CollectionUpdatedEvent(collectionID: file.collectionID)); + FileRepository.instance.reloadFiles(); continue; } file.updationTime = item["updationTime"];