From e7ed324bb5216037be0646a698e7e808fbf03e4e Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Thu, 1 Dec 2022 22:48:33 +0100 Subject: [PATCH] feat(anytracker): `unlock-premium` patch (#1165) Co-authored-by: FineFindus <63370021+FineFindus@users.noreply.github.com> --- .../annotations/UnlockPremiumCompatibility.kt | 9 ++++ .../IsPurchasedFlowFingerprint.kt | 11 +++++ .../misc/premium/patch/UnlockPremiumPatch.kt | 48 +++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 src/main/kotlin/app/revanced/patches/anytracker/misc/premium/annotations/UnlockPremiumCompatibility.kt create mode 100644 src/main/kotlin/app/revanced/patches/anytracker/misc/premium/fingerprints/IsPurchasedFlowFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/anytracker/misc/premium/patch/UnlockPremiumPatch.kt diff --git a/src/main/kotlin/app/revanced/patches/anytracker/misc/premium/annotations/UnlockPremiumCompatibility.kt b/src/main/kotlin/app/revanced/patches/anytracker/misc/premium/annotations/UnlockPremiumCompatibility.kt new file mode 100644 index 000000000..d8c385473 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/anytracker/misc/premium/annotations/UnlockPremiumCompatibility.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.anytracker.misc.premium.annotations + +import app.revanced.patcher.annotation.Compatibility +import app.revanced.patcher.annotation.Package + +@Compatibility([Package("com.shervinkoushan.anyTracker")]) +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +internal annotation class UnlockPremiumCompatibility \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/anytracker/misc/premium/fingerprints/IsPurchasedFlowFingerprint.kt b/src/main/kotlin/app/revanced/patches/anytracker/misc/premium/fingerprints/IsPurchasedFlowFingerprint.kt new file mode 100644 index 000000000..a5f6cef6b --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/anytracker/misc/premium/fingerprints/IsPurchasedFlowFingerprint.kt @@ -0,0 +1,11 @@ +package app.revanced.patches.anytracker.misc.premium.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.AccessFlags +import org.jf.dexlib2.Opcode + +object IsPurchasedFlowFingerprint : MethodFingerprint( + "Landroidx/lifecycle/LiveData" + strings = listOf("premium_user", "sku"), +) diff --git a/src/main/kotlin/app/revanced/patches/anytracker/misc/premium/patch/UnlockPremiumPatch.kt b/src/main/kotlin/app/revanced/patches/anytracker/misc/premium/patch/UnlockPremiumPatch.kt new file mode 100644 index 000000000..cf926f840 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/anytracker/misc/premium/patch/UnlockPremiumPatch.kt @@ -0,0 +1,48 @@ +package app.revanced.patches.anytracker.misc.premium.patch + + +import app.revanced.patcher.annotation.Description +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchResult +import app.revanced.patcher.patch.PatchResultSuccess +import app.revanced.patcher.patch.annotations.Patch +import app.revanced.patches.anytracker.misc.premium.annotations.UnlockPremiumCompatibility +import app.revanced.patches.anytracker.misc.premium.fingerprints.IsPurchasedFlowFingerprint + +@Patch +@Name("unlock-premium") +@Description("Unlocks all premium features.") +@UnlockPremiumCompatibility +@Version("0.0.1") +class UnlockPremiumPatch : BytecodePatch( + listOf( + IsPurchasedFlowFingerprint + ) +) { + override fun execute(context: BytecodeContext): PatchResult { + val method = IsPurchasedFlowFingerprint.result!!.mutableMethod + method.addInstructions( + 0, + """ + const/4 v0, 0x1 + invoke-static {v0}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean; + move-result-object v0 + invoke-static {v0}, Lkotlinx/coroutines/flow/FlowKt;->flowOf(Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow; + move-result-object v1 + const/4 v2, 0x0 + const-wide/16 v3, 0x0 + const/4 v5, 0x3 + const/4 v6, 0x0 + invoke-static/range {v1 .. v6}, Landroidx/lifecycle/FlowLiveDataConversions;->asLiveData${'$'}default(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;JILjava/lang/Object;)Landroidx/lifecycle/LiveData; + move-result-object v0 + return-object v0 + """ + ) + + return PatchResultSuccess() + } +}