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) }