commit 7908fe25f1b6039e34e4bfe88c1d0b52b5cabb79
parent c7745e206a14717e1abe46553928a440fca02e44
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Tue, 27 Aug 2024 14:00:57 +0200

fix(mapper): default media item mapper

Diffstat:
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/global/BypassVideoLengthRestriction.kt | 7+++++--
Mmapper/src/main/kotlin/me/rhunk/snapenhance/mapper/impl/DefaultMediaItemMapper.kt | 13++++++++-----
2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/global/BypassVideoLengthRestriction.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/global/BypassVideoLengthRestriction.kt @@ -5,6 +5,7 @@ import android.os.FileObserver import com.google.gson.JsonParser import me.rhunk.snapenhance.core.event.events.impl.SendMessageWithContentEvent import me.rhunk.snapenhance.core.features.Feature +import me.rhunk.snapenhance.core.util.dataBuilder import me.rhunk.snapenhance.core.util.hook.HookStage import me.rhunk.snapenhance.core.util.hook.hookConstructor import me.rhunk.snapenhance.core.util.ktx.setObjectField @@ -47,9 +48,11 @@ class BypassVideoLengthRestriction : } context.mappings.useMapper(DefaultMediaItemMapper::class) { - defaultMediaItem.getAsClass()?.hookConstructor(HookStage.BEFORE) { param -> + defaultMediaItemClass.getAsClass()?.hookConstructor(HookStage.AFTER) { param -> //set the video length argument - param.setArg(5, -1L) + param.thisObject<Any>().dataBuilder { + set(defaultMediaItemDurationMsField.getAsString()!!, -1L) + } } } } diff --git a/mapper/src/main/kotlin/me/rhunk/snapenhance/mapper/impl/DefaultMediaItemMapper.kt b/mapper/src/main/kotlin/me/rhunk/snapenhance/mapper/impl/DefaultMediaItemMapper.kt @@ -4,11 +4,13 @@ import me.rhunk.snapenhance.mapper.AbstractClassMapper import me.rhunk.snapenhance.mapper.ext.findConstString import me.rhunk.snapenhance.mapper.ext.getClassName import me.rhunk.snapenhance.mapper.ext.isAbstract +import me.rhunk.snapenhance.mapper.ext.searchNextFieldReference class DefaultMediaItemMapper : AbstractClassMapper("DefaultMediaItem") { val cameraRollMediaId = classReference("cameraRollMediaIdClass") val durationMsField = string("durationMsField") - val defaultMediaItem = classReference("defaultMediaItemClass") + val defaultMediaItemClass = classReference("defaultMediaItemClass") + val defaultMediaItemDurationMsField = string("defaultMediaItemDurationMsField") init { mapper { @@ -31,10 +33,11 @@ class DefaultMediaItemMapper : AbstractClassMapper("DefaultMediaItem") { if (!superClass.isAbstract() || superClass.interfaces.isEmpty() || superClass.interfaces[0] != "Ljava/lang/Comparable;") continue if (clazz.methods.none { it.returnType == "Landroid/net/Uri;" }) continue - val constructorParameters = clazz.directMethods.firstOrNull { it.name == "<init>" }?.parameterTypes ?: continue - if (constructorParameters.size < 6 || constructorParameters[5] != "J") continue - - defaultMediaItem.set(clazz.getClassName()) + val durationInMillisDexField = clazz.methods.firstOrNull { it.name == "toString" }?.implementation?.takeIf { + it.findConstString("metadata", contains = true) + }?.searchNextFieldReference("durationInMillis", contains = true) ?: continue + defaultMediaItemClass.set(clazz.getClassName()) + defaultMediaItemDurationMsField.set(durationInMillisDexField.name) return@mapper } }