feat(music): add remember-playback-speed patch

This commit is contained in:
inotia00
2023-09-05 11:55:46 +09:00
parent 63628d6f75
commit 679e11e5d1
4 changed files with 100 additions and 0 deletions

View File

@ -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" }
)

View File

@ -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")
)

View File

@ -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<FiveRegisterInstruction>(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;"
}
}