mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-04-30 14:44:35 +02:00
perf(core/snap_preview): lazy loading
Signed-off-by: rhunk <101876869+rhunk@users.noreply.github.com>
This commit is contained in:
parent
3d50054d38
commit
6f87d5961b
@ -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(),
|
||||
|
Loading…
x
Reference in New Issue
Block a user