diff --git a/CHANGELOG.md b/CHANGELOG.md
index 73f0113..ae327bc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,22 @@
+# [1.14.0-dev.1](https://github.com/IndusAryan/twitter-patches/compare/v1.13.0...v1.14.0-dev.1) (2024-04-02)
+
+
+### Bug Fixes
+
+* **twitter:** fix crash ([9f6aaa4](https://github.com/IndusAryan/twitter-patches/commit/9f6aaa42eeace22f539a533b1cf8fda7488ea116))
+* **twitter:** fix monochrome ([4d6622a](https://github.com/IndusAryan/twitter-patches/commit/4d6622a29d18da3fdbcc0412310ca141b738bc40))
+* **twitter:** fix monochrome again lmao ([37375b7](https://github.com/IndusAryan/twitter-patches/commit/37375b771babeb99f0c44e5fccf8f996904dcce0))
+
+
+### Features
+
+* **twitter:** add warning. ([2cd9fc4](https://github.com/IndusAryan/twitter-patches/commit/2cd9fc47495f4f51e685cbcc45370ea60138f879))
+* **twitter:** initial patch release ([23740b0](https://github.com/IndusAryan/twitter-patches/commit/23740b061cda6bab54f2692bbd248ea78604a106))
+* **twitter:** new patches ([bc94acd](https://github.com/IndusAryan/twitter-patches/commit/bc94acda01cbb78065a7b4b190ad5f082ae89075))
+* **twitter:** prepare merge ([e22f6ec](https://github.com/IndusAryan/twitter-patches/commit/e22f6ec42bc010c3d4f1702d41e46d7d6462264d))
+* **twitter:** prepare merge2 ([33626bb](https://github.com/IndusAryan/twitter-patches/commit/33626bbd5d4608718f1b365cdcab78ddc90dd341))
+* **twitter:** upstream with piko ([005fbc5](https://github.com/IndusAryan/twitter-patches/commit/005fbc5cdbbd34759df26d4c96ba1b51856b06fe))
+
# [1.12.0-dev.6](https://github.com/IndusAryan/twitter-patches/compare/v1.12.0-dev.5...v1.12.0-dev.6) (2024-03-22)
diff --git a/README.md b/README.md
index fd39a57..92e6fc3 100644
--- a/README.md
+++ b/README.md
@@ -22,6 +22,7 @@ To use these patches, follow the steps below:
1. Make `IndusAryan` the organization for your Revanced app.
2. Set `twitter-patches` as the source for your patches.
+3. Use `crimera` as integration organization due to implementation of Mod menu.
diff --git a/build.gradle.kts b/build.gradle.kts
index b35b5e0..a164241 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,7 +1,7 @@
import org.gradle.kotlin.dsl.support.listFilesOrdered
plugins {
- kotlin("jvm") version "1.9.22"
+ kotlin("jvm") version "1.9.23"
`maven-publish`
}
diff --git a/gradle.properties b/gradle.properties
index 1f296f9..65649c5 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,4 @@
org.gradle.parallel = true
org.gradle.caching = true
kotlin.code.style = official
-version = 1.12.0-dev.6
+version = 1.14.0-dev.1
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 3eaa44c..dc46a81 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,7 +1,7 @@
[versions]
revanced-patcher = "19.2.0"
smali = "3.0.5"
-guava = "33.0.0-jre"
+guava = "33.1.0-jre"
gson = "2.10.1"
[libraries]
diff --git a/package-lock.json b/package-lock.json
index bd981ac..dcda081 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"gradle-semantic-release-plugin": "^1.9.1",
- "semantic-release": "^23.0.2"
+ "semantic-release": "^23.0.6"
}
},
"node_modules/@babel/code-frame": {
@@ -272,9 +272,9 @@
}
},
"node_modules/@octokit/openapi-types": {
- "version": "19.1.0",
- "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz",
- "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
+ "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==",
"dev": true
},
"node_modules/@octokit/plugin-paginate-rest": {
@@ -355,12 +355,12 @@
}
},
"node_modules/@octokit/types": {
- "version": "12.4.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.4.0.tgz",
- "integrity": "sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==",
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
+ "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
"dev": true,
"dependencies": {
- "@octokit/openapi-types": "^19.1.0"
+ "@octokit/openapi-types": "^20.0.0"
}
},
"node_modules/@pnpm/config.env-replace": {
@@ -2896,9 +2896,9 @@
}
},
"node_modules/npm": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/npm/-/npm-10.4.0.tgz",
- "integrity": "sha512-RS7Mx0OVfXlOcQLRePuDIYdFCVBPCNapWHplDK+mh7GDdP/Tvor4ocuybRRPSvfcRb2vjRJt1fHCqw3cr8qACQ==",
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/npm/-/npm-10.5.0.tgz",
+ "integrity": "sha512-Ejxwvfh9YnWVU2yA5FzoYLTW52vxHCz+MHrOFg9Cc8IFgF/6f5AGPAvb5WTay5DIUP1NIfN3VBZ0cLlGO0Ys+A==",
"bundleDependencies": [
"@isaacs/string-locale-compare",
"@npmcli/arborist",
@@ -2981,7 +2981,7 @@
"@npmcli/package-json": "^5.0.0",
"@npmcli/promise-spawn": "^7.0.1",
"@npmcli/run-script": "^7.0.4",
- "@sigstore/tuf": "^2.3.0",
+ "@sigstore/tuf": "^2.3.1",
"abbrev": "^2.0.0",
"archy": "~1.0.0",
"cacache": "^18.0.2",
@@ -3032,7 +3032,7 @@
"proc-log": "^3.0.0",
"qrcode-terminal": "^0.12.0",
"read": "^2.1.0",
- "semver": "^7.5.4",
+ "semver": "^7.6.0",
"spdx-expression-parse": "^3.0.1",
"ssri": "^10.0.5",
"supports-color": "^9.4.0",
@@ -3148,7 +3148,7 @@
"license": "ISC"
},
"node_modules/npm/node_modules/@npmcli/agent": {
- "version": "2.2.0",
+ "version": "2.2.1",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -3164,7 +3164,7 @@
}
},
"node_modules/npm/node_modules/@npmcli/arborist": {
- "version": "7.3.1",
+ "version": "7.4.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -3177,7 +3177,7 @@
"@npmcli/name-from-folder": "^2.0.0",
"@npmcli/node-gyp": "^3.0.0",
"@npmcli/package-json": "^5.0.0",
- "@npmcli/query": "^3.0.1",
+ "@npmcli/query": "^3.1.0",
"@npmcli/run-script": "^7.0.2",
"bin-links": "^4.0.1",
"cacache": "^18.0.0",
@@ -3211,7 +3211,7 @@
}
},
"node_modules/npm/node_modules/@npmcli/config": {
- "version": "8.1.0",
+ "version": "8.2.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -3382,7 +3382,7 @@
}
},
"node_modules/npm/node_modules/@npmcli/query": {
- "version": "3.0.1",
+ "version": "3.1.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -3420,19 +3420,19 @@
}
},
"node_modules/npm/node_modules/@sigstore/bundle": {
- "version": "2.1.1",
+ "version": "2.2.0",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
- "@sigstore/protobuf-specs": "^0.2.1"
+ "@sigstore/protobuf-specs": "^0.3.0"
},
"engines": {
"node": "^16.14.0 || >=18.0.0"
}
},
"node_modules/npm/node_modules/@sigstore/core": {
- "version": "0.2.0",
+ "version": "1.0.0",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
@@ -3441,7 +3441,7 @@
}
},
"node_modules/npm/node_modules/@sigstore/protobuf-specs": {
- "version": "0.2.1",
+ "version": "0.3.0",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
@@ -3450,14 +3450,14 @@
}
},
"node_modules/npm/node_modules/@sigstore/sign": {
- "version": "2.2.1",
+ "version": "2.2.3",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
- "@sigstore/bundle": "^2.1.1",
- "@sigstore/core": "^0.2.0",
- "@sigstore/protobuf-specs": "^0.2.1",
+ "@sigstore/bundle": "^2.2.0",
+ "@sigstore/core": "^1.0.0",
+ "@sigstore/protobuf-specs": "^0.3.0",
"make-fetch-happen": "^13.0.0"
},
"engines": {
@@ -3465,12 +3465,12 @@
}
},
"node_modules/npm/node_modules/@sigstore/tuf": {
- "version": "2.3.0",
+ "version": "2.3.1",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
- "@sigstore/protobuf-specs": "^0.2.1",
+ "@sigstore/protobuf-specs": "^0.3.0",
"tuf-js": "^2.2.0"
},
"engines": {
@@ -3478,14 +3478,14 @@
}
},
"node_modules/npm/node_modules/@sigstore/verify": {
- "version": "0.1.0",
+ "version": "1.1.0",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
- "@sigstore/bundle": "^2.1.1",
- "@sigstore/core": "^0.2.0",
- "@sigstore/protobuf-specs": "^0.2.1"
+ "@sigstore/bundle": "^2.2.0",
+ "@sigstore/core": "^1.0.0",
+ "@sigstore/protobuf-specs": "^0.3.0"
},
"engines": {
"node": "^16.14.0 || >=18.0.0"
@@ -3892,7 +3892,7 @@
}
},
"node_modules/npm/node_modules/diff": {
- "version": "5.1.0",
+ "version": "5.2.0",
"dev": true,
"inBundle": true,
"license": "BSD-3-Clause",
@@ -4043,7 +4043,7 @@
"license": "ISC"
},
"node_modules/npm/node_modules/hasown": {
- "version": "2.0.0",
+ "version": "2.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -4073,7 +4073,7 @@
"license": "BSD-2-Clause"
},
"node_modules/npm/node_modules/http-proxy-agent": {
- "version": "7.0.0",
+ "version": "7.0.2",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -4086,7 +4086,7 @@
}
},
"node_modules/npm/node_modules/https-proxy-agent": {
- "version": "7.0.2",
+ "version": "7.0.4",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -4168,11 +4168,24 @@
"node": "^16.14.0 || >=18.0.0"
}
},
- "node_modules/npm/node_modules/ip": {
- "version": "2.0.0",
+ "node_modules/npm/node_modules/ip-address": {
+ "version": "9.0.5",
"dev": true,
"inBundle": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/npm/node_modules/ip-address/node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-3-Clause"
},
"node_modules/npm/node_modules/ip-regex": {
"version": "5.0.0",
@@ -4249,6 +4262,12 @@
"@pkgjs/parseargs": "^0.11.0"
}
},
+ "node_modules/npm/node_modules/jsbn": {
+ "version": "1.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
"node_modules/npm/node_modules/json-parse-even-better-errors": {
"version": "3.0.1",
"dev": true,
@@ -4302,7 +4321,7 @@
}
},
"node_modules/npm/node_modules/libnpmdiff": {
- "version": "6.0.6",
+ "version": "6.0.7",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -4322,7 +4341,7 @@
}
},
"node_modules/npm/node_modules/libnpmexec": {
- "version": "7.0.7",
+ "version": "7.0.8",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -4344,7 +4363,7 @@
}
},
"node_modules/npm/node_modules/libnpmfund": {
- "version": "5.0.4",
+ "version": "5.0.5",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -4382,7 +4401,7 @@
}
},
"node_modules/npm/node_modules/libnpmpack": {
- "version": "6.0.6",
+ "version": "6.0.7",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -4457,7 +4476,7 @@
}
},
"node_modules/npm/node_modules/lru-cache": {
- "version": "10.1.0",
+ "version": "10.2.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -5119,7 +5138,7 @@
"optional": true
},
"node_modules/npm/node_modules/semver": {
- "version": "7.5.4",
+ "version": "7.6.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -5185,17 +5204,17 @@
}
},
"node_modules/npm/node_modules/sigstore": {
- "version": "2.2.0",
+ "version": "2.2.2",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
- "@sigstore/bundle": "^2.1.1",
- "@sigstore/core": "^0.2.0",
- "@sigstore/protobuf-specs": "^0.2.1",
- "@sigstore/sign": "^2.2.1",
- "@sigstore/tuf": "^2.3.0",
- "@sigstore/verify": "^0.1.0"
+ "@sigstore/bundle": "^2.2.0",
+ "@sigstore/core": "^1.0.0",
+ "@sigstore/protobuf-specs": "^0.3.0",
+ "@sigstore/sign": "^2.2.3",
+ "@sigstore/tuf": "^2.3.1",
+ "@sigstore/verify": "^1.1.0"
},
"engines": {
"node": "^16.14.0 || >=18.0.0"
@@ -5212,16 +5231,16 @@
}
},
"node_modules/npm/node_modules/socks": {
- "version": "2.7.1",
+ "version": "2.8.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
- "ip": "^2.0.1",
+ "ip-address": "^9.0.5",
"smart-buffer": "^4.2.0"
},
"engines": {
- "node": ">= 10.13.0",
+ "node": ">= 16.0.0",
"npm": ">= 3.0.0"
}
},
@@ -5250,7 +5269,7 @@
}
},
"node_modules/npm/node_modules/spdx-exceptions": {
- "version": "2.3.0",
+ "version": "2.5.0",
"dev": true,
"inBundle": true,
"license": "CC-BY-3.0"
@@ -5266,7 +5285,7 @@
}
},
"node_modules/npm/node_modules/spdx-license-ids": {
- "version": "3.0.16",
+ "version": "3.0.17",
"dev": true,
"inBundle": true,
"license": "CC0-1.0"
@@ -6126,16 +6145,16 @@
"dev": true
},
"node_modules/semantic-release": {
- "version": "23.0.2",
- "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-23.0.2.tgz",
- "integrity": "sha512-OnVYJ6Xgzwe1x8MKswba7RU9+5djS1MWRTrTn5qsq3xZYpslroZkV9Pt0dA2YcIuieeuSZWJhn+yUWoBUHO5Fw==",
+ "version": "23.0.6",
+ "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-23.0.6.tgz",
+ "integrity": "sha512-/r62F4PNhJZhyZYMobcpcACGwpFNQyaVcSmqZQXG50GMbHSBVZQLCvwafqxO1lDQKVgmGmyCEtOVYzwvzvyhVw==",
"dev": true,
"dependencies": {
- "@semantic-release/commit-analyzer": "^11.0.0",
+ "@semantic-release/commit-analyzer": "^12.0.0",
"@semantic-release/error": "^4.0.0",
- "@semantic-release/github": "^9.0.0",
- "@semantic-release/npm": "^11.0.0",
- "@semantic-release/release-notes-generator": "^12.0.0",
+ "@semantic-release/github": "^10.0.0",
+ "@semantic-release/npm": "^12.0.0",
+ "@semantic-release/release-notes-generator": "^13.0.0",
"aggregate-error": "^5.0.0",
"cosmiconfig": "^9.0.0",
"debug": "^4.0.0",
@@ -6168,6 +6187,156 @@
"node": ">=20.8.1"
}
},
+ "node_modules/semantic-release/node_modules/@octokit/auth-token": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.0.1.tgz",
+ "integrity": "sha512-RTmWsLfig8SBoiSdgvCht4BXl1CHU89Co5xiQ5JF19my/sIRDFCQ1RPrmK0exgqUZuNm39C/bV8+/83+MJEjGg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/core": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.0.1.tgz",
+ "integrity": "sha512-MIpPQXu8Y8GjHwXM81JLveiV+DHJZtLMcB5nKekBGOl3iAtk0HT3i12Xl8Biybu+bCS1+k4qbuKEq5d0RxNRnQ==",
+ "dev": true,
+ "dependencies": {
+ "@octokit/auth-token": "^5.0.0",
+ "@octokit/graphql": "^8.0.0",
+ "@octokit/request": "^9.0.0",
+ "@octokit/request-error": "^6.0.1",
+ "@octokit/types": "^12.0.0",
+ "before-after-hook": "^3.0.2",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/endpoint": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.0.0.tgz",
+ "integrity": "sha512-emBcNDxBdC1y3+knJonS5zhUB/CG6TihubxM2U1/pG/Z1y3a4oV0Gzz3lmkCvWWQI6h3tqBAX9MgCBFp+M68Jw==",
+ "dev": true,
+ "dependencies": {
+ "@octokit/types": "^12.0.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/graphql": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.0.1.tgz",
+ "integrity": "sha512-lLDb6LhC1gBj2CxEDa5Xk10+H/boonhs+3Mi6jpRyetskDKNHe6crMeKmUE2efoLofMP8ruannLlCUgpTFmVzQ==",
+ "dev": true,
+ "dependencies": {
+ "@octokit/request": "^9.0.0",
+ "@octokit/types": "^12.0.0",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/plugin-paginate-rest": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-10.0.0.tgz",
+ "integrity": "sha512-G1Z67qOiFneKDJyMafHQkWnKm1kU3FfbRZLzxgsFg4dOa3pRNdABbdk+xo/oev6P88lnbt7GKdBNB6dJZuPphA==",
+ "dev": true,
+ "dependencies": {
+ "@octokit/types": "^12.6.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/plugin-retry": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.0.3.tgz",
+ "integrity": "sha512-T9l5Z7XnDZ7dkyNmhJPSUq0YjbqUT/xn4yQbhcSuv4WGC/LqM73/mKwkl68VDPoLw20e8oz4L7qQopWt9v6sow==",
+ "dev": true,
+ "dependencies": {
+ "@octokit/request-error": "^6.0.0",
+ "@octokit/types": "^12.0.0",
+ "bottleneck": "^2.15.3"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/plugin-throttling": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.0.3.tgz",
+ "integrity": "sha512-DReKamrLBJOzld73dmmxV2H137QKJfsxszAczEZXeAJQ/Po6bzQacKajPdodA6T1jfmP9+waImus+d/R2j+R7Q==",
+ "dev": true,
+ "dependencies": {
+ "@octokit/types": "^12.6.0",
+ "bottleneck": "^2.15.3"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": "^6.0.0"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/request": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.0.1.tgz",
+ "integrity": "sha512-kL+cAcbSl3dctYLuJmLfx6Iku2MXXy0jszhaEIjQNaCp4zjHXrhVAHeuaRdNvJjW9qjl3u1MJ72+OuBP0YW/pg==",
+ "dev": true,
+ "dependencies": {
+ "@octokit/endpoint": "^10.0.0",
+ "@octokit/request-error": "^6.0.1",
+ "@octokit/types": "^12.0.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/request-error": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.0.2.tgz",
+ "integrity": "sha512-WtRVpoHcNXs84+s9s/wqfHaxM68NGMg8Av7h59B50OVO0PwwMx+2GgQ/OliUd0iQBSNWgR6N8afi/KjSHbXHWw==",
+ "dev": true,
+ "dependencies": {
+ "@octokit/types": "^12.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@semantic-release/commit-analyzer": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-12.0.0.tgz",
+ "integrity": "sha512-qG+md5gdes+xa8zP7lIo1fWE17zRdO8yMCaxh9lyL65TQleoSv8WHHOqRURfghTytUh+NpkSyBprQ5hrkxOKVQ==",
+ "dev": true,
+ "dependencies": {
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-commits-filter": "^4.0.0",
+ "conventional-commits-parser": "^5.0.0",
+ "debug": "^4.0.0",
+ "import-from-esm": "^1.0.3",
+ "lodash-es": "^4.17.21",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=20.8.1"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=20.1.0"
+ }
+ },
"node_modules/semantic-release/node_modules/@semantic-release/error": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz",
@@ -6177,6 +6346,99 @@
"node": ">=18"
}
},
+ "node_modules/semantic-release/node_modules/@semantic-release/github": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.0.2.tgz",
+ "integrity": "sha512-SP5ihhv/uQa8vPuWKmbJrrzfv8lRUkDFC6qwgaWoorrflN1DEW0IGCa9w/PxUp8Ad3dbvXZPmpXdGiP3eyTzhg==",
+ "dev": true,
+ "dependencies": {
+ "@octokit/core": "^6.0.0",
+ "@octokit/plugin-paginate-rest": "^10.0.0",
+ "@octokit/plugin-retry": "^7.0.0",
+ "@octokit/plugin-throttling": "^9.0.0",
+ "@semantic-release/error": "^4.0.0",
+ "aggregate-error": "^5.0.0",
+ "debug": "^4.3.4",
+ "dir-glob": "^3.0.1",
+ "globby": "^14.0.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.0",
+ "issue-parser": "^7.0.0",
+ "lodash-es": "^4.17.21",
+ "mime": "^4.0.0",
+ "p-filter": "^4.0.0",
+ "url-join": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=20.8.1"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=20.1.0"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@semantic-release/npm": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.0.tgz",
+ "integrity": "sha512-72TVYQCH9NvVsO/y13eF8vE4bNnfls518+4KcFwJUKi7AtA/ZXoNgSg9gTTfw5eMZMkiH0izUrpGXgZE/cSQhA==",
+ "dev": true,
+ "dependencies": {
+ "@semantic-release/error": "^4.0.0",
+ "aggregate-error": "^5.0.0",
+ "execa": "^8.0.0",
+ "fs-extra": "^11.0.0",
+ "lodash-es": "^4.17.21",
+ "nerf-dart": "^1.0.0",
+ "normalize-url": "^8.0.0",
+ "npm": "^10.5.0",
+ "rc": "^1.2.8",
+ "read-pkg": "^9.0.0",
+ "registry-auth-token": "^5.0.0",
+ "semver": "^7.1.2",
+ "tempy": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=20.8.1"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=20.1.0"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-13.0.0.tgz",
+ "integrity": "sha512-LEeZWb340keMYuREMyxrODPXJJ0JOL8D/mCl74B4LdzbxhtXV2LrPN2QBEcGJrlQhoqLO0RhxQb6masHytKw+A==",
+ "dev": true,
+ "dependencies": {
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-changelog-writer": "^7.0.0",
+ "conventional-commits-filter": "^4.0.0",
+ "conventional-commits-parser": "^5.0.0",
+ "debug": "^4.0.0",
+ "get-stream": "^7.0.0",
+ "import-from-esm": "^1.0.3",
+ "into-stream": "^7.0.0",
+ "lodash-es": "^4.17.21",
+ "read-pkg-up": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=20.8.1"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=20.1.0"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz",
+ "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/semantic-release/node_modules/aggregate-error": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz",
@@ -6193,6 +6455,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/semantic-release/node_modules/before-after-hook": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
+ "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==",
+ "dev": true
+ },
"node_modules/semantic-release/node_modules/clean-stack": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz",
@@ -6288,6 +6556,22 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/semantic-release/node_modules/issue-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.0.tgz",
+ "integrity": "sha512-jgAw78HO3gs9UrKqJNQvfDj9Ouy8Mhu40fbEJ8yXff4MW8+/Fcn9iFjyWUQ6SKbX8ipPk3X5A3AyfYHRu6uVLw==",
+ "dev": true,
+ "dependencies": {
+ "lodash.capitalize": "^4.2.1",
+ "lodash.escaperegexp": "^4.1.2",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.uniqby": "^4.7.0"
+ },
+ "engines": {
+ "node": "^18.17 || >=20.6.1"
+ }
+ },
"node_modules/semantic-release/node_modules/marked": {
"version": "12.0.0",
"resolved": "https://registry.npmjs.org/marked/-/marked-12.0.0.tgz",
@@ -6410,6 +6694,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/semantic-release/node_modules/universal-user-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+ "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==",
+ "dev": true
+ },
"node_modules/semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
diff --git a/package.json b/package.json
index 6376266..7500972 100644
--- a/package.json
+++ b/package.json
@@ -4,6 +4,6 @@
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"gradle-semantic-release-plugin": "^1.9.1",
- "semantic-release": "^23.0.2"
+ "semantic-release": "^23.0.6"
}
}
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/link/customsharingdomain/CustomSharingDomainPatch.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/link/customsharingdomain/CustomSharingDomainPatch.kt
new file mode 100644
index 0000000..67e2a2a
--- /dev/null
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/link/customsharingdomain/CustomSharingDomainPatch.kt
@@ -0,0 +1,50 @@
+package indus.org.patches.twitter.crimeraswak.link.customsharingdomain
+
+import app.revanced.patcher.data.BytecodeContext
+import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
+import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
+import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
+import app.revanced.patcher.patch.BytecodePatch
+import app.revanced.patcher.patch.PatchException
+import app.revanced.patcher.patch.annotation.CompatiblePackage
+import app.revanced.patcher.patch.annotation.Patch
+import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
+import indus.org.patches.twitter.crimeraswak.link.customsharingdomain.fingerprints.CustomSharingDomainFingerprint
+import indus.org.patches.twitter.crimeraswak.misc.settings.SettingsPatch
+import indus.org.patches.twitter.crimeraswak.misc.settings.fingerprints.SettingsStatusLoadFingerprint
+
+@Patch(
+ name = "Custom sharing domain",
+ description = "Allows for using domains like fxtwitter when sharing tweets/posts.",
+ compatiblePackages = [CompatiblePackage("com.twitter.android")],
+ use = false
+)
+object CustomSharingDomainPatch: BytecodePatch(
+ setOf(CustomSharingDomainFingerprint, SettingsStatusLoadFingerprint)
+) {
+ override fun execute(context: BytecodeContext) {
+ val result = CustomSharingDomainFingerprint.result
+ ?: throw PatchException("Fingerprint not found")
+
+ val setUsernameLoc = result.scanResult.stringsScanResult?.matches?.first()?.index
+ ?: throw PatchException("setUserNameLoc not found")
+
+ result.mutableMethod.also {
+ val reg = it.getInstruction
(setUsernameLoc-1).registerA
+ val getSharingLinkDescriptor =
+ "invoke-static {v$reg}, ${SettingsPatch.PREF_DESCRIPTOR};->getSharingLink(Ljava/lang/String;)Ljava/lang/String;"
+ it.addInstructions(
+ setUsernameLoc,
+ """
+ $getSharingLinkDescriptor
+ move-result-object v$reg
+ """.trimIndent()
+ )
+ }
+
+ SettingsStatusLoadFingerprint.result!!.mutableMethod.addInstruction(
+ 0,
+ "${SettingsPatch.SSTS_DESCRIPTOR}->enableCustomSharingDomain()V"
+ )
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/link/customsharingdomain/fingerprints/CustomSharingDomainFingerprint.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/link/customsharingdomain/fingerprints/CustomSharingDomainFingerprint.kt
new file mode 100644
index 0000000..53df4c7
--- /dev/null
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/link/customsharingdomain/fingerprints/CustomSharingDomainFingerprint.kt
@@ -0,0 +1,12 @@
+package indus.org.patches.twitter.crimeraswak.link.customsharingdomain.fingerprints
+
+import app.revanced.patcher.extensions.or
+import app.revanced.patcher.fingerprint.MethodFingerprint
+import com.android.tools.smali.dexlib2.AccessFlags
+
+object CustomSharingDomainFingerprint: MethodFingerprint(
+ accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
+ strings = listOf(
+ "res.getString(R.string.t…lUsername, id.toString())"
+ )
+)
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/misc/bringbacktwitter/BringBackTwitterResourcePatch.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/misc/bringbacktwitter/BringBackTwitterResourcePatch.kt
new file mode 100644
index 0000000..24a7db3
--- /dev/null
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/misc/bringbacktwitter/BringBackTwitterResourcePatch.kt
@@ -0,0 +1,134 @@
+package indus.org.patches.twitter.crimeraswak.misc.bringbacktwitter
+
+import app.revanced.patcher.data.ResourceContext
+import app.revanced.patcher.patch.PatchException
+import app.revanced.patcher.patch.ResourcePatch
+import app.revanced.patcher.patch.annotation.CompatiblePackage
+import app.revanced.patcher.patch.annotation.Patch
+import indus.org.patches.util.ResourceGroup
+import indus.org.patches.util.asSequence
+import indus.org.patches.util.copyResources
+import org.w3c.dom.Element
+import java.io.File
+
+@Patch(
+ name = "Bring back twitter",
+ description = "Bring back old twitter logo and name",
+ compatiblePackages = [CompatiblePackage("com.twitter.android")],
+ use = false
+)
+@Suppress("unused")
+object BringBackTwitterResourcePatch : ResourcePatch() {
+ val mipmapIcons = arrayOf(
+ "ic_launcher_twitter",
+ "ic_launcher_twitter_round",
+ "ic_launcher_twitter_foreground",
+ ).map { "$it.webp" }.toTypedArray()
+
+ val drawableIcons = arrayOf(
+ "ic_vector_twitter",
+ "splash_screen_icon"
+ ).map { "$it.xml" }.toTypedArray()
+
+ val sizes = arrayOf(
+ "xxxhdpi",
+ "xxhdpi",
+ "xhdpi",
+ "hdpi",
+ "mdpi",
+ )
+
+ override fun execute(context: ResourceContext) {
+
+ // Change app name
+ context.xmlEditor["AndroidManifest.xml"].use {
+ val application = it.file.getElementsByTagName("application").item(0) as Element
+ application.setAttribute("android:label", "Twitter")
+ }
+
+ // app icons
+ // drawable icons
+ sizes.map { "drawable-$it" }.plus("drawable").map {
+ if (it == "drawable") {
+ ResourceGroup(it, *drawableIcons)
+ } else {
+ ResourceGroup(it, "ic_stat_twitter.webp")
+ }
+ }.forEach {
+ context.copyResources("twitter", it)
+ }
+
+ // mipmap icons
+ sizes.map { "mipmap-$it" }.map {
+ if (it == "mipmap-xxhdpi") {
+ ResourceGroup(it, *mipmapIcons.plus("fg_launcher_twitter.webp"))
+ } else {
+ ResourceGroup(it, *mipmapIcons)
+ }
+ }.forEach {
+ context.copyResources("twitter", it)
+ }
+
+ // bring back twitter blue
+ context.xmlEditor["res/layout/ocf_twitter_logo.xml"].use {
+ val imageView = it.file.getElementsByTagName("ImageView").item(0) as Element
+ imageView.setAttribute("app:tint", "@color/twitter_blue")
+ }
+
+ context.xmlEditor["res/layout/channels_toolbar_main.xml"].use {
+ val imageView = it.file.getElementsByTagName("ImageView").item(0) as Element
+ imageView.setAttribute("app:tint", "@color/twitter_blue")
+ }
+
+ context.xmlEditor["res/values/colors.xml"].use {
+ it.file.getElementsByTagName("color").asSequence().find { color ->
+ (color as Element).getAttribute("name") == "ic_launcher_background"
+ }?.textContent = "@color/twitter_blue"
+ }
+
+ // update strings to old ones
+ updateStrings(context)
+ }
+
+ private fun updateStrings(context: ResourceContext) {
+ val stringsFile = context["res/values/strings.xml"]
+ val stringsUK = context["res/values-en-rGB/strings.xml"]
+
+ when {
+ !stringsUK.isFile -> throw PatchException("$stringsUK file not found.")
+ !stringsFile.isFile -> throw PatchException("$stringsFile file not found.")
+ }
+
+ // Update strings.xml
+ updateStringsFile(stringsFile, context)
+ // Update strings-en-rGB.xml (British English)
+ updateStringsFile(stringsUK, context)
+ }
+
+ private fun updateStringsFile(stringsFile: File, context: ResourceContext) {
+ context.xmlEditor[stringsFile.toString()].use { editor ->
+ val document = editor.file
+
+ val stringsMap = StringsMap.replacementMap
+
+ for ((key, value) in stringsMap) {
+ val nodes = document.getElementsByTagName("string")
+ var keyReplaced = false
+
+ for (i in 0 until nodes.length) {
+ val node = nodes.item(i)
+ if (node.attributes.getNamedItem("name")?.nodeValue == key) {
+ node.textContent = value
+ keyReplaced = true
+ break
+ }
+ }
+
+ // log which keys were not found or failed
+ if (!keyReplaced) {
+ println("Key not found: $key")
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/misc/bringbacktwitter/StringsMap.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/misc/bringbacktwitter/StringsMap.kt
new file mode 100644
index 0000000..ff95386
--- /dev/null
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/misc/bringbacktwitter/StringsMap.kt
@@ -0,0 +1,66 @@
+package indus.org.patches.twitter.crimeraswak.misc.bringbacktwitter
+
+object StringsMap {
+ val replacementMap = mapOf(
+ "button_action_add_tweet" to "Add a tweet",
+ "button_action_options_tweet" to "Tweet options",
+ "button_action_retweet" to "Retweet",
+ "button_new_tweet" to "New tweet",
+ "button_status_retweeted" to "Retweet (retweeted)",
+ "chrome_action_post" to "Tweet",
+ "ps__share_post_tweet" to "Tweet",
+ "rux_landing_page_title" to "Tweet",
+ "tweet_fab_item" to "Tweet",
+ "tweet_title" to "Tweet",
+ "search_twitter" to "Search Twitter",
+ "search_hint" to "Search Twitter",
+ "ps__accessibility_retweet_broadcast_button" to "Retweet",
+ "shortcut_retweet_tweet" to "Retweet",
+ "social_you_retweeted" to "You retweeted",
+ "composer_hint_self_thread" to "Add another tweet",
+ "confirm_delete_shared_tweet_description" to "Are you sure you want to remove this tweet?",
+ "confirm_delete_shared_tweet_title" to "Remove tweet",
+ "conversation_control_reply_restricted_dialog_title" to "Tweet not sent",
+ "conversation_control_reply_restricted_error" to "Tweet not sent. Replies are restricted.",
+ "conversations_alternative_reply_hint" to "Tweet your reply",
+ "conversations_other_tweets" to "Other tweets",
+ "curation_i_dont_like_this_tweet" to "I don’t like this tweet",
+ "date_posted" to "Date tweeted",
+ "post_tweet" to "Tweet",
+ "deleted_tweet_title" to "This tweet has been deleted.",
+ "dm_sensitive_tweet_interstitial_header" to "This tweet may contain sensitive material",
+ "dm_untrusted_tweet_interstitial_header" to "This tweet is hidden",
+ "empty_profile_tweets_tab_title" to "You haven’t tweeted yet",
+ "feedback_action_report_tweet" to "Report tweet",
+ "feedback_tweet_unavailable" to "This tweet is unavailable.",
+ "filter_item_tweets" to "Tweets",
+ "filter_item_tweets_and_replies" to "Tweets & replies",
+ "profile_tab_title_timeline" to "Tweets",
+ "users_turn_off_retweets" to "Turn off retweets",
+ "tweets_retweet" to "Retweet",
+ "tweets_retweeted" to "%s retweeted",
+ "tweets_undo_retweet_vertical" to "Undo retweet",
+ "users_turn_on_retweets" to "Turn on retweets",
+ "ps__post_broadcast_twitter" to "Tweet on Twitter",
+ "ps__retweet_broadcast_action" to "Retweet on Twitter",
+ "retweeters_title" to "Retweeted by",
+ "icon_view_tweet_activity" to "View tweet activity",
+ "a11y_views_text" to "View tweet activity",
+ "tweet_analytics_title" to "Tweet activity",
+ "tweets_delete_title" to "Delete tweet",
+ "share_tweet_sheet_title" to "Share tweet",
+ "view_quote_tweet" to "View tweet",
+ "view_tweet" to "View tweet",
+ "view_tweet_text" to "View tweet",
+ "quote_label_subtitle" to "Add a comment, photo, or GIF before you share this tweet",
+ "retweet_label_subtitle" to "Share this tweet with your followers",
+ "tweet_added_to_your_bookmarks" to "Tweet added to your Bookmarks",
+ "tweet_author" to "Tweet author",
+ "tweets_retweeted_accessibility_description" to "Tweeted by %s",
+ "tweets_topic_accessibility_description" to "Tweet from topic %s",
+ "tweets_unauthorized_error" to "Sorry, you’re not authorized to view these tweets.",
+ "ps__posted_on_twitter" to "*%s* tweeted on",
+ "ps__retweeted_on_twitter" to "*%s* retweeted on",
+ "tweet_removed_from_your_bookmarks" to "Tweet removed from your Bookmarks"
+ )
+}
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/customAppIconAndNavBtns/CustomAppIconAndNavBtnsPatch.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/customAppIconAndNavBtns/CustomAppIconAndNavBtnsPatch.kt
new file mode 100644
index 0000000..b84d737
--- /dev/null
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/customAppIconAndNavBtns/CustomAppIconAndNavBtnsPatch.kt
@@ -0,0 +1,43 @@
+package indus.org.patches.twitter.crimeraswak.premium.customAppIconAndNavBtns
+
+import app.revanced.patcher.data.BytecodeContext
+import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
+import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
+import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
+import app.revanced.patcher.patch.BytecodePatch
+import app.revanced.patcher.patch.PatchException
+import indus.org.patches.twitter.crimeraswak.premium.customAppIconAndNavBtns.fingerprints.CustomAppIconAndNavBtnsFingerprint
+import app.revanced.patcher.patch.annotation.CompatiblePackage
+import app.revanced.patcher.patch.annotation.Patch
+import com.android.tools.smali.dexlib2.Opcode
+import indus.org.patches.twitter.crimeraswak.misc.settings.SettingsPatch
+import indus.org.patches.twitter.crimeraswak.misc.settings.fingerprints.SettingsStatusLoadFingerprint
+
+@Patch(
+ name = "Enable custom app icon and nav icon settings",
+ compatiblePackages = [CompatiblePackage("com.twitter.android")],
+ dependencies = [SettingsPatch::class],
+ requiresIntegrations = true
+)
+object CustomAppIconAndNavBtnsPatch:BytecodePatch(
+ setOf(CustomAppIconAndNavBtnsFingerprint)
+) {
+ override fun execute(context: BytecodeContext) {
+ val result = CustomAppIconAndNavBtnsFingerprint.result
+ ?:throw PatchException("CustomAppIconAndNavBtnsFingerprint not found")
+
+ //usually the last method
+ val methods = result.mutableClass.methods.last()
+ val loc = methods.getInstructions().last { it.opcode == Opcode.CONST }.location.index
+
+ //removes toast condition
+ methods.removeInstruction(loc)
+ methods.removeInstruction(loc-1)
+
+ SettingsStatusLoadFingerprint.result!!.mutableMethod.addInstruction(
+ 0,
+ "${SettingsPatch.SSTS_DESCRIPTOR}->enableAppIconNNavIcon()V"
+ )
+ //end
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/customAppIconAndNavBtns/fingerprints/CustomAppIconAndNavBtnsFingerprint.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/customAppIconAndNavBtns/fingerprints/CustomAppIconAndNavBtnsFingerprint.kt
new file mode 100644
index 0000000..951dbca
--- /dev/null
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/customAppIconAndNavBtns/fingerprints/CustomAppIconAndNavBtnsFingerprint.kt
@@ -0,0 +1,9 @@
+package indus.org.patches.twitter.crimeraswak.premium.customAppIconAndNavBtns.fingerprints
+
+import app.revanced.patcher.fingerprint.MethodFingerprint
+
+object CustomAppIconAndNavBtnsFingerprint:MethodFingerprint(
+ strings = listOf(
+ "current_app_icon_id"
+ )
+)
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/EnableUndoPostPatch.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/EnableUndoPostPatch.kt
index cac8700..5db7559 100644
--- a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/EnableUndoPostPatch.kt
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/EnableUndoPostPatch.kt
@@ -1,8 +1,7 @@
-package crimera.patches.twitter.premium.undoposts
+package indus.org.patches.twitter.crimeraswak.premium.undoposts
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
-import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions
@@ -11,10 +10,9 @@ import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import com.android.tools.smali.dexlib2.Opcode
-import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
-import crimera.patches.twitter.premium.undoposts.fingerprints.UndoPost1Fingerprint
-import crimera.patches.twitter.premium.undoposts.fingerprints.UndoPost2Fingerprint
-import crimera.patches.twitter.premium.undoposts.fingerprints.UndoPost3Fingerprint
+import indus.org.patches.twitter.crimeraswak.premium.undoposts.fingerprints.UndoPost1Fingerprint
+import indus.org.patches.twitter.crimeraswak.premium.undoposts.fingerprints.UndoPost2Fingerprint
+import indus.org.patches.twitter.crimeraswak.premium.undoposts.fingerprints.UndoPost3Fingerprint
@Patch(
name = "Enable Undo Posts",
@@ -23,7 +21,7 @@ import crimera.patches.twitter.premium.undoposts.fingerprints.UndoPost3Fingerpri
use = false
)
object EnableUndoPostPatch :BytecodePatch(
- setOf(UndoPost1Fingerprint,UndoPost2Fingerprint,UndoPost3Fingerprint)
+ setOf(UndoPost1Fingerprint, UndoPost2Fingerprint, UndoPost3Fingerprint)
){
override fun execute(context: BytecodeContext) {
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/fingerprints/UndoPost1Fingerprint.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/fingerprints/UndoPost1Fingerprint.kt
index 57101e3..072fa87 100644
--- a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/fingerprints/UndoPost1Fingerprint.kt
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/fingerprints/UndoPost1Fingerprint.kt
@@ -1,4 +1,4 @@
-package crimera.patches.twitter.premium.undoposts.fingerprints
+package indus.org.patches.twitter.crimeraswak.premium.undoposts.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.Opcode
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/fingerprints/UndoPost2Fingerprint.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/fingerprints/UndoPost2Fingerprint.kt
index 2eeb5e5..eeced93 100644
--- a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/fingerprints/UndoPost2Fingerprint.kt
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/fingerprints/UndoPost2Fingerprint.kt
@@ -1,4 +1,4 @@
-package crimera.patches.twitter.premium.undoposts.fingerprints
+package indus.org.patches.twitter.crimeraswak.premium.undoposts.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/fingerprints/UndoPost3Fingerprint.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/fingerprints/UndoPost3Fingerprint.kt
index 73c811d..09bc501 100644
--- a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/fingerprints/UndoPost3Fingerprint.kt
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/premium/undoposts/fingerprints/UndoPost3Fingerprint.kt
@@ -1,4 +1,4 @@
-package crimera.patches.twitter.premium.undoposts.fingerprints
+package indus.org.patches.twitter.crimeraswak.premium.undoposts.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/timeline/hidebookmarkintimeline/HideBookmarkInTimelinePatch.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/timeline/hidebookmarkintimeline/HideBookmarkInTimelinePatch.kt
new file mode 100644
index 0000000..06f5afa
--- /dev/null
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/timeline/hidebookmarkintimeline/HideBookmarkInTimelinePatch.kt
@@ -0,0 +1,51 @@
+package indus.org.patches.twitter.crimeraswak.timeline.hidebookmarkintimeline
+
+import app.revanced.patcher.data.BytecodeContext
+import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
+import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
+import app.revanced.patcher.patch.BytecodePatch
+import app.revanced.patcher.patch.PatchException
+import com.android.tools.smali.dexlib2.Opcode
+import indus.org.patches.twitter.crimeraswak.timeline.hidebookmarkintimeline.fingerprints.HideBookmarkInTimelineFingerprint1
+import indus.org.patches.twitter.crimeraswak.timeline.hidebookmarkintimeline.fingerprints.HideBookmarkInTimelineFingerprint2
+import app.revanced.patcher.patch.annotation.CompatiblePackage
+import app.revanced.patcher.patch.annotation.Patch
+import indus.org.patches.twitter.crimeraswak.misc.settings.SettingsPatch
+import indus.org.patches.twitter.crimeraswak.misc.settings.fingerprints.SettingsStatusLoadFingerprint
+
+@Patch(
+ name = "Hide bookmark icon in timeline",
+ dependencies = [SettingsPatch::class],
+ compatiblePackages = [CompatiblePackage("com.twitter.android")],
+)
+object HideBookmarkInTimelinePatch:BytecodePatch(
+ setOf(
+ HideBookmarkInTimelineFingerprint1,
+ HideBookmarkInTimelineFingerprint2, SettingsStatusLoadFingerprint
+ )
+) {
+ override fun execute(context: BytecodeContext) {
+ val result1 = HideBookmarkInTimelineFingerprint1.result
+ ?:throw PatchException("HideBookmarkInTimelineFingerprint1 not found")
+
+ val PREF = "invoke-static {}, ${SettingsPatch.PREF_DESCRIPTOR};->hideInlineBookmark()Z"
+
+ val method1 = result1.mutableMethod
+ val loc = method1.getInstructions().first { it.opcode == Opcode.CONST_STRING }.location.index+2
+ method1.addInstruction(loc,PREF)
+
+ val result2 = HideBookmarkInTimelineFingerprint2.result
+ ?:throw PatchException("HideBookmarkInTimelineFingerprint2 not found")
+ val method2 = result2.mutableMethod
+ val loc2 = method2.getInstructions().first { it.opcode == Opcode.CONST_STRING }.location.index+2
+ method2.addInstruction(loc2,PREF)
+
+ SettingsStatusLoadFingerprint.result!!.mutableMethod.addInstruction(
+ 0,
+ "${SettingsPatch.SSTS_DESCRIPTOR}->hideInlineBmk()V"
+ )
+
+ //end
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/timeline/hidebookmarkintimeline/fingerprints/HideBookmarkInTimelineFingerprint1.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/timeline/hidebookmarkintimeline/fingerprints/HideBookmarkInTimelineFingerprint1.kt
new file mode 100644
index 0000000..7081b72
--- /dev/null
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/timeline/hidebookmarkintimeline/fingerprints/HideBookmarkInTimelineFingerprint1.kt
@@ -0,0 +1,9 @@
+package indus.org.patches.twitter.crimeraswak.timeline.hidebookmarkintimeline.fingerprints
+
+import app.revanced.patcher.fingerprint.MethodFingerprint
+
+object HideBookmarkInTimelineFingerprint1: MethodFingerprint(
+ strings = listOf("bookmarks_in_timelines_enabled"),
+ returnType = "Z"
+
+)
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/crimeraswak/timeline/hidebookmarkintimeline/fingerprints/HideBookmarkInTimelineFingerprint2.kt b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/timeline/hidebookmarkintimeline/fingerprints/HideBookmarkInTimelineFingerprint2.kt
new file mode 100644
index 0000000..0f63265
--- /dev/null
+++ b/src/main/kotlin/indus/org/patches/twitter/crimeraswak/timeline/hidebookmarkintimeline/fingerprints/HideBookmarkInTimelineFingerprint2.kt
@@ -0,0 +1,9 @@
+package indus.org.patches.twitter.crimeraswak.timeline.hidebookmarkintimeline.fingerprints
+
+import app.revanced.patcher.fingerprint.MethodFingerprint
+
+object HideBookmarkInTimelineFingerprint2 :MethodFingerprint(
+ strings = listOf("bookmarks_in_timelines_enabled"),
+ returnType = "Ljava/util/List;"
+
+)
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/hook/json/JsonHookPatch.kt b/src/main/kotlin/indus/org/patches/twitter/hook/json/JsonHookPatch.kt
deleted file mode 100644
index b4dde75..0000000
--- a/src/main/kotlin/indus/org/patches/twitter/hook/json/JsonHookPatch.kt
+++ /dev/null
@@ -1,141 +0,0 @@
-package indus.org.patches.twitter.hook.json
-
-import app.revanced.patcher.data.BytecodeContext
-import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
-import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions
-import app.revanced.patcher.fingerprint.MethodFingerprint
-import app.revanced.patcher.patch.BytecodePatch
-import app.revanced.patcher.patch.PatchException
-import app.revanced.patcher.patch.annotation.Patch
-import indus.org.patches.twitter.hook.json.fingerprints.JsonHookPatchFingerprint
-import indus.org.patches.twitter.hook.json.fingerprints.JsonInputStreamFingerprint
-import indus.org.patches.twitter.hook.json.fingerprints.LoganSquareFingerprint
-import java.io.Closeable
-import java.io.InvalidClassException
-
-@Patch(
- description = "Hooks the stream which reads JSON responses.",
- requiresIntegrations = true
-)
-object JsonHookPatch : BytecodePatch(
- setOf(LoganSquareFingerprint)
-), Closeable {
- private const val JSON_HOOK_CLASS_NAMESPACE = "app/revanced/integrations/twitter/patches/hook/json"
- private const val JSON_HOOK_PATCH_CLASS_DESCRIPTOR = "L$JSON_HOOK_CLASS_NAMESPACE/JsonHookPatch;"
- private const val BASE_PATCH_CLASS_NAME = "BaseJsonHook"
- private const val JSON_HOOK_CLASS_DESCRIPTOR = "L$JSON_HOOK_CLASS_NAMESPACE/$BASE_PATCH_CLASS_NAME;"
-
- /**
- * The [JsonHookPatchHook] of the [JsonHookPatch].
- *
- * @see JsonHookPatchHook
- */
- internal lateinit var hooks: JsonHookPatchHook
-
- override fun execute(context: BytecodeContext) {
- JsonHookPatchFingerprint.also {
- // Make sure the integrations are present.
- val jsonHookPatch = context.findClass { classDef -> classDef.type == JSON_HOOK_PATCH_CLASS_DESCRIPTOR }
- ?: throw PatchException("Could not find integrations.")
-
- if (!it.resolve(context, jsonHookPatch.immutableClass))
- throw PatchException("Unexpected integrations.")
- }.let { hooks = JsonHookPatchHook(it) }
-
- // Conveniently find the type to hook a method in, via a named field.
- val jsonFactory = LoganSquareFingerprint.result
- ?.classDef
- ?.fields
- ?.firstOrNull { it.name == "JSON_FACTORY" }
- ?.type
- .let { type ->
- context.findClass { it.type == type }?.mutableClass
- } ?: throw PatchException("Could not find required class.")
-
- // Hook the methods first parameter.
- JsonInputStreamFingerprint
- .also { it.resolve(context, jsonFactory) }
- .result
- ?.mutableMethod
- ?.addInstructions(
- 0,
- """
- invoke-static { p1 }, $JSON_HOOK_PATCH_CLASS_DESCRIPTOR->parseJsonHook(Ljava/io/InputStream;)Ljava/io/InputStream;
- move-result-object p1
- """
- ) ?: throw PatchException("Could not find method to hook.")
- }
-
- /**
- * Create a hook class.
- * The class has to extend on **JsonHook**.
- * The class has to be a Kotlin object class, or at least have an INSTANCE field of itself.
- *
- * @param context The [BytecodeContext] of the current patch.
- * @param descriptor The class descriptor of the hook.
- * @throws ClassNotFoundException If the class could not be found.
- */
- internal class
- Hook(context: BytecodeContext, internal val descriptor: String) {
- internal var added = false
-
- init {
- context.findClass { it.type == descriptor }?.let {
- it.mutableClass.also { classDef ->
- if (
- classDef.superclass != JSON_HOOK_CLASS_DESCRIPTOR ||
- !classDef.fields.any { field -> field.name == "INSTANCE" }
- ) throw InvalidClassException(classDef.type, "Not a hook class")
-
- }
- } ?: throw ClassNotFoundException("Failed to find hook class")
- }
- }
-
- /**
- * A hook for the [JsonHookPatch].
- *
- * @param jsonHookPatchFingerprint The [JsonHookPatchFingerprint] to hook.
- */
- internal class JsonHookPatchHook(jsonHookPatchFingerprint: MethodFingerprint): Closeable {
- private val jsonHookPatchFingerprintResult = jsonHookPatchFingerprint.result!!
- private val jsonHookPatchIndex = jsonHookPatchFingerprintResult.scanResult.patternScanResult!!.endIndex
-
- /**
- * Add a hook to the [JsonHookPatch].
- * Will not add the hook if it's already added.
- *
- * @param hook The [Hook] to add.
- */
- fun addHook(hook: Hook) {
- if (hook.added) return
-
- jsonHookPatchFingerprintResult.mutableMethod.apply {
- // Insert hooks right before calling buildList.
- val insertIndex = jsonHookPatchIndex
-
- addInstructions(
- insertIndex,
- """
- sget-object v1, ${hook.descriptor}->INSTANCE:${hook.descriptor}
- invoke-interface {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z
- """
- )
- }
-
- hook.added = true
- }
-
- override fun close() {
- // Remove hooks.add(dummyHook).
- jsonHookPatchFingerprintResult.mutableMethod.apply {
- val addDummyHookIndex = jsonHookPatchIndex - 2
-
- removeInstructions(addDummyHookIndex, 2)
- }
- }
- }
-
- override fun close() = hooks.close()
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/hook/json/fingerprints/JsonHookPatchFingerprint.kt b/src/main/kotlin/indus/org/patches/twitter/hook/json/fingerprints/JsonHookPatchFingerprint.kt
deleted file mode 100644
index 1384359..0000000
--- a/src/main/kotlin/indus/org/patches/twitter/hook/json/fingerprints/JsonHookPatchFingerprint.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package indus.org.patches.twitter.hook.json.fingerprints
-
-import app.revanced.patcher.fingerprint.MethodFingerprint
-import com.android.tools.smali.dexlib2.Opcode
-
-internal object JsonHookPatchFingerprint : MethodFingerprint(
- customFingerprint = { methodDef, _ -> methodDef.name == "" },
- opcodes = listOf(
- Opcode.INVOKE_INTERFACE, // Add dummy hook to hooks list.
- // Add hooks to the hooks list.
- Opcode.INVOKE_STATIC // Call buildList.
- )
-)
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/hook/json/fingerprints/JsonInputStreamFingerprint.kt b/src/main/kotlin/indus/org/patches/twitter/hook/json/fingerprints/JsonInputStreamFingerprint.kt
deleted file mode 100644
index 7457752..0000000
--- a/src/main/kotlin/indus/org/patches/twitter/hook/json/fingerprints/JsonInputStreamFingerprint.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package indus.org.patches.twitter.hook.json.fingerprints
-
-import app.revanced.patcher.fingerprint.MethodFingerprint
-
-internal object JsonInputStreamFingerprint : MethodFingerprint(
- customFingerprint = { methodDef, _ ->
- if (methodDef.parameterTypes.size == 0) false
- else methodDef.parameterTypes.first() == "Ljava/io/InputStream;"
- }
-)
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/hook/json/fingerprints/LoganSquareFingerprint.kt b/src/main/kotlin/indus/org/patches/twitter/hook/json/fingerprints/LoganSquareFingerprint.kt
deleted file mode 100644
index b42a32b..0000000
--- a/src/main/kotlin/indus/org/patches/twitter/hook/json/fingerprints/LoganSquareFingerprint.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package indus.org.patches.twitter.hook.json.fingerprints
-
-import app.revanced.patcher.fingerprint.MethodFingerprint
-
-internal object LoganSquareFingerprint : MethodFingerprint(
- customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("LoganSquare;") }
-)
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/hook/patch/BaseHookPatch.kt b/src/main/kotlin/indus/org/patches/twitter/hook/patch/BaseHookPatch.kt
deleted file mode 100644
index 3811e52..0000000
--- a/src/main/kotlin/indus/org/patches/twitter/hook/patch/BaseHookPatch.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package indus.org.patches.twitter.hook.patch
-
-import app.revanced.patcher.data.BytecodeContext
-import app.revanced.patcher.patch.BytecodePatch
-import indus.org.patches.twitter.hook.json.JsonHookPatch
-
-abstract class BaseHookPatch(private val hookClassDescriptor: String) : BytecodePatch() {
- override fun execute(context: BytecodeContext) =
- JsonHookPatch.hooks.addHook(JsonHookPatch.Hook(context, hookClassDescriptor))
-}
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/hook/patch/ads/HideAdsHookPatch.kt b/src/main/kotlin/indus/org/patches/twitter/hook/patch/ads/HideAdsHookPatch.kt
deleted file mode 100644
index deb9ec5..0000000
--- a/src/main/kotlin/indus/org/patches/twitter/hook/patch/ads/HideAdsHookPatch.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package indus.org.patches.twitter.hook.patch.ads
-
-import app.revanced.patcher.patch.annotation.CompatiblePackage
-import app.revanced.patcher.patch.annotation.Patch
-import indus.org.patches.twitter.hook.json.JsonHookPatch
-import indus.org.patches.twitter.hook.patch.BaseHookPatch
-
-@Patch(
- name = "Hide ads",
- description = "DON'T USE WHEN PATCHING ALONG WITH CRIMERA PATCHES AND INTEGRATIONS (NOT NEEDED ANYWAYS THEN).",
- dependencies = [JsonHookPatch::class],
- compatiblePackages = [CompatiblePackage("com.twitter.android")],
- use = false
-)
-@Suppress("unused")
-object HideAdsHookPatch : BaseHookPatch("Lapp/revanced/integrations/twitter/patches/hook/patch/ads/AdsHook;")
\ No newline at end of file
diff --git a/src/main/kotlin/indus/org/patches/twitter/hook/patch/recommendation/HideRecommendedUsersPatch.kt b/src/main/kotlin/indus/org/patches/twitter/hook/patch/recommendation/HideRecommendedUsersPatch.kt
deleted file mode 100644
index 354277a..0000000
--- a/src/main/kotlin/indus/org/patches/twitter/hook/patch/recommendation/HideRecommendedUsersPatch.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package indus.org.patches.twitter.hook.patch.recommendation
-
-import app.revanced.patcher.patch.annotation.CompatiblePackage
-import app.revanced.patcher.patch.annotation.Patch
-import indus.org.patches.twitter.hook.json.JsonHookPatch
-import indus.org.patches.twitter.hook.patch.BaseHookPatch
-
-@Patch(
- name = "Hide promoted users",
- description = "DON'T USE WHEN PATCHING ALONG WITH CRIMERA PATCHES AND INTEGRATIONS (NOT NEEDED ANYWAYS THEN).",
- dependencies = [JsonHookPatch::class],
- compatiblePackages = [CompatiblePackage("com.twitter.android")],
- use = false
-)
-@Suppress("unused")
-object HideRecommendedUsersPatch : BaseHookPatch(
- "Lapp/revanced/integrations/twitter/patches/hook/patch/recommendation/RecommendedUsersHook;")
\ No newline at end of file