Skip to content

Commit

Permalink
feat(Tiktok-Playback speed): remember playback speed
Browse files Browse the repository at this point in the history
  • Loading branch information
d4rkk3y committed Dec 17, 2023
1 parent f8365b4 commit 481d33b
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package app.revanced.patches.tiktok.interaction.speed

import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.tiktok.interaction.speed.fingerprints.ChangeSpeedFingerprint
import app.revanced.patches.tiktok.interaction.speed.fingerprints.GetSpeedFingerprint
import app.revanced.patches.tiktok.interaction.speed.fingerprints.OnRenderFirstFrameFingerprint
import app.revanced.patches.tiktok.interaction.speed.fingerprints.SpeedControlParentFingerprint
import app.revanced.util.exception
import app.revanced.util.indexOfFirstInstruction
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction11x
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
import com.android.tools.smali.dexlib2.iface.reference.MethodReference

Expand All @@ -22,7 +28,14 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
]
)
@Suppress("unused")
object PlaybackSpeedPatch : BytecodePatch(setOf(SpeedControlParentFingerprint)) {
object PlaybackSpeedPatch : BytecodePatch(
setOf(
SpeedControlParentFingerprint,
GetSpeedFingerprint,
OnRenderFirstFrameFingerprint,
ChangeSpeedFingerprint
)
) {
override fun execute(context: BytecodeContext) {
SpeedControlParentFingerprint.result?.mutableMethod?.apply {
val targetMethodCallIndex = indexOfFirstInstruction {
Expand All @@ -45,5 +58,34 @@ object PlaybackSpeedPatch : BytecodePatch(setOf(SpeedControlParentFingerprint))
"""
)
} ?: throw SpeedControlParentFingerprint.exception

GetSpeedFingerprint.result?.mutableMethod?.apply {
val injectIndex = indexOfFirstInstruction {
opcode == Opcode.INVOKE_STATIC && ((this as Instruction35c).reference as MethodReference).returnType == "F"
} + 2
val reg = (getInstruction(injectIndex - 1) as Instruction11x).registerA
addInstruction(
injectIndex,
"invoke-static { v$reg }, Lapp/revanced/tiktok/speed/SpeedPatch;->saveDefaultSpeed(F)V"
)
} ?: throw GetSpeedFingerprint.exception

OnRenderFirstFrameFingerprint.result?.mutableMethod?.apply {
ChangeSpeedFingerprint.result?.mutableMethod?.let { changeSpeedMethod ->
addInstructions(
0,
"""
const/4 v0, 0x1
invoke-virtual {p0, v0}, Lcom/ss/android/ugc/aweme/feed/panel/BaseListFragmentPanel;->getEnterFrom(Z)Ljava/lang/String;
move-result-object v0
invoke-virtual {p0}, Lcom/ss/android/ugc/aweme/feed/panel/BaseListFragmentPanel;->getCurrentAweme()Lcom/ss/android/ugc/aweme/feed/model/Aweme;
move-result-object v1
invoke-static {}, Lapp/revanced/tiktok/speed/SpeedPatch;->getDefaultSpeed()F
move-result-object v2
invoke-static { v0, v1, v2 }, ${changeSpeedMethod.definingClass}->${changeSpeedMethod.name}(${changeSpeedMethod.parameterTypes[0]}${changeSpeedMethod.parameterTypes[1]}${changeSpeedMethod.parameterTypes[2]})V
"""
)
} ?: throw ChangeSpeedFingerprint.exception
} ?: throw OnRenderFirstFrameFingerprint.exception
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package app.revanced.patches.tiktok.interaction.speed.fingerprints

import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode

internal object ChangeSpeedFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
parameters = listOf(
"Ljava/lang/String;",
"Lcom/ss/android/ugc/aweme/feed/model/Aweme;",
"F"
),
opcodes = listOf(
Opcode.CONST_STRING,
Opcode.INVOKE_STATIC,
Opcode.SGET,
Opcode.SPUT_OBJECT,
Opcode.SPUT,
Opcode.SPUT,
Opcode.SGET_OBJECT,
Opcode.IF_EQZ,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.SGET_OBJECT
),
strings = listOf("enterFrom")
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package app.revanced.patches.tiktok.interaction.speed.fingerprints

import app.revanced.patcher.fingerprint.MethodFingerprint

internal object GetSpeedFingerprint : MethodFingerprint(
customFingerprint = { methodDef, _ ->
methodDef.definingClass.endsWith("/BaseListFragmentPanel;") &&
methodDef.name == "onFeedSpeedSelectedEvent"
}
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package app.revanced.patches.tiktok.interaction.speed.fingerprints

import app.revanced.patcher.fingerprint.MethodFingerprint

internal object OnRenderFirstFrameFingerprint : MethodFingerprint(
customFingerprint = { methodDef, _ ->
methodDef.definingClass.endsWith("/BaseListFragmentPanel;") &&
methodDef.name == "onRenderFirstFrame"
}
)

0 comments on commit 481d33b

Please sign in to comment.