mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-08 10:23:55 +01:00
Compare commits
3 Commits
v2.155.0-d
...
v2.150.0-d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ca0a8c15e | ||
|
|
bda7fbe9c1 | ||
|
|
eaf4f6900f |
1
.github/workflows/pull_request.yml
vendored
1
.github/workflows/pull_request.yml
vendored
@@ -11,7 +11,6 @@ env:
|
||||
|
||||
jobs:
|
||||
pull-request:
|
||||
name: Open pull request
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
|
||||
9
.github/workflows/release.yml
vendored
9
.github/workflows/release.yml
vendored
@@ -1,5 +1,4 @@
|
||||
name: Release
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
@@ -10,7 +9,6 @@ on:
|
||||
branches:
|
||||
- main
|
||||
- dev
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: Release
|
||||
@@ -19,9 +17,6 @@ jobs:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
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
|
||||
- name: Setup JDK
|
||||
uses: actions/setup-java@v3
|
||||
@@ -45,8 +40,8 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: ./gradlew generateMeta clean --no-daemon
|
||||
- name: Setup semantic-release
|
||||
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
|
||||
run: npm install semantic-release @saithodev/semantic-release-backmerge @semantic-release/git @semantic-release/changelog gradle-semantic-release-plugin -D
|
||||
- name: Release
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: npx semantic-release
|
||||
|
||||
@@ -32,8 +32,7 @@
|
||||
{
|
||||
"path": "patches.json"
|
||||
}
|
||||
],
|
||||
successComment: false
|
||||
]
|
||||
}
|
||||
],
|
||||
[
|
||||
|
||||
131
CHANGELOG.md
131
CHANGELOG.md
@@ -1,136 +1,11 @@
|
||||
# [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)
|
||||
# [2.150.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.150.0-dev.1...v2.150.0-dev.2) (2022-12-31)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **youtube:** remove `fix-playback` patch ([edcb6cc](https://github.com/revanced/revanced-patches/commit/edcb6cc94961aaebe2df884db3049b2afa79f38f))
|
||||
* **youtube:** `copy-video-url` patch ([#1402](https://github.com/revanced/revanced-patches/issues/1402)) ([7e142dd](https://github.com/revanced/revanced-patches/commit/7e142dd7e9021cdb9b3b8d36c601770786e8e64a))
|
||||
|
||||
## [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))
|
||||
# [2.150.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.149.1-dev.2...v2.150.0-dev.1) (2022-12-31)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
72
README.md
72
README.md
@@ -46,16 +46,14 @@ 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 |
|
||||
| `minimized-playback` | Enables minimized and background playback. | 17.49.37 |
|
||||
| `old-quality-layout` | Enables the original video quality flyout in the video player settings | 17.49.37 |
|
||||
| `open-links-directly` | Bypasses https://youtube.com/redirect URLs. | 17.49.37 |
|
||||
| `open-links-directly` | Bypasses URL redirects and opens links directly inside YouTube app. | 17.49.37 |
|
||||
| `premium-heading` | Shows premium branding on the home screen. | all |
|
||||
| `remember-playback-rate` | Adds the ability to remember the playback rate you chose in the video playback rate flyout. | 17.49.37 |
|
||||
| `remember-video-quality` | Adds the ability to remember the video quality you chose in the video quality flyout. | 17.49.37 |
|
||||
| `remove-player-button-background` | Removes the background from the video player buttons. | 17.49.37 |
|
||||
| `return-youtube-dislike` | Shows the dislike count of videos using the Return YouTube Dislike API. | 17.49.37 |
|
||||
| `seekbar-tapping` | Enables tap-to-seek on the seekbar of the video player. | 17.49.37 |
|
||||
| `settings` | Adds settings for ReVanced to YouTube. | all |
|
||||
| `sponsorblock` | Integrate SponsorBlock. | 17.49.37 |
|
||||
| `spoof-app-version` | Tricks YouTube into thinking, you are running an older version of the app. One of the side effects also includes restoring the old UI. | 17.49.37 |
|
||||
| `swipe-controls` | Adds volume and brightness swipe controls. | 17.49.37 |
|
||||
| `tablet-mini-player` | Enables the tablet mini player layout. | 17.49.37 |
|
||||
| `theme` | Applies a custom theme. | all |
|
||||
@@ -67,16 +65,16 @@ The official Patch bundle provided by ReVanced and the community.
|
||||
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `background-play` | Enables playing music in the background. | 5.39.52 |
|
||||
| `codecs-unlock` | Adds more audio codec options. The new audio codecs usually result in better audio quality. | 5.39.52 |
|
||||
| `compact-header` | Hides the music category bar at the top of the homepage. | 5.39.52 |
|
||||
| `exclusive-audio-playback` | Enables the option to play music without video. | 5.39.52 |
|
||||
| `hide-get-premium` | Removes all "Get Premium" evidences from the avatar menu. | 5.39.52 |
|
||||
| `minimized-playback-music` | Enables minimized playback on Kids music. | 5.39.52 |
|
||||
| `music-microg-support` | Allows YouTube Music ReVanced to run without root and under a different package name. | 5.39.52 |
|
||||
| `music-video-ads` | Removes ads in the music player. | 5.39.52 |
|
||||
| `tasteBuilder-remover` | Removes the "Tell us which artists you like" card from the home screen. | 5.39.52 |
|
||||
| `upgrade-button-remover` | Removes the upgrade tab from the pivot bar. | 5.39.52 |
|
||||
| `background-play` | Enables playing music in the background. | 5.36.51 |
|
||||
| `codecs-unlock` | Adds more audio codec options. The new audio codecs usually result in better audio quality. | 5.36.51 |
|
||||
| `compact-header` | Hides the music category bar at the top of the homepage. | 5.36.51 |
|
||||
| `exclusive-audio-playback` | Enables the option to play music without video. | 5.36.51 |
|
||||
| `hide-get-premium` | Removes all "Get Premium" evidences from the avatar menu. | 5.36.51 |
|
||||
| `minimized-playback-music` | Enables minimized playback on Kids music. | 5.36.51 |
|
||||
| `music-microg-support` | Allows YouTube Music ReVanced to run without root and under a different package name. | 5.36.51 |
|
||||
| `music-video-ads` | Removes ads in the music player. | 5.36.51 |
|
||||
| `tasteBuilder-remover` | Removes the "Tell us which artists you like" card from the home screen. | 5.36.51 |
|
||||
| `upgrade-button-remover` | Removes the upgrade tab from the pivot bar. | 5.36.51 |
|
||||
</details>
|
||||
|
||||
### [📦 `com.ss.android.ugc.trill`](https://play.google.com/store/apps/details?id=com.ss.android.ugc.trill)
|
||||
@@ -85,14 +83,14 @@ The official Patch bundle provided by ReVanced and the community.
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `disable-login-requirement` | Do not force login. | all |
|
||||
| `downloads` | Removes download restrictions and changes the default path to download to. | 27.8.3 |
|
||||
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | 27.8.3 |
|
||||
| `downloads` | Removes download restrictions and changes the default path to download to. | all |
|
||||
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | all |
|
||||
| `fix-google-login` | Allows logging in with a Google account. | all |
|
||||
| `hide-ads` | Removes ads from TikTok. | all |
|
||||
| `playback-speed` | Enables the playback speed option for all videos. | all |
|
||||
| `settings` | Adds ReVanced settings to TikTok. | 27.8.3 |
|
||||
| `settings` | Adds ReVanced settings to TikTok. | all |
|
||||
| `show-seekbar` | Shows progress bar for all video. | all |
|
||||
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | 27.8.3 |
|
||||
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `com.zhiliaoapp.musically`](https://play.google.com/store/apps/details?id=com.zhiliaoapp.musically)
|
||||
@@ -101,14 +99,14 @@ The official Patch bundle provided by ReVanced and the community.
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `disable-login-requirement` | Do not force login. | all |
|
||||
| `downloads` | Removes download restrictions and changes the default path to download to. | 27.8.3 |
|
||||
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | 27.8.3 |
|
||||
| `downloads` | Removes download restrictions and changes the default path to download to. | all |
|
||||
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | all |
|
||||
| `fix-google-login` | Allows logging in with a Google account. | all |
|
||||
| `hide-ads` | Removes ads from TikTok. | all |
|
||||
| `playback-speed` | Enables the playback speed option for all videos. | all |
|
||||
| `settings` | Adds ReVanced settings to TikTok. | 27.8.3 |
|
||||
| `settings` | Adds ReVanced settings to TikTok. | all |
|
||||
| `show-seekbar` | Shows progress bar for all video. | all |
|
||||
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | 27.8.3 |
|
||||
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `tv.twitch.android.app`](https://play.google.com/store/apps/details?id=tv.twitch.android.app)
|
||||
@@ -202,14 +200,6 @@ 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 |
|
||||
</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)
|
||||
<details>
|
||||
|
||||
@@ -218,14 +208,6 @@ The official Patch bundle provided by ReVanced and the community.
|
||||
| `unlock-pro` | Unlocks all pro features. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `ginlemon.iconpackstudio`](https://play.google.com/store/apps/details?id=ginlemon.iconpackstudio)
|
||||
<details>
|
||||
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `unlock-pro` | Unlocks all pro features. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `org.totschnig.myexpenses`](https://play.google.com/store/apps/details?id=org.totschnig.myexpenses)
|
||||
<details>
|
||||
|
||||
@@ -234,6 +216,14 @@ The official Patch bundle provided by ReVanced and the community.
|
||||
| `unlock-pro` | Unlocks all professional features. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `com.awedea.nyx`](https://play.google.com/store/apps/details?id=com.awedea.nyx)
|
||||
<details>
|
||||
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `unlock-pro` | Unlocks all pro features. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `com.ithebk.expensemanager`](https://play.google.com/store/apps/details?id=com.ithebk.expensemanager)
|
||||
<details>
|
||||
|
||||
@@ -242,6 +232,14 @@ The official Patch bundle provided by ReVanced and the community.
|
||||
| `unlock-pro` | Unlocks pro features. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `ginlemon.iconpackstudio`](https://play.google.com/store/apps/details?id=ginlemon.iconpackstudio)
|
||||
<details>
|
||||
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `unlock-pro` | Unlocks all pro features. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `com.ticktick.task`](https://play.google.com/store/apps/details?id=com.ticktick.task)
|
||||
<details>
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ repositories {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation("app.revanced:revanced-patcher:6.4.0")
|
||||
implementation("app.revanced:revanced-patcher:6.3.2")
|
||||
implementation("app.revanced:multidexlib2:2.5.2.r2")
|
||||
// Required for meta
|
||||
implementation("com.google.code.gson:gson:2.10")
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
kotlin.code.style = official
|
||||
version = 2.155.0-dev.1
|
||||
version = 2.150.0-dev.2
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,106 +0,0 @@
|
||||
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,9 +21,7 @@ import app.revanced.patcher.annotation.Package
|
||||
"5.29.52",
|
||||
"5.31.50",
|
||||
"5.34.51",
|
||||
"5.36.51",
|
||||
"5.38.53",
|
||||
"5.39.52"
|
||||
"5.36.51"
|
||||
)
|
||||
)]
|
||||
)
|
||||
|
||||
@@ -21,9 +21,7 @@ import app.revanced.patcher.annotation.Package
|
||||
"5.29.52",
|
||||
"5.31.50",
|
||||
"5.34.51",
|
||||
"5.36.51",
|
||||
"5.38.53",
|
||||
"5.39.52"
|
||||
"5.36.51"
|
||||
)
|
||||
)]
|
||||
)
|
||||
|
||||
@@ -22,7 +22,7 @@ object CodecsLockFingerprint : MethodFingerprint(
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.INVOKE_INTERFACE,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.RETURN_OBJECT
|
||||
),
|
||||
strings = listOf("eac3_supported")
|
||||
|
||||
@@ -21,9 +21,7 @@ import app.revanced.patcher.annotation.Package
|
||||
"5.29.52",
|
||||
"5.31.50",
|
||||
"5.34.51",
|
||||
"5.36.51",
|
||||
"5.38.53",
|
||||
"5.39.52"
|
||||
"5.36.51"
|
||||
)
|
||||
)]
|
||||
)
|
||||
|
||||
@@ -20,9 +20,7 @@ import app.revanced.patcher.annotation.Package
|
||||
"5.29.52",
|
||||
"5.31.50",
|
||||
"5.34.51",
|
||||
"5.36.51",
|
||||
"5.38.53",
|
||||
"5.39.52"
|
||||
"5.36.51"
|
||||
)
|
||||
)]
|
||||
)
|
||||
|
||||
@@ -21,9 +21,7 @@ import app.revanced.patcher.annotation.Package
|
||||
"5.29.52",
|
||||
"5.31.50",
|
||||
"5.34.51",
|
||||
"5.36.51",
|
||||
"5.38.53",
|
||||
"5.39.52"
|
||||
"5.36.51"
|
||||
)
|
||||
)]
|
||||
)
|
||||
|
||||
@@ -21,9 +21,7 @@ import app.revanced.patcher.annotation.Package
|
||||
"5.29.52",
|
||||
"5.31.50",
|
||||
"5.34.51",
|
||||
"5.36.51",
|
||||
"5.38.53",
|
||||
"5.39.52"
|
||||
"5.36.51"
|
||||
)
|
||||
)]
|
||||
)
|
||||
|
||||
@@ -23,9 +23,7 @@ import app.revanced.patcher.annotation.Package
|
||||
"5.29.52",
|
||||
"5.31.50",
|
||||
"5.34.51",
|
||||
"5.36.51",
|
||||
"5.38.53",
|
||||
"5.39.52"
|
||||
"5.36.51"
|
||||
)
|
||||
)]
|
||||
)
|
||||
|
||||
@@ -21,9 +21,7 @@ import app.revanced.patcher.annotation.Package
|
||||
"5.29.52",
|
||||
"5.31.50",
|
||||
"5.34.51",
|
||||
"5.36.51",
|
||||
"5.38.53",
|
||||
"5.39.52"
|
||||
"5.36.51"
|
||||
)
|
||||
)]
|
||||
)
|
||||
|
||||
@@ -21,9 +21,7 @@ import app.revanced.patcher.annotation.Package
|
||||
"5.29.52",
|
||||
"5.31.50",
|
||||
"5.34.51",
|
||||
"5.36.51",
|
||||
"5.38.53",
|
||||
"5.39.52"
|
||||
"5.36.51"
|
||||
)
|
||||
)]
|
||||
)
|
||||
|
||||
@@ -21,9 +21,7 @@ import app.revanced.patcher.annotation.Package
|
||||
"5.29.52",
|
||||
"5.31.50",
|
||||
"5.34.51",
|
||||
"5.36.51",
|
||||
"5.38.53",
|
||||
"5.39.52"
|
||||
"5.36.51"
|
||||
)
|
||||
)]
|
||||
)
|
||||
|
||||
@@ -5,8 +5,8 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[
|
||||
Package("com.ss.android.ugc.trill", arrayOf("27.8.3")),
|
||||
Package("com.zhiliaoapp.musically", arrayOf("27.8.3"))
|
||||
Package("com.ss.android.ugc.trill"),
|
||||
Package("com.zhiliaoapp.musically")
|
||||
]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object FeedApiServiceLIZFingerprint : MethodFingerprint(
|
||||
access = AccessFlags.PUBLIC or AccessFlags.STATIC or AccessFlags.SYNTHETIC,
|
||||
access = AccessFlags.PUBLIC or AccessFlags.STATIC or AccessFlags.FINAL or AccessFlags.SYNTHETIC,
|
||||
customFingerprint = { methodDef ->
|
||||
methodDef.definingClass.endsWith("/FeedApiService;") && methodDef.name == "LIZ"
|
||||
}
|
||||
|
||||
@@ -5,8 +5,8 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[
|
||||
Package("com.ss.android.ugc.trill", arrayOf("27.8.3")),
|
||||
Package("com.zhiliaoapp.musically", arrayOf("27.8.3"))
|
||||
Package("com.ss.android.ugc.trill"),
|
||||
Package("com.zhiliaoapp.musically")
|
||||
]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
||||
@@ -5,8 +5,8 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[
|
||||
Package("com.ss.android.ugc.trill", arrayOf("27.8.3")),
|
||||
Package("com.zhiliaoapp.musically", arrayOf("27.8.3"))
|
||||
Package("com.ss.android.ugc.trill"),
|
||||
Package("com.zhiliaoapp.musically")
|
||||
]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
||||
@@ -9,6 +9,7 @@ object AboutViewFingerprint : MethodFingerprint(
|
||||
opcodes = listOf(
|
||||
Opcode.NEW_INSTANCE,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.MOVE,
|
||||
Opcode.INVOKE_DIRECT_RANGE,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.IPUT_OBJECT,
|
||||
@@ -17,7 +18,8 @@ object AboutViewFingerprint : MethodFingerprint(
|
||||
Opcode.CONST,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.NEW_INSTANCE,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.NEW_INSTANCE,
|
||||
|
||||
@@ -5,8 +5,8 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[
|
||||
Package("com.ss.android.ugc.trill", arrayOf("27.8.3")),
|
||||
Package("com.zhiliaoapp.musically", arrayOf("27.8.3"))
|
||||
Package("com.ss.android.ugc.trill"),
|
||||
Package("com.zhiliaoapp.musically")
|
||||
]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
||||
@@ -17,7 +17,6 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
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.resource.patch.GeneralAdsResourcePatch
|
||||
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.patch.FixBackToExitGesturePatch
|
||||
import app.revanced.patches.youtube.misc.fix.verticalscroll.patch.VerticalScrollPatch
|
||||
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||
import org.jf.dexlib2.iface.instruction.formats.Instruction31i
|
||||
@@ -25,7 +24,7 @@ import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
||||
|
||||
|
||||
@Patch
|
||||
@DependsOn([GeneralAdsResourcePatch::class, VerticalScrollPatch::class, FixBackToExitGesturePatch::class])
|
||||
@DependsOn([GeneralAdsResourcePatch::class, VerticalScrollPatch::class])
|
||||
@Name("general-ads")
|
||||
@Description("Removes general ads.")
|
||||
@GeneralAdsCompatibility
|
||||
|
||||
@@ -7,21 +7,22 @@ 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.shared.settings.preference.impl.*
|
||||
import app.revanced.patches.shared.settings.preference.impl.InputType
|
||||
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.misc.litho.filter.patch.LithoFilterPatch
|
||||
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.PreferenceScreen
|
||||
|
||||
@DependsOn(
|
||||
dependencies = [
|
||||
FixLocaleConfigErrorPatch::class,
|
||||
LithoFilterPatch::class,
|
||||
SettingsPatch::class,
|
||||
ResourceMappingPatch::class
|
||||
]
|
||||
)
|
||||
@DependsOn(dependencies = [
|
||||
FixLocaleConfigErrorPatch::class,
|
||||
LithoFilterPatch::class,
|
||||
SettingsPatch::class,
|
||||
ResourceMappingPatch::class
|
||||
])
|
||||
@GeneralAdsCompatibility
|
||||
@Version("0.0.1")
|
||||
class GeneralAdsResourcePatch : ResourcePatch {
|
||||
@@ -31,42 +32,20 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
||||
}
|
||||
|
||||
override fun execute(context: ResourceContext): PatchResult {
|
||||
PreferenceScreen.LAYOUT.addPreferences(
|
||||
PreferenceScreen.ADS.addPreferences(
|
||||
SwitchPreference(
|
||||
"revanced_adremover_separator",
|
||||
StringResource("revanced_adremover_separator_title", "Hide gray separator"),
|
||||
"revanced_adremover_ad_removal",
|
||||
StringResource("revanced_adremover_ad_removal_enabled_title", "Hide general ads"),
|
||||
true,
|
||||
StringResource("revanced_adremover_separator_summary_on", "Gray separators are hidden"),
|
||||
StringResource("revanced_adremover_separator_summary_off", "Gray separators are shown")
|
||||
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_hide_channel_guidelines",
|
||||
StringResource("revanced_adremover_hide_channel_guidelines_enabled_title", "Hide channel guidelines"),
|
||||
"revanced_adremover_buttoned",
|
||||
StringResource("revanced_adremover_buttoned_enabled_title", "Hide buttoned ad"),
|
||||
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(
|
||||
"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"
|
||||
)
|
||||
StringResource("revanced_adremover_buttoned_enabled_summary_on", "Buttoned ads are hidden"),
|
||||
StringResource("revanced_adremover_buttoned_enabled_summary_off", "Buttoned ads are shown")
|
||||
),
|
||||
SwitchPreference(
|
||||
"revanced_adremover_merchandise",
|
||||
@@ -125,32 +104,17 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
||||
),
|
||||
SwitchPreference(
|
||||
"revanced_adremover_subscribers_community_guidelines_removal",
|
||||
StringResource(
|
||||
"revanced_adremover_subscribers_community_guidelines_enabled_title",
|
||||
"Hide subscribers community guidelines"
|
||||
),
|
||||
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"
|
||||
)
|
||||
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"
|
||||
)
|
||||
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(
|
||||
"revanced_adremover_emergency_box_removal",
|
||||
@@ -173,23 +137,6 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
||||
StringResource("revanced_adremover_medical_panel_enabled_summary_on", "Medical panels are hidden"),
|
||||
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(
|
||||
"revanced_adremover_paid_content",
|
||||
StringResource("revanced_adremover_paid_content_enabled_title", "Hide paid content"),
|
||||
@@ -211,6 +158,19 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
||||
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")
|
||||
),
|
||||
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(
|
||||
"revanced_adremover_self_sponsor",
|
||||
StringResource("revanced_adremover_self_sponsor_enabled_title", "Hide self sponsored cards"),
|
||||
@@ -218,7 +178,30 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
||||
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")
|
||||
),
|
||||
PreferenceScreen(
|
||||
SwitchPreference(
|
||||
"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",
|
||||
StringResource("revanced_adremover_custom_title", "Custom filter"),
|
||||
listOf(
|
||||
@@ -238,7 +221,7 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
||||
"Custom filter is disabled"
|
||||
)
|
||||
),
|
||||
// TODO: This should be a dynamic ListPreference, which does not exist yet
|
||||
// TODO: This should be a ListPreference, which does not exist yet
|
||||
TextPreference(
|
||||
"revanced_adremover_custom_strings",
|
||||
StringResource("revanced_adremover_custom_strings_title", "Custom filter"),
|
||||
|
||||
@@ -16,11 +16,12 @@ import app.revanced.patches.shared.settings.preference.impl.StringResource
|
||||
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
||||
import app.revanced.patches.youtube.ad.video.annotations.VideoAdsCompatibility
|
||||
import app.revanced.patches.youtube.ad.video.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.settings.bytecode.patch.SettingsPatch
|
||||
|
||||
@Patch
|
||||
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
|
||||
@DependsOn([IntegrationsPatch::class, SettingsPatch::class, FixPlaybackPatch::class])
|
||||
@Name("video-ads")
|
||||
@Description("Removes ads in the video player.")
|
||||
@VideoAdsCompatibility
|
||||
|
||||
@@ -45,7 +45,7 @@ class HideInfocardsPatch : BytecodePatch(
|
||||
"Landroid/view/View;->setVisibility(I)V")
|
||||
}
|
||||
|
||||
addInstructions(
|
||||
replaceInstruction(
|
||||
invokeInstructionIndex,
|
||||
"invoke-static {v${(instruction(invokeInstructionIndex) as? BuilderInstruction35c)?.registerC}}," +
|
||||
" Lapp/revanced/integrations/patches/HideInfocardsPatch;->hideInfocardsIncognito(Landroid/view/View;)V"
|
||||
|
||||
@@ -59,9 +59,7 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
|
||||
|
||||
val conversionContextParam = 5
|
||||
val textRefParam = createComponentMethod.parameters.size - 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
|
||||
val insertIndex = scanResult.stringsScanResult!!.matches.first().index - 2
|
||||
|
||||
createComponentMethod.addInstructions(
|
||||
insertIndex,
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
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")
|
||||
)
|
||||
@@ -1,64 +0,0 @@
|
||||
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()
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
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
|
||||
@@ -1,14 +0,0 @@
|
||||
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"
|
||||
}
|
||||
)
|
||||
@@ -1,19 +0,0 @@
|
||||
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,
|
||||
)
|
||||
)
|
||||
@@ -1,27 +0,0 @@
|
||||
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,
|
||||
)
|
||||
)
|
||||
@@ -1,20 +0,0 @@
|
||||
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>"
|
||||
}
|
||||
)
|
||||
@@ -1,86 +0,0 @@
|
||||
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,4 +1,4 @@
|
||||
package app.revanced.patches.youtube.layout.spoofappversion.annotations
|
||||
package app.revanced.patches.youtube.misc.fix.playback.annotations
|
||||
|
||||
import app.revanced.patcher.annotation.Compatibility
|
||||
import app.revanced.patcher.annotation.Package
|
||||
@@ -10,5 +10,4 @@ import app.revanced.patcher.annotation.Package
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
@Retention(AnnotationRetention.RUNTIME)
|
||||
internal annotation class SpoofAppVersionCompatibility
|
||||
|
||||
internal annotation class FixPlaybackCompatibility
|
||||
@@ -0,0 +1,52 @@
|
||||
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()
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,7 @@ import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
||||
@Patch
|
||||
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
|
||||
@Name("open-links-directly")
|
||||
@Description("Bypasses https://youtube.com/redirect URLs.")
|
||||
@Description("Bypasses URL redirects and opens links directly inside YouTube app.")
|
||||
@OpenLinksDirectlyCompatibility
|
||||
@Version("0.0.1")
|
||||
class OpenLinksDirectlyPatch : BytecodePatch(
|
||||
@@ -37,10 +37,10 @@ class OpenLinksDirectlyPatch : BytecodePatch(
|
||||
SettingsPatch.PreferenceScreen.MISC.addPreferences(
|
||||
SwitchPreference(
|
||||
"revanced_uri_redirect",
|
||||
StringResource("revanced_uri_redirect_title", "Bypass URL redirects"),
|
||||
StringResource("revanced_uri_redirect_title", "Open YouTube links inside app"),
|
||||
true,
|
||||
StringResource("revanced_uri_redirect_summary_on", "Bypassing URL redirects"),
|
||||
StringResource("revanced_uri_redirect_summary_off", "Following default redirect policy")
|
||||
StringResource("revanced_uri_redirect_summary_on", "Links opened inside YouTube ReVanced"),
|
||||
StringResource("revanced_uri_redirect_summary_off", "Links opened in web browser")
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ class BottomControlsResourcePatch : ResourcePatch {
|
||||
element.attributes.getNamedItem("yt:layout_constraintRight_toLeftOf").nodeValue =
|
||||
"$namespace/$lastLeftOf"
|
||||
|
||||
// set lastLeftOf attribute to the current element
|
||||
// set lastLeftOf attribute to the the current element
|
||||
val nameSpaceLength = 5
|
||||
lastLeftOf = element.attributes.getNamedItem("android:id").nodeValue.substring(nameSpaceLength)
|
||||
|
||||
@@ -82,4 +82,4 @@ class BottomControlsResourcePatch : ResourcePatch {
|
||||
override fun close() {
|
||||
targetXmlEditor.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,14 +12,14 @@ 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.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.fingerprints.VideoQualityReferenceFingerprint
|
||||
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.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 org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
||||
import org.jf.dexlib2.iface.reference.FieldReference
|
||||
@@ -47,7 +47,7 @@ class RememberVideoQualityPatch : BytecodePatch(
|
||||
),
|
||||
StringResource(
|
||||
"revanced_remember_video_quality_last_selected_summary_off",
|
||||
"Quality changes only apply to the current video"
|
||||
"Quality changes only apply to the current video and are reverted back to the last remembered quality for future playbacks"
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
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
|
||||
@@ -1,8 +0,0 @@
|
||||
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")
|
||||
)
|
||||
@@ -1,7 +0,0 @@
|
||||
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")
|
||||
)
|
||||
@@ -1,12 +0,0 @@
|
||||
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
|
||||
)
|
||||
)
|
||||
@@ -1,137 +0,0 @@
|
||||
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()
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,51 @@
|
||||
<vector
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<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"/>
|
||||
<path
|
||||
android:pathData="M3.938,0.051C3.449,0.145 2.906,0.57 2.652,1.051L2.531,1.281L2.531,18.906L2.633,19.117C2.836,19.516 3.348,19.945 3.758,20.066L3.891,20.105L3.891,1.781L4.027,1.633L4.164,1.477L11.063,1.461L17.961,1.453L17.93,1.32C17.844,0.98 17.422,0.461 17.078,0.266C16.555,-0.016 16.855,0 10.219,0.004C6.883,0.008 4.055,0.027 3.938,0.051ZM3.938,0.051"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M7.188,3.305C7.051,3.344 6.848,3.418 6.742,3.473C6.492,3.602 6.078,4.023 5.945,4.281C5.711,4.738 5.719,4.359 5.719,13.57C5.719,22.848 5.711,22.449 5.949,22.914C6.07,23.148 6.379,23.461 6.688,23.656C7.168,23.961 6.922,23.953 13.691,23.953C17.898,23.953 19.898,23.938 20.09,23.902C20.609,23.809 21.242,23.352 21.473,22.914C21.711,22.449 21.703,22.844 21.703,13.609C21.703,7.43 21.688,4.949 21.652,4.773C21.57,4.41 21.418,4.129 21.121,3.828C20.828,3.535 20.609,3.406 20.219,3.305C19.828,3.203 7.566,3.207 7.188,3.305ZM19.965,4.801C20.035,4.836 20.113,4.922 20.148,4.992C20.188,5.086 20.203,7.125 20.203,13.617L20.203,22.125L20.066,22.273L19.93,22.43L13.844,22.445C10.496,22.449 7.691,22.445 7.613,22.43C7.527,22.414 7.406,22.352 7.34,22.281L7.219,22.156L7.219,13.621C7.223,4.449 7.211,4.938 7.457,4.801C7.633,4.703 19.777,4.707 19.965,4.801ZM19.965,4.801"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M11.5,8.488C11.199,8.547 11.043,8.633 10.43,9.098C9.699,9.648 9.633,9.719 9.453,10.074C9.328,10.332 9.305,10.43 9.305,10.73C9.305,10.996 9.332,11.141 9.406,11.305C9.516,11.547 10.762,13.191 11.023,13.438C11.297,13.703 11.594,13.805 12.047,13.805C12.453,13.801 12.641,13.738 12.992,13.496L13.117,13.406L13.453,13.852L13.797,14.297L13.59,14.48C13.473,14.578 13.316,14.773 13.242,14.91C13.117,15.141 13.102,15.203 13.102,15.609C13.102,16.18 13.133,16.246 13.922,17.273C14.855,18.484 14.98,18.594 15.531,18.699C16.055,18.793 16.375,18.68 17.086,18.141C18.09,17.387 18.254,17.148 18.258,16.453C18.258,15.957 18.188,15.805 17.602,15.043C16.613,13.762 16.566,13.711 16.27,13.551C15.754,13.281 15.133,13.313 14.68,13.641C14.574,13.715 14.469,13.781 14.453,13.781C14.418,13.777 13.828,13.023 13.789,12.941C13.785,12.922 13.902,12.781 14.055,12.629C14.367,12.305 14.5,12 14.504,11.578C14.508,11.125 14.418,10.93 13.836,10.164C12.875,8.891 12.801,8.805 12.469,8.641C12.137,8.48 11.809,8.422 11.5,8.488ZM12.148,9.355C12.324,9.445 13.637,11.16 13.695,11.375C13.719,11.465 13.73,11.617 13.711,11.703C13.684,11.867 13.391,12.234 13.293,12.234C13.266,12.234 13.109,12.066 12.945,11.859C12.672,11.5 12.648,11.484 12.469,11.484C12.141,11.484 11.949,11.781 12.098,12.063C12.133,12.117 12.262,12.297 12.391,12.461L12.629,12.766L12.488,12.871C12.23,13.082 11.836,13.078 11.582,12.863C11.383,12.695 10.223,11.184 10.141,10.977C10.055,10.777 10.094,10.461 10.219,10.297C10.352,10.129 11.367,9.359 11.547,9.297C11.715,9.23 11.957,9.258 12.148,9.355ZM15.938,14.258C16.035,14.32 17.32,15.953 17.434,16.156C17.512,16.316 17.492,16.645 17.391,16.813C17.301,16.965 16.762,17.418 16.27,17.758C16.063,17.898 15.98,17.93 15.801,17.926C15.676,17.926 15.52,17.887 15.43,17.836C15.301,17.758 14.07,16.215 13.93,15.953C13.859,15.82 13.859,15.445 13.926,15.313C14,15.172 14.207,14.953 14.27,14.953C14.297,14.953 14.398,15.07 14.504,15.211C14.785,15.605 14.93,15.723 15.121,15.723C15.25,15.723 15.324,15.688 15.402,15.59C15.582,15.391 15.547,15.25 15.234,14.832C15.078,14.629 14.953,14.445 14.953,14.43C14.953,14.41 15.043,14.34 15.156,14.273C15.32,14.172 15.391,14.156 15.59,14.176C15.723,14.184 15.883,14.223 15.938,14.258ZM15.938,14.258"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M10.648,3.219C12.313,3.23 15.055,3.23 16.742,3.219C18.426,3.215 17.063,3.211 13.711,3.211C10.359,3.211 8.98,3.215 10.648,3.219ZM10.648,3.219"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.0588235"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M21.727,13.594C21.727,18.219 21.73,20.113 21.734,17.805C21.746,15.488 21.746,11.699 21.734,9.391C21.73,7.074 21.727,8.969 21.727,13.594ZM21.727,13.594"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.121569"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M5.477,1.484C6.074,1.496 7.047,1.496 7.633,1.484C8.219,1.48 7.727,1.477 6.539,1.477C5.352,1.477 4.875,1.48 5.477,1.484ZM5.477,1.484"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.160784"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M3.914,4.43C3.914,5.793 3.918,6.348 3.922,5.656C3.934,4.965 3.934,3.848 3.922,3.172C3.918,2.5 3.914,3.063 3.914,4.43ZM3.914,4.43"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.168627"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M5.695,13.594C5.695,18.219 5.699,20.113 5.703,17.805C5.715,15.488 5.715,11.699 5.703,9.391C5.699,7.074 5.695,8.969 5.695,13.594ZM5.695,13.594"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.180392"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
</vector>
|
||||
|
||||
@@ -1,11 +1,74 @@
|
||||
<vector
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<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" />
|
||||
<path
|
||||
android:pathData="M3.938,0.051C3.449,0.145 2.906,0.57 2.652,1.051L2.531,1.281L2.531,18.906L2.633,19.117C2.836,19.516 3.348,19.945 3.758,20.066L3.891,20.105L3.891,1.781L4.027,1.633L4.164,1.477L11.063,1.461L17.961,1.453L17.93,1.32C17.844,0.98 17.422,0.461 17.078,0.266C16.555,-0.016 16.855,0 10.219,0.004C6.883,0.008 4.055,0.027 3.938,0.051ZM3.938,0.051"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M7.188,3.305C7.051,3.344 6.848,3.418 6.742,3.473C6.492,3.602 6.078,4.023 5.945,4.281C5.711,4.738 5.719,4.359 5.719,13.57C5.719,22.848 5.711,22.449 5.949,22.914C6.07,23.148 6.379,23.461 6.688,23.656C7.168,23.961 6.922,23.953 13.691,23.953C17.898,23.953 19.898,23.938 20.09,23.902C20.609,23.809 21.242,23.352 21.473,22.914C21.711,22.449 21.703,22.844 21.703,13.609C21.703,7.43 21.688,4.949 21.652,4.773C21.57,4.41 21.418,4.129 21.121,3.828C20.828,3.535 20.609,3.406 20.219,3.305C19.828,3.203 7.566,3.207 7.188,3.305ZM19.965,4.801C20.035,4.836 20.113,4.922 20.148,4.992C20.188,5.086 20.203,7.125 20.203,13.617L20.203,22.125L20.066,22.273L19.93,22.43L13.844,22.445C10.496,22.449 7.691,22.445 7.613,22.43C7.527,22.414 7.406,22.352 7.34,22.281L7.219,22.156L7.219,13.621C7.223,4.449 7.211,4.938 7.457,4.801C7.633,4.703 19.777,4.707 19.965,4.801ZM19.965,4.801"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M12.953,9.207C11.172,9.547 9.801,10.828 9.32,12.613C9.164,13.18 9.168,14.188 9.324,14.789C9.707,16.281 10.742,17.438 12.16,17.973C13.504,18.477 15.023,18.305 16.25,17.508C17.277,16.836 17.977,15.777 18.238,14.508C18.324,14.105 18.309,13.223 18.211,12.773C17.996,11.746 17.469,10.883 16.641,10.18C16.211,9.824 15.422,9.422 14.859,9.281C14.348,9.148 13.426,9.117 12.953,9.207ZM14.508,10.008C15.301,10.176 15.934,10.539 16.504,11.148C18.234,12.984 17.676,15.984 15.398,17.086C14.785,17.383 14.438,17.461 13.734,17.457C13.27,17.457 13.074,17.434 12.777,17.352C12.191,17.184 11.629,16.871 11.203,16.469C8.953,14.352 9.965,10.672 12.984,10.004C13.344,9.922 14.117,9.93 14.508,10.008ZM14.508,10.008"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M13.563,10.5C13.5,10.523 13.41,10.613 13.359,10.695C13.27,10.844 13.266,10.938 13.266,12.336C13.266,13.152 13.285,13.875 13.309,13.938C13.336,14 13.402,14.102 13.457,14.152C13.563,14.246 13.609,14.25 15.086,14.25L16.602,14.25L16.738,14.113C16.848,14.008 16.875,13.938 16.875,13.781C16.875,13.625 16.848,13.555 16.738,13.449L16.602,13.313L14.254,13.313L14.242,12.023L14.227,10.734L14.105,10.617C13.973,10.484 13.719,10.43 13.563,10.5ZM13.563,10.5"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M10.648,3.219C12.313,3.23 15.055,3.23 16.742,3.219C18.426,3.215 17.063,3.211 13.711,3.211C10.359,3.211 8.98,3.215 10.648,3.219ZM10.648,3.219"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.0588235"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M14.27,12.117C14.27,12.758 14.277,13.031 14.281,12.719C14.293,12.402 14.293,11.879 14.281,11.547C14.277,11.219 14.27,11.469 14.27,12.117ZM14.27,12.117"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.0117647"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M21.727,13.594C21.727,18.219 21.73,20.113 21.734,17.805C21.746,15.488 21.746,11.699 21.734,9.391C21.73,7.074 21.727,8.969 21.727,13.594ZM21.727,13.594"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.121569"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M14.828,13.297C15.133,13.309 15.613,13.309 15.906,13.297C16.195,13.293 15.945,13.285 15.352,13.285C14.762,13.285 14.523,13.293 14.828,13.297ZM14.828,13.297"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.188235"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M5.477,1.484C6.074,1.496 7.047,1.496 7.633,1.484C8.219,1.48 7.727,1.477 6.539,1.477C5.352,1.477 4.875,1.48 5.477,1.484ZM5.477,1.484"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.160784"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M14.477,14.281C14.844,14.293 15.438,14.293 15.789,14.281C16.141,14.277 15.84,14.27 15.117,14.27C14.395,14.27 14.105,14.277 14.477,14.281ZM14.477,14.281"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.4"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M3.914,4.43C3.914,5.793 3.918,6.348 3.922,5.656C3.934,4.965 3.934,3.848 3.922,3.172C3.918,2.5 3.914,3.063 3.914,4.43ZM3.914,4.43"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.168627"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M5.695,13.594C5.695,18.219 5.699,20.113 5.703,17.805C5.715,15.488 5.715,11.699 5.703,9.391C5.699,7.074 5.695,8.969 5.695,13.594ZM5.695,13.594"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillAlpha="0.180392"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
</vector>
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
<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>
|
||||
@@ -16,10 +17,6 @@
|
||||
<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_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_summary">Dislike data is provided by the Return YouTube Dislike API. Tap here to learn more.</string>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user