From 144af2f07ed4295b6f4d1fa49aa635e1fbcdecb2 Mon Sep 17 00:00:00 2001 From: Eric Ahn Date: Sat, 6 Sep 2025 03:53:26 -0700 Subject: [PATCH] feat(BaconReader): Add `Fix Redgifs API` patch (#5761) --- extensions/baconreader/build.gradle.kts | 5 ++ .../baconreader/src/main/AndroidManifest.xml | 1 + .../baconreader/FixRedgifsApiPatch.java | 22 ++++++++ patches/api/patches.api | 8 +++ .../baconreader/fix/redgifs/Fingerprints.kt | 13 +++++ .../fix/redgifs/FixRedgifsApiPatch.kt | 53 +++++++++++++++++++ .../misc/extension/SharedExtensionPatch.kt | 6 +++ .../misc/extension/hooks/InitHook.kt | 9 ++++ 8 files changed, 117 insertions(+) create mode 100644 extensions/baconreader/build.gradle.kts create mode 100644 extensions/baconreader/src/main/AndroidManifest.xml create mode 100644 extensions/baconreader/src/main/java/app/revanced/extension/baconreader/FixRedgifsApiPatch.java create mode 100644 patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt diff --git a/extensions/baconreader/build.gradle.kts b/extensions/baconreader/build.gradle.kts new file mode 100644 index 000000000..804e90884 --- /dev/null +++ b/extensions/baconreader/build.gradle.kts @@ -0,0 +1,5 @@ +dependencies { + compileOnly(project(":extensions:shared:library")) + compileOnly(libs.annotation) + compileOnly(libs.okhttp) +} diff --git a/extensions/baconreader/src/main/AndroidManifest.xml b/extensions/baconreader/src/main/AndroidManifest.xml new file mode 100644 index 000000000..9b65eb06c --- /dev/null +++ b/extensions/baconreader/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/extensions/baconreader/src/main/java/app/revanced/extension/baconreader/FixRedgifsApiPatch.java b/extensions/baconreader/src/main/java/app/revanced/extension/baconreader/FixRedgifsApiPatch.java new file mode 100644 index 000000000..943da63fa --- /dev/null +++ b/extensions/baconreader/src/main/java/app/revanced/extension/baconreader/FixRedgifsApiPatch.java @@ -0,0 +1,22 @@ +package app.revanced.extension.baconreader; + +import app.revanced.extension.shared.fixes.redgifs.BaseFixRedgifsApiPatch; +import okhttp3.OkHttpClient; + +/** + * @noinspection unused + */ +public class FixRedgifsApiPatch extends BaseFixRedgifsApiPatch { + static { + INSTANCE = new FixRedgifsApiPatch(); + } + + public String getDefaultUserAgent() { + // BaconReader uses a static user agent for Redgifs API calls + return "BaconReader"; + } + + public static OkHttpClient install(OkHttpClient.Builder builder) { + return builder.addInterceptor(INSTANCE).build(); + } +} diff --git a/patches/api/patches.api b/patches/api/patches.api index 8b275fc72..d57f9cd93 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -535,6 +535,14 @@ public final class app/revanced/patches/reddit/customclients/baconreader/api/Spo public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatchKt { + public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/BytecodePatch; +} + +public final class app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatchKt { + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatchKt { public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt new file mode 100644 index 000000000..524beeea0 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.reddit.customclients.baconreader.fix.redgifs + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags + + +internal val getOkHttpClientFingerprint = fingerprint { + returns("Lokhttp3/OkHttpClient;") + parameters() + custom { method, classDef -> + classDef.type == "Lcom/onelouder/baconreader/media/gfycat/RedGifsManager;" && method.name == "getOkhttpClient" + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt new file mode 100644 index 000000000..4cd9db006 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt @@ -0,0 +1,53 @@ +package app.revanced.patches.reddit.customclients.baconreader.fix.redgifs + +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patches.reddit.customclients.INSTALL_NEW_CLIENT_METHOD +import app.revanced.patches.reddit.customclients.baconreader.misc.extension.sharedExtensionPatch +import app.revanced.patches.reddit.customclients.fixRedgifsApiPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.iface.reference.TypeReference + +internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/baconreader/FixRedgifsApiPatch;" + +@Suppress("unused") +val fixRedgifsApi = fixRedgifsApiPatch( + extensionPatch = sharedExtensionPatch +) { + compatibleWith( + "com.onelouder.baconreader", + "com.onelouder.baconreader.premium", + ) + + execute { + // region Patch Redgifs OkHttp3 client. + + getOkHttpClientFingerprint.method.apply { + // Remove conflicting OkHttp interceptors. + val originalInterceptorInstallIndex = indexOfFirstInstructionOrThrow { + opcode == Opcode.NEW_INSTANCE && getReference()?.type == "Lcom/onelouder/baconreader/media/gfycat/RedGifsManager\$HeaderInterceptor;" + } + removeInstructions(originalInterceptorInstallIndex, 5) + + val index = indexOfFirstInstructionOrThrow { + val reference = getReference() + reference?.name == "build" && reference.definingClass == "Lokhttp3/OkHttpClient\$Builder;" + } + val register = getInstruction(index).registerC + replaceInstruction( + index, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$INSTALL_NEW_CLIENT_METHOD + """ + ) + } + + // endregion + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatch.kt new file mode 100644 index 000000000..64291f761 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatch.kt @@ -0,0 +1,6 @@ +package app.revanced.patches.reddit.customclients.baconreader.misc.extension + +import app.revanced.patches.reddit.customclients.baconreader.misc.extension.hooks.initHook +import app.revanced.patches.shared.misc.extension.sharedExtensionPatch + +val sharedExtensionPatch = sharedExtensionPatch("baconreader", initHook) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt new file mode 100644 index 000000000..fe644145b --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.reddit.customclients.baconreader.misc.extension.hooks + +import app.revanced.patches.shared.misc.extension.extensionHook + +internal val initHook = extensionHook { + custom { method, _ -> + method.definingClass == "Lcom/onelouder/baconreader/BaconReader;" && method.name == "onCreate" + } +}