Thumbnails: avoid loading many Bitmaps, increase cache size
This commit is contained in:
@@ -63,7 +63,7 @@ class MainViewModel(val imageRepository: ImageRepository, launchMode: LaunchMode
|
|||||||
_pages.map { pages ->
|
_pages.map { pages ->
|
||||||
pages.map {
|
pages.map {
|
||||||
val jpeg = imageRepository.getThumbnail(it.key())
|
val jpeg = imageRepository.getThumbnail(it.key())
|
||||||
PageThumbnail(it.key(), jpeg?.toBitmap())
|
PageThumbnail(it.key(), jpeg)
|
||||||
}.toImmutableList()
|
}.toImmutableList()
|
||||||
}
|
}
|
||||||
.flowOn(Dispatchers.IO)
|
.flowOn(Dispatchers.IO)
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ class ImageRepository(
|
|||||||
|
|
||||||
private val processingJobs = synchronizedMap(mutableMapOf<PageViewKey, Deferred<Unit>>())
|
private val processingJobs = synchronizedMap(mutableMapOf<PageViewKey, Deferred<Unit>>())
|
||||||
private val imageCache = createLruCache<PageViewKey, Deferred<Jpeg?>>(maxEntries = 50)
|
private val imageCache = createLruCache<PageViewKey, Deferred<Jpeg?>>(maxEntries = 50)
|
||||||
private val thumbnailCache = createLruCache<PageViewKey, Deferred<Jpeg?>>(maxEntries = 200)
|
private val thumbnailCache = createLruCache<PageViewKey, Deferred<Jpeg?>>(maxEntries = 1000)
|
||||||
|
|
||||||
private fun <K, V> createLruCache(maxEntries: Int): MutableMap<K, V> =
|
private fun <K, V> createLruCache(maxEntries: Int): MutableMap<K, V> =
|
||||||
synchronizedMap(object : LinkedHashMap<K, V>(16, 0.75f, true) {
|
synchronizedMap(object : LinkedHashMap<K, V>(16, 0.75f, true) {
|
||||||
|
|||||||
@@ -15,11 +15,10 @@
|
|||||||
package org.fairscan.app.ui
|
package org.fairscan.app.ui
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.BitmapFactory
|
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
|
import org.fairscan.app.domain.Jpeg
|
||||||
import org.fairscan.app.domain.PageViewKey
|
import org.fairscan.app.domain.PageViewKey
|
||||||
import org.fairscan.app.domain.Rotation
|
import org.fairscan.app.domain.Rotation
|
||||||
import org.fairscan.app.ui.state.DocumentUiModel
|
import org.fairscan.app.ui.state.DocumentUiModel
|
||||||
@@ -41,8 +40,5 @@ fun fakeDocument(pageIds: ImmutableList<String>, context: Context): DocumentUiMo
|
|||||||
return DocumentUiModel(pageKeys)
|
return DocumentUiModel(pageKeys)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun fakeImage(id: String, context: Context): Bitmap =
|
fun fakeImage(id: String, context: Context): Jpeg =
|
||||||
context.assets.open("${id}.jpg").use { input ->
|
Jpeg(context.assets.open("${id}.jpg").readBytes())
|
||||||
BitmapFactory.decodeStream(input)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -339,7 +339,7 @@ private fun BottomBar(
|
|||||||
@Preview(name = "Landscape", showBackground = true, widthDp = 640, heightDp = 320)
|
@Preview(name = "Landscape", showBackground = true, widthDp = 640, heightDp = 320)
|
||||||
fun DocumentScreenPreview() {
|
fun DocumentScreenPreview() {
|
||||||
FairScanTheme {
|
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(
|
val document = fakeDocument(
|
||||||
listOf(1, 2).map { "gallica.bnf.fr-bpt6k5530456s-$it" }.toImmutableList(),
|
listOf(1, 2).map { "gallica.bnf.fr-bpt6k5530456s-$it" }.toImmutableList(),
|
||||||
LocalContext.current
|
LocalContext.current
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ package org.fairscan.app.ui.state
|
|||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
import org.fairscan.app.domain.Jpeg
|
||||||
import org.fairscan.app.domain.PageViewKey
|
import org.fairscan.app.domain.PageViewKey
|
||||||
|
|
||||||
data class DocumentUiModel(
|
data class DocumentUiModel(
|
||||||
@@ -32,11 +33,11 @@ data class DocumentUiModel(
|
|||||||
return pages.lastIndex
|
return pages.lastIndex
|
||||||
}
|
}
|
||||||
fun thumbnail(index: Int): Bitmap? {
|
fun thumbnail(index: Int): Bitmap? {
|
||||||
return pages[index].thumbnail
|
return pages[index].thumbnail?.toBitmap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data class PageThumbnail(
|
data class PageThumbnail(
|
||||||
val key: PageViewKey,
|
val key: PageViewKey,
|
||||||
val thumbnail: Bitmap?,
|
val thumbnail: Jpeg?,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user