8 Commits
Author SHA1 Message Date
semantic-release-bot 015ce16efc chore: Release v1.1.4 [skip ci]
## [1.1.4](http://gitea:3000/StanPonomarev/twitter-patch/compare/v1.1.3...v1.1.4) (2026-08-22)

### 🐛 Bug Fixes

* more update required fixes ([97c30af](http://gitea:3000/StanPonomarev/twitter-patch/commit/97c30af97d00e7f92b5c2801e9e744f00704758a))
2026-08-22 19:19:36 +00:00
StanPonomarev 97c30af97d fix: more update required fixes
Release / Release (push) Successful in 58s
2026-08-22 21:18:38 +02:00
semantic-release-bot 7727f37a18 chore: Release v1.1.3 [skip ci]
## [1.1.3](http://gitea:3000/StanPonomarev/twitter-patch/compare/v1.1.2...v1.1.3) (2026-08-22)

### 🐛 Bug Fixes

* xchat shutting down the app ([1985bf3](http://gitea:3000/StanPonomarev/twitter-patch/commit/1985bf307b4552655216079082757a53af00140b))
2026-08-22 15:34:34 +00:00
StanPonomarev 1985bf307b fix: xchat shutting down the app
Release / Release (push) Successful in 54s
2026-08-22 17:33:41 +02:00
semantic-release-bot 351917cbbd chore: Release v1.1.2 [skip ci]
## [1.1.2](http://gitea:3000/StanPonomarev/twitter-patch/compare/v1.1.1...v1.1.2) (2026-08-22)

### 🐛 Bug Fixes

* manifest ([7062792](http://gitea:3000/StanPonomarev/twitter-patch/commit/7062792215590cce79caa6e78354ee73375eaa79))
2026-08-22 08:27:54 +00:00
StanPonomarev 7062792215 fix: manifest
Release / Release (push) Successful in 58s
2026-08-22 10:26:52 +02:00
semantic-release-bot 1b47dcf787 chore: Release v1.1.1 [skip ci]
## [1.1.1](http://gitea:3000/StanPonomarev/twitter-patch/compare/v1.1.0...v1.1.1) (2026-08-21)

### 🐛 Bug Fixes

* update screen ([cb1230a](http://gitea:3000/StanPonomarev/twitter-patch/commit/cb1230a7abf46edb11f2b8dad100b091dd672aee))
2026-08-21 23:30:10 +00:00
StanPonomarev cb1230a7ab fix: update screen
Release / Release (push) Successful in 56s
2026-08-22 01:29:12 +02:00
6 changed files with 169 additions and 8 deletions
+24
View File
@@ -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
+1 -1
View File
@@ -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)**&nbsp;&nbsp;•&nbsp;&nbsp;`main`&nbsp;&nbsp;•&nbsp;&nbsp;2 patches total > **[v1.1.4](https://git.krtss.de/StanPonomarev/twitter-patch/releases/tag/v1.1.4)**&nbsp;&nbsp;•&nbsp;&nbsp;`main`&nbsp;&nbsp;•&nbsp;&nbsp;2 patches total
<details open> <details open>
<summary>📦 X&nbsp;&nbsp;•&nbsp;&nbsp;2 patches</summary> <summary>📦 X&nbsp;&nbsp;•&nbsp;&nbsp;2 patches</summary>
<br> <br>
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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"
)
} }
} }