diff --git a/mobile/lib/modules/asset_viewer/image_providers/cache/image_loader.dart b/mobile/lib/modules/asset_viewer/image_providers/cache/image_loader.dart index 209955bcb5..f2b53733d2 100644 --- a/mobile/lib/modules/asset_viewer/image_providers/cache/image_loader.dart +++ b/mobile/lib/modules/asset_viewer/image_providers/cache/image_loader.dart @@ -13,7 +13,7 @@ import 'package:immich_mobile/shared/models/store.dart'; class ImageLoader { static Future loadImageFromCache( String uri, { - required ImageCacheManager cache, + required CacheManager cache, required ImageDecoderCallback decode, StreamController? chunkEvents, }) async { @@ -21,7 +21,7 @@ class ImageLoader { 'x-immich-user-token': Store.get(StoreKey.accessToken), }; - final stream = cache.getImageFile( + final stream = cache.getFileStream( uri, withProgress: chunkEvents != null, headers: headers, diff --git a/mobile/lib/modules/asset_viewer/image_providers/cache/remote_image_cache_manager.dart b/mobile/lib/modules/asset_viewer/image_providers/cache/remote_image_cache_manager.dart index b0f242a99f..da20f46c62 100644 --- a/mobile/lib/modules/asset_viewer/image_providers/cache/remote_image_cache_manager.dart +++ b/mobile/lib/modules/asset_viewer/image_providers/cache/remote_image_cache_manager.dart @@ -1,7 +1,7 @@ import 'package:flutter_cache_manager/flutter_cache_manager.dart'; /// The cache manager for full size images [ImmichRemoteImageProvider] -class RemoteImageCacheManager extends CacheManager with ImageCacheManager { +class RemoteImageCacheManager extends CacheManager { static const key = 'remoteImageCacheKey'; static final RemoteImageCacheManager _instance = RemoteImageCacheManager._(); diff --git a/mobile/lib/modules/asset_viewer/image_providers/cache/thumbnail_image_cache_manager.dart b/mobile/lib/modules/asset_viewer/image_providers/cache/thumbnail_image_cache_manager.dart index 8bd320b723..dd7ad35277 100644 --- a/mobile/lib/modules/asset_viewer/image_providers/cache/thumbnail_image_cache_manager.dart +++ b/mobile/lib/modules/asset_viewer/image_providers/cache/thumbnail_image_cache_manager.dart @@ -1,7 +1,7 @@ import 'package:flutter_cache_manager/flutter_cache_manager.dart'; /// The cache manager for thumbnail images [ImmichRemoteThumbnailProvider] -class ThumbnailImageCacheManager extends CacheManager with ImageCacheManager { +class ThumbnailImageCacheManager extends CacheManager { static const key = 'thumbnailImageCacheKey'; static final ThumbnailImageCacheManager _instance = ThumbnailImageCacheManager._(); diff --git a/mobile/lib/modules/asset_viewer/image_providers/immich_local_image_provider.dart b/mobile/lib/modules/asset_viewer/image_providers/immich_local_image_provider.dart index 3094c69076..d1e154e368 100644 --- a/mobile/lib/modules/asset_viewer/image_providers/immich_local_image_provider.dart +++ b/mobile/lib/modules/asset_viewer/image_providers/immich_local_image_provider.dart @@ -10,7 +10,6 @@ import 'package:immich_mobile/shared/models/asset.dart'; import 'package:photo_manager/photo_manager.dart'; /// The local image provider for an asset -/// Only viable class ImmichLocalImageProvider extends ImageProvider { final Asset asset; @@ -94,9 +93,12 @@ class ImmichLocalImageProvider extends ImageProvider { @override bool operator ==(Object other) { - if (other is! ImmichLocalImageProvider) return false; if (identical(this, other)) return true; - return asset == other.asset; + if (other is ImmichLocalImageProvider) { + return asset == other.asset; + } + + return false; } @override diff --git a/mobile/lib/modules/asset_viewer/image_providers/immich_remote_image_provider.dart b/mobile/lib/modules/asset_viewer/image_providers/immich_remote_image_provider.dart index 095f15b82e..dc26c06acb 100644 --- a/mobile/lib/modules/asset_viewer/image_providers/immich_remote_image_provider.dart +++ b/mobile/lib/modules/asset_viewer/image_providers/immich_remote_image_provider.dart @@ -21,7 +21,7 @@ class ImmichRemoteImageProvider final String assetId; /// The image cache manager - final ImageCacheManager? cacheManager; + final CacheManager? cacheManager; ImmichRemoteImageProvider({ required this.assetId, @@ -66,7 +66,7 @@ class ImmichRemoteImageProvider // Streams in each stage of the image as we ask for it Stream _codec( ImmichRemoteImageProvider key, - ImageCacheManager cache, + CacheManager cache, ImageDecoderCallback decode, StreamController chunkEvents, ) async* { diff --git a/mobile/lib/modules/asset_viewer/image_providers/immich_remote_thumbnail_provider.dart b/mobile/lib/modules/asset_viewer/image_providers/immich_remote_thumbnail_provider.dart index 84fdbd7403..dac196af05 100644 --- a/mobile/lib/modules/asset_viewer/image_providers/immich_remote_thumbnail_provider.dart +++ b/mobile/lib/modules/asset_viewer/image_providers/immich_remote_thumbnail_provider.dart @@ -22,7 +22,7 @@ class ImmichRemoteThumbnailProvider final int? width; /// The image cache manager - final ImageCacheManager? cacheManager; + final CacheManager? cacheManager; ImmichRemoteThumbnailProvider({ required this.assetId, @@ -55,7 +55,7 @@ class ImmichRemoteThumbnailProvider // Streams in each stage of the image as we ask for it Stream _codec( ImmichRemoteThumbnailProvider key, - ImageCacheManager cache, + CacheManager cache, ImageDecoderCallback decode, ) async* { // Load a preview to the chunk events diff --git a/mobile/lib/shared/cache/custom_image_cache.dart b/mobile/lib/shared/cache/custom_image_cache.dart index 3f8b35e3fa..07e686e1cf 100644 --- a/mobile/lib/shared/cache/custom_image_cache.dart +++ b/mobile/lib/shared/cache/custom_image_cache.dart @@ -1,12 +1,14 @@ import 'package:flutter/painting.dart'; import 'package:immich_mobile/modules/asset_viewer/image_providers/immich_local_image_provider.dart'; +import 'package:immich_mobile/modules/asset_viewer/image_providers/immich_local_thumbnail_provider.dart'; import 'package:immich_mobile/modules/asset_viewer/image_providers/immich_remote_image_provider.dart'; +import 'package:immich_mobile/modules/asset_viewer/image_providers/immich_remote_thumbnail_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(); + final _large = ImageCache()..maximumSize = 5; // Maximum 5 images @override int get maximumSize => _small.maximumSize + _large.maximumSize; @@ -33,6 +35,8 @@ final class CustomImageCache implements ImageCache { } /// Gets the cache for the given key + /// [_large] is used for [ImmichLocalImageProvider] and [ImmichRemoteImageProvider] + /// [_small] is used for [ImmichLocalThumbnailProvider] and [ImmichRemoteThumbnailProvider] ImageCache _cacheForKey(Object key) => (key is ImmichLocalImageProvider || key is ImmichRemoteImageProvider) ? _large