mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-04-30 22:54:28 +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.ShapeDrawable
|
||||||
import android.graphics.drawable.shapes.Shape
|
import android.graphics.drawable.shapes.Shape
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import kotlinx.coroutines.Job
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import me.rhunk.snapenhance.common.data.ContentType
|
import me.rhunk.snapenhance.common.data.ContentType
|
||||||
import me.rhunk.snapenhance.common.util.protobuf.ProtoReader
|
import me.rhunk.snapenhance.common.util.protobuf.ProtoReader
|
||||||
import me.rhunk.snapenhance.core.event.events.impl.BindViewEvent
|
import me.rhunk.snapenhance.core.event.events.impl.BindViewEvent
|
||||||
import me.rhunk.snapenhance.core.features.Feature
|
import me.rhunk.snapenhance.core.features.Feature
|
||||||
import me.rhunk.snapenhance.core.ui.addForegroundDrawable
|
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.ui.removeForegroundDrawable
|
||||||
import me.rhunk.snapenhance.core.util.EvictingMap
|
import me.rhunk.snapenhance.core.util.EvictingMap
|
||||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
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 mediaFileCache = EvictingMap<String, File>(500) // mMediaId => mediaFile
|
||||||
private val bitmapCache = EvictingMap<String, Bitmap>(50) // filePath => bitmap
|
private val bitmapCache = EvictingMap<String, Bitmap>(50) // filePath => bitmap
|
||||||
|
|
||||||
|
private val fetchJobTab = randomTag()
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
if (!context.config.userInterface.snapPreview.get()) return
|
if (!context.config.userInterface.snapPreview.get()) return
|
||||||
context.mappings.useMapper(CallbackMapper::class) {
|
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
|
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() {
|
messageLinearLayout.addForegroundDrawable("snapPreview", ShapeDrawable(object: Shape() {
|
||||||
override fun draw(canvas: Canvas, paint: Paint) {
|
override fun draw(canvas: Canvas, paint: Paint) {
|
||||||
val bitmap = mediaFileCache[mediaIdKey]?.let { decodeMedia(it) } ?: return
|
val bitmap = bitmapCache[mediaFilePath] ?: return
|
||||||
|
|
||||||
canvas.drawBitmap(bitmap,
|
canvas.drawBitmap(bitmap,
|
||||||
canvas.width.toFloat() - bitmap.width - chatMediaCardSnapMarginStartSdl.toFloat() - chatMediaCardSnapMargin.toFloat(),
|
canvas.width.toFloat() - bitmap.width - chatMediaCardSnapMarginStartSdl.toFloat() - chatMediaCardSnapMargin.toFloat(),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user