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.
usage 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