diff --git a/extensions/messenger/build.gradle.kts b/extensions/messenger/build.gradle.kts
new file mode 100644
index 000000000..8cf6305c1
--- /dev/null
+++ b/extensions/messenger/build.gradle.kts
@@ -0,0 +1,3 @@
+dependencies {
+ compileOnly(project(":extensions:shared:library"))
+}
diff --git a/extensions/messenger/src/main/AndroidManifest.xml b/extensions/messenger/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..9b65eb06c
--- /dev/null
+++ b/extensions/messenger/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+
diff --git a/extensions/messenger/src/main/java/app/revanced/extension/messenger/metaai/RemoveMetaAIPatch.java b/extensions/messenger/src/main/java/app/revanced/extension/messenger/metaai/RemoveMetaAIPatch.java
new file mode 100644
index 000000000..94684f687
--- /dev/null
+++ b/extensions/messenger/src/main/java/app/revanced/extension/messenger/metaai/RemoveMetaAIPatch.java
@@ -0,0 +1,15 @@
+package app.revanced.extension.messenger.metaai;
+
+@SuppressWarnings("unused")
+public class RemoveMetaAIPatch {
+ public static boolean overrideConfigBool(long id, boolean value) {
+ // It seems like all configs starting with 363219 are related to Meta AI.
+ // A list of specific ones that need disabling would probably be better,
+ // but these config numbers seem to change slightly with each update.
+ // These first 6 digits don't though.
+ if (Long.toString(id).startsWith("363219"))
+ return false;
+
+ return value;
+ }
+}
diff --git a/patches/api/patches.api b/patches/api/patches.api
index 30ea1948e..49dd6a7ea 100644
--- a/patches/api/patches.api
+++ b/patches/api/patches.api
@@ -284,6 +284,14 @@ public final class app/revanced/patches/messenger/inputfield/DisableTypingIndica
public static final fun getDisableTypingIndicatorPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
+public final class app/revanced/patches/messenger/metaai/RemoveMetaAIPatchKt {
+ public static final fun getRemoveMetaAIPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
+}
+
+public final class app/revanced/patches/messenger/misc/extension/ExtensionPatchKt {
+ public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
+}
+
public final class app/revanced/patches/messenger/navbar/RemoveMetaAITabPatchKt {
public static final fun getRemoveMetaAITabPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt
new file mode 100644
index 000000000..80b94bf1a
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt
@@ -0,0 +1,14 @@
+package app.revanced.patches.messenger.metaai
+
+import com.android.tools.smali.dexlib2.Opcode
+import app.revanced.patcher.fingerprint
+
+internal val getMobileConfigBoolFingerprint = fingerprint {
+ parameters("J")
+ returns("Z")
+ opcodes(Opcode.RETURN)
+ custom { method, classDef ->
+ method.implementation ?: return@custom false // unsure if this is necessary
+ classDef.interfaces.contains("Lcom/facebook/mobileconfig/factory/MobileConfigUnsafeContext;")
+ }
+}
\ No newline at end of file
diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt
new file mode 100644
index 000000000..ea10ed6fc
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt
@@ -0,0 +1,35 @@
+package app.revanced.patches.messenger.metaai
+
+import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
+import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
+import app.revanced.patcher.patch.bytecodePatch
+import app.revanced.patches.messenger.misc.extension.sharedExtensionPatch
+import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
+
+private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/messenger/metaai/RemoveMetaAIPatch;"
+
+@Suppress("unused")
+val removeMetaAIPatch = bytecodePatch(
+ name = "Remove Meta AI",
+ description = "Removes UI elements related to Meta AI."
+) {
+ compatibleWith("com.facebook.orca")
+
+ dependsOn(sharedExtensionPatch)
+
+ execute {
+ getMobileConfigBoolFingerprint.method.apply {
+ val returnIndex = getMobileConfigBoolFingerprint.patternMatch!!.startIndex
+ val returnRegister = getInstruction(returnIndex).registerA
+
+ addInstructions(
+ returnIndex,
+ """
+ invoke-static {p1, p2, v$returnRegister}, $EXTENSION_CLASS_DESCRIPTOR->overrideConfigBool(JZ)Z
+
+ move-result v$returnRegister
+ """
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/ExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/ExtensionPatch.kt
new file mode 100644
index 000000000..0de5210ee
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/ExtensionPatch.kt
@@ -0,0 +1,5 @@
+package app.revanced.patches.messenger.misc.extension
+
+import app.revanced.patches.shared.misc.extension.sharedExtensionPatch
+
+val sharedExtensionPatch = sharedExtensionPatch("messenger", mainActivityOnCreateHook)
\ No newline at end of file
diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt
new file mode 100644
index 000000000..0700c3209
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt
@@ -0,0 +1,7 @@
+package app.revanced.patches.messenger.misc.extension
+
+import app.revanced.patches.shared.misc.extension.extensionHook
+
+internal val mainActivityOnCreateHook = extensionHook {
+ strings("MainActivity_onCreate_begin")
+}
diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/Fingerprints.kt
deleted file mode 100644
index 766e20209..000000000
--- a/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/Fingerprints.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package app.revanced.patches.messenger.navbar
-
-import app.revanced.patcher.fingerprint
-import com.android.tools.smali.dexlib2.Opcode
-
-internal val createTabConfigurationFingerprint = fingerprint {
- strings("MessengerTabConfigurationCreator.createTabConfiguration")
- opcodes(
- Opcode.INVOKE_DIRECT,
- Opcode.MOVE_RESULT,
- Opcode.IF_EQZ,
- Opcode.INVOKE_DIRECT,
- Opcode.MOVE_RESULT,
- Opcode.IF_EQZ,
- )
-}
diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt
index 75fb98577..280f448b3 100644
--- a/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt
@@ -1,25 +1,12 @@
package app.revanced.patches.messenger.navbar
import app.revanced.patcher.patch.bytecodePatch
-import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
-import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
-import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
+import app.revanced.patches.messenger.metaai.removeMetaAIPatch
+@Deprecated("Superseded by removeMetaAIPatch", ReplaceWith("removeMetaAIPatch"))
@Suppress("unused")
val removeMetaAITabPatch = bytecodePatch(
- name = "Remove Meta AI tab",
description = "Removes the 'Meta AI' tab from the navbar.",
) {
- compatibleWith("com.facebook.orca")
-
- execute {
- createTabConfigurationFingerprint.let {
- val moveResultIndex = it.patternMatch!!.startIndex + 1
- val enabledRegister = it.method.getInstruction(moveResultIndex).registerA
- it.method.replaceInstruction(
- moveResultIndex,
- "const/4 v$enabledRegister, 0x0"
- )
- }
- }
+ dependsOn(removeMetaAIPatch)
}