perf(core/snap_preview): lazy loading

Signed-off-by: rhunk <101876869+rhunk@users.noreply.github.com>
This commit is contained in:
rhunk 2025-01-03 00:37:42 +01:00
parent 3d50054d38
commit 6f87d5961b

View File

@ -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(),