import 'package:flutter/painting.dart'; import 'package:immich_mobile/modules/asset_viewer/image_providers/immich_local_image_provider.dart'; /// [ImageCache] that uses two caches for small and large images /// so that a single large image does not evict all small iamges final class CustomImageCache implements ImageCache { final _small = ImageCache(); final _large = ImageCache(); @override int get maximumSize => _small.maximumSize + _large.maximumSize; @override int get maximumSizeBytes => _small.maximumSizeBytes + _large.maximumSizeBytes; @override set maximumSize(int value) => _small.maximumSize = value; @override set maximumSizeBytes(int value) => _small.maximumSize = value; @override void clear() { _small.clear(); _large.clear(); } @override void clearLiveImages() { _small.clearLiveImages(); _large.clearLiveImages(); } @override bool containsKey(Object key) => (key is ImmichLocalImageProvider ? _large : _small).containsKey(key); @override int get currentSize => _small.currentSize + _large.currentSize; @override int get currentSizeBytes => _small.currentSizeBytes + _large.currentSizeBytes; @override bool evict(Object key, {bool includeLive = true}) => (key is ImmichLocalImageProvider ? _large : _small) .evict(key, includeLive: includeLive); @override int get liveImageCount => _small.liveImageCount + _large.liveImageCount; @override int get pendingImageCount => _small.pendingImageCount + _large.pendingImageCount; @override ImageStreamCompleter? putIfAbsent( Object key, ImageStreamCompleter Function() loader, { ImageErrorListener? onError, }) => (key is ImmichLocalImageProvider ? _large : _small) .putIfAbsent(key, loader, onError: onError); @override ImageCacheStatus statusForKey(Object key) => (key is ImmichLocalImageProvider ? _large : _small).statusForKey(key); }