diff --git a/extensions/cricbuzz/build.gradle.kts b/extensions/cricbuzz/build.gradle.kts new file mode 100644 index 0000000000..7d4adde29b --- /dev/null +++ b/extensions/cricbuzz/build.gradle.kts @@ -0,0 +1,4 @@ +dependencies { + compileOnly(project(":extensions:shared:library")) + compileOnly(project(":extensions:cricbuzz:stub")) +} \ No newline at end of file diff --git a/extensions/cricbuzz/src/main/AndroidManifest.xml b/extensions/cricbuzz/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..9b65eb06cf --- /dev/null +++ b/extensions/cricbuzz/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/extensions/cricbuzz/src/main/java/app/revanced/extension/cricbuzz/HideAdsPatch.java b/extensions/cricbuzz/src/main/java/app/revanced/extension/cricbuzz/HideAdsPatch.java new file mode 100644 index 0000000000..9338e2978f --- /dev/null +++ b/extensions/cricbuzz/src/main/java/app/revanced/extension/cricbuzz/HideAdsPatch.java @@ -0,0 +1,28 @@ +package app.revanced.extension.cricbuzz.ads; + +import com.cricbuzz.android.data.rest.model.BottomBar; +import java.util.List; +import java.util.Iterator; +import app.revanced.extension.shared.Logger; + +@SuppressWarnings("unused") +public class HideAdsPatch { + + /** + * Injection point. + */ + public static void filterCb11(List list) { + try { + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + BottomBar bar = iterator.next(); + if (bar.getName().equals("Cricbuzz11")) { + Logger.printInfo(() -> "Removing Cricbuzz11 bar: " + bar); + iterator.remove(); + } + } + } catch (Exception ex) { + Logger.printException(() -> "filterCb11 failure", ex); + } + } +} \ No newline at end of file diff --git a/extensions/cricbuzz/stub/build.gradle.kts b/extensions/cricbuzz/stub/build.gradle.kts new file mode 100644 index 0000000000..7744c0eaac --- /dev/null +++ b/extensions/cricbuzz/stub/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + alias(libs.plugins.android.library) +} + +android { + namespace = "app.revanced.extension" + compileSdk = 34 + + defaultConfig { + minSdk = 21 + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} diff --git a/extensions/cricbuzz/stub/src/main/AndroidManifest.xml b/extensions/cricbuzz/stub/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..9b65eb06cf --- /dev/null +++ b/extensions/cricbuzz/stub/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/extensions/cricbuzz/stub/src/main/java/com/cricbuzz/android/data/rest/model/BottomBar.java b/extensions/cricbuzz/stub/src/main/java/com/cricbuzz/android/data/rest/model/BottomBar.java new file mode 100644 index 0000000000..2b2660c320 --- /dev/null +++ b/extensions/cricbuzz/stub/src/main/java/com/cricbuzz/android/data/rest/model/BottomBar.java @@ -0,0 +1,5 @@ +package com.cricbuzz.android.data.rest.model; + +public final class BottomBar { + public final String getName() { throw new UnsupportedOperationException(); } +} \ No newline at end of file diff --git a/patches/api/patches.api b/patches/api/patches.api index aa2e2ece27..8a481d6c97 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -168,6 +168,10 @@ public final class app/revanced/patches/cricbuzz/ads/DisableAdsPatchKt { public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/cricbuzz/misc/extension/ExtensionPatchKt { + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/crunchyroll/ads/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/DisableAdsPatch.kt index 4d6f49440f..3a1829dbc8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/DisableAdsPatch.kt @@ -3,24 +3,38 @@ package app.revanced.patches.cricbuzz.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.cricbuzz.misc.extension.sharedExtensionPatch +import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/cricbuzz/ads/HideAdsPatch;" @Suppress("unused") val disableAdsPatch = bytecodePatch ( name = "Hide ads", ) { - compatibleWith("com.cricbuzz.android"("6.23.02")) + compatibleWith("com.cricbuzz.android"("6.24.01")) + + dependsOn(sharedExtensionPatch) execute { - userStateSwitchFingerprint.method.apply { - val opcodeIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_OBJECT) - val register = getInstruction(opcodeIndex).registerA + userStateSwitchFingerprint.method.returnEarly(true) + + // Remove region-specific Cricbuzz11 elements. + cb11ConstructorFingerprint.method.addInstruction(0, "const/4 p7, 0x0") + getBottomBarFingerprint.method.apply { + val getIndex = indexOfFirstInstructionOrThrow() { + opcode == Opcode.IGET_OBJECT && getReference()?.name == "bottomBar" + } + val getRegister = getInstruction(getIndex).registerA - addInstruction( - opcodeIndex + 1, - "const-string v$register, \"ACTIVE\"" + addInstruction(getIndex + 1, + "invoke-static { v$getRegister }, $EXTENSION_CLASS_DESCRIPTOR->filterCb11(Ljava/util/List;)V" ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt index eabee77114..9dd6844fda 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt @@ -4,6 +4,30 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode internal val userStateSwitchFingerprint = fingerprint { - strings("key.user.state", "NA") opcodes(Opcode.SPARSE_SWITCH) + strings("key.user.state", "NA") } + +internal val cb11ConstructorFingerprint = fingerprint { + parameters( + "Ljava/lang/String;", + "Ljava/lang/String;", + "Ljava/lang/String;", + "I", + "Ljava/lang/String;", + "Ljava/lang/String;", + "Z", + "Ljava/lang/String;", + "Ljava/lang/String;", + "L" + ) + custom { _, classDef -> + classDef.endsWith("CB11Details;") + } +} + +internal val getBottomBarFingerprint = fingerprint { + custom { method, classDef -> + method.name == "getBottomBar" && classDef.endsWith("HomeMenu;") + } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/ExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/ExtensionPatch.kt new file mode 100644 index 0000000000..975ee2db77 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/ExtensionPatch.kt @@ -0,0 +1,5 @@ +package app.revanced.patches.cricbuzz.misc.extension + +import app.revanced.patches.shared.misc.extension.sharedExtensionPatch + +val sharedExtensionPatch = sharedExtensionPatch("cricbuzz", applicationInitHook) diff --git a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/Hooks.kt new file mode 100644 index 0000000000..c6520086d3 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/Hooks.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.cricbuzz.misc.extension + +import app.revanced.patches.shared.misc.extension.extensionHook + +internal val applicationInitHook = extensionHook { + custom { method, classDef -> + method.name == "onCreate" && classDef.endsWith("/NyitoActivity;") + } +}