mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-07 18:03:55 +01:00
Compare commits
171 Commits
v2.131.0
...
v2.157.0-d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
246a6ce927 | ||
|
|
225726feeb | ||
|
|
f0b384bbfe | ||
|
|
160191b5cb | ||
|
|
bc06b4dfda | ||
|
|
c6e0e79cd5 | ||
|
|
53ab837489 | ||
|
|
1a94209bfb | ||
|
|
c30bf18745 | ||
|
|
068f18cd5b | ||
|
|
06105f4c87 | ||
|
|
5359965a0b | ||
|
|
3881fda3f4 | ||
|
|
cc43f356b5 | ||
|
|
939c084e31 | ||
|
|
b888eafce1 | ||
|
|
df3316b804 | ||
|
|
68f941deda | ||
|
|
0b18ed8f7f | ||
|
|
1f1519ca33 | ||
|
|
6bc5025e1f | ||
|
|
94f7897a34 | ||
|
|
9c3a8aad83 | ||
|
|
44451c9b95 | ||
|
|
474cc4d5e6 | ||
|
|
d492ff23af | ||
|
|
34c1b4a871 | ||
|
|
e6360285eb | ||
|
|
7814ce9a5d | ||
|
|
9013eea406 | ||
|
|
5240e749e1 | ||
|
|
0310fa434c | ||
|
|
1e728b4ecf | ||
|
|
b285183554 | ||
|
|
772d3ae073 | ||
|
|
b7390de6bf | ||
|
|
8ac6ab6a9c | ||
|
|
67bf5a0d16 | ||
|
|
4ce31eedd7 | ||
|
|
270916bb43 | ||
|
|
3944521a01 | ||
|
|
b57eee8582 | ||
|
|
e4cc17e6ef | ||
|
|
3789a205cb | ||
|
|
efe814f2e1 | ||
|
|
e13db6934f | ||
|
|
7e8c544d42 | ||
|
|
8a3c0e1bcb | ||
|
|
ce0158db3a | ||
|
|
2c8550c7e7 | ||
|
|
6b35ffc5b8 | ||
|
|
f0b0017ff1 | ||
|
|
a3e7ee6454 | ||
|
|
b885bf82cd | ||
|
|
09ea24938c | ||
|
|
58994b14f8 | ||
|
|
370067266c | ||
|
|
62a8ac4f9b | ||
|
|
4d74458023 | ||
|
|
37cfb6900c | ||
|
|
c0bc6fe658 | ||
|
|
ec64b8d1ff | ||
|
|
a52a692062 | ||
|
|
c372d7823c | ||
|
|
47dce0d01e | ||
|
|
b777d2e230 | ||
|
|
c98baf93fc | ||
|
|
4e4b0ecb0d | ||
|
|
e8391b3e93 | ||
|
|
1db7eebeaa | ||
|
|
50e210d94f | ||
|
|
ad6fab930d | ||
|
|
7966be827f | ||
|
|
6a6f05e2cb | ||
|
|
752b12b66d | ||
|
|
623a9bce98 | ||
|
|
6441b031e3 | ||
|
|
4227ffa40f | ||
|
|
9158fd5054 | ||
|
|
7f529d1038 | ||
|
|
bb38c02b51 | ||
|
|
b927e8b93f | ||
|
|
ba4676d500 | ||
|
|
1af1bf8342 | ||
|
|
2374af6f82 | ||
|
|
4da3e4f369 | ||
|
|
f89027609f | ||
|
|
7e3184b5f7 | ||
|
|
49cca5a258 | ||
|
|
63f5af5c3b | ||
|
|
82df77460f | ||
|
|
3227d66dc2 | ||
|
|
62102c9543 | ||
|
|
adc2f738c0 | ||
|
|
a3b3b613e2 | ||
|
|
e60173addf | ||
|
|
be80837218 | ||
|
|
528cbfc171 | ||
|
|
dc055a0b20 | ||
|
|
7f1f317c08 | ||
|
|
b18256a2a2 | ||
|
|
a3ece1e154 | ||
|
|
5ead461caf | ||
|
|
66c582795e | ||
|
|
c3641d90dd | ||
|
|
da108ca9bb | ||
|
|
96d88ae0fb | ||
|
|
6e0830929c | ||
|
|
e67f18b9c2 | ||
|
|
b2b1108c47 | ||
|
|
89215d6513 | ||
|
|
ce4d144910 | ||
|
|
dbd2f5b7da | ||
|
|
ed7b86072c | ||
|
|
c90069f9c5 | ||
|
|
df2a051724 | ||
|
|
6831b3ce25 | ||
|
|
c201f6dc2c | ||
|
|
9849df5814 | ||
|
|
677fd639b7 | ||
|
|
63b63a394d | ||
|
|
936780038b | ||
|
|
6c4c834587 | ||
|
|
2ef3625cac | ||
|
|
10107919bd | ||
|
|
76b6c1561a | ||
|
|
73023cd45e | ||
|
|
456c6ce2bf | ||
|
|
d32782962f | ||
|
|
0fe7cacb31 | ||
|
|
e6e5864450 | ||
|
|
a767f77b72 | ||
|
|
3dc88e2578 | ||
|
|
2df07cad36 | ||
|
|
943221173e | ||
|
|
6ff3f3c974 | ||
|
|
e4c2bb9d39 | ||
|
|
67e2e00cdc | ||
|
|
170c5daa33 | ||
|
|
ce1099cd9c | ||
|
|
9af1fef0b7 | ||
|
|
a421da53f3 | ||
|
|
6a49b617fd | ||
|
|
d5bff774ed | ||
|
|
72dacd7c9d | ||
|
|
2afdb1a70d | ||
|
|
127ab85d5e | ||
|
|
817a6a9f87 | ||
|
|
18b39a448e | ||
|
|
13e74c9946 | ||
|
|
d77c9fec15 | ||
|
|
27c66f7d12 | ||
|
|
ad3041635f | ||
|
|
8ff56f557c | ||
|
|
6369b24f64 | ||
|
|
f1960310b6 | ||
|
|
0aaa2a40ec | ||
|
|
9d6c99930b | ||
|
|
d50a58900c | ||
|
|
139f9a88eb | ||
|
|
f057ba8eab | ||
|
|
7bd544e171 | ||
|
|
796d4dc407 | ||
|
|
99f6363606 | ||
|
|
f63cfb52b0 | ||
|
|
583ec5d8e3 | ||
|
|
b675adef30 | ||
|
|
a08fe535b1 | ||
|
|
7e5c963e36 | ||
|
|
05ea840b8f | ||
|
|
da4b80c5dd |
4
.github/ISSUE_TEMPLATE/bug-issue.yml
vendored
4
.github/ISSUE_TEMPLATE/bug-issue.yml
vendored
@@ -36,7 +36,7 @@ body:
|
|||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Relevant log output
|
label: Relevant log output
|
||||||
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
|
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. Capture crash logs by running `logcat | grep AndroidRuntime`.
|
||||||
render: shell
|
render: shell
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
@@ -70,4 +70,4 @@ body:
|
|||||||
- label: I have written a short but informative title.
|
- label: I have written a short but informative title.
|
||||||
required: true
|
required: true
|
||||||
- label: I filled out all of the requested information in this issue properly.
|
- label: I filled out all of the requested information in this issue properly.
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
25
.github/workflows/pull_request.yml
vendored
Normal file
25
.github/workflows/pull_request.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
name: PR to main
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- dev
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
MESSAGE: merge branch `${{ github.head_ref || github.ref_name }}` to `main`
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
pull-request:
|
||||||
|
name: Open pull request
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Open pull request
|
||||||
|
uses: repo-sync/pull-request@v2
|
||||||
|
with:
|
||||||
|
destination_branch: 'main'
|
||||||
|
pr_title: 'chore: ${{ env.MESSAGE }}'
|
||||||
|
pr_body: 'This pull request will ${{ env.MESSAGE }}.'
|
||||||
|
pr_draft: true
|
||||||
28
.github/workflows/release.yml
vendored
28
.github/workflows/release.yml
vendored
@@ -1,4 +1,5 @@
|
|||||||
name: Release
|
name: Release
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
@@ -9,32 +10,43 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
- dev
|
- dev
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
name: Release
|
name: Release
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
|
# Make sure the release step uses its own credentials:
|
||||||
|
# https://github.com/cycjimmy/semantic-release-action#private-packages
|
||||||
|
persist-credentials: false
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Setup JDK
|
- name: Setup JDK
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
java-version: '17'
|
java-version: '17'
|
||||||
distribution: 'temurin'
|
distribution: 'zulu'
|
||||||
cache: gradle
|
cache: gradle
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 'latest'
|
||||||
|
cache: 'npm'
|
||||||
- name: Setup Android SDK
|
- name: Setup Android SDK
|
||||||
uses: android-actions/setup-android@v2
|
uses: amyu/setup-android@v2
|
||||||
|
with:
|
||||||
|
cache-disabled: false
|
||||||
|
sdk-version: '33'
|
||||||
|
build-tools-version: '33.0.1'
|
||||||
- name: Build with Gradle
|
- name: Build with Gradle
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: ./gradlew build clean generateMeta
|
run: ./gradlew generateMeta clean --no-daemon
|
||||||
- name: Install Android build-tools
|
|
||||||
run: sdkmanager "build-tools;32.0.0"
|
|
||||||
- name: Setup semantic-release
|
- name: Setup semantic-release
|
||||||
run: npm install -g semantic-release @semantic-release/git @semantic-release/changelog gradle-semantic-release-plugin -D
|
run: npm install semantic-release@19.0.5 @saithodev/semantic-release-backmerge @semantic-release/git @semantic-release/changelog gradle-semantic-release-plugin@1.7.4 -D
|
||||||
- name: Release
|
- name: Release
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }}
|
||||||
run: npx semantic-release
|
run: npx semantic-release
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -118,3 +118,6 @@ gradle-app.setting
|
|||||||
|
|
||||||
# Ignore vscode config
|
# Ignore vscode config
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
16
.releaserc
16
.releaserc
@@ -7,11 +7,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"plugins": [
|
"plugins": [
|
||||||
["@semantic-release/commit-analyzer", {
|
"@semantic-release/commit-analyzer",
|
||||||
"releaseRules": [
|
|
||||||
{"type": "build", "release": "patch"}
|
|
||||||
]
|
|
||||||
}],
|
|
||||||
"@semantic-release/release-notes-generator",
|
"@semantic-release/release-notes-generator",
|
||||||
"@semantic-release/changelog",
|
"@semantic-release/changelog",
|
||||||
"gradle-semantic-release-plugin",
|
"gradle-semantic-release-plugin",
|
||||||
@@ -36,7 +32,15 @@
|
|||||||
{
|
{
|
||||||
"path": "patches.json"
|
"path": "patches.json"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
successComment: false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"@saithodev/semantic-release-backmerge",
|
||||||
|
{
|
||||||
|
branches: [{from: "main", to: "dev"}],
|
||||||
|
clearWorkspace: true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|||||||
512
CHANGELOG.md
512
CHANGELOG.md
@@ -1,3 +1,515 @@
|
|||||||
|
# [2.157.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.157.0-dev.1...v2.157.0-dev.2) (2023-01-24)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **music:** update patches compatibility to v5.40.51 ([#1541](https://github.com/revanced/revanced-patches/issues/1541)) ([13143cb](https://github.com/revanced/revanced-patches/commit/13143cb5260f8793d246633a6a506bdc9f3a3ce7))
|
||||||
|
|
||||||
|
# [2.157.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.156.0...v2.157.0-dev.1) (2023-01-23)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* parse any kind of patch version ([66cd88f](https://github.com/revanced/revanced-patches/commit/66cd88f4d8a9161a4c51b70f2384dcee92fe2aea))
|
||||||
|
* **twitter/hide-views-stats:** constrain to last working version ([#1522](https://github.com/revanced/revanced-patches/issues/1522)) ([bf45817](https://github.com/revanced/revanced-patches/commit/bf45817677fd058f9b255dbef5c1ca9aaec95531))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **finanzonline:** `remove-bootloader-detection` patch ([3952138](https://github.com/revanced/revanced-patches/commit/39521386c2296f46479e31c39ab245c2778ebd65))
|
||||||
|
* **finanzonline:** `remove-root-detection` patch ([1d46d63](https://github.com/revanced/revanced-patches/commit/1d46d63fdcf3cbce53a7719f4490225368c4d5ae))
|
||||||
|
* **youtube/microg-support:** check if Vanced MicroG is running in the background ([#1531](https://github.com/revanced/revanced-patches/issues/1531)) ([81934ef](https://github.com/revanced/revanced-patches/commit/81934efb39b8ed9b0a523ffd7c4d841227ac141f))
|
||||||
|
* **youtube:** `open-links-externally` patch ([#1524](https://github.com/revanced/revanced-patches/issues/1524)) ([caf3d70](https://github.com/revanced/revanced-patches/commit/caf3d70c30bc440923c0e76e7331010905f6e729))
|
||||||
|
|
||||||
|
# [2.156.0](https://github.com/revanced/revanced-patches/compare/v2.155.0...v2.156.0) (2023-01-17)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **reddit/general-reddit-ads:** specify last version that works correctly ([#1495](https://github.com/revanced/revanced-patches/issues/1495)) ([2a3bedd](https://github.com/revanced/revanced-patches/commit/2a3bedd5608d2f23b174c4227ac167e44e54215e))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* explain how to capture crash logs [skip ci] ([f938ba8](https://github.com/revanced/revanced-patches/commit/f938ba81ec98f06f508dbdceeabd29a0ea7bf1af))
|
||||||
|
* **id-austria:** `remove-root-detection` patch ([3cf77cd](https://github.com/revanced/revanced-patches/commit/3cf77cdb4ebbd128d29eedefa1ee35289e3c8058))
|
||||||
|
* **id-austria:** `spoof-signature` patch ([355a847](https://github.com/revanced/revanced-patches/commit/355a847b1ccd69c4ab2c356395c97b4871e53f1f))
|
||||||
|
* **nova-launcher:** `unlock-prime` patch ([#1463](https://github.com/revanced/revanced-patches/issues/1463)) ([cf710b2](https://github.com/revanced/revanced-patches/commit/cf710b27740cce4b9a0fbdf03a494eb8c65246da))
|
||||||
|
|
||||||
|
# [2.156.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.155.1-dev.1...v2.156.0-dev.1) (2023-01-17)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* explain how to capture crash logs [skip ci] ([f938ba8](https://github.com/revanced/revanced-patches/commit/f938ba81ec98f06f508dbdceeabd29a0ea7bf1af))
|
||||||
|
* **id-austria:** `remove-root-detection` patch ([3cf77cd](https://github.com/revanced/revanced-patches/commit/3cf77cdb4ebbd128d29eedefa1ee35289e3c8058))
|
||||||
|
* **id-austria:** `spoof-signature` patch ([355a847](https://github.com/revanced/revanced-patches/commit/355a847b1ccd69c4ab2c356395c97b4871e53f1f))
|
||||||
|
* **nova-launcher:** `unlock-prime` patch ([#1463](https://github.com/revanced/revanced-patches/issues/1463)) ([cf710b2](https://github.com/revanced/revanced-patches/commit/cf710b27740cce4b9a0fbdf03a494eb8c65246da))
|
||||||
|
|
||||||
|
## [2.155.1-dev.1](https://github.com/revanced/revanced-patches/compare/v2.155.0...v2.155.1-dev.1) (2023-01-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **reddit/general-reddit-ads:** specify last version that works correctly ([#1495](https://github.com/revanced/revanced-patches/issues/1495)) ([2a3bedd](https://github.com/revanced/revanced-patches/commit/2a3bedd5608d2f23b174c4227ac167e44e54215e))
|
||||||
|
|
||||||
|
# [2.155.0](https://github.com/revanced/revanced-patches/compare/v2.154.0...v2.155.0) (2023-01-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* bump patcher dependency version ([a5d16d7](https://github.com/revanced/revanced-patches/commit/a5d16d7a22168b519180684e0efa3b0450915d7b))
|
||||||
|
* **youtube/open-links-directly:** use better titles and correct descriptions ([#1488](https://github.com/revanced/revanced-patches/issues/1488)) ([2874bbe](https://github.com/revanced/revanced-patches/commit/2874bbef154d28e56b5928048a255409a956a012))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube:** remove `fix-playback` patch ([edcb6cc](https://github.com/revanced/revanced-patches/commit/edcb6cc94961aaebe2df884db3049b2afa79f38f))
|
||||||
|
|
||||||
|
# [2.155.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.154.1-dev.1...v2.155.0-dev.1) (2023-01-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube:** remove `fix-playback` patch ([edcb6cc](https://github.com/revanced/revanced-patches/commit/edcb6cc94961aaebe2df884db3049b2afa79f38f))
|
||||||
|
|
||||||
|
## [2.154.1-dev.1](https://github.com/revanced/revanced-patches/compare/v2.154.0...v2.154.1-dev.1) (2023-01-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/open-links-directly:** use better titles and correct descriptions ([#1488](https://github.com/revanced/revanced-patches/issues/1488)) ([2874bbe](https://github.com/revanced/revanced-patches/commit/2874bbef154d28e56b5928048a255409a956a012))
|
||||||
|
|
||||||
|
# [2.154.0](https://github.com/revanced/revanced-patches/compare/v2.153.0...v2.154.0) (2023-01-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/hide-info-cards:** allow toggling visibility of info-cards ([#1464](https://github.com/revanced/revanced-patches/issues/1464)) ([e6dcb55](https://github.com/revanced/revanced-patches/commit/e6dcb55382441f03c4b1322ccd652a22db104254))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* `remove-screenshot-restriction` patch ([#1455](https://github.com/revanced/revanced-patches/issues/1455)) ([a16ab79](https://github.com/revanced/revanced-patches/commit/a16ab7969d98b1e05ac896a4b9aa834cdac8734e))
|
||||||
|
* **music:** update patches compatibility to v5.38.53 ([#1453](https://github.com/revanced/revanced-patches/issues/1453)) ([c7d116a](https://github.com/revanced/revanced-patches/commit/c7d116afd7293924760e7b6c1de0ba5d6cbd00a0))
|
||||||
|
* **music:** update patches compatibility to v5.39.52 ([#1484](https://github.com/revanced/revanced-patches/issues/1484)) ([81d6527](https://github.com/revanced/revanced-patches/commit/81d65273be81b5934e1cca543850db58f8df019e))
|
||||||
|
* **tiktok:** update patches compatibility to v27.8.3 ([#1483](https://github.com/revanced/revanced-patches/issues/1483)) ([e72b3bd](https://github.com/revanced/revanced-patches/commit/e72b3bd4e22f5ade7193ba6a3cdf61fcd91fba55))
|
||||||
|
* **youtube/return-youtube-dislike:** style for minimum width ([#1454](https://github.com/revanced/revanced-patches/issues/1454)) ([fd782aa](https://github.com/revanced/revanced-patches/commit/fd782aa0a37edf2344425c80afafb2c87851bc1a))
|
||||||
|
* **youtube:** `spoof-app-version` patch ([#1449](https://github.com/revanced/revanced-patches/issues/1449)) ([bd4d3b5](https://github.com/revanced/revanced-patches/commit/bd4d3b5706f26e398292df952ca8aec6c7dd1d6a))
|
||||||
|
|
||||||
|
# [2.154.0-dev.3](https://github.com/revanced/revanced-patches/compare/v2.154.0-dev.2...v2.154.0-dev.3) (2023-01-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **tiktok:** update patches compatibility to v27.8.3 ([#1483](https://github.com/revanced/revanced-patches/issues/1483)) ([e72b3bd](https://github.com/revanced/revanced-patches/commit/e72b3bd4e22f5ade7193ba6a3cdf61fcd91fba55))
|
||||||
|
|
||||||
|
# [2.154.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.154.0-dev.1...v2.154.0-dev.2) (2023-01-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **music:** update patches compatibility to v5.39.52 ([#1484](https://github.com/revanced/revanced-patches/issues/1484)) ([81d6527](https://github.com/revanced/revanced-patches/commit/81d65273be81b5934e1cca543850db58f8df019e))
|
||||||
|
|
||||||
|
# [2.154.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.153.0...v2.154.0-dev.1) (2023-01-10)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/hide-info-cards:** allow toggling visibility of info-cards ([#1464](https://github.com/revanced/revanced-patches/issues/1464)) ([e6dcb55](https://github.com/revanced/revanced-patches/commit/e6dcb55382441f03c4b1322ccd652a22db104254))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* `remove-screenshot-restriction` patch ([#1455](https://github.com/revanced/revanced-patches/issues/1455)) ([a16ab79](https://github.com/revanced/revanced-patches/commit/a16ab7969d98b1e05ac896a4b9aa834cdac8734e))
|
||||||
|
* **music:** update patches compatibility to v5.38.53 ([#1453](https://github.com/revanced/revanced-patches/issues/1453)) ([c7d116a](https://github.com/revanced/revanced-patches/commit/c7d116afd7293924760e7b6c1de0ba5d6cbd00a0))
|
||||||
|
* **youtube/return-youtube-dislike:** style for minimum width ([#1454](https://github.com/revanced/revanced-patches/issues/1454)) ([fd782aa](https://github.com/revanced/revanced-patches/commit/fd782aa0a37edf2344425c80afafb2c87851bc1a))
|
||||||
|
* **youtube:** `spoof-app-version` patch ([#1449](https://github.com/revanced/revanced-patches/issues/1449)) ([bd4d3b5](https://github.com/revanced/revanced-patches/commit/bd4d3b5706f26e398292df952ca8aec6c7dd1d6a))
|
||||||
|
|
||||||
|
# [2.153.0](https://github.com/revanced/revanced-patches/compare/v2.152.0...v2.153.0) (2023-01-07)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/general-ads:** move settings to correct preference screens ([cde45fc](https://github.com/revanced/revanced-patches/commit/cde45fca769eddea64072f13f836d46560a4a89a))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/remember-video-quality:** simplify settings switch state description ([9bd42ec](https://github.com/revanced/revanced-patches/commit/9bd42ec1a1b54b103cd2550211515acdaf90e9de))
|
||||||
|
* **youtube:** `remember-playback-rate` patch ([177e908](https://github.com/revanced/revanced-patches/commit/177e908dba260f184a2835b73b834563ca9c29fd))
|
||||||
|
|
||||||
|
# [2.153.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.152.1-dev.1...v2.153.0-dev.1) (2023-01-07)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/remember-video-quality:** simplify settings switch state description ([9bd42ec](https://github.com/revanced/revanced-patches/commit/9bd42ec1a1b54b103cd2550211515acdaf90e9de))
|
||||||
|
* **youtube:** `remember-playback-rate` patch ([177e908](https://github.com/revanced/revanced-patches/commit/177e908dba260f184a2835b73b834563ca9c29fd))
|
||||||
|
|
||||||
|
## [2.152.1-dev.1](https://github.com/revanced/revanced-patches/compare/v2.152.0...v2.152.1-dev.1) (2023-01-07)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/general-ads:** move settings to correct preference screens ([cde45fc](https://github.com/revanced/revanced-patches/commit/cde45fca769eddea64072f13f836d46560a4a89a))
|
||||||
|
|
||||||
|
# [2.152.0](https://github.com/revanced/revanced-patches/compare/v2.151.0...v2.152.0) (2023-01-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/copy-video-url:** match icon style with native icon ([#1419](https://github.com/revanced/revanced-patches/issues/1419)) ([e89e54c](https://github.com/revanced/revanced-patches/commit/e89e54c316a2d99195d2b79e9176d34f6de0113c))
|
||||||
|
|
||||||
|
# [2.152.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.151.0...v2.152.0-dev.1) (2023-01-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/copy-video-url:** match icon style with native icon ([#1419](https://github.com/revanced/revanced-patches/issues/1419)) ([e89e54c](https://github.com/revanced/revanced-patches/commit/e89e54c316a2d99195d2b79e9176d34f6de0113c))
|
||||||
|
|
||||||
|
# [2.151.0](https://github.com/revanced/revanced-patches/compare/v2.150.0...v2.151.0) (2022-12-31)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/general-ads:** restore swipe back to exit gesture ([#1405](https://github.com/revanced/revanced-patches/issues/1405)) ([2440587](https://github.com/revanced/revanced-patches/commit/24405877dd935a757fa61c7580887c1a47a25ea9))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube:** `copy-video-url` patch ([#1402](https://github.com/revanced/revanced-patches/issues/1402)) ([bf982e8](https://github.com/revanced/revanced-patches/commit/bf982e8d7765c2a89a5475b6db8b203a3ac4ddf9))
|
||||||
|
|
||||||
|
# [2.151.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.150.0...v2.151.0-dev.1) (2022-12-31)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/general-ads:** restore swipe back to exit gesture ([#1405](https://github.com/revanced/revanced-patches/issues/1405)) ([2440587](https://github.com/revanced/revanced-patches/commit/24405877dd935a757fa61c7580887c1a47a25ea9))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube:** `copy-video-url` patch ([#1402](https://github.com/revanced/revanced-patches/issues/1402)) ([bf982e8](https://github.com/revanced/revanced-patches/commit/bf982e8d7765c2a89a5475b6db8b203a3ac4ddf9))
|
||||||
|
|
||||||
|
# [2.150.0](https://github.com/revanced/revanced-patches/compare/v2.149.0...v2.150.0) (2022-12-31)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/bottom-controls-resource-patch:** use correct length for `nameSpaceLength` ([#1401](https://github.com/revanced/revanced-patches/issues/1401)) ([7190066](https://github.com/revanced/revanced-patches/commit/7190066a8ded8b59970483a81d7902526d552093))
|
||||||
|
* **youtube/general-ads:** resolve fingerprint to correct method ([#1404](https://github.com/revanced/revanced-patches/issues/1404)) ([e135485](https://github.com/revanced/revanced-patches/commit/e1354852501cb582549cbf0634b1a15e1d0012d9))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/return-youtube-dislike:** better formatting and LTR support ([#1370](https://github.com/revanced/revanced-patches/issues/1370)) ([fd0fe1c](https://github.com/revanced/revanced-patches/commit/fd0fe1c86ca99e395d340e85f4f1eb7b221e90ea))
|
||||||
|
|
||||||
|
## [2.149.1-dev.2](https://github.com/revanced/revanced-patches/compare/v2.149.1-dev.1...v2.149.1-dev.2) (2022-12-31)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/general-ads:** resolve fingerprint to correct method ([#1404](https://github.com/revanced/revanced-patches/issues/1404)) ([e135485](https://github.com/revanced/revanced-patches/commit/e1354852501cb582549cbf0634b1a15e1d0012d9))
|
||||||
|
|
||||||
|
## [2.149.1-dev.1](https://github.com/revanced/revanced-patches/compare/v2.149.0...v2.149.1-dev.1) (2022-12-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/bottom-controls-resource-patch:** use correct length for `nameSpaceLength` ([#1401](https://github.com/revanced/revanced-patches/issues/1401)) ([7190066](https://github.com/revanced/revanced-patches/commit/7190066a8ded8b59970483a81d7902526d552093))
|
||||||
|
|
||||||
|
# [2.149.0](https://github.com/revanced/revanced-patches/compare/v2.148.0...v2.149.0) (2022-12-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **tasker/unlock-license:** resolve fingerprint correctly ([92d7857](https://github.com/revanced/revanced-patches/commit/92d78576f033dd7155c80cb08d5911048b06c36c))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/general-ads-patch:** hide channel member shelf ([#1380](https://github.com/revanced/revanced-patches/issues/1380)) ([ce2b104](https://github.com/revanced/revanced-patches/commit/ce2b104f508f1581ec531446d60bd3d41dafbd2c))
|
||||||
|
|
||||||
|
# [2.149.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.148.0...v2.149.0-dev.1) (2022-12-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **tasker/unlock-license:** resolve fingerprint correctly ([92d7857](https://github.com/revanced/revanced-patches/commit/92d78576f033dd7155c80cb08d5911048b06c36c))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/general-ads-patch:** hide channel member shelf ([#1380](https://github.com/revanced/revanced-patches/issues/1380)) ([ce2b104](https://github.com/revanced/revanced-patches/commit/ce2b104f508f1581ec531446d60bd3d41dafbd2c))
|
||||||
|
|
||||||
|
# [2.148.0](https://github.com/revanced/revanced-patches/compare/v2.147.0...v2.148.0) (2022-12-29)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/general-ads:** don't early return when not necessary ([#1353](https://github.com/revanced/revanced-patches/issues/1353)) ([003a400](https://github.com/revanced/revanced-patches/commit/003a400ce41ff543fb5484c576f5ec2df0a87273))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **tasker:** `unlock-license` patch ([#1339](https://github.com/revanced/revanced-patches/issues/1339)) ([78a43b8](https://github.com/revanced/revanced-patches/commit/78a43b8abd972172eab99519dfa636ce77d9e64f))
|
||||||
|
* **twitter:** `hide-views-stats` patch ([#1371](https://github.com/revanced/revanced-patches/issues/1371)) ([2f04a06](https://github.com/revanced/revanced-patches/commit/2f04a06e3b782931870d973fd0937f8731062f12))
|
||||||
|
* **youtube/general-ads-patch:** hide guidelines for subscriber ([#1352](https://github.com/revanced/revanced-patches/issues/1352)) ([2d10932](https://github.com/revanced/revanced-patches/commit/2d1093251d5d50b476ca44f76acb9a8597b37aea))
|
||||||
|
* **youtube/theme:** add option to color the seekbar ([53b91fe](https://github.com/revanced/revanced-patches/commit/53b91fe2b5a41f1a63deec8d919f2a1bc1cae12a))
|
||||||
|
* **youtube/theme:** include the patch by default ([c363997](https://github.com/revanced/revanced-patches/commit/c3639975683fb0ca0e271e8fc3ef7fbf79f33414))
|
||||||
|
* **youtube:** `hide-breaking-news-shelf` patch ([#1381](https://github.com/revanced/revanced-patches/issues/1381)) ([38a9877](https://github.com/revanced/revanced-patches/commit/38a987744fbb49c2b7d5d0e69297e95f5ee405c4))
|
||||||
|
|
||||||
|
# [2.148.0-dev.6](https://github.com/revanced/revanced-patches/compare/v2.148.0-dev.5...v2.148.0-dev.6) (2022-12-29)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/theme:** add option to color the seekbar ([53b91fe](https://github.com/revanced/revanced-patches/commit/53b91fe2b5a41f1a63deec8d919f2a1bc1cae12a))
|
||||||
|
* **youtube/theme:** include the patch by default ([c363997](https://github.com/revanced/revanced-patches/commit/c3639975683fb0ca0e271e8fc3ef7fbf79f33414))
|
||||||
|
|
||||||
|
# [2.148.0-dev.5](https://github.com/revanced/revanced-patches/compare/v2.148.0-dev.4...v2.148.0-dev.5) (2022-12-29)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube:** `hide-breaking-news-shelf` patch ([#1381](https://github.com/revanced/revanced-patches/issues/1381)) ([38a9877](https://github.com/revanced/revanced-patches/commit/38a987744fbb49c2b7d5d0e69297e95f5ee405c4))
|
||||||
|
|
||||||
|
# [2.148.0-dev.4](https://github.com/revanced/revanced-patches/compare/v2.148.0-dev.3...v2.148.0-dev.4) (2022-12-29)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **twitter:** `hide-views-stats` patch ([#1371](https://github.com/revanced/revanced-patches/issues/1371)) ([2f04a06](https://github.com/revanced/revanced-patches/commit/2f04a06e3b782931870d973fd0937f8731062f12))
|
||||||
|
|
||||||
|
# [2.148.0-dev.3](https://github.com/revanced/revanced-patches/compare/v2.148.0-dev.2...v2.148.0-dev.3) (2022-12-26)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/general-ads:** don't early return when not necessary ([#1353](https://github.com/revanced/revanced-patches/issues/1353)) ([003a400](https://github.com/revanced/revanced-patches/commit/003a400ce41ff543fb5484c576f5ec2df0a87273))
|
||||||
|
|
||||||
|
# [2.148.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.148.0-dev.1...v2.148.0-dev.2) (2022-12-26)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/general-ads-patch:** hide guidelines for subscriber ([#1352](https://github.com/revanced/revanced-patches/issues/1352)) ([2d10932](https://github.com/revanced/revanced-patches/commit/2d1093251d5d50b476ca44f76acb9a8597b37aea))
|
||||||
|
|
||||||
|
# [2.148.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.147.0...v2.148.0-dev.1) (2022-12-21)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **tasker:** `unlock-license` patch ([#1339](https://github.com/revanced/revanced-patches/issues/1339)) ([78a43b8](https://github.com/revanced/revanced-patches/commit/78a43b8abd972172eab99519dfa636ce77d9e64f))
|
||||||
|
|
||||||
|
# [2.147.0](https://github.com/revanced/revanced-patches/compare/v2.146.0...v2.147.0) (2022-12-21)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/return-youtube-dislike:** debug connection statistics, toast on error, high priority background threads ([#1320](https://github.com/revanced/revanced-patches/issues/1320)) ([30273a9](https://github.com/revanced/revanced-patches/commit/30273a9bbdd40453baeb09f26ac9d218569a3e71))
|
||||||
|
|
||||||
|
# [2.147.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.146.0...v2.147.0-dev.1) (2022-12-21)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/return-youtube-dislike:** debug connection statistics, toast on error, high priority background threads ([#1320](https://github.com/revanced/revanced-patches/issues/1320)) ([30273a9](https://github.com/revanced/revanced-patches/commit/30273a9bbdd40453baeb09f26ac9d218569a3e71))
|
||||||
|
|
||||||
|
# [2.146.0](https://github.com/revanced/revanced-patches/compare/v2.145.0...v2.146.0) (2022-12-18)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **predictive-back-gesture:** exclude by default ([176d34b](https://github.com/revanced/revanced-patches/commit/176d34b2ff92d0eb627dad86ad87f559df3db815))
|
||||||
|
* **twitter/timeline-ads:** add clarifying notice to description ([0eca2af](https://github.com/revanced/revanced-patches/commit/0eca2af1a4a688903c61ff6469ffea90c60f06a6))
|
||||||
|
* **youtube:** bump patches compatibility to v17.49.37 ([83ebc73](https://github.com/revanced/revanced-patches/commit/83ebc731130d3d216ac4b815382d8f13548cf665))
|
||||||
|
|
||||||
|
# [2.146.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.145.0...v2.146.0-dev.1) (2022-12-18)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **predictive-back-gesture:** exclude by default ([176d34b](https://github.com/revanced/revanced-patches/commit/176d34b2ff92d0eb627dad86ad87f559df3db815))
|
||||||
|
* **twitter/timeline-ads:** add clarifying notice to description ([0eca2af](https://github.com/revanced/revanced-patches/commit/0eca2af1a4a688903c61ff6469ffea90c60f06a6))
|
||||||
|
* **youtube:** bump patches compatibility to v17.49.37 ([83ebc73](https://github.com/revanced/revanced-patches/commit/83ebc731130d3d216ac4b815382d8f13548cf665))
|
||||||
|
|
||||||
|
# [2.145.0](https://github.com/revanced/revanced-patches/compare/v2.144.0...v2.145.0) (2022-12-18)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **tiktok/settings:** make compatible with newer versions ([c88740d](https://github.com/revanced/revanced-patches/commit/c88740dc2bf040747d9704d5bed52a7b533c22d6))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **crunchyroll:** remove `enable-downloads` patch ([2ac1546](https://github.com/revanced/revanced-patches/commit/2ac15460f5734fc2c6d2d78d34083a8e6b2f7012))
|
||||||
|
* **youtube-music:** bump compatibility to 5.36.51 ([c4a3099](https://github.com/revanced/revanced-patches/commit/c4a3099c1ca39431fba9beb94cc2b43e260561d9))
|
||||||
|
|
||||||
|
# [2.145.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.144.0...v2.145.0-dev.1) (2022-12-18)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **tiktok/settings:** make compatible with newer versions ([c88740d](https://github.com/revanced/revanced-patches/commit/c88740dc2bf040747d9704d5bed52a7b533c22d6))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **crunchyroll:** remove `enable-downloads` patch ([2ac1546](https://github.com/revanced/revanced-patches/commit/2ac15460f5734fc2c6d2d78d34083a8e6b2f7012))
|
||||||
|
* **youtube-music:** bump compatibility to 5.36.51 ([c4a3099](https://github.com/revanced/revanced-patches/commit/c4a3099c1ca39431fba9beb94cc2b43e260561d9))
|
||||||
|
|
||||||
|
# [2.144.0](https://github.com/revanced/revanced-patches/compare/v2.143.0...v2.144.0) (2022-12-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **citra:** add compatibility for canary package ([#1256](https://github.com/revanced/revanced-patches/issues/1256)) ([42ec021](https://github.com/revanced/revanced-patches/commit/42ec0218d829ea15759f83562d24588ce97cb646))
|
||||||
|
* link packages to Google PlayStore ([#1272](https://github.com/revanced/revanced-patches/issues/1272)) ([97892e0](https://github.com/revanced/revanced-patches/commit/97892e01044c74916375aeebcc094d3304e14f4e))
|
||||||
|
|
||||||
|
# [2.144.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.144.0-dev.1...v2.144.0-dev.2) (2022-12-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* link packages to Google PlayStore ([#1272](https://github.com/revanced/revanced-patches/issues/1272)) ([97892e0](https://github.com/revanced/revanced-patches/commit/97892e01044c74916375aeebcc094d3304e14f4e))
|
||||||
|
|
||||||
|
# [2.144.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.143.0...v2.144.0-dev.1) (2022-12-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **citra:** add compatibility for canary package ([#1256](https://github.com/revanced/revanced-patches/issues/1256)) ([42ec021](https://github.com/revanced/revanced-patches/commit/42ec0218d829ea15759f83562d24588ce97cb646))
|
||||||
|
|
||||||
|
# [2.143.0](https://github.com/revanced/revanced-patches/compare/v2.142.0...v2.143.0) (2022-12-14)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **predictive-back-gesture:** create attribute, if it does not exist ([c00e771](https://github.com/revanced/revanced-patches/commit/c00e7717053f806e3b5b3f0bf0ca9c2da07c289b))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **sleepasandroid:** remove `unlock-premium` patch ([#1253](https://github.com/revanced/revanced-patches/issues/1253)) ([414f503](https://github.com/revanced/revanced-patches/commit/414f503e493f2dc27edf134f5db723da77636d81))
|
||||||
|
|
||||||
|
# [2.143.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.143.0-dev.1...v2.143.0-dev.2) (2022-12-14)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **predictive-back-gesture:** create attribute, if it does not exist ([c00e771](https://github.com/revanced/revanced-patches/commit/c00e7717053f806e3b5b3f0bf0ca9c2da07c289b))
|
||||||
|
|
||||||
|
# [2.143.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.142.0...v2.143.0-dev.1) (2022-12-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **sleepasandroid:** remove `unlock-premium` patch ([#1253](https://github.com/revanced/revanced-patches/issues/1253)) ([414f503](https://github.com/revanced/revanced-patches/commit/414f503e493f2dc27edf134f5db723da77636d81))
|
||||||
|
|
||||||
|
# [2.142.0](https://github.com/revanced/revanced-patches/compare/v2.141.0...v2.142.0) (2022-12-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* `predictive-back-gesture` patch ([#1236](https://github.com/revanced/revanced-patches/issues/1236)) ([11b59f7](https://github.com/revanced/revanced-patches/commit/11b59f767c94514d49a84593618ff9d2aace2636))
|
||||||
|
* **twitch/block-embedded-ads:** `block-embedded-ads` patch ([#1166](https://github.com/revanced/revanced-patches/issues/1166)) ([018606e](https://github.com/revanced/revanced-patches/commit/018606e9832c43836b6b8f4fbd623adb8876d162))
|
||||||
|
|
||||||
|
# [2.141.0](https://github.com/revanced/revanced-patches/compare/v2.140.0...v2.141.0) (2022-12-09)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* inconsistencies in preference switches ([#1207](https://github.com/revanced/revanced-patches/issues/1207)) ([b6ea5a4](https://github.com/revanced/revanced-patches/commit/b6ea5a43b3eec6a06c7514cd79569b97a2b7d333))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/return-youtube-dislike:** simplify preference descriptions ([#1216](https://github.com/revanced/revanced-patches/issues/1216)) ([514b5da](https://github.com/revanced/revanced-patches/commit/514b5da9a7de6f8d0b0d00ec6269f836df3e9333))
|
||||||
|
|
||||||
|
# [2.140.0](https://github.com/revanced/revanced-patches/compare/v2.139.0...v2.140.0) (2022-12-05)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **music:** bump compatibility to v5.34.51 ([fc0c92e](https://github.com/revanced/revanced-patches/commit/fc0c92e2b68a2d93a02f4577aeb864955b1b5701))
|
||||||
|
|
||||||
|
# [2.139.0](https://github.com/revanced/revanced-patches/compare/v2.138.0...v2.139.0) (2022-12-05)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/return-youtube-dislike:** improve settings labels ([#1203](https://github.com/revanced/revanced-patches/issues/1203)) ([fb4a612](https://github.com/revanced/revanced-patches/commit/fb4a612592d82857b0e892a6f5d135dbd657c44d))
|
||||||
|
|
||||||
|
# [2.138.0](https://github.com/revanced/revanced-patches/compare/v2.137.0...v2.138.0) (2022-12-05)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/debugging:** print stack traces ([9cea382](https://github.com/revanced/revanced-patches/commit/9cea382750456434d0547351ee7d4013eac9de9c))
|
||||||
|
|
||||||
|
# [2.137.0](https://github.com/revanced/revanced-patches/compare/v2.136.0...v2.137.0) (2022-12-03)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/return-youtube-dislike:** show dislike as a percentage ([#1185](https://github.com/revanced/revanced-patches/issues/1185)) ([cbbab0b](https://github.com/revanced/revanced-patches/commit/cbbab0b4069534a2032258f9a09e9690fc68c291))
|
||||||
|
|
||||||
|
# [2.136.0](https://github.com/revanced/revanced-patches/compare/v2.135.0...v2.136.0) (2022-12-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* syntax error in compatiblity annotation ([#1181](https://github.com/revanced/revanced-patches/issues/1181)) ([0830c7e](https://github.com/revanced/revanced-patches/commit/0830c7ed1064757cf6354b426549275ece55408e))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube:** drop support for compatibility of old versions ([7413aad](https://github.com/revanced/revanced-patches/commit/7413aad6d215f24a66ba9a33917c73dbdb0b7bc3))
|
||||||
|
|
||||||
|
# [2.135.0](https://github.com/revanced/revanced-patches/compare/v2.134.1...v2.135.0) (2022-12-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* sort README patch table by amount of patches per package ([40cb14e](https://github.com/revanced/revanced-patches/commit/40cb14e1838aee5b49b60094cd134ed7e1726c3f))
|
||||||
|
|
||||||
|
## [2.134.1](https://github.com/revanced/revanced-patches/compare/v2.134.0...v2.134.1) (2022-12-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube:** swipe gesture on home screen ([9294084](https://github.com/revanced/revanced-patches/commit/929408406b53d8b0db69f092c3e191791b9fa8ee)), closes [#610](https://github.com/revanced/revanced-patches/issues/610)
|
||||||
|
|
||||||
|
# [2.134.0](https://github.com/revanced/revanced-patches/compare/v2.133.0...v2.134.0) (2022-12-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **anytracker:** syntax error in fingerprint ([#1165](https://github.com/revanced/revanced-patches/issues/1165)) ([46ad786](https://github.com/revanced/revanced-patches/commit/46ad786b1488814494080ca48cff27c361c47ca1))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **anytracker:** `unlock-premium` patch ([#1165](https://github.com/revanced/revanced-patches/issues/1165)) ([e7ed324](https://github.com/revanced/revanced-patches/commit/e7ed324bb5216037be0646a698e7e808fbf03e4e))
|
||||||
|
|
||||||
|
# [2.133.0](https://github.com/revanced/revanced-patches/compare/v2.132.0...v2.133.0) (2022-12-01)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **moneymanager:** `unlock-premium` patch ([#1173](https://github.com/revanced/revanced-patches/issues/1173)) ([438c1bc](https://github.com/revanced/revanced-patches/commit/438c1bca684c7d47bd5a401b4dccbaddef604650))
|
||||||
|
|
||||||
|
# [2.132.0](https://github.com/revanced/revanced-patches/compare/v2.131.0...v2.132.0) (2022-12-01)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **sleepasandroid:** `unlock-premium` patch ([#1172](https://github.com/revanced/revanced-patches/issues/1172)) ([580ddcd](https://github.com/revanced/revanced-patches/commit/580ddcdf1f8ef4a525f772630b3c085b706e4dc7))
|
||||||
|
* **twitch:** remove `block-embedded-ads` patch ([#1164](https://github.com/revanced/revanced-patches/issues/1164)) ([ecc1eae](https://github.com/revanced/revanced-patches/commit/ecc1eaef4daa7dfecb7913c378188b2b4685e610))
|
||||||
|
|
||||||
# [2.131.0](https://github.com/revanced/revanced-patches/compare/v2.130.0...v2.131.0) (2022-11-30)
|
# [2.131.0](https://github.com/revanced/revanced-patches/compare/v2.130.0...v2.131.0) (2022-11-30)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
310
README.md
310
README.md
@@ -4,73 +4,184 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
|
|
||||||
> Looking for the JSON variant of this? [Click here](patches.json).
|
> Looking for the JSON variant of this? [Click here](patches.json).
|
||||||
|
|
||||||
### 📦 `ginlemon.iconpackstudio`
|
### [📦 `com.google.android.youtube`](https://play.google.com/store/apps/details?id=com.google.android.youtube)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `unlock-pro` | Unlocks all pro features. | all |
|
| `always-autorepeat` | Always repeats the playing video again. | 17.49.37 |
|
||||||
|
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
|
||||||
|
| `comments` | Hides components related to comments. | 17.49.37 |
|
||||||
|
| `copy-video-url` | Adds buttons in player to copy video links. | 17.49.37 |
|
||||||
|
| `custom-branding` | Changes the YouTube launcher icon and name to your choice (defaults to ReVanced). | all |
|
||||||
|
| `custom-video-buffer` | Lets you change the buffers of videos. | 17.49.37 |
|
||||||
|
| `custom-video-speed` | Adds more video speed options. | 17.49.37 |
|
||||||
|
| `debugging` | Adds debugging options. | all |
|
||||||
|
| `disable-auto-captions` | Disable forced captions from being automatically enabled. | 17.49.37 |
|
||||||
|
| `disable-auto-player-popup-panels` | Disable automatic popup panels (playlist or live chat) on video player. | 17.49.37 |
|
||||||
|
| `disable-fullscreen-panels` | Disables video description and comments panel in fullscreen view. | 17.49.37 |
|
||||||
|
| `disable-startup-shorts-player` | Disables playing YouTube Shorts when launching YouTube. | 17.49.37 |
|
||||||
|
| `disable-zoom-haptics` | Disables haptics when zooming. | all |
|
||||||
|
| `downloads` | Enables downloading music and videos from YouTube. | 17.49.37 |
|
||||||
|
| `enable-wide-searchbar` | Replaces the search icon with a wide search bar. This will hide the YouTube logo when active. | 17.49.37 |
|
||||||
|
| `general-ads` | Removes general ads. | 17.49.37 |
|
||||||
|
| `hdr-auto-brightness` | Makes the brightness of HDR videos follow the system default. | 17.49.37 |
|
||||||
|
| `hide-album-cards` | Hides the album cards below the artist description. | 17.49.37 |
|
||||||
|
| `hide-artist-card` | Hides the artist card below the searchbar. | 17.49.37 |
|
||||||
|
| `hide-autoplay-button` | Hides the autoplay button in the video player. | 17.49.37 |
|
||||||
|
| `hide-breaking-news-shelf` | Hides the breaking news shelf on the homepage tab. | 17.49.37 |
|
||||||
|
| `hide-captions-button` | Hides the captions button on video player. | 17.49.37 |
|
||||||
|
| `hide-cast-button` | Hides the cast button in the video player. | all |
|
||||||
|
| `hide-create-button` | Hides the create button in the navigation bar. | 17.49.37 |
|
||||||
|
| `hide-crowdfunding-box` | Hides the crowdfunding box between the player and video description. | 17.49.37 |
|
||||||
|
| `hide-email-address` | Hides the email address in the account switcher. | 17.49.37 |
|
||||||
|
| `hide-endscreen-cards` | Hides the suggested video cards at the end of a video in fullscreen. | 17.49.37 |
|
||||||
|
| `hide-info-cards` | Hides info-cards in videos. | 17.49.37 |
|
||||||
|
| `hide-my-mix` | Hides mix playlists. | 17.49.37 |
|
||||||
|
| `hide-shorts-button` | Hides the shorts button on the navigation bar. | 17.49.37 |
|
||||||
|
| `hide-time-and-seekbar` | Hides progress bar and time counter on videos. | 17.49.37 |
|
||||||
|
| `hide-video-buttons` | Adds options to hide action buttons under a video. | 17.49.37 |
|
||||||
|
| `hide-watch-in-vr` | Hides the Watch in VR option in the player settings flyout panel. | 17.49.37 |
|
||||||
|
| `hide-watermark` | Hides creator's watermarks on videos. | 17.49.37 |
|
||||||
|
| `microg-support` | Allows YouTube ReVanced to run without root and under a different package name with Vanced MicroG. | 17.49.37 |
|
||||||
|
| `minimized-playback` | Enables minimized and background playback. | 17.49.37 |
|
||||||
|
| `old-quality-layout` | Enables the original video quality flyout in the video player settings | 17.49.37 |
|
||||||
|
| `open-links-directly` | Bypasses https://youtube.com/redirect URLs. | 17.49.37 |
|
||||||
|
| `open-links-externally` | Open links outside of the app directly in your browser. | 17.49.37 |
|
||||||
|
| `premium-heading` | Shows premium branding on the home screen. | all |
|
||||||
|
| `remember-playback-rate` | Adds the ability to remember the playback rate you chose in the video playback rate flyout. | 17.49.37 |
|
||||||
|
| `remember-video-quality` | Adds the ability to remember the video quality you chose in the video quality flyout. | 17.49.37 |
|
||||||
|
| `remove-player-button-background` | Removes the background from the video player buttons. | 17.49.37 |
|
||||||
|
| `return-youtube-dislike` | Shows the dislike count of videos using the Return YouTube Dislike API. | 17.49.37 |
|
||||||
|
| `seekbar-tapping` | Enables tap-to-seek on the seekbar of the video player. | 17.49.37 |
|
||||||
|
| `settings` | Adds settings for ReVanced to YouTube. | all |
|
||||||
|
| `sponsorblock` | Integrate SponsorBlock. | 17.49.37 |
|
||||||
|
| `spoof-app-version` | Tricks YouTube into thinking, you are running an older version of the app. One of the side effects also includes restoring the old UI. | 17.49.37 |
|
||||||
|
| `swipe-controls` | Adds volume and brightness swipe controls. | 17.49.37 |
|
||||||
|
| `tablet-mini-player` | Enables the tablet mini player layout. | 17.49.37 |
|
||||||
|
| `theme` | Applies a custom theme. | all |
|
||||||
|
| `video-ads` | Removes ads in the video player. | 17.49.37 |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `org.citra.citra_emu`
|
### [📦 `com.google.android.apps.youtube.music`](https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.music)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `premium-unlock` | Unlocks premium functions. | all |
|
| `background-play` | Enables playing music in the background. | 5.39.52 |
|
||||||
|
| `codecs-unlock` | Adds more audio codec options. The new audio codecs usually result in better audio quality. | 5.39.52 |
|
||||||
|
| `compact-header` | Hides the music category bar at the top of the homepage. | 5.39.52 |
|
||||||
|
| `exclusive-audio-playback` | Enables the option to play music without video. | 5.39.52 |
|
||||||
|
| `hide-get-premium` | Removes all "Get Premium" evidences from the avatar menu. | 5.39.52 |
|
||||||
|
| `minimized-playback-music` | Enables minimized playback on Kids music. | 5.39.52 |
|
||||||
|
| `music-microg-support` | Allows YouTube Music ReVanced to run without root and under a different package name. | 5.39.52 |
|
||||||
|
| `music-video-ads` | Removes ads in the music player. | 5.39.52 |
|
||||||
|
| `tasteBuilder-remover` | Removes the "Tell us which artists you like" card from the home screen. | 5.39.52 |
|
||||||
|
| `upgrade-button-remover` | Removes the upgrade tab from the pivot bar. | 5.39.52 |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `com.ss.android.ugc.trill`
|
### [📦 `com.ss.android.ugc.trill`](https://play.google.com/store/apps/details?id=com.ss.android.ugc.trill)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `disable-login-requirement` | Do not force login. | all |
|
||||||
|
| `downloads` | Removes download restrictions and changes the default path to download to. | 27.8.3 |
|
||||||
|
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | 27.8.3 |
|
||||||
|
| `fix-google-login` | Allows logging in with a Google account. | all |
|
||||||
| `hide-ads` | Removes ads from TikTok. | all |
|
| `hide-ads` | Removes ads from TikTok. | all |
|
||||||
| `playback-speed` | Enables the playback speed option for all videos. | all |
|
| `playback-speed` | Enables the playback speed option for all videos. | all |
|
||||||
| `downloads` | Removes download restrictions and changes the default path to download to. | all |
|
| `settings` | Adds ReVanced settings to TikTok. | 27.8.3 |
|
||||||
| `show-seekbar` | Shows progress bar for all video. | all |
|
| `show-seekbar` | Shows progress bar for all video. | all |
|
||||||
| `settings` | Adds settings for ReVanced to TikTok. | all |
|
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | 27.8.3 |
|
||||||
| `fix-google-login` | Allows logging in with a Google account. | all |
|
|
||||||
| `disable-login-requirement` | Do not force login. | all |
|
|
||||||
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | all |
|
|
||||||
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | all |
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `com.zhiliaoapp.musically`
|
### [📦 `com.zhiliaoapp.musically`](https://play.google.com/store/apps/details?id=com.zhiliaoapp.musically)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `disable-login-requirement` | Do not force login. | all |
|
||||||
|
| `downloads` | Removes download restrictions and changes the default path to download to. | 27.8.3 |
|
||||||
|
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | 27.8.3 |
|
||||||
|
| `fix-google-login` | Allows logging in with a Google account. | all |
|
||||||
| `hide-ads` | Removes ads from TikTok. | all |
|
| `hide-ads` | Removes ads from TikTok. | all |
|
||||||
| `playback-speed` | Enables the playback speed option for all videos. | all |
|
| `playback-speed` | Enables the playback speed option for all videos. | all |
|
||||||
| `downloads` | Removes download restrictions and changes the default path to download to. | all |
|
| `settings` | Adds ReVanced settings to TikTok. | 27.8.3 |
|
||||||
| `show-seekbar` | Shows progress bar for all video. | all |
|
| `show-seekbar` | Shows progress bar for all video. | all |
|
||||||
| `settings` | Adds settings for ReVanced to TikTok. | all |
|
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | 27.8.3 |
|
||||||
| `fix-google-login` | Allows logging in with a Google account. | all |
|
|
||||||
| `disable-login-requirement` | Do not force login. | all |
|
|
||||||
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | all |
|
|
||||||
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | all |
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `com.twitter.android`
|
### [📦 `tv.twitch.android.app`](https://play.google.com/store/apps/details?id=tv.twitch.android.app)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `block-audio-ads` | Blocks audio ads in streams and VODs. | all |
|
||||||
|
| `block-embedded-ads` | Blocks embedded steam ads using services like TTV.lol or PurpleAdBlocker. | all |
|
||||||
|
| `block-video-ads` | Blocks video ads in streams and VODs. | all |
|
||||||
|
| `debug-mode` | Enables Twitch's internal debugging mode. | all |
|
||||||
|
| `settings` | Adds settings menu to Twitch. | all |
|
||||||
|
| `show-deleted-messages` | Shows deleted chat messages behind a clickable spoiler. | all |
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### [📦 `com.twitter.android`](https://play.google.com/store/apps/details?id=com.twitter.android)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `timeline-ads` | Removes ads from the Twitter timeline. | all |
|
|
||||||
| `dynamic-color` | Replaces the default Twitter Blue with the users Material You palette. | all |
|
| `dynamic-color` | Replaces the default Twitter Blue with the users Material You palette. | all |
|
||||||
|
| `hide-views-stats` | Hides the view stats under tweets. | 9.69.1-release.0 |
|
||||||
| `monochrome-icon` | Adds a monochrome icon. | all |
|
| `monochrome-icon` | Adds a monochrome icon. | all |
|
||||||
|
| `timeline-ads` | Removes ads from the Twitter timeline. Might require clearing app data to remove already cached ads. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `de.dwd.warnapp`
|
### [📦 `com.spotify.music`](https://play.google.com/store/apps/details?id=com.spotify.music)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `promo-code-unlock` | Disables the validation of promo code. Any code will work to unlock all features. | all |
|
| `disable-capture-restriction` | Allows capturing Spotify's audio output while screen sharing or screen recording. | all |
|
||||||
|
| `hide-premium-navbar` | Removes the premium tab from the navbar. | all |
|
||||||
|
| `spotify-theme` | Applies a custom theme. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `com.myprog.hexedit`
|
### [📦 `com.reddit.frontpage`](https://play.google.com/store/apps/details?id=com.reddit.frontpage)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `general-reddit-ads` | Removes general ads from the Reddit frontpage and subreddits. | 2022.43.0 |
|
||||||
|
| `premium-icon-reddit` | Unlocks premium Reddit app icons. | all |
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### [📦 `at.gv.bmf.bmf2go`](https://play.google.com/store/apps/details?id=at.gv.bmf.bmf2go)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `remove-bootloader-detection` | Removes the check for an unlocked bootloader. | 2.2.0 |
|
||||||
|
| `remove-root-detection` | Removes the check for root permissions | 2.2.0 |
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### [📦 `at.gv.oe.app`](https://play.google.com/store/apps/details?id=at.gv.oe.app)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `remove-root-detection` | Removes the check for root permissions and unlocked bootloader. | 2.5.2 |
|
||||||
|
| `spoof-signature` | Spoofs the signature of the app. | 2.5.2 |
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### [📦 `com.vanced.android.youtube`](https://play.google.com/store/apps/details?id=com.vanced.android.youtube)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### [📦 `com.myprog.hexedit`](https://play.google.com/store/apps/details?id=com.myprog.hexedit)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
@@ -78,95 +189,71 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `disable-ads` | Disables ads in HexEditor. | all |
|
| `disable-ads` | Disables ads in HexEditor. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `com.spotify.music`
|
### [📦 `org.citra.citra_emu`](https://play.google.com/store/apps/details?id=org.citra.citra_emu)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `spotify-theme` | Applies a custom theme. | all |
|
| `premium-unlock` | Unlocks premium functions. | all |
|
||||||
| `disable-capture-restriction` | Allows capturing Spotify's audio output while screen sharing or screen recording. | all |
|
|
||||||
| `hide-premium-navbar` | Removes the premium tab from the navbar. | all |
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `com.google.android.youtube`
|
### [📦 `org.citra.citra_emu.canary`](https://play.google.com/store/apps/details?id=org.citra.citra_emu.canary)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `hide-crowdfunding-box` | Hides the crowdfunding box between the player and video description. | 17.45.36 |
|
| `premium-unlock` | Unlocks premium functions. | all |
|
||||||
| `hide-time-and-seekbar` | Hides progress bar and time counter on videos. | 17.45.36 |
|
|
||||||
| `hide-video-buttons` | Adds options to hide action buttons under a video. | 17.45.36 |
|
|
||||||
| `enable-wide-searchbar` | Replaces the search icon with a wide search bar. This will hide the YouTube logo when active. | 17.45.36 |
|
|
||||||
| `hide-captions-button` | Hides the captions button on video player. | 17.45.36 |
|
|
||||||
| `hide-shorts-button` | Hides the shorts button on the navigation bar. | 17.45.36 |
|
|
||||||
| `hide-create-button` | Hides the create button in the navigation bar. | 17.45.36 |
|
|
||||||
| `disable-startup-shorts-player` | Disables playing YouTube Shorts when launching YouTube. | 17.45.36 |
|
|
||||||
| `remove-player-button-background` | Removes the background from the video player buttons. | 17.45.36 |
|
|
||||||
| `hide-endscreen-cards` | Hides the suggested video cards at the end of a video in fullscreen. | 17.45.36 |
|
|
||||||
| `hide-cast-button` | Hides the cast button in the video player. | all |
|
|
||||||
| `sponsorblock` | Integrate SponsorBlock. | 17.45.36 |
|
|
||||||
| `hide-autoplay-button` | Hides the autoplay button in the video player. | 17.45.36 |
|
|
||||||
| `hide-watch-in-vr` | Hides the Watch in VR option from the player settings flyout panel. | 17.45.36 |
|
|
||||||
| `hide-album-cards` | Hides the album cards below the artist description. | 17.45.36 |
|
|
||||||
| `disable-auto-player-popup-panels` | Disable automatic popup panels (playlist or live chat) on video player. | 17.45.36 |
|
|
||||||
| `disable-auto-captions` | Disable forced captions from being automatically enabled. | 17.45.36 |
|
|
||||||
| `disable-fullscreen-panels` | Disables video description and comments panel in fullscreen view. | 17.45.36 |
|
|
||||||
| `hide-artist-card` | Hides the artist card below the searchbar. | 17.45.36 |
|
|
||||||
| `return-youtube-dislike` | Shows the dislike count of videos using the Return YouTube Dislike API. | 17.45.36 |
|
|
||||||
| `comments` | Hides components related to comments. | 17.45.36 |
|
|
||||||
| `theme` | Applies a custom theme. | all |
|
|
||||||
| `hide-email-address` | Hides the email address in the account switcher. | 17.45.36 |
|
|
||||||
| `tablet-mini-player` | Enables the tablet mini player layout. | 17.45.36 |
|
|
||||||
| `hide-watermark` | Hides creator's watermarks on videos. | 17.45.36 |
|
|
||||||
| `hide-info-cards` | Hides info-cards in videos. | 17.45.36 |
|
|
||||||
| `hide-my-mix` | Hides mix playlists. | 17.45.36 |
|
|
||||||
| `custom-branding` | Changes the YouTube launcher icon and name to your choice (defaults to ReVanced). | all |
|
|
||||||
| `premium-heading` | Shows premium branding on the home screen. | all |
|
|
||||||
| `old-quality-layout` | Enables the original quality flyout menu. | 17.45.36 |
|
|
||||||
| `general-ads` | Removes general ads. | 17.45.36 |
|
|
||||||
| `video-ads` | Removes ads in the video player. | 17.45.36 |
|
|
||||||
| `swipe-controls` | Adds volume and brightness swipe controls. | 17.45.36 |
|
|
||||||
| `downloads` | Enables downloading music and videos from YouTube. | 17.45.36 |
|
|
||||||
| `seekbar-tapping` | Enables tap-to-seek on the seekbar of the video player. | 17.45.36 |
|
|
||||||
| `disable-zoom-haptics` | Disables haptics when zooming. | all |
|
|
||||||
| `settings` | Adds settings for ReVanced to YouTube. | all |
|
|
||||||
| `open-links-directly` | Bypasses redirect links and allows opening links directly. | 17.45.36 |
|
|
||||||
| `microg-support` | Allows YouTube ReVanced to run without root and under a different package name with Vanced MicroG. | 17.45.36 |
|
|
||||||
| `custom-video-buffer` | Lets you change the buffers of videos. | 17.45.36 |
|
|
||||||
| `debugging` | Adds debugging options. | all |
|
|
||||||
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
|
|
||||||
| `always-autorepeat` | Always repeats the playing video again. | 17.45.36 |
|
|
||||||
| `minimized-playback` | Enables minimized and background playback. | 17.45.36 |
|
|
||||||
| `custom-video-speed` | Adds more video speed options. | 17.45.36 |
|
|
||||||
| `remember-video-quality` | Adds the ability to remember the video quality you chose in the video quality flyout. | 17.45.36 |
|
|
||||||
| `hdr-auto-brightness` | Makes the brightness of HDR videos follow the system default. | 17.45.36 |
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `com.vanced.android.youtube`
|
### [📦 `com.backdrops.wallpapers`](https://play.google.com/store/apps/details?id=com.backdrops.wallpapers)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
|
| `pro-unlock` | Unlocks pro-only functions. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `com.ticktick.task`
|
### [📦 `de.dwd.warnapp`](https://play.google.com/store/apps/details?id=de.dwd.warnapp)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `unlock-themes` | Unlocks all themes. | all |
|
| `promo-code-unlock` | Disables the validation of promo code. Any code will work to unlock all features. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `com.crunchyroll.crunchyroid`
|
### [📦 `com.teslacoilsw.launcher`](https://play.google.com/store/apps/details?id=com.teslacoilsw.launcher)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `enable-downloads` | Enables downloads for Crunchyroll. | all |
|
| `unlock-prime` | Unlocks Nova Prime and all functions of the app. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `org.totschnig.myexpenses`
|
### [📦 `co.windyapp.android`](https://play.google.com/store/apps/details?id=co.windyapp.android)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `unlock-pro` | Unlocks all pro features. | all |
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### [📦 `com.awedea.nyx`](https://play.google.com/store/apps/details?id=com.awedea.nyx)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `unlock-pro` | Unlocks all pro features. | all |
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### [📦 `ginlemon.iconpackstudio`](https://play.google.com/store/apps/details?id=ginlemon.iconpackstudio)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `unlock-pro` | Unlocks all pro features. | all |
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### [📦 `org.totschnig.myexpenses`](https://play.google.com/store/apps/details?id=org.totschnig.myexpenses)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
@@ -174,75 +261,28 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `unlock-pro` | Unlocks all professional features. | all |
|
| `unlock-pro` | Unlocks all professional features. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `tv.twitch.android.app`
|
### [📦 `com.ithebk.expensemanager`](https://play.google.com/store/apps/details?id=com.ithebk.expensemanager)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `debug-mode` | Enables Twitch's internal debugging mode. | all |
|
| `unlock-pro` | Unlocks pro features. | all |
|
||||||
| `block-embedded-ads` | Blocks embedded steam ads using services like TTV.lol or PurpleAdBlocker. | all |
|
|
||||||
| `block-audio-ads` | Blocks audio ads in streams and VODs. | all |
|
|
||||||
| `block-video-ads` | Blocks video ads in streams and VODs. | all |
|
|
||||||
| `settings` | Adds settings menu to Twitch. | all |
|
|
||||||
| `show-deleted-messages` | Shows deleted chat messages behind a clickable spoiler. | all |
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `co.windyapp.android`
|
### [📦 `com.ticktick.task`](https://play.google.com/store/apps/details?id=com.ticktick.task)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `unlock-pro` | Unlocks all pro features. | all |
|
| `unlock-themes` | Unlocks all themes. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 📦 `com.garzotto.pflotsh.ecmwf_a`
|
### [📦 `net.dinglisch.android.taskerm`](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `pflotsh-ecmwf-subscription-unlock` | Unlocks all subscription features. | 3.5.4 |
|
| `unlock-trial` | Unlocks the trial version. | all |
|
||||||
</details>
|
|
||||||
|
|
||||||
### 📦 `com.google.android.apps.youtube.music`
|
|
||||||
<details>
|
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|
||||||
| `tasteBuilder-remover` | Removes the "Tell us which artists you like" card from the home screen. | 5.31.50 |
|
|
||||||
| `hide-get-premium` | Removes all "Get Premium" evidences from the avatar menu. | 5.31.50 |
|
|
||||||
| `minimized-playback-music` | Enables minimized playback on Kids music. | 5.31.50 |
|
|
||||||
| `compact-header` | Hides the music category bar at the top of the homepage. | 5.31.50 |
|
|
||||||
| `upgrade-button-remover` | Removes the upgrade tab from the pivot bar. | 5.31.50 |
|
|
||||||
| `music-video-ads` | Removes ads in the music player. | 5.31.50 |
|
|
||||||
| `background-play` | Enables playing music in the background. | 5.31.50 |
|
|
||||||
| `exclusive-audio-playback` | Enables the option to play music without video. | 5.31.50 |
|
|
||||||
| `codecs-unlock` | Adds more audio codec options. The new audio codecs usually result in better audio quality. | 5.31.50 |
|
|
||||||
| `music-microg-support` | Allows YouTube Music ReVanced to run without root and under a different package name. | 5.31.50 |
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### 📦 `com.reddit.frontpage`
|
|
||||||
<details>
|
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|
||||||
| `premium-icon-reddit` | Unlocks premium Reddit app icons. | all |
|
|
||||||
| `general-reddit-ads` | Removes general ads from the Reddit frontpage and subreddits. | all |
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### 📦 `com.awedea.nyx`
|
|
||||||
<details>
|
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|
||||||
| `unlock-pro` | Unlocks all pro features. | all |
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### 📦 `com.backdrops.wallpapers`
|
|
||||||
<details>
|
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|
||||||
| `pro-unlock` | Unlocks pro-only functions. | all |
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -20,10 +20,10 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation("app.revanced:revanced-patcher:6.1.0")
|
implementation("app.revanced:revanced-patcher:6.4.2")
|
||||||
implementation("app.revanced:multidexlib2:2.5.2.r2")
|
implementation("app.revanced:multidexlib2:2.5.3-a3836654")
|
||||||
// Required for meta
|
// Required for meta
|
||||||
implementation("com.google.code.gson:gson:2.10")
|
implementation("com.google.code.gson:gson:2.10.1")
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks {
|
tasks {
|
||||||
@@ -33,7 +33,7 @@ tasks {
|
|||||||
|
|
||||||
doLast {
|
doLast {
|
||||||
val androidHome = System.getenv("ANDROID_HOME") ?: throw GradleException("ANDROID_HOME not found")
|
val androidHome = System.getenv("ANDROID_HOME") ?: throw GradleException("ANDROID_HOME not found")
|
||||||
val d8 = "${androidHome}/build-tools/32.0.0/d8"
|
val d8 = "${androidHome}/build-tools/33.0.1/d8"
|
||||||
val input = configurations.archives.get().allArtifacts.files.files.first().absolutePath
|
val input = configurations.archives.get().allArtifacts.files.files.first().absolutePath
|
||||||
val work = File("${buildDir}/libs")
|
val work = File("${buildDir}/libs")
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ tasks {
|
|||||||
dependsOn(build)
|
dependsOn(build)
|
||||||
|
|
||||||
classpath = sourceSets["main"].runtimeClasspath
|
classpath = sourceSets["main"].runtimeClasspath
|
||||||
mainClass.set("app.revanced.meta.Meta")
|
mainClass.set("app.revanced.meta.PatchesFileGenerator")
|
||||||
}
|
}
|
||||||
// Dummy task to fix the Gradle semantic-release plugin.
|
// Dummy task to fix the Gradle semantic-release plugin.
|
||||||
// Remove this if you forked it to support building only.
|
// Remove this if you forked it to support building only.
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 2.131.0
|
version = 2.157.0-dev.2
|
||||||
|
|||||||
6107
package-lock.json
generated
Normal file
6107
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
8
package.json
Normal file
8
package.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"devDependencies": {
|
||||||
|
"@semantic-release/changelog": "^6.0.2",
|
||||||
|
"@semantic-release/git": "^10.0.1",
|
||||||
|
"gradle-semantic-release-plugin": "^1.7.4",
|
||||||
|
"semantic-release": "^19.0.5"
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,6 +1,5 @@
|
|||||||
package app.revanced.extensions
|
package app.revanced.extensions
|
||||||
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
|
||||||
import app.revanced.patcher.extensions.MethodFingerprintExtensions.name
|
import app.revanced.patcher.extensions.MethodFingerprintExtensions.name
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import app.revanced.patcher.patch.PatchResultError
|
import app.revanced.patcher.patch.PatchResultError
|
||||||
@@ -28,19 +27,6 @@ fun MutableClass.findMutableMethodOf(method: Method) = this.methods.first {
|
|||||||
MethodUtil.methodSignaturesMatch(it, method)
|
MethodUtil.methodSignaturesMatch(it, method)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* traverse the class hierarchy starting from the given root class
|
|
||||||
*
|
|
||||||
* @param targetClass the class to start traversing the class hierarchy from
|
|
||||||
* @param callback function that is called for every class in the hierarchy
|
|
||||||
*/
|
|
||||||
fun BytecodeContext.traverseClassHierarchy(targetClass: MutableClass, callback: MutableClass.() -> Unit) {
|
|
||||||
callback(targetClass)
|
|
||||||
this.findClass(targetClass.superclass ?: return)?.mutableClass?.let {
|
|
||||||
traverseClassHierarchy(it, callback)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* apply a transform to all methods of the class
|
* apply a transform to all methods of the class
|
||||||
*
|
*
|
||||||
|
|||||||
70
src/main/kotlin/app/revanced/meta/JsonGenerator.kt
Normal file
70
src/main/kotlin/app/revanced/meta/JsonGenerator.kt
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
package app.revanced.meta
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages
|
||||||
|
import app.revanced.patcher.extensions.PatchExtensions.dependencies
|
||||||
|
import app.revanced.patcher.extensions.PatchExtensions.description
|
||||||
|
import app.revanced.patcher.extensions.PatchExtensions.include
|
||||||
|
import app.revanced.patcher.extensions.PatchExtensions.options
|
||||||
|
import app.revanced.patcher.extensions.PatchExtensions.patchName
|
||||||
|
import app.revanced.patcher.extensions.PatchExtensions.version
|
||||||
|
import app.revanced.patcher.patch.PatchOption
|
||||||
|
import com.google.gson.GsonBuilder
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
internal class JsonGenerator : PatchesFileGenerator {
|
||||||
|
override fun generate(bundle: PatchBundlePatches) {
|
||||||
|
val patches = bundle.map {
|
||||||
|
JsonPatch(
|
||||||
|
it.patchName,
|
||||||
|
it.description ?: "This patch has no description.",
|
||||||
|
it.version ?: "0.0.0",
|
||||||
|
!it.include,
|
||||||
|
it.options?.map { option ->
|
||||||
|
JsonPatch.Option(
|
||||||
|
option.key,
|
||||||
|
option.title,
|
||||||
|
option.description,
|
||||||
|
option.required,
|
||||||
|
option.let { listOption ->
|
||||||
|
if (listOption is PatchOption.ListOption<*>) {
|
||||||
|
listOption.options.toMutableList().toTypedArray()
|
||||||
|
} else null
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}?.toTypedArray() ?: emptyArray(),
|
||||||
|
it.dependencies?.map { dep ->
|
||||||
|
dep.java.patchName
|
||||||
|
}?.toTypedArray() ?: emptyArray(),
|
||||||
|
it.compatiblePackages?.map { pkg ->
|
||||||
|
JsonPatch.CompatiblePackage(pkg.name, pkg.versions)
|
||||||
|
}?.toTypedArray() ?: emptyArray()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val json = File("patches.json")
|
||||||
|
json.writeText(GsonBuilder().serializeNulls().create().toJson(patches))
|
||||||
|
}
|
||||||
|
|
||||||
|
private class JsonPatch(
|
||||||
|
val name: String,
|
||||||
|
val description: String,
|
||||||
|
val version: String,
|
||||||
|
val excluded: Boolean,
|
||||||
|
val options: Array<Option>,
|
||||||
|
val dependencies: Array<String>,
|
||||||
|
val compatiblePackages: Array<CompatiblePackage>,
|
||||||
|
) {
|
||||||
|
class CompatiblePackage(
|
||||||
|
val name: String,
|
||||||
|
val versions: Array<String>,
|
||||||
|
)
|
||||||
|
|
||||||
|
class Option(
|
||||||
|
val key: String,
|
||||||
|
val title: String,
|
||||||
|
val description: String,
|
||||||
|
val required: Boolean,
|
||||||
|
val choices: Array<*>?,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
package app.revanced.meta
|
|
||||||
|
|
||||||
import app.revanced.meta.json.generateJson
|
|
||||||
import app.revanced.meta.readme.generateText
|
|
||||||
import app.revanced.patcher.data.Context
|
|
||||||
import app.revanced.patcher.patch.Patch
|
|
||||||
import app.revanced.patcher.util.patch.PatchBundle
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
typealias Bundle = List<Class<out Patch<Context>>>
|
|
||||||
|
|
||||||
object Meta {
|
|
||||||
@JvmStatic
|
|
||||||
fun main(args: Array<String>) {
|
|
||||||
val patches = accumulatePatches()
|
|
||||||
if (patches.isEmpty()) throw IllegalStateException("No patches found")
|
|
||||||
|
|
||||||
generateText(patches)
|
|
||||||
generateJson(patches)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun accumulatePatches() = PatchBundle.Jar(
|
|
||||||
File("build/libs/").listFiles()!!.first {
|
|
||||||
it.name.startsWith("revanced-patches-") && it.name.endsWith(".jar")
|
|
||||||
}.absolutePath
|
|
||||||
).loadPatches()
|
|
||||||
25
src/main/kotlin/app/revanced/meta/PatchesFileGenerator.kt
Normal file
25
src/main/kotlin/app/revanced/meta/PatchesFileGenerator.kt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package app.revanced.meta
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.Context
|
||||||
|
import app.revanced.patcher.patch.Patch
|
||||||
|
import app.revanced.patcher.util.patch.PatchBundle
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
typealias PatchBundlePatches = List<Class<out Patch<Context>>>
|
||||||
|
|
||||||
|
internal interface PatchesFileGenerator {
|
||||||
|
fun generate(bundle: PatchBundlePatches)
|
||||||
|
|
||||||
|
private companion object {
|
||||||
|
@JvmStatic
|
||||||
|
fun main(args: Array<String>) = PatchBundle.Jar(
|
||||||
|
File("build/libs/").listFiles()!!.first {
|
||||||
|
it.name.startsWith("revanced-patches-") && it.name.endsWith(".jar")
|
||||||
|
}.absolutePath
|
||||||
|
).loadPatches().also {
|
||||||
|
if (it.isEmpty()) throw IllegalStateException("No patches found")
|
||||||
|
}.let { bundle ->
|
||||||
|
arrayOf(JsonGenerator(), ReadmeGenerator()).forEach { it.generate(bundle) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
69
src/main/kotlin/app/revanced/meta/ReadmeGenerator.kt
Normal file
69
src/main/kotlin/app/revanced/meta/ReadmeGenerator.kt
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
package app.revanced.meta
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.Context
|
||||||
|
import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages
|
||||||
|
import app.revanced.patcher.extensions.PatchExtensions.description
|
||||||
|
import app.revanced.patcher.extensions.PatchExtensions.patchName
|
||||||
|
import app.revanced.patcher.patch.Patch
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
internal class ReadmeGenerator : PatchesFileGenerator {
|
||||||
|
private companion object {
|
||||||
|
private const val TABLE_HEADER =
|
||||||
|
"| \uD83D\uDC8A Patch | \uD83D\uDCDC Description | \uD83C\uDFF9 Target Version |\n" +
|
||||||
|
"|:--------:|:--------------:|:-----------------:|"
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun generate(bundle: PatchBundlePatches) {
|
||||||
|
val output = StringBuilder()
|
||||||
|
|
||||||
|
mutableMapOf<String, MutableList<Class<out Patch<Context>>>>()
|
||||||
|
.apply {
|
||||||
|
for (patch in bundle) {
|
||||||
|
patch.compatiblePackages?.forEach { pkg ->
|
||||||
|
if (!contains(pkg.name)) put(pkg.name, mutableListOf())
|
||||||
|
this[pkg.name]!!.add(patch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.entries
|
||||||
|
.sortedByDescending { it.value.size }
|
||||||
|
.forEach { (`package`, patches) ->
|
||||||
|
val mostCommonVersion = buildMap {
|
||||||
|
patches.forEach { patch ->
|
||||||
|
patch.compatiblePackages?.single { compatiblePackage -> compatiblePackage.name == `package` }?.versions?.let {
|
||||||
|
it.forEach { version -> merge(version, 1, Integer::sum) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.let { commonMap ->
|
||||||
|
commonMap.maxByOrNull { it.value }?.value?.let {
|
||||||
|
// This is not foolproof, because for example v1.0.0-dev.0 will be returned instead of v1.0.0-release.
|
||||||
|
// Unfortunately this can not be solved easily because versioning can be complex.
|
||||||
|
commonMap.entries.filter { mostCommon -> mostCommon.value == it }.maxBy { it.key }.key
|
||||||
|
} ?: "all"
|
||||||
|
}
|
||||||
|
|
||||||
|
output.apply {
|
||||||
|
appendLine("### [\uD83D\uDCE6 `${`package`}`](https://play.google.com/store/apps/details?id=${`package`})")
|
||||||
|
appendLine("<details>\n")
|
||||||
|
appendLine(TABLE_HEADER)
|
||||||
|
patches.forEach { patch ->
|
||||||
|
val recommendedPatchVersion = if (
|
||||||
|
patch.compatiblePackages?.single { it.name == `package` }?.versions?.isNotEmpty() == true
|
||||||
|
) mostCommonVersion else "all"
|
||||||
|
|
||||||
|
appendLine(
|
||||||
|
"| `${patch.patchName}` " +
|
||||||
|
"| ${patch.description} " +
|
||||||
|
"| $recommendedPatchVersion |"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
appendLine("</details>\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder(File("README-template.md").readText())
|
||||||
|
.replace(Regex("\\{\\{\\s?table\\s?}}"), output.toString())
|
||||||
|
.let(File("README.md")::writeText)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
package app.revanced.meta.json
|
|
||||||
|
|
||||||
import app.revanced.meta.Bundle
|
|
||||||
import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages
|
|
||||||
import app.revanced.patcher.extensions.PatchExtensions.dependencies
|
|
||||||
import app.revanced.patcher.extensions.PatchExtensions.description
|
|
||||||
import app.revanced.patcher.extensions.PatchExtensions.include
|
|
||||||
import app.revanced.patcher.extensions.PatchExtensions.options
|
|
||||||
import app.revanced.patcher.extensions.PatchExtensions.patchName
|
|
||||||
import app.revanced.patcher.extensions.PatchExtensions.version
|
|
||||||
import app.revanced.patcher.patch.PatchOption
|
|
||||||
import com.google.gson.GsonBuilder
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
private val gson = GsonBuilder().serializeNulls().create()
|
|
||||||
|
|
||||||
fun generateJson(bundle: Bundle) {
|
|
||||||
val patches = bundle.map {
|
|
||||||
JsonPatch(
|
|
||||||
it.patchName,
|
|
||||||
it.description ?: "This patch has no description.",
|
|
||||||
it.version ?: "0.0.0",
|
|
||||||
!it.include,
|
|
||||||
it.options?.map { option ->
|
|
||||||
Option(
|
|
||||||
option.key,
|
|
||||||
option.title,
|
|
||||||
option.description,
|
|
||||||
option.required,
|
|
||||||
option.let { lo ->
|
|
||||||
if (lo is PatchOption.ListOption<*>) {
|
|
||||||
lo.options.toMutableList().toTypedArray()
|
|
||||||
} else null
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}?.toTypedArray() ?: emptyArray(),
|
|
||||||
it.dependencies?.map { dep ->
|
|
||||||
dep.java.patchName
|
|
||||||
}?.toTypedArray() ?: emptyArray(),
|
|
||||||
it.compatiblePackages?.map { pkg ->
|
|
||||||
CompatiblePackage(pkg.name, pkg.versions)
|
|
||||||
}?.toTypedArray() ?: emptyArray()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
val json = File("patches.json")
|
|
||||||
json.writeText(gson.toJson(patches))
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
@file:Suppress("ArrayInDataClass") // We don't need it here.
|
|
||||||
|
|
||||||
package app.revanced.meta.json
|
|
||||||
|
|
||||||
data class JsonPatch(
|
|
||||||
val name: String,
|
|
||||||
val description: String,
|
|
||||||
val version: String,
|
|
||||||
val excluded: Boolean,
|
|
||||||
val options: Array<Option>,
|
|
||||||
val dependencies: Array<String>,
|
|
||||||
val compatiblePackages: Array<CompatiblePackage>,
|
|
||||||
)
|
|
||||||
|
|
||||||
data class CompatiblePackage(
|
|
||||||
val name: String,
|
|
||||||
val versions: Array<String>,
|
|
||||||
)
|
|
||||||
|
|
||||||
data class Option(
|
|
||||||
val key: String,
|
|
||||||
val title: String,
|
|
||||||
val description: String,
|
|
||||||
val required: Boolean,
|
|
||||||
val choices: Array<*>?,
|
|
||||||
)
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
package app.revanced.meta.readme
|
|
||||||
|
|
||||||
import app.revanced.patcher.data.Context
|
|
||||||
import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages
|
|
||||||
import app.revanced.patcher.patch.Patch
|
|
||||||
|
|
||||||
internal fun Class<out Patch<Context>>.getLatestVersion() =
|
|
||||||
this.compatiblePackages?.first()?.versions?.map {
|
|
||||||
SemanticVersion.fromString(it)
|
|
||||||
}?.maxWithOrNull(SemanticVersionComparator)
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
package app.revanced.meta.readme
|
|
||||||
|
|
||||||
import app.revanced.meta.Bundle
|
|
||||||
import app.revanced.patcher.data.Context
|
|
||||||
import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages
|
|
||||||
import app.revanced.patcher.extensions.PatchExtensions.description
|
|
||||||
import app.revanced.patcher.extensions.PatchExtensions.patchName
|
|
||||||
import app.revanced.patcher.patch.Patch
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
private const val TABLE_HEADER =
|
|
||||||
"| \uD83D\uDC8A Patch | \uD83D\uDCDC Description | \uD83C\uDFF9 Target Version |\n" + "|:--------:|:--------------:|:-----------------:|"
|
|
||||||
|
|
||||||
private val TABLE_REGEX = Regex("\\{\\{\\s?table\\s?}}")
|
|
||||||
|
|
||||||
fun generateText(bundle: Bundle) {
|
|
||||||
val output = StringBuilder()
|
|
||||||
val packages = mutableMapOf<String, MutableList<Class<out Patch<Context>>>>()
|
|
||||||
|
|
||||||
for (patch in bundle) {
|
|
||||||
patch.compatiblePackages?.forEach { pkg ->
|
|
||||||
if (!packages.contains(pkg.name)) packages[pkg.name] = mutableListOf()
|
|
||||||
packages[pkg.name]!!.add(patch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (pkg in packages) {
|
|
||||||
output.appendLine("### \uD83D\uDCE6 `${pkg.key}`")
|
|
||||||
output.appendLine("<details>\n")
|
|
||||||
|
|
||||||
output.appendLine(TABLE_HEADER)
|
|
||||||
pkg.value.forEach { output.appendLine("| `${it.patchName}` | ${it.description} | ${it.getLatestVersion() ?: "all"} |") }
|
|
||||||
|
|
||||||
output.appendLine("</details>\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
val readmeTemplate = Template(File("README-template.md").readText())
|
|
||||||
readmeTemplate.replaceVariable(TABLE_REGEX, output.toString())
|
|
||||||
|
|
||||||
val readme = File("README.md")
|
|
||||||
readme.writeText(readmeTemplate.toString())
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
package app.revanced.meta.readme
|
|
||||||
|
|
||||||
data class SemanticVersion(val major: Int, val minor: Int, val patch: Int) {
|
|
||||||
companion object {
|
|
||||||
fun fromString(version: String): SemanticVersion {
|
|
||||||
val parts = version.split(".")
|
|
||||||
if (parts.count() != 3) throw IllegalArgumentException("Invalid semantic version")
|
|
||||||
val versionNumbers = parts.map { it.toInt() }
|
|
||||||
return SemanticVersion(versionNumbers[0], versionNumbers[1], versionNumbers[2])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun toString(): String = "$major.$minor.$patch"
|
|
||||||
}
|
|
||||||
|
|
||||||
object SemanticVersionComparator : Comparator<SemanticVersion> {
|
|
||||||
override fun compare(a: SemanticVersion, b: SemanticVersion): Int = when {
|
|
||||||
a.major != b.major -> a.major - b.major
|
|
||||||
a.minor != b.minor -> a.minor - b.minor
|
|
||||||
else -> a.patch - b.patch
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
package app.revanced.meta.readme
|
|
||||||
|
|
||||||
class Template(template: String) {
|
|
||||||
val result = StringBuilder(template)
|
|
||||||
|
|
||||||
fun replaceVariable(regex: Regex, value: String) {
|
|
||||||
val range = regex.find(result)!!.range
|
|
||||||
result.replace(range.first, range.last + 1, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun toString(): String = result.toString()
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package app.revanced.patches.all.interaction.gestures.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.ResourceContext
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
|
||||||
|
@Patch(false)
|
||||||
|
@Name("predictive-back-gesture")
|
||||||
|
@Description("Enables the predictive back gesture introduced on Android 13.")
|
||||||
|
@Version("0.0.1")
|
||||||
|
class PredictiveBackGesturePatch : ResourcePatch {
|
||||||
|
override fun execute(context: ResourceContext): PatchResult {
|
||||||
|
context.xmlEditor["AndroidManifest.xml"].use { editor ->
|
||||||
|
val document = editor.file
|
||||||
|
|
||||||
|
with(document.getElementsByTagName("application").item(0)) {
|
||||||
|
if (attributes.getNamedItem(FLAG) != null) return@with
|
||||||
|
|
||||||
|
document.createAttribute(FLAG)
|
||||||
|
.apply { value = "true" }
|
||||||
|
.let(attributes::setNamedItem)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
|
||||||
|
private companion object {
|
||||||
|
const val FLAG = "android:enableOnBackInvokedCallback"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
package app.revanced.patches.all.screenshot.removerestriction.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.findMutableMethodOf
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.replaceInstruction
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
||||||
|
import org.jf.dexlib2.iface.reference.MethodReference
|
||||||
|
|
||||||
|
@Patch(false)
|
||||||
|
@Name("remove-screenshot-restriction")
|
||||||
|
@Description("Removes the restriction of making screenshots.")
|
||||||
|
@Version("0.0.1")
|
||||||
|
class RemoveScreenshotRestrictionPatch : BytecodePatch() {
|
||||||
|
|
||||||
|
private companion object {
|
||||||
|
const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/all/screenshot/removerestriction/RemoveScreenshotRestrictionPatch;"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Information about method calls we want to replace
|
||||||
|
private enum class MethodCall(
|
||||||
|
val definedClassName: String,
|
||||||
|
val methodName: String,
|
||||||
|
val replacementMethodDefinition: String
|
||||||
|
) {
|
||||||
|
SetFlags(
|
||||||
|
"Landroid/view/Window;",
|
||||||
|
"setFlags",
|
||||||
|
"setFlags(Landroid/view/Window;II)V",
|
||||||
|
);
|
||||||
|
|
||||||
|
fun replaceInstruction(method: MutableMethod, instruction: Instruction35c, instructionIndex: Int) {
|
||||||
|
when (this) {
|
||||||
|
SetFlags -> {
|
||||||
|
method.replaceInstruction(
|
||||||
|
instructionIndex,
|
||||||
|
"invoke-static { v${instruction.registerC}, v${instruction.registerD}, v${instruction.registerE} }, ${INTEGRATIONS_CLASS_DESCRIPTOR}->${replacementMethodDefinition}"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun fromMethodReference(methodReference: MethodReference) = values().firstOrNull { search ->
|
||||||
|
search.definedClassName == methodReference.definingClass && search.methodName == methodReference.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
// Find all instructions where one of the methods is called
|
||||||
|
buildMap {
|
||||||
|
context.classes.forEach { classDef ->
|
||||||
|
if (classDef.type == INTEGRATIONS_CLASS_DESCRIPTOR) {
|
||||||
|
// avoid infinite recursion
|
||||||
|
return@forEach
|
||||||
|
}
|
||||||
|
|
||||||
|
classDef.methods.let { methods ->
|
||||||
|
buildMap methodList@{
|
||||||
|
methods.forEach methods@{ method ->
|
||||||
|
with(method.implementation?.instructions ?: return@methods) {
|
||||||
|
ArrayDeque<Triple<MethodCall, Instruction35c, Int>>().also { patchIndices ->
|
||||||
|
this.forEachIndexed { index, instruction ->
|
||||||
|
if (instruction.opcode != Opcode.INVOKE_VIRTUAL) return@forEachIndexed
|
||||||
|
|
||||||
|
val invokeInstruction = instruction as Instruction35c
|
||||||
|
val methodRef = invokeInstruction.reference as MethodReference
|
||||||
|
val methodCall = MethodCall.fromMethodReference(methodRef) ?: return@forEachIndexed
|
||||||
|
|
||||||
|
patchIndices.add(Triple(methodCall, invokeInstruction, index))
|
||||||
|
}
|
||||||
|
}.also { if (it.isEmpty()) return@methods }.let { patches ->
|
||||||
|
put(method, patches)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.also { if (it.isEmpty()) return@forEach }.let { methodPatches ->
|
||||||
|
put(classDef, methodPatches)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.forEach { (classDef, methods) ->
|
||||||
|
// And finally replace the instructions...
|
||||||
|
with(context.proxy(classDef).mutableClass) {
|
||||||
|
methods.forEach { (method, patches) ->
|
||||||
|
val mutableMethod = findMutableMethodOf(method)
|
||||||
|
while (!patches.isEmpty()) {
|
||||||
|
val (methodType, instruction, instructionIndex) = patches.removeLast()
|
||||||
|
methodType.replaceInstruction(mutableMethod, instruction, instructionIndex)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,5 +3,5 @@ package app.revanced.patches.citra.misc.premium.annotations
|
|||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("org.citra.citra_emu")])
|
@Compatibility([Package("org.citra.citra_emu"), Package("org.citra.citra_emu.canary")])
|
||||||
internal annotation class PremiumUnlockCompatbility
|
internal annotation class PremiumUnlockCompatbility
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
package app.revanced.patches.crunchyroll.downloads.fingerprints
|
|
||||||
|
|
||||||
import app.revanced.patcher.annotation.Name
|
|
||||||
import app.revanced.patcher.annotation.Version
|
|
||||||
import app.revanced.patcher.extensions.or
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
import app.revanced.patches.crunchyroll.downloads.annotations.DownloadsCompatibility
|
|
||||||
import org.jf.dexlib2.AccessFlags
|
|
||||||
import org.jf.dexlib2.Opcode
|
|
||||||
|
|
||||||
@Name("downloads-fingerprint")
|
|
||||||
@DownloadsCompatibility
|
|
||||||
@Version("0.0.1")
|
|
||||||
object DownloadsFingerprint : MethodFingerprint(
|
|
||||||
"Z", AccessFlags.PUBLIC or AccessFlags.FINAL, null,
|
|
||||||
opcodes = listOf(
|
|
||||||
Opcode.CONST_STRING,
|
|
||||||
Opcode.INVOKE_VIRTUAL,
|
|
||||||
Opcode.MOVE_RESULT,
|
|
||||||
Opcode.RETURN
|
|
||||||
),
|
|
||||||
strings = listOf("offline_viewing"),
|
|
||||||
)
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
package app.revanced.patches.crunchyroll.downloads.patch
|
|
||||||
|
|
||||||
import app.revanced.patcher.annotation.Description
|
|
||||||
import app.revanced.patcher.annotation.Name
|
|
||||||
import app.revanced.patcher.annotation.Version
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
|
||||||
import app.revanced.patcher.extensions.replaceInstruction
|
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
|
||||||
import app.revanced.patcher.patch.PatchResult
|
|
||||||
import app.revanced.patcher.patch.PatchResultSuccess
|
|
||||||
import app.revanced.patcher.patch.annotations.Patch
|
|
||||||
import app.revanced.patches.crunchyroll.downloads.annotations.DownloadsCompatibility
|
|
||||||
import app.revanced.patches.crunchyroll.downloads.fingerprints.DownloadsFingerprint
|
|
||||||
|
|
||||||
@Patch
|
|
||||||
@Name("enable-downloads")
|
|
||||||
@Description("Enables downloads for Crunchyroll.")
|
|
||||||
@DownloadsCompatibility
|
|
||||||
@Version("0.0.1")
|
|
||||||
class DownloadsPatch : BytecodePatch(
|
|
||||||
listOf(
|
|
||||||
DownloadsFingerprint
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
override fun execute(context: BytecodeContext): PatchResult {
|
|
||||||
with(DownloadsFingerprint.result!!.mutableMethod) {
|
|
||||||
val index = implementation!!.instructions.lastIndex
|
|
||||||
replaceInstruction(
|
|
||||||
index - 1,
|
|
||||||
"""
|
|
||||||
const/4 v0, 0x1
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
}
|
|
||||||
return PatchResultSuccess()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package app.revanced.patches.finanzonline.detection.bootloader.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
object BootStateFingerprint : MethodFingerprint(
|
||||||
|
"Z",
|
||||||
|
access = AccessFlags.PUBLIC.value,
|
||||||
|
strings = listOf("Boot state of device: %s"),
|
||||||
|
customFingerprint = { methodDef ->
|
||||||
|
methodDef.definingClass.endsWith("/AttestationHelper;")
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package app.revanced.patches.finanzonline.detection.bootloader.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
object BootloaderDetectionFingerprint : MethodFingerprint(
|
||||||
|
"Z",
|
||||||
|
access = AccessFlags.PUBLIC.value,
|
||||||
|
strings = listOf("Creation of attestation key succeeded", "Creation of attestation key failed"),
|
||||||
|
customFingerprint = { methodDef ->
|
||||||
|
methodDef.definingClass.endsWith("/AttestationHelper;")
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package app.revanced.patches.finanzonline.detection.bootloader.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.toErrorResult
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.addInstruction
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patches.finanzonline.detection.bootloader.fingerprints.BootStateFingerprint
|
||||||
|
import app.revanced.patches.finanzonline.detection.bootloader.fingerprints.BootloaderDetectionFingerprint
|
||||||
|
import app.revanced.patches.finanzonline.detection.shared.annotations.DetectionCompatibility
|
||||||
|
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("remove-bootloader-detection")
|
||||||
|
@Description("Removes the check for an unlocked bootloader.")
|
||||||
|
@DetectionCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class BootloaderDetectionPatch : BytecodePatch(
|
||||||
|
listOf(BootloaderDetectionFingerprint, BootStateFingerprint)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
arrayOf(BootloaderDetectionFingerprint, BootStateFingerprint).forEach { fingerprint ->
|
||||||
|
fingerprint.result?.mutableMethod?.addInstruction(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
const/4 v0, 0x1
|
||||||
|
return v0
|
||||||
|
"""
|
||||||
|
) ?: return fingerprint.toErrorResult()
|
||||||
|
}
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package app.revanced.patches.finanzonline.detection.root.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
|
||||||
|
object RootDetectionFingerprint : MethodFingerprint(
|
||||||
|
"L",
|
||||||
|
customFingerprint = { methodDef ->
|
||||||
|
methodDef.definingClass == "Lat/gv/bmf/bmf2go/tools/utils/z;"
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package app.revanced.patches.finanzonline.detection.root.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.toErrorResult
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.addInstructions
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patches.finanzonline.detection.root.fingerprints.RootDetectionFingerprint
|
||||||
|
import app.revanced.patches.finanzonline.detection.shared.annotations.DetectionCompatibility
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("remove-root-detection")
|
||||||
|
@Description("Removes the check for root permissions")
|
||||||
|
@DetectionCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class RootDetectionPatch : BytecodePatch(
|
||||||
|
listOf(RootDetectionFingerprint)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
RootDetectionFingerprint.result?.mutableMethod?.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
sget-object v0, Ljava/lang/Boolean;->FALSE:Ljava/lang/Boolean;
|
||||||
|
return-object v0
|
||||||
|
"""
|
||||||
|
) ?: return RootDetectionFingerprint.toErrorResult()
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package app.revanced.patches.finanzonline.detection.shared.annotations
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
|
@Compatibility([Package("at.gv.bmf.bmf2go", arrayOf("2.2.0"))])
|
||||||
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
|
internal annotation class DetectionCompatibility
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package app.revanced.patches.idaustria.detection.root.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
object RootDetectionFingerprint : MethodFingerprint(
|
||||||
|
"V",
|
||||||
|
access = AccessFlags.PUBLIC.value,
|
||||||
|
customFingerprint = { methodDef ->
|
||||||
|
methodDef.definingClass.endsWith("/DeviceIntegrityCheck;")
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package app.revanced.patches.idaustria.detection.root.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.*
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.addInstructions
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patches.idaustria.detection.root.fingerprints.RootDetectionFingerprint
|
||||||
|
import app.revanced.patches.idaustria.detection.shared.annotations.DetectionCompatibility
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("remove-root-detection")
|
||||||
|
@Description("Removes the check for root permissions and unlocked bootloader.")
|
||||||
|
@DetectionCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class RootDetectionPatch : BytecodePatch(
|
||||||
|
listOf(RootDetectionFingerprint)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
RootDetectionFingerprint.result!!.mutableMethod.addInstructions(0, "return-void")
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package app.revanced.patches.idaustria.detection.shared.annotations
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
|
@Compatibility([Package("at.gv.oe.app", arrayOf("2.5.2"))])
|
||||||
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
|
internal annotation class DetectionCompatibility
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package app.revanced.patches.idaustria.detection.signature.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
object SpoofSignatureFingerprint : MethodFingerprint(
|
||||||
|
"L",
|
||||||
|
parameters = listOf("L"),
|
||||||
|
access = AccessFlags.PRIVATE.value,
|
||||||
|
customFingerprint = { methodDef ->
|
||||||
|
methodDef.definingClass.endsWith("/SL2Step1Task;") && methodDef.name == "getPubKey"
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package app.revanced.patches.idaustria.detection.signature.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.*
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.addInstructions
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patches.idaustria.detection.shared.annotations.DetectionCompatibility
|
||||||
|
import app.revanced.patches.idaustria.detection.signature.fingerprints.SpoofSignatureFingerprint
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("spoof-signature")
|
||||||
|
@Description("Spoofs the signature of the app.")
|
||||||
|
@DetectionCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class SpoofSignaturePatch : BytecodePatch(
|
||||||
|
listOf(SpoofSignatureFingerprint)
|
||||||
|
) {
|
||||||
|
companion object {
|
||||||
|
const val EXPECTED_SIGNATURE = "OpenSSLRSAPublicKey{modulus=ac3e6fd6050aa7e0d6010ae58190404cd89a56935b44f6fee" +
|
||||||
|
"067c149768320026e10b24799a1339e414605e448e3f264444a327b9ae292be2b62ad567dd1800dbed4a88f718a33dc6db6b" +
|
||||||
|
"f5178aa41aa0efff8a3409f5ca95dbfccd92c7b4298966df806ea7a0204a00f0e745f6d9f13bdf24f3df715d7b62c1600906" +
|
||||||
|
"15de1c8a956b9286764985a3b3c060963c435fb9481a5543aaf0671fc2dba6c5c2b17d1ef1d85137f14dc9bbdf3490288087" +
|
||||||
|
"324cd48341cce64fabf6a9b55d1a7bf23b2fcdff451fd85bf0c7feb0a5e884d7c5c078e413149566a12a686e6efa70ae5161" +
|
||||||
|
"a0201307692834cda336c55157fef125e67c01c1359886f94742105596b42a790404bbcda5dad6a65f115aaff5e45ef3c28b" +
|
||||||
|
"2316ff6cef07aa49a45aa58c07bf258051b13ef449ccb37a3679afd5cfb9132f70bb9d931a937897544f90c3bcc80ed012e9" +
|
||||||
|
"f6ba020b8cdc23f8c29ac092b88f0e370ff9434e4f0f359e614ae0868dc526fa41e4b7596533e8d10279b66e923ecd9f0b20" +
|
||||||
|
"0def55be2c1f6f9c72c92fb45d7e0a9ac571cb38f0a9a37bb33ea06f223fde8c7a92e8c47769e386f9799776e8f110c21df2" +
|
||||||
|
"77ef1be61b2c01ebdabddcbf53cc4b6fd9a3c445606ee77b3758162c80ad8f8137b3c6864e92db904807dcb2be9d7717dd21" +
|
||||||
|
"bf42c121d620ddfb7914f7a95c713d9e1c1b7bdb4a03d618e40cf7e9e235c0b5687e03b7ab3,publicExponent=10001}"
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
SpoofSignatureFingerprint.result!!.mutableMethod.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
const-string v0, "$EXPECTED_SIGNATURE"
|
||||||
|
return-object v0
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package app.revanced.patches.moneymanager.annotations
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
|
@Compatibility([Package("com.ithebk.expensemanager")])
|
||||||
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
|
internal annotation class UnlockProCompatibility
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package app.revanced.patches.moneymanager.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object UnlockProFingerprint : MethodFingerprint(
|
||||||
|
"Z",
|
||||||
|
AccessFlags.STATIC or AccessFlags.SYNTHETIC,
|
||||||
|
parameters = listOf("L"),
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.IGET_BOOLEAN,
|
||||||
|
Opcode.RETURN
|
||||||
|
),
|
||||||
|
customFingerprint = { methodDef ->
|
||||||
|
methodDef.definingClass.endsWith("MainActivity;")
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package app.revanced.patches.moneymanager.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.addInstructions
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patches.moneymanager.annotations.UnlockProCompatibility
|
||||||
|
import app.revanced.patches.moneymanager.fingerprints.UnlockProFingerprint
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("unlock-pro")
|
||||||
|
@Description("Unlocks pro features.")
|
||||||
|
@UnlockProCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class UnlockProPatch : BytecodePatch(
|
||||||
|
listOf(UnlockProFingerprint)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
UnlockProFingerprint.result!!.mutableMethod.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
const/4 v0, 0x1
|
||||||
|
|
||||||
|
return v0
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,27 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50", "5.25.51", "5.25.52", "5.26.52", "5.27.51", "5.28.52", "5.29.52", "5.31.50")
|
"com.google.android.apps.youtube.music",
|
||||||
|
arrayOf(
|
||||||
|
"5.14.53",
|
||||||
|
"5.16.51",
|
||||||
|
"5.17.51",
|
||||||
|
"5.21.52",
|
||||||
|
"5.22.54",
|
||||||
|
"5.23.50",
|
||||||
|
"5.25.51",
|
||||||
|
"5.25.52",
|
||||||
|
"5.26.52",
|
||||||
|
"5.27.51",
|
||||||
|
"5.28.52",
|
||||||
|
"5.29.52",
|
||||||
|
"5.31.50",
|
||||||
|
"5.34.51",
|
||||||
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52",
|
||||||
|
"5.40.51"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,27 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50", "5.25.51", "5.25.52", "5.26.52", "5.27.51", "5.28.52", "5.29.52", "5.31.50")
|
"com.google.android.apps.youtube.music",
|
||||||
|
arrayOf(
|
||||||
|
"5.14.53",
|
||||||
|
"5.16.51",
|
||||||
|
"5.17.51",
|
||||||
|
"5.21.52",
|
||||||
|
"5.22.54",
|
||||||
|
"5.23.50",
|
||||||
|
"5.25.51",
|
||||||
|
"5.25.52",
|
||||||
|
"5.26.52",
|
||||||
|
"5.27.51",
|
||||||
|
"5.28.52",
|
||||||
|
"5.29.52",
|
||||||
|
"5.31.50",
|
||||||
|
"5.34.51",
|
||||||
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52",
|
||||||
|
"5.40.51"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ object CodecsLockFingerprint : MethodFingerprint(
|
|||||||
Opcode.INVOKE_STATIC,
|
Opcode.INVOKE_STATIC,
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.INVOKE_INTERFACE,
|
Opcode.INVOKE_INTERFACE,
|
||||||
Opcode.INVOKE_DIRECT,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.RETURN_OBJECT
|
Opcode.RETURN_OBJECT
|
||||||
),
|
),
|
||||||
strings = listOf("eac3_supported")
|
strings = listOf("eac3_supported")
|
||||||
|
|||||||
@@ -5,7 +5,27 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50", "5.25.51", "5.25.52", "5.26.52", "5.27.51", "5.28.52", "5.29.52", "5.31.50")
|
"com.google.android.apps.youtube.music",
|
||||||
|
arrayOf(
|
||||||
|
"5.14.53",
|
||||||
|
"5.16.51",
|
||||||
|
"5.17.51",
|
||||||
|
"5.21.52",
|
||||||
|
"5.22.54",
|
||||||
|
"5.23.50",
|
||||||
|
"5.25.51",
|
||||||
|
"5.25.52",
|
||||||
|
"5.26.52",
|
||||||
|
"5.27.51",
|
||||||
|
"5.28.52",
|
||||||
|
"5.29.52",
|
||||||
|
"5.31.50",
|
||||||
|
"5.34.51",
|
||||||
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52",
|
||||||
|
"5.40.51"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,26 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.21.52", "5.22.54", "5.23.50", "5.25.51", "5.25.52", "5.26.52", "5.27.51", "5.28.52", "5.29.52", "5.31.50")
|
"com.google.android.apps.youtube.music",
|
||||||
|
arrayOf(
|
||||||
|
"5.14.53",
|
||||||
|
"5.16.51",
|
||||||
|
"5.21.52",
|
||||||
|
"5.22.54",
|
||||||
|
"5.23.50",
|
||||||
|
"5.25.51",
|
||||||
|
"5.25.52",
|
||||||
|
"5.26.52",
|
||||||
|
"5.27.51",
|
||||||
|
"5.28.52",
|
||||||
|
"5.29.52",
|
||||||
|
"5.31.50",
|
||||||
|
"5.34.51",
|
||||||
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52",
|
||||||
|
"5.40.51"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,27 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50", "5.25.51", "5.25.52", "5.26.52", "5.27.51", "5.28.52", "5.29.52", "5.31.50")
|
"com.google.android.apps.youtube.music",
|
||||||
|
arrayOf(
|
||||||
|
"5.14.53",
|
||||||
|
"5.16.51",
|
||||||
|
"5.17.51",
|
||||||
|
"5.21.52",
|
||||||
|
"5.22.54",
|
||||||
|
"5.23.50",
|
||||||
|
"5.25.51",
|
||||||
|
"5.25.52",
|
||||||
|
"5.26.52",
|
||||||
|
"5.27.51",
|
||||||
|
"5.28.52",
|
||||||
|
"5.29.52",
|
||||||
|
"5.31.50",
|
||||||
|
"5.34.51",
|
||||||
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52",
|
||||||
|
"5.40.51"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,26 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50", "5.25.51", "5.25.52", "5.26.52", "5.27.51", "5.28.52", "5.29.52", "5.31.50")
|
"com.google.android.apps.youtube.music",
|
||||||
|
arrayOf(
|
||||||
|
"5.14.53",
|
||||||
|
"5.16.51",
|
||||||
|
"5.17.51",
|
||||||
|
"5.21.52",
|
||||||
|
"5.22.54",
|
||||||
|
"5.23.50",
|
||||||
|
"5.25.51",
|
||||||
|
"5.25.52",
|
||||||
|
"5.26.52",
|
||||||
|
"5.27.51",
|
||||||
|
"5.28.52",
|
||||||
|
"5.29.52",
|
||||||
|
"5.31.50",
|
||||||
|
"5.34.51",
|
||||||
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -10,7 +10,24 @@ import app.revanced.patcher.annotation.Package
|
|||||||
*/
|
*/
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.apps.youtube.music", arrayOf("5.21.52", "5.22.54", "5.23.50", "5.25.51", "5.25.52", "5.26.52", "5.27.51", "5.28.52", "5.29.52", "5.31.50")
|
"com.google.android.apps.youtube.music",
|
||||||
|
arrayOf(
|
||||||
|
"5.21.52",
|
||||||
|
"5.22.54",
|
||||||
|
"5.23.50",
|
||||||
|
"5.25.51",
|
||||||
|
"5.25.52",
|
||||||
|
"5.26.52",
|
||||||
|
"5.27.51",
|
||||||
|
"5.28.52",
|
||||||
|
"5.29.52",
|
||||||
|
"5.31.50",
|
||||||
|
"5.34.51",
|
||||||
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52",
|
||||||
|
"5.40.51"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,27 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50", "5.25.51", "5.25.52", "5.26.52", "5.27.51", "5.28.52", "5.29.52", "5.31.50")
|
"com.google.android.apps.youtube.music",
|
||||||
|
arrayOf(
|
||||||
|
"5.14.53",
|
||||||
|
"5.16.51",
|
||||||
|
"5.17.51",
|
||||||
|
"5.21.52",
|
||||||
|
"5.22.54",
|
||||||
|
"5.23.50",
|
||||||
|
"5.25.51",
|
||||||
|
"5.25.52",
|
||||||
|
"5.26.52",
|
||||||
|
"5.27.51",
|
||||||
|
"5.28.52",
|
||||||
|
"5.29.52",
|
||||||
|
"5.31.50",
|
||||||
|
"5.34.51",
|
||||||
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52",
|
||||||
|
"5.40.51"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,27 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50", "5.25.51", "5.25.52", "5.26.52", "5.27.51", "5.28.52", "5.29.52", "5.31.50")
|
"com.google.android.apps.youtube.music",
|
||||||
|
arrayOf(
|
||||||
|
"5.14.53",
|
||||||
|
"5.16.51",
|
||||||
|
"5.17.51",
|
||||||
|
"5.21.52",
|
||||||
|
"5.22.54",
|
||||||
|
"5.23.50",
|
||||||
|
"5.25.51",
|
||||||
|
"5.25.52",
|
||||||
|
"5.26.52",
|
||||||
|
"5.27.51",
|
||||||
|
"5.28.52",
|
||||||
|
"5.29.52",
|
||||||
|
"5.31.50",
|
||||||
|
"5.34.51",
|
||||||
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52",
|
||||||
|
"5.40.51"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,27 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50", "5.25.51", "5.25.52", "5.26.52", "5.27.51", "5.28.52", "5.29.52", "5.31.50")
|
"com.google.android.apps.youtube.music",
|
||||||
|
arrayOf(
|
||||||
|
"5.14.53",
|
||||||
|
"5.16.51",
|
||||||
|
"5.17.51",
|
||||||
|
"5.21.52",
|
||||||
|
"5.22.54",
|
||||||
|
"5.23.50",
|
||||||
|
"5.25.51",
|
||||||
|
"5.25.52",
|
||||||
|
"5.26.52",
|
||||||
|
"5.27.51",
|
||||||
|
"5.28.52",
|
||||||
|
"5.29.52",
|
||||||
|
"5.31.50",
|
||||||
|
"5.34.51",
|
||||||
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52",
|
||||||
|
"5.40.51"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package app.revanced.patches.crunchyroll.downloads.annotations
|
package app.revanced.patches.nova.prime.annotations
|
||||||
|
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[
|
[
|
||||||
Package("com.crunchyroll.crunchyroid")
|
Package("com.teslacoilsw.launcher")
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
internal annotation class DownloadsCompatibility
|
internal annotation class UnlockPrimeCompatibility
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package app.revanced.patches.nova.prime.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object UnlockPrimeFingerprint : MethodFingerprint(
|
||||||
|
"V",
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.CONST_STRING,
|
||||||
|
Opcode.CONST_4,
|
||||||
|
Opcode.INVOKE_INTERFACE,
|
||||||
|
Opcode.MOVE_RESULT
|
||||||
|
),
|
||||||
|
strings = listOf("1")
|
||||||
|
)
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package app.revanced.patches.nova.prime.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.toErrorResult
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.addInstruction
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patches.nova.prime.annotations.UnlockPrimeCompatibility
|
||||||
|
import app.revanced.patches.nova.prime.fingerprints.UnlockPrimeFingerprint
|
||||||
|
import org.jf.dexlib2.builder.instruction.BuilderInstruction11x
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("unlock-prime")
|
||||||
|
@Description("Unlocks Nova Prime and all functions of the app.")
|
||||||
|
@UnlockPrimeCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class UnlockPrimePatch : BytecodePatch(
|
||||||
|
listOf(
|
||||||
|
UnlockPrimeFingerprint
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
private companion object {
|
||||||
|
// Any value except 0 unlocks prime, but 512 is needed for a protection mechanism
|
||||||
|
// which would reset the preferences if the value on disk had changed after a restart.
|
||||||
|
const val PRIME_STATUS: Int = 512
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
UnlockPrimeFingerprint.result?.apply {
|
||||||
|
val insertIndex = scanResult.patternScanResult!!.endIndex + 1
|
||||||
|
|
||||||
|
val primeStatusRegister =
|
||||||
|
(mutableMethod.implementation!!.instructions[insertIndex - 1] as BuilderInstruction11x).registerA
|
||||||
|
|
||||||
|
mutableMethod.addInstruction(
|
||||||
|
insertIndex,
|
||||||
|
"""
|
||||||
|
const/16 v$primeStatusRegister, $PRIME_STATUS
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
} ?: UnlockPrimeFingerprint.toErrorResult()
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,11 @@ package app.revanced.patches.reddit.ad.general.annotations
|
|||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.reddit.frontpage")])
|
@Compatibility(
|
||||||
|
[Package(
|
||||||
|
"com.reddit.frontpage", arrayOf("2022.43.0")
|
||||||
|
)]
|
||||||
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
internal annotation class GeneralAdsCompatibility
|
internal annotation class GeneralAdsCompatibility
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package app.revanced.patches.shared.fingerprints
|
||||||
|
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
|
||||||
|
object SeekbarFingerprint : MethodFingerprint(
|
||||||
|
"V",
|
||||||
|
strings = listOf("timed_markers_width")
|
||||||
|
)
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package app.revanced.patches.shared.fingerprints
|
||||||
|
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
|
||||||
|
object SeekbarOnDrawFingerprint : MethodFingerprint(
|
||||||
|
customFingerprint = { it.name == "onDraw" }
|
||||||
|
)
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package app.revanced.patches.tasker.trial.unlock.annotations
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
|
@Compatibility([Package("net.dinglisch.android.taskerm")])
|
||||||
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
|
internal annotation class UnlockTrialCompatibility
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package app.revanced.patches.tasker.trial.unlock.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
|
||||||
|
object CheckLicenseFingerprint : MethodFingerprint(
|
||||||
|
strings = listOf("Can't check license")
|
||||||
|
)
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package app.revanced.patches.tasker.trial.unlock.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.toErrorResult
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.addInstruction
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patches.tasker.trial.unlock.annotations.UnlockTrialCompatibility
|
||||||
|
import app.revanced.patches.tasker.trial.unlock.fingerprints.CheckLicenseFingerprint
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("unlock-trial")
|
||||||
|
@Description("Unlocks the trial version.")
|
||||||
|
@UnlockTrialCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class UnlockLicensePatch : BytecodePatch(
|
||||||
|
listOf(
|
||||||
|
CheckLicenseFingerprint
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext) = CheckLicenseFingerprint
|
||||||
|
.result
|
||||||
|
?.mutableMethod
|
||||||
|
// Return the method early, which prompts the user with a non dismissible dialog, when the trial period is over.
|
||||||
|
?.addInstruction(0, "return-void")
|
||||||
|
?.let { PatchResultSuccess() }
|
||||||
|
?: CheckLicenseFingerprint.toErrorResult()
|
||||||
|
}
|
||||||
@@ -5,8 +5,8 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[
|
[
|
||||||
Package("com.ss.android.ugc.trill"),
|
Package("com.ss.android.ugc.trill", arrayOf("27.8.3")),
|
||||||
Package("com.zhiliaoapp.musically")
|
Package("com.zhiliaoapp.musically", arrayOf("27.8.3"))
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
object FeedApiServiceLIZFingerprint : MethodFingerprint(
|
object FeedApiServiceLIZFingerprint : MethodFingerprint(
|
||||||
access = AccessFlags.PUBLIC or AccessFlags.STATIC or AccessFlags.FINAL or AccessFlags.SYNTHETIC,
|
access = AccessFlags.PUBLIC or AccessFlags.STATIC or AccessFlags.SYNTHETIC,
|
||||||
customFingerprint = { methodDef ->
|
customFingerprint = { methodDef ->
|
||||||
methodDef.definingClass.endsWith("/FeedApiService;") && methodDef.name == "LIZ"
|
methodDef.definingClass.endsWith("/FeedApiService;") && methodDef.name == "LIZ"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[
|
[
|
||||||
Package("com.ss.android.ugc.trill"),
|
Package("com.ss.android.ugc.trill", arrayOf("27.8.3")),
|
||||||
Package("com.zhiliaoapp.musically")
|
Package("com.zhiliaoapp.musically", arrayOf("27.8.3"))
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[
|
[
|
||||||
Package("com.ss.android.ugc.trill"),
|
Package("com.ss.android.ugc.trill", arrayOf("27.8.3")),
|
||||||
Package("com.zhiliaoapp.musically")
|
Package("com.zhiliaoapp.musically", arrayOf("27.8.3"))
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
package app.revanced.patches.tiktok.misc.settings.fingerprints
|
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
|
|
||||||
object AboutOnClickMethodFingerprint : MethodFingerprint(
|
|
||||||
strings = listOf(
|
|
||||||
"//setting/about",
|
|
||||||
"enter_from",
|
|
||||||
"settings_page",
|
|
||||||
"enter_settings_about"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package app.revanced.patches.tiktok.misc.settings.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
@FuzzyPatternScanMethod(4)
|
||||||
|
object AboutViewFingerprint : MethodFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.NEW_INSTANCE,
|
||||||
|
Opcode.INVOKE_DIRECT,
|
||||||
|
Opcode.INVOKE_DIRECT_RANGE,
|
||||||
|
Opcode.INVOKE_DIRECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.NEW_INSTANCE,
|
||||||
|
Opcode.NEW_INSTANCE,
|
||||||
|
Opcode.CONST,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.SGET_OBJECT,
|
||||||
|
Opcode.INVOKE_STATIC,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.NEW_INSTANCE,
|
||||||
|
Opcode.INVOKE_DIRECT,
|
||||||
|
Opcode.CONST_4,
|
||||||
|
Opcode.CONST_STRING,
|
||||||
|
Opcode.INVOKE_DIRECT_RANGE,
|
||||||
|
Opcode.INVOKE_DIRECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.CONST,
|
||||||
|
Opcode.SGET_OBJECT,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.MOVE_RESULT,
|
||||||
|
Opcode.IF_EQZ,
|
||||||
|
Opcode.CONST
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package app.revanced.patches.tiktok.misc.settings.patch
|
package app.revanced.patches.tiktok.misc.settings.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.toErrorResult
|
||||||
import app.revanced.patcher.annotation.Description
|
import app.revanced.patcher.annotation.Description
|
||||||
import app.revanced.patcher.annotation.Name
|
import app.revanced.patcher.annotation.Name
|
||||||
import app.revanced.patcher.annotation.Version
|
import app.revanced.patcher.annotation.Version
|
||||||
@@ -7,6 +8,7 @@ import app.revanced.patcher.data.BytecodeContext
|
|||||||
import app.revanced.patcher.extensions.addInstructions
|
import app.revanced.patcher.extensions.addInstructions
|
||||||
import app.revanced.patcher.extensions.instruction
|
import app.revanced.patcher.extensions.instruction
|
||||||
import app.revanced.patcher.extensions.replaceInstruction
|
import app.revanced.patcher.extensions.replaceInstruction
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.PatchResult
|
import app.revanced.patcher.patch.PatchResult
|
||||||
import app.revanced.patcher.patch.PatchResultError
|
import app.revanced.patcher.patch.PatchResultError
|
||||||
@@ -15,13 +17,12 @@ import app.revanced.patcher.patch.annotations.DependsOn
|
|||||||
import app.revanced.patcher.patch.annotations.Patch
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
import app.revanced.patches.tiktok.misc.integrations.patch.IntegrationsPatch
|
import app.revanced.patches.tiktok.misc.integrations.patch.IntegrationsPatch
|
||||||
import app.revanced.patches.tiktok.misc.settings.annotations.SettingsCompatibility
|
import app.revanced.patches.tiktok.misc.settings.annotations.SettingsCompatibility
|
||||||
import app.revanced.patches.tiktok.misc.settings.fingerprints.AboutOnClickMethodFingerprint
|
import app.revanced.patches.tiktok.misc.settings.fingerprints.AboutViewFingerprint
|
||||||
import app.revanced.patches.tiktok.misc.settings.fingerprints.AdPersonalizationActivityOnCreateFingerprint
|
import app.revanced.patches.tiktok.misc.settings.fingerprints.AdPersonalizationActivityOnCreateFingerprint
|
||||||
import app.revanced.patches.tiktok.misc.settings.fingerprints.SettingsOnViewCreatedFingerprint
|
import app.revanced.patches.tiktok.misc.settings.fingerprints.SettingsOnViewCreatedFingerprint
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
||||||
import org.jf.dexlib2.iface.instruction.formats.Instruction21c
|
|
||||||
import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
||||||
import org.jf.dexlib2.iface.reference.StringReference
|
import org.jf.dexlib2.iface.reference.StringReference
|
||||||
import org.jf.dexlib2.iface.reference.TypeReference
|
import org.jf.dexlib2.iface.reference.TypeReference
|
||||||
@@ -29,17 +30,19 @@ import org.jf.dexlib2.iface.reference.TypeReference
|
|||||||
@Patch
|
@Patch
|
||||||
@DependsOn([IntegrationsPatch::class])
|
@DependsOn([IntegrationsPatch::class])
|
||||||
@Name("settings")
|
@Name("settings")
|
||||||
@Description("Adds settings for ReVanced to TikTok.")
|
@Description("Adds ReVanced settings to TikTok.")
|
||||||
@SettingsCompatibility
|
@SettingsCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
class SettingsPatch : BytecodePatch(
|
class SettingsPatch : BytecodePatch(
|
||||||
listOf(
|
listOf(
|
||||||
AdPersonalizationActivityOnCreateFingerprint,
|
AdPersonalizationActivityOnCreateFingerprint,
|
||||||
SettingsOnViewCreatedFingerprint,
|
SettingsOnViewCreatedFingerprint,
|
||||||
AboutOnClickMethodFingerprint
|
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
override fun execute(context: BytecodeContext): PatchResult {
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
SettingsOnViewCreatedFingerprint.result?.let {
|
||||||
|
AboutViewFingerprint.resolve(context, it.method, it.classDef)
|
||||||
|
}
|
||||||
// Patch Settings UI to add 'Revanced Settings'.
|
// Patch Settings UI to add 'Revanced Settings'.
|
||||||
val targetIndexes = findOptionsOnClickIndex()
|
val targetIndexes = findOptionsOnClickIndex()
|
||||||
with(SettingsOnViewCreatedFingerprint.result!!.mutableMethod) {
|
with(SettingsOnViewCreatedFingerprint.result!!.mutableMethod) {
|
||||||
@@ -72,29 +75,21 @@ class SettingsPatch : BytecodePatch(
|
|||||||
|
|
||||||
private fun findOptionsOnClickIndex(): IntArray {
|
private fun findOptionsOnClickIndex(): IntArray {
|
||||||
val results = IntArray(2)
|
val results = IntArray(2)
|
||||||
var found = 0
|
SettingsOnViewCreatedFingerprint.result?.apply {
|
||||||
with(SettingsOnViewCreatedFingerprint.result!!.mutableMethod) {
|
for ((index, instruction) in mutableMethod.implementation!!.instructions.withIndex()) {
|
||||||
for ((index, instruction) in implementation!!.instructions.withIndex()) {
|
|
||||||
// Old UI settings option to replace to 'Revanced Settings'
|
// Old UI settings option to replace to 'Revanced Settings'
|
||||||
if (instruction.opcode == Opcode.CONST_STRING) {
|
if (instruction.opcode == Opcode.CONST_STRING) {
|
||||||
val string = ((instruction as ReferenceInstruction).reference as StringReference).string
|
val string = ((instruction as ReferenceInstruction).reference as StringReference).string
|
||||||
if (string == "copyright_policy") {
|
if (string == "copyright_policy") {
|
||||||
results[0] = index - 2
|
results[0] = index - 2
|
||||||
found++
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// New UI settings option to replace to 'Revanced Settings'
|
|
||||||
if (instruction.opcode == Opcode.NEW_INSTANCE) {
|
|
||||||
val onClickClass = ((instruction as Instruction21c).reference as TypeReference).type
|
|
||||||
if (onClickClass == AboutOnClickMethodFingerprint.result!!.mutableMethod.definingClass) {
|
|
||||||
results[1] = index
|
|
||||||
found++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (found > 1) break
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
// New UI settings option to replace to 'Revanced Settings'
|
||||||
|
results[1] = AboutViewFingerprint.result!!.scanResult.patternScanResult!!.startIndex
|
||||||
|
} ?: throw SettingsOnViewCreatedFingerprint.toErrorResult()
|
||||||
return results
|
return results
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[
|
[
|
||||||
Package("com.ss.android.ugc.trill"),
|
Package("com.ss.android.ugc.trill", arrayOf("27.8.3")),
|
||||||
Package("com.zhiliaoapp.musically")
|
Package("com.zhiliaoapp.musically", arrayOf("27.8.3"))
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import org.jf.dexlib2.iface.reference.StringReference
|
|||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@Name("timeline-ads")
|
@Name("timeline-ads")
|
||||||
@Description("Removes ads from the Twitter timeline.")
|
@Description("Removes ads from the Twitter timeline. Might require clearing app data to remove already cached ads.")
|
||||||
@TimelineAdsCompatibility
|
@TimelineAdsCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
class TimelineAdsPatch : BytecodePatch(
|
class TimelineAdsPatch : BytecodePatch(
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package app.revanced.patches.youtube.misc.playback.fix.annotations
|
package app.revanced.patches.twitter.layout.hideviews.annotations
|
||||||
|
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.41.37")
|
"com.twitter.android", arrayOf("9.69.1-release.0")
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
internal annotation class FixPlaybackCompatibility
|
internal annotation class HideViewsCompatibility
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package app.revanced.patches.twitter.layout.hideviews.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
object InlineActionTypesFingerprint : MethodFingerprint(
|
||||||
|
returnType = "Ljava/util/List",
|
||||||
|
access = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||||
|
strings = listOf(
|
||||||
|
"getCurrentMemoizing()",
|
||||||
|
"android_animated_reply_icon_enabled",
|
||||||
|
"reply_voting_android_position_before_favorite_enabled"
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package app.revanced.patches.twitter.layout.hideviews.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object TweetStatsContainerConstructorFingerprint : MethodFingerprint(
|
||||||
|
access = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
|
parameters = listOf("L"),
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.INVOKE_DIRECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.CONST,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.CHECK_CAST,
|
||||||
|
Opcode.CONST_4,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.INVOKE_VIRTUAL
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package app.revanced.patches.twitter.layout.hideviews.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object TweetStatsContainerWrapperConstructorFingerprint : MethodFingerprint(
|
||||||
|
access = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||||
|
parameters = listOf("L"),
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.INVOKE_DIRECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.NEW_INSTANCE,
|
||||||
|
Opcode.INVOKE_DIRECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.INVOKE_STATIC,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.IPUT_OBJECT
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package app.revanced.patches.twitter.layout.hideviews.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object TweetStatsViewDelegateBinderFingerprint : MethodFingerprint(
|
||||||
|
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.NEW_INSTANCE,
|
||||||
|
Opcode.CONST_16,
|
||||||
|
Opcode.INVOKE_DIRECT,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.NEW_INSTANCE,
|
||||||
|
Opcode.CONST_16,
|
||||||
|
Opcode.INVOKE_DIRECT,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.RETURN_OBJECT
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
package app.revanced.patches.twitter.layout.hideviews.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.removeInstruction
|
||||||
|
import app.revanced.patcher.extensions.removeInstructions
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||||
|
import app.revanced.patches.twitter.layout.hideviews.fingerprints.InlineActionTypesFingerprint
|
||||||
|
import app.revanced.patches.twitter.layout.hideviews.fingerprints.TweetStatsContainerConstructorFingerprint
|
||||||
|
import app.revanced.patches.twitter.layout.hideviews.fingerprints.TweetStatsContainerWrapperConstructorFingerprint
|
||||||
|
import app.revanced.patches.twitter.layout.hideviews.fingerprints.TweetStatsViewDelegateBinderFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
class HideViewsBytecodePatch : BytecodePatch(
|
||||||
|
listOf(
|
||||||
|
InlineActionTypesFingerprint,
|
||||||
|
TweetStatsContainerWrapperConstructorFingerprint,
|
||||||
|
TweetStatsContainerConstructorFingerprint,
|
||||||
|
TweetStatsViewDelegateBinderFingerprint
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
removeViewsFromTimeline(context)
|
||||||
|
removeTweetStatViewInitializer(context)
|
||||||
|
removeTweetStatViewWrapperInitializer(context)
|
||||||
|
removeViewDelegateBinderSubscription()
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun removeViewsFromTimeline(context: BytecodeContext) {
|
||||||
|
val addViewsToActionBarMethodFingerprint = object : MethodFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.INVOKE_STATIC,
|
||||||
|
Opcode.MOVE_RESULT,
|
||||||
|
Opcode.IF_EQZ,
|
||||||
|
Opcode.SGET_OBJECT,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.IF_EQZ,
|
||||||
|
)
|
||||||
|
) {}
|
||||||
|
transformMethodAtPattern(
|
||||||
|
context,
|
||||||
|
InlineActionTypesFingerprint,
|
||||||
|
addViewsToActionBarMethodFingerprint
|
||||||
|
) { patternScanResult, method ->
|
||||||
|
method.removeInstruction(patternScanResult.endIndex - 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun removeTweetStatViewInitializer(context: BytecodeContext) {
|
||||||
|
val returnFingerprint = object : MethodFingerprint(
|
||||||
|
opcodes = listOf(Opcode.RETURN_VOID)
|
||||||
|
) {}
|
||||||
|
transformMethodAtPattern(
|
||||||
|
context,
|
||||||
|
TweetStatsContainerConstructorFingerprint,
|
||||||
|
returnFingerprint
|
||||||
|
) { patternScanResult, method ->
|
||||||
|
method.removeInstructions(patternScanResult.endIndex - 3, 2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun removeTweetStatViewWrapperInitializer(context: BytecodeContext) {
|
||||||
|
val wrapperReturnFingerprint = object : MethodFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.INVOKE_STATIC,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.RETURN_VOID,
|
||||||
|
)
|
||||||
|
) {}
|
||||||
|
transformMethodAtPattern(
|
||||||
|
context,
|
||||||
|
TweetStatsContainerWrapperConstructorFingerprint,
|
||||||
|
wrapperReturnFingerprint
|
||||||
|
) { patternScanResult, method ->
|
||||||
|
method.removeInstructions(patternScanResult.startIndex - 4, 3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun removeViewDelegateBinderSubscription() {
|
||||||
|
transformMethod(TweetStatsViewDelegateBinderFingerprint) { result, method ->
|
||||||
|
method.removeInstructions(result.scanResult.patternScanResult!!.startIndex - 4, 9)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun transformMethodAtPattern(
|
||||||
|
context: BytecodeContext, methodFingerprint: MethodFingerprint,
|
||||||
|
patternFingerprint: MethodFingerprint, transformer: TransformerAtPattern
|
||||||
|
) {
|
||||||
|
transformMethod(methodFingerprint) { result, method ->
|
||||||
|
val patternResult = patternFingerprint.also {
|
||||||
|
it.resolve(context, method, result.classDef)
|
||||||
|
}.result!!
|
||||||
|
transformer(patternResult.scanResult.patternScanResult!!, method)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun transformMethod(methodFingerprint: MethodFingerprint, transformer: Transformer) {
|
||||||
|
val result = methodFingerprint.result!!
|
||||||
|
val method = result.mutableMethod
|
||||||
|
transformer(result, method)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private typealias Transformer = (MethodFingerprintResult, MutableMethod) -> Unit
|
||||||
|
|
||||||
|
private typealias TransformerAtPattern = (MethodFingerprintResult.MethodFingerprintScanResult.PatternScanResult, MutableMethod) -> Unit
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package app.revanced.patches.twitter.layout.hideviews.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.ResourceContext
|
||||||
|
import app.revanced.patcher.patch.*
|
||||||
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patches.twitter.layout.hideviews.annotations.HideViewsCompatibility
|
||||||
|
import org.w3c.dom.Element
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@DependsOn([HideViewsBytecodePatch::class])
|
||||||
|
@Name("hide-views-stats")
|
||||||
|
@Description("Hides the view stats under tweets.")
|
||||||
|
@HideViewsCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class HideViewsResourcePatch : ResourcePatch {
|
||||||
|
override fun execute(context: ResourceContext): PatchResult {
|
||||||
|
arrayOf(
|
||||||
|
"res/layout/condensed_tweet_stats.xml",
|
||||||
|
"res/layout/focal_tweet_stats.xml"
|
||||||
|
).forEach { file ->
|
||||||
|
context.xmlEditor[file].use { editor ->
|
||||||
|
val tags = editor.file.getElementsByTagName("com.twitter.ui.tweet.TweetStatView")
|
||||||
|
List(tags.length) { tags.item(it) as Element }
|
||||||
|
.filter { it.getAttribute("android:id").contains("views_stat") }
|
||||||
|
.forEach { it.parentNode.removeChild(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.36.37", "17.41.37", "17.42.35", "17.43.36", "17.45.36")
|
"com.google.android.youtube", arrayOf("17.49.37")
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -17,14 +17,15 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
|||||||
import app.revanced.patches.youtube.ad.general.annotation.GeneralAdsCompatibility
|
import app.revanced.patches.youtube.ad.general.annotation.GeneralAdsCompatibility
|
||||||
import app.revanced.patches.youtube.ad.general.bytecode.fingerprints.ReelConstructorFingerprint
|
import app.revanced.patches.youtube.ad.general.bytecode.fingerprints.ReelConstructorFingerprint
|
||||||
import app.revanced.patches.youtube.ad.general.resource.patch.GeneralAdsResourcePatch
|
import app.revanced.patches.youtube.ad.general.resource.patch.GeneralAdsResourcePatch
|
||||||
|
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.patch.FixBackToExitGesturePatch
|
||||||
|
import app.revanced.patches.youtube.misc.fix.verticalscroll.patch.VerticalScrollPatch
|
||||||
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
import org.jf.dexlib2.iface.instruction.formats.Instruction31i
|
import org.jf.dexlib2.iface.instruction.formats.Instruction31i
|
||||||
import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@DependsOn([GeneralAdsResourcePatch::class])
|
@DependsOn([GeneralAdsResourcePatch::class, VerticalScrollPatch::class, FixBackToExitGesturePatch::class])
|
||||||
@Name("general-ads")
|
@Name("general-ads")
|
||||||
@Description("Removes general ads.")
|
@Description("Removes general ads.")
|
||||||
@GeneralAdsCompatibility
|
@GeneralAdsCompatibility
|
||||||
|
|||||||
@@ -7,22 +7,21 @@ import app.revanced.patcher.patch.PatchResultSuccess
|
|||||||
import app.revanced.patcher.patch.ResourcePatch
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
import app.revanced.patcher.patch.annotations.DependsOn
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
|
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
|
||||||
import app.revanced.patches.shared.settings.preference.impl.InputType
|
import app.revanced.patches.shared.settings.preference.impl.*
|
||||||
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
|
||||||
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
|
||||||
import app.revanced.patches.shared.settings.preference.impl.TextPreference
|
|
||||||
import app.revanced.patches.youtube.ad.general.annotation.GeneralAdsCompatibility
|
import app.revanced.patches.youtube.ad.general.annotation.GeneralAdsCompatibility
|
||||||
import app.revanced.patches.youtube.misc.litho.filter.patch.LithoFilterPatch
|
import app.revanced.patches.youtube.misc.litho.filter.patch.LithoFilterPatch
|
||||||
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
|
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
|
||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch.PreferenceScreen
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch.PreferenceScreen
|
||||||
|
|
||||||
@DependsOn(dependencies = [
|
@DependsOn(
|
||||||
FixLocaleConfigErrorPatch::class,
|
dependencies = [
|
||||||
LithoFilterPatch::class,
|
FixLocaleConfigErrorPatch::class,
|
||||||
SettingsPatch::class,
|
LithoFilterPatch::class,
|
||||||
ResourceMappingPatch::class
|
SettingsPatch::class,
|
||||||
])
|
ResourceMappingPatch::class
|
||||||
|
]
|
||||||
|
)
|
||||||
@GeneralAdsCompatibility
|
@GeneralAdsCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
class GeneralAdsResourcePatch : ResourcePatch {
|
class GeneralAdsResourcePatch : ResourcePatch {
|
||||||
@@ -32,20 +31,42 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun execute(context: ResourceContext): PatchResult {
|
override fun execute(context: ResourceContext): PatchResult {
|
||||||
PreferenceScreen.ADS.addPreferences(
|
PreferenceScreen.LAYOUT.addPreferences(
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_adremover_ad_removal",
|
"revanced_adremover_separator",
|
||||||
StringResource("revanced_adremover_ad_removal_enabled_title", "Hide general ads"),
|
StringResource("revanced_adremover_separator_title", "Hide gray separator"),
|
||||||
true,
|
true,
|
||||||
StringResource("revanced_adremover_ad_removal_enabled_summary_on", "General ads are hidden"),
|
StringResource("revanced_adremover_separator_summary_on", "Gray separators are hidden"),
|
||||||
StringResource("revanced_adremover_ad_removal_enabled_summary_off", "General ads are shown")
|
StringResource("revanced_adremover_separator_summary_off", "Gray separators are shown")
|
||||||
),
|
),
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_adremover_buttoned",
|
"revanced_adremover_hide_channel_guidelines",
|
||||||
StringResource("revanced_adremover_buttoned_enabled_title", "Hide buttoned ad"),
|
StringResource("revanced_adremover_hide_channel_guidelines_enabled_title", "Hide channel guidelines"),
|
||||||
true,
|
true,
|
||||||
StringResource("revanced_adremover_buttoned_enabled_summary_on", "Buttoned ads are hidden"),
|
StringResource(
|
||||||
StringResource("revanced_adremover_buttoned_enabled_summary_off", "Buttoned ads are shown")
|
"revanced_adremover_hide_channel_guidelines_enabled_summary_on",
|
||||||
|
"Channel guidelines are hidden"
|
||||||
|
),
|
||||||
|
StringResource(
|
||||||
|
"revanced_adremover_hide_channel_guidelines_enabled_summary_off",
|
||||||
|
"Channel guidelines are shown"
|
||||||
|
)
|
||||||
|
),
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_adremover_chapter_teaser",
|
||||||
|
StringResource(
|
||||||
|
"revanced_adremover_chapter_teaser_enabled_title",
|
||||||
|
"Hide chapter teaser under videos"
|
||||||
|
),
|
||||||
|
true,
|
||||||
|
StringResource(
|
||||||
|
"revanced_adremover_chapter_teaser_enabled_summary_on",
|
||||||
|
"Chapter teasers are hidden"
|
||||||
|
),
|
||||||
|
StringResource(
|
||||||
|
"revanced_adremover_chapter_teaser_enabled_summary_off",
|
||||||
|
"Chapter teasers are shown"
|
||||||
|
)
|
||||||
),
|
),
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_adremover_merchandise",
|
"revanced_adremover_merchandise",
|
||||||
@@ -102,6 +123,35 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
|||||||
"Community guidelines are shown"
|
"Community guidelines are shown"
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_adremover_subscribers_community_guidelines_removal",
|
||||||
|
StringResource(
|
||||||
|
"revanced_adremover_subscribers_community_guidelines_enabled_title",
|
||||||
|
"Hide subscribers community guidelines"
|
||||||
|
),
|
||||||
|
true,
|
||||||
|
StringResource(
|
||||||
|
"revanced_adremover_subscribers_community_guidelines_enabled_summary_on",
|
||||||
|
"Subscribers community guidelines are hidden"
|
||||||
|
),
|
||||||
|
StringResource(
|
||||||
|
"revanced_adremover_subscribers_community_guidelines_enabled_summary_off",
|
||||||
|
"Subscribers community guidelines are shown"
|
||||||
|
)
|
||||||
|
),
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_adremover_channel_member_shelf_removal",
|
||||||
|
StringResource("revanced_adremover_channel_member_shelf_enabled_title", "Hide channel member shelf"),
|
||||||
|
true,
|
||||||
|
StringResource(
|
||||||
|
"revanced_adremover_channel_member_shelf_enabled_summary_on",
|
||||||
|
"Channel member shelf is hidden"
|
||||||
|
),
|
||||||
|
StringResource(
|
||||||
|
"revanced_adremover_channel_member_shelf_enabled_summary_off",
|
||||||
|
"Channel member shelf is shown"
|
||||||
|
)
|
||||||
|
),
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_adremover_emergency_box_removal",
|
"revanced_adremover_emergency_box_removal",
|
||||||
StringResource("revanced_adremover_emergency_box_enabled_title", "Hide emergency boxes"),
|
StringResource("revanced_adremover_emergency_box_enabled_title", "Hide emergency boxes"),
|
||||||
@@ -123,6 +173,23 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
|||||||
StringResource("revanced_adremover_medical_panel_enabled_summary_on", "Medical panels are hidden"),
|
StringResource("revanced_adremover_medical_panel_enabled_summary_on", "Medical panels are hidden"),
|
||||||
StringResource("revanced_adremover_medical_panel_enabled_summary_off", "Medical panels are shown")
|
StringResource("revanced_adremover_medical_panel_enabled_summary_off", "Medical panels are shown")
|
||||||
),
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
PreferenceScreen.ADS.addPreferences(
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_adremover_ad_removal",
|
||||||
|
StringResource("revanced_adremover_ad_removal_enabled_title", "Hide general ads"),
|
||||||
|
true,
|
||||||
|
StringResource("revanced_adremover_ad_removal_enabled_summary_on", "General ads are hidden"),
|
||||||
|
StringResource("revanced_adremover_ad_removal_enabled_summary_off", "General ads are shown")
|
||||||
|
),
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_adremover_buttoned",
|
||||||
|
StringResource("revanced_adremover_buttoned_enabled_title", "Hide buttoned ad"),
|
||||||
|
true,
|
||||||
|
StringResource("revanced_adremover_buttoned_enabled_summary_on", "Buttoned ads are hidden"),
|
||||||
|
StringResource("revanced_adremover_buttoned_enabled_summary_off", "Buttoned ads are shown")
|
||||||
|
),
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_adremover_paid_content",
|
"revanced_adremover_paid_content",
|
||||||
StringResource("revanced_adremover_paid_content_enabled_title", "Hide paid content"),
|
StringResource("revanced_adremover_paid_content_enabled_title", "Hide paid content"),
|
||||||
@@ -144,19 +211,6 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
|||||||
StringResource("revanced_adremover_hide_latest_posts_enabled_summary_on", "Latest posts are hidden"),
|
StringResource("revanced_adremover_hide_latest_posts_enabled_summary_on", "Latest posts are hidden"),
|
||||||
StringResource("revanced_adremover_hide_latest_posts_enabled_summary_off", "Latest posts are shown")
|
StringResource("revanced_adremover_hide_latest_posts_enabled_summary_off", "Latest posts are shown")
|
||||||
),
|
),
|
||||||
SwitchPreference(
|
|
||||||
"revanced_adremover_hide_channel_guidelines",
|
|
||||||
StringResource("revanced_adremover_hide_channel_guidelines_enabled_title", "Hide channel guidelines"),
|
|
||||||
true,
|
|
||||||
StringResource(
|
|
||||||
"revanced_adremover_hide_channel_guidelines_enabled_summary_on",
|
|
||||||
"Channel guidelines are hidden"
|
|
||||||
),
|
|
||||||
StringResource(
|
|
||||||
"revanced_adremover_hide_channel_guidelines_enabled_summary_off",
|
|
||||||
"Channel guidelines are shown"
|
|
||||||
)
|
|
||||||
),
|
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_adremover_self_sponsor",
|
"revanced_adremover_self_sponsor",
|
||||||
StringResource("revanced_adremover_self_sponsor_enabled_title", "Hide self sponsored cards"),
|
StringResource("revanced_adremover_self_sponsor_enabled_title", "Hide self sponsored cards"),
|
||||||
@@ -164,30 +218,7 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
|||||||
StringResource("revanced_adremover_self_sponsor_enabled_summary_on", "Self sponsored cards are hidden"),
|
StringResource("revanced_adremover_self_sponsor_enabled_summary_on", "Self sponsored cards are hidden"),
|
||||||
StringResource("revanced_adremover_self_sponsor_enabled_summary_off", "Self sponsored cards are shown")
|
StringResource("revanced_adremover_self_sponsor_enabled_summary_off", "Self sponsored cards are shown")
|
||||||
),
|
),
|
||||||
SwitchPreference(
|
PreferenceScreen(
|
||||||
"revanced_adremover_separator",
|
|
||||||
StringResource("revanced_adremover_separator_title", "Hide gray separator"),
|
|
||||||
true,
|
|
||||||
StringResource("revanced_adremover_separator_summary_on", "Gray separators are hidden"),
|
|
||||||
StringResource("revanced_adremover_separator_summary_off", "Gray separators are shown")
|
|
||||||
),
|
|
||||||
SwitchPreference(
|
|
||||||
"revanced_adremover_chapter_teaser",
|
|
||||||
StringResource(
|
|
||||||
"revanced_adremover_chapter_teaser_enabled_title",
|
|
||||||
"Hide chapter teaser under videos"
|
|
||||||
),
|
|
||||||
true,
|
|
||||||
StringResource(
|
|
||||||
"revanced_adremover_chapter_teaser_enabled_summary_on",
|
|
||||||
"Chapter teasers are hidden"
|
|
||||||
),
|
|
||||||
StringResource(
|
|
||||||
"revanced_adremover_chapter_teaser_enabled_summary_off",
|
|
||||||
"Chapter teasers are shown"
|
|
||||||
)
|
|
||||||
),
|
|
||||||
app.revanced.patches.shared.settings.preference.impl.PreferenceScreen(
|
|
||||||
"revanced_adremover_custom",
|
"revanced_adremover_custom",
|
||||||
StringResource("revanced_adremover_custom_title", "Custom filter"),
|
StringResource("revanced_adremover_custom_title", "Custom filter"),
|
||||||
listOf(
|
listOf(
|
||||||
@@ -207,7 +238,7 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
|||||||
"Custom filter is disabled"
|
"Custom filter is disabled"
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
// TODO: This should be a ListPreference, which does not exist yet
|
// TODO: This should be a dynamic ListPreference, which does not exist yet
|
||||||
TextPreference(
|
TextPreference(
|
||||||
"revanced_adremover_custom_strings",
|
"revanced_adremover_custom_strings",
|
||||||
StringResource("revanced_adremover_custom_strings_title", "Custom filter"),
|
StringResource("revanced_adremover_custom_strings_title", "Custom filter"),
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.36.37", "17.41.37", "17.42.35", "17.43.36", "17.45.36")
|
"com.google.android.youtube", arrayOf("17.49.37")
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -12,16 +12,15 @@ import app.revanced.patcher.patch.PatchResultSuccess
|
|||||||
import app.revanced.patcher.patch.annotations.DependsOn
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
import app.revanced.patcher.patch.annotations.Patch
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
import app.revanced.patcher.util.smali.ExternalLabel
|
import app.revanced.patcher.util.smali.ExternalLabel
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
||||||
import app.revanced.patches.youtube.ad.video.annotations.VideoAdsCompatibility
|
import app.revanced.patches.youtube.ad.video.annotations.VideoAdsCompatibility
|
||||||
import app.revanced.patches.youtube.ad.video.fingerprints.LoadVideoAdsFingerprint
|
import app.revanced.patches.youtube.ad.video.fingerprints.LoadVideoAdsFingerprint
|
||||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||||
import app.revanced.patches.youtube.misc.playback.fix.patch.FixPlaybackPatch
|
|
||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
|
||||||
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@DependsOn([IntegrationsPatch::class, SettingsPatch::class, FixPlaybackPatch::class])
|
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
|
||||||
@Name("video-ads")
|
@Name("video-ads")
|
||||||
@Description("Removes ads in the video player.")
|
@Description("Removes ads in the video player.")
|
||||||
@VideoAdsCompatibility
|
@VideoAdsCompatibility
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package app.revanced.patches.youtube.interaction.copyvideourl.annotation
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
|
@Compatibility(
|
||||||
|
[
|
||||||
|
Package("com.google.android.youtube", arrayOf("17.49.37"))
|
||||||
|
]
|
||||||
|
)
|
||||||
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
|
internal annotation class CopyVideoUrlCompatibility
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package app.revanced.patches.youtube.interaction.copyvideourl.bytecode.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patches.youtube.interaction.copyvideourl.annotation.CopyVideoUrlCompatibility
|
||||||
|
import app.revanced.patches.youtube.interaction.copyvideourl.resource.patch.CopyVideoUrlResourcePatch
|
||||||
|
import app.revanced.patches.youtube.misc.playercontrols.bytecode.patch.PlayerControlsBytecodePatch
|
||||||
|
import app.revanced.patches.youtube.misc.video.information.patch.VideoInformationPatch
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("copy-video-url")
|
||||||
|
@Description("Adds buttons in player to copy video links.")
|
||||||
|
@DependsOn([
|
||||||
|
CopyVideoUrlResourcePatch::class,
|
||||||
|
PlayerControlsBytecodePatch::class,
|
||||||
|
VideoInformationPatch::class
|
||||||
|
])
|
||||||
|
@CopyVideoUrlCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class CopyVideoUrlBytecodePatch : BytecodePatch() {
|
||||||
|
private companion object {
|
||||||
|
const val INTEGRATIONS_PACKAGE = "Lapp/revanced/integrations"
|
||||||
|
const val INTEGRATIONS_PLAYER_PACKAGE = "$INTEGRATIONS_PACKAGE/videoplayer"
|
||||||
|
val BUTTONS_DESCRIPTORS = listOf(
|
||||||
|
"$INTEGRATIONS_PLAYER_PACKAGE/CopyVideoUrlButton;",
|
||||||
|
"$INTEGRATIONS_PLAYER_PACKAGE/CopyVideoUrlTimestampButton;"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
|
||||||
|
// Initialize buttons and inject visibility control
|
||||||
|
BUTTONS_DESCRIPTORS.forEach { descriptor ->
|
||||||
|
val initializeButtonDescriptor = "$descriptor->initializeButton(Ljava/lang/Object;)V"
|
||||||
|
val visibilityDescriptor = "$descriptor->changeVisibility(Z)V"
|
||||||
|
PlayerControlsBytecodePatch.initializeControl(initializeButtonDescriptor)
|
||||||
|
PlayerControlsBytecodePatch.injectVisibilityCheckCall(visibilityDescriptor)
|
||||||
|
}
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
package app.revanced.patches.youtube.interaction.copyvideourl.resource.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.ResourceContext
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
||||||
|
import app.revanced.patches.youtube.interaction.copyvideourl.annotation.CopyVideoUrlCompatibility
|
||||||
|
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
|
||||||
|
import app.revanced.patches.youtube.misc.playercontrols.resource.patch.BottomControlsResourcePatch
|
||||||
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
|
import app.revanced.util.resources.ResourceUtils
|
||||||
|
import app.revanced.util.resources.ResourceUtils.copyResources
|
||||||
|
|
||||||
|
@Name("copy-video-url-resource")
|
||||||
|
@Description("Makes necessary changes to resources for copy video link buttons.")
|
||||||
|
@DependsOn([BottomControlsResourcePatch::class, FixLocaleConfigErrorPatch::class, SettingsPatch::class])
|
||||||
|
@CopyVideoUrlCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class CopyVideoUrlResourcePatch : ResourcePatch {
|
||||||
|
override fun execute(context: ResourceContext): PatchResult {
|
||||||
|
SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences(
|
||||||
|
PreferenceScreen(
|
||||||
|
"revanced_copy_video_url",
|
||||||
|
StringResource("revanced_copy_video_url_title", "Copy video URL settings"),
|
||||||
|
listOf(
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_copy_video_url",
|
||||||
|
StringResource("revanced_copy_video_url_enabled_title", "Show copy video URL button"),
|
||||||
|
true,
|
||||||
|
StringResource("revanced_copy_video_url_enabled_summary_on", "Button is shown, click to copy video URL without timestamp"),
|
||||||
|
StringResource("revanced_copy_video_url_enabled_summary_off", "Button is not shown")
|
||||||
|
),
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_copy_video_url_timestamp",
|
||||||
|
StringResource("revanced_copy_video_url_timestamp_enabled_title", "Show copy timestamp URL button"),
|
||||||
|
true,
|
||||||
|
StringResource("revanced_copy_video_url_timestamp_enabled_summary_on", "Button is shown, click to copy video URL with timestamp"),
|
||||||
|
StringResource("revanced_copy_video_url_timestamp_enabled_summary_off", "Button is not shown")
|
||||||
|
)
|
||||||
|
),
|
||||||
|
StringResource("revanced_copy_video_url_summary", "Settings related to copy URL buttons in video player")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
context.copyResources("copyvideourl", ResourceUtils.ResourceGroup(
|
||||||
|
resourceDirectoryName = "drawable",
|
||||||
|
"revanced_yt_copy.xml",
|
||||||
|
"revanced_yt_copy_timestamp.xml"
|
||||||
|
))
|
||||||
|
|
||||||
|
BottomControlsResourcePatch.addControls("copyvideourl/host/layout/${BottomControlsResourcePatch.TARGET_RESOURCE_NAME}")
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.36.37", "17.41.37", "17.42.35", "17.43.36", "17.45.36")
|
"com.google.android.youtube", arrayOf("17.49.37")
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ import app.revanced.patcher.patch.annotations.Patch
|
|||||||
import app.revanced.patches.youtube.interaction.downloads.annotation.DownloadsCompatibility
|
import app.revanced.patches.youtube.interaction.downloads.annotation.DownloadsCompatibility
|
||||||
import app.revanced.patches.youtube.interaction.downloads.resource.patch.DownloadsResourcePatch
|
import app.revanced.patches.youtube.interaction.downloads.resource.patch.DownloadsResourcePatch
|
||||||
import app.revanced.patches.youtube.misc.playercontrols.bytecode.patch.PlayerControlsBytecodePatch
|
import app.revanced.patches.youtube.misc.playercontrols.bytecode.patch.PlayerControlsBytecodePatch
|
||||||
import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
|
import app.revanced.patches.youtube.misc.video.information.patch.VideoInformationPatch
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@Name("downloads")
|
@Name("downloads")
|
||||||
@DependsOn([DownloadsResourcePatch::class, PlayerControlsBytecodePatch::class, VideoIdPatch::class])
|
@DependsOn([DownloadsResourcePatch::class, PlayerControlsBytecodePatch::class, VideoInformationPatch::class])
|
||||||
@Description("Enables downloading music and videos from YouTube.")
|
@Description("Enables downloading music and videos from YouTube.")
|
||||||
@DownloadsCompatibility
|
@DownloadsCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
@@ -29,7 +29,7 @@ class DownloadsBytecodePatch : BytecodePatch() {
|
|||||||
initialize the control
|
initialize the control
|
||||||
*/
|
*/
|
||||||
|
|
||||||
val initializeDownloadsDescriptor = "$classDescriptor->initializeDownloadButton(Ljava/lang/Object;)V"
|
val initializeDownloadsDescriptor = "$classDescriptor->initializeButton(Ljava/lang/Object;)V"
|
||||||
PlayerControlsBytecodePatch.initializeControl(initializeDownloadsDescriptor)
|
PlayerControlsBytecodePatch.initializeControl(initializeDownloadsDescriptor)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -39,14 +39,6 @@ class DownloadsBytecodePatch : BytecodePatch() {
|
|||||||
val changeVisibilityDescriptor = "$classDescriptor->changeVisibility(Z)V"
|
val changeVisibilityDescriptor = "$classDescriptor->changeVisibility(Z)V"
|
||||||
PlayerControlsBytecodePatch.injectVisibilityCheckCall(changeVisibilityDescriptor)
|
PlayerControlsBytecodePatch.injectVisibilityCheckCall(changeVisibilityDescriptor)
|
||||||
|
|
||||||
/*
|
|
||||||
add code to change to update the video id
|
|
||||||
*/
|
|
||||||
|
|
||||||
val setVideoIdDescriptor =
|
|
||||||
"L$integrationsPackage/patches/downloads/DownloadsPatch;->setVideoId(Ljava/lang/String;)V"
|
|
||||||
VideoIdPatch.injectCall(setVideoIdDescriptor)
|
|
||||||
|
|
||||||
return PatchResultSuccess()
|
return PatchResultSuccess()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,18 +8,14 @@ import app.revanced.patcher.patch.PatchResult
|
|||||||
import app.revanced.patcher.patch.PatchResultSuccess
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
import app.revanced.patcher.patch.ResourcePatch
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
import app.revanced.patcher.patch.annotations.DependsOn
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
import app.revanced.patches.shared.settings.preference.impl.*
|
||||||
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
|
||||||
import app.revanced.patches.shared.settings.preference.impl.TextPreference
|
|
||||||
import app.revanced.patches.shared.settings.preference.impl.InputType
|
|
||||||
import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen
|
|
||||||
import app.revanced.patches.youtube.interaction.downloads.annotation.DownloadsCompatibility
|
import app.revanced.patches.youtube.interaction.downloads.annotation.DownloadsCompatibility
|
||||||
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
|
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
|
||||||
import app.revanced.patches.youtube.misc.playercontrols.resource.patch.BottomControlsResourcePatch
|
import app.revanced.patches.youtube.misc.playercontrols.resource.patch.BottomControlsResourcePatch
|
||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
import app.revanced.util.resources.ResourceUtils
|
import app.revanced.util.resources.ResourceUtils
|
||||||
import app.revanced.util.resources.ResourceUtils.Settings.mergeStrings
|
|
||||||
import app.revanced.util.resources.ResourceUtils.copyResources
|
import app.revanced.util.resources.ResourceUtils.copyResources
|
||||||
|
import app.revanced.util.resources.ResourceUtils.mergeStrings
|
||||||
|
|
||||||
@Name("downloads-resource-patch")
|
@Name("downloads-resource-patch")
|
||||||
@DependsOn([BottomControlsResourcePatch::class, FixLocaleConfigErrorPatch::class, SettingsPatch::class])
|
@DependsOn([BottomControlsResourcePatch::class, FixLocaleConfigErrorPatch::class, SettingsPatch::class])
|
||||||
@@ -37,8 +33,8 @@ class DownloadsResourcePatch : ResourcePatch {
|
|||||||
"revanced_downloads",
|
"revanced_downloads",
|
||||||
StringResource("revanced_downloads_enabled_title", "Show download button"),
|
StringResource("revanced_downloads_enabled_title", "Show download button"),
|
||||||
true,
|
true,
|
||||||
StringResource("revanced_downloads_enabled_summary_on", "Download button is visible"),
|
StringResource("revanced_downloads_enabled_summary_on", "Download button is shown"),
|
||||||
StringResource("revanced_downloads_enabled_summary_off", "Download button is hidden")
|
StringResource("revanced_downloads_enabled_summary_off", "Download button is not shown")
|
||||||
),
|
),
|
||||||
TextPreference(
|
TextPreference(
|
||||||
"revanced_downloads_package_name",
|
"revanced_downloads_package_name",
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.36.37", "17.41.37", "17.42.35", "17.43.36", "17.45.36")
|
"com.google.android.youtube", arrayOf("17.49.37")
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.36.37", "17.41.37", "17.42.35", "17.43.36", "17.45.36")
|
"com.google.android.youtube", arrayOf("17.49.37")
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package app.revanced.patches.youtube.interaction.swipecontrols.patch.bytecode
|
package app.revanced.patches.youtube.interaction.swipecontrols.patch.bytecode
|
||||||
|
|
||||||
import app.revanced.extensions.transformMethods
|
import app.revanced.extensions.transformMethods
|
||||||
import app.revanced.extensions.traverseClassHierarchy
|
|
||||||
import app.revanced.patcher.annotation.Description
|
import app.revanced.patcher.annotation.Description
|
||||||
import app.revanced.patcher.annotation.Name
|
import app.revanced.patcher.annotation.Name
|
||||||
import app.revanced.patcher.annotation.Version
|
import app.revanced.patcher.annotation.Version
|
||||||
@@ -11,10 +10,11 @@ import app.revanced.patcher.patch.PatchResult
|
|||||||
import app.revanced.patcher.patch.PatchResultSuccess
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
import app.revanced.patcher.patch.annotations.DependsOn
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
import app.revanced.patcher.patch.annotations.Patch
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patcher.util.TypeUtil.traverseClassHierarchy
|
||||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||||
|
import app.revanced.patches.shared.fingerprints.WatchWhileActivityFingerprint
|
||||||
import app.revanced.patches.youtube.interaction.swipecontrols.annotation.SwipeControlsCompatibility
|
import app.revanced.patches.youtube.interaction.swipecontrols.annotation.SwipeControlsCompatibility
|
||||||
import app.revanced.patches.youtube.interaction.swipecontrols.fingerprints.SwipeControlsHostActivityFingerprint
|
import app.revanced.patches.youtube.interaction.swipecontrols.fingerprints.SwipeControlsHostActivityFingerprint
|
||||||
import app.revanced.patches.shared.fingerprints.WatchWhileActivityFingerprint
|
|
||||||
import app.revanced.patches.youtube.interaction.swipecontrols.patch.resource.SwipeControlsResourcePatch
|
import app.revanced.patches.youtube.interaction.swipecontrols.patch.resource.SwipeControlsResourcePatch
|
||||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||||
import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch
|
import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.36.37", "17.41.37", "17.42.35", "17.43.36", "17.45.36")
|
"com.google.android.youtube", arrayOf("17.49.37")
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.36.37", "17.41.37", "17.42.35", "17.43.36", "17.45.36")
|
"com.google.android.youtube", arrayOf("17.49.37")
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -38,11 +38,11 @@ class HideAutoplayButtonPatch : BytecodePatch(
|
|||||||
override fun execute(context: BytecodeContext): PatchResult {
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
|
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_autoplay_button_enabled",
|
"revanced_hide_autoplay_button",
|
||||||
StringResource("revanced_autoplay_button_enabled_title", "Show autoplay button"),
|
StringResource("revanced_hide_autoplay_button_title", "Hide autoplay button"),
|
||||||
false,
|
true,
|
||||||
StringResource("revanced_autoplay_button_summary_on", "Autoplay button is shown"),
|
StringResource("revanced_hide_autoplay_button_summary_on", "Autoplay button is hidden"),
|
||||||
StringResource("revanced_autoplay_button_summary_off", "Autoplay button is hidden")
|
StringResource("revanced_hide_autoplay_button_summary_off", "Autoplay button is shown")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.36.37", "17.41.37", "17.42.35", "17.43.36", "17.45.36")
|
"com.google.android.youtube", arrayOf("17.49.37")
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -31,46 +31,46 @@ class HideButtonsPatch : ResourcePatch {
|
|||||||
StringResource("revanced_hide_buttons_title", "Hide action buttons"),
|
StringResource("revanced_hide_buttons_title", "Hide action buttons"),
|
||||||
listOf(
|
listOf(
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_like_button",
|
"revanced_hide_like_button",
|
||||||
StringResource("revanced_like_button_title", "Hide like button"),
|
StringResource("revanced_hide_like_button_title", "Hide like button"),
|
||||||
false,
|
false,
|
||||||
StringResource("revanced_like_button_on", "Like button is hidden"),
|
StringResource("revanced_hide_like_button_summary_on", "Like button is hidden"),
|
||||||
StringResource("revanced_like_button_off", "Like button is shown")
|
StringResource("revanced_hide_like_button_summary_off", "Like button is shown")
|
||||||
),
|
),
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_dislike_button",
|
"revanced_hide_dislike_button",
|
||||||
StringResource("revanced_dislike_button_title", "Hide dislike button"),
|
StringResource("revanced_hide_dislike_button_title", "Hide dislike button"),
|
||||||
false,
|
false,
|
||||||
StringResource("revanced_dislike_button_on", "Dislike button is hidden"),
|
StringResource("revanced_hide_dislike_button_summary_on", "Dislike button is hidden"),
|
||||||
StringResource("revanced_dislike_button_off", "Dislike button is shown")
|
StringResource("revanced_hide_dislike_button_summary_off", "Dislike button is shown")
|
||||||
),
|
),
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_download_button",
|
"revanced_hide_download_button",
|
||||||
StringResource("revanced_download_button_title", "Hide download button"),
|
StringResource("revanced_hide_download_button_title", "Hide download button"),
|
||||||
false,
|
false,
|
||||||
StringResource("revanced_download_button_on", "Download button is hidden"),
|
StringResource("revanced_hide_download_button_summary_on", "Download button is hidden"),
|
||||||
StringResource("revanced_download_button_off", "Download button is shown")
|
StringResource("revanced_hide_download_button_summary_off", "Download button is shown")
|
||||||
),
|
),
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_playlist_button",
|
"revanced_hide_playlist_button",
|
||||||
StringResource("revanced_playlist_button_title", "Hide playlist button"),
|
StringResource("revanced_hide_playlist_button_title", "Hide playlist button"),
|
||||||
false,
|
false,
|
||||||
StringResource("revanced_playlist_button_on", "Playlist button is hidden"),
|
StringResource("revanced_hide_playlist_button_summary_on", "Playlist button is hidden"),
|
||||||
StringResource("revanced_playlist_button_off", "Playlist button is shown")
|
StringResource("revanced_hide_playlist_button_summary_off", "Playlist button is shown")
|
||||||
),
|
),
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_action_button",
|
"revanced_hide_action_button",
|
||||||
StringResource("revanced_action_button_title", "Hide create, clip and thanks buttons"),
|
StringResource("revanced_hide_action_button_title", "Hide create, clip and thanks buttons"),
|
||||||
true,
|
true,
|
||||||
StringResource("revanced_action_button_on", "Buttons are hidden"),
|
StringResource("revanced_hide_action_button_summary_on", "Buttons are hidden"),
|
||||||
StringResource("revanced_action_button_off", "Buttons are shown")
|
StringResource("revanced_hide_action_button_summary_off", "Buttons are shown")
|
||||||
),
|
),
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_share_button",
|
"revanced_hide_share_button",
|
||||||
StringResource("revanced_share_button_title", "Hide share button"),
|
StringResource("revanced_hide_share_button_title", "Hide share button"),
|
||||||
false,
|
false,
|
||||||
StringResource("revanced_share_button_on", "Share button is hidden"),
|
StringResource("revanced_hide_share_button_summary_on", "Share button is hidden"),
|
||||||
StringResource("revanced_share_button_off", "Share button is shown")
|
StringResource("revanced_hide_share_button_summaryoff", "Share button is shown")
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
StringResource("revanced_hide_buttons_summary", "Hide or show buttons under videos")
|
StringResource("revanced_hide_buttons_summary", "Hide or show buttons under videos")
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ class HideCastButtonPatch : BytecodePatch() {
|
|||||||
override fun execute(context: BytecodeContext): PatchResult {
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
|
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_cast_button_enabled",
|
"revanced_hide_cast_button",
|
||||||
StringResource("revanced_cast_button_enabled_title", "Show cast button"),
|
StringResource("revanced_hide_cast_button_title", "Hide cast button"),
|
||||||
false,
|
true,
|
||||||
StringResource("revanced_cast_button_summary_on", "Cast button is shown"),
|
StringResource("revanced_hide_cast_button_summary_on", "Cast button is hidden"),
|
||||||
StringResource("revanced_cast_button_summary_off", "Cast button is hidden")
|
StringResource("revanced_hide_cast_button_summary_off", "Cast button is shown")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.36.37", "17.41.37", "17.42.35", "17.43.36", "17.45.36")
|
"com.google.android.youtube", arrayOf("17.49.37")
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class CommentsResourcePatch : ResourcePatch {
|
|||||||
listOf(
|
listOf(
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_hide_comments_section",
|
"revanced_hide_comments_section",
|
||||||
StringResource("revanced_hide_comments_section_title", "Remove comments section"),
|
StringResource("revanced_hide_comments_section_title", "Hide comments section"),
|
||||||
false,
|
false,
|
||||||
StringResource("revanced_hide_comments_section_summary_on", "Comment section is hidden"),
|
StringResource("revanced_hide_comments_section_summary_on", "Comment section is hidden"),
|
||||||
StringResource("revanced_hide_comments_section_summary_off", "Comment section is shown")
|
StringResource("revanced_hide_comments_section_summary_off", "Comment section is shown")
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user