diff --git a/lib/db/files_db.dart b/lib/db/files_db.dart index 4fe8f406f..badf7dde0 100644 --- a/lib/db/files_db.dart +++ b/lib/db/files_db.dart @@ -341,6 +341,18 @@ class FilesDB { } } + Future doesFileExistInCollection( + int uploadedFileID, int collectionID) async { + final db = await instance.database; + final rows = await db.query( + table, + where: '$columnUploadedFileID = ? AND $columnCollectionID = ?', + whereArgs: [uploadedFileID, collectionID], + limit: 1, + ); + return rows.isNotEmpty; + } + List _convertToFiles(List> results) { final files = List(); for (final result in results) { diff --git a/lib/main.dart b/lib/main.dart index 89ad8c972..8d085eaa0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,7 +6,6 @@ import 'package:path_provider/path_provider.dart'; import 'package:photos/core/constants.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/services/collections_service.dart'; -import 'package:photos/services/favorites_service.dart'; import 'package:photos/services/memories_service.dart'; import 'package:photos/services/sync_service.dart'; import 'package:photos/ui/home_widget.dart'; @@ -34,7 +33,6 @@ void _main() async { await CollectionsService.instance.init(); await SyncService.instance.init(); await MemoriesService.instance.init(); - await FavoritesService.instance.init(); _sync(); final SentryClient sentry = new SentryClient(dsn: SENTRY_DSN); diff --git a/lib/services/favorites_service.dart b/lib/services/favorites_service.dart index dd1c52d2d..3210013e9 100644 --- a/lib/services/favorites_service.dart +++ b/lib/services/favorites_service.dart @@ -6,16 +6,13 @@ import 'package:photos/models/file.dart'; import 'package:photos/services/collections_service.dart'; import 'package:photos/utils/crypto_util.dart'; import 'package:photos/utils/file_uploader.dart'; -import 'package:shared_preferences/shared_preferences.dart'; class FavoritesService { - static final _favoritesCollectionIDKey = "favorites_collection_id"; - - final _cachedFavoriteFiles = Set(); Configuration _config; CollectionsService _collectionsService; FileUploader _fileUploader; FilesDB _filesDB; + int _cachedFavoritesCollectionID; FavoritesService._privateConstructor() { _config = Configuration.instance; @@ -25,23 +22,13 @@ class FavoritesService { } static FavoritesService instance = FavoritesService._privateConstructor(); - SharedPreferences _preferences; - - Future init() async { - _preferences = await SharedPreferences.getInstance(); - if (_preferences.containsKey(_favoritesCollectionIDKey)) { - final collectionID = _preferences.getInt(_favoritesCollectionIDKey); - _cachedFavoriteFiles - .addAll((await _filesDB.getAllInCollection(collectionID)).toSet()); + Future isFavorite(File file) async { + final collection = await _getFavoritesCollection(); + if (collection == null) { + return false; } - } - - Set getFavoriteFiles() { - return _cachedFavoriteFiles; - } - - bool isLiked(File file) { - return _cachedFavoriteFiles.contains(file); + return _filesDB.doesFileExistInCollection( + file.uploadedFileID, collection.id); } Future addToFavorites(File file) async { @@ -52,7 +39,6 @@ class FavoritesService { await _filesDB.update(uploadedFile); } else { await _collectionsService.addToCollection(collectionID, [file]); - _cachedFavoriteFiles.add(file); } } @@ -63,28 +49,26 @@ class FavoritesService { // Do nothing, ignore } else { await _collectionsService.removeFromCollection(collectionID, [file]); - _cachedFavoriteFiles.remove(file); } } - Future getFavoritesCollection() async { - if (!_preferences.containsKey(_favoritesCollectionIDKey)) { + Future _getFavoritesCollection() async { + if (_cachedFavoritesCollectionID == null) { final collections = _collectionsService.getCollections(); for (final collection in collections) { if (collection.type == CollectionType.favorites) { - await _preferences.setInt(_favoritesCollectionIDKey, collection.id); + _cachedFavoritesCollectionID = collection.id; return collection; } } return null; } - return _collectionsService - .getCollectionByID(_preferences.getInt(_favoritesCollectionIDKey)); + return _collectionsService.getCollectionByID(_cachedFavoritesCollectionID); } Future _getOrCreateFavoriteCollectionID() async { - if (_preferences.containsKey(_favoritesCollectionIDKey)) { - return _preferences.getInt(_favoritesCollectionIDKey); + if (_cachedFavoritesCollectionID != null) { + return _cachedFavoritesCollectionID; } final key = CryptoUtil.generateKey(); final encryptedKeyData = CryptoUtil.encryptSync(key, _config.getKey()); @@ -100,7 +84,7 @@ class FavoritesService { CollectionAttributes(), null, )); - await _preferences.setInt(_favoritesCollectionIDKey, collection.id); + _cachedFavoritesCollectionID = collection.id; return collection.id; } } diff --git a/lib/ui/collections_gallery_widget.dart b/lib/ui/collections_gallery_widget.dart index efba371fe..5cf6dc74b 100644 --- a/lib/ui/collections_gallery_widget.dart +++ b/lib/ui/collections_gallery_widget.dart @@ -128,18 +128,6 @@ class _CollectionsGalleryWidgetState extends State { }); final collectionsWithThumbnail = List(); - final favorites = FavoritesService.instance.getFavoriteFiles().toList(); - favorites.sort((first, second) { - return second.creationTime.compareTo(first.creationTime); - }); - if (favorites.length > 0) { - final favoritesCollection = - await FavoritesService.instance.getFavoritesCollection(); - final lastUpdatedFile = await FilesDB.instance - .getLastModifiedFileInCollection(favoritesCollection.id); - collectionsWithThumbnail.add(CollectionWithThumbnail( - favoritesCollection, favorites[0], lastUpdatedFile)); - } final collections = CollectionsService.instance.getCollections(); for (final c in collections) { diff --git a/lib/ui/detail_page.dart b/lib/ui/detail_page.dart index 398931660..9cdda3aee 100644 --- a/lib/ui/detail_page.dart +++ b/lib/ui/detail_page.dart @@ -178,8 +178,22 @@ class _DetailPageState extends State { Widget _getFavoriteButton() { final file = _files[_selectedIndex]; + + return FutureBuilder( + future: FavoritesService.instance.isFavorite(file), + builder: (context, snapshot) { + if (snapshot.hasData) { + return _getLikeButton(file, snapshot.data); + } else { + return _getLikeButton(file, false); + } + }, + ); + } + + Widget _getLikeButton(File file, bool isLiked) { return LikeButton( - isLiked: FavoritesService.instance.isLiked(file.uploadedFileID), + isLiked: isLiked, onTap: (oldValue) async { final isLiked = !oldValue; bool hasError = false;