From 679e11e5d1424ad2b1aad36041bebcca93987a03 Mon Sep 17 00:00:00 2001 From: inotia00 Date: Tue, 5 Sep 2023 11:55:46 +0900 Subject: [PATCH] feat(music): add `remember-playback-speed` patch --- .../PlaybackSpeedBottomSheetFingerprint.kt | 16 +++++ ...aybackSpeedBottomSheetParentFingerprint.kt | 12 ++++ .../misc/speed/patch/PlaybackSpeedPatch.kt | 69 +++++++++++++++++++ .../music/settings/host/values/strings.xml | 3 + 4 files changed, 100 insertions(+) create mode 100644 src/main/kotlin/app/revanced/patches/music/misc/speed/fingerprints/PlaybackSpeedBottomSheetFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/misc/speed/fingerprints/PlaybackSpeedBottomSheetParentFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/misc/speed/patch/PlaybackSpeedPatch.kt diff --git a/src/main/kotlin/app/revanced/patches/music/misc/speed/fingerprints/PlaybackSpeedBottomSheetFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/speed/fingerprints/PlaybackSpeedBottomSheetFingerprint.kt new file mode 100644 index 000000000..8655610c5 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/misc/speed/fingerprints/PlaybackSpeedBottomSheetFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.music.misc.speed.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 PlaybackSpeedBottomSheetFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + opcodes = listOf( + Opcode.INVOKE_VIRTUAL, + Opcode.IGET_OBJECT + ), + customFingerprint = { methodDef, _ -> methodDef.name == "onItemClick" } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/misc/speed/fingerprints/PlaybackSpeedBottomSheetParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/speed/fingerprints/PlaybackSpeedBottomSheetParentFingerprint.kt new file mode 100644 index 000000000..134fd88cc --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/misc/speed/fingerprints/PlaybackSpeedBottomSheetParentFingerprint.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.music.misc.speed.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +object PlaybackSpeedBottomSheetParentFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("L"), + strings = listOf("PLAYBACK_RATE_MENU_BOTTOM_SHEET_FRAGMENT") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/misc/speed/patch/PlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/speed/patch/PlaybackSpeedPatch.kt new file mode 100644 index 000000000..a74385b32 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/misc/speed/patch/PlaybackSpeedPatch.kt @@ -0,0 +1,69 @@ +package app.revanced.patches.music.misc.speed.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.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve +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.misc.speed.fingerprints.PlaybackSpeedBottomSheetFingerprint +import app.revanced.patches.music.misc.speed.fingerprints.PlaybackSpeedBottomSheetParentFingerprint +import app.revanced.patches.music.utils.annotations.MusicCompatibility +import app.revanced.patches.music.utils.overridespeed.patch.OverrideSpeedHookPatch +import app.revanced.patches.music.utils.settings.resource.patch.SettingsPatch +import app.revanced.util.enum.CategoryType +import app.revanced.util.integrations.Constants.MUSIC_MISC_PATH +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction + +@Patch +@Name("Remember playback speed") +@Description("Save the playback speed value whenever you change the playback speed.") +@DependsOn( + [ + OverrideSpeedHookPatch::class, + SettingsPatch::class + ] +) +@MusicCompatibility +class PlaybackSpeedPatch : BytecodePatch( + listOf(PlaybackSpeedBottomSheetParentFingerprint) +) { + override fun execute(context: BytecodeContext) { + + PlaybackSpeedBottomSheetParentFingerprint.result?.let { parentResult -> + PlaybackSpeedBottomSheetFingerprint.also { + it.resolve( + context, + parentResult.classDef + ) + }.result?.let { + it.mutableMethod.apply { + val targetIndex = it.scanResult.patternScanResult!!.startIndex + val targetRegister = + getInstruction(targetIndex).registerD + + addInstruction( + targetIndex, + "invoke-static {v$targetRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->userChangedSpeed(F)V" + ) + } + } ?: throw PlaybackSpeedBottomSheetFingerprint.exception + } ?: throw PlaybackSpeedBottomSheetParentFingerprint.exception + + SettingsPatch.addMusicPreference( + CategoryType.MISC, + "revanced_enable_save_playback_speed", + "false" + ) + + } + + private companion object { + const val INTEGRATIONS_CLASS_DESCRIPTOR = + "$MUSIC_MISC_PATH/PlaybackSpeedPatch;" + } +} \ No newline at end of file diff --git a/src/main/resources/music/settings/host/values/strings.xml b/src/main/resources/music/settings/host/values/strings.xml index ef2818e9d..7b29e9c25 100644 --- a/src/main/resources/music/settings/host/values/strings.xml +++ b/src/main/resources/music/settings/host/values/strings.xml @@ -38,6 +38,8 @@ Enable old style mini player Enable 250/251 opus codec when playing audio. Enable opus codec + Save the playback speed value whenever you change the playback speed. + Enable save playback speed Save the video quality value whenever you change the video quality. Enable save video quality Add sleep timer to flyout menu. @@ -77,6 +79,7 @@ Hook download button Refresh and restart Reset + Changing default speed to: Changing default mobile data quality to: Failed to set quality Changing default Wi-Fi quality to: