Compare commits

...

40 Commits

Author SHA1 Message Date
semantic-release-bot
5deaa6476f chore(release): 2.188.0-dev.12 [skip ci]
# [2.188.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.11...v2.188.0-dev.12) (2023-08-10)

### Features

* Add `Override certificate pinning` patch ([#2781](https://github.com/ReVanced/revanced-patches/issues/2781)) ([78d831f](78d831fc63))
2023-08-10 18:44:34 +00:00
Aunali321
78d831fc63 feat: Add Override certificate pinning patch (#2781)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-08-10 20:41:31 +02:00
semantic-release-bot
46809c3819 chore(release): 2.188.0-dev.11 [skip ci]
# [2.188.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.10...v2.188.0-dev.11) (2023-08-09)

### Bug Fixes

* **Client spoof:** Remove exception from option ([8f559ca](8f559ca170))
2023-08-09 15:58:17 +00:00
oSumAtrIX
8f559ca170 fix(Client spoof): Remove exception from option
Turning off will cause playback issues even when being subscribed to YouTube Premium
2023-08-09 17:55:18 +02:00
semantic-release-bot
48ea11f571 chore(release): 2.188.0-dev.10 [skip ci]
# [2.188.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.9...v2.188.0-dev.10) (2023-08-09)

### Features

* **Tasker:** Remove `Unlock trial` patch ([2ff3400](2ff3400ef1))
2023-08-09 10:26:50 +00:00
oSumAtrIX
2ff3400ef1 feat(Tasker): Remove Unlock trial patch 2023-08-09 12:23:56 +02:00
semantic-release-bot
bc8ce81bbc chore(release): 2.188.0-dev.9 [skip ci]
# [2.188.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.8...v2.188.0-dev.9) (2023-08-07)

### Features

* **YouTube - Hide video action buttons:** Hide individual action buttons ([#2723](https://github.com/ReVanced/revanced-patches/issues/2723)) ([7c131bf](7c131bfe1b))
2023-08-07 14:37:51 +00:00
LisoUseInAIKyrios
7c131bfe1b feat(YouTube - Hide video action buttons): Hide individual action buttons (#2723) 2023-08-07 18:34:53 +04:00
semantic-release-bot
f1e063ee76 chore(release): 2.188.0-dev.8 [skip ci]
# [2.188.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.7...v2.188.0-dev.8) (2023-08-07)

### Features

* **Change package name:** Append `.revanced` to package name by default ([#2750](https://github.com/ReVanced/revanced-patches/issues/2750)) ([3cd5f57](3cd5f573b1))
2023-08-07 14:10:41 +00:00
Pro-Tweaker
3cd5f573b1 feat(Change package name): Append .revanced to package name by default (#2750)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-08-07 16:07:22 +02:00
semantic-release-bot
9eaf98e4a1 chore(release): 2.188.0-dev.7 [skip ci]
# [2.188.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.6...v2.188.0-dev.7) (2023-08-07)

### Features

* **YouTube - Debug:** Logging of layout proto buffer strings ([#2759](https://github.com/ReVanced/revanced-patches/issues/2759)) ([d563085](d56308539b))
2023-08-07 07:53:51 +00:00
LisoUseInAIKyrios
d56308539b feat(YouTube - Debug): Logging of layout proto buffer strings (#2759) 2023-08-07 11:50:42 +04:00
semantic-release-bot
68c4d965cd chore(release): 2.188.0-dev.6 [skip ci]
# [2.188.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.5...v2.188.0-dev.6) (2023-08-06)

### Bug Fixes

* **YouTube - Client spoof:** Adjust spoof signature settings description ([#2760](https://github.com/ReVanced/revanced-patches/issues/2760)) ([d10b5cf](d10b5cf56e))
2023-08-06 15:44:55 +00:00
LisoUseInAIKyrios
d10b5cf56e fix(YouTube - Client spoof): Adjust spoof signature settings description (#2760) 2023-08-06 19:42:13 +04:00
semantic-release-bot
92223607fe chore(release): 2.188.0-dev.5 [skip ci]
# [2.188.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.4...v2.188.0-dev.5) (2023-08-04)

### Features

* **YouTube Music:** Add `Permanent repeat` patch ([#2722](https://github.com/ReVanced/revanced-patches/issues/2722)) ([21beefa](21beefa7e6))
2023-08-04 13:49:05 +00:00
Matthew
21beefa7e6 feat(YouTube Music): Add Permanent repeat patch (#2722)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-08-04 15:45:59 +02:00
semantic-release-bot
fec613eb13 chore(release): 2.188.0-dev.4 [skip ci]
# [2.188.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.3...v2.188.0-dev.4) (2023-08-03)

### Bug Fixes

* improve wording ([8cd2933](8cd293310a))
* **Tiktok - Show seekbar:** Bump compatibility ([#2737](https://github.com/ReVanced/revanced-patches/issues/2737)) ([70cffa4](70cffa4466))

### Features

* **Lightroom:** Add `Disable mandatory login` patch ([#2738](https://github.com/ReVanced/revanced-patches/issues/2738)) ([9e8c4e6](9e8c4e61a5))
* **Lightroom:** Add `Unlock premium` patch ([#2740](https://github.com/ReVanced/revanced-patches/issues/2740)) ([204284f](204284f5d3))
* **YouTube Music:** Add `Permanent Shuffle` patch ([#2730](https://github.com/ReVanced/revanced-patches/issues/2730)) ([9725870](9725870e6a))
2023-08-03 18:41:28 +00:00
oSumAtrIX
b007aa3827 build(Needs bump): Bump compatibility 2023-08-03 20:37:47 +02:00
oSumAtrIX
8cd293310a fix: improve wording 2023-08-03 18:34:40 +02:00
Aunali321
9e8c4e61a5 feat(Lightroom): Add Disable mandatory login patch (#2738)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-08-03 18:24:28 +02:00
Matthew
9725870e6a feat(YouTube Music): Add Permanent Shuffle patch (#2730)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-08-03 18:22:13 +02:00
Aunali321
204284f5d3 feat(Lightroom): Add Unlock premium patch (#2740)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-08-03 18:16:30 +02:00
d4rkk3y
70cffa4466 fix(Tiktok - Show seekbar): Bump compatibility (#2737) 2023-08-03 18:12:45 +02:00
semantic-release-bot
4f885b15c0 chore(release): 2.188.0-dev.3 [skip ci]
# [2.188.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.2...v2.188.0-dev.3) (2023-08-03)

### Bug Fixes

* remove newline ([28c5410](28c541078b))
2023-08-03 14:43:30 +00:00
oSumAtrIX
28c541078b fix: remove newline 2023-08-03 16:39:59 +02:00
semantic-release-bot
4d031cb029 chore(release): 2.188.0-dev.2 [skip ci]
# [2.188.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.1...v2.188.0-dev.2) (2023-08-03)

### Bug Fixes

* **Reddit is Fun - Spoof client:** Use a more convincing user agent ([1ea6f27](1ea6f27d7d))
2023-08-03 14:26:21 +00:00
oSumAtrIX
1ea6f27d7d fix(Reddit is Fun - Spoof client): Use a more convincing user agent 2023-08-03 16:22:57 +02:00
semantic-release-bot
636e9dc446 chore(release): 2.188.0-dev.1 [skip ci]
# [2.188.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v2.187.0...v2.188.0-dev.1) (2023-08-03)

### Features

* **Nova Launcher:** Remove `Unlock prime` patch ([dbcff62](dbcff623c8))
2023-08-03 02:09:26 +00:00
oSumAtrIX
dbcff623c8 feat(Nova Launcher): Remove Unlock prime patch 2023-08-03 04:06:28 +02:00
semantic-release-bot
e93adc15c2 chore(release): 2.187.0 [skip ci]
# [2.187.0](https://github.com/ReVanced/revanced-patches/compare/v2.186.0...v2.187.0) (2023-08-02)

### Bug Fixes

* Remove version numbers from individual patches ([#2709](https://github.com/ReVanced/revanced-patches/issues/2709)) ([d97f399](d97f3990c9))
* **Sync for Reddit - Change OAuth client id:** Disable piracy detection ([d442aca](d442acaac8))
* Use clearer descriptions ([146b213](146b213b4a))
* **YouTube - Spoof app version:** Fix grammar in description ([#2711](https://github.com/ReVanced/revanced-patches/issues/2711)) ([7cf79ab](7cf79ab856))
* **YouTube - Spoof App Version:** Remove 17.30.35 target (version no longer works correctly) ([#2703](https://github.com/ReVanced/revanced-patches/issues/2703)) ([936ac47](936ac475d2))
* **YouTube - Theme:** only set splash screen color if background colors are set ([c14a7fb](c14a7fb66f))

### Features

* **Joey for Reddit:** Add `Change OAuth client id` patch ([a00eab6](a00eab6744))
* **Joey for Reddit:** Add `Disable ads` patch ([e7b2bfb](e7b2bfbde3))
* **Reddit is Fun - Spoof client:** Spoof the user agent ([9ac0ed4](9ac0ed477a))
* **Sync for Reddit:** add `Disable Sync for Lemmy bottom sheet` patch ([70da6d8](70da6d8971))
* **YouTube - Hide layout components:** Hide `chips shelf` ([#2699](https://github.com/ReVanced/revanced-patches/issues/2699)) ([44107c2](44107c2b07))
* **YouTube:** add `Player Flyout Menu` patch ([#2295](https://github.com/ReVanced/revanced-patches/issues/2295)) ([bb90012](bb9001283a))
2023-08-02 23:38:38 +00:00
oSumAtrIX
244473cd4f chore: merge branch dev to main (#2679) 2023-08-03 01:35:52 +02:00
semantic-release-bot
efe7cbc78c chore(release): 2.187.0-dev.10 [skip ci]
# [2.187.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v2.187.0-dev.9...v2.187.0-dev.10) (2023-08-02)

### Features

* **Reddit is Fun - Spoof client:** Spoof the user agent ([9ac0ed4](9ac0ed477a))
2023-08-02 23:00:51 +00:00
oSumAtrIX
9ac0ed477a feat(Reddit is Fun - Spoof client): Spoof the user agent 2023-08-03 00:58:11 +02:00
semantic-release-bot
9426b28dcc chore(release): 2.187.0-dev.9 [skip ci]
# [2.187.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v2.187.0-dev.8...v2.187.0-dev.9) (2023-07-30)

### Bug Fixes

* Use clearer descriptions ([146b213](146b213b4a))
2023-07-30 17:05:55 +00:00
oSumAtrIX
146b213b4a fix: Use clearer descriptions 2023-07-30 19:03:12 +02:00
semantic-release-bot
557a9f7418 chore(release): 2.187.0-dev.8 [skip ci]
# [2.187.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v2.187.0-dev.7...v2.187.0-dev.8) (2023-07-30)

### Bug Fixes

* **Sync for Reddit - Change OAuth client id:** Disable piracy detection ([d442aca](d442acaac8))

### Features

* **Joey for Reddit:** Add `Change OAuth client id` patch ([a00eab6](a00eab6744))
* **Joey for Reddit:** Add `Disable ads` patch ([e7b2bfb](e7b2bfbde3))
2023-07-30 17:02:08 +00:00
oSumAtrIX
e7b2bfbde3 feat(Joey for Reddit): Add Disable ads patch 2023-07-30 18:59:40 +02:00
oSumAtrIX
d442acaac8 fix(Sync for Reddit - Change OAuth client id): Disable piracy detection 2023-07-30 18:59:40 +02:00
Barncastle
a00eab6744 feat(Joey for Reddit): Add Change OAuth client id patch 2023-07-30 18:59:40 +02:00
LisoUseInAIKyrios
87f2f90fc5 chore: remove deprecated version annotation 2023-07-30 14:23:40 +04:00
48 changed files with 880 additions and 304 deletions

View File

@@ -1,3 +1,144 @@
# [2.188.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.11...v2.188.0-dev.12) (2023-08-10)
### Features
* Add `Override certificate pinning` patch ([#2781](https://github.com/ReVanced/revanced-patches/issues/2781)) ([94ed738](https://github.com/ReVanced/revanced-patches/commit/94ed738515aa6e1a1d346b85b54805e68e36f94c))
# [2.188.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.10...v2.188.0-dev.11) (2023-08-09)
### Bug Fixes
* **Client spoof:** Remove exception from option ([9c69f87](https://github.com/ReVanced/revanced-patches/commit/9c69f876902496c101eac295e581c15e02bfaf29))
# [2.188.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.9...v2.188.0-dev.10) (2023-08-09)
### Features
* **Tasker:** Remove `Unlock trial` patch ([8354a87](https://github.com/ReVanced/revanced-patches/commit/8354a879cfc6028820e2bb0e01d6f607e145c0f6))
# [2.188.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.8...v2.188.0-dev.9) (2023-08-07)
### Features
* **YouTube - Hide video action buttons:** Hide individual action buttons ([#2723](https://github.com/ReVanced/revanced-patches/issues/2723)) ([220f694](https://github.com/ReVanced/revanced-patches/commit/220f694b12e7ed013753c8215d181936ab2205c3))
# [2.188.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.7...v2.188.0-dev.8) (2023-08-07)
### Features
* **Change package name:** Append `.revanced` to package name by default ([#2750](https://github.com/ReVanced/revanced-patches/issues/2750)) ([e83e62f](https://github.com/ReVanced/revanced-patches/commit/e83e62fc2400caf1c5179d25e0ac4fbd51ddba00))
# [2.188.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.6...v2.188.0-dev.7) (2023-08-07)
### Features
* **YouTube - Debug:** Logging of layout proto buffer strings ([#2759](https://github.com/ReVanced/revanced-patches/issues/2759)) ([189f719](https://github.com/ReVanced/revanced-patches/commit/189f719720551f36c6e006c45558fe5ae46ca4f8))
# [2.188.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.5...v2.188.0-dev.6) (2023-08-06)
### Bug Fixes
* **YouTube - Client spoof:** Adjust spoof signature settings description ([#2760](https://github.com/ReVanced/revanced-patches/issues/2760)) ([f71d893](https://github.com/ReVanced/revanced-patches/commit/f71d8937663fdbfc93d8e3ce1cdb47e1667554f0))
# [2.188.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.4...v2.188.0-dev.5) (2023-08-04)
### Features
* **YouTube Music:** Add `Permanent repeat` patch ([#2722](https://github.com/ReVanced/revanced-patches/issues/2722)) ([506d49c](https://github.com/ReVanced/revanced-patches/commit/506d49c82a68faee25aede8194e7884191c0f271))
# [2.188.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.3...v2.188.0-dev.4) (2023-08-03)
### Bug Fixes
* improve wording ([26f9b05](https://github.com/ReVanced/revanced-patches/commit/26f9b0514fda9434b2a36d2f9e5ad6a4f5bb94bd))
* **Tiktok - Show seekbar:** Bump compatibility ([#2737](https://github.com/ReVanced/revanced-patches/issues/2737)) ([08413bd](https://github.com/ReVanced/revanced-patches/commit/08413bdc97aef892f7372c585d1d792eb95e30f4))
### Features
* **Lightroom:** Add `Disable mandatory login` patch ([#2738](https://github.com/ReVanced/revanced-patches/issues/2738)) ([896a713](https://github.com/ReVanced/revanced-patches/commit/896a71308f1084d7f941c5b59610e40ea5d53009))
* **Lightroom:** Add `Unlock premium` patch ([#2740](https://github.com/ReVanced/revanced-patches/issues/2740)) ([e18a9bc](https://github.com/ReVanced/revanced-patches/commit/e18a9bcb50705d374ccbf03cd6ab9a140a2f23ec))
* **YouTube Music:** Add `Permanent Shuffle` patch ([#2730](https://github.com/ReVanced/revanced-patches/issues/2730)) ([86a271c](https://github.com/ReVanced/revanced-patches/commit/86a271cd7cc3d1d2a11ff9ebe962574368b93f4f))
# [2.188.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.2...v2.188.0-dev.3) (2023-08-03)
### Bug Fixes
* remove newline ([545388b](https://github.com/ReVanced/revanced-patches/commit/545388b3b21cabb485c4d2025756c48984548d6b))
# [2.188.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.1...v2.188.0-dev.2) (2023-08-03)
### Bug Fixes
* **Reddit is Fun - Spoof client:** Use a more convincing user agent ([236a18f](https://github.com/ReVanced/revanced-patches/commit/236a18f9356cede156417c0d55a876d25a98cd4d))
# [2.188.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v2.187.0...v2.188.0-dev.1) (2023-08-03)
### Features
* **Nova Launcher:** Remove `Unlock prime` patch ([bbde91c](https://github.com/ReVanced/revanced-patches/commit/bbde91cf9df4b410a34147bbe5f359e39a71ad4c))
# [2.187.0](https://github.com/ReVanced/revanced-patches/compare/v2.186.0...v2.187.0) (2023-08-02)
### Bug Fixes
* Remove version numbers from individual patches ([#2709](https://github.com/ReVanced/revanced-patches/issues/2709)) ([7a828ea](https://github.com/ReVanced/revanced-patches/commit/7a828ea8826864505fac9b2bdb3a1261d9f4dc35))
* **Sync for Reddit - Change OAuth client id:** Disable piracy detection ([cd103dd](https://github.com/ReVanced/revanced-patches/commit/cd103dd9b8ff2667246d4abaf75577f28bf1a11b))
* Use clearer descriptions ([8dbb0e2](https://github.com/ReVanced/revanced-patches/commit/8dbb0e212e8ceeb0381a3509e45afca095ddee53))
* **YouTube - Spoof app version:** Fix grammar in description ([#2711](https://github.com/ReVanced/revanced-patches/issues/2711)) ([dd249e6](https://github.com/ReVanced/revanced-patches/commit/dd249e62243e57733a6ff4d3a17d30db0e08a84d))
* **YouTube - Spoof App Version:** Remove 17.30.35 target (version no longer works correctly) ([#2703](https://github.com/ReVanced/revanced-patches/issues/2703)) ([210108b](https://github.com/ReVanced/revanced-patches/commit/210108bd8f86f583f5cd5d5538480b76d51d7776))
* **YouTube - Theme:** only set splash screen color if background colors are set ([f058db4](https://github.com/ReVanced/revanced-patches/commit/f058db4ba4300400ac92b4a9790708eb8bde7092))
### Features
* **Joey for Reddit:** Add `Change OAuth client id` patch ([1bac47d](https://github.com/ReVanced/revanced-patches/commit/1bac47df889b5221bef1c03e652f894be8d39385))
* **Joey for Reddit:** Add `Disable ads` patch ([ad7e147](https://github.com/ReVanced/revanced-patches/commit/ad7e14771208dcab08fd6dc29403b1a4cf602111))
* **Reddit is Fun - Spoof client:** Spoof the user agent ([b9aaf61](https://github.com/ReVanced/revanced-patches/commit/b9aaf610ad9f1f45a72265a3782d2cf996020139))
* **Sync for Reddit:** add `Disable Sync for Lemmy bottom sheet` patch ([56b535b](https://github.com/ReVanced/revanced-patches/commit/56b535b2a136d4b0afbddf2c8e251889c2555056))
* **YouTube - Hide layout components:** Hide `chips shelf` ([#2699](https://github.com/ReVanced/revanced-patches/issues/2699)) ([8e6058b](https://github.com/ReVanced/revanced-patches/commit/8e6058b62350b3d14d79e6fe52b0ad781b66b5de))
* **YouTube:** add `Player Flyout Menu` patch ([#2295](https://github.com/ReVanced/revanced-patches/issues/2295)) ([aea0af0](https://github.com/ReVanced/revanced-patches/commit/aea0af059784ae4820a0e73ff91f97bbc3ebc4c7))
# [2.187.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v2.187.0-dev.9...v2.187.0-dev.10) (2023-08-02)
### Features
* **Reddit is Fun - Spoof client:** Spoof the user agent ([b9aaf61](https://github.com/ReVanced/revanced-patches/commit/b9aaf610ad9f1f45a72265a3782d2cf996020139))
# [2.187.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v2.187.0-dev.8...v2.187.0-dev.9) (2023-07-30)
### Bug Fixes
* Use clearer descriptions ([8dbb0e2](https://github.com/ReVanced/revanced-patches/commit/8dbb0e212e8ceeb0381a3509e45afca095ddee53))
# [2.187.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v2.187.0-dev.7...v2.187.0-dev.8) (2023-07-30)
### Bug Fixes
* **Sync for Reddit - Change OAuth client id:** Disable piracy detection ([cd103dd](https://github.com/ReVanced/revanced-patches/commit/cd103dd9b8ff2667246d4abaf75577f28bf1a11b))
### Features
* **Joey for Reddit:** Add `Change OAuth client id` patch ([1bac47d](https://github.com/ReVanced/revanced-patches/commit/1bac47df889b5221bef1c03e652f894be8d39385))
* **Joey for Reddit:** Add `Disable ads` patch ([ad7e147](https://github.com/ReVanced/revanced-patches/commit/ad7e14771208dcab08fd6dc29403b1a4cf602111))
# [2.187.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v2.187.0-dev.6...v2.187.0-dev.7) (2023-07-30) # [2.187.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v2.187.0-dev.6...v2.187.0-dev.7) (2023-07-30)

View File

@@ -27,7 +27,7 @@ repositories {
} }
dependencies { dependencies {
implementation("app.revanced:revanced-patcher:12.0.0") implementation("app.revanced:revanced-patcher:12.1.1")
implementation("app.revanced:multidexlib2:2.5.3-a3836654") implementation("app.revanced:multidexlib2:2.5.3-a3836654")
// Required for meta // Required for meta
implementation("com.google.code.gson:gson:2.10.1") implementation("com.google.code.gson:gson:2.10.1")

View File

@@ -1,4 +1,4 @@
org.gradle.parallel = true org.gradle.parallel = true
org.gradle.caching = true org.gradle.caching = true
kotlin.code.style = official kotlin.code.style = official
version = 2.187.0-dev.7 version = 2.188.0-dev.12

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,79 @@
package app.revanced.patches.all.misc.network.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.*
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.all.misc.debugging.patch.EnableAndroidDebuggingPatch
import org.w3c.dom.Element
import java.io.File
@Patch(false)
@Name("Override certificate pinning")
@Description("Overrides certificate pinning, allowing to inspect traffic via a proxy.")
@DependsOn([EnableAndroidDebuggingPatch::class])
class OverrideCertificatePinningPatch : ResourcePatch {
override fun execute(context: ResourceContext): PatchResult {
val resXmlDirectory = context["res/xml"]
// Add android:networkSecurityConfig="@xml/network_security_config" and the "networkSecurityConfig" attribute if it does not exist.
context.xmlEditor["AndroidManifest.xml"].use { editor ->
val document = editor.file
val applicationNode = document.getElementsByTagName("application").item(0) as Element
if (!applicationNode.hasAttribute("networkSecurityConfig")) {
document.createAttribute("android:networkSecurityConfig")
.apply { value = "@xml/network_security_config" }.let(applicationNode.attributes::setNamedItem)
}
}
// In case the file does not exist create the "network_security_config.xml" file.
File(resXmlDirectory, "network_security_config.xml").apply {
if (!exists()) {
createNewFile()
writeText(
"""
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates
src="user"
overridePins="true" />
</trust-anchors>
</base-config>
<debug-overrides>
<trust-anchors>
<certificates src="system" />
<certificates
src="user"
overridePins="true" />
</trust-anchors>
</debug-overrides>
</network-security-config>
"""
)
} else {
// If the file already exists.
readText().let { text ->
if (!text.contains("<certificates src=\"user\" />")) {
writeText(
text.replace(
"<trust-anchors>",
"<trust-anchors>\n<certificates src=\"user\" overridePins=\"true\" />\n<certificates src=\"system\" />"
)
)
}
}
}
}
return PatchResultSuccess()
}
}

View File

@@ -9,39 +9,43 @@ import org.w3c.dom.Element
@Patch(false) @Patch(false)
@Name("Change package name") @Name("Change package name")
@Description("Changes the package name.") @Description("Changes the package name. Appends \".revanced\" to the package name by default.")
class ChangePackageNamePatch : ResourcePatch { class ChangePackageNamePatch : ResourcePatch {
override fun execute(context: ResourceContext): PatchResult { override fun execute(context: ResourceContext): PatchResult {
packageName?.let { packageName -> val packageNameToUse = packageName ?: getDefaultPackageName(context)
val packageNameRegex = Regex("^[a-z]\\w*(\\.[a-z]\\w*)+\$")
if (!packageName.matches(packageNameRegex))
return PatchResultError("Invalid package name")
var originalPackageName: String val packageNameRegex = Regex("^[a-z]\\w*(\\.[a-z]\\w*)+\$")
context.xmlEditor["AndroidManifest.xml"].use { editor -> if (!packageNameToUse.matches(packageNameRegex))
val manifest = editor.file.getElementsByTagName("manifest").item(0) as Element return PatchResultError("Invalid package name")
originalPackageName = manifest.getAttribute("package")
}
if (!originalPackageName.matches(packageNameRegex)) val originalPackageName = getOriginalPackageName(context)
return PatchResultError("Failed to get the original package name")
context["AndroidManifest.xml"].apply { context["AndroidManifest.xml"].apply {
readText().replace(originalPackageName, packageName).let(::writeText) readText().replace(originalPackageName, packageNameToUse).let(::writeText)
} }
} ?: return PatchResultError("No package name provided")
return PatchResultSuccess() return PatchResultSuccess()
} }
private fun getDefaultPackageName(context: ResourceContext): String {
val originalPackageName = getOriginalPackageName(context)
return "$originalPackageName.revanced"
}
private fun getOriginalPackageName(context: ResourceContext): String {
context.xmlEditor["AndroidManifest.xml"].use { editor ->
val manifest = editor.file.getElementsByTagName("manifest").item(0) as Element
return manifest.getAttribute("package")
}
}
companion object : OptionsContainer() { companion object : OptionsContainer() {
var packageName: String? by option( var packageName: String? by option(
PatchOption.StringOption( PatchOption.StringOption(
key = "packageName", key = "packageName",
default = null, default = null,
title = "Package name", title = "Package name",
description = "The name of the package to rename of the app.", description = "The name of the package to rename the app to.",
) )
) )
} }

View File

@@ -0,0 +1,8 @@
package app.revanced.patches.lightroom.misc.login.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility([Package("com.adobe.lrmobile",)])
@Target(AnnotationTarget.CLASS)
internal annotation class DisableMandatoryLoginCompatibility

View File

@@ -0,0 +1,19 @@
package app.revanced.patches.lightroom.misc.login.fingerprint
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 IsLoggedInFingerprint : MethodFingerprint(
returnType = "Z",
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC or AccessFlags.FINAL,
opcodes = listOf(
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.SGET_OBJECT,
Opcode.IF_NE,
Opcode.CONST_4,
Opcode.GOTO
)
)

View File

@@ -0,0 +1,27 @@
package app.revanced.patches.lightroom.misc.login.patch
import app.revanced.extensions.toErrorResult
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.lightroom.misc.login.annotations.DisableMandatoryLoginCompatibility
import app.revanced.patches.lightroom.misc.login.fingerprint.IsLoggedInFingerprint
@Patch
@Name("Disable mandatory login")
@DisableMandatoryLoginCompatibility
class DisableMandatoryLoginPatch : BytecodePatch(listOf(IsLoggedInFingerprint)) {
override fun execute(context: BytecodeContext): PatchResult {
IsLoggedInFingerprint.result?.mutableMethod?.apply {
val index = implementation!!.instructions.lastIndex - 1
// Set isLoggedIn = true.
replaceInstruction(index, "const/4 v0, 0x1")
} ?: throw IsLoggedInFingerprint.toErrorResult()
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,8 @@
package app.revanced.patches.lightroom.misc.premium.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility([Package("com.adobe.lrmobile")])
@Target(AnnotationTarget.CLASS)
internal annotation class UnlockPremiumCompatibility

View File

@@ -0,0 +1,18 @@
package app.revanced.patches.lightroom.misc.premium.fingerprint
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 HasPurchasedFingerprint : MethodFingerprint(
returnType = "Z",
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
strings = listOf("isPurchaseDoneRecently = true, access platform profile present? = "),
opcodes = listOf(
Opcode.SGET_OBJECT,
Opcode.CONST_4,
Opcode.CONST_4,
Opcode.CONST_4,
)
)

View File

@@ -0,0 +1,27 @@
package app.revanced.patches.lightroom.misc.premium.patch
import app.revanced.extensions.toErrorResult
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.lightroom.misc.premium.annotations.UnlockPremiumCompatibility
import app.revanced.patches.lightroom.misc.premium.fingerprint.HasPurchasedFingerprint
@Patch
@Name("Unlock premium")
@Description("Unlocks premium features.")
@UnlockPremiumCompatibility
class UnlockPremiumPatch : BytecodePatch(listOf(HasPurchasedFingerprint)) {
override fun execute(context: BytecodeContext): PatchResult {
// Set hasPremium = true.
HasPurchasedFingerprint.result?.mutableMethod?.replaceInstruction(2, "const/4 v2, 0x1")
?: throw HasPurchasedFingerprint.toErrorResult()
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,22 @@
package app.revanced.patches.music.interaction.permanentrepeat.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 RepeatTrackFingerprint : MethodFingerprint(
"V",
AccessFlags.PUBLIC or AccessFlags.FINAL,
listOf("L", "L"),
listOf(
Opcode.CHECK_CAST,
Opcode.INVOKE_INTERFACE,
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.SGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.IF_NEZ
)
)

View File

@@ -0,0 +1,40 @@
package app.revanced.patches.music.interaction.permanentrepeat.patch
import app.revanced.extensions.toErrorResult
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
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.smali.ExternalLabel
import app.revanced.patches.music.annotations.MusicCompatibility
import app.revanced.patches.music.interaction.permanentrepeat.fingerprints.RepeatTrackFingerprint
@Patch(false)
@Name("Permanent repeat")
@Description("Permanently remember your repeating preference even if the playlist ends or another track is played.")
@MusicCompatibility
class PermanentRepeatPatch : BytecodePatch(
listOf(RepeatTrackFingerprint)
) {
override fun execute(context: BytecodeContext): PatchResult {
RepeatTrackFingerprint.result?.let {
val startIndex = it.scanResult.patternScanResult!!.endIndex
val repeatIndex = startIndex + 3
it.mutableMethod.apply {
addInstructionsWithLabels(
startIndex,
"goto :repeat",
ExternalLabel("repeat", getInstruction(repeatIndex))
)
}
} ?: return RepeatTrackFingerprint.toErrorResult()
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,20 @@
package app.revanced.patches.music.interaction.permanentshuffle.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 DisableShuffleFingerprint : MethodFingerprint(
"V",
AccessFlags.PUBLIC or AccessFlags.FINAL,
listOf(),
listOf(
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.SGET_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL
)
)

View File

@@ -0,0 +1,29 @@
package app.revanced.patches.music.interaction.permanentshuffle.patch
import app.revanced.extensions.toErrorResult
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.music.annotations.MusicCompatibility
import app.revanced.patches.music.interaction.permanentshuffle.fingerprints.DisableShuffleFingerprint
@Patch(false)
@Name("Permanent shuffle")
@Description("Permanently remember your shuffle preference " +
"even if the playlist ends or another track is played.")
@MusicCompatibility
class PermanentShuffleTogglePatch : BytecodePatch(
listOf(DisableShuffleFingerprint)
) {
override fun execute(context: BytecodeContext): PatchResult {
DisableShuffleFingerprint.result?.mutableMethod?.addInstruction(0, "return-void")
?: return DisableShuffleFingerprint.toErrorResult()
return PatchResultSuccess()
}
}

View File

@@ -1,12 +0,0 @@
package app.revanced.patches.nova.prime.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[
Package("com.teslacoilsw.launcher")
]
)
@Target(AnnotationTarget.CLASS)
internal annotation class UnlockPrimeCompatibility

View File

@@ -1,16 +0,0 @@
package app.revanced.patches.nova.prime.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.Opcode
object UnlockPrimeFingerprint : MethodFingerprint(
"V",
opcodes = listOf(
Opcode.IPUT_OBJECT,
Opcode.CONST_STRING,
Opcode.CONST_4,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT
),
strings = listOf("1")
)

View File

@@ -1,48 +0,0 @@
package app.revanced.patches.nova.prime.patch
import app.revanced.extensions.toErrorResult
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.nova.prime.annotations.UnlockPrimeCompatibility
import app.revanced.patches.nova.prime.fingerprints.UnlockPrimeFingerprint
import org.jf.dexlib2.builder.instruction.BuilderInstruction11x
@Patch
@Name("Unlock prime")
@Description("Unlocks Nova Prime and all functions of the app.")
@UnlockPrimeCompatibility
class UnlockPrimePatch : BytecodePatch(
listOf(
UnlockPrimeFingerprint
)
) {
private companion object {
// Any value except 0 unlocks prime, but 512 is needed for a protection mechanism
// which would reset the preferences if the value on disk had changed after a restart.
const val PRIME_STATUS: Int = 512
}
override fun execute(context: BytecodeContext): PatchResult {
UnlockPrimeFingerprint.result?.apply {
val insertIndex = scanResult.patternScanResult!!.endIndex + 1
val primeStatusRegister =
(mutableMethod.implementation!!.instructions[insertIndex - 1] as BuilderInstruction11x).registerA
mutableMethod.addInstruction(
insertIndex,
"""
const/16 v$primeStatusRegister, $PRIME_STATUS
"""
)
} ?: return UnlockPrimeFingerprint.toErrorResult()
return PatchResultSuccess()
}
}

View File

@@ -8,11 +8,15 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
import app.revanced.patcher.patch.* import app.revanced.patcher.patch.*
import java.io.File import java.io.File
abstract class AbstractChangeOAuthClientIdPatch( abstract class AbstractSpoofClientPatch(
private val redirectUri: String, private val redirectUri: String,
private val options: ChangeOAuthClientIdOptionsContainer, private val options: SpoofClientOptionsContainer,
private val fingerprints: List<MethodFingerprint> private val clientIdFingerprints: List<MethodFingerprint>,
) : BytecodePatch(fingerprints) { private val userAgentFingerprints: List<MethodFingerprint>? = null,
) : BytecodePatch(buildList {
addAll(clientIdFingerprints)
userAgentFingerprints?.let(::addAll)
}) {
override fun execute(context: BytecodeContext): PatchResult { override fun execute(context: BytecodeContext): PatchResult {
if (options.clientId == null) { if (options.clientId == null) {
// Ensure device runs Android. // Ensure device runs Android.
@@ -27,7 +31,7 @@ abstract class AbstractChangeOAuthClientIdPatch(
val error = """ val error = """
In order to use this patch, you need to provide a client ID. In order to use this patch, you need to provide a client ID.
You can do this by creating a file at ${it.absolutePath} with the client ID as its content. You can do that by creating a file at ${it.absolutePath} with the client ID as its content.
Alternatively, you can provide the client ID using patch options. Alternatively, you can provide the client ID using patch options.
You can get your client ID from https://www.reddit.com/prefs/apps. You can get your client ID from https://www.reddit.com/prefs/apps.
@@ -38,13 +42,39 @@ abstract class AbstractChangeOAuthClientIdPatch(
}.let { options.clientId = it.readText().trim() } }.let { options.clientId = it.readText().trim() }
} }
return fingerprints.map { it.result ?: throw it.toErrorResult() }.patch(context) fun List<MethodFingerprint>?.executePatch(
patch: List<MethodFingerprintResult>.(BytecodeContext) -> PatchResult
) {
when (val result = this?.map { it.result ?: throw it.toErrorResult() }?.patch(context)) {
is PatchResultError -> throw result
}
}
clientIdFingerprints.executePatch { patchClientId(context) }
userAgentFingerprints.executePatch { patchUserAgent(context) }
return PatchResultSuccess()
} }
abstract fun List<MethodFingerprintResult>.patch(context: BytecodeContext): PatchResult /**
* Patch the client ID. The fingerprints are guaranteed to be in the same order as in [clientIdFingerprints].
*
* @param context The current [BytecodeContext].
*
*/
abstract fun List<MethodFingerprintResult>.patchClientId(context: BytecodeContext): PatchResult
/**
* Patch the user agent. The fingerprints are guaranteed to be in the same order as in [userAgentFingerprints].
*
* @param context The current [BytecodeContext].
*/
// Not every client needs to patch the user agent.
open fun List<MethodFingerprintResult>.patchUserAgent(context: BytecodeContext): PatchResult =
PatchResultSuccess()
companion object Options { companion object Options {
open class ChangeOAuthClientIdOptionsContainer : OptionsContainer() { open class SpoofClientOptionsContainer : OptionsContainer() {
var clientId by option( var clientId by option(
PatchOption.StringOption( PatchOption.StringOption(
"client-id", "client-id",

View File

@@ -5,5 +5,5 @@ import app.revanced.patcher.patch.annotations.Patch
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
@Patch @Patch
@Name("Change OAuth client id") @Name("Spoof client")
annotation class ChangeOAuthClientIdPatchAnnotation annotation class SpoofClientAnnotation

View File

@@ -9,15 +9,15 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.reddit.customclients.AbstractChangeOAuthClientIdPatch import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch
import app.revanced.patches.reddit.customclients.ChangeOAuthClientIdPatchAnnotation import app.revanced.patches.reddit.customclients.SpoofClientAnnotation
import app.revanced.patches.reddit.customclients.baconreader.api.fingerprints.GetAuthorizationUrlFingerprint import app.revanced.patches.reddit.customclients.baconreader.api.fingerprints.GetAuthorizationUrlFingerprint
import app.revanced.patches.reddit.customclients.baconreader.api.fingerprints.RequestTokenFingerprint import app.revanced.patches.reddit.customclients.baconreader.api.fingerprints.RequestTokenFingerprint
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
@ChangeOAuthClientIdPatchAnnotation @SpoofClientAnnotation
@Description("Changes the OAuth client ID. " + @Description("Spoofs the client in order to allow logging in. " +
"The OAuth application type has to be \"Installed app\" " + "The OAuth application type has to be \"Installed app\" " +
"and the redirect URI has to be set to \"http://baconreader.com/auth\".") "and the redirect URI has to be set to \"http://baconreader.com/auth\".")
@Compatibility( @Compatibility(
@@ -26,11 +26,11 @@ import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
Package("com.onelouder.baconreader.premium") Package("com.onelouder.baconreader.premium")
] ]
) )
class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch( class SpoofClientPatch : AbstractSpoofClientPatch(
"http://baconreader.com/auth", Options, listOf(GetAuthorizationUrlFingerprint, RequestTokenFingerprint) "http://baconreader.com/auth", Options, listOf(GetAuthorizationUrlFingerprint, RequestTokenFingerprint)
) { ) {
override fun List<MethodFingerprintResult>.patch(context: BytecodeContext): PatchResult { override fun List<MethodFingerprintResult>.patchClientId(context: BytecodeContext): PatchResult {
fun MethodFingerprintResult.patch(replacementString: String) { fun MethodFingerprintResult.patch(replacementString: String) {
val clientIdIndex = scanResult.stringsScanResult!!.matches.first().index val clientIdIndex = scanResult.stringsScanResult!!.matches.first().index
@@ -52,5 +52,5 @@ class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch(
return PatchResultSuccess() return PatchResultSuccess()
} }
companion object Options : AbstractChangeOAuthClientIdPatch.Options.ChangeOAuthClientIdOptionsContainer() companion object Options : AbstractSpoofClientPatch.Options.SpoofClientOptionsContainer()
} }

View File

@@ -8,29 +8,29 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.reddit.customclients.AbstractChangeOAuthClientIdPatch import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch
import app.revanced.patches.reddit.customclients.ChangeOAuthClientIdPatchAnnotation import app.revanced.patches.reddit.customclients.SpoofClientAnnotation
import app.revanced.patches.reddit.customclients.boostforreddit.api.fingerprints.GetClientIdFingerprint import app.revanced.patches.reddit.customclients.boostforreddit.api.fingerprints.GetClientIdFingerprint
@ChangeOAuthClientIdPatchAnnotation @SpoofClientAnnotation
@Description("Changes the OAuth client ID. " + @Description("Spoofs the client in order to allow logging in. " +
"The OAuth application type has to be \"Installed app\" " + "The OAuth application type has to be \"Installed app\" " +
"and the redirect URI has to be set to \"http://rubenmayayo.com\".") "and the redirect URI has to be set to \"http://rubenmayayo.com\".")
@Compatibility([Package("com.rubenmayayo.reddit")]) @Compatibility([Package("com.rubenmayayo.reddit")])
class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch( class SpoofClientPatch : AbstractSpoofClientPatch(
"http://rubenmayayo.com", Options, listOf(GetClientIdFingerprint) "http://rubenmayayo.com", Options, listOf(GetClientIdFingerprint)
) { ) {
override fun List<MethodFingerprintResult>.patch(context: BytecodeContext): PatchResult { override fun List<MethodFingerprintResult>.patchClientId(context: BytecodeContext): PatchResult {
first().mutableMethod.addInstructions( first().mutableMethod.addInstructions(
0, 0,
""" """
const-string v0, "$clientId" const-string v0, "$clientId"
return-object v0 return-object v0
""" """
) )
return PatchResultSuccess() return PatchResultSuccess()
} }
companion object Options : AbstractChangeOAuthClientIdPatch.Options.ChangeOAuthClientIdOptionsContainer() companion object Options : AbstractSpoofClientPatch.Options.SpoofClientOptionsContainer()
} }

View File

@@ -9,23 +9,23 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.reddit.customclients.AbstractChangeOAuthClientIdPatch import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch
import app.revanced.patches.reddit.customclients.ChangeOAuthClientIdPatchAnnotation import app.revanced.patches.reddit.customclients.SpoofClientAnnotation
import app.revanced.patches.reddit.customclients.infinityforreddit.api.fingerprints.GetHttpBasicAuthHeaderFingerprint import app.revanced.patches.reddit.customclients.infinityforreddit.api.fingerprints.GetHttpBasicAuthHeaderFingerprint
import app.revanced.patches.reddit.customclients.infinityforreddit.api.fingerprints.LoginActivityOnCreateFingerprint import app.revanced.patches.reddit.customclients.infinityforreddit.api.fingerprints.LoginActivityOnCreateFingerprint
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
@ChangeOAuthClientIdPatchAnnotation @SpoofClientAnnotation
@Description("Changes the OAuth client ID. " + @Description("Spoofs the client in order to allow logging in. " +
"The OAuth application type has to be \"Installed app\" " + "The OAuth application type has to be \"Installed app\" " +
"and the redirect URI has to be set to \"infinity://localhost\".") "and the redirect URI has to be set to \"infinity://localhost\".")
@Compatibility([Package("ml.docilealligator.infinityforreddit")]) @Compatibility([Package("ml.docilealligator.infinityforreddit")])
class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch( class SpoofClientPatch : AbstractSpoofClientPatch(
"infinity://localhost", "infinity://localhost",
Options, Options,
listOf(GetHttpBasicAuthHeaderFingerprint, LoginActivityOnCreateFingerprint) listOf(GetHttpBasicAuthHeaderFingerprint, LoginActivityOnCreateFingerprint)
) { ) {
override fun List<MethodFingerprintResult>.patch(context: BytecodeContext): PatchResult { override fun List<MethodFingerprintResult>.patchClientId(context: BytecodeContext): PatchResult {
forEach { forEach {
val clientIdIndex = it.scanResult.stringsScanResult!!.matches.first().index val clientIdIndex = it.scanResult.stringsScanResult!!.matches.first().index
it.mutableMethod.apply { it.mutableMethod.apply {
@@ -41,5 +41,5 @@ class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch(
return PatchResultSuccess() return PatchResultSuccess()
} }
companion object Options : AbstractChangeOAuthClientIdPatch.Options.ChangeOAuthClientIdOptionsContainer() companion object Options : AbstractSpoofClientPatch.Options.SpoofClientOptionsContainer()
} }

View File

@@ -0,0 +1,10 @@
package app.revanced.patches.reddit.customclients.joeyforreddit.ads.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.AccessFlags
object IsAdFreeUserFingerprint : MethodFingerprint(
returnType = "Z",
accessFlags = AccessFlags.PUBLIC.value,
strings = listOf("AD_FREE_USER")
)

View File

@@ -0,0 +1,33 @@
package app.revanced.patches.reddit.customclients.joeyforreddit.ads.patch
import app.revanced.extensions.toErrorResult
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Package
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.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.reddit.customclients.joeyforreddit.ads.fingerprints.IsAdFreeUserFingerprint
import app.revanced.patches.reddit.customclients.joeyforreddit.detection.piracy.patch.DisablePiracyDetectionPatch
@Patch
@Name("Disable ads")
@DependsOn([DisablePiracyDetectionPatch::class])
@Compatibility([Package("o.o.joey")])
class DisableAdsPatch : BytecodePatch(listOf(IsAdFreeUserFingerprint)) {
override fun execute(context: BytecodeContext): PatchResult {
IsAdFreeUserFingerprint.result?.mutableMethod?.addInstructions(
0,
"""
const/4 v0, 0x1
return v0
"""
) ?: return IsAdFreeUserFingerprint.toErrorResult()
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,20 @@
package app.revanced.patches.reddit.customclients.joeyforreddit.api.fingerprints
import app.revanced.patcher.extensions.or
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
object GetClientIdFingerprint : MethodFingerprint(
returnType = "L",
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
opcodes = listOf(
Opcode.CONST, // R.string.valuable_cid
Opcode.INVOKE_STATIC, // StringMaster.decrypt
Opcode.MOVE_RESULT_OBJECT,
Opcode.RETURN_OBJECT
),
customFingerprint = custom@{ _, classDef ->
classDef.sourceFile == "AuthUtility.java"
}
)

View File

@@ -0,0 +1,47 @@
package app.revanced.patches.reddit.customclients.joeyforreddit.api.patch
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Package
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch
import app.revanced.patches.reddit.customclients.SpoofClientAnnotation
import app.revanced.patches.reddit.customclients.joeyforreddit.api.fingerprints.GetClientIdFingerprint
import app.revanced.patches.reddit.customclients.joeyforreddit.detection.piracy.patch.DisablePiracyDetectionPatch
@SpoofClientAnnotation
@Description(
"Spoofs the client in order to allow logging in. " +
"The OAuth application type has to be \"Installed app\" " +
"and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\"."
)
@Compatibility(
[
Package("o.o.joey"),
Package("o.o.joey.pro"),
Package("o.o.joey.dev")
]
)
@DependsOn([DisablePiracyDetectionPatch::class])
class SpoofClientPatch : AbstractSpoofClientPatch(
"https://127.0.0.1:65023/authorize_callback", Options, listOf(GetClientIdFingerprint)
) {
override fun List<MethodFingerprintResult>.patchClientId(context: BytecodeContext): PatchResult {
first().mutableMethod.addInstructions(
0,
"""
const-string v0, "$clientId"
return-object v0
"""
)
return PatchResultSuccess()
}
companion object Options : AbstractSpoofClientPatch.Options.SpoofClientOptionsContainer()
}

View File

@@ -0,0 +1,22 @@
package app.revanced.patches.reddit.customclients.joeyforreddit.detection.piracy.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 PiracyDetectionFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PRIVATE or AccessFlags.STATIC,
opcodes = listOf(
Opcode.NEW_INSTANCE, // new PiracyDetectionRunnable()
Opcode.CONST_16,
Opcode.CONST_WIDE_16,
Opcode.INVOKE_DIRECT, // <init>(..)
Opcode.INVOKE_VIRTUAL, // run()
Opcode.RETURN_VOID
),
customFingerprint = custom@{ _, classDef ->
classDef.type.endsWith("ProcessLifeCyleListener;")
}
)

View File

@@ -0,0 +1,22 @@
package app.revanced.patches.reddit.customclients.joeyforreddit.detection.piracy.patch
import app.revanced.extensions.toErrorResult
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.reddit.customclients.joeyforreddit.detection.piracy.fingerprints.PiracyDetectionFingerprint
class DisablePiracyDetectionPatch : BytecodePatch(listOf(PiracyDetectionFingerprint)) {
override fun execute(context: BytecodeContext): PatchResult {
PiracyDetectionFingerprint.result?.mutableMethod?.addInstruction(
0,
"""
return-void
"""
) ?: return PiracyDetectionFingerprint.toErrorResult()
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,20 @@
package app.revanced.patches.reddit.customclients.redditisfun.api.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 GetUserAgentFingerprint : MethodFingerprint(
"Ljava/lang/String;",
AccessFlags.PUBLIC or AccessFlags.STATIC,
emptyList(),
listOf(
Opcode.NEW_ARRAY,
Opcode.CONST_4,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.APUT_OBJECT,
Opcode.CONST,
)
)

View File

@@ -4,32 +4,32 @@ import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Description import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Package import app.revanced.patcher.annotation.Package
import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult.MethodFingerprintScanResult.StringsScanResult.StringMatch import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult.MethodFingerprintScanResult.StringsScanResult.StringMatch
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.reddit.customclients.AbstractChangeOAuthClientIdPatch import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch
import app.revanced.patches.reddit.customclients.ChangeOAuthClientIdPatchAnnotation import app.revanced.patches.reddit.customclients.SpoofClientAnnotation
import app.revanced.patches.reddit.customclients.redditisfun.api.fingerprints.BasicAuthorizationFingerprint import app.revanced.patches.reddit.customclients.redditisfun.api.fingerprints.BasicAuthorizationFingerprint
import app.revanced.patches.reddit.customclients.redditisfun.api.fingerprints.BuildAuthorizationStringFingerprint import app.revanced.patches.reddit.customclients.redditisfun.api.fingerprints.BuildAuthorizationStringFingerprint
import app.revanced.patches.reddit.customclients.redditisfun.api.fingerprints.GetUserAgentFingerprint
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
@ChangeOAuthClientIdPatchAnnotation @SpoofClientAnnotation
@Description("Changes the OAuth client ID. " + @Description("Spoofs the client in order to allow logging in. " +
"The OAuth application type has to be \"Installed app\" " + "The OAuth application type has to be \"Installed app\" " +
"and the redirect URI has to be set to \"redditisfun://auth\".") "and the redirect URI has to be set to \"redditisfun://auth\".")
@Compatibility([Package("com.andrewshu.android.reddit"), Package("com.andrewshu.android.redditdonation")]) @Compatibility([Package("com.andrewshu.android.reddit"), Package("com.andrewshu.android.redditdonation")])
class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch( class SpoofClientPatch : AbstractSpoofClientPatch(
"redditisfun://auth", "redditisfun://auth",
Options, Options,
listOf( listOf(BuildAuthorizationStringFingerprint, BasicAuthorizationFingerprint),
BuildAuthorizationStringFingerprint, listOf(GetUserAgentFingerprint)
BasicAuthorizationFingerprint,
)
) { ) {
override fun List<MethodFingerprintResult>.patch(context: BytecodeContext): PatchResult { override fun List<MethodFingerprintResult>.patchClientId(context: BytecodeContext): PatchResult {
/** /**
* Replaces a one register instruction with a const-string instruction * Replaces a one register instruction with a const-string instruction
* at the index returned by [getReplacementIndex]. * at the index returned by [getReplacementIndex].
@@ -57,5 +57,21 @@ class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch(
return PatchResultSuccess() return PatchResultSuccess()
} }
companion object Options : AbstractChangeOAuthClientIdPatch.Options.ChangeOAuthClientIdOptionsContainer() override fun List<MethodFingerprintResult>.patchUserAgent(context: BytecodeContext): PatchResult {
// Use a random user agent.
val randomName = (0..100000).random()
val userAgent = "android:app.revanced.$randomName:v1.0.0 (by /u/revanced)"
first().mutableMethod.addInstructions(
0,
"""
const-string v0, "$userAgent"
return-object v0
"""
)
return PatchResultSuccess()
}
companion object Options : AbstractSpoofClientPatch.Options.SpoofClientOptionsContainer()
} }

View File

@@ -9,20 +9,20 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.reddit.customclients.AbstractChangeOAuthClientIdPatch import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch
import app.revanced.patches.reddit.customclients.ChangeOAuthClientIdPatchAnnotation import app.revanced.patches.reddit.customclients.SpoofClientAnnotation
import app.revanced.patches.reddit.customclients.relayforreddit.api.fingerprints.GetLoggedInBearerTokenFingerprint import app.revanced.patches.reddit.customclients.relayforreddit.api.fingerprints.GetLoggedInBearerTokenFingerprint
import app.revanced.patches.reddit.customclients.relayforreddit.api.fingerprints.GetLoggedOutBearerTokenFingerprint import app.revanced.patches.reddit.customclients.relayforreddit.api.fingerprints.GetLoggedOutBearerTokenFingerprint
import app.revanced.patches.reddit.customclients.relayforreddit.api.fingerprints.GetRefreshTokenFingerprint import app.revanced.patches.reddit.customclients.relayforreddit.api.fingerprints.GetRefreshTokenFingerprint
import app.revanced.patches.reddit.customclients.relayforreddit.api.fingerprints.LoginActivityClientIdFingerprint import app.revanced.patches.reddit.customclients.relayforreddit.api.fingerprints.LoginActivityClientIdFingerprint
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
@ChangeOAuthClientIdPatchAnnotation @SpoofClientAnnotation
@Description("Changes the OAuth client ID. " + @Description("Spoofs the client in order to allow logging in. " +
"The OAuth application type has to be \"Installed app\" " + "The OAuth application type has to be \"Installed app\" " +
"and the redirect URI has to be set to \"dbrady://relay\".") "and the redirect URI has to be set to \"dbrady://relay\".")
@Compatibility([Package("free.reddit.news"), Package("reddit.news")]) @Compatibility([Package("free.reddit.news"), Package("reddit.news")])
class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch( class SpoofClientPatch : AbstractSpoofClientPatch(
"dbrady://relay", "dbrady://relay",
Options, Options,
listOf( listOf(
@@ -32,7 +32,7 @@ class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch(
GetRefreshTokenFingerprint GetRefreshTokenFingerprint
) )
) { ) {
override fun List<MethodFingerprintResult>.patch(context: BytecodeContext): PatchResult { override fun List<MethodFingerprintResult>.patchClientId(context: BytecodeContext): PatchResult {
forEach { forEach {
val clientIdIndex = it.scanResult.stringsScanResult!!.matches.first().index val clientIdIndex = it.scanResult.stringsScanResult!!.matches.first().index
it.mutableMethod.apply { it.mutableMethod.apply {
@@ -48,5 +48,5 @@ class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch(
return PatchResultSuccess() return PatchResultSuccess()
} }
companion object Options : AbstractChangeOAuthClientIdPatch.Options.ChangeOAuthClientIdOptionsContainer() companion object Options : AbstractSpoofClientPatch.Options.SpoofClientOptionsContainer()
} }

View File

@@ -1,36 +1,36 @@
package app.revanced.patches.reddit.customclients.slide.api.patch package app.revanced.patches.reddit.customclients.slide.api.patch
import app.revanced.patcher.annotation.Compatibility import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Description import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Package import app.revanced.patcher.annotation.Package
import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.reddit.customclients.AbstractChangeOAuthClientIdPatch import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch
import app.revanced.patches.reddit.customclients.ChangeOAuthClientIdPatchAnnotation import app.revanced.patches.reddit.customclients.SpoofClientAnnotation
import app.revanced.patches.reddit.customclients.boostforreddit.api.fingerprints.GetClientIdFingerprint import app.revanced.patches.reddit.customclients.boostforreddit.api.fingerprints.GetClientIdFingerprint
@ChangeOAuthClientIdPatchAnnotation @SpoofClientAnnotation
@Description("Changes the OAuth client ID. " + @Description("Spoofs the client in order to allow logging in. " +
"The OAuth application type has to be \"Installed app\" " + "The OAuth application type has to be \"Installed app\" " +
"and the redirect URI has to be set to \"http://www.ccrama.me\".") "and the redirect URI has to be set to \"http://www.ccrama.me\".")
@Compatibility([Package("me.ccrama.redditslide")]) @Compatibility([Package("me.ccrama.redditslide")])
class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch( class SpoofClientPatch : AbstractSpoofClientPatch(
"http://www.ccrama.me", Options, listOf(GetClientIdFingerprint) "http://www.ccrama.me", Options, listOf(GetClientIdFingerprint)
) { ) {
override fun List<MethodFingerprintResult>.patch(context: BytecodeContext): PatchResult { override fun List<MethodFingerprintResult>.patchClientId(context: BytecodeContext): PatchResult {
first().mutableMethod.addInstructions( first().mutableMethod.addInstructions(
0, 0,
""" """
const-string v0, "$clientId" const-string v0, "$clientId"
return-object v0 return-object v0
""" """
) )
return PatchResultSuccess() return PatchResultSuccess()
} }
companion object Options : AbstractChangeOAuthClientIdPatch.Options.ChangeOAuthClientIdOptionsContainer() companion object Options : AbstractSpoofClientPatch.Options.SpoofClientOptionsContainer()
} }

View File

@@ -15,7 +15,6 @@ import app.revanced.patches.reddit.customclients.syncforreddit.detection.piracy.
@Patch @Patch
@Name("Disable ads") @Name("Disable ads")
@DependsOn([DisablePiracyDetectionPatch::class]) @DependsOn([DisablePiracyDetectionPatch::class])
@Description("Disables ads.")
@Compatibility([Package("com.laurencedawson.reddit_sync")]) @Compatibility([Package("com.laurencedawson.reddit_sync")])
class DisableAdsPatch : BytecodePatch(listOf(IsAdsEnabledFingerprint)) { class DisableAdsPatch : BytecodePatch(listOf(IsAdsEnabledFingerprint)) {
override fun execute(context: BytecodeContext): PatchResult { override fun execute(context: BytecodeContext): PatchResult {

View File

@@ -12,17 +12,19 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.reddit.customclients.AbstractChangeOAuthClientIdPatch import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patches.reddit.customclients.ChangeOAuthClientIdPatchAnnotation import app.revanced.patches.reddit.customclients.AbstractSpoofClientPatch
import app.revanced.patches.reddit.customclients.SpoofClientAnnotation
import app.revanced.patches.reddit.customclients.syncforreddit.api.fingerprints.GetAuthorizationStringFingerprint import app.revanced.patches.reddit.customclients.syncforreddit.api.fingerprints.GetAuthorizationStringFingerprint
import app.revanced.patches.reddit.customclients.syncforreddit.api.fingerprints.GetBearerTokenFingerprint import app.revanced.patches.reddit.customclients.syncforreddit.api.fingerprints.GetBearerTokenFingerprint
import app.revanced.patches.reddit.customclients.syncforreddit.detection.piracy.patch.DisablePiracyDetectionPatch
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
import org.jf.dexlib2.iface.instruction.ReferenceInstruction import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.iface.reference.StringReference import org.jf.dexlib2.iface.reference.StringReference
import java.util.* import java.util.*
@ChangeOAuthClientIdPatchAnnotation @SpoofClientAnnotation
@Description("Changes the OAuth client ID. " + @Description("Spoofs the client in order to allow logging in. " +
"The OAuth application type has to be \"Installed app\" " + "The OAuth application type has to be \"Installed app\" " +
"and the redirect URI has to be set to \"http://redditsync/auth\".") "and the redirect URI has to be set to \"http://redditsync/auth\".")
@Compatibility( @Compatibility(
@@ -32,10 +34,11 @@ import java.util.*
Package("com.laurencedawson.reddit_sync.dev") Package("com.laurencedawson.reddit_sync.dev")
] ]
) )
class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch( @DependsOn([DisablePiracyDetectionPatch::class])
class SpoofClientPatch : AbstractSpoofClientPatch(
"http://redditsync/auth", Options, listOf(GetAuthorizationStringFingerprint) "http://redditsync/auth", Options, listOf(GetAuthorizationStringFingerprint)
) { ) {
override fun List<MethodFingerprintResult>.patch(context: BytecodeContext): PatchResult { override fun List<MethodFingerprintResult>.patchClientId(context: BytecodeContext): PatchResult {
forEach { fingerprintResult -> forEach { fingerprintResult ->
fingerprintResult.also { result -> fingerprintResult.also { result ->
GetBearerTokenFingerprint.also { it.resolve(context, result.classDef) }.result?.mutableMethod?.apply { GetBearerTokenFingerprint.also { it.resolve(context, result.classDef) }.result?.mutableMethod?.apply {
@@ -72,5 +75,5 @@ class ChangeOAuthClientIdPatch : AbstractChangeOAuthClientIdPatch(
return PatchResultSuccess() return PatchResultSuccess()
} }
companion object Options : AbstractChangeOAuthClientIdPatch.Options.ChangeOAuthClientIdOptionsContainer() companion object Options : AbstractSpoofClientPatch.Options.SpoofClientOptionsContainer()
} }

View File

@@ -1,8 +0,0 @@
package app.revanced.patches.tasker.trial.unlock.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility([Package("net.dinglisch.android.taskerm")])
@Target(AnnotationTarget.CLASS)
internal annotation class UnlockTrialCompatibility

View File

@@ -1,7 +0,0 @@
package app.revanced.patches.tasker.trial.unlock.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
object CheckLicenseFingerprint : MethodFingerprint(
strings = listOf("Can't check license")
)

View File

@@ -1,30 +0,0 @@
package app.revanced.patches.tasker.trial.unlock.patch
import app.revanced.extensions.toErrorResult
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.tasker.trial.unlock.annotations.UnlockTrialCompatibility
import app.revanced.patches.tasker.trial.unlock.fingerprints.CheckLicenseFingerprint
@Patch
@Name("Unlock trial")
@Description("Unlocks the trial version.")
@UnlockTrialCompatibility
class UnlockLicensePatch : BytecodePatch(
listOf(
CheckLicenseFingerprint
)
) {
override fun execute(context: BytecodeContext) = CheckLicenseFingerprint
.result
?.mutableMethod
// Return the method early, which prompts the user with a non dismissible dialog, when the trial period is over.
?.addInstruction(0, "return-void")
?.let { PatchResultSuccess() }
?: CheckLicenseFingerprint.toErrorResult()
}

View File

@@ -0,0 +1,9 @@
package app.revanced.patches.tiktok.interaction.seekbar.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
object ShouldShowSeekBarFingerprint : MethodFingerprint(
strings = listOf(
"can not show seekbar, state: 1, not in resume"
),
)

View File

@@ -5,14 +5,13 @@ import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.Patch import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.tiktok.interaction.seekbar.annotations.ShowSeekbarCompatibility import app.revanced.patches.tiktok.interaction.seekbar.annotations.ShowSeekbarCompatibility
import app.revanced.patches.tiktok.interaction.seekbar.fingerprints.SetSeekBarShowTypeFingerprint import app.revanced.patches.tiktok.interaction.seekbar.fingerprints.SetSeekBarShowTypeFingerprint
import org.jf.dexlib2.iface.instruction.formats.Instruction22t import app.revanced.patches.tiktok.interaction.seekbar.fingerprints.ShouldShowSeekBarFingerprint
@Patch @Patch
@Name("Show seekbar") @Name("Show seekbar")
@@ -21,11 +20,21 @@ import org.jf.dexlib2.iface.instruction.formats.Instruction22t
class ShowSeekbarPatch : BytecodePatch( class ShowSeekbarPatch : BytecodePatch(
listOf( listOf(
SetSeekBarShowTypeFingerprint, SetSeekBarShowTypeFingerprint,
ShouldShowSeekBarFingerprint,
) )
) { ) {
override fun execute(context: BytecodeContext): PatchResult { override fun execute(context: BytecodeContext): PatchResult {
ShouldShowSeekBarFingerprint.result?.mutableMethod?.apply {
addInstructions(
0,
"""
const/4 v0, 0x1
return v0
"""
)
}
SetSeekBarShowTypeFingerprint.result?.mutableMethod?.apply { SetSeekBarShowTypeFingerprint.result?.mutableMethod?.apply {
val typeRegister = getInstruction<Instruction22t>(1).registerB val typeRegister = implementation!!.registerCount - 1
addInstructions( addInstructions(
0, 0,

View File

@@ -34,6 +34,30 @@ class HideButtonsPatch : ResourcePatch {
StringResource("revanced_hide_like_dislike_button_summary_on", "Like and dislike buttons are hidden"), StringResource("revanced_hide_like_dislike_button_summary_on", "Like and dislike buttons are hidden"),
StringResource("revanced_hide_like_dislike_button_summary_off", "Like and dislike buttons are shown") StringResource("revanced_hide_like_dislike_button_summary_off", "Like and dislike buttons are shown")
), ),
SwitchPreference(
"revanced_hide_live_chat_button",
StringResource("revanced_hide_live_chat_button_title", "Hide live chat button"),
StringResource("revanced_hide_live_chat_button_summary_on", "Live chat button is hidden"),
StringResource("revanced_hide_live_chat_button_summary_off", "Live chat button is shown")
),
SwitchPreference(
"revanced_hide_share_button",
StringResource("revanced_hide_share_button_title", "Hide share button"),
StringResource("revanced_hide_share_button_summary_on", "Share button is hidden"),
StringResource("revanced_hide_share_button_summary_off", "Share button is shown")
),
SwitchPreference(
"revanced_hide_report_button",
StringResource("revanced_hide_report_button_title", "Hide report button"),
StringResource("revanced_hide_report_button_summary_on", "Report button is hidden"),
StringResource("revanced_hide_report_button_summary_off", "Report button is shown")
),
SwitchPreference(
"revanced_hide_remix_button",
StringResource("revanced_hide_remix_button_title", "Hide remix button"),
StringResource("revanced_hide_remix_button_summary_on", "Remix button is hidden"),
StringResource("revanced_hide_remix_button_summary_off", "Remix button is shown")
),
SwitchPreference( SwitchPreference(
"revanced_hide_download_button", "revanced_hide_download_button",
StringResource("revanced_hide_download_button_title", "Hide download button"), StringResource("revanced_hide_download_button_title", "Hide download button"),
@@ -41,24 +65,28 @@ class HideButtonsPatch : ResourcePatch {
StringResource("revanced_hide_download_button_summary_off", "Download button is shown") StringResource("revanced_hide_download_button_summary_off", "Download button is shown")
), ),
SwitchPreference( SwitchPreference(
"revanced_hide_playlist_button", "revanced_hide_thanks_button",
StringResource("revanced_hide_playlist_button_title", "Hide playlist button"), StringResource("revanced_hide_thanks_button_title", "Hide thanks button"),
StringResource("revanced_hide_playlist_button_summary_on", "Playlist button is hidden"), StringResource("revanced_hide_thanks_button_summary_on", "Thanks button is hidden"),
StringResource("revanced_hide_playlist_button_summary_off", "Playlist button is shown") StringResource("revanced_hide_thanks_button_summary_off", "Thanks button is shown")
), ),
SwitchPreference( SwitchPreference(
"revanced_hide_clip_button", "revanced_hide_clip_button",
StringResource("revanced_hide_clip_button_title", "Hide clip button"), StringResource("revanced_hide_clip_button_title", "Hide clip button"),
StringResource("revanced_hide_clip_button_summary_on", "Clip button is hidden"), StringResource("revanced_hide_clip_button_summary_on", "Clip button is hidden"),
StringResource("revanced_hide_clip_button_summary_off", "Clip button is shown"), StringResource("revanced_hide_clip_button_summary_off", "Clip button is shown"),
StringResource("revanced_hide_clip_button_user_dialog_message",
"Hiding the clip button might not work reliably. In the case it does not work, it can only be hidden by enabling \\'Hide all other action buttons\\'")
), ),
SwitchPreference( SwitchPreference(
"revanced_hide_action_buttons", "revanced_hide_playlist_button",
StringResource("revanced_hide_action_buttons_title", "Hide all other action buttons"), StringResource("revanced_hide_playlist_button_title", "Hide save to playlist button"),
StringResource("revanced_hide_action_buttons_summary_on", "Share, remix, thanks, shop, live chat buttons are hidden"), StringResource("revanced_hide_playlist_button_summary_on", "Save button is hidden"),
StringResource("revanced_hide_action_buttons_summary_off", "Share, remix, thanks, shop, live chat buttons are shown") StringResource("revanced_hide_playlist_button_summary_off", "Save button is shown")
),
SwitchPreference(
"revanced_hide_shop_button",
StringResource("revanced_hide_shop_button_title", "Hide shop button"),
StringResource("revanced_hide_shop_button_summary_on", "Shop button is hidden"),
StringResource("revanced_hide_shop_button_summary_off", "Shop button is shown")
) )
), ),
StringResource("revanced_hide_buttons_preference_screen_summary", "Hide or show buttons under videos") StringResource("revanced_hide_buttons_preference_screen_summary", "Hide or show buttons under videos")

View File

@@ -2,7 +2,6 @@ package app.revanced.patches.youtube.layout.hide.player.flyoutmenupanel.patch
import app.revanced.patcher.annotation.Description import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
@@ -21,7 +20,6 @@ import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
@Description("Hides player flyout menu items.") @Description("Hides player flyout menu items.")
@DependsOn([LithoFilterPatch::class, SettingsPatch::class]) @DependsOn([LithoFilterPatch::class, SettingsPatch::class])
@HidePlayerFlyoutMenuItemsCompatibility @HidePlayerFlyoutMenuItemsCompatibility
@Version("0.0.1")
class HidePlayerFlyoutMenuPatch : ResourcePatch { class HidePlayerFlyoutMenuPatch : ResourcePatch {
override fun execute(context: ResourceContext): PatchResult { override fun execute(context: ResourceContext): PatchResult {
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(

View File

@@ -32,6 +32,15 @@ class DebuggingPatch : ResourcePatch {
StringResource("revanced_debug_summary_on", "Debug logs are enabled"), StringResource("revanced_debug_summary_on", "Debug logs are enabled"),
StringResource("revanced_debug_summary_off", "Debug logs are disabled") StringResource("revanced_debug_summary_off", "Debug logs are disabled")
), ),
SwitchPreference(
"revanced_debug_protobuffer",
StringResource(
"revanced_debug_protobuffer_title",
"Log protocol buffer"
),
StringResource("revanced_debug_protobuffer_summary_on", "Debug logs include proto buffer"),
StringResource("revanced_debug_protobuffer_summary_off", "Debug logs do not include proto buffer")
),
SwitchPreference( SwitchPreference(
"revanced_debug_stacktrace", "revanced_debug_stacktrace",
StringResource( StringResource(

View File

@@ -17,7 +17,7 @@ import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
@Patch @Patch
@Name("Client spoof") @Name("Client spoof")
@Description("Spoofs a patched client to allow playback.") @Description("Spoofs the client to allow playback.")
@ClientSpoofCompatibility @ClientSpoofCompatibility
@DependsOn([SpoofSignatureVerificationPatch::class]) @DependsOn([SpoofSignatureVerificationPatch::class])
class ClientSpoofPatch : BytecodePatch( class ClientSpoofPatch : BytecodePatch(

View File

@@ -14,13 +14,16 @@ import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.* import app.revanced.patches.youtube.misc.fix.playback.fingerprints.ProtobufParameterBuilderFingerprint
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.ScrubbedPreviewLayoutFingerprint
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.StoryboardThumbnailFingerprint
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.StoryboardThumbnailParentFingerprint
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch
import org.jf.dexlib2.iface.instruction.ReferenceInstruction import org.jf.dexlib2.iface.instruction.ReferenceInstruction
@Name("Spoof signature verification") @Name("Spoof signature verification")
@Description("Spoofs a patched client to prevent playback issues.") @Description("Spoofs the client to prevent playback issues.")
@DependsOn([ @DependsOn([
SpoofSignatureVerificationResourcePatch::class, SpoofSignatureVerificationResourcePatch::class,
IntegrationsPatch::class, IntegrationsPatch::class,

View File

@@ -8,7 +8,6 @@ import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
import app.revanced.patches.shared.settings.preference.impl.StringResource import app.revanced.patches.shared.settings.preference.impl.StringResource
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.*
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
@DependsOn([SettingsPatch::class, ResourceMappingPatch::class]) @DependsOn([SettingsPatch::class, ResourceMappingPatch::class])
@@ -23,11 +22,11 @@ class SpoofSignatureVerificationResourcePatch : ResourcePatch {
"App signature spoofed\\n\\n" "App signature spoofed\\n\\n"
+ "Side effects include:\\n" + "Side effects include:\\n"
+ "• Ambient mode may not work\\n" + "• Ambient mode may not work\\n"
+ "Seekbar thumbnails are hidden\\n" + "Downloading videos may not work\\n"
+ "Downloading videos may not work"), + "Seekbar thumbnails are always hidden"),
StringResource("revanced_spoof_signature_verification_summary_off", "App signature not spoofed"), StringResource("revanced_spoof_signature_verification_summary_off", "App signature not spoofed\\n\\nVideo playback may not work"),
StringResource("revanced_spoof_signature_verification_user_dialog_message", StringResource("revanced_spoof_signature_verification_user_dialog_message",
"Turning off this setting may cause playback issues.") "Turning off this setting will cause video playback issues.")
) )
) )

View File

@@ -9,23 +9,19 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWith
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint 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.MethodFingerprint.Companion.resolve
import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable
import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
import app.revanced.patches.youtube.misc.litho.filter.fingerprints.* import app.revanced.patches.youtube.misc.litho.filter.fingerprints.*
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
import org.jf.dexlib2.iface.instruction.Instruction import org.jf.dexlib2.iface.instruction.Instruction
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
import org.jf.dexlib2.iface.instruction.ReferenceInstruction import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.immutable.ImmutableField
import java.io.Closeable import java.io.Closeable
@DependsOn([IntegrationsPatch::class]) @DependsOn([IntegrationsPatch::class])
@@ -41,32 +37,29 @@ class LithoFilterPatch : BytecodePatch(
* Additionally, the method contains a reference to the components identifier. * Additionally, the method contains a reference to the components identifier.
* The identifier is used to filter components by their identifier. * The identifier is used to filter components by their identifier.
* *
* In addition to that, a static field is added to the class of this method. (See protobufBufferField). * The protobuf buffer is passed along from a different injection point before the filtering occurs.
* This field holds a reference to the protobuf buffer object. * The buffer is a large byte array that represents the component tree.
* The field is being set in another method that holds a reference to the protobuf buffer object.
* The object contains a large byte array that represents the component tree.
* This byte array is searched for strings that indicate the current component. * This byte array is searched for strings that indicate the current component.
* *
* The following pseudo code shows how the patch works: * The following pseudo code shows how the patch works:
* *
* class ComponentContextParser {
* public static ByteBuffer buffer; // Inserted by this patch.
*
* public ComponentContext parseBytesToComponentContext(...) {
* ...
* if (filter(identifier, pathBuilder, buffer)); // Inserted by this patch.
* return emptyComponent;
* ...
* }
* }
*
* class SomeOtherClass { * class SomeOtherClass {
* // Called before ComponentContextParser.parseBytesToComponentContext method. * // Called before ComponentContextParser.parseBytesToComponentContext method.
* public void someOtherMethod(ByteBuffer byteBuffer) { * public void someOtherMethod(ByteBuffer byteBuffer) {
* ComponentContextParser.buffer = byteBuffer; // Inserted by this patch. * IntegrationsClass.setProtoBuffer(byteBuffer); // Inserted by this patch.
* ... * ...
* } * }
* } * }
*
* class ComponentContextParser {
*
* public ComponentContext parseBytesToComponentContext(...) {
* ...
* if (IntegrationsClass.filter(identifier, pathBuilder)); // Inserted by this patch.
* return emptyComponent;
* ...
* }
* }
*/ */
override fun execute(context: BytecodeContext): PatchResult { override fun execute(context: BytecodeContext): PatchResult {
ComponentContextParserFingerprint.result?.also { ComponentContextParserFingerprint.result?.also {
@@ -78,21 +71,12 @@ class LithoFilterPatch : BytecodePatch(
return fingerprint.toErrorResult() return fingerprint.toErrorResult()
} }
}?.let { bytesToComponentContextMethod -> }?.let { bytesToComponentContextMethod ->
// region Add a static field that holds a reference to the protobuf buffer object.
val protobufBufferField = ImmutableField(
bytesToComponentContextMethod.mutableClass.type,
"buffer",
"Ljava/nio/ByteBuffer;",
AccessFlags.PUBLIC or AccessFlags.STATIC,
null,
null,
null
).toMutable()
bytesToComponentContextMethod.mutableClass.staticFields.add(protobufBufferField)
// Set the field with the reference to the protobuf buffer object. // region Pass the buffer into Integrations.
ProtobufBufferReferenceFingerprint.result ProtobufBufferReferenceFingerprint.result
?.mutableMethod?.addInstruction(0, "sput-object p2, $protobufBufferField") ?.mutableMethod?.addInstruction(0,
" invoke-static { p2 }, $INTEGRATIONS_CLASS_DESCRIPTOR->setProtoBuffer(Ljava/nio/ByteBuffer;)V")
?: return ProtobufBufferReferenceFingerprint.toErrorResult() ?: return ProtobufBufferReferenceFingerprint.toErrorResult()
// endregion // endregion
@@ -135,17 +119,13 @@ class LithoFilterPatch : BytecodePatch(
// region Patch the method. // region Patch the method.
// Insert the instructions that are responsible // Insert the instructions that are responsible
// to return an EmptyComponent instead of the original component if the filter method returns false. // to return an EmptyComponent instead of the original component if the filter method returns true.
addInstructionsWithLabels( addInstructionsWithLabels(
insertHookIndex, insertHookIndex,
""" """
# Register "free1" holds the protobuf buffer object
sget-object v$free1, $protobufBufferField
# Invoke the filter method. # Invoke the filter method.
invoke-static { v$stringBuilderRegister, v$identifierRegister, v$free1 }, $FILTER_METHOD_DESCRIPTOR invoke-static { v$identifierRegister, v$stringBuilderRegister }, $INTEGRATIONS_CLASS_DESCRIPTOR->filter(Ljava/lang/String;Ljava/lang/StringBuilder;)Z
move-result v$free1 move-result v$free1
if-eqz v$free1, :unfiltered if-eqz v$free1, :unfiltered
@@ -197,9 +177,7 @@ class LithoFilterPatch : BytecodePatch(
private val Instruction.descriptor private val Instruction.descriptor
get() = (this as ReferenceInstruction).reference.toString() get() = (this as ReferenceInstruction).reference.toString()
private const val FILTER_METHOD_DESCRIPTOR = const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/components/LithoFilterPatch;"
"Lapp/revanced/integrations/patches/components/LithoFilterPatch;" +
"->filter(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/nio/ByteBuffer;)Z"
internal lateinit var addFilter: (String) -> Unit internal lateinit var addFilter: (String) -> Unit
private set private set