diff --git a/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/fingerprints/RepeatTrackFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/fingerprints/RepeatTrackFingerprint.kt new file mode 100644 index 000000000..f27d60ea8 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/fingerprints/RepeatTrackFingerprint.kt @@ -0,0 +1,22 @@ +package app.revanced.patches.music.interaction.permanentrepeat.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.AccessFlags +import org.jf.dexlib2.Opcode + +object RepeatTrackFingerprint : MethodFingerprint( + "V", + AccessFlags.PUBLIC or AccessFlags.FINAL, + listOf("L", "L"), + listOf( + Opcode.CHECK_CAST, + Opcode.INVOKE_INTERFACE, + Opcode.IGET_OBJECT, + Opcode.IGET_OBJECT, + Opcode.SGET_OBJECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT, + Opcode.IF_NEZ + ) +) diff --git a/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/patch/PermanentRepeatPatch.kt b/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/patch/PermanentRepeatPatch.kt new file mode 100644 index 000000000..0beb97cec --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/patch/PermanentRepeatPatch.kt @@ -0,0 +1,40 @@ +package app.revanced.patches.music.interaction.permanentrepeat.patch + +import app.revanced.extensions.toErrorResult +import app.revanced.patcher.annotation.Description +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchResult +import app.revanced.patcher.patch.PatchResultSuccess +import app.revanced.patcher.patch.annotations.Patch +import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.music.annotations.MusicCompatibility +import app.revanced.patches.music.interaction.permanentrepeat.fingerprints.RepeatTrackFingerprint + +@Patch(false) +@Name("Permanent repeat") +@Description("Permanently remember your repeating preference even if the playlist ends or another track is played.") +@MusicCompatibility +class PermanentRepeatPatch : BytecodePatch( + listOf(RepeatTrackFingerprint) +) { + override fun execute(context: BytecodeContext): PatchResult { + RepeatTrackFingerprint.result?.let { + val startIndex = it.scanResult.patternScanResult!!.endIndex + val repeatIndex = startIndex + 3 + + it.mutableMethod.apply { + addInstructionsWithLabels( + startIndex, + "goto :repeat", + ExternalLabel("repeat", getInstruction(repeatIndex)) + ) + } + } ?: return RepeatTrackFingerprint.toErrorResult() + + return PatchResultSuccess() + } +}