Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
29816c940a | ||
|
|
723964bc29 |
@@ -1,3 +1,9 @@
|
||||
## [1.1.0](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.0.3...v1.1.0) (2026-08-21)
|
||||
|
||||
### ✨ New Features
|
||||
|
||||
* remove upgrade button ([723964b](https://git.krtss.de/StanPonomarev/twitter-patch/commit/723964bc29d0a9edc7ad1915c9cf5669fe9e6f95))
|
||||
|
||||
## [1.0.3](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.0.2...v1.0.3) (2026-08-21)
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
@@ -4,9 +4,9 @@ Patch bundle for X (Twitter), maintained by
|
||||
[Stan Ponomarev](https://git.krtss.de/StanPonomarev).
|
||||
|
||||
<!-- PATCHES_START -->
|
||||
> **[v1.0.3](https://git.krtss.de/StanPonomarev/twitter-patch/releases/tag/v1.0.3)** • `main` • 1 patches total
|
||||
> **[v1.1.0](https://git.krtss.de/StanPonomarev/twitter-patch/releases/tag/v1.1.0)** • `main` • 2 patches total
|
||||
<details open>
|
||||
<summary>📦 X • 1 patch</summary>
|
||||
<summary>📦 X • 2 patches</summary>
|
||||
<br>
|
||||
|
||||
**🎯 Supported versions:**
|
||||
@@ -17,6 +17,7 @@ Patch bundle for X (Twitter), maintained by
|
||||
| 💊 Patch | 📜 Description | ⚙️ Options |
|
||||
|----------|----------------|-----------|
|
||||
| [Disable outdated version screen](#disable-outdated-version-screen) | Prevents X from blocking app access when it marks the client version as outdated. | |
|
||||
| [Remove timeline Upgrade button](#remove-timeline-upgrade-button) | Removes the Premium Upgrade button from the timeline's top bar. | |
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
org.gradle.parallel = true
|
||||
org.gradle.caching = true
|
||||
kotlin.code.style = official
|
||||
version = 1.0.3
|
||||
version = 1.1.0
|
||||
|
||||
+4
-4
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"created_at": "2026-08-21T16:15:06",
|
||||
"description": "## [1.0.3](https://git.krtss.de/StanPonomarev/twitter-patch/compare/v1.0.2...v1.0.3) (2026-08-21)\n\n### 🐛 Bug Fixes\n\n* artifact ([0a2b472](https://git.krtss.de/StanPonomarev/twitter-patch/commit/0a2b4725fb53bf0fa741dc4be1a9914ad1e5be8b))",
|
||||
"download_url": "https://git.krtss.de/StanPonomarev/twitter-patch/releases/download/v1.0.3/patches-1.0.3.mpp",
|
||||
"created_at": "2026-08-21T18:50:29",
|
||||
"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))",
|
||||
"download_url": "https://git.krtss.de/StanPonomarev/twitter-patch/releases/download/v1.1.0/patches-1.1.0.mpp",
|
||||
"signature_download_url": "",
|
||||
"version": "1.0.3"
|
||||
"version": "1.1.0"
|
||||
}
|
||||
|
||||
+27
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"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.0.3",
|
||||
"version": "1.1.0",
|
||||
"patches": [
|
||||
{
|
||||
"name": "Disable outdated version screen",
|
||||
@@ -27,6 +27,32 @@
|
||||
}
|
||||
],
|
||||
"options": []
|
||||
},
|
||||
{
|
||||
"name": "Remove timeline Upgrade button",
|
||||
"description": "Removes the Premium Upgrade button from the timeline's top bar.",
|
||||
"default": true,
|
||||
"dependencies": [],
|
||||
"compatiblePackages": [
|
||||
{
|
||||
"packageName": "com.twitter.android",
|
||||
"name": "X",
|
||||
"description": null,
|
||||
"apkFileType": "APKM",
|
||||
"appIconColor": "#000000",
|
||||
"signatures": null,
|
||||
"targets": [
|
||||
{
|
||||
"version": "12.7.1-release.0",
|
||||
"versionCodes": null,
|
||||
"isExperimental": false,
|
||||
"minSdk": 28,
|
||||
"description": null
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"options": []
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
+9
-4
@@ -23,7 +23,7 @@ import kotlin.test.assertTrue
|
||||
|
||||
class MorphePatchIntegrationTest {
|
||||
@Test
|
||||
fun `applies outdated version patch to target APKM`() {
|
||||
fun `applies patches to target APKM`() {
|
||||
val inputApkm = requiredPathProperty("integrationTest.inputApkm")
|
||||
val patchBundle = requiredPathProperty("integrationTest.patchBundle")
|
||||
val morpheCache = requiredPathProperty("integrationTest.morpheCache")
|
||||
@@ -47,7 +47,8 @@ class MorphePatchIntegrationTest {
|
||||
"patch",
|
||||
"--patches=${patchBundle.absolutePathString()}",
|
||||
"--exclusive",
|
||||
"--enable=$PATCH_NAME",
|
||||
"--enable=$OUTDATED_PATCH_NAME",
|
||||
"--enable=$UPGRADE_PATCH_NAME",
|
||||
"--unsigned",
|
||||
"--out=${patchedApk.absolutePathString()}",
|
||||
"--result-file=${resultFile.absolutePathString()}",
|
||||
@@ -91,7 +92,10 @@ class MorphePatchIntegrationTest {
|
||||
|
||||
val appliedPatchNames = result.getAsJsonArray("appliedPatches")
|
||||
.map { it.asJsonObject.get("name").asString }
|
||||
assertTrue(PATCH_NAME in appliedPatchNames, "Expected patch was not applied: $appliedPatchNames")
|
||||
assertTrue(
|
||||
appliedPatchNames.containsAll(listOf(OUTDATED_PATCH_NAME, UPGRADE_PATCH_NAME)),
|
||||
"Expected patches were not applied: $appliedPatchNames"
|
||||
)
|
||||
assertTrue(result.getAsJsonArray("failedPatches").isEmpty, "Morphe reported failed patches")
|
||||
} finally {
|
||||
workDirectory.toFile().deleteRecursively()
|
||||
@@ -142,7 +146,8 @@ class MorphePatchIntegrationTest {
|
||||
}
|
||||
|
||||
private companion object {
|
||||
const val PATCH_NAME = "Disable outdated version screen"
|
||||
const val OUTDATED_PATCH_NAME = "Disable outdated version screen"
|
||||
const val UPGRADE_PATCH_NAME = "Remove timeline Upgrade button"
|
||||
const val MORPHE_VERSION = "1.13.1"
|
||||
const val MORPHE_SHA256 = "a212531f68d3ada4b504bf9dac3e02460589f3bf8868ee66e1b4780152d3466b"
|
||||
const val MORPHE_URL =
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package app.twitter.patches
|
||||
|
||||
import app.morphe.patcher.patch.resourcePatch
|
||||
import app.twitter.patches.shared.Constants.COMPATIBILITY_X
|
||||
import org.w3c.dom.Element
|
||||
|
||||
private const val TOOLBAR_ITEMS_PATH = "res/menu/toolbar_items.xml"
|
||||
private const val UPGRADE_BUTTON_ID = "premium_upsell_upgrade"
|
||||
|
||||
@Suppress("unused")
|
||||
val removeTimelineUpgradeButtonPatch = resourcePatch(
|
||||
name = "Remove timeline Upgrade button",
|
||||
description = "Removes the Premium Upgrade button from the timeline's top bar.",
|
||||
default = true
|
||||
) {
|
||||
compatibleWith(COMPATIBILITY_X)
|
||||
|
||||
execute {
|
||||
document(TOOLBAR_ITEMS_PATH).use { document ->
|
||||
val menu = document.documentElement
|
||||
val upgradeButton = (0 until menu.childNodes.length)
|
||||
.asSequence()
|
||||
.map { menu.childNodes.item(it) }
|
||||
.filterIsInstance<Element>()
|
||||
.single {
|
||||
it.getAttribute("android:id").substringAfterLast('/') == UPGRADE_BUTTON_ID
|
||||
}
|
||||
|
||||
menu.removeChild(upgradeButton)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user