mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-13 14:33:13 +00:00
Compare commits
28 Commits
v2.174.0-d
...
v2.175.0-d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
11159278ee | ||
|
|
d4c4552277 | ||
|
|
90000fcaeb | ||
|
|
0301bfb176 | ||
|
|
ba07fa967d | ||
|
|
e47be6f319 | ||
|
|
1ae40a24a1 | ||
|
|
82524885bb | ||
|
|
1ba0abbac1 | ||
|
|
f58fc276d2 | ||
|
|
1b54b58478 | ||
|
|
ced0019ff8 | ||
|
|
d740a65ca2 | ||
|
|
b1f629b81d | ||
|
|
63cdba965b | ||
|
|
596b636a14 | ||
|
|
9a6ed76956 | ||
|
|
1a60e5c6b5 | ||
|
|
1dd96b19d9 | ||
|
|
46a93ba634 | ||
|
|
769b1932d4 | ||
|
|
324d4b83d3 | ||
|
|
97822d6ee7 | ||
|
|
67674170da | ||
|
|
76711f0785 | ||
|
|
4178ca3be1 | ||
|
|
c681316ee1 | ||
|
|
b56844dc6b |
2
.github/ISSUE_TEMPLATE/bug-issue.yml
vendored
2
.github/ISSUE_TEMPLATE/bug-issue.yml
vendored
@@ -1,6 +1,6 @@
|
||||
name: 🐞 Bug report
|
||||
description: Report a very clearly broken issue.
|
||||
title: 'bug: <title>'
|
||||
title: 'bug: '
|
||||
labels: [bug]
|
||||
body:
|
||||
- type: markdown
|
||||
|
||||
6
.github/ISSUE_TEMPLATE/patch-request.yml
vendored
6
.github/ISSUE_TEMPLATE/patch-request.yml
vendored
@@ -1,6 +1,6 @@
|
||||
name: ⭐ Patch Request
|
||||
description: Create a detailed patch request.
|
||||
title: 'feat(patch): '
|
||||
title: 'feat: '
|
||||
labels: [patch-request]
|
||||
body:
|
||||
- type: textarea
|
||||
@@ -24,7 +24,7 @@ body:
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Motivation
|
||||
description: Why should your patch request should be considered? What makes it valuable to the community?
|
||||
description: Why should your patch request be considered? What makes it valuable to the community?
|
||||
validations:
|
||||
required: true
|
||||
- type: checkboxes
|
||||
@@ -38,4 +38,4 @@ body:
|
||||
- label: I have written a short but informative title.
|
||||
required: true
|
||||
- label: I filled out all of the requested information in this issue properly.
|
||||
required: true
|
||||
required: true
|
||||
|
||||
139
CHANGELOG.md
139
CHANGELOG.md
@@ -1,3 +1,142 @@
|
||||
# [2.175.0-dev.4](https://github.com/revanced/revanced-patches/compare/v2.175.0-dev.3...v2.175.0-dev.4) (2023-05-26)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **youtube/downloads:** rename patch to `external-downloads` ([#2274](https://github.com/revanced/revanced-patches/issues/2274)) ([4480911](https://github.com/revanced/revanced-patches/commit/4480911e0b056f2148616a0c2af6b4ab7c482c3b))
|
||||
|
||||
# [2.175.0-dev.3](https://github.com/revanced/revanced-patches/compare/v2.175.0-dev.2...v2.175.0-dev.3) (2023-05-25)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **youtube/hide-player-buttons:** fix previous/next button showing if previous video exists ([#2261](https://github.com/revanced/revanced-patches/issues/2261)) ([91d1aab](https://github.com/revanced/revanced-patches/commit/91d1aabd32be1607019bc443fb06284ca3343e9d))
|
||||
|
||||
# [2.175.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.175.0-dev.1...v2.175.0-dev.2) (2023-05-25)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **youtube/hide-info-cards:** fix hide-info-cards setting does not work ([#2246](https://github.com/revanced/revanced-patches/issues/2246)) ([72773ac](https://github.com/revanced/revanced-patches/commit/72773ac56987753fac6c0087d048b4378a3dd360))
|
||||
|
||||
# [2.175.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.174.1-dev.1...v2.175.0-dev.1) (2023-05-24)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **youtube/general-ads:** merge `hide-get-premium` patch into `general-ads` patch ([5195dd8](https://github.com/revanced/revanced-patches/commit/5195dd8936d63c482dbcb2cd0e7e9aab3c75954e))
|
||||
|
||||
## [2.174.1-dev.1](https://github.com/revanced/revanced-patches/compare/v2.174.0...v2.174.1-dev.1) (2023-05-24)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **youtube/remove-player-controls-background:** use correct patch name and description ([8732a84](https://github.com/revanced/revanced-patches/commit/8732a84422087fca7e9e1635a0b1d8d2cbf034f4))
|
||||
|
||||
# [2.174.0](https://github.com/revanced/revanced-patches/compare/v2.173.0...v2.174.0) (2023-05-24)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* account fo breaking changes from ReVanced Patcher ([#2103](https://github.com/revanced/revanced-patches/issues/2103)) ([5be25cd](https://github.com/revanced/revanced-patches/commit/5be25cde4b34d58ced35a7edbb499477b538b748))
|
||||
* check for opcode type `CONST` ([e5bb63c](https://github.com/revanced/revanced-patches/commit/e5bb63c7ab4427b6116de4a999be306e0f3cf12e))
|
||||
* incorrect cast of instruction ([fb94a1c](https://github.com/revanced/revanced-patches/commit/fb94a1cb48e8952981e2f9146eb90ee92a517b2e))
|
||||
* incorrect instruction offsets ([42a5a38](https://github.com/revanced/revanced-patches/commit/42a5a387da3c53c579234a44c124ab0ba26117cb))
|
||||
* incorrect smali syntax ([4e74a80](https://github.com/revanced/revanced-patches/commit/4e74a800c311d7acb2c2ddb492b43747db8a8def))
|
||||
* **photomath/unlock-plus:** constrain to last working version ([#2232](https://github.com/revanced/revanced-patches/issues/2232)) ([4da268e](https://github.com/revanced/revanced-patches/commit/4da268edc006ea496e3b1efd037676f1c40397da))
|
||||
* **readme-generator:** attempt sorting versions with `FlexVer` ([#2059](https://github.com/revanced/revanced-patches/issues/2059)) ([a54c464](https://github.com/revanced/revanced-patches/commit/a54c464522fa2a6a2d2525c8cb0ec961c2cc771c))
|
||||
* **spotify/disable-capture-restriction:** make compatible with latest versions ([#2095](https://github.com/revanced/revanced-patches/issues/2095)) ([e48f127](https://github.com/revanced/revanced-patches/commit/e48f1278da2a9d82e70be41fa2c4c480c574816b))
|
||||
* **twitter:** correctly resolve to integrations methods ([c655416](https://github.com/revanced/revanced-patches/commit/c655416a91f0a32cfe82b1384f5958cace891833))
|
||||
* **youtube/custom-video-speed:** add missing class for `video-speeds` patch ([#2137](https://github.com/revanced/revanced-patches/issues/2137)) ([758ef42](https://github.com/revanced/revanced-patches/commit/758ef42f9cd36d665b1737b67bcdde22d3e3eb98))
|
||||
* **youtube/integrations:** allow playback of embedded videos ([#2092](https://github.com/revanced/revanced-patches/issues/2092)) ([8a43d75](https://github.com/revanced/revanced-patches/commit/8a43d75e2db63c47bb9ad1b75027df0868c094e5))
|
||||
* **youtube/minimized-playback:** update settings description ([#2191](https://github.com/revanced/revanced-patches/issues/2191)) ([a561a9a](https://github.com/revanced/revanced-patches/commit/a561a9afc233e466459546fcc8452800ec56e057))
|
||||
* **youtube/remember-video-quality:** fix default video quality/speed being applied when resuming app. ([#2112](https://github.com/revanced/revanced-patches/issues/2112)) ([f68a41c](https://github.com/revanced/revanced-patches/commit/f68a41ce9f9a78818d3f28b069e70b8c66125f53))
|
||||
* **youtube/return-youtube-dislikes:** fix temporarily frozen video after opening a shorts ([#2126](https://github.com/revanced/revanced-patches/issues/2126)) ([e0877e3](https://github.com/revanced/revanced-patches/commit/e0877e33814ba396e64e18a577064aa5be952413))
|
||||
* **youtube/settings:** fix non functional back button in settings ([#2178](https://github.com/revanced/revanced-patches/issues/2178)) ([46da834](https://github.com/revanced/revanced-patches/commit/46da83430f69b451f971bf5e9261e9d64d1a365c))
|
||||
* **youtube/sponsorblock:** fix skip button in wrong location when full screen and comments visible ([#2051](https://github.com/revanced/revanced-patches/issues/2051)) ([30a954c](https://github.com/revanced/revanced-patches/commit/30a954cac83a66fbb25589edc487797ea5f19986))
|
||||
* **youtube/sponsorblock:** fix toast shown when scrubbing thru a paused video ([#2152](https://github.com/revanced/revanced-patches/issues/2152)) ([c6c23ff](https://github.com/revanced/revanced-patches/commit/c6c23ff0d9a18e3ef3d4b9b28ffa562a2eceb58b))
|
||||
* **youtube/spoof-signature-verification:** adjusting summary text ([#2169](https://github.com/revanced/revanced-patches/issues/2169)) ([4ccb1ee](https://github.com/revanced/revanced-patches/commit/4ccb1ee0b988bc0ddd6a0c986975b17caa828770))
|
||||
* **youtube/theme:** apply custom seekbar color to video thumbnails ([#2085](https://github.com/revanced/revanced-patches/issues/2085)) ([d497027](https://github.com/revanced/revanced-patches/commit/d4970273ad10f62cd9455ef9b847c686147f7dca))
|
||||
* **youtube/theme:** move options out of dependency patch ([a953448](https://github.com/revanced/revanced-patches/commit/a95344879c2ac2cd6da8ce0273dcb05e8a35d2ec))
|
||||
* **youtube/vanced-microg-support:** depend on `client-spoof` patch ([83a4905](https://github.com/revanced/revanced-patches/commit/83a490575c60adf21db926df3013f539c6d33068))
|
||||
* **youtube/video-speed:** add compatibility annotation ([#2156](https://github.com/revanced/revanced-patches/issues/2156)) ([ffa2e5d](https://github.com/revanced/revanced-patches/commit/ffa2e5d7eb0b90bb5c7a6854bab4caf9f810d917))
|
||||
* **youtube:** add missing compatibility annotations for `theme` and `hide-load-more-button` ([#2150](https://github.com/revanced/revanced-patches/issues/2150)) ([78803f8](https://github.com/revanced/revanced-patches/commit/78803f8ea85684e4c69e75b676fa40bae8760957))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add capability to filter from protobuf buffer ([b738b6b](https://github.com/revanced/revanced-patches/commit/b738b6bf3506f222844ef4bca99a91f78d331391))
|
||||
* **candylinkvpn:** add `unlock-pro` patch ([#2157](https://github.com/revanced/revanced-patches/issues/2157)) ([7159f86](https://github.com/revanced/revanced-patches/commit/7159f867801300d4ae32937743de59421de76238))
|
||||
* improve structure of `README` ([279b193](https://github.com/revanced/revanced-patches/commit/279b193b687ad9cba44ab9c2a88d2ce06be0bbf0))
|
||||
* **messenger:** add `disable-switching-emoji-to-sticker-in-message-input-field` patch ([#2099](https://github.com/revanced/revanced-patches/issues/2099)) ([ac5532a](https://github.com/revanced/revanced-patches/commit/ac5532a65c353b1964d9b7d990341fc7362e510d))
|
||||
* **messenger:** add `disable-typing-indicator` patch ([#2115](https://github.com/revanced/revanced-patches/issues/2115)) ([5d1de4f](https://github.com/revanced/revanced-patches/commit/5d1de4f4eab83e61cfc1c4aaee74179afcb9431f))
|
||||
* **patch:** bump compatibility ([#2060](https://github.com/revanced/revanced-patches/issues/2060)) ([f86836d](https://github.com/revanced/revanced-patches/commit/f86836d6295db9eb8c59916deaa991b4d99e96be))
|
||||
* **reddit:** add `sanitize-sharing-links` patch ([#2192](https://github.com/revanced/revanced-patches/issues/2192)) ([9593e4b](https://github.com/revanced/revanced-patches/commit/9593e4b5db604957545b4ab6747c82fb815ac08b))
|
||||
* **reddit:** remove compatibility version constraints ([#2226](https://github.com/revanced/revanced-patches/issues/2226)) ([f1288e4](https://github.com/revanced/revanced-patches/commit/f1288e4bb8fb1b9f394d73fd814d97db8704b8e0))
|
||||
* **syncforreddit:** add `disable-ads` patch ([#2066](https://github.com/revanced/revanced-patches/issues/2066)) ([c1de5d6](https://github.com/revanced/revanced-patches/commit/c1de5d6e433263b9a17305fa1c65807921594731))
|
||||
* **trakt:** add `unlock-pro` patch ([#2210](https://github.com/revanced/revanced-patches/issues/2210)) ([1e8dcae](https://github.com/revanced/revanced-patches/commit/1e8dcae6f540455b8698703bbded5f52fd0c6300))
|
||||
* **twitch/auto-claim-channel-points:** use correct casing for "Channel Points" ([#2138](https://github.com/revanced/revanced-patches/issues/2138)) ([76a3bf2](https://github.com/revanced/revanced-patches/commit/76a3bf23b5e5591ae635e612af07cbbd78d49f53))
|
||||
* **twitch:** add `auto-claim-channel-points` patch ([#2131](https://github.com/revanced/revanced-patches/issues/2131)) ([80fb670](https://github.com/revanced/revanced-patches/commit/80fb6701b52a8c6c6bada5546dffe3438f0e4879))
|
||||
* use consistent names for patches ([6347146](https://github.com/revanced/revanced-patches/commit/634714690086168e63d6aa9475893135cb58db68))
|
||||
* **vsco:** add `unlock-pro` patch ([#2168](https://github.com/revanced/revanced-patches/issues/2168)) ([7ffd1a0](https://github.com/revanced/revanced-patches/commit/7ffd1a09a7bcf09bc7e7d5f3c8c8613ca34c8c59))
|
||||
* **youtube/copy-video-url:** add tap and hold functionality to copy video url buttons ([#2174](https://github.com/revanced/revanced-patches/issues/2174)) ([95bbf46](https://github.com/revanced/revanced-patches/commit/95bbf46e77a608bd7ba8f0073d50fef01012d4df))
|
||||
* **youtube/downloads:** improve patch description ([e0f6452](https://github.com/revanced/revanced-patches/commit/e0f64520d0235ea219f1965ba34b7e52ded9c1d9))
|
||||
* **youtube/hide-filter-bar:** add `PreferenceScreen` summary ([2bba5f7](https://github.com/revanced/revanced-patches/commit/2bba5f72fae06e352d2984fea7c8cc65d38ed221))
|
||||
* **youtube/hide-player-overlay:** make it toggleable in settings ([#2044](https://github.com/revanced/revanced-patches/issues/2044)) ([f693d55](https://github.com/revanced/revanced-patches/commit/f693d55caf1e0b72bb1f4c39b1eeb59436191e02))
|
||||
* **youtube/hide-shorts-components:** hide navigation bar ([24f376a](https://github.com/revanced/revanced-patches/commit/24f376a4b8d6bdccc32ffff0d983f22eb4940791))
|
||||
* **youtube/settings:** add reset button to edit preference dialog ([#2047](https://github.com/revanced/revanced-patches/issues/2047)) ([ede765a](https://github.com/revanced/revanced-patches/commit/ede765ae3c506909ee8a99517b99b6f5f113f01a))
|
||||
* **youtube/video-speed:** change custom video speeds inside app settings ([#2114](https://github.com/revanced/revanced-patches/issues/2114)) ([d97815a](https://github.com/revanced/revanced-patches/commit/d97815af18e645fd0fa087db0174bcc2a771ec72))
|
||||
* **youtube:** `hide-load-more-button` patch ([#2078](https://github.com/revanced/revanced-patches/issues/2078)) ([7170802](https://github.com/revanced/revanced-patches/commit/71708022a06453f6f56c19d686fc505286523391))
|
||||
* **youtube:** add `hide-filter-bar` patch ([6cc5f61](https://github.com/revanced/revanced-patches/commit/6cc5f61e0712fe25cd45b137773decaf4b9bb582))
|
||||
* **youtube:** add `hide-shorts-components` patch ([64868f4](https://github.com/revanced/revanced-patches/commit/64868f41be9f567cb54d9214fafbf849d08b64d2))
|
||||
* **youtube:** add options to disable toasts on connection error ([#2159](https://github.com/revanced/revanced-patches/issues/2159)) ([99916ae](https://github.com/revanced/revanced-patches/commit/99916aefaaea3b94e94e2901d70493fdb18a3dab))
|
||||
* **youtube:** constrain patches to `18.16.37` ([758b300](https://github.com/revanced/revanced-patches/commit/758b3005919e11d9dd4f19bf110e9d282f8d1925))
|
||||
* **youtube:** import / export of revanced settings ([#2077](https://github.com/revanced/revanced-patches/issues/2077)) ([b59cb3e](https://github.com/revanced/revanced-patches/commit/b59cb3ed60293aaf81067ff3469863add09c6b13))
|
||||
* **youtube:** move video settings to `Video` settings category ([#2010](https://github.com/revanced/revanced-patches/issues/2010)) ([f4b9180](https://github.com/revanced/revanced-patches/commit/f4b918075a70d1a4ed9ac7e9c1f0e0acd1c77404))
|
||||
* **youtube:** support version `18.19.35` ([491f292](https://github.com/revanced/revanced-patches/commit/491f292182a419cb5399de768560ae4daa7c86cb))
|
||||
|
||||
# [2.174.0-dev.41](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.40...v2.174.0-dev.41) (2023-05-24)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **youtube/vanced-microg-support:** depend on `client-spoof` patch ([83a4905](https://github.com/revanced/revanced-patches/commit/83a490575c60adf21db926df3013f539c6d33068))
|
||||
|
||||
# [2.174.0-dev.40](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.39...v2.174.0-dev.40) (2023-05-23)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **photomath/unlock-plus:** constrain to last working version ([#2232](https://github.com/revanced/revanced-patches/issues/2232)) ([4da268e](https://github.com/revanced/revanced-patches/commit/4da268edc006ea496e3b1efd037676f1c40397da))
|
||||
|
||||
# [2.174.0-dev.39](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.38...v2.174.0-dev.39) (2023-05-22)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **reddit:** remove compatibility version constraints ([#2226](https://github.com/revanced/revanced-patches/issues/2226)) ([f1288e4](https://github.com/revanced/revanced-patches/commit/f1288e4bb8fb1b9f394d73fd814d97db8704b8e0))
|
||||
|
||||
# [2.174.0-dev.38](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.37...v2.174.0-dev.38) (2023-05-21)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **trakt:** add `unlock-pro` patch ([#2210](https://github.com/revanced/revanced-patches/issues/2210)) ([1e8dcae](https://github.com/revanced/revanced-patches/commit/1e8dcae6f540455b8698703bbded5f52fd0c6300))
|
||||
|
||||
# [2.174.0-dev.37](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.36...v2.174.0-dev.37) (2023-05-21)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **reddit:** add `sanitize-sharing-links` patch ([#2192](https://github.com/revanced/revanced-patches/issues/2192)) ([9593e4b](https://github.com/revanced/revanced-patches/commit/9593e4b5db604957545b4ab6747c82fb815ac08b))
|
||||
|
||||
# [2.174.0-dev.36](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.35...v2.174.0-dev.36) (2023-05-20)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **twitter:** correctly resolve to integrations methods ([c655416](https://github.com/revanced/revanced-patches/commit/c655416a91f0a32cfe82b1384f5958cace891833))
|
||||
|
||||
# [2.174.0-dev.35](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.34...v2.174.0-dev.35) (2023-05-19)
|
||||
|
||||
|
||||
|
||||
36
README.md
36
README.md
@@ -20,8 +20,8 @@ The official ReVanced Patches.
|
||||
| `disable-player-popup-panels` | Disables panels from appearing automatically when going into fullscreen (playlist or live chat). | 18.19.35 |
|
||||
| `disable-shorts-on-startup` | Disables playing YouTube Shorts when launching YouTube. | 18.19.35 |
|
||||
| `disable-zoom-haptics` | Disables haptics when zooming. | all |
|
||||
| `downloads` | Adds a download button to the YouTube video player. | 18.19.35 |
|
||||
| `enable-debugging` | Adds debugging options. | all |
|
||||
| `external-downloads` | Adds support to download and save YouTube videos using an external app. | 18.19.35 |
|
||||
| `hdr-auto-brightness` | Makes the brightness of HDR videos follow the system default. | 18.19.35 |
|
||||
| `hide-ads` | Removes general ads. | 18.19.35 |
|
||||
| `hide-album-cards` | Hides the album cards below the artist description. | 18.19.35 |
|
||||
@@ -35,7 +35,6 @@ The official ReVanced Patches.
|
||||
| `hide-endscreen-cards` | Hides the suggested video cards at the end of a video in fullscreen. | 18.19.35 |
|
||||
| `hide-filter-bar` | Hides the filter bar in video feeds. | 18.19.35 |
|
||||
| `hide-floating-microphone-button` | Hides the floating microphone button which appears in search. | 18.19.35 |
|
||||
| `hide-get-premium` | Hides advertisement for YouTube Premium under the video player. | 18.19.35 |
|
||||
| `hide-info-cards` | Hides info cards in videos. | 18.19.35 |
|
||||
| `hide-load-more-button` | Hides the button under videos that loads similar videos. | 18.19.35 |
|
||||
| `hide-player-buttons` | Adds the option to hide video player previous and next buttons. | 18.19.35 |
|
||||
@@ -52,7 +51,7 @@ The official ReVanced Patches.
|
||||
| `open-links-externally` | Open links outside of the app directly in your browser. | 18.19.35 |
|
||||
| `premium-heading` | Shows premium branding on the home screen. | all |
|
||||
| `remember-video-quality` | Adds the ability to remember the video quality you chose in the video quality flyout. | 18.19.35 |
|
||||
| `remove-player-button-background` | Removes the background from the video player buttons. | 18.19.35 |
|
||||
| `remove-player-controls-background` | Removes the background from the video player controls. | 18.19.35 |
|
||||
| `return-youtube-dislike` | Shows the dislike count of videos using the Return YouTube Dislike API. | 18.19.35 |
|
||||
| `seekbar-tapping` | Enables tap-to-seek on the seekbar of the video player. | 18.19.35 |
|
||||
| `sponsorblock` | Integrates SponsorBlock which allows skipping video segments such as sponsored content. | 18.19.35 |
|
||||
@@ -141,6 +140,17 @@ The official ReVanced Patches.
|
||||
| `hide-views-stats` | Hides the view stats under tweets. | 9.71.0-release.0 |
|
||||
</details>
|
||||
|
||||
### [📦 `com.reddit.frontpage`](https://play.google.com/store/apps/details?id=com.reddit.frontpage)
|
||||
<details>
|
||||
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `hide-ads` | Removes general ads from the Reddit frontpage and subreddits. | all |
|
||||
| `hide-subreddit-banner` | Hides banner ads from comments on subreddits. | all |
|
||||
| `premium-icon-reddit` | Unlocks premium Reddit app icons. | all |
|
||||
| `sanitize-sharing-links` | Removes (tracking) query parameters from the URLs when sharing links. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `com.spotify.music`](https://play.google.com/store/apps/details?id=com.spotify.music)
|
||||
<details>
|
||||
|
||||
@@ -161,16 +171,6 @@ The official ReVanced Patches.
|
||||
| `hide-inbox-ads` | Hides ads in inbox. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `com.reddit.frontpage`](https://play.google.com/store/apps/details?id=com.reddit.frontpage)
|
||||
<details>
|
||||
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `hide-ads` | Removes general ads from the Reddit frontpage and subreddits. | 2023.12.0 |
|
||||
| `hide-subreddit-banner` | Hides banner ads from comments on subreddits. | 2023.12.0 |
|
||||
| `premium-icon-reddit` | Unlocks premium Reddit app icons. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `at.gv.bmf.bmf2go`](https://play.google.com/store/apps/details?id=at.gv.bmf.bmf2go)
|
||||
<details>
|
||||
|
||||
@@ -298,7 +298,7 @@ The official ReVanced Patches.
|
||||
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `unlock-plus` | Unlocks plus features. | all |
|
||||
| `unlock-plus` | Unlocks plus features. | 8.20.0 |
|
||||
</details>
|
||||
|
||||
### [📦 `io.yuka.android`](https://play.google.com/store/apps/details?id=io.yuka.android)
|
||||
@@ -341,6 +341,14 @@ The official ReVanced Patches.
|
||||
| `unlock-pro` | Unlocks all pro features. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `tv.trakt.trakt`](https://play.google.com/store/apps/details?id=tv.trakt.trakt)
|
||||
<details>
|
||||
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `unlock-pro` | Unlocks pro features. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `co.windyapp.android`](https://play.google.com/store/apps/details?id=co.windyapp.android)
|
||||
<details>
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ repositories {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation("app.revanced:revanced-patcher:8.0.0")
|
||||
implementation("app.revanced:revanced-patcher:9.0.0")
|
||||
implementation("app.revanced:multidexlib2:2.5.3-a3836654")
|
||||
// Required for meta
|
||||
implementation("com.google.code.gson:gson:2.10.1")
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
kotlin.code.style = official
|
||||
version = 2.174.0-dev.35
|
||||
version = 2.175.0-dev.4
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -5,7 +5,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object BootStateFingerprint : MethodFingerprint(
|
||||
"Z",
|
||||
access = AccessFlags.PUBLIC.value,
|
||||
accessFlags = AccessFlags.PUBLIC.value,
|
||||
strings = listOf("Boot state of device: %s"),
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/AttestationHelper;")
|
||||
|
||||
@@ -5,7 +5,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object BootloaderDetectionFingerprint : MethodFingerprint(
|
||||
"Z",
|
||||
access = AccessFlags.PUBLIC.value,
|
||||
accessFlags = AccessFlags.PUBLIC.value,
|
||||
strings = listOf("Creation of attestation key succeeded", "Creation of attestation key failed"),
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/AttestationHelper;")
|
||||
|
||||
@@ -5,7 +5,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object RootDetectionFingerprint : MethodFingerprint(
|
||||
"V",
|
||||
access = AccessFlags.PUBLIC.value,
|
||||
accessFlags = AccessFlags.PUBLIC.value,
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/DeviceIntegrityCheck;")
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
object SpoofSignatureFingerprint : MethodFingerprint(
|
||||
"L",
|
||||
parameters = listOf("L"),
|
||||
access = AccessFlags.PRIVATE.value,
|
||||
accessFlags = AccessFlags.PRIVATE.value,
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/SL2Step1Task;") && methodDef.name == "getPubKey"
|
||||
}
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
package app.revanced.patches.inshorts.ad.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
object InshortsAdsFingerprint : MethodFingerprint(
|
||||
"V",
|
||||
strings = listOf("GoogleAdLoader","exception in requestAd")
|
||||
strings = listOf("GoogleAdLoader","exception in requestAd"),
|
||||
)
|
||||
@@ -9,13 +9,13 @@ import org.jf.dexlib2.iface.Method
|
||||
|
||||
abstract class MediaAdFingerprint(
|
||||
returnType: String? = "Z",
|
||||
access: Int? = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags: Int? = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters: Iterable<String>? = listOf(),
|
||||
opcodes: Iterable<Opcode>?,
|
||||
customFingerprint: ((methodDef: Method, classDef: ClassDef) -> Boolean)? = null
|
||||
) : MethodFingerprint(
|
||||
returnType,
|
||||
access,
|
||||
accessFlags,
|
||||
parameters,
|
||||
opcodes,
|
||||
customFingerprint = customFingerprint
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
object LicenseValidationFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
parameters = listOf("Landroid/content/Context;"),
|
||||
opcodes = listOf(
|
||||
Opcode.INVOKE_STATIC,
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.jf.dexlib2.Opcode
|
||||
@FuzzyPatternScanMethod(2)
|
||||
object VerifySignatureFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
parameters = listOf("Landroid/app/Activity;"),
|
||||
opcodes = listOf(
|
||||
Opcode.SGET_OBJECT,
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
object IsFreeVersionFingerprint : MethodFingerprint(
|
||||
returnType = "Ljava/lang/Boolean;",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
strings = listOf("free"),
|
||||
parameters = listOf("Landroid/content/Context;"),
|
||||
opcodes = listOf(
|
||||
|
||||
@@ -10,7 +10,7 @@ object LoadInboxAdsFingerprint : MethodFingerprint(
|
||||
"ads_load_begin",
|
||||
"inbox_ads_fetch_start"
|
||||
),
|
||||
access = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lcom/facebook/messaging/business/inboxads/plugins/inboxads/itemsupplier/InboxAdsItemSupplierImplementation;"
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
object CheckSignatureFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
customFingerprint = { methodDef, _ ->
|
||||
(methodDef.definingClass == "Lcom/microblink/photomath/main/activity/LauncherActivity;" ||
|
||||
methodDef.definingClass == "Lcom/microblink/photomath/PhotoMath;") &&
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package app.revanced.patches.photomath.misc.unlockplus.annotations
|
||||
|
||||
import app.revanced.patcher.annotation.Compatibility
|
||||
import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility([Package("com.microblink.photomath", arrayOf("8.20.0"))])
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
internal annotation class UnlockPlusCompatibilty
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object IsPlusUnlockedFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
strings = listOf(
|
||||
"genius"
|
||||
),
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
package app.revanced.patches.photomath.misc.unlockplus.patch
|
||||
|
||||
import app.revanced.extensions.toErrorResult
|
||||
import app.revanced.patcher.annotation.Compatibility
|
||||
import app.revanced.patcher.annotation.Description
|
||||
import app.revanced.patcher.annotation.Name
|
||||
import app.revanced.patcher.annotation.Package
|
||||
import app.revanced.patcher.annotation.Version
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.addInstructions
|
||||
@@ -14,13 +12,14 @@ import app.revanced.patcher.patch.PatchResultSuccess
|
||||
import app.revanced.patcher.patch.annotations.DependsOn
|
||||
import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patches.photomath.detection.signature.patch.SignatureDetectionPatch
|
||||
import app.revanced.patches.photomath.misc.unlockplus.annotations.UnlockPlusCompatibilty
|
||||
import app.revanced.patches.photomath.misc.unlockplus.fingerprints.IsPlusUnlockedFingerprint
|
||||
|
||||
@Patch
|
||||
@Name("unlock-plus")
|
||||
@DependsOn([SignatureDetectionPatch::class])
|
||||
@Description("Unlocks plus features.")
|
||||
@Compatibility([Package("com.microblink.photomath")])
|
||||
@UnlockPlusCompatibilty
|
||||
@Version("0.0.1")
|
||||
class UnlockPlusPatch : BytecodePatch(
|
||||
listOf(
|
||||
@@ -41,4 +40,4 @@ class UnlockPlusPatch : BytecodePatch(
|
||||
return PatchResultSuccess()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -5,18 +5,7 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.reddit.frontpage", arrayOf(
|
||||
"2023.05.0",
|
||||
"2023.06.0",
|
||||
"2023.07.0",
|
||||
"2023.07.1",
|
||||
"2023.08.0",
|
||||
"2023.09.0",
|
||||
"2023.09.1",
|
||||
"2023.10.0",
|
||||
"2023.11.0",
|
||||
"2023.12.0"
|
||||
)
|
||||
"com.reddit.frontpage"
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
||||
@@ -5,20 +5,7 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.reddit.frontpage", arrayOf(
|
||||
"2021.45.0",
|
||||
"2022.43.0",
|
||||
"2023.05.0",
|
||||
"2023.06.0",
|
||||
"2023.07.0",
|
||||
"2023.07.1",
|
||||
"2023.08.0",
|
||||
"2023.09.0",
|
||||
"2023.09.1",
|
||||
"2023.10.0",
|
||||
"2023.11.0",
|
||||
"2023.12.0"
|
||||
)
|
||||
"com.reddit.frontpage"
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package app.revanced.patches.reddit.misc.tracking.url.annotations
|
||||
|
||||
import app.revanced.patcher.annotation.Compatibility
|
||||
import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.reddit.frontpage"
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
internal annotation class SanitizeUrlQueryCompatibility
|
||||
@@ -0,0 +1,22 @@
|
||||
package app.revanced.patches.reddit.misc.tracking.url.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 ShareLinkFactoryFingerprint : MethodFingerprint(
|
||||
returnType = "L",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
opcodes = listOf(
|
||||
Opcode.CONST_STRING,
|
||||
Opcode.CONST_STRING,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.APUT_OBJECT,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.INVOKE_STATIC, // Returns the URL.
|
||||
Opcode.MOVE_RESULT_OBJECT
|
||||
),
|
||||
customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("ShareLinkFactory;") }
|
||||
)
|
||||
@@ -0,0 +1,52 @@
|
||||
package app.revanced.patches.reddit.misc.tracking.url.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.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.Patch
|
||||
import app.revanced.patcher.patch.annotations.RequiresIntegrations
|
||||
import app.revanced.patches.reddit.misc.tracking.url.annotations.SanitizeUrlQueryCompatibility
|
||||
import app.revanced.patches.reddit.misc.tracking.url.fingerprints.ShareLinkFactoryFingerprint
|
||||
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
|
||||
@Patch
|
||||
@Name("sanitize-sharing-links")
|
||||
@Description("Removes (tracking) query parameters from the URLs when sharing links.")
|
||||
@SanitizeUrlQueryCompatibility
|
||||
@Version("0.0.1")
|
||||
@RequiresIntegrations
|
||||
class SanitizeUrlQueryPatch : BytecodePatch(
|
||||
listOf(ShareLinkFactoryFingerprint)
|
||||
) {
|
||||
override fun execute(context: BytecodeContext): PatchResult {
|
||||
ShareLinkFactoryFingerprint.result?.let { result ->
|
||||
result.mutableMethod.apply {
|
||||
val insertIndex = result.scanResult.patternScanResult!!.endIndex + 1
|
||||
val urlRegister = instruction<OneRegisterInstruction>(insertIndex - 1).registerA
|
||||
|
||||
addInstructions(
|
||||
insertIndex,
|
||||
"""
|
||||
invoke-static {v$urlRegister}, $SANITIZE_METHOD_DESCRIPTOR
|
||||
move-result-object v$urlRegister
|
||||
"""
|
||||
)
|
||||
}
|
||||
} ?: return ShareLinkFactoryFingerprint.toErrorResult()
|
||||
|
||||
return PatchResultSuccess()
|
||||
}
|
||||
|
||||
private companion object {
|
||||
private const val SANITIZE_METHOD_DESCRIPTOR =
|
||||
"Lapp/revanced/reddit/patches/SanitizeUrlQueryPatch;" +
|
||||
"->stripQueryParameters(Ljava/lang/String;)Ljava/lang/String;"
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@ 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.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint.RegisterResolver
|
||||
import org.jf.dexlib2.Opcode
|
||||
import org.jf.dexlib2.iface.ClassDef
|
||||
import org.jf.dexlib2.iface.Method
|
||||
@@ -27,7 +28,7 @@ abstract class AbstractIntegrationsPatch(
|
||||
*/
|
||||
abstract class IntegrationsFingerprint(
|
||||
returnType: String? = null,
|
||||
access: Int? = null,
|
||||
accessFlags: Int? = null,
|
||||
parameters: Iterable<String>? = null,
|
||||
opcodes: Iterable<Opcode?>? = null,
|
||||
strings: Iterable<String>? = null,
|
||||
@@ -35,7 +36,7 @@ abstract class AbstractIntegrationsPatch(
|
||||
private val contextRegisterResolver: (Method) -> Int = object : RegisterResolver {}
|
||||
) : MethodFingerprint(
|
||||
returnType,
|
||||
access,
|
||||
accessFlags,
|
||||
parameters,
|
||||
opcodes,
|
||||
strings,
|
||||
|
||||
@@ -6,6 +6,6 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object IsAdsEnabledFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
strings = listOf("SyncIapHelper")
|
||||
)
|
||||
@@ -9,7 +9,7 @@ import org.jf.dexlib2.iface.reference.TypeReference
|
||||
|
||||
object PiracyDetectionFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
access = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||
opcodes = listOf(
|
||||
Opcode.NEW_INSTANCE,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
|
||||
@@ -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,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC or AccessFlags.SYNTHETIC,
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/FeedApiService;") && methodDef.name == "LIZ"
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object SpeedControlParentFingerprint : MethodFingerprint(
|
||||
returnType = "L",
|
||||
access = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||
parameters = listOf(
|
||||
"L"
|
||||
),
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object GoogleAuthAvailableFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf(),
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lcom/bytedance/lobby/google/GoogleAuth;"
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object GoogleOneTapAuthAvailableFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf(),
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lcom/bytedance/lobby/google/GoogleOneTapAuth;"
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package app.revanced.patches.trakt.annotations
|
||||
|
||||
import app.revanced.patcher.annotation.Compatibility
|
||||
import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility([Package("tv.trakt.trakt")])
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
internal annotation class UnlockProCompatibility
|
||||
@@ -0,0 +1,11 @@
|
||||
package app.revanced.patches.trakt.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object IsVIPEPFingerprint : MethodFingerprint(
|
||||
customFingerprint = custom@{ methodDef, _ ->
|
||||
if (!methodDef.definingClass.endsWith("RealmUserSettings;")) return@custom false
|
||||
|
||||
methodDef.name == "isVIPEP"
|
||||
}
|
||||
)
|
||||
@@ -0,0 +1,11 @@
|
||||
package app.revanced.patches.trakt.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object IsVIPFingerprint : MethodFingerprint(
|
||||
customFingerprint = custom@{ methodDef, _ ->
|
||||
if (!methodDef.definingClass.endsWith("RealmUserSettings;")) return@custom false
|
||||
|
||||
methodDef.name == "isVIP"
|
||||
}
|
||||
)
|
||||
@@ -0,0 +1,9 @@
|
||||
package app.revanced.patches.trakt.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object RealmUserSettingsFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("RealmUserSettings;")
|
||||
}
|
||||
)
|
||||
@@ -0,0 +1,52 @@
|
||||
package app.revanced.patches.trakt.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.fingerprint.method.impl.MethodFingerprint.Companion.resolve
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.PatchResult
|
||||
import app.revanced.patcher.patch.PatchResultSuccess
|
||||
import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patches.trakt.annotations.UnlockProCompatibility
|
||||
import app.revanced.patches.trakt.fingerprints.IsVIPEPFingerprint
|
||||
import app.revanced.patches.trakt.fingerprints.IsVIPFingerprint
|
||||
import app.revanced.patches.trakt.fingerprints.RealmUserSettingsFingerprint
|
||||
|
||||
@Patch
|
||||
@Name("unlock-pro")
|
||||
@Description("Unlocks pro features.")
|
||||
@UnlockProCompatibility
|
||||
@Version("0.0.1")
|
||||
class UnlockProPatch : BytecodePatch(
|
||||
listOf(RealmUserSettingsFingerprint)
|
||||
) {
|
||||
override fun execute(context: BytecodeContext): PatchResult {
|
||||
RealmUserSettingsFingerprint.result?.classDef?.let { realUserSettingsClass ->
|
||||
arrayOf(IsVIPFingerprint, IsVIPEPFingerprint).onEach { fingerprint ->
|
||||
// Resolve both fingerprints on the same class.
|
||||
if (!fingerprint.resolve(context, realUserSettingsClass))
|
||||
throw fingerprint.toErrorResult()
|
||||
}.forEach { fingerprint ->
|
||||
// Return true for both VIP check methods.
|
||||
fingerprint.result?.mutableMethod?.addInstructions(0, RETURN_TRUE_INSTRUCTIONS)
|
||||
?: return fingerprint.toErrorResult()
|
||||
}
|
||||
} ?: return RealmUserSettingsFingerprint.toErrorResult()
|
||||
|
||||
return PatchResultSuccess()
|
||||
}
|
||||
|
||||
private companion object {
|
||||
const val RETURN_TRUE_INSTRUCTIONS =
|
||||
"""
|
||||
const/4 v0, 0x1
|
||||
invoke-static {v0}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
|
||||
move-result-object v1
|
||||
return-object v1
|
||||
"""
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object InlineActionTypesFingerprint : MethodFingerprint(
|
||||
returnType = "Ljava/util/List",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
strings = listOf(
|
||||
"getCurrentMemoizing()",
|
||||
"android_animated_reply_icon_enabled",
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
object TweetStatsContainerConstructorFingerprint : MethodFingerprint(
|
||||
access = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
parameters = listOf("L"),
|
||||
opcodes = listOf(
|
||||
Opcode.INVOKE_DIRECT,
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
object TweetStatsContainerWrapperConstructorFingerprint : MethodFingerprint(
|
||||
access = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
parameters = listOf("L"),
|
||||
opcodes = listOf(
|
||||
Opcode.INVOKE_DIRECT,
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
object TweetStatsViewDelegateBinderFingerprint : MethodFingerprint(
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
opcodes = listOf(
|
||||
Opcode.NEW_INSTANCE,
|
||||
Opcode.CONST_16,
|
||||
|
||||
@@ -5,5 +5,9 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
object JsonHookPatchFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef, _ -> methodDef.name == "<clinit>" },
|
||||
opcodes = listOf(Opcode.IGET_OBJECT)
|
||||
opcodes = listOf(
|
||||
Opcode.INVOKE_INTERFACE, // Add dummy hook to hooks list.
|
||||
// Add hooks to the hooks list.
|
||||
Opcode.INVOKE_STATIC // Call buildList.
|
||||
)
|
||||
)
|
||||
@@ -5,13 +5,18 @@ 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.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.*
|
||||
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.patcher.patch.annotations.RequiresIntegrations
|
||||
import app.revanced.patches.twitter.misc.hook.json.fingerprints.JsonHookPatchFingerprint
|
||||
import app.revanced.patches.twitter.misc.hook.json.fingerprints.JsonInputStreamFingerprint
|
||||
import app.revanced.patches.twitter.misc.hook.json.fingerprints.LoganSquareFingerprint
|
||||
import java.io.Closeable
|
||||
import java.io.InvalidClassException
|
||||
|
||||
@Name("json-hook")
|
||||
@@ -20,16 +25,16 @@ import java.io.InvalidClassException
|
||||
@RequiresIntegrations
|
||||
class JsonHookPatch : BytecodePatch(
|
||||
listOf(LoganSquareFingerprint)
|
||||
) {
|
||||
), Closeable {
|
||||
override fun execute(context: BytecodeContext): PatchResult {
|
||||
// Make sure the integrations are present.
|
||||
val jsonHookPatch = context.findClass { it.type == JSON_HOOK_PATCH_CLASS_DESCRIPTOR }
|
||||
?: return PatchResultError("Could not find integrations.")
|
||||
JsonHookPatchFingerprint.also {
|
||||
// Make sure the integrations are present.
|
||||
val jsonHookPatch = context.findClass { classDef -> classDef.type == JSON_HOOK_PATCH_CLASS_DESCRIPTOR }
|
||||
?: throw PatchResultError("Could not find integrations.")
|
||||
|
||||
// Allow patch to inject hooks into the patches integrations.
|
||||
jsonHookPatchFingerprintResult = JsonHookPatchFingerprint.also {
|
||||
it.resolve(context, jsonHookPatch.immutableClass)
|
||||
}.result ?: return PatchResultError("Unexpected integrations.")
|
||||
if (!it.resolve(context, jsonHookPatch.immutableClass))
|
||||
throw PatchResultError("Unexpected integrations.")
|
||||
}.let { hooks = JsonHookPatchHook(it) }
|
||||
|
||||
// Conveniently find the type to hook a method in, via a named field.
|
||||
val jsonFactory = LoganSquareFingerprint.result
|
||||
@@ -64,30 +69,10 @@ class JsonHookPatch : BytecodePatch(
|
||||
*
|
||||
* @param context The [BytecodeContext] of the current patch.
|
||||
* @param descriptor The class descriptor of the hook.
|
||||
* @throws ClassNotFoundException If the class could not be found.
|
||||
*/
|
||||
internal class Hook(context: BytecodeContext, private val descriptor: String) {
|
||||
private var added = false
|
||||
|
||||
/**
|
||||
* Add the hook.
|
||||
*/
|
||||
internal fun add() {
|
||||
if (added) return
|
||||
|
||||
jsonHookPatchFingerprintResult.apply {
|
||||
mutableMethod.apply {
|
||||
addInstructions(
|
||||
scanResult.patternScanResult!!.startIndex,
|
||||
"""
|
||||
sget-object v1, $descriptor->INSTANCE:$descriptor
|
||||
invoke-virtual {v0, v1}, Lkotlin/collections/builders/ListBuilder;->add(Ljava/lang/Object;)Z
|
||||
"""
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
added = true
|
||||
}
|
||||
internal class Hook(context: BytecodeContext, internal val descriptor: String) {
|
||||
internal var added = false
|
||||
|
||||
init {
|
||||
context.findClass { it.type == descriptor }?.let {
|
||||
@@ -102,15 +87,67 @@ class JsonHookPatch : BytecodePatch(
|
||||
}
|
||||
}
|
||||
|
||||
private companion object {
|
||||
const val JSON_HOOK_CLASS_NAMESPACE = "app/revanced/twitter/patches/hook/json"
|
||||
/**
|
||||
* A hook for the [JsonHookPatch].
|
||||
*
|
||||
* @param jsonHookPatchFingerprint The [JsonHookPatchFingerprint] to hook.
|
||||
*/
|
||||
internal class JsonHookPatchHook(jsonHookPatchFingerprint: MethodFingerprint): Closeable {
|
||||
private val jsonHookPatchFingerprintResult = jsonHookPatchFingerprint.result!!
|
||||
private val jsonHookPatchIndex = jsonHookPatchFingerprintResult.scanResult.patternScanResult!!.endIndex
|
||||
|
||||
const val JSON_HOOK_PATCH_CLASS_DESCRIPTOR = "L$JSON_HOOK_CLASS_NAMESPACE/JsonHookPatch;"
|
||||
/**
|
||||
* Add a hook to the [JsonHookPatch].
|
||||
* Will not add the hook if it's already added.
|
||||
*
|
||||
* @param hook The [Hook] to add.
|
||||
*/
|
||||
fun addHook(hook: Hook) {
|
||||
if (hook.added) return
|
||||
|
||||
const val BASE_PATCH_CLASS_NAME = "BaseJsonHook"
|
||||
jsonHookPatchFingerprintResult.mutableMethod.apply {
|
||||
// Insert hooks right before calling buildList.
|
||||
val insertIndex = jsonHookPatchIndex
|
||||
|
||||
const val JSON_HOOK_CLASS_DESCRIPTOR = "L$JSON_HOOK_CLASS_NAMESPACE/$BASE_PATCH_CLASS_NAME;"
|
||||
addInstructions(
|
||||
insertIndex,
|
||||
"""
|
||||
sget-object v1, ${hook.descriptor}->INSTANCE:${hook.descriptor}
|
||||
invoke-interface {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
private lateinit var jsonHookPatchFingerprintResult: MethodFingerprintResult
|
||||
hook.added = true
|
||||
}
|
||||
|
||||
override fun close() {
|
||||
// Remove hooks.add(dummyHook).
|
||||
jsonHookPatchFingerprintResult.mutableMethod.apply {
|
||||
val addDummyHookIndex = jsonHookPatchIndex - 2
|
||||
|
||||
removeInstructions(addDummyHookIndex, 2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun close() = hooks.close()
|
||||
|
||||
internal companion object {
|
||||
private const val JSON_HOOK_CLASS_NAMESPACE = "app/revanced/twitter/patches/hook/json"
|
||||
|
||||
private const val JSON_HOOK_PATCH_CLASS_DESCRIPTOR = "L$JSON_HOOK_CLASS_NAMESPACE/JsonHookPatch;"
|
||||
|
||||
private const val BASE_PATCH_CLASS_NAME = "BaseJsonHook"
|
||||
|
||||
private const val JSON_HOOK_CLASS_DESCRIPTOR = "L$JSON_HOOK_CLASS_NAMESPACE/$BASE_PATCH_CLASS_NAME;"
|
||||
|
||||
/**
|
||||
* The [JsonHookPatchHook] of the [JsonHookPatch].
|
||||
*
|
||||
* @see JsonHookPatchHook
|
||||
*/
|
||||
internal lateinit var hooks: JsonHookPatchHook
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,13 +4,13 @@ import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.PatchResultError
|
||||
import app.revanced.patcher.patch.PatchResultSuccess
|
||||
import app.revanced.patcher.patch.annotations.DependsOn
|
||||
import app.revanced.patches.twitter.misc.hook.json.patch.JsonHookPatch
|
||||
|
||||
@DependsOn([JsonHookPatch::class])
|
||||
abstract class BaseHookPatchPatch(private val hookClassDescriptor: String) : BytecodePatch() {
|
||||
override fun execute(context: BytecodeContext) = try {
|
||||
PatchResultSuccess().also { JsonHookPatch.Hook(context, hookClassDescriptor).add() }
|
||||
JsonHookPatch.hooks.addHook(JsonHookPatch.Hook(context, hookClassDescriptor))
|
||||
|
||||
PatchResultSuccess()
|
||||
} catch (ex: Exception) {
|
||||
PatchResultError(ex)
|
||||
}
|
||||
|
||||
@@ -3,10 +3,6 @@ package app.revanced.patches.twitter.misc.hook.patch.ads.annotations
|
||||
import app.revanced.patcher.annotation.Compatibility
|
||||
import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.twitter.android"
|
||||
)]
|
||||
)
|
||||
@Compatibility([Package("com.twitter.android")])
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
internal annotation class HideAdsCompatibility
|
||||
@@ -15,8 +15,4 @@ import app.revanced.patches.twitter.misc.hook.patch.ads.annotations.HideAdsCompa
|
||||
@Description("Hides ads.")
|
||||
@HideAdsCompatibility
|
||||
@Version("0.0.1")
|
||||
class HideAdsPatch : BaseHookPatchPatch(HOOK_CLASS_DESCRIPTOR) {
|
||||
private companion object {
|
||||
const val HOOK_CLASS_DESCRIPTOR = "Lapp/revanced/twitter/patches/hook/patch/ads/AdsHook;"
|
||||
}
|
||||
}
|
||||
class HideAdsPatch : BaseHookPatchPatch("Lapp/revanced/twitter/patches/hook/patch/ads/AdsHook;")
|
||||
@@ -3,10 +3,6 @@ package app.revanced.patches.twitter.misc.hook.patch.recommendation.annotations
|
||||
import app.revanced.patcher.annotation.Compatibility
|
||||
import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.twitter.android"
|
||||
)]
|
||||
)
|
||||
@Compatibility([Package("com.twitter.android")])
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
internal annotation class HideRecommendedUsersCompatibility
|
||||
@@ -15,9 +15,6 @@ import app.revanced.patches.twitter.misc.hook.patch.recommendation.annotations.H
|
||||
@Description("Hides recommended users.")
|
||||
@HideRecommendedUsersCompatibility
|
||||
@Version("0.0.1")
|
||||
class HideRecommendedUsersPatch : BaseHookPatchPatch(HOOK_CLASS_DESCRIPTOR) {
|
||||
private companion object {
|
||||
const val HOOK_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/twitter/patches/hook/patch/recommendation/RecommendedUsersHook;"
|
||||
}
|
||||
}
|
||||
class HideRecommendedUsersPatch : BaseHookPatchPatch(
|
||||
"Lapp/revanced/twitter/patches/hook/patch/recommendation/RecommendedUsersHook;"
|
||||
)
|
||||
@@ -1,7 +1,5 @@
|
||||
package app.revanced.patches.vsco.misc.pro.fingerprints
|
||||
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object RevCatSubscriptionFingerprint : MethodFingerprint(
|
||||
@@ -10,4 +8,4 @@ object RevCatSubscriptionFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/RevCatSubscriptionSettingsRepository;")
|
||||
}
|
||||
)
|
||||
)
|
||||
@@ -14,13 +14,21 @@ import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patches.shared.misc.fix.verticalscroll.patch.VerticalScrollPatch
|
||||
import app.revanced.patches.youtube.ad.general.annotation.HideAdsCompatibility
|
||||
import app.revanced.patches.youtube.ad.general.resource.patch.HideAdsResourcePatch
|
||||
import app.revanced.patches.youtube.ad.getpremium.bytecode.patch.HideGetPremiumPatch
|
||||
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.patch.FixBackToExitGesturePatch
|
||||
import org.jf.dexlib2.iface.instruction.formats.Instruction31i
|
||||
import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
||||
|
||||
|
||||
@Patch
|
||||
@DependsOn([HideAdsResourcePatch::class, VerticalScrollPatch::class, FixBackToExitGesturePatch::class])
|
||||
@DependsOn(
|
||||
[
|
||||
HideGetPremiumPatch::class,
|
||||
HideAdsResourcePatch::class,
|
||||
VerticalScrollPatch::class,
|
||||
FixBackToExitGesturePatch::class
|
||||
]
|
||||
)
|
||||
@Name("hide-ads")
|
||||
@Description("Removes general ads.")
|
||||
@HideAdsCompatibility
|
||||
|
||||
@@ -187,7 +187,13 @@ class HideAdsResourcePatch : ResourcePatch {
|
||||
StringResource("revanced_hide_audio_track_button_title", "Hide audio track button"),
|
||||
StringResource("revanced_hide_audio_track_button_on", "Audio track button is hidden"),
|
||||
StringResource("revanced_hide_audio_track_button_off", "Audio track button is shown")
|
||||
)
|
||||
),
|
||||
SwitchPreference(
|
||||
"revanced_hide_latest_posts_ads",
|
||||
StringResource("revanced_hide_latest_posts_ads_title", "Hide latest posts"),
|
||||
StringResource("revanced_hide_latest_posts_ads_summary_on", "Latest posts are hidden"),
|
||||
StringResource("revanced_hide_latest_posts_ads_summary_off", "Latest posts are shown")
|
||||
),
|
||||
)
|
||||
|
||||
PreferenceScreen.ADS.addPreferences(
|
||||
@@ -209,12 +215,6 @@ class HideAdsResourcePatch : ResourcePatch {
|
||||
StringResource("revanced_hide_paid_content_ads_summary_on", "Paid content is hidden"),
|
||||
StringResource("revanced_hide_paid_content_ads_summary_off", "Paid content is shown")
|
||||
),
|
||||
SwitchPreference(
|
||||
"revanced_hide_latest_posts_ads",
|
||||
StringResource("revanced_hide_latest_posts_ads_title", "Hide latest posts"),
|
||||
StringResource("revanced_hide_latest_posts_ads_summary_on", "Latest posts are hidden"),
|
||||
StringResource("revanced_hide_latest_posts_ads_summary_off", "Latest posts are shown")
|
||||
),
|
||||
SwitchPreference(
|
||||
"revanced_hide_self_sponsor_ads",
|
||||
StringResource("revanced_hide_self_sponsor_ads_title", "Hide self sponsored cards"),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.youtube.layout.hide.getpremium.annotations
|
||||
package app.revanced.patches.youtube.ad.getpremium.annotations
|
||||
|
||||
import app.revanced.patcher.annotation.Compatibility
|
||||
import app.revanced.patcher.annotation.Package
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.youtube.layout.hide.getpremium.bytecode.fingerprints
|
||||
package app.revanced.patches.youtube.ad.getpremium.bytecode.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import org.jf.dexlib2.Opcode
|
||||
@@ -1,7 +1,6 @@
|
||||
package app.revanced.patches.youtube.layout.hide.getpremium.bytecode.patch
|
||||
package app.revanced.patches.youtube.ad.getpremium.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
|
||||
@@ -11,33 +10,35 @@ 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.hide.getpremium.annotations.HideGetPremiumCompatibility
|
||||
import app.revanced.patches.youtube.layout.hide.getpremium.bytecode.fingerprints.GetPremiumViewFingerprint
|
||||
import app.revanced.patches.youtube.ad.getpremium.annotations.HideGetPremiumCompatibility
|
||||
import app.revanced.patches.youtube.ad.getpremium.bytecode.fingerprints.GetPremiumViewFingerprint
|
||||
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.TwoRegisterInstruction
|
||||
|
||||
@Patch
|
||||
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
|
||||
@Name("hide-get-premium")
|
||||
@Description("Hides advertisement for YouTube Premium under the video player.")
|
||||
@HideGetPremiumCompatibility
|
||||
@Version("0.0.1")
|
||||
class HideGetPremiumPatch : BytecodePatch(
|
||||
listOf(
|
||||
GetPremiumViewFingerprint,
|
||||
)
|
||||
) {
|
||||
class HideGetPremiumPatch : BytecodePatch(listOf(GetPremiumViewFingerprint,)) {
|
||||
override fun execute(context: BytecodeContext): PatchResult {
|
||||
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
|
||||
SettingsPatch.PreferenceScreen.ADS.addPreferences(
|
||||
SwitchPreference(
|
||||
"revanced_hide_get_premium",
|
||||
StringResource("revanced_hide_get_premium_title", "Hide YouTube Premium advertisement"),
|
||||
StringResource("revanced_hide_get_premium_summary_on", "YouTube Premium advertisement are hidden"),
|
||||
StringResource("revanced_hide_get_premium_summary_off", "YouTube Premium advertisement are shown")
|
||||
StringResource(
|
||||
"revanced_hide_get_premium_title",
|
||||
"Hide YouTube Premium advertisement under video player"
|
||||
),
|
||||
StringResource(
|
||||
"revanced_hide_get_premium_summary_on",
|
||||
"YouTube Premium advertisement are hidden"
|
||||
),
|
||||
StringResource(
|
||||
"revanced_hide_get_premium_summary_off",
|
||||
"YouTube Premium advertisement are shown"
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -5,5 +5,5 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
internal annotation class DownloadsCompatibility
|
||||
internal annotation class ExternalDownloadsCompatibility
|
||||
|
||||
@@ -9,20 +9,20 @@ 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.downloads.annotation.DownloadsCompatibility
|
||||
import app.revanced.patches.youtube.interaction.downloads.resource.patch.DownloadsResourcePatch
|
||||
import app.revanced.patches.youtube.interaction.downloads.annotation.ExternalDownloadsCompatibility
|
||||
import app.revanced.patches.youtube.interaction.downloads.resource.patch.ExternalDownloadsResourcePatch
|
||||
import app.revanced.patches.youtube.misc.playercontrols.bytecode.patch.PlayerControlsBytecodePatch
|
||||
import app.revanced.patches.youtube.video.information.patch.VideoInformationPatch
|
||||
|
||||
@Patch
|
||||
@Name("downloads")
|
||||
@DependsOn([DownloadsResourcePatch::class, PlayerControlsBytecodePatch::class, VideoInformationPatch::class])
|
||||
@Description("Adds a download button to the YouTube video player.")
|
||||
@DownloadsCompatibility
|
||||
@Name("external-downloads")
|
||||
@DependsOn([ExternalDownloadsResourcePatch::class, PlayerControlsBytecodePatch::class, VideoInformationPatch::class])
|
||||
@Description("Adds support to download and save YouTube videos using an external app.")
|
||||
@ExternalDownloadsCompatibility
|
||||
@Version("0.0.1")
|
||||
class DownloadsBytecodePatch : BytecodePatch() {
|
||||
class ExternalDownloadsBytecodePatch : BytecodePatch() {
|
||||
private companion object {
|
||||
const val BUTTON_DESCRIPTOR = "Lapp/revanced/integrations/videoplayer/DownloadButton;"
|
||||
const val BUTTON_DESCRIPTOR = "Lapp/revanced/integrations/videoplayer/ExternalDownloadButton;"
|
||||
}
|
||||
|
||||
override fun execute(context: BytecodeContext): PatchResult {
|
||||
@@ -14,50 +14,42 @@ import app.revanced.util.resources.ResourceUtils
|
||||
import app.revanced.util.resources.ResourceUtils.copyResources
|
||||
import app.revanced.util.resources.ResourceUtils.mergeStrings
|
||||
|
||||
@Name("downloads-resource-patch")
|
||||
@Name("external-downloads-resource-patch")
|
||||
@DependsOn([BottomControlsResourcePatch::class, SettingsPatch::class])
|
||||
@Version("0.0.1")
|
||||
class DownloadsResourcePatch : ResourcePatch {
|
||||
class ExternalDownloadsResourcePatch : ResourcePatch {
|
||||
|
||||
override fun execute(context: ResourceContext): PatchResult {
|
||||
SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences(
|
||||
PreferenceScreen(
|
||||
"revanced_external_downloader_preference_screen",
|
||||
StringResource("revanced_external_downloader_preference_screen_title", "Download settings"),
|
||||
StringResource("revanced_external_downloader_preference_screen_title", "External download settings"),
|
||||
listOf(
|
||||
SwitchPreference(
|
||||
"revanced_external_downloader",
|
||||
StringResource("revanced_external_downloader_title", "Show download button"),
|
||||
StringResource("revanced_external_downloader_summary_on", "Download button is shown"),
|
||||
StringResource("revanced_external_downloader_summary_off", "Download button is not shown")
|
||||
StringResource("revanced_external_downloader_title", "Show external download button"),
|
||||
StringResource("revanced_external_downloader_summary_on", "Download button shown in player"),
|
||||
StringResource("revanced_external_downloader_summary_off", "Download button not shown in player")
|
||||
),
|
||||
TextPreference(
|
||||
"revanced_external_downloader_name",
|
||||
StringResource("revanced_external_downloader_name_title", "Downloader package name"),
|
||||
StringResource("revanced_external_downloader_name_summary", "Package name of the downloader app such as NewPipe\\'s or PowerTube\\'s"),
|
||||
StringResource("revanced_external_downloader_name_summary", "Package name of your installed external downloader app, such as NewPipe or PowerTube"),
|
||||
InputType.TEXT
|
||||
)
|
||||
),
|
||||
StringResource("revanced_external_downloader_preference_screen_summary", "Settings related to downloads")
|
||||
StringResource("revanced_external_downloader_preference_screen_summary", "Settings for using an external downloader")
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
/*
|
||||
* Copy strings
|
||||
*/
|
||||
|
||||
// Copy strings
|
||||
context.mergeStrings("downloads/host/values/strings.xml")
|
||||
|
||||
/*
|
||||
* Copy resources
|
||||
*/
|
||||
|
||||
// Copy resources
|
||||
context.copyResources("downloads", ResourceUtils.ResourceGroup("drawable", "revanced_yt_download_button.xml"))
|
||||
|
||||
/*
|
||||
* Add download button node
|
||||
*/
|
||||
|
||||
// Add download button node
|
||||
BottomControlsResourcePatch.addControls("downloads/host/layout/${BottomControlsResourcePatch.TARGET_RESOURCE_NAME}")
|
||||
|
||||
return PatchResultSuccess()
|
||||
@@ -10,7 +10,7 @@ import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
||||
|
||||
object AccessibilityPlayerProgressTimeFingerprint : MethodFingerprint(
|
||||
returnType = "L",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any { instruction ->
|
||||
if (instruction.opcode != Opcode.CONST) return@any false
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.jf.dexlib2.iface.instruction.NarrowLiteralInstruction
|
||||
|
||||
object SeekbarTappingFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf("L"),
|
||||
opcodes = listOf(
|
||||
Opcode.IPUT_OBJECT,
|
||||
|
||||
@@ -5,6 +5,6 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object PivotBarConstructorFingerprint : MethodFingerprint(
|
||||
access = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
strings = listOf("com.google.android.apps.youtube.app.endpoint.flags")
|
||||
)
|
||||
@@ -31,6 +31,7 @@ class HidePlayerButtonsPatch : BytecodePatch(
|
||||
) {
|
||||
private object ParameterOffsets {
|
||||
const val HAS_NEXT = 5
|
||||
const val HAS_PREVIOUS = 6
|
||||
}
|
||||
|
||||
override fun execute(context: BytecodeContext): PatchResult {
|
||||
@@ -58,13 +59,16 @@ class HidePlayerButtonsPatch : BytecodePatch(
|
||||
|
||||
// overriding this parameter register hides the previous and next buttons
|
||||
val hasNextParameterRegister = callInstruction.startRegister + ParameterOffsets.HAS_NEXT
|
||||
val hasPreviousParameterRegister = callInstruction.startRegister + ParameterOffsets.HAS_PREVIOUS
|
||||
|
||||
mutableMethod.addInstructions(
|
||||
callIndex,
|
||||
"""
|
||||
invoke-static { }, Lapp/revanced/integrations/patches/HidePlayerButtonsPatch;->hideButtons()Z
|
||||
invoke-static { v$hasNextParameterRegister }, Lapp/revanced/integrations/patches/HidePlayerButtonsPatch;->previousOrNextButtonIsVisible(Z)Z
|
||||
move-result v$hasNextParameterRegister
|
||||
xor-int/lit8 v$hasNextParameterRegister, v$hasNextParameterRegister, 1
|
||||
|
||||
invoke-static { v$hasPreviousParameterRegister }, Lapp/revanced/integrations/patches/HidePlayerButtonsPatch;->previousOrNextButtonIsVisible(Z)Z
|
||||
move-result v$hasPreviousParameterRegister
|
||||
"""
|
||||
)
|
||||
} ?: return PlayerControlsVisibilityModelFingerprint.toErrorResult()
|
||||
|
||||
@@ -23,10 +23,10 @@ class HideInfocardsResourcePatch : ResourcePatch {
|
||||
override fun execute(context: ResourceContext): PatchResult {
|
||||
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
|
||||
SwitchPreference(
|
||||
"revanced_hide_infocards",
|
||||
StringResource("revanced_hide_infocards_title", "Hide info cards"),
|
||||
StringResource("revanced_hide_infocards_summary_on", "Info cards are hidden"),
|
||||
StringResource("revanced_hide_infocards_summary_off", "Info cards are shown")
|
||||
"revanced_hide_info_cards",
|
||||
StringResource("revanced_hide_info_cards_title", "Hide info cards"),
|
||||
StringResource("revanced_hide_info_cards_summary_on", "Info cards are hidden"),
|
||||
StringResource("revanced_hide_info_cards_summary_off", "Info cards are shown")
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
||||
|
||||
object HideLoadMoreButtonFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
parameters = listOf("L", "L", "L", "L"),
|
||||
opcodes = listOf(
|
||||
Opcode.CONST,
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
||||
|
||||
object CreatePlayerOverviewFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
access = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||
opcodes = listOf(
|
||||
Opcode.CONST,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
@FuzzyPatternScanMethod(3)
|
||||
object EngagementPanelControllerFingerprint : MethodFingerprint(
|
||||
returnType = "L",
|
||||
access = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||
strings = listOf(
|
||||
"EngagementPanelController: cannot show EngagementPanel before EngagementPanelController.init() has been called.",
|
||||
"[EngagementPanel] Cannot show EngagementPanel before EngagementPanelController.init() has been called."
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package app.revanced.patches.youtube.layout.buttons.player.background.annotations
|
||||
package app.revanced.patches.youtube.layout.player.background.annotations
|
||||
import app.revanced.patcher.annotation.Compatibility
|
||||
import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
internal annotation class PlayerButtonBackgroundCompatibility
|
||||
internal annotation class PlayerControlsBackgroundCompatibility
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.youtube.layout.buttons.player.background.patch
|
||||
package app.revanced.patches.youtube.layout.player.background.patch
|
||||
|
||||
import app.revanced.extensions.doRecursively
|
||||
import app.revanced.patcher.annotation.Description
|
||||
@@ -9,15 +9,15 @@ import app.revanced.patcher.patch.PatchResult
|
||||
import app.revanced.patcher.patch.PatchResultSuccess
|
||||
import app.revanced.patcher.patch.ResourcePatch
|
||||
import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patches.youtube.layout.buttons.player.background.annotations.PlayerButtonBackgroundCompatibility
|
||||
import app.revanced.patches.youtube.layout.player.background.annotations.PlayerControlsBackgroundCompatibility
|
||||
import org.w3c.dom.Element
|
||||
|
||||
@Patch(false)
|
||||
@Name("remove-player-button-background")
|
||||
@Description("Removes the background from the video player buttons.")
|
||||
@PlayerButtonBackgroundCompatibility
|
||||
@Name("remove-player-controls-background")
|
||||
@Description("Removes the background from the video player controls.")
|
||||
@PlayerControlsBackgroundCompatibility
|
||||
@Version("0.0.1")
|
||||
class PlayerButtonBackgroundPatch : ResourcePatch {
|
||||
class PlayerControlsBackgroundPatch : ResourcePatch {
|
||||
override fun execute(context: ResourceContext): PatchResult {
|
||||
context.xmlEditor[RESOURCE_FILE_PATH].use { editor ->
|
||||
editor.file.doRecursively node@{ node ->
|
||||
@@ -10,7 +10,7 @@ import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
||||
object DislikesOldLayoutTextViewFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
parameters = listOf("L"),
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
opcodes = listOf(
|
||||
Opcode.CONST, // resource identifier register
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
|
||||
@@ -10,7 +10,7 @@ import org.jf.dexlib2.Opcode
|
||||
*/
|
||||
object TextComponentAtomicReferenceFingerprint : MethodFingerprint(
|
||||
returnType = "L",
|
||||
access = AccessFlags.PROTECTED or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL,
|
||||
parameters = listOf("L"),
|
||||
opcodes = listOf(
|
||||
Opcode.MOVE_OBJECT_FROM16, // available unused register
|
||||
|
||||
@@ -6,6 +6,6 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object TextComponentConstructorFingerprint : MethodFingerprint(
|
||||
access = AccessFlags.CONSTRUCTOR or AccessFlags.PRIVATE,
|
||||
accessFlags = AccessFlags.CONSTRUCTOR or AccessFlags.PRIVATE,
|
||||
strings = listOf("TextComponent")
|
||||
)
|
||||
@@ -10,7 +10,7 @@ import org.jf.dexlib2.Opcode
|
||||
*/
|
||||
object TextComponentContextFingerprint : MethodFingerprint(
|
||||
returnType = "L",
|
||||
access = AccessFlags.PROTECTED or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL,
|
||||
parameters = listOf("L"),
|
||||
opcodes = listOf(
|
||||
Opcode.IGET_OBJECT, // conversion context field name
|
||||
|
||||
@@ -7,7 +7,7 @@ import app.revanced.util.patch.indexOfFirstConstantInstruction
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object CreateDarkThemeSeekbarFingerprint : MethodFingerprint(
|
||||
access = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
customFingerprint = { method, _ ->
|
||||
method.indexOfFirstConstantInstruction(SeekbarColorResourcePatch.inlineTimeBarColorizedBarPlayedColorDarkId) != -1
|
||||
&& method.indexOfFirstConstantInstruction(SeekbarColorResourcePatch.inlineTimeBarPlayedNotHighlightedColorId) != -1
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
object ControlsOverlayFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
access = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||
parameters = listOf(),
|
||||
opcodes = listOf(
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
|
||||
@@ -5,7 +5,7 @@ import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object EmbeddedPlayerControlsOverlayFingerprint : IntegrationsFingerprint(
|
||||
access = AccessFlags.PRIVATE or AccessFlags.CONSTRUCTOR,
|
||||
accessFlags = AccessFlags.PRIVATE or AccessFlags.CONSTRUCTOR,
|
||||
returnType = "V",
|
||||
parameters = listOf("L", "L", "L"),
|
||||
customFingerprint = { methodDef, _ ->
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
object BindSessionServiceFingerprint : MethodFingerprint(
|
||||
returnType = "L",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
opcodes = listOf(
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.NEW_INSTANCE,
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
object GetCustomTabPackageNameFingerprint : MethodFingerprint(
|
||||
returnType = "L",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
opcodes = listOf(
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.NEW_INSTANCE,
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
object InitializeCustomTabSupportFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
opcodes = listOf(
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.NEW_INSTANCE,
|
||||
|
||||
@@ -11,6 +11,7 @@ import app.revanced.patcher.patch.annotations.DependsOn
|
||||
import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patches.shared.fingerprints.WatchWhileActivityFingerprint
|
||||
import app.revanced.patches.youtube.layout.buttons.cast.patch.HideCastButtonPatch
|
||||
import app.revanced.patches.youtube.misc.fix.playback.patch.ClientSpoofPatch
|
||||
import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility
|
||||
import app.revanced.patches.youtube.misc.microg.fingerprints.*
|
||||
import app.revanced.patches.youtube.misc.microg.patch.resource.MicroGResourcePatch
|
||||
@@ -23,6 +24,7 @@ import app.revanced.util.microg.MicroGBytecodeHelper
|
||||
[
|
||||
MicroGResourcePatch::class,
|
||||
HideCastButtonPatch::class,
|
||||
ClientSpoofPatch::class
|
||||
]
|
||||
)
|
||||
@Name("vanced-microg-support")
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
object KidsMinimizedPlaybackPolicyControllerFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf("I", "L", "L"),
|
||||
opcodes = listOf(
|
||||
Opcode.IF_EQZ,
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
object PlayerTypeFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf("L"),
|
||||
opcodes = listOf(
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
object VideoStateFingerprint : MethodFingerprint(
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
returnType = "V",
|
||||
parameters = listOf("L"),
|
||||
opcodes = listOf(
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.jf.dexlib2.Opcode
|
||||
@FuzzyPatternScanMethod(2)
|
||||
object VideoIdFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf("L"),
|
||||
opcodes = listOf(
|
||||
Opcode.IF_EQZ,
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
object VideoIdFingerprintBackgroundPlay : MethodFingerprint(
|
||||
returnType = "V",
|
||||
access = AccessFlags.DECLARED_SYNCHRONIZED or AccessFlags.FINAL or AccessFlags.PUBLIC,
|
||||
accessFlags = AccessFlags.DECLARED_SYNCHRONIZED or AccessFlags.FINAL or AccessFlags.PUBLIC,
|
||||
parameters = listOf("L"),
|
||||
opcodes = listOf(Opcode.INVOKE_INTERFACE),
|
||||
customFingerprint = { methodDef, _ ->
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.jf.dexlib2.Opcode
|
||||
object ContainsAdFingerprint:MethodFingerprint(
|
||||
returnType = "Z",
|
||||
parameters = listOf("L", "L"),
|
||||
access = AccessFlags.STATIC or AccessFlags.PUBLIC,
|
||||
accessFlags = AccessFlags.STATIC or AccessFlags.PUBLIC,
|
||||
opcodes = listOf(
|
||||
Opcode.CONST_STRING,
|
||||
Opcode.INVOKE_INTERFACE,
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
object IsPremiumFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
opcodes = listOf(
|
||||
Opcode.IGET_BOOLEAN,
|
||||
Opcode.RETURN,
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object YukaUserConstructorFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
strings = listOf(
|
||||
"premiumProvider"
|
||||
)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?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/download_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_download_button" 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/external_download_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_download_button" 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,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="downloader_not_installed_warning">is not installed. Please install it.</string>
|
||||
<string name="external_downloader_not_installed_warning">is not installed. Please install it.</string>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user