diff --git a/src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/ColorMatchPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/ColorMatchPlayerPatch.kt index 27e931eba..2f1db9800 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/ColorMatchPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/ColorMatchPlayerPatch.kt @@ -5,11 +5,13 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve 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.patcher.util.smali.ExternalLabel +import app.revanced.patches.music.player.colormatchplayer.fingerprints.NewPlayerColorFingerprint import app.revanced.patches.music.utils.fingerprints.PlayerColorFingerprint import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.enum.CategoryType @@ -17,6 +19,8 @@ import app.revanced.util.integrations.Constants.MUSIC_PLAYER import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.Instruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference +import com.android.tools.smali.dexlib2.iface.reference.Reference import kotlin.properties.Delegates @Patch( @@ -39,14 +43,51 @@ import kotlin.properties.Delegates object ColorMatchPlayerPatch : BytecodePatch( setOf(PlayerColorFingerprint) ) { + private lateinit var miniPlayerReference1: Reference + private lateinit var miniPlayerReference2: Reference + private lateinit var miniPlayerReference3: Reference + private lateinit var miniPlayerReference4: Reference + private lateinit var miniPlayerReference5: Reference + private lateinit var miniPlayerReference6: Reference + + private lateinit var miniPlayerIntReference1: Reference + private lateinit var miniPlayerIntReference2: Reference + private lateinit var miniPlayerIntReference3: Reference + + private var relativeIndex by Delegates.notNull() + + private fun MutableMethod.descriptor(index: Int): Reference { + return getInstruction(relativeIndex + index).reference + } + + private fun MutableMethod.opcodeIndex(opcode: Opcode): Int { + return implementation!!.instructions.indexOfFirst { instruction -> + instruction.opcode == opcode + } + } + override fun execute(context: BytecodeContext) { - PlayerColorFingerprint.result?.let { - it.mutableMethod.apply { - relativeIndex = it.scanResult.patternScanResult!!.startIndex - val insertIndex = implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.IPUT_OBJECT - } + PlayerColorFingerprint.result?.let { parentResult -> + parentResult.mutableMethod.apply { + relativeIndex = parentResult.scanResult.patternScanResult!!.startIndex + + miniPlayerReference1 = descriptor(2) + miniPlayerReference2 = descriptor(3) + miniPlayerReference3 = descriptor(4) + miniPlayerReference4 = descriptor(7) + miniPlayerReference5 = descriptor(8) + miniPlayerReference6 = descriptor(9) + + relativeIndex = opcodeIndex(Opcode.IGET_OBJECT) - 4 + + miniPlayerIntReference1 = descriptor(0) + miniPlayerIntReference2 = descriptor(3) + + relativeIndex = opcodeIndex(Opcode.IF_GEZ) + miniPlayerIntReference3 = descriptor(1) + + val insertIndex = opcodeIndex(Opcode.IPUT_OBJECT) val jumpInstruction = getInstruction(insertIndex) val replaceReference = getInstruction(insertIndex - 1).reference @@ -56,17 +97,17 @@ object ColorMatchPlayerPatch : BytecodePatch( invoke-static {}, $MUSIC_PLAYER->enableColorMatchPlayer()Z move-result v2 if-eqz v2, :off - iget v0, p0, ${descriptor(2)} + iget v0, p0, $miniPlayerReference1 if-eq v0, v2, :switch - iput v2, p0, ${descriptor(2)} - iget-object v0, p0, ${descriptor(3)} - invoke-virtual {v0, v2, p2, p3}, ${descriptor(4)} + iput v2, p0, $miniPlayerReference1 + iget-object v0, p0, $miniPlayerReference2 + invoke-virtual {v0, v2, p2, p3}, $miniPlayerReference3 :switch - iget v0, p0, ${descriptor(7)} + iget v0, p0, $miniPlayerReference4 if-eq v0, v1, :exit - iput v1, p0, ${descriptor(7)} - iget-object v0, p0, ${descriptor(8)} - invoke-virtual {v0, v1, p2, p3}, ${descriptor(9)} + iput v1, p0, $miniPlayerReference4 + iget-object v0, p0, $miniPlayerReference5 + invoke-virtual {v0, v1, p2, p3}, $miniPlayerReference6 goto :exit :off invoke-direct {p0}, $replaceReference @@ -74,6 +115,49 @@ object ColorMatchPlayerPatch : BytecodePatch( ) removeInstruction(insertIndex - 1) } + + NewPlayerColorFingerprint.also { + it.resolve( + context, + parentResult.classDef + ) + }.result?.let { + it.mutableMethod.apply { + val insertIndex = it.scanResult.patternScanResult!!.endIndex + val replaceReference = + getInstruction(insertIndex - 1).reference + + addInstructionsWithLabels( + insertIndex, """ + invoke-static {}, $MUSIC_PLAYER->enableColorMatchPlayer()Z + move-result v1 + if-eqz v1, :off + iget v0, p0, $miniPlayerReference1 + if-eq v0, v1, :switch + iput v1, p0, $miniPlayerReference1 + iget-object v0, p0, $miniPlayerReference2 + invoke-virtual {v0, v1, p2, p3}, $miniPlayerReference3 + :switch + invoke-virtual {p1}, $miniPlayerIntReference1 + move-result-object v1 + check-cast v1, ${(miniPlayerIntReference2 as FieldReference).definingClass} + iget v1, v1, $miniPlayerIntReference2 + invoke-static {v1}, $miniPlayerIntReference3 + move-result v1 + iget v0, p0, $miniPlayerReference4 + if-eq v0, v1, :exit + iput v1, p0, $miniPlayerReference4 + iget-object v0, p0, $miniPlayerReference5 + invoke-virtual {v0, v1, p2, p3}, $miniPlayerReference6 + :exit + return-void + :off + invoke-direct {p0}, $replaceReference + """ + ) + removeInstruction(insertIndex - 1) + } + } ?: throw NewPlayerColorFingerprint.exception } ?: throw PlayerColorFingerprint.exception SettingsPatch.addMusicPreference( @@ -83,10 +167,4 @@ object ColorMatchPlayerPatch : BytecodePatch( ) } - - private var relativeIndex by Delegates.notNull() - - private fun MutableMethod.descriptor(index: Int): String { - return getInstruction(relativeIndex + index).reference.toString() - } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/fingerprints/ColorMatchPlayerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/fingerprints/NewPlayerColorFingerprint.kt similarity index 81% rename from src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/fingerprints/ColorMatchPlayerFingerprint.kt rename to src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/fingerprints/NewPlayerColorFingerprint.kt index 0b27263a4..deef13094 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/fingerprints/ColorMatchPlayerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/fingerprints/NewPlayerColorFingerprint.kt @@ -5,13 +5,14 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ColorMatchPlayerFingerprint : MethodFingerprint( +object NewPlayerColorFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "J"), opcodes = listOf( Opcode.INVOKE_DIRECT, - Opcode.IPUT_OBJECT, + Opcode.RETURN_VOID, + Opcode.INVOKE_DIRECT, Opcode.RETURN_VOID ) ) \ No newline at end of file