diff --git a/src/main/kotlin/app/revanced/patches/music/player/repeat/fingerprints/RepeatTrackFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/repeat/fingerprints/RepeatTrackFingerprint.kt new file mode 100644 index 000000000..9eb6f6ced --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/player/repeat/fingerprints/RepeatTrackFingerprint.kt @@ -0,0 +1,21 @@ +package app.revanced.patches.music.player.repeat.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode + +object RepeatTrackFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("L", "L"), + opcodes = listOf( + Opcode.IGET_OBJECT, + Opcode.IGET_OBJECT, + Opcode.SGET_OBJECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT, + Opcode.IF_NEZ + ), + strings = listOf("w_st") +) diff --git a/src/main/kotlin/app/revanced/patches/music/player/repeat/patch/RememberRepeatPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/repeat/patch/RememberRepeatPatch.kt new file mode 100644 index 000000000..c2f1fc3b5 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/player/repeat/patch/RememberRepeatPatch.kt @@ -0,0 +1,48 @@ +package app.revanced.patches.music.player.repeat.patch + +import app.revanced.extensions.exception +import app.revanced.patcher.annotation.Description +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.data.BytecodeContext +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.annotations.DependsOn +import app.revanced.patcher.patch.annotations.Patch +import app.revanced.patches.music.player.repeat.fingerprints.RepeatTrackFingerprint +import app.revanced.patches.music.utils.annotations.MusicCompatibility +import app.revanced.patches.music.utils.settings.resource.patch.SettingsPatch +import app.revanced.util.enum.CategoryType +import app.revanced.util.integrations.Constants.MUSIC_PLAYER +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction + +@Patch +@Name("Remember repeat state") +@Description("Remembers the state of the repeat.") +@DependsOn([SettingsPatch::class]) +@MusicCompatibility +class RememberRepeatPatch : BytecodePatch( + listOf(RepeatTrackFingerprint) +) { + override fun execute(context: BytecodeContext) { + RepeatTrackFingerprint.result?.let { + it.mutableMethod.apply { + val targetIndex = it.scanResult.patternScanResult!!.endIndex + val targetRegister = getInstruction(targetIndex).registerA + + addInstructions( + targetIndex, """ + invoke-static {v$targetRegister}, $MUSIC_PLAYER->rememberRepeatState(Z)Z + move-result v$targetRegister + """ + ) + } + } ?: throw RepeatTrackFingerprint.exception + + SettingsPatch.addMusicPreference( + CategoryType.PLAYER, + "revanced_remember_repeat_state", + "true" + ) + } +} diff --git a/src/main/resources/music/settings/host/values/strings.xml b/src/main/resources/music/settings/host/values/strings.xml index d08fc9df4..4902b973f 100644 --- a/src/main/resources/music/settings/host/values/strings.xml +++ b/src/main/resources/music/settings/host/values/strings.xml @@ -127,6 +127,8 @@ Continue watching Replaces dismiss queue menu to watch on YouTube. Replace dismiss queue + Remembers the state of the repeat. + Remember repeat state Remembers the state of the shuffle. Remember shuffle state Reset