mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-08 10:23:55 +01:00
Compare commits
81 Commits
v2.146.0-d
...
v2.155.0-d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
3
.github/workflows/pull_request.yml
vendored
3
.github/workflows/pull_request.yml
vendored
@@ -7,10 +7,11 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
MESSAGE: merge branch \`${{ github.head_ref || github.ref_name }}\` to \`main\`
|
MESSAGE: merge branch `${{ github.head_ref || github.ref_name }}` to `main`
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pull-request:
|
pull-request:
|
||||||
|
name: Open pull request
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
|||||||
9
.github/workflows/release.yml
vendored
9
.github/workflows/release.yml
vendored
@@ -1,4 +1,5 @@
|
|||||||
name: Release
|
name: Release
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
@@ -9,6 +10,7 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
- dev
|
- dev
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
name: Release
|
name: Release
|
||||||
@@ -17,6 +19,9 @@ jobs:
|
|||||||
- 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
|
||||||
@@ -40,8 +45,8 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: ./gradlew generateMeta clean --no-daemon
|
run: ./gradlew generateMeta clean --no-daemon
|
||||||
- name: Setup semantic-release
|
- name: Setup semantic-release
|
||||||
run: npm install semantic-release @saithodev/semantic-release-backmerge @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
|
||||||
|
|||||||
@@ -32,13 +32,15 @@
|
|||||||
{
|
{
|
||||||
"path": "patches.json"
|
"path": "patches.json"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
successComment: false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"@saithodev/semantic-release-backmerge",
|
"@saithodev/semantic-release-backmerge",
|
||||||
{
|
{
|
||||||
"branches": [{from: "main", to: "dev"}]
|
branches: [{from: "main", to: "dev"}],
|
||||||
|
clearWorkspace: true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|||||||
260
CHANGELOG.md
260
CHANGELOG.md
@@ -1,3 +1,263 @@
|
|||||||
|
# [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)
|
# [2.146.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.145.0...v2.146.0-dev.1) (2022-12-18)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
103
README.md
103
README.md
@@ -12,6 +12,7 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `always-autorepeat` | Always repeats the playing video again. | 17.49.37 |
|
| `always-autorepeat` | Always repeats the playing video again. | 17.49.37 |
|
||||||
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
|
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
|
||||||
| `comments` | Hides components related to comments. | 17.49.37 |
|
| `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-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-buffer` | Lets you change the buffers of videos. | 17.49.37 |
|
||||||
| `custom-video-speed` | Adds more video speed options. | 17.49.37 |
|
| `custom-video-speed` | Adds more video speed options. | 17.49.37 |
|
||||||
@@ -28,6 +29,7 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `hide-album-cards` | Hides the album cards below the artist description. | 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-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-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-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-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-create-button` | Hides the create button in the navigation bar. | 17.49.37 |
|
||||||
@@ -44,14 +46,16 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `microg-support` | Allows YouTube ReVanced to run without root and under a different package name with Vanced MicroG. | 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 |
|
| `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 |
|
| `old-quality-layout` | Enables the original video quality flyout in the video player settings | 17.49.37 |
|
||||||
| `open-links-directly` | Bypasses URL redirects and opens links directly inside YouTube app. | 17.49.37 |
|
| `open-links-directly` | Bypasses https://youtube.com/redirect URLs. | 17.49.37 |
|
||||||
| `premium-heading` | Shows premium branding on the home screen. | all |
|
| `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 |
|
| `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 |
|
| `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 |
|
| `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 |
|
| `seekbar-tapping` | Enables tap-to-seek on the seekbar of the video player. | 17.49.37 |
|
||||||
| `settings` | Adds settings for ReVanced to YouTube. | all |
|
| `settings` | Adds settings for ReVanced to YouTube. | all |
|
||||||
| `sponsorblock` | Integrate SponsorBlock. | 17.49.37 |
|
| `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 |
|
| `swipe-controls` | Adds volume and brightness swipe controls. | 17.49.37 |
|
||||||
| `tablet-mini-player` | Enables the tablet mini player layout. | 17.49.37 |
|
| `tablet-mini-player` | Enables the tablet mini player layout. | 17.49.37 |
|
||||||
| `theme` | Applies a custom theme. | all |
|
| `theme` | Applies a custom theme. | all |
|
||||||
@@ -63,16 +67,16 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `background-play` | Enables playing music in the background. | 5.36.51 |
|
| `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.36.51 |
|
| `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.36.51 |
|
| `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.36.51 |
|
| `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.36.51 |
|
| `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.36.51 |
|
| `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.36.51 |
|
| `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.36.51 |
|
| `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.36.51 |
|
| `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.36.51 |
|
| `upgrade-button-remover` | Removes the upgrade tab from the pivot bar. | 5.39.52 |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### [📦 `com.ss.android.ugc.trill`](https://play.google.com/store/apps/details?id=com.ss.android.ugc.trill)
|
### [📦 `com.ss.android.ugc.trill`](https://play.google.com/store/apps/details?id=com.ss.android.ugc.trill)
|
||||||
@@ -81,14 +85,14 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `disable-login-requirement` | Do not force login. | all |
|
| `disable-login-requirement` | Do not force login. | all |
|
||||||
| `downloads` | Removes download restrictions and changes the default path to download to. | 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. | all |
|
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | 27.8.3 |
|
||||||
| `fix-google-login` | Allows logging in with a Google account. | all |
|
| `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 |
|
||||||
| `settings` | Adds ReVanced settings to TikTok. | 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 |
|
||||||
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | all |
|
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | 27.8.3 |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### [📦 `com.zhiliaoapp.musically`](https://play.google.com/store/apps/details?id=com.zhiliaoapp.musically)
|
### [📦 `com.zhiliaoapp.musically`](https://play.google.com/store/apps/details?id=com.zhiliaoapp.musically)
|
||||||
@@ -97,14 +101,14 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `disable-login-requirement` | Do not force login. | all |
|
| `disable-login-requirement` | Do not force login. | all |
|
||||||
| `downloads` | Removes download restrictions and changes the default path to download to. | 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. | all |
|
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | 27.8.3 |
|
||||||
| `fix-google-login` | Allows logging in with a Google account. | all |
|
| `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 |
|
||||||
| `settings` | Adds ReVanced settings to TikTok. | 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 |
|
||||||
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | all |
|
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | 27.8.3 |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### [📦 `tv.twitch.android.app`](https://play.google.com/store/apps/details?id=tv.twitch.android.app)
|
### [📦 `tv.twitch.android.app`](https://play.google.com/store/apps/details?id=tv.twitch.android.app)
|
||||||
@@ -120,6 +124,17 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `show-deleted-messages` | Shows deleted chat messages behind a clickable spoiler. | all |
|
| `show-deleted-messages` | Shows deleted chat messages behind a clickable spoiler. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
### [📦 `com.twitter.android`](https://play.google.com/store/apps/details?id=com.twitter.android)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `dynamic-color` | Replaces the default Twitter Blue with the users Material You palette. | all |
|
||||||
|
| `hide-views-stats` | Hides the view stats under tweets. | 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>
|
||||||
|
|
||||||
### [📦 `com.spotify.music`](https://play.google.com/store/apps/details?id=com.spotify.music)
|
### [📦 `com.spotify.music`](https://play.google.com/store/apps/details?id=com.spotify.music)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
@@ -130,16 +145,6 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `spotify-theme` | Applies a custom theme. | all |
|
| `spotify-theme` | Applies a custom theme. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### [📦 `com.twitter.android`](https://play.google.com/store/apps/details?id=com.twitter.android)
|
|
||||||
<details>
|
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|
||||||
| `dynamic-color` | Replaces the default Twitter Blue with the users Material You palette. | 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>
|
|
||||||
|
|
||||||
### [📦 `com.reddit.frontpage`](https://play.google.com/store/apps/details?id=com.reddit.frontpage)
|
### [📦 `com.reddit.frontpage`](https://play.google.com/store/apps/details?id=com.reddit.frontpage)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
@@ -197,6 +202,14 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `promo-code-unlock` | Disables the validation of promo code. Any code will work to unlock all features. | all |
|
| `promo-code-unlock` | Disables the validation of promo code. Any code will work to unlock all features. | all |
|
||||||
</details>
|
</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>
|
||||||
|
|
||||||
### [📦 `co.windyapp.android`](https://play.google.com/store/apps/details?id=co.windyapp.android)
|
### [📦 `co.windyapp.android`](https://play.google.com/store/apps/details?id=co.windyapp.android)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
@@ -205,6 +218,14 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `unlock-pro` | Unlocks all pro features. | all |
|
| `unlock-pro` | Unlocks all pro features. | all |
|
||||||
</details>
|
</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)
|
### [📦 `org.totschnig.myexpenses`](https://play.google.com/store/apps/details?id=org.totschnig.myexpenses)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
@@ -213,14 +234,6 @@ 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>
|
||||||
|
|
||||||
### [📦 `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>
|
|
||||||
|
|
||||||
### [📦 `com.ithebk.expensemanager`](https://play.google.com/store/apps/details?id=com.ithebk.expensemanager)
|
### [📦 `com.ithebk.expensemanager`](https://play.google.com/store/apps/details?id=com.ithebk.expensemanager)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
@@ -229,14 +242,6 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `unlock-pro` | Unlocks pro features. | all |
|
| `unlock-pro` | Unlocks pro features. | all |
|
||||||
</details>
|
</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>
|
|
||||||
|
|
||||||
### [📦 `com.ticktick.task`](https://play.google.com/store/apps/details?id=com.ticktick.task)
|
### [📦 `com.ticktick.task`](https://play.google.com/store/apps/details?id=com.ticktick.task)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
@@ -245,6 +250,14 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `unlock-themes` | Unlocks all themes. | all |
|
| `unlock-themes` | Unlocks all themes. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
### [📦 `net.dinglisch.android.taskerm`](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `unlock-trial` | Unlocks the trial version. | all |
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 📝 JSON Format
|
## 📝 JSON Format
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation("app.revanced:revanced-patcher:6.3.2")
|
implementation("app.revanced:revanced-patcher:6.4.0")
|
||||||
implementation("app.revanced:multidexlib2:2.5.2.r2")
|
implementation("app.revanced:multidexlib2:2.5.2.r2")
|
||||||
// Required for meta
|
// Required for meta
|
||||||
implementation("com.google.code.gson:gson:2.10")
|
implementation("com.google.code.gson:gson:2.10")
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 2.146.0-dev.1
|
version = 2.155.0-dev.1
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,7 +21,9 @@ import app.revanced.patcher.annotation.Package
|
|||||||
"5.29.52",
|
"5.29.52",
|
||||||
"5.31.50",
|
"5.31.50",
|
||||||
"5.34.51",
|
"5.34.51",
|
||||||
"5.36.51"
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52"
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ import app.revanced.patcher.annotation.Package
|
|||||||
"5.29.52",
|
"5.29.52",
|
||||||
"5.31.50",
|
"5.31.50",
|
||||||
"5.34.51",
|
"5.34.51",
|
||||||
"5.36.51"
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52"
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ import app.revanced.patcher.annotation.Package
|
|||||||
"5.29.52",
|
"5.29.52",
|
||||||
"5.31.50",
|
"5.31.50",
|
||||||
"5.34.51",
|
"5.34.51",
|
||||||
"5.36.51"
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52"
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -20,7 +20,9 @@ import app.revanced.patcher.annotation.Package
|
|||||||
"5.29.52",
|
"5.29.52",
|
||||||
"5.31.50",
|
"5.31.50",
|
||||||
"5.34.51",
|
"5.34.51",
|
||||||
"5.36.51"
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52"
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ import app.revanced.patcher.annotation.Package
|
|||||||
"5.29.52",
|
"5.29.52",
|
||||||
"5.31.50",
|
"5.31.50",
|
||||||
"5.34.51",
|
"5.34.51",
|
||||||
"5.36.51"
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52"
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ import app.revanced.patcher.annotation.Package
|
|||||||
"5.29.52",
|
"5.29.52",
|
||||||
"5.31.50",
|
"5.31.50",
|
||||||
"5.34.51",
|
"5.34.51",
|
||||||
"5.36.51"
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52"
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -23,7 +23,9 @@ import app.revanced.patcher.annotation.Package
|
|||||||
"5.29.52",
|
"5.29.52",
|
||||||
"5.31.50",
|
"5.31.50",
|
||||||
"5.34.51",
|
"5.34.51",
|
||||||
"5.36.51"
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52"
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ import app.revanced.patcher.annotation.Package
|
|||||||
"5.29.52",
|
"5.29.52",
|
||||||
"5.31.50",
|
"5.31.50",
|
||||||
"5.34.51",
|
"5.34.51",
|
||||||
"5.36.51"
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52"
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ import app.revanced.patcher.annotation.Package
|
|||||||
"5.29.52",
|
"5.29.52",
|
||||||
"5.31.50",
|
"5.31.50",
|
||||||
"5.34.51",
|
"5.34.51",
|
||||||
"5.36.51"
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52"
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ import app.revanced.patcher.annotation.Package
|
|||||||
"5.29.52",
|
"5.29.52",
|
||||||
"5.31.50",
|
"5.31.50",
|
||||||
"5.34.51",
|
"5.34.51",
|
||||||
"5.36.51"
|
"5.36.51",
|
||||||
|
"5.38.53",
|
||||||
|
"5.39.52"
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ object AboutViewFingerprint : MethodFingerprint(
|
|||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.NEW_INSTANCE,
|
Opcode.NEW_INSTANCE,
|
||||||
Opcode.INVOKE_DIRECT,
|
Opcode.INVOKE_DIRECT,
|
||||||
Opcode.MOVE,
|
|
||||||
Opcode.INVOKE_DIRECT_RANGE,
|
Opcode.INVOKE_DIRECT_RANGE,
|
||||||
Opcode.INVOKE_DIRECT,
|
Opcode.INVOKE_DIRECT,
|
||||||
Opcode.IPUT_OBJECT,
|
Opcode.IPUT_OBJECT,
|
||||||
@@ -18,8 +17,7 @@ object AboutViewFingerprint : MethodFingerprint(
|
|||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.NEW_INSTANCE,
|
Opcode.SGET_OBJECT,
|
||||||
Opcode.INVOKE_DIRECT,
|
|
||||||
Opcode.INVOKE_STATIC,
|
Opcode.INVOKE_STATIC,
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.NEW_INSTANCE,
|
Opcode.NEW_INSTANCE,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package app.revanced.patches.twitter.layout.hideviews.annotations
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
|
@Compatibility([Package("com.twitter.android")])
|
||||||
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,6 +17,7 @@ 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 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
|
||||||
@@ -24,7 +25,7 @@ import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
|||||||
|
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@DependsOn([GeneralAdsResourcePatch::class, VerticalScrollPatch::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"),
|
||||||
|
|||||||
@@ -16,12 +16,11 @@ 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.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.fix.playback.patch.FixPlaybackPatch
|
|
||||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
|
|
||||||
@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()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -45,7 +45,7 @@ class HideInfocardsPatch : BytecodePatch(
|
|||||||
"Landroid/view/View;->setVisibility(I)V")
|
"Landroid/view/View;->setVisibility(I)V")
|
||||||
}
|
}
|
||||||
|
|
||||||
replaceInstruction(
|
addInstructions(
|
||||||
invokeInstructionIndex,
|
invokeInstructionIndex,
|
||||||
"invoke-static {v${(instruction(invokeInstructionIndex) as? BuilderInstruction35c)?.registerC}}," +
|
"invoke-static {v${(instruction(invokeInstructionIndex) as? BuilderInstruction35c)?.registerC}}," +
|
||||||
" Lapp/revanced/integrations/patches/HideInfocardsPatch;->hideInfocardsIncognito(Landroid/view/View;)V"
|
" Lapp/revanced/integrations/patches/HideInfocardsPatch;->hideInfocardsIncognito(Landroid/view/View;)V"
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package app.revanced.patches.youtube.layout.homepage.breakingnews.annotations
|
||||||
|
|
||||||
|
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 BreakingNewsCompatibility
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package app.revanced.patches.youtube.layout.homepage.breakingnews.bytecode.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import app.revanced.patches.youtube.layout.homepage.breakingnews.resource.patch.BreakingNewsResourcePatch
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
||||||
|
|
||||||
|
object BreakingNewsFingerprint : MethodFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.CONST,
|
||||||
|
Opcode.CONST_4,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.CHECK_CAST,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
),
|
||||||
|
customFingerprint = { methodDef ->
|
||||||
|
methodDef.implementation?.instructions?.any { instruction ->
|
||||||
|
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
||||||
|
(instruction as? WideLiteralInstruction)?.wideLiteral == BreakingNewsResourcePatch.horizontalCardListId
|
||||||
|
} == true
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package app.revanced.patches.youtube.layout.homepage.breakingnews.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.extensions.addInstruction
|
||||||
|
import app.revanced.patcher.extensions.instruction
|
||||||
|
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.layout.homepage.breakingnews.annotations.BreakingNewsCompatibility
|
||||||
|
import app.revanced.patches.youtube.layout.homepage.breakingnews.bytecode.fingerprints.BreakingNewsFingerprint
|
||||||
|
import app.revanced.patches.youtube.layout.homepage.breakingnews.resource.patch.BreakingNewsResourcePatch
|
||||||
|
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||||
|
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@DependsOn([IntegrationsPatch::class, BreakingNewsResourcePatch::class])
|
||||||
|
@Name("hide-breaking-news-shelf")
|
||||||
|
@Description("Hides the breaking news shelf on the homepage tab.")
|
||||||
|
@BreakingNewsCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class BreakingNewsPatch : BytecodePatch(
|
||||||
|
listOf(
|
||||||
|
BreakingNewsFingerprint,
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
val breakingNewsResult = BreakingNewsFingerprint.result!!
|
||||||
|
val breakingNewsMethod = breakingNewsResult.mutableMethod
|
||||||
|
|
||||||
|
val moveResultObjectIndex =
|
||||||
|
breakingNewsResult.scanResult.patternScanResult!!.endIndex - 2
|
||||||
|
|
||||||
|
breakingNewsMethod.addInstruction(
|
||||||
|
moveResultObjectIndex + 1, """
|
||||||
|
invoke-static {v${(breakingNewsMethod.instruction(moveResultObjectIndex) as OneRegisterInstruction).registerA}}, Lapp/revanced/integrations/patches/HideBreakingNewsPatch;->hideBreakingNews(Landroid/view/View;)V
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package app.revanced.patches.youtube.layout.homepage.breakingnews.resource.patch
|
||||||
|
|
||||||
|
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.mapping.misc.patch.ResourceMappingPatch
|
||||||
|
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
|
||||||
|
|
||||||
|
@Name("breaking-news-shelf-resource-patch")
|
||||||
|
@DependsOn([SettingsPatch::class, ResourceMappingPatch::class])
|
||||||
|
@Version("0.0.1")
|
||||||
|
class BreakingNewsResourcePatch : ResourcePatch {
|
||||||
|
companion object {
|
||||||
|
internal var horizontalCardListId: Long = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun execute(context: ResourceContext): PatchResult {
|
||||||
|
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_hide_breaking_news",
|
||||||
|
StringResource("revanced_hide_breaking_news_title", "Hide breaking news"),
|
||||||
|
true,
|
||||||
|
StringResource("revanced_hide_breaking_news_summary_on", "Breaking news are hidden"),
|
||||||
|
StringResource("revanced_hide_breaking_news_summary_off", "Breaking news are shown")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
horizontalCardListId = ResourceMappingPatch.resourceMappings.single {
|
||||||
|
it.type == "layout" && it.name == "horizontal_card_list"
|
||||||
|
}.id
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -59,7 +59,9 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
|
|||||||
|
|
||||||
val conversionContextParam = 5
|
val conversionContextParam = 5
|
||||||
val textRefParam = createComponentMethod.parameters.size - 2
|
val textRefParam = createComponentMethod.parameters.size - 2
|
||||||
val insertIndex = scanResult.stringsScanResult!!.matches.first().index - 2
|
// insert index must be 0, otherwise UI does not updated correctly in some situations
|
||||||
|
// such as switching from full screen or when using previous/next overlay buttons.
|
||||||
|
val insertIndex = 0
|
||||||
|
|
||||||
createComponentMethod.addInstructions(
|
createComponentMethod.addInstructions(
|
||||||
insertIndex,
|
insertIndex,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package app.revanced.patches.youtube.misc.fix.playback.annotations
|
package app.revanced.patches.youtube.layout.spoofappversion.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
|
||||||
@@ -10,4 +10,5 @@ import app.revanced.patcher.annotation.Package
|
|||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
internal annotation class FixPlaybackCompatibility
|
internal annotation class SpoofAppVersionCompatibility
|
||||||
|
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package app.revanced.patches.youtube.layout.spoofappversion.bytecode.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 SpoofAppVersionFingerprint : MethodFingerprint(
|
||||||
|
"L", AccessFlags.PUBLIC or AccessFlags.STATIC, listOf("L"), listOf(
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.GOTO,
|
||||||
|
Opcode.CONST_STRING,
|
||||||
|
),
|
||||||
|
|
||||||
|
// Instead of applying a bytecode patch, it might be possible to only rely on code from the integrations and
|
||||||
|
// manually set the desired version string as this keyed value in the SharedPreferences.
|
||||||
|
// But, this bytecode patch is simple and it works.
|
||||||
|
strings = listOf("pref_override_build_version_name")
|
||||||
|
)
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
package app.revanced.patches.youtube.layout.spoofappversion.bytecode.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.DependsOn
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
||||||
|
import app.revanced.patches.youtube.layout.spoofappversion.annotations.SpoofAppVersionCompatibility
|
||||||
|
import app.revanced.patches.youtube.layout.spoofappversion.bytecode.fingerprints.SpoofAppVersionFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||||
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
|
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
|
||||||
|
@Name("spoof-app-version")
|
||||||
|
@Description("Tricks YouTube into thinking, you are running an older version of the app. One of the side effects also includes restoring the old UI.")
|
||||||
|
@SpoofAppVersionCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class SpoofAppVersionPatch : BytecodePatch(
|
||||||
|
listOf(
|
||||||
|
SpoofAppVersionFingerprint
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
companion object {
|
||||||
|
const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/SpoofAppVersionPatch"
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_spoof_app_version",
|
||||||
|
StringResource("revanced_spoof_app_version_title", "Spoof app version"),
|
||||||
|
false,
|
||||||
|
StringResource("revanced_spoof_app_version_summary_on", "Version spoofed to 17.30.34. If switched off, the old UI layout may remain until logging out or clearing app data"),
|
||||||
|
StringResource("revanced_spoof_app_version_summary_off", "Version not spoofed")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
SpoofAppVersionFingerprint.result?.apply {
|
||||||
|
val insertIndex = scanResult.patternScanResult!!.startIndex + 1
|
||||||
|
val buildOverrideNameRegister =
|
||||||
|
(mutableMethod.implementation!!.instructions[insertIndex - 1] as OneRegisterInstruction).registerA
|
||||||
|
|
||||||
|
mutableMethod.addInstructions(
|
||||||
|
insertIndex,
|
||||||
|
"""
|
||||||
|
invoke-static {v$buildOverrideNameRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR;->getYouTubeVersionOverride(Ljava/lang/String;)Ljava/lang/String;
|
||||||
|
move-result-object v$buildOverrideNameRegister
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
} ?: return SpoofAppVersionFingerprint.toErrorResult()
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,7 +13,7 @@ import app.revanced.util.resources.ResourceUtils
|
|||||||
import app.revanced.util.resources.ResourceUtils.copyResources
|
import app.revanced.util.resources.ResourceUtils.copyResources
|
||||||
import org.w3c.dom.Element
|
import org.w3c.dom.Element
|
||||||
|
|
||||||
@Patch(include = false)
|
@Patch
|
||||||
@DependsOn([LithoThemePatch::class, FixLocaleConfigErrorPatch::class])
|
@DependsOn([LithoThemePatch::class, FixLocaleConfigErrorPatch::class])
|
||||||
@Name("theme")
|
@Name("theme")
|
||||||
@Description("Applies a custom theme.")
|
@Description("Applies a custom theme.")
|
||||||
@@ -23,6 +23,7 @@ class ThemePatch : ResourcePatch {
|
|||||||
override fun execute(context: ResourceContext): PatchResult {
|
override fun execute(context: ResourceContext): PatchResult {
|
||||||
val darkThemeBackgroundColor = darkThemeBackgroundColor!!
|
val darkThemeBackgroundColor = darkThemeBackgroundColor!!
|
||||||
val lightThemeBackgroundColor = lightThemeBackgroundColor!!
|
val lightThemeBackgroundColor = lightThemeBackgroundColor!!
|
||||||
|
val darkThemeSeekbarColor = darkThemeSeekbarColor!!
|
||||||
|
|
||||||
context.xmlEditor["res/values/colors.xml"].use { editor ->
|
context.xmlEditor["res/values/colors.xml"].use { editor ->
|
||||||
val resourcesNode = editor.file.getElementsByTagName("resources").item(0) as Element
|
val resourcesNode = editor.file.getElementsByTagName("resources").item(0) as Element
|
||||||
@@ -31,22 +32,20 @@ class ThemePatch : ResourcePatch {
|
|||||||
val node = resourcesNode.childNodes.item(i) as? Element ?: continue
|
val node = resourcesNode.childNodes.item(i) as? Element ?: continue
|
||||||
|
|
||||||
node.textContent = when (node.getAttribute("name")) {
|
node.textContent = when (node.getAttribute("name")) {
|
||||||
"yt_black0", "yt_black1", "yt_black1_opacity95", "yt_black1_opacity98", "yt_black2", "yt_black3",
|
"yt_black0", "yt_black1", "yt_black1_opacity95", "yt_black1_opacity98", "yt_black2", "yt_black3", "yt_black4", "yt_status_bar_background_dark", "material_grey_850" -> darkThemeBackgroundColor
|
||||||
"yt_black4", "yt_status_bar_background_dark", "material_grey_100", "material_grey_50",
|
|
||||||
"material_grey_600", "material_grey_800", "material_grey_850", "material_grey_900",
|
|
||||||
"material_grey_white_1000", "sud_glif_v3_dialog_background_color_dark" -> darkThemeBackgroundColor
|
|
||||||
|
|
||||||
"yt_white1", "yt_white1_opacity95", "yt_white1_opacity98", "yt_white2", "yt_white3", "yt_white4",
|
"yt_white1", "yt_white1_opacity95", "yt_white1_opacity98", "yt_white2", "yt_white3", "yt_white4",
|
||||||
"sud_glif_v3_dialog_background_color_light" -> lightThemeBackgroundColor
|
-> lightThemeBackgroundColor
|
||||||
|
|
||||||
|
"inline_time_bar_colorized_bar_played_color_dark" -> darkThemeSeekbarColor
|
||||||
else -> continue
|
else -> continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// copies the resource file to change the splash screen color
|
// copies the resource file to change the splash screen color
|
||||||
context.copyResources("theme",
|
context.copyResources(
|
||||||
ResourceUtils.ResourceGroup("values-night-v31", "styles.xml")
|
"theme", ResourceUtils.ResourceGroup("values-night-v31", "styles.xml")
|
||||||
)
|
)
|
||||||
|
|
||||||
return PatchResultSuccess()
|
return PatchResultSuccess()
|
||||||
@@ -70,5 +69,14 @@ class ThemePatch : ResourcePatch {
|
|||||||
description = "The background color of the light theme. Can be a hex color or a resource reference.",
|
description = "The background color of the light theme. Can be a hex color or a resource reference.",
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var darkThemeSeekbarColor: String? by option(
|
||||||
|
PatchOption.StringOption(
|
||||||
|
key = "darkThemeSeekbarColor",
|
||||||
|
default = "#ffff0000",
|
||||||
|
title = "Dark theme seekbar color",
|
||||||
|
description = "The background color of the seekbar of the dark theme. Leave empty for default color.",
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.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 FixBackToExitGestureCompatibility
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object OnBackPressedFingerprint : MethodFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.RETURN_VOID
|
||||||
|
),
|
||||||
|
customFingerprint = { methodDef ->
|
||||||
|
methodDef.definingClass.endsWith("WatchWhileActivity;")
|
||||||
|
&& methodDef.name == "onBackPressed"
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object RecyclerViewScrollingFingerprint : MethodFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.IF_EQZ,
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.CHECK_CAST,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.MOVE_RESULT,
|
||||||
|
Opcode.IF_LEZ,
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.CONST_4,
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.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 RecyclerViewTopScrollingFingerprint : MethodFingerprint(
|
||||||
|
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf(), listOf(
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.IF_EQZ,
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.INVOKE_INTERFACE,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.INVOKE_INTERFACE,
|
||||||
|
Opcode.MOVE_RESULT,
|
||||||
|
Opcode.IF_EQZ,
|
||||||
|
Opcode.INVOKE_INTERFACE,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.CHECK_CAST,
|
||||||
|
Opcode.CONST_4,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.GOTO,
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.INVOKE_INTERFACE,
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object RecyclerViewTopScrollingParentFingerprint : MethodFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.INVOKE_DIRECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.CONST_16,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.NEW_INSTANCE
|
||||||
|
),
|
||||||
|
customFingerprint = { methodDef ->
|
||||||
|
methodDef.name == "<init>"
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.toErrorResult
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.addInstruction
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultError
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.annotation.FixBackToExitGestureCompatibility
|
||||||
|
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.OnBackPressedFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewScrollingFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewTopScrollingFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewTopScrollingParentFingerprint
|
||||||
|
|
||||||
|
@Description("Fixes the swipe back to exit gesture.")
|
||||||
|
@FixBackToExitGestureCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class FixBackToExitGesturePatch : BytecodePatch(
|
||||||
|
listOf(
|
||||||
|
RecyclerViewTopScrollingParentFingerprint,
|
||||||
|
RecyclerViewScrollingFingerprint,
|
||||||
|
OnBackPressedFingerprint,
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
RecyclerViewTopScrollingFingerprint.apply {
|
||||||
|
resolve(
|
||||||
|
context,
|
||||||
|
RecyclerViewTopScrollingParentFingerprint.result?.classDef
|
||||||
|
?: return RecyclerViewTopScrollingParentFingerprint.toErrorResult()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
mapOf(
|
||||||
|
RecyclerViewTopScrollingFingerprint to IntegrationsMethod(
|
||||||
|
methodName = "onTopView"
|
||||||
|
),
|
||||||
|
RecyclerViewScrollingFingerprint to IntegrationsMethod(
|
||||||
|
methodName = "onScrollingViews"
|
||||||
|
),
|
||||||
|
OnBackPressedFingerprint to IntegrationsMethod(
|
||||||
|
"p0", "onBackPressed", "Lcom/google/android/apps/youtube/app/watchwhile/WatchWhileActivity;"
|
||||||
|
)
|
||||||
|
).forEach { (fingerprint, target) ->
|
||||||
|
try {
|
||||||
|
fingerprint.injectCall(target)
|
||||||
|
} catch (error: PatchResultError) {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
|
||||||
|
private companion object {
|
||||||
|
/**
|
||||||
|
* A reference to a method from the integrations for [FixBackToExitGesturePatch].
|
||||||
|
*
|
||||||
|
* @param register The method registers.
|
||||||
|
* @param methodName The method name.
|
||||||
|
* @param parameterTypes The parameters of the method.
|
||||||
|
*/
|
||||||
|
data class IntegrationsMethod(
|
||||||
|
val register: String = "", val methodName: String, val parameterTypes: String = ""
|
||||||
|
) {
|
||||||
|
override fun toString() =
|
||||||
|
"invoke-static {$register}, Lapp/revanced/integrations/patches/FixBackToExitGesturePatch;->$methodName($parameterTypes)V"
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inject a call to a method from the integrations.
|
||||||
|
*
|
||||||
|
* @param targetMethod The target method to call.
|
||||||
|
*/
|
||||||
|
fun MethodFingerprint.injectCall(targetMethod: IntegrationsMethod) = result?.apply {
|
||||||
|
mutableMethod.addInstruction(
|
||||||
|
scanResult.patternScanResult!!.endIndex, targetMethod.toString()
|
||||||
|
)
|
||||||
|
} ?: throw this.toErrorResult()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
package app.revanced.patches.youtube.misc.fix.playback.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.StringResource
|
|
||||||
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
|
||||||
import app.revanced.patches.youtube.misc.fix.playback.annotations.FixPlaybackCompatibility
|
|
||||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
|
||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
|
||||||
import app.revanced.patches.youtube.misc.video.information.patch.VideoInformationPatch
|
|
||||||
import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
|
|
||||||
|
|
||||||
@DependsOn([
|
|
||||||
IntegrationsPatch::class,
|
|
||||||
VideoInformationPatch::class, // updates video length and adds method to seek in video, necessary for this patch
|
|
||||||
SettingsPatch::class,
|
|
||||||
VideoIdPatch::class
|
|
||||||
])
|
|
||||||
@Name("fix-playback")
|
|
||||||
@Description("Fixes the issue with videos not playing when video ads are removed.")
|
|
||||||
@FixPlaybackCompatibility
|
|
||||||
@Version("0.0.1")
|
|
||||||
class FixPlaybackPatch : ResourcePatch {
|
|
||||||
override fun execute(context: ResourceContext): PatchResult {
|
|
||||||
SettingsPatch.PreferenceScreen.MISC.addPreferences(
|
|
||||||
SwitchPreference(
|
|
||||||
"revanced_fix_playback",
|
|
||||||
StringResource("revanced_fix_playback_title", "Fix video playback issues"),
|
|
||||||
false,
|
|
||||||
StringResource(
|
|
||||||
"revanced_fix_playback_summary_on",
|
|
||||||
"The fix is enabled"
|
|
||||||
),
|
|
||||||
StringResource(
|
|
||||||
"revanced_fix_playback_summary_off",
|
|
||||||
"The fix is disabled"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
// If a new video loads, fix the playback issue
|
|
||||||
VideoIdPatch.injectCall("Lapp/revanced/integrations/patches/FixPlaybackPatch;->newVideoLoaded(Ljava/lang/String;)V")
|
|
||||||
|
|
||||||
return PatchResultSuccess()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,6 +7,11 @@ import org.jf.dexlib2.Opcode
|
|||||||
object CanScrollVerticallyFingerprint : MethodFingerprint(
|
object CanScrollVerticallyFingerprint : MethodFingerprint(
|
||||||
"Z",
|
"Z",
|
||||||
parameters = emptyList(),
|
parameters = emptyList(),
|
||||||
opcodes = listOf(Opcode.INSTANCE_OF),
|
opcodes = listOf(
|
||||||
|
Opcode.MOVE_RESULT,
|
||||||
|
Opcode.RETURN,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.MOVE_RESULT,
|
||||||
|
),
|
||||||
customFingerprint = { methodDef -> methodDef.definingClass.endsWith("SwipeRefreshLayout;") }
|
customFingerprint = { methodDef -> methodDef.definingClass.endsWith("SwipeRefreshLayout;") }
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,12 +4,14 @@ import app.revanced.extensions.toErrorResult
|
|||||||
import app.revanced.patcher.annotation.Description
|
import app.revanced.patcher.annotation.Description
|
||||||
import app.revanced.patcher.annotation.Version
|
import app.revanced.patcher.annotation.Version
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.addInstructions
|
import app.revanced.patcher.extensions.addInstruction
|
||||||
|
import app.revanced.patcher.extensions.instruction
|
||||||
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.PatchResultSuccess
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
import app.revanced.patches.youtube.misc.fix.verticalscroll.annotations.VerticalScrollCompatibility
|
import app.revanced.patches.youtube.misc.fix.verticalscroll.annotations.VerticalScrollCompatibility
|
||||||
import app.revanced.patches.youtube.misc.fix.verticalscroll.fingerprints.CanScrollVerticallyFingerprint
|
import app.revanced.patches.youtube.misc.fix.verticalscroll.fingerprints.CanScrollVerticallyFingerprint
|
||||||
|
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
|
|
||||||
@Description("Fixes issues with scrolling on the home screen when the first component is of type EmptyComponent.")
|
@Description("Fixes issues with scrolling on the home screen when the first component is of type EmptyComponent.")
|
||||||
@VerticalScrollCompatibility
|
@VerticalScrollCompatibility
|
||||||
@@ -20,13 +22,17 @@ class VerticalScrollPatch : BytecodePatch(
|
|||||||
override fun execute(context: BytecodeContext): PatchResult {
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
val result = CanScrollVerticallyFingerprint.result ?: return CanScrollVerticallyFingerprint.toErrorResult()
|
val result = CanScrollVerticallyFingerprint.result ?: return CanScrollVerticallyFingerprint.toErrorResult()
|
||||||
|
|
||||||
result.mutableMethod.addInstructions(
|
with(result) {
|
||||||
0,
|
val method = mutableMethod
|
||||||
"""
|
|
||||||
const/4 v0, 0x0
|
val moveResultIndex = scanResult.patternScanResult!!.endIndex
|
||||||
return v0
|
val moveResultRegister = (method.instruction(moveResultIndex) as OneRegisterInstruction).registerA
|
||||||
"""
|
|
||||||
)
|
method.addInstruction(
|
||||||
|
moveResultIndex + 1,
|
||||||
|
"const/4 v$moveResultRegister, 0x0"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
return PatchResultSuccess()
|
return PatchResultSuccess()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
|||||||
@Patch
|
@Patch
|
||||||
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
|
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
|
||||||
@Name("open-links-directly")
|
@Name("open-links-directly")
|
||||||
@Description("Bypasses URL redirects and opens links directly inside YouTube app.")
|
@Description("Bypasses https://youtube.com/redirect URLs.")
|
||||||
@OpenLinksDirectlyCompatibility
|
@OpenLinksDirectlyCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
class OpenLinksDirectlyPatch : BytecodePatch(
|
class OpenLinksDirectlyPatch : BytecodePatch(
|
||||||
@@ -37,10 +37,10 @@ class OpenLinksDirectlyPatch : BytecodePatch(
|
|||||||
SettingsPatch.PreferenceScreen.MISC.addPreferences(
|
SettingsPatch.PreferenceScreen.MISC.addPreferences(
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_uri_redirect",
|
"revanced_uri_redirect",
|
||||||
StringResource("revanced_uri_redirect_title", "Open YouTube links inside app"),
|
StringResource("revanced_uri_redirect_title", "Bypass URL redirects"),
|
||||||
true,
|
true,
|
||||||
StringResource("revanced_uri_redirect_summary_on", "Links opened inside YouTube ReVanced"),
|
StringResource("revanced_uri_redirect_summary_on", "Bypassing URL redirects"),
|
||||||
StringResource("revanced_uri_redirect_summary_off", "Links opened in web browser")
|
StringResource("revanced_uri_redirect_summary_off", "Following default redirect policy")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -67,8 +67,8 @@ class BottomControlsResourcePatch : ResourcePatch {
|
|||||||
element.attributes.getNamedItem("yt:layout_constraintRight_toLeftOf").nodeValue =
|
element.attributes.getNamedItem("yt:layout_constraintRight_toLeftOf").nodeValue =
|
||||||
"$namespace/$lastLeftOf"
|
"$namespace/$lastLeftOf"
|
||||||
|
|
||||||
// set lastLeftOf attribute to the the current element
|
// set lastLeftOf attribute to the current element
|
||||||
val nameSpaceLength = 4
|
val nameSpaceLength = 5
|
||||||
lastLeftOf = element.attributes.getNamedItem("android:id").nodeValue.substring(nameSpaceLength)
|
lastLeftOf = element.attributes.getNamedItem("android:id").nodeValue.substring(nameSpaceLength)
|
||||||
|
|
||||||
// copy the element
|
// copy the element
|
||||||
@@ -82,4 +82,4 @@ class BottomControlsResourcePatch : ResourcePatch {
|
|||||||
override fun close() {
|
override fun close() {
|
||||||
targetXmlEditor.close()
|
targetXmlEditor.close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMu
|
|||||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||||
import app.revanced.patches.youtube.misc.video.information.annotation.VideoInformationCompatibility
|
import app.revanced.patches.youtube.misc.video.information.annotation.VideoInformationCompatibility
|
||||||
import app.revanced.patches.youtube.misc.video.information.fingerprints.*
|
import app.revanced.patches.youtube.misc.video.information.fingerprints.*
|
||||||
|
import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.builder.MutableMethodImplementation
|
import org.jf.dexlib2.builder.MutableMethodImplementation
|
||||||
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
@@ -31,7 +32,7 @@ import org.jf.dexlib2.util.MethodUtil
|
|||||||
@Description("Hooks YouTube to get information about the current playing video.")
|
@Description("Hooks YouTube to get information about the current playing video.")
|
||||||
@VideoInformationCompatibility
|
@VideoInformationCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
@DependsOn([IntegrationsPatch::class])
|
@DependsOn([IntegrationsPatch::class, VideoIdPatch::class])
|
||||||
class VideoInformationPatch : BytecodePatch(
|
class VideoInformationPatch : BytecodePatch(
|
||||||
listOf(
|
listOf(
|
||||||
PlayerInitFingerprint,
|
PlayerInitFingerprint,
|
||||||
@@ -94,6 +95,11 @@ class VideoInformationPatch : BytecodePatch(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Inject call for video id
|
||||||
|
*/
|
||||||
|
VideoIdPatch.injectCall("$INTEGRATIONS_CLASS_DESCRIPTOR->setVideoId(Ljava/lang/String;)V")
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set the video time method
|
Set the video time method
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -12,14 +12,14 @@ 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.patches.shared.settings.preference.impl.StringResource
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
||||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||||
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
import app.revanced.patches.youtube.misc.video.quality.annotations.RememberVideoQualityCompatibility
|
import app.revanced.patches.youtube.misc.video.quality.annotations.RememberVideoQualityCompatibility
|
||||||
import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoQualityReferenceFingerprint
|
import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoQualityReferenceFingerprint
|
||||||
import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoQualitySetterFingerprint
|
import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoQualitySetterFingerprint
|
||||||
import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoUserQualityChangeFingerprint
|
import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoUserQualityChangeFingerprint
|
||||||
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
|
|
||||||
import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
|
import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
|
||||||
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
||||||
import org.jf.dexlib2.iface.reference.FieldReference
|
import org.jf.dexlib2.iface.reference.FieldReference
|
||||||
@@ -47,7 +47,7 @@ class RememberVideoQualityPatch : BytecodePatch(
|
|||||||
),
|
),
|
||||||
StringResource(
|
StringResource(
|
||||||
"revanced_remember_video_quality_last_selected_summary_off",
|
"revanced_remember_video_quality_last_selected_summary_off",
|
||||||
"Quality changes only apply to the current video and are reverted back to the last remembered quality for future playbacks"
|
"Quality changes only apply to the current video"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.video.speed.remember.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 RememberPlaybackRateCompatibility
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.video.speed.remember.fingerprint
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
|
||||||
|
object ChangePlaybackRateFragmentStateFingerprint : MethodFingerprint(
|
||||||
|
"V",
|
||||||
|
strings = listOf("PLAYBACK_RATE_MENU_BOTTOM_SHEET_FRAGMENT")
|
||||||
|
)
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.video.speed.remember.fingerprint
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
|
||||||
|
object InitializePlaybackRateValuesFingerprint : MethodFingerprint(
|
||||||
|
parameters = listOf("[L", "I")
|
||||||
|
)
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.video.speed.remember.fingerprint
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object OnPlaybackRateItemClickFingerprint : MethodFingerprint(
|
||||||
|
customFingerprint = { it.name == "onItemClick" },
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.INVOKE_VIRTUAL
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.video.speed.remember.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.extensions.addInstructions
|
||||||
|
import app.revanced.patcher.extensions.instruction
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
|
||||||
|
import app.revanced.patcher.patch.*
|
||||||
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
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.misc.integrations.patch.IntegrationsPatch
|
||||||
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
|
import app.revanced.patches.youtube.misc.video.speed.remember.annotation.RememberPlaybackRateCompatibility
|
||||||
|
import app.revanced.patches.youtube.misc.video.speed.remember.fingerprint.ChangePlaybackRateFragmentStateFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.video.speed.remember.fingerprint.InitializePlaybackRateValuesFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.video.speed.remember.fingerprint.OnPlaybackRateItemClickFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||||
|
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("remember-playback-rate")
|
||||||
|
@Description("Adds the ability to remember the playback rate you chose in the video playback rate flyout.")
|
||||||
|
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
|
||||||
|
@RememberPlaybackRateCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class RememberPlaybackRatePatch : BytecodePatch(
|
||||||
|
listOf(ChangePlaybackRateFragmentStateFingerprint)
|
||||||
|
) {
|
||||||
|
private companion object {
|
||||||
|
const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||||
|
"Lapp/revanced/integrations/patches/playback/speed/RememberPlaybackRatePatch;"
|
||||||
|
|
||||||
|
fun MethodFingerprint.getReference(offsetFromPatternScanResultStartIndex: Int = 0) = this.result!!.let {
|
||||||
|
val referenceInstruction = it.mutableMethod
|
||||||
|
.instruction(it.scanResult.patternScanResult!!.startIndex + offsetFromPatternScanResultStartIndex) as ReferenceInstruction
|
||||||
|
referenceInstruction.reference.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun BytecodeContext.resolveFingerprints() {
|
||||||
|
ChangePlaybackRateFragmentStateFingerprint.result?.also {
|
||||||
|
fun MethodFingerprint.resolve() = resolve(this@resolveFingerprints, it.classDef)
|
||||||
|
|
||||||
|
OnPlaybackRateItemClickFingerprint.resolve()
|
||||||
|
InitializePlaybackRateValuesFingerprint.resolve()
|
||||||
|
|
||||||
|
} ?: throw ChangePlaybackRateFragmentStateFingerprint.toErrorResult()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
SettingsPatch.PreferenceScreen.MISC.addPreferences(
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_remember_playback_rate_last_selected",
|
||||||
|
StringResource("revanced_remember_playback_rate_last_selected_title", "Remember playback rate changes"),
|
||||||
|
true,
|
||||||
|
StringResource(
|
||||||
|
"revanced_remember_playback_rate_last_selected_summary_on",
|
||||||
|
"Playback rate changes apply to all videos"
|
||||||
|
),
|
||||||
|
StringResource(
|
||||||
|
"revanced_remember_playback_rate_last_selected_summary_off",
|
||||||
|
"Playback rate changes only apply to the current video"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
context.resolveFingerprints()
|
||||||
|
|
||||||
|
// Set the remembered playback rate.
|
||||||
|
InitializePlaybackRateValuesFingerprint.result!!.apply {
|
||||||
|
// Infer everything necessary for setPlaybackRate()
|
||||||
|
|
||||||
|
val playbackHandlerWrapperFieldReference =
|
||||||
|
(object : MethodFingerprint(opcodes = listOf(Opcode.IF_EQZ)) {}).apply {
|
||||||
|
OnPlaybackRateItemClickFingerprint.result!!.apply {
|
||||||
|
resolve(
|
||||||
|
context,
|
||||||
|
method,
|
||||||
|
classDef
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}.getReference(-1)
|
||||||
|
val playbackHandlerWrapperImplementorClassReference = OnPlaybackRateItemClickFingerprint
|
||||||
|
.getReference(-1)
|
||||||
|
val playbackHandlerFieldReference = OnPlaybackRateItemClickFingerprint
|
||||||
|
.getReference()
|
||||||
|
val setPlaybackRateMethodReference = OnPlaybackRateItemClickFingerprint
|
||||||
|
.getReference(1)
|
||||||
|
|
||||||
|
mutableMethod.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->getRememberedPlaybackRate()F
|
||||||
|
move-result v0
|
||||||
|
|
||||||
|
# check if the playback rate is below 0 (when a playback rate was never remembered)
|
||||||
|
|
||||||
|
const/4 v1, 0x0
|
||||||
|
cmpg-float v1, v0, v1
|
||||||
|
if-lez v1, :do_not_override
|
||||||
|
|
||||||
|
# invoke setPlaybackRate
|
||||||
|
|
||||||
|
iget-object v1, p0, $playbackHandlerWrapperFieldReference
|
||||||
|
check-cast v1, $playbackHandlerWrapperImplementorClassReference
|
||||||
|
iget-object v2, v1, $playbackHandlerFieldReference
|
||||||
|
invoke-virtual {v2, v0}, $setPlaybackRateMethodReference
|
||||||
|
""".trimIndent(),
|
||||||
|
listOf(ExternalLabel("do_not_override", mutableMethod.instruction(0)))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remember the selected playback rate.
|
||||||
|
OnPlaybackRateItemClickFingerprint.result!!.apply {
|
||||||
|
val setPlaybackRateIndex = scanResult.patternScanResult!!.endIndex
|
||||||
|
val selectedPlaybackRateRegister =
|
||||||
|
(mutableMethod.instruction(setPlaybackRateIndex) as FiveRegisterInstruction).registerD
|
||||||
|
|
||||||
|
mutableMethod.addInstruction(
|
||||||
|
setPlaybackRateIndex,
|
||||||
|
"invoke-static { v$selectedPlaybackRateRegister }, $INTEGRATIONS_CLASS_DESCRIPTOR->rememberPlaybackRate(F)V"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:pathData="M 6.8 19.5 C 6.5 19.5 6.2 19.399 6 19.199 C 5.8 19 5.7 18.699 5.7 18.399 L 5.7 7.099 L 6.8 7.099 L 6.8 18.399 L 15.7 18.399 L 15.7 19.5 L 6.8 19.5 Z M 9 17.2 C 8.7 17.2 8.4 17.1 8.2 16.9 C 8 16.7 7.9 16.4 7.9 16.1 L 7.9 5.6 C 7.9 5.3 8 5 8.2 4.8 C 8.4 4.6 8.7 4.5 9 4.5 L 17.2 4.5 C 17.5 4.5 17.8 4.6 18 4.8 C 18.2 5 18.3 5.3 18.3 5.6 L 18.3 16.1 C 18.3 16.4 18.2 16.7 18 16.9 C 17.8 17.1 17.5 17.2 17.2 17.2 L 9 17.2 Z M 9 16.1 L 17.2 16.1 L 17.2 5.6 L 9 5.6 L 9 16.1 Z M 9 16.1 L 9 5.6 L 9 16.1 Z"
|
||||||
|
android:fillColor="#ffffffff"/>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:name="path"
|
||||||
|
android:pathData="M 6.8 19.5 C 6.5 19.5 6.2 19.4 6 19.2 C 5.8 19 5.7 18.7 5.7 18.4 L 5.7 7.1 L 6.8 7.1 L 6.8 18.4 L 15.7 18.4 L 15.7 19.5 L 6.8 19.5 Z M 9 17.2 C 8.7 17.2 8.4 17.1 8.2 16.9 C 8 16.7 7.9 16.4 7.9 16.1 L 7.9 5.6 C 7.9 5.3 8 5 8.2 4.8 C 8.4 4.6 8.7 4.5 9 4.5 L 17.2 4.5 C 17.5 4.5 17.8 4.6 18 4.8 C 18.2 5 18.3 5.3 18.3 5.6 L 18.3 16.1 C 18.3 16.4 18.2 16.7 18 16.9 C 17.8 17.1 17.5 17.2 17.2 17.2 L 9 17.2 Z M 9 16.1 L 17.2 16.1 L 17.2 5.6 L 9 5.6 L 9 16.1 Z M 9 16.1 L 9 5.6 L 9 16.1 Z M 13.1 8 C 11.5 8 10.2 9.3 10.2 10.9 C 10.2 12.5 11.5 13.8 13.1 13.8 C 14.7 13.8 16 12.5 16 10.9 C 16 9.3 14.7 8 13.1 8 Z M 13.1 13.3 C 11.8 13.3 10.7 12.2 10.7 10.9 C 10.7 9.6 11.8 8.5 13.1 8.5 C 14.4 8.5 15.5 9.6 15.5 10.9 C 15.5 12.2 14.5 13.3 13.1 13.3 Z M 14.5 12 L 14.2 12.3 L 12.9 11 L 12.9 9.4 L 13.3 9.4 L 13.3 10.8 L 14.5 12 Z"
|
||||||
|
android:fillColor="#ffffffff" />
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yt="http://schemas.android.com/apk/res-auto" android:id="@+id/youtube_controls_bottom_ui_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layoutDirection="ltr">
|
||||||
|
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/copy_video_url_timestamp_button" android:paddingLeft="12dp" android:paddingTop="22dp" android:paddingRight="12dp" android:paddingBottom="16dp" android:longClickable="false" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/revanced_yt_copy_timestamp" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/fullscreen_button" style="@style/YouTubePlayerButton"/>
|
||||||
|
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/copy_video_url_button" android:paddingLeft="12dp" android:paddingTop="22dp" android:paddingRight="12dp" android:paddingBottom="16dp" android:longClickable="false" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/revanced_yt_copy" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/fullscreen_button" style="@style/YouTubePlayerButton"/>
|
||||||
|
</android.support.constraint.ConstraintLayout>
|
||||||
@@ -1,4 +1,13 @@
|
|||||||
<resources>
|
<resources>
|
||||||
|
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Hidden</string>
|
||||||
|
|
||||||
|
<string name="revanced_ryd_failure_connection_timeout">Dislikes temporarily not available (API timed out)</string>
|
||||||
|
<string name="revanced_ryd_failure_client_rate_limit_requested">Dislikes not available (client API limit reached)</string>
|
||||||
|
<string name="revanced_ryd_failure_register_user">ReturnYouTubeDislike failed to register as new user</string>
|
||||||
|
<string name="revanced_ryd_failure_confirm_user">ReturnYouTubeDislike failed to confirm new user</string>
|
||||||
|
<string name="revanced_ryd_failure_send_vote_failed">ReturnYouTubeDislike failed to send vote</string>
|
||||||
|
<string name="revanced_ryd_failure_confirm_vote_failed">ReturnYouTubeDislike failed to confirm vote</string>
|
||||||
|
|
||||||
<string name="revanced_ryd_enable_title">Return YouTube Dislike</string>
|
<string name="revanced_ryd_enable_title">Return YouTube Dislike</string>
|
||||||
<string name="revanced_ryd_enable_summary_on">Dislikes are shown</string>
|
<string name="revanced_ryd_enable_summary_on">Dislikes are shown</string>
|
||||||
<string name="revanced_ryd_enable_summary_off">Dislikes are not shown</string>
|
<string name="revanced_ryd_enable_summary_off">Dislikes are not shown</string>
|
||||||
@@ -7,6 +16,34 @@
|
|||||||
<string name="revanced_ryd_dislike_percentage_summary_on">Dislikes shown as percentage</string>
|
<string name="revanced_ryd_dislike_percentage_summary_on">Dislikes shown as percentage</string>
|
||||||
<string name="revanced_ryd_dislike_percentage_summary_off">Dislikes shown as number</string>
|
<string name="revanced_ryd_dislike_percentage_summary_off">Dislikes shown as number</string>
|
||||||
|
|
||||||
|
<string name="revanced_ryd_compact_layout_title">Compact like button</string>
|
||||||
|
<string name="revanced_ryd_compact_layout_summary_on">Like button styled for minimum width</string>
|
||||||
|
<string name="revanced_ryd_compact_layout_summary_off">Like button styled for best appearance</string>
|
||||||
|
|
||||||
<string name="revanced_ryd_attribution_title">ReturnYouTubeDislike.com</string>
|
<string name="revanced_ryd_attribution_title">ReturnYouTubeDislike.com</string>
|
||||||
<string name="revanced_ryd_attribution_summary">Dislike data is provided by the Return YouTube Dislike API. Tap here to learn more.</string>
|
<string name="revanced_ryd_attribution_summary">Dislike data is provided by the Return YouTube Dislike API. Tap here to learn more.</string>
|
||||||
</resources>
|
|
||||||
|
|
||||||
|
<string name="revanced_ryd_statistics_category_title">ReturnYouTubeDislike API statistics of this device</string>
|
||||||
|
|
||||||
|
<string name="revanced_ryd_statistics_getFetchCallResponseTimeAverage_title">API response time, average</string>
|
||||||
|
<string name="revanced_ryd_statistics_getFetchCallResponseTimeMin_title">API response time, minimum</string>
|
||||||
|
<string name="revanced_ryd_statistics_getFetchCallResponseTimeMax_title">API response time, maximum</string>
|
||||||
|
|
||||||
|
<string name="revanced_ryd_statistics_getFetchCallResponseTimeLast_title">API response time, last video</string>
|
||||||
|
<string name="revanced_ryd_statistics_getFetchCallResponseTimeLast_rate_limit_summary">Dislikes temporarily not available - Client API rate limit in effect</string>
|
||||||
|
|
||||||
|
<string name="revanced_ryd_statistics_getFetchCallCount_title">API fetch votes, number of calls</string>
|
||||||
|
<string name="revanced_ryd_statistics_getFetchCallCount_zero_summary">No network calls have been made</string>
|
||||||
|
<string name="revanced_ryd_statistics_getFetchCallCount_non_zero_summary">%d network calls have been made</string>
|
||||||
|
|
||||||
|
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_title">API fetch votes, number of timeouts</string>
|
||||||
|
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_zero_summary">No network calls have timed out</string>
|
||||||
|
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_non_zero_summary">%d network calls timed out</string>
|
||||||
|
|
||||||
|
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_title">API client rate limits</string>
|
||||||
|
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_zero_summary">No client rate limits have been encountered</string>
|
||||||
|
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_non_zero_summary">Client rate limit was encountered %d times</string>
|
||||||
|
|
||||||
|
<string name="revanced_ryd_statistics_millisecond_text">%d milliseconds</string>
|
||||||
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user