Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
015ce16efc | ||
|
|
97c30af97d | ||
|
|
7727f37a18 | ||
|
|
1985bf307b | ||
|
|
351917cbbd | ||
|
|
7062792215 | ||
|
|
1b47dcf787 | ||
|
|
cb1230a7ab |
@@ -1,3 +1,27 @@
|
|||||||
|
## [1.1.4](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.1.3...v1.1.4) (2026-08-22)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
* more update required fixes ([97c30af](https://git.krtss.de/StanPonomarev/twitter-patch/commit/97c30af97d00e7f92b5c2801e9e744f00704758a))
|
||||||
|
|
||||||
|
## [1.1.3](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.1.2...v1.1.3) (2026-08-22)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
* xchat shutting down the app ([1985bf3](https://git.krtss.de/StanPonomarev/twitter-patch/commit/1985bf307b4552655216079082757a53af00140b))
|
||||||
|
|
||||||
|
## [1.1.2](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.1.1...v1.1.2) (2026-08-22)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
* manifest ([7062792](https://git.krtss.de/StanPonomarev/twitter-patch/commit/7062792215590cce79caa6e78354ee73375eaa79))
|
||||||
|
|
||||||
|
## [1.1.1](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.1.0...v1.1.1) (2026-08-21)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
* update screen ([cb1230a](https://git.krtss.de/StanPonomarev/twitter-patch/commit/cb1230a7abf46edb11f2b8dad100b091dd672aee))
|
||||||
|
|
||||||
## [1.1.0](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.0.3...v1.1.0) (2026-08-21)
|
## [1.1.0](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.0.3...v1.1.0) (2026-08-21)
|
||||||
|
|
||||||
### ✨ New Features
|
### ✨ New Features
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Patch bundle for X (Twitter), maintained by
|
|||||||
[Stan Ponomarev](https://git.krtss.de/StanPonomarev).
|
[Stan Ponomarev](https://git.krtss.de/StanPonomarev).
|
||||||
|
|
||||||
<!-- PATCHES_START -->
|
<!-- PATCHES_START -->
|
||||||
> **[v1.1.0](https://git.krtss.de/StanPonomarev/twitter-patch/releases/tag/v1.1.0)** • `main` • 2 patches total
|
> **[v1.1.4](https://git.krtss.de/StanPonomarev/twitter-patch/releases/tag/v1.1.4)** • `main` • 2 patches total
|
||||||
<details open>
|
<details open>
|
||||||
<summary>📦 X • 2 patches</summary>
|
<summary>📦 X • 2 patches</summary>
|
||||||
<br>
|
<br>
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
org.gradle.parallel = true
|
org.gradle.parallel = true
|
||||||
org.gradle.caching = true
|
org.gradle.caching = true
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 1.1.0
|
version = 1.1.4
|
||||||
|
|||||||
+4
-4
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"created_at": "2026-08-21T18:50:29",
|
"created_at": "2026-08-22T19:19:24",
|
||||||
"description": "## [1.1.0](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.0.3...v1.1.0) (2026-08-21)\n\n### ✨ New Features\n\n* remove upgrade button ([723964b](https://git.krtss.de/StanPonomarev/twitter-patch/commit/723964bc29d0a9edc7ad1915c9cf5669fe9e6f95))",
|
"description": "## [1.1.4](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.1.3...v1.1.4) (2026-08-22)\n\n### 🐛 Bug Fixes\n\n* more update required fixes ([97c30af](https://git.krtss.de/StanPonomarev/twitter-patch/commit/97c30af97d00e7f92b5c2801e9e744f00704758a))",
|
||||||
"download_url": "https://git.krtss.de/StanPonomarev/twitter-patch/releases/download/v1.1.0/patches-1.1.0.mpp",
|
"download_url": "https://git.krtss.de/StanPonomarev/twitter-patch/releases/download/v1.1.4/patches-1.1.4.mpp",
|
||||||
"signature_download_url": "",
|
"signature_download_url": "",
|
||||||
"version": "1.1.0"
|
"version": "1.1.4"
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -1,12 +1,14 @@
|
|||||||
{
|
{
|
||||||
"NOTE": "Do NOT manually edit this file. This file is automatically updated when semantic release (release.yml) runs. Manually editing this file can break your releases and break third party tools that use this file.",
|
"NOTE": "Do NOT manually edit this file. This file is automatically updated when semantic release (release.yml) runs. Manually editing this file can break your releases and break third party tools that use this file.",
|
||||||
"version": "1.1.0",
|
"version": "1.1.4",
|
||||||
"patches": [
|
"patches": [
|
||||||
{
|
{
|
||||||
"name": "Disable outdated version screen",
|
"name": "Disable outdated version screen",
|
||||||
"description": "Prevents X from blocking app access when it marks the client version as outdated.",
|
"description": "Prevents X from blocking app access when it marks the client version as outdated.",
|
||||||
"default": true,
|
"default": true,
|
||||||
"dependencies": [],
|
"dependencies": [
|
||||||
|
"ResourcePatch"
|
||||||
|
],
|
||||||
"compatiblePackages": [
|
"compatiblePackages": [
|
||||||
{
|
{
|
||||||
"packageName": "com.twitter.android",
|
"packageName": "com.twitter.android",
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ package app.twitter.patches
|
|||||||
import app.morphe.patcher.extensions.InstructionExtensions.addInstructions
|
import app.morphe.patcher.extensions.InstructionExtensions.addInstructions
|
||||||
import app.morphe.patcher.Fingerprint
|
import app.morphe.patcher.Fingerprint
|
||||||
import app.morphe.patcher.patch.bytecodePatch
|
import app.morphe.patcher.patch.bytecodePatch
|
||||||
|
import app.morphe.patcher.patch.resourcePatch
|
||||||
import app.twitter.patches.shared.Constants.COMPATIBILITY_X
|
import app.twitter.patches.shared.Constants.COMPATIBILITY_X
|
||||||
|
import org.w3c.dom.Element
|
||||||
|
|
||||||
private val outdatedVersionEnforcementFingerprint = Fingerprint(
|
private val outdatedVersionEnforcementFingerprint = Fingerprint(
|
||||||
definingClass = "Lcom/twitter/subsystem/clientshutdown/o;",
|
definingClass = "Lcom/twitter/subsystem/clientshutdown/o;",
|
||||||
@@ -13,6 +15,41 @@ private val outdatedVersionEnforcementFingerprint = Fingerprint(
|
|||||||
strings = listOf("Target version is ", "Detected shutdown")
|
strings = listOf("Target version is ", "Detected shutdown")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private val forceUpdateNavigationFingerprint = Fingerprint(
|
||||||
|
definingClass = "Lcom/x/android/main/helpers/o8;",
|
||||||
|
name = "a",
|
||||||
|
returnType = "Lcom/x/compose/core/o2;",
|
||||||
|
parameters = listOf(
|
||||||
|
"Lcom/x/navigation/RootNavigationArgs;",
|
||||||
|
"Lcom/arkivanov/decompose/c;",
|
||||||
|
"Lcom/x/navigation/f1;"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
private val shutdownForegroundHandlerFingerprint = Fingerprint(
|
||||||
|
definingClass = "Lcom/twitter/subsystem/clientshutdown/m;",
|
||||||
|
name = "invoke",
|
||||||
|
returnType = "Ljava/lang/Object;",
|
||||||
|
parameters = listOf("Ljava/lang/Object;"),
|
||||||
|
strings = listOf("Entered foreground, shutdown is ", "Launching app update")
|
||||||
|
)
|
||||||
|
|
||||||
|
private val appUpdateLauncherFingerprint = Fingerprint(
|
||||||
|
definingClass = "Lcom/twitter/subsystem/clientshutdown/i;",
|
||||||
|
name = "a",
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf("Ljava/lang/String;"),
|
||||||
|
strings = listOf("Launching app update")
|
||||||
|
)
|
||||||
|
|
||||||
|
private val shutdownEntryPointDisablerFingerprint = Fingerprint(
|
||||||
|
definingClass = "Lcom/twitter/subsystem/clientshutdown/i;",
|
||||||
|
name = "b",
|
||||||
|
returnType = "V",
|
||||||
|
parameters = emptyList(),
|
||||||
|
strings = listOf("com.twitter.clientshutdown.update.AppUpdateActivityAlias")
|
||||||
|
)
|
||||||
|
|
||||||
private val shutdownStateFingerprint = Fingerprint(
|
private val shutdownStateFingerprint = Fingerprint(
|
||||||
definingClass = "Lcom/twitter/subsystem/clientshutdown/q;",
|
definingClass = "Lcom/twitter/subsystem/clientshutdown/q;",
|
||||||
name = "isShutdown",
|
name = "isShutdown",
|
||||||
@@ -20,6 +57,51 @@ private val shutdownStateFingerprint = Fingerprint(
|
|||||||
parameters = emptyList()
|
parameters = emptyList()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private val appUpdateScreenRendererFingerprint = Fingerprint(
|
||||||
|
definingClass = "Lcom/twitter/clientshutdown/update/j;",
|
||||||
|
name = "<init>",
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf(
|
||||||
|
"Landroid/view/View;",
|
||||||
|
"Landroid/app/Activity;",
|
||||||
|
"Lcom/twitter/app/common/activity/b;",
|
||||||
|
"Lcom/twitter/subsystem/clientshutdown/api/c;"
|
||||||
|
),
|
||||||
|
strings = listOf("rootView", "activityFinisher", "eventLogHelper")
|
||||||
|
)
|
||||||
|
|
||||||
|
private val forceUpdateScreenRendererFingerprint = Fingerprint(
|
||||||
|
definingClass = "Lcom/x/forceupdate/g;",
|
||||||
|
name = "a",
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf(
|
||||||
|
"Lkotlin/jvm/functions/Function0;",
|
||||||
|
"Lkotlin/jvm/functions/Function1;",
|
||||||
|
"Landroidx/compose/ui/Modifier;",
|
||||||
|
"Landroidx/compose/runtime/Composer;",
|
||||||
|
"I"
|
||||||
|
),
|
||||||
|
strings = listOf("onUpdateClick", "onLearnMoreClick")
|
||||||
|
)
|
||||||
|
|
||||||
|
private const val APP_UPDATE_ACTIVITY = "com.twitter.clientshutdown.update.AppUpdateActivity"
|
||||||
|
|
||||||
|
private val disableOutdatedVersionActivityPatch = resourcePatch {
|
||||||
|
execute {
|
||||||
|
document("AndroidManifest.xml").use { document ->
|
||||||
|
val appUpdateActivity = document.getElementsByTagName("activity")
|
||||||
|
.let { activities ->
|
||||||
|
(0 until activities.length)
|
||||||
|
.asSequence()
|
||||||
|
.map { activities.item(it) }
|
||||||
|
.filterIsInstance<Element>()
|
||||||
|
.single { it.getAttribute("android:name") == APP_UPDATE_ACTIVITY }
|
||||||
|
}
|
||||||
|
appUpdateActivity.setAttribute("android:enabled", "false")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
val disableOutdatedVersionScreenPatch = bytecodePatch(
|
val disableOutdatedVersionScreenPatch = bytecodePatch(
|
||||||
name = "Disable outdated version screen",
|
name = "Disable outdated version screen",
|
||||||
@@ -27,8 +109,44 @@ val disableOutdatedVersionScreenPatch = bytecodePatch(
|
|||||||
default = true
|
default = true
|
||||||
) {
|
) {
|
||||||
compatibleWith(COMPATIBILITY_X)
|
compatibleWith(COMPATIBILITY_X)
|
||||||
|
dependsOn(disableOutdatedVersionActivityPatch)
|
||||||
|
|
||||||
execute {
|
execute {
|
||||||
|
forceUpdateNavigationFingerprint.method.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
move-object/from16 v2, p1
|
||||||
|
instance-of v0, v2, Lcom/x/navigation/ForceUpdateArgs;
|
||||||
|
if-eqz v0, :force_update_allowed
|
||||||
|
sget-object v0, Lcom/x/navigation/MainLandingArgs${'$'}TabType;->HOME:Lcom/x/navigation/MainLandingArgs${'$'}TabType;
|
||||||
|
const/4 v1, 0x0
|
||||||
|
new-instance v2, Lcom/x/navigation/MainLandingArgs;
|
||||||
|
invoke-direct {v2, v0, v1, v1, v1}, Lcom/x/navigation/MainLandingArgs;-><init>(Lcom/x/navigation/MainLandingArgs${'$'}TabType;Lcom/x/navigation/AcceptGroupInviteArgs;Lcom/x/navigation/RootNavigationArgs;Lcom/x/models/PostIdentifier;)V
|
||||||
|
move-object/16 p1, v2
|
||||||
|
:force_update_allowed
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
shutdownForegroundHandlerFingerprint.method.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
sget-object v0, Lkotlin/Unit;->a:Lkotlin/Unit;
|
||||||
|
return-object v0
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
appUpdateLauncherFingerprint.method.addInstructions(
|
||||||
|
0,
|
||||||
|
"return-void"
|
||||||
|
)
|
||||||
|
|
||||||
|
shutdownEntryPointDisablerFingerprint.method.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
invoke-virtual {p0}, Lcom/twitter/subsystem/clientshutdown/i;->c()V
|
||||||
|
return-void
|
||||||
|
"""
|
||||||
|
)
|
||||||
outdatedVersionEnforcementFingerprint.method.addInstructions(
|
outdatedVersionEnforcementFingerprint.method.addInstructions(
|
||||||
0,
|
0,
|
||||||
"""
|
"""
|
||||||
@@ -44,5 +162,22 @@ val disableOutdatedVersionScreenPatch = bytecodePatch(
|
|||||||
return v0
|
return v0
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
|
|
||||||
|
appUpdateScreenRendererFingerprint.method.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
new-instance v0, Lcom/twitter/subsystem/clientshutdown/a;
|
||||||
|
invoke-direct {v0, p2}, Lcom/twitter/subsystem/clientshutdown/a;-><init>(Landroid/content/Context;)V
|
||||||
|
const/4 v1, 0x2
|
||||||
|
const-string v2, "com.twitter.clientshutdown.update.AppUpdateActivityAlias"
|
||||||
|
invoke-virtual {v0, v1, v2}, Lcom/twitter/subsystem/clientshutdown/a;->b(ILjava/lang/String;)V
|
||||||
|
invoke-virtual {p2}, Landroid/app/Activity;->finish()V
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
forceUpdateScreenRendererFingerprint.method.addInstructions(
|
||||||
|
0,
|
||||||
|
"return-void"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user