From fd4b3c79a83f8de6256611629263d3e29e66f2c2 Mon Sep 17 00:00:00 2001 From: mrwedders <16323042+mrwedders@users.noreply.github.com> Date: Tue, 9 Jan 2024 17:26:15 +0000 Subject: [PATCH] feat(MyFitnessPal): Add `Hide ads` patch (#2594) Co-authored-by: oSumAtrIX --- api/revanced-patches.api | 14 +++++++ .../patches/myfitnesspal/ads/HideAdsPatch.kt | 38 +++++++++++++++++++ .../IsPremiumUseCaseImplFingerprint.kt | 11 ++++++ ...avigateToNativePremiumUpsellFingerprint.kt | 13 +++++++ 4 files changed, 76 insertions(+) create mode 100644 src/main/kotlin/app/revanced/patches/myfitnesspal/ads/HideAdsPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/IsPremiumUseCaseImplFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/MainActivityNavigateToNativePremiumUpsellFingerprint.kt diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 3c16fdeeb..08000ed37 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -333,6 +333,20 @@ public final class app/revanced/patches/myexpenses/misc/pro/UnlockProPatch : app public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } +public final class app/revanced/patches/myfitnesspal/ads/HideAdsPatch : app/revanced/patcher/patch/BytecodePatch { + public static final field INSTANCE Lapp/revanced/patches/myfitnesspal/ads/HideAdsPatch; + public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V + public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V +} + +public final class app/revanced/patches/myfitnesspal/ads/fingerprints/IsPremiumUseCaseImplFingerprint : app/revanced/patcher/fingerprint/MethodFingerprint { + public static final field INSTANCE Lapp/revanced/patches/myfitnesspal/ads/fingerprints/IsPremiumUseCaseImplFingerprint; +} + +public final class app/revanced/patches/myfitnesspal/ads/fingerprints/MainActivityNavigateToNativePremiumUpsellFingerprint : app/revanced/patcher/fingerprint/MethodFingerprint { + public static final field INSTANCE Lapp/revanced/patches/myfitnesspal/ads/fingerprints/MainActivityNavigateToNativePremiumUpsellFingerprint; +} + public final class app/revanced/patches/netguard/broadcasts/removerestriction/RemoveBroadcastsRestrictionPatch : app/revanced/patcher/patch/ResourcePatch { public static final field INSTANCE Lapp/revanced/patches/netguard/broadcasts/removerestriction/RemoveBroadcastsRestrictionPatch; public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V diff --git a/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/HideAdsPatch.kt b/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/HideAdsPatch.kt new file mode 100644 index 000000000..855b486ba --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/HideAdsPatch.kt @@ -0,0 +1,38 @@ +package app.revanced.patches.myfitnesspal.ads + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.annotation.CompatiblePackage +import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.myfitnesspal.ads.fingerprints.IsPremiumUseCaseImplFingerprint +import app.revanced.patches.myfitnesspal.ads.fingerprints.MainActivityNavigateToNativePremiumUpsellFingerprint +import app.revanced.util.exception + +@Patch( + name = "Hide ads", + description = "Hides most of the ads across the app.", + compatiblePackages = [CompatiblePackage("com.myfitnesspal.android")] +) +@Suppress("unused") +object HideAdsPatch : BytecodePatch( + setOf(IsPremiumUseCaseImplFingerprint, MainActivityNavigateToNativePremiumUpsellFingerprint) +) { + override fun execute(context: BytecodeContext) { + // Overwrite the premium status specifically for ads. + IsPremiumUseCaseImplFingerprint.result?.mutableMethod?.replaceInstructions( + 0, + """ + sget-object v0, Ljava/lang/Boolean;->TRUE:Ljava/lang/Boolean; + return-object v0 + """ + ) ?: throw IsPremiumUseCaseImplFingerprint.exception + + // Prevent the premium upsell dialog from showing when the main activity is launched. + // In other places that are premium-only the dialog will still show. + MainActivityNavigateToNativePremiumUpsellFingerprint.result?.mutableMethod?.replaceInstructions( + 0, + "return-void" + ) ?: throw MainActivityNavigateToNativePremiumUpsellFingerprint.exception + } +} diff --git a/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/IsPremiumUseCaseImplFingerprint.kt b/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/IsPremiumUseCaseImplFingerprint.kt new file mode 100644 index 000000000..0f6e50e77 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/IsPremiumUseCaseImplFingerprint.kt @@ -0,0 +1,11 @@ +package app.revanced.patches.myfitnesspal.ads.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +object IsPremiumUseCaseImplFingerprint : MethodFingerprint( + accessFlags = AccessFlags.PUBLIC.value, + customFingerprint = { methodDef, classDef -> + classDef.type.endsWith("IsPremiumUseCaseImpl;") && methodDef.name == "doWork" + } +) diff --git a/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/MainActivityNavigateToNativePremiumUpsellFingerprint.kt b/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/MainActivityNavigateToNativePremiumUpsellFingerprint.kt new file mode 100644 index 000000000..42cfb88c3 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/fingerprints/MainActivityNavigateToNativePremiumUpsellFingerprint.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.myfitnesspal.ads.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +object MainActivityNavigateToNativePremiumUpsellFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, + customFingerprint = { methodDef, classDef -> + classDef.type.endsWith("MainActivity;") && methodDef.name == "navigateToNativePremiumUpsell" + } +)