2 Commits
Author SHA1 Message Date
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 117 additions and 8 deletions
+6
View File
@@ -1,3 +1,9 @@
## [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.1](https://git.krtss.de/StanPonomarev/twitter-patch/releases/tag/v1.1.1)**&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.1
+4 -4
View File
@@ -1,7 +1,7 @@
{ {
"created_at": "2026-08-21T18:50:29", "created_at": "2026-08-21T23:29:59",
"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.1](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.1.0...v1.1.1) (2026-08-21)\n\n### 🐛 Bug Fixes\n\n* update screen ([cb1230a](https://git.krtss.de/StanPonomarev/twitter-patch/commit/cb1230a7abf46edb11f2b8dad100b091dd672aee))",
"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.1/patches-1.1.1.mpp",
"signature_download_url": "", "signature_download_url": "",
"version": "1.1.0" "version": "1.1.1"
} }
+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.1",
"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,36 @@ private val shutdownStateFingerprint = Fingerprint(
parameters = emptyList() parameters = emptyList()
) )
private const val APP_UPDATE_ACTIVITY = "com.twitter.clientshutdown.update.AppUpdateActivity"
private const val APP_UPDATE_ACTIVITY_ALIAS = "com.twitter.clientshutdown.update.AppUpdateActivityAlias"
private const val START_ACTIVITY = "com.twitter.android.StartActivity"
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")
val appUpdateActivityAlias = document.getElementsByTagName("activity-alias")
.let { aliases ->
(0 until aliases.length)
.asSequence()
.map { aliases.item(it) }
.filterIsInstance<Element>()
.single { it.getAttribute("android:name") == APP_UPDATE_ACTIVITY_ALIAS }
}
appUpdateActivityAlias.setAttribute("android:targetActivity", START_ACTIVITY)
}
}
}
@Suppress("unused") @Suppress("unused")
val disableOutdatedVersionScreenPatch = bytecodePatch( val disableOutdatedVersionScreenPatch = bytecodePatch(
name = "Disable outdated version screen", name = "Disable outdated version screen",
@@ -27,8 +94,42 @@ 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,
"return-void"
)
outdatedVersionEnforcementFingerprint.method.addInstructions( outdatedVersionEnforcementFingerprint.method.addInstructions(
0, 0,
""" """