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;")
+ }
+}