From 85f155fe1488e0418135a1408d05051b476b536e Mon Sep 17 00:00:00 2001 From: Vishnu Mohandas Date: Fri, 7 May 2021 20:59:33 +0530 Subject: [PATCH] Maintain disk cache for thumbnails by self --- lib/core/configuration.dart | 7 ++++ lib/utils/file_util.dart | 8 ++++- lib/utils/thumbnail_util.dart | 64 ++++++++++++++++++----------------- 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/lib/core/configuration.dart b/lib/core/configuration.dart index 17f1876f7..3d6c67f73 100644 --- a/lib/core/configuration.dart +++ b/lib/core/configuration.dart @@ -54,6 +54,7 @@ class Configuration { String _secretKey; FlutterSecureStorage _secureStorage; String _tempDirectory; + String _thumbnailCacheDirectory; Future 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; } diff --git a/lib/utils/file_util.dart b/lib/utils/file_util.dart index d2c9b393d..b44b2b625 100644 --- a/lib/utils/file_util.dart +++ b/lib/utils/file_util.dart @@ -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(); + } } diff --git a/lib/utils/thumbnail_util.dart b/lib/utils/thumbnail_util.dart index 170846bf9..8ada71e9d 100644 --- a/lib/utils/thumbnail_util.dart +++ b/lib/utils/thumbnail_util.dart @@ -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(); final _queue = Queue(); @@ -30,31 +31,27 @@ class FileDownloadItem { } Future getThumbnailFromServer(File file) async { - return ThumbnailCacheManager.instance - .getFileFromCache(file.getThumbnailUrl()) - .then((info) { - if (info == null) { - if (!_map.containsKey(file.uploadedFileID)) { - if (_queue.length == kMaximumConcurrentDownloads) { - final id = _queue.removeFirst(); - final item = _map.remove(id); - item.cancelToken.cancel(); - item.completer.completeError(RequestCancelledError()); - } - final item = - FileDownloadItem(file, Completer(), CancelToken()); - _map[file.uploadedFileID] = item; - _queue.add(file.uploadedFileID); - _downloadItem(item); - return item.completer.future; - } else { - return _map[file.uploadedFileID].completer.future; - } - } else { - ThumbnailLruCache.put(file, info.file.readAsBytesSync()); - return info.file.readAsBytes(); + 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(); + final item = _map.remove(id); + item.cancelToken.cancel(); + item.completer.completeError(RequestCancelledError()); } - }); + final item = FileDownloadItem(file, Completer(), CancelToken()); + _map[file.uploadedFileID] = item; + _queue.add(file.uploadedFileID); + _downloadItem(item); + return item.completer.future; + } else { + return _map[file.uploadedFileID].completer.future; + } } void removePendingGetThumbnailRequestIfAny(File file) { @@ -110,12 +107,11 @@ Future _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 _downloadAndDecryptThumbnail(FileDownloadItem item) async { } } } + +io.File getCachedThumbnail(File file) { + final thumbnailCacheDirectory = + Configuration.instance.getThumbnailCacheDirectory(); + return io.File(thumbnailCacheDirectory + "/" + file.uploadedFileID.toString()); +} \ No newline at end of file