From 1e995204735e1074b0a42732c9bbfdca7b792b63 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Nicolas <6371790+pynicolas@users.noreply.github.com> Date: Thu, 2 Apr 2026 17:48:12 +0200 Subject: [PATCH] Thumbnails: avoid loading many Bitmaps, increase cache size --- app/src/main/java/org/fairscan/app/MainViewModel.kt | 2 +- .../main/java/org/fairscan/app/data/ImageRepository.kt | 2 +- app/src/main/java/org/fairscan/app/ui/PreviewUtils.kt | 10 +++------- .../fairscan/app/ui/screens/document/DocumentScreen.kt | 2 +- .../java/org/fairscan/app/ui/state/DocumentUiModel.kt | 5 +++-- 5 files changed, 9 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/fairscan/app/MainViewModel.kt b/app/src/main/java/org/fairscan/app/MainViewModel.kt index 2740cd1..db07988 100644 --- a/app/src/main/java/org/fairscan/app/MainViewModel.kt +++ b/app/src/main/java/org/fairscan/app/MainViewModel.kt @@ -63,7 +63,7 @@ class MainViewModel(val imageRepository: ImageRepository, launchMode: LaunchMode _pages.map { pages -> pages.map { val jpeg = imageRepository.getThumbnail(it.key()) - PageThumbnail(it.key(), jpeg?.toBitmap()) + PageThumbnail(it.key(), jpeg) }.toImmutableList() } .flowOn(Dispatchers.IO) diff --git a/app/src/main/java/org/fairscan/app/data/ImageRepository.kt b/app/src/main/java/org/fairscan/app/data/ImageRepository.kt index 3b45627..ab6bd62 100644 --- a/app/src/main/java/org/fairscan/app/data/ImageRepository.kt +++ b/app/src/main/java/org/fairscan/app/data/ImageRepository.kt @@ -67,7 +67,7 @@ class ImageRepository( private val processingJobs = synchronizedMap(mutableMapOf>()) private val imageCache = createLruCache>(maxEntries = 50) - private val thumbnailCache = createLruCache>(maxEntries = 200) + private val thumbnailCache = createLruCache>(maxEntries = 1000) private fun createLruCache(maxEntries: Int): MutableMap = synchronizedMap(object : LinkedHashMap(16, 0.75f, true) { diff --git a/app/src/main/java/org/fairscan/app/ui/PreviewUtils.kt b/app/src/main/java/org/fairscan/app/ui/PreviewUtils.kt index 0fc6e41..2c6ae74 100644 --- a/app/src/main/java/org/fairscan/app/ui/PreviewUtils.kt +++ b/app/src/main/java/org/fairscan/app/ui/PreviewUtils.kt @@ -15,11 +15,10 @@ package org.fairscan.app.ui import android.content.Context -import android.graphics.Bitmap -import android.graphics.BitmapFactory import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList +import org.fairscan.app.domain.Jpeg import org.fairscan.app.domain.PageViewKey import org.fairscan.app.domain.Rotation import org.fairscan.app.ui.state.DocumentUiModel @@ -41,8 +40,5 @@ fun fakeDocument(pageIds: ImmutableList, context: Context): DocumentUiMo return DocumentUiModel(pageKeys) } -fun fakeImage(id: String, context: Context): Bitmap = - context.assets.open("${id}.jpg").use { input -> - BitmapFactory.decodeStream(input) - } - +fun fakeImage(id: String, context: Context): Jpeg = + Jpeg(context.assets.open("${id}.jpg").readBytes()) diff --git a/app/src/main/java/org/fairscan/app/ui/screens/document/DocumentScreen.kt b/app/src/main/java/org/fairscan/app/ui/screens/document/DocumentScreen.kt index 5930fdf..498986e 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/document/DocumentScreen.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/document/DocumentScreen.kt @@ -339,7 +339,7 @@ private fun BottomBar( @Preview(name = "Landscape", showBackground = true, widthDp = 640, heightDp = 320) fun DocumentScreenPreview() { FairScanTheme { - val image = fakeImage("gallica.bnf.fr-bpt6k5530456s-1", LocalContext.current) + val image = fakeImage("gallica.bnf.fr-bpt6k5530456s-1", LocalContext.current).toBitmap() val document = fakeDocument( listOf(1, 2).map { "gallica.bnf.fr-bpt6k5530456s-$it" }.toImmutableList(), LocalContext.current diff --git a/app/src/main/java/org/fairscan/app/ui/state/DocumentUiModel.kt b/app/src/main/java/org/fairscan/app/ui/state/DocumentUiModel.kt index 1a47814..c0dea9f 100644 --- a/app/src/main/java/org/fairscan/app/ui/state/DocumentUiModel.kt +++ b/app/src/main/java/org/fairscan/app/ui/state/DocumentUiModel.kt @@ -17,6 +17,7 @@ package org.fairscan.app.ui.state import android.graphics.Bitmap import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf +import org.fairscan.app.domain.Jpeg import org.fairscan.app.domain.PageViewKey data class DocumentUiModel( @@ -32,11 +33,11 @@ data class DocumentUiModel( return pages.lastIndex } fun thumbnail(index: Int): Bitmap? { - return pages[index].thumbnail + return pages[index].thumbnail?.toBitmap() } } data class PageThumbnail( val key: PageViewKey, - val thumbnail: Bitmap?, + val thumbnail: Jpeg?, )