Maintain disk cache for thumbnails by self

This commit is contained in:
Vishnu Mohandas 2021-05-07 20:59:33 +05:30
parent 1447d895d1
commit 85f155fe14
3 changed files with 47 additions and 32 deletions

View file

@ -54,6 +54,7 @@ class Configuration {
String _secretKey;
FlutterSecureStorage _secureStorage;
String _tempDirectory;
String _thumbnailCacheDirectory;
Future<void> init() async {
_preferences = await SharedPreferences.getInstance();
@ -76,6 +77,8 @@ class Configuration {
_logger.warning(e);
}
tempDirectory.createSync(recursive: true);
_thumbnailCacheDirectory = (await getTemporaryDirectory()).path + "/thumbnail-cache";
io.Directory(_thumbnailCacheDirectory).createSync(recursive: true);
if (!_preferences.containsKey(tokenKey)) {
await _secureStorage.deleteAll();
} else {
@ -367,6 +370,10 @@ class Configuration {
return _tempDirectory;
}
String getThumbnailCacheDirectory() {
return _thumbnailCacheDirectory;
}
bool hasConfiguredAccount() {
return getToken() != null && _key != null;
}

View file

@ -206,5 +206,11 @@ void clearCache(File file) {
} else {
DefaultCacheManager().removeFile(file.getDownloadUrl());
}
ThumbnailCacheManager.instance.removeFile(file.getThumbnailUrl());
final cachedThumbnail = io.File(
Configuration.instance.getThumbnailCacheDirectory() +
"/" +
file.uploadedFileID.toString());
if (cachedThumbnail.existsSync()) {
cachedThumbnail.deleteSync();
}
}

View file

@ -7,7 +7,6 @@ import 'package:dio/dio.dart';
import 'package:flutter_sodium/flutter_sodium.dart';
import 'package:logging/logging.dart';
import 'package:photos/core/cache/thumbnail_cache.dart';
import 'package:photos/core/cache/thumbnail_cache_manager.dart';
import 'package:photos/core/configuration.dart';
import 'package:photos/core/constants.dart';
import 'package:photos/core/errors.dart';
@ -16,6 +15,8 @@ import 'package:photos/models/file.dart';
import 'package:photos/utils/crypto_util.dart';
import 'package:photos/utils/file_util.dart';
import 'dart:io' as io;
final _logger = Logger("ThumbnailUtil");
final _map = LinkedHashMap<int, FileDownloadItem>();
final _queue = Queue<int>();
@ -30,10 +31,12 @@ class FileDownloadItem {
}
Future<Uint8List> getThumbnailFromServer(File file) async {
return ThumbnailCacheManager.instance
.getFileFromCache(file.getThumbnailUrl())
.then((info) {
if (info == null) {
final cachedThumbnail = getCachedThumbnail(file);
if (cachedThumbnail.existsSync()) {
final data = cachedThumbnail.readAsBytesSync();
ThumbnailLruCache.put(file, data);
return data;
}
if (!_map.containsKey(file.uploadedFileID)) {
if (_queue.length == kMaximumConcurrentDownloads) {
final id = _queue.removeFirst();
@ -41,8 +44,7 @@ Future<Uint8List> getThumbnailFromServer(File file) async {
item.cancelToken.cancel();
item.completer.completeError(RequestCancelledError());
}
final item =
FileDownloadItem(file, Completer<Uint8List>(), CancelToken());
final item = FileDownloadItem(file, Completer<Uint8List>(), CancelToken());
_map[file.uploadedFileID] = item;
_queue.add(file.uploadedFileID);
_downloadItem(item);
@ -50,11 +52,6 @@ Future<Uint8List> getThumbnailFromServer(File file) async {
} else {
return _map[file.uploadedFileID].completer.future;
}
} else {
ThumbnailLruCache.put(file, info.file.readAsBytesSync());
return info.file.readAsBytes();
}
});
}
void removePendingGetThumbnailRequestIfAny(File file) {
@ -110,12 +107,11 @@ Future<void> _downloadAndDecryptThumbnail(FileDownloadItem item) async {
data = await compressThumbnail(data);
}
ThumbnailLruCache.put(item.file, data);
ThumbnailCacheManager.instance.putFile(
file.getThumbnailUrl(),
data,
eTag: file.getThumbnailUrl(),
maxAge: Duration(days: 365),
);
final cachedThumbnail = getCachedThumbnail(item.file);
if (cachedThumbnail.existsSync()) {
cachedThumbnail.deleteSync();
}
cachedThumbnail.writeAsBytes(data);
if (_map.containsKey(file.uploadedFileID)) {
try {
item.completer.complete(data);
@ -125,3 +121,9 @@ Future<void> _downloadAndDecryptThumbnail(FileDownloadItem item) async {
}
}
}
io.File getCachedThumbnail(File file) {
final thumbnailCacheDirectory =
Configuration.instance.getThumbnailCacheDirectory();
return io.File(thumbnailCacheDirectory + "/" + file.uploadedFileID.toString());
}