commit 6f87d5961b509025eed859b7101318a4d9837115
parent 3d50054d3841f2c8e2ec313e4906eb55aa5bed1e
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Fri, 3 Jan 2025 00:37:42 +0100
perf(core/snap_preview): lazy loading
Signed-off-by: rhunk <101876869+rhunk@users.noreply.github.com>
Diffstat:
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/SnapPreview.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/SnapPreview.kt
@@ -6,11 +6,14 @@ import android.graphics.Paint
import android.graphics.drawable.ShapeDrawable
import android.graphics.drawable.shapes.Shape
import android.view.ViewGroup
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
import me.rhunk.snapenhance.common.data.ContentType
import me.rhunk.snapenhance.common.util.protobuf.ProtoReader
import me.rhunk.snapenhance.core.event.events.impl.BindViewEvent
import me.rhunk.snapenhance.core.features.Feature
import me.rhunk.snapenhance.core.ui.addForegroundDrawable
+import me.rhunk.snapenhance.core.ui.randomTag
import me.rhunk.snapenhance.core.ui.removeForegroundDrawable
import me.rhunk.snapenhance.core.util.EvictingMap
import me.rhunk.snapenhance.core.util.hook.HookStage
@@ -24,6 +27,8 @@ class SnapPreview : Feature("SnapPreview") {
private val mediaFileCache = EvictingMap<String, File>(500) // mMediaId => mediaFile
private val bitmapCache = EvictingMap<String, Bitmap>(50) // filePath => bitmap
+ private val fetchJobTab = randomTag()
+
override fun init() {
if (!context.config.userInterface.snapPreview.get()) return
context.mappings.useMapper(CallbackMapper::class) {
@@ -69,9 +74,21 @@ class SnapPreview : Feature("SnapPreview") {
val mediaIdKey = messageReader.getString(4, 5, 1, 3, 2, 2) ?: return@chatMessage
+ var mediaFile = mediaFileCache[mediaIdKey] ?: return@chatMessage
+ val mediaFilePath = mediaFile.absolutePath
+
+ (messageLinearLayout.getTag(fetchJobTab) as? Job)?.cancel()
+
+ if (bitmapCache[mediaFilePath] == null) {
+ messageLinearLayout.setTag(fetchJobTab, context.coroutineScope.launch {
+ bitmapCache[mediaFilePath] = decodeMedia(mediaFile) ?: return@launch
+ messageLinearLayout.postInvalidate()
+ })
+ }
+
messageLinearLayout.addForegroundDrawable("snapPreview", ShapeDrawable(object: Shape() {
override fun draw(canvas: Canvas, paint: Paint) {
- val bitmap = mediaFileCache[mediaIdKey]?.let { decodeMedia(it) } ?: return
+ val bitmap = bitmapCache[mediaFilePath] ?: return
canvas.drawBitmap(bitmap,
canvas.width.toFloat() - bitmap.width - chatMediaCardSnapMarginStartSdl.toFloat() - chatMediaCardSnapMargin.toFloat(),