diff --git a/patches/api/patches.api b/patches/api/patches.api index df4e58df1..6bc936afb 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -380,6 +380,14 @@ public final class app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatc public static final fun getFixCrashPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/pandora/ads/DisableAudioAdsPatchKt { + public static final fun getDisableAudioAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + +public final class app/revanced/patches/pandora/misc/EnableUnlimitedSkipsPatchKt { + public static final fun getEnableUnlimitedSkipsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/photomath/detection/deviceid/SpoofDeviceIdPatchKt { public static final fun getGetDeviceIdPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/pandora/ads/DisableAudioAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/pandora/ads/DisableAudioAdsPatch.kt new file mode 100644 index 000000000..a25a8880a --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/pandora/ads/DisableAudioAdsPatch.kt @@ -0,0 +1,30 @@ +package app.revanced.patches.pandora.ads + +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.pandora.shared.constructUserDataFingerprint +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction + +@Suppress("unused") +val disableAudioAdsPatch = bytecodePatch( + name = "Disable audio ads", +) { + compatibleWith("com.pandora.android") + + execute { + constructUserDataFingerprint.method.apply { + // First match is "hasAudioAds". + val hasAudioAdsStringIndex = constructUserDataFingerprint.stringMatches!!.first().index + val moveResultIndex = indexOfFirstInstructionOrThrow(hasAudioAdsStringIndex, Opcode.MOVE_RESULT) + val hasAudioAdsRegister = getInstruction(moveResultIndex).registerA + + addInstruction( + moveResultIndex + 1, + "const/4 v$hasAudioAdsRegister, 0" + ) + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/pandora/misc/EnableUnlimitedSkipsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/pandora/misc/EnableUnlimitedSkipsPatch.kt new file mode 100644 index 000000000..aedb5a9c2 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/pandora/misc/EnableUnlimitedSkipsPatch.kt @@ -0,0 +1,31 @@ +package app.revanced.patches.pandora.misc + +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.pandora.shared.constructUserDataFingerprint +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction + +@Suppress("unused") +val enableUnlimitedSkipsPatch = bytecodePatch( + name = "Enable unlimited skips", +) { + compatibleWith("com.pandora.android") + + execute { + constructUserDataFingerprint.method.apply { + // Last match is "skipLimitBehavior". + val skipLimitBehaviorStringIndex = constructUserDataFingerprint.stringMatches!!.last().index + val moveResultObjectIndex = + indexOfFirstInstructionOrThrow(skipLimitBehaviorStringIndex, Opcode.MOVE_RESULT_OBJECT) + val skipLimitBehaviorRegister = getInstruction(moveResultObjectIndex).registerA + + addInstruction( + moveResultObjectIndex + 1, + "const-string v$skipLimitBehaviorRegister, \"unlimited\"" + ) + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/pandora/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/pandora/shared/Fingerprints.kt new file mode 100644 index 000000000..c045e0841 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/pandora/shared/Fingerprints.kt @@ -0,0 +1,7 @@ +package app.revanced.patches.pandora.shared + +import app.revanced.patcher.fingerprint + +internal val constructUserDataFingerprint = fingerprint { + strings("hasAudioAds", "skipLimitBehavior") +}