ente/lib/services/favorites_service.dart

95 lines
2.9 KiB
Dart
Raw Normal View History

import 'package:flutter_sodium/flutter_sodium.dart';
import 'package:photos/core/configuration.dart';
import 'package:photos/core/event_bus.dart';
import 'package:photos/events/local_photos_updated_event.dart';
import 'package:photos/models/collection.dart';
2020-06-19 23:03:26 +00:00
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';
2020-05-06 16:43:03 +00:00
import 'package:shared_preferences/shared_preferences.dart';
2020-10-03 17:56:18 +00:00
class FavoritesService {
2020-05-06 16:43:03 +00:00
static final _favoritePhotoIdsKey = "favorite_photo_ids";
static final _favoritesCollectionIDKey = "favorites_collection_id";
Configuration _config;
CollectionsService _collectionsService;
FileUploader _fileUploader;
FavoritesService._privateConstructor() {
_config = Configuration.instance;
_collectionsService = CollectionsService.instance;
_fileUploader = FileUploader.instance;
}
static FavoritesService instance = FavoritesService._privateConstructor();
2020-05-06 16:43:03 +00:00
SharedPreferences _preferences;
Future<void> init() async {
_preferences = await SharedPreferences.getInstance();
}
2020-06-19 23:03:26 +00:00
bool isLiked(File photo) {
2020-08-09 22:34:59 +00:00
return getLiked().contains(photo.generatedID.toString());
2020-05-06 18:13:24 +00:00
}
bool hasFavorites() {
return getLiked().isNotEmpty;
2020-05-06 16:43:03 +00:00
}
2020-06-19 23:03:26 +00:00
Future<bool> setLiked(File photo, bool isLiked) {
2020-05-06 18:13:24 +00:00
final liked = getLiked();
2020-05-06 16:43:03 +00:00
if (isLiked) {
2020-08-09 22:34:59 +00:00
liked.add(photo.generatedID.toString());
2020-05-06 16:43:03 +00:00
} else {
2020-08-09 22:34:59 +00:00
liked.remove(photo.generatedID.toString());
2020-05-06 16:43:03 +00:00
}
Bus.instance.fire(LocalPhotosUpdatedEvent());
2020-05-06 16:43:03 +00:00
return _preferences
.setStringList(_favoritePhotoIdsKey, liked.toList())
.then((_) => isLiked);
}
2020-05-06 18:13:24 +00:00
Set<String> getLiked() {
2020-05-06 16:43:03 +00:00
final value = _preferences.getStringList(_favoritePhotoIdsKey);
if (value == null) {
return Set<String>();
} else {
return value.toSet();
}
}
Future<void> addToFavorites(File file) async {
final collectionID = await getOrCreateFavoriteCollectionID();
var fileID = file.uploadedFileID;
if (fileID == null) {
file.collectionID = collectionID;
fileID = (await _fileUploader.encryptAndUploadFile(file)).uploadedFileID;
}
return _collectionsService.addToCollection(collectionID, [file]);
}
Future<int> getOrCreateFavoriteCollectionID() async {
if (_preferences.containsKey(_favoritesCollectionIDKey)) {
return _preferences.getInt(_favoritesCollectionIDKey);
}
final key = CryptoUtil.generateKey();
final encryptedKeyData = CryptoUtil.encryptSync(key, _config.getKey());
final collection =
await _collectionsService.createAndCacheCollection(Collection(
null,
null,
Sodium.bin2base64(encryptedKeyData.encryptedData),
Sodium.bin2base64(encryptedKeyData.nonce),
"Favorites",
CollectionType.favorites,
null,
null,
null,
));
await _preferences.setInt(_favoritesCollectionIDKey, collection.id);
return collection.id;
}
2020-05-06 16:43:03 +00:00
}