Compare commits

...

1251 Commits

Author SHA1 Message Date
Pun Butrach
f6194edde9 fix: Specify Build tools for API 2025-07-22 20:43:15 +07:00
Ax333l
fc96137567 fix: remove unused function preventing compilation 2025-07-18 16:21:47 +02:00
Ax333l
244674a603 chore: remove unused dependency 2025-07-15 17:56:24 +02:00
oSumAtrIX
47e4ed8336 feat: Rename "Patch bundle" to "Patches" (#2541)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-07-15 17:36:34 +02:00
brosssh
486ed5967f fix: Show selection warning also on patch option (#2643) 2025-07-15 15:32:49 +02:00
Ax333l
789f9ec867 feat: allow bundles to use classes from other bundles (#1951) 2025-07-15 14:28:40 +02:00
Pun Butrach
b51d1ee47a fix: Transparent status on fullscreen dialog (#2654) 2025-07-14 15:35:27 +02:00
oSumAtrIX
7148ee66f8 feat: Rename strings 2025-07-10 22:29:25 +02:00
brosssh
f7a4ae5791 fix: Add missing header for "Updates" settings (#2642) 2025-07-08 21:57:56 +02:00
brosssh
cb2dbbee24 feat: Improve bundle info screen design (#2548) 2025-07-08 20:23:03 +02:00
Pun Butrach
578dcce9b6 chore: Merge branch 'dev' into compose-dev 2025-07-08 22:24:17 +07:00
brosssh
8c6c0f3c76 fix: Patch selection screen padding (#2533) 2025-07-08 17:20:44 +02:00
Pun Butrach
979a2dc410 fix: Playback Switch's Haptic Feedback (#2639)
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2025-07-08 18:11:45 +07:00
kitadai31
baa9122a88 fix: Improve background running notification (#2614) 2025-07-07 22:38:41 +02:00
brosssh
b70fc03bc7 fix: Allow different app version when downloading via plugin if setting is off (#2579)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-07-05 18:44:11 +02:00
Ax333l
81a4ebd327 fix: display version from manifest (#2634) 2025-07-04 18:58:11 +02:00
aAbed
5fc54eb53b fix: Correct preference description (#2619) 2025-07-02 13:49:59 +02:00
brosssh
88b0b8c078 feat: Set app ownership when installing apps (#2558) 2025-06-16 21:55:32 +02:00
brosssh
7959c36e71 fix: Selected patch count (#2559) 2025-06-10 16:43:50 +02:00
brosssh
e9542c6cf0 fix: CI flows (#2598) 2025-06-10 16:38:37 +02:00
brosssh
0992e63c28 feat: Add confirmation dialog to "Reset" options (#2576) 2025-06-10 16:38:05 +02:00
Ushie
83fc7f131a chore: Remove obsolete deleteLastPatchedApp call 2025-06-02 17:12:50 +03:00
oSumAtrIX
8e4a9088ea ci: Use install instead of clean install for NPM dependencies
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2025-06-02 16:05:59 +02:00
github-actions[bot]
7ee2b1a026 chore: Sync translations (#2522)
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2025-05-31 15:36:42 +07:00
Pun Butrach
40c99ab4dc ci: Set missing translation actor/email for commit
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2025-05-31 15:18:37 +07:00
Pun Butrach
1752fae9d9 chore: Better ignore rules
Based on https://github.com/github/gitignore/blob/main/Flutter.gitignore

Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2025-05-31 15:12:26 +07:00
Pun Butrach
d264a2a363 build: Support Flutter v3.32
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2025-05-31 15:11:49 +07:00
Pun Butrach
a5e909cfc8 fix: Obscure Flutter Impeller renderer bugs
This is workaround to entirely disabling Flutter Impeller in favour of Skia.

Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2025-05-31 14:57:21 +07:00
Pun Butrach
aebad0b0e2 chore: Merge branch 'dev' into compose-dev 2025-05-31 14:26:25 +07:00
kitadai31
bdb0317a9e fix: "Save patched app" attempts to copy APK when patching fails (#2565) 2025-05-31 14:22:55 +07:00
oSumAtrIX
c0d7cf7c2c ci: Upload artifacts when building pull requests 2025-05-30 15:19:50 +02:00
Brosssh
2c1ff4d2cd fix: Patch process cancelation dialog conditions (#2554) 2025-05-30 15:13:30 +02:00
Brosssh
7c5552f93f fix: Correctly display universal patches warning (#2570) 2025-05-24 14:47:27 +02:00
Brosssh
1c5373ff61 fix: Handle open source licenses page crash (#2569) 2025-05-24 14:14:03 +02:00
oSumAtrIX
e629d2df0c ci: Set build attestation subject name 2025-05-22 14:54:04 +02:00
oSumAtrIX
7ca003a30d build: Do not sign all releases with debug key 2025-05-22 14:29:43 +02:00
oSumAtrIX
70a695017e docs: Update docs with all manager features and improve consistency 2025-05-22 14:15:44 +02:00
oSumAtrIX
9b2c99da05 feat: Use simpler strings 2025-05-22 14:15:19 +02:00
oSumAtrIX
07158ae1d1 chore: Move API project from separate repo to this
Set up CI to publish the API library package as well as release the app.
2025-05-22 10:56:23 +02:00
Brosssh
2b380b0d7c fix(Compose): Adjusted universal patches safeguard and warnings (#2550) 2025-05-20 14:12:38 +02:00
Ax333l
5153e5e0cb feat(Compose): hide developer settings (#2551) 2025-05-20 14:12:37 +02:00
Ax333l
a1f5dd3c26 fix: handle edge-to-edge properly in fullscreen dialogs 2025-05-20 14:12:36 +02:00
Brosssh
2b0784865a feat(Compose): Add confirmation dialog on multiple operations (#2529) 2025-05-20 14:12:34 +02:00
Robert
d7c0913277 refactor: Rename settings screens for consistency (#2547) 2025-05-20 14:12:33 +02:00
Brosssh
18199bb968 feat(Compose): Improve patches selector tab by adding the bundle version (#2545) 2025-05-20 14:12:32 +02:00
oSumAtrIX
9d329e0f54 ci: Adjust and modernize workflow files to match other repos 2025-05-20 14:12:30 +02:00
oSumAtrIX
e9fcb4a383 docs: Adjust issue templates to match other repos 2025-05-20 14:12:29 +02:00
oSumAtrIX
68f74f1651 docs: Add contribution guidelines and adjust README 2025-05-20 14:12:27 +02:00
oSumAtrIX
6264800a05 build: Update Gradle Wrapper 2025-05-20 14:12:26 +02:00
Ax333l
658699dd81 fix: patch count remaining at zero when using process runtime (#2542) 2025-05-20 14:12:24 +02:00
Robert
222089a7ec feat: Order bundles by number of patches 2025-05-20 14:12:23 +02:00
oSumAtrIX
eff5c4860b style: Apply formatting 2025-05-20 14:12:21 +02:00
oSumAtrIX
d4e60acbaa build: Sign releases using keystore if available 2025-05-20 14:12:20 +02:00
oSumAtrIX
1ab74acf1d feat: Use "Debug" and "Debug signed" for build names respectively 2025-05-20 14:12:19 +02:00
oSumAtrIX
28aad879ba feat: Move safeguards above patcher preference group 2025-05-20 14:12:17 +02:00
Brosssh
9f44541bbd fix: Reset cached theme on theme change to avoid broken colors (#2527) 2025-05-20 14:12:15 +02:00
Brosssh
02d2153195 feat(Compose): Move developer options to top level (#2528) 2025-05-20 14:12:14 +02:00
oSumAtrIX
39e821738f build: Remove repos that are not required 2025-05-20 14:12:12 +02:00
Ushie
7863fbb604 fix: Ignore long click when already in delete mode
closes #2503
2025-05-20 14:12:11 +02:00
Ax333l
94ab6996ae feat: add network checks for features that require it 2025-05-20 14:12:10 +02:00
Ax333l
1319a03651 feat: move plugin api to another repository 2025-05-20 14:12:08 +02:00
kitadai31
f93085f782 fix: Do not poll battery optimization status (#2491) 2025-05-20 14:12:07 +02:00
Ushie
40a4317993 feat: Improve update screen design (#2487) 2025-05-20 14:12:06 +02:00
Ushie
8095a1f963 fix: Use compatible rather than support when referring to patch compatibility (#2422) 2025-05-20 14:12:04 +02:00
Ushie
90c7600586 feat: Improve APK file name formatting on save (#2421) 2025-05-20 14:12:03 +02:00
dependabot[bot]
105492bfa5 build(deps): bump the gradle-compose group with 16 updates (#2407) 2025-05-20 14:12:01 +02:00
Ushie
ce63b799e6 feat: Reorder Import & Export settings (#2403) 2025-05-20 14:12:00 +02:00
Ushie
2fe2d46c72 feat: TopAppBar scroll behavior (#2397) 2025-05-20 14:11:58 +02:00
Pun Butrach
bc3888da79 ci: Generate release artifact provenance (#2324)
Signed-off-by: validcube <pun.butrach@gmail.com>
2025-05-20 14:11:57 +02:00
Robert
52b982d81f fix: improve keystore import error handling and show toast 2025-05-20 14:11:56 +02:00
validcube
ab48672621 build: Enable pseudo locale for debug variant 2025-05-20 14:11:54 +02:00
validcube
0027c90ed3 chore: Update project's dependencies to latest 2025-05-20 14:11:53 +02:00
Robert
b6ad686a26 fix: show install button when installation has been cancelled 2025-05-20 14:11:51 +02:00
Ushie
f59d57499d feat: Screen slide transition (#2396) 2025-05-20 14:11:50 +02:00
Ushie
5f65c12ec1 fix: Offset badge 2025-05-20 14:11:49 +02:00
validcube
65e44dc5a8 build: Bump AGP to 8.8.0
build: Bump AGP to 8.8.0
2025-05-20 14:11:47 +02:00
Pun Butrach
e6ed4a88c9 docs: Merge documentation from Flutter to Compose 2025-05-20 14:11:46 +02:00
Tornike Khintibidze
390e3533c9 feat: Redesign the patches screen (#2381) 2025-05-20 14:11:44 +02:00
Ax333l
c1ff2f9924 fix: available updates dialog list item color 2025-05-20 14:11:42 +02:00
Ax333l
d084925c0f refactor: use EventEffect for legacy import 2025-05-20 14:11:41 +02:00
Ax333l
3cf540f190 feat: add required options screen (#2378) 2025-05-20 14:11:39 +02:00
aAbed
5514c75061 feat: Add confirm dialogs when toggling dangerous settings (#2072)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-05-20 14:11:37 +02:00
Ax333l
ca147cc6dc chore: add .kotlin to gitignore 2025-05-20 14:11:36 +02:00
Ax333l
3c3e995f31 fix: remove battery optimization notification if user grants the permission 2025-05-20 14:11:35 +02:00
Ax333l
67809700c7 feat: switch to androidx.navigation (#2362) 2025-05-20 14:11:33 +02:00
Ax333l
32c7eddb48 refactor: remove unnecessary function 2025-05-20 14:11:31 +02:00
Ax333l
756e3a815f fix: contributors screen repository name 2025-05-20 14:11:29 +02:00
Ax333l
f8f915563e fix: process death resilience and account for android 11 bug (#2355) 2025-05-20 14:11:27 +02:00
kitadai31
2733ce4915 fix: Screen turns off while patching due to wrong WakeLock (#2147) 2025-05-20 14:11:25 +02:00
Ax333l
04a78fabff feat: Add downloader plugin system (#2041) 2025-05-20 14:11:23 +02:00
Ax333l
94e26ba053 feat: switch to revanced api v4 2025-05-20 14:11:21 +02:00
Pun Butrach
1704947c52 chore: Nitpick on misspelling of comment 2025-05-20 14:11:20 +02:00
somni
e027f8cc9c feat: Make patch bundles list scrollable (#2322) 2025-05-20 14:11:18 +02:00
Ax333l
37e612febc chore: update dependencies
🦀 integrations are gone! 🦀
2025-05-20 14:11:17 +02:00
Ax333l
374531237f fix: only perform haptics on events 2025-05-20 14:11:15 +02:00
Benjamin
abe5a20c4a feat: Add haptic feedback (#1457)
Co-authored-by: Ushie <ushiekane@gmail.com>
2025-05-20 14:11:14 +02:00
kitadai31
0a29ff48ca fix: Match "Installation incompatible" dialog message with Flutter Manager (#2231) 2025-05-20 14:11:12 +02:00
alieRN
95cffcc0a0 feat(patcher): Improve installation (#2185) 2025-05-20 14:11:10 +02:00
oSumAtrIX
45ff64f26e feat: Add installer status dialog (#1473)
Co-authored-by: Benjamin Halko <benjaminhalko@hotmail.com>
Co-authored-by: Benjamin <73490201+BenjaminHalko@users.noreply.github.com>
Co-authored-by: Ushie <ushiekane@gmail.com>
Co-authored-by: Ax333l <main@axelen.xyz>
2025-05-20 14:11:09 +02:00
Ushie
7973b367ec feat: View bundle patches (#2065) 2025-05-20 14:11:07 +02:00
kitadai31
641f6af6da feat: Open the app-specific manage all files permission dialog (#2148) 2025-05-20 14:11:06 +02:00
Ushie
6d142e72a6 feat: Improve patch bundle screen (#2070) 2025-05-20 14:11:05 +02:00
Pun Butrach
e812f69740 feat: Improve Settings order (#2060)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
Co-authored-by: Ax333l <main@axelen.xyz>
2025-05-20 14:11:03 +02:00
Ax333l
df79e3d13a fix: remove the unique constraint for patch bundle names 2025-05-20 14:11:01 +02:00
kitadai31
207b005d56 fix: Move temporary files outside of the cache directory (#2122) 2025-05-20 14:11:00 +02:00
Ushie
4a1695a766 refactor: Add parameters for custom rotation values in ArrowButton 2025-05-20 14:10:58 +02:00
validcube
737e709287 ci: Actually enable caching of Gradle 2025-05-20 14:10:57 +02:00
aAbed
4727e8243c fix: Turn off filters by default (#2079) 2025-05-20 14:10:55 +02:00
aAbed
5e0ba77f4a fix: ExtendedFloatingActionButton not accessible by screen readers (#2080) 2025-05-20 14:10:54 +02:00
Ushie
a76a58d6ee feat: Improve unsupported patch warnings (#2066)
Closes #2052
2025-05-20 14:10:52 +02:00
Robert
4ebc33cd2a fix: show available and selected patches in patch selector screen 2025-05-20 14:10:51 +02:00
Ushie
89a1a3026e feat: Add reset button to custom API (#2076)
Closes #2051
2025-05-20 14:10:49 +02:00
Ushie
16f16e859b feat: Show manager update dialog (#2069)
Closes #1963, closes #1958
2025-05-20 14:10:48 +02:00
oSumAtrIX
83eb1a9fd7 fix: Support patching on ARMv7 by updating AAPT2 (#2084) 2025-05-20 14:10:46 +02:00
Ushie
9a336aa3ef feat: Improve update setting tile titles
Closes #1968
2025-05-20 14:10:45 +02:00
Pun Butrach
d0b8cba2bf build: Enable Gradle Configuration Cache (#2059) 2025-05-20 14:10:43 +02:00
Ax333l
7436d99532 fix: always use default patch selection if customization is disabled 2025-05-20 14:10:40 +02:00
Robert
c982babaeb fix: android icon not loading in app selector 2025-05-20 14:10:38 +02:00
Pun Butrach
211f7d2fa2 feat: Improve custom API URL dialog (#2033)
Signed-off-by: validcube <pun.butrach@gmail.com>
2025-05-20 14:10:35 +02:00
Ushie
d432ffbbe0 fix: Broken header padding in AlertDialogExtended when using an Icon 2025-05-20 14:10:34 +02:00
Ushie
500cd63507 fix: Remove unnecessary screen padding
Closes #2062
2025-05-20 14:10:33 +02:00
Ushie
9404c3c297 feat: Remove tag from changelog 2025-05-20 14:09:41 +02:00
Ushie
f2f89aa185 feat: Progressive AlertDialog for adding bundles
Closes #1992
2025-05-20 14:07:57 +02:00
Ushie
d6e931a876 fix: Use the correct icon in API URL dialog
Closes #1972
2025-05-20 14:06:10 +02:00
Ushie
260964c633 feat: Add sensitivity to isScrollingUp 2025-05-20 14:06:08 +02:00
Ushie
87addbff55 feat: Add isScrollingUp support for ScrollState 2025-05-20 14:06:05 +02:00
Ushie
5ff5298e0e fix: Use FAB instead of ListItem to patch in App Overview
Closes #1995
2025-05-20 14:06:04 +02:00
Ushie
0bb08c7afc feat: Improve device information in debugging section
Closes #1977
2025-05-20 14:06:01 +02:00
Ushie
a0e67a42e0 fix: Change the title in the Update screen from "Updates" to "Update"
Closes #1960
2025-05-20 14:05:59 +02:00
Ushie
585d54a8a8 feat: Change "Update" to "Show" in Update Available notification
Closes #1959
2025-05-20 14:05:57 +02:00
Ushie
abdae89434 feat: Highlight links in Markdown
Closes #1962
2025-05-20 14:05:54 +02:00
Ushie
c7c4da54fb feat: Improve initial update popup wording
Closes #1956
2025-05-20 14:05:53 +02:00
Ushie
2dacfce61d chore: Remove unused ARMv7 AAPT binary
Closes #1954
2025-05-20 14:05:52 +02:00
Ushie
f8da11e684 refactor: Improve naming consistency in libs.version.toml
Closes #1953
2025-05-20 14:05:50 +02:00
validcube
f384c66dd6 fix: Inconsistent padding for battery optimisation warning
The problem came after moving the card to DashboardScreen, this is because the card specified padding modifier but others does not. This commit remove the modifier completely.
2025-05-20 14:05:03 +02:00
validcube
1a9031193c refactor: Use TextButton instead of FilledButton for consistency 2025-05-20 14:05:02 +02:00
Pun Butrach
dc743021c3 ci: Bump dependencies to latest (#2039) 2025-05-20 14:05:00 +02:00
Ax333l
a81913c2f7 chore: update dependencies 2025-05-20 14:04:58 +02:00
Ax333l
494197b5dd fix: move battery warning to dashboard 2025-05-20 14:04:57 +02:00
Ax333l
285c55228d feat: improve the safeguards (#2038) 2025-05-20 14:04:54 +02:00
Ax333l
aedc6e9970 fix: run props flow on correct dispatcher (#2035) 2025-05-20 14:04:51 +02:00
Pun Butrach
3ed2c87f45 feat: Automatic language detection (#2032) 2025-05-20 14:04:49 +02:00
Ax333l
d5b22258a6 fix: improve bundle page strings 2025-05-20 14:04:46 +02:00
Ax333l
e6361118a7 fix: cleanup advanced settings screen 2025-05-20 14:04:45 +02:00
Ax333l
edf2f28eca feat: dont ask for root on launch 2025-05-20 14:04:44 +02:00
Ax333l
b5abe1bbc3 feat: improve UX for failed or missing bundles 2025-05-20 14:04:41 +02:00
Ax333l
8654da0dfe feat: implement more patch option types (#2015) 2025-05-20 14:04:39 +02:00
Ax333l
c48698334c fix: crash when removing used bundles 2025-05-20 14:04:36 +02:00
Ax333l
f53299b2a6 fix: import export screen UX 2025-05-20 14:04:34 +02:00
Ax333l
8c1b8e1ee1 feat: add ability to share debug logs 2025-05-20 14:04:32 +02:00
Ax333l
500e0ad9b7 fix: import bundles on another thread 2025-05-20 14:04:30 +02:00
Ax333l
0d6ee98609 feat: get bundle information from jar manifest (#2027) 2025-05-20 14:04:29 +02:00
Ax333l
231cf52f30 fix: add bounds checks in patch selector 2025-05-20 14:04:28 +02:00
Robert
994cb6c4b0 feat: rename main bundle to Default 2025-05-20 14:04:26 +02:00
Robert
7365fc241a fix: use proper update icon 2025-05-20 14:04:24 +02:00
Robert
e2f02ebf22 feat: improve patcher screen labels 2025-05-20 14:04:21 +02:00
Robert
5150adeaff fix: scrolling in patch selector 2025-05-20 14:04:19 +02:00
Robert
92612f9aec feat: rename debug build to ReVanced Manager (dev) 2025-05-20 14:04:17 +02:00
Robert
44b5f7b3bc fix(downloader): versions not loading correctly 2025-05-20 14:04:15 +02:00
Robert
46bd2f48a8 fix: automatically focus search views 2025-05-20 14:04:13 +02:00
Robert
3ac2062992 feat: move update to notification card (#1917) 2025-05-20 14:04:11 +02:00
Robert
95be465b39 feat: revert to blue theme colors 2025-05-20 14:04:09 +02:00
Ax333l
226d9c9c23 refactor: fix more warnings 2025-05-20 14:04:06 +02:00
Ax333l
dabf16a436 build(deps): update ksp 2025-05-20 14:04:04 +02:00
Ax333l
ff0bf43c7d refactor: replace deprecated functions 2025-05-20 14:04:02 +02:00
Ax333l
016de8bb0d fix: crash caused by compose inlining bug
This is a bug in jetpack compose. Inlining this function wasn't very
important anyways so it's best to just stop inlining it to avoid the
crash.
2025-05-20 14:04:00 +02:00
dependabot[bot]
b6c02b7be1 build(deps): bump aboutLibrariesGradlePlugin from 11.1.0 to 11.1.1 (#1813)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 14:03:58 +02:00
dependabot[bot]
9e7b26b1c8 build(deps): bump androidx.compose.ui:ui-tooling from 1.6.3 to 1.6.4 (#1814)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 14:03:56 +02:00
dependabot[bot]
05eb0d7457 build(deps): bump androidx.compose:compose-bom from 2024.02.02 to 2024.03.00 (#1812)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 14:03:55 +02:00
dependabot[bot]
4b0706f8b0 build(deps): bump libsu from 5.2.1 to 5.2.2 (#1810)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 14:03:52 +02:00
dependabot[bot]
9c6f0c324b build(deps): bump plugin.serialization from 1.9.22 to 1.9.23 (#1811)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 14:03:48 +02:00
Ax333l
c98ca70e08 fix: correctly patch apk files 2025-05-20 14:03:46 +02:00
Ax333l
424fe25dfb feat: add external process runtime (#1799) 2025-05-20 14:03:44 +02:00
Ax333l
666deda0b5 feat: check if the version being used is the recommended version (#1675) 2025-05-20 14:03:42 +02:00
Benjamin
5e4510eed5 feat: add social links (#1294)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
Co-authored-by: Ax333l <main@axelen.xyz>
2025-05-20 14:03:39 +02:00
Benjamin
a9147ed0c0 chore: Upgrade dependencies (#1761)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 14:03:37 +02:00
Benjamin
bd7c4aa554 chore: upgrade dependencies (#1670) 2025-05-20 14:03:36 +02:00
Ax333l
9d0f3a3605 fix(VersionSelector): use correct LazyColumn item key 2025-05-20 14:03:33 +02:00
Benjamin
093a4ebf49 refactor: Disable update for dev build (#1673)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2025-05-20 14:03:31 +02:00
Ushie
17cc9f9e9e feat: Collapse ExtendedFAB on scroll (#1630) 2025-05-20 14:03:29 +02:00
Ax333l
bd85b254e4 feat: add toast feedback to the bundle update button 2025-05-20 14:03:26 +02:00
Ax333l
1460fd7be2 fix: patch options reset button being broken 2025-05-20 14:03:24 +02:00
Ax333l
bc3fe3f0f2 refactor: use consistent wording for the version compat check 2025-05-20 14:03:21 +02:00
Pun Butrach
bdc0fc89c3 docs(security): init (#1612)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-05-20 14:03:20 +02:00
Ax333l
aeefe644c2 refactor: fix terminology and wording related to patches (#1623) 2025-05-20 14:03:17 +02:00
Ushie
48604804f9 feat: Scrollbars (#1479) 2025-05-20 14:03:14 +02:00
Robert
03ccea46e2 fix: progress bar not updating 2025-05-20 14:03:13 +02:00
Robert
b4bc14e4ed feat: improve patcher UI (#1494) 2025-05-20 14:03:09 +02:00
Ax333l
6dcbe271a7 feat: updater UI and code improvements (#1597) 2025-05-20 14:03:07 +02:00
Ushie
3317fd5649 feat: Select bundle type before adding bundle (#1490) 2025-05-20 14:03:05 +02:00
Benjamin
c9eb3ffa14 feat: Purple default theme (#1601) 2025-05-20 14:03:02 +02:00
Benjamin
fe1e65ce9c chore: upgrade AGP to 8.2.0 + migrate deprecated functions (#1574) 2025-05-20 14:03:00 +02:00
Ax333l
f7426309b4 chore(deps): update jetpack compose 2025-05-20 14:02:58 +02:00
aAbed
7f67a86413 feat(app-selector): show patchable installed apps first (#1496) 2025-05-20 14:02:56 +02:00
validcube
a22ef4d9b8 docs: update revanced url 2025-05-20 14:02:54 +02:00
validcube
ada99e80f9 build: bump Gradle to v8.5
build: update Gradle wrapper
2025-05-20 14:02:51 +02:00
validcube
111d8b6543 refactor: slight formatting of build.gradle.kts 2025-05-20 14:02:50 +02:00
validcube
15599dbb21 chore(template): update label name for feature 2025-05-20 14:02:49 +02:00
validcube
24cd2dca75 ci: caching with gradle-build-action
Allow for automatic capture of buildscan in job summary, and smarter
caching than the one provided by `setup-java`.
2025-05-20 14:02:46 +02:00
Ax333l
c48f5b2488 chore(deps): bump revanced patcher and library 2025-05-20 14:02:44 +02:00
Benjamin
06d4485032 fix: specify multithreadingDexFileWriter in PatcherOptions (#1402)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-05-20 14:02:43 +02:00
Ax333l
73fdf92780 fix: load patch bundles earlier 2025-05-20 14:02:42 +02:00
Ushie
0fda344952 feat(Update Screen): changelogs & handle states (#1464)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-05-20 14:02:38 +02:00
Ushie
9c0665acb2 feat(Contributors Screen): implement design from Figma (#1465)
Co-authored-by: Robert <72943079+CnC-Robert@users.noreply.github.com>
Co-authored-by: Ax333l <main@axelen.xyz>
2025-05-20 14:02:36 +02:00
Ax333l
6bafa23bb4 fix: parcel error for nullable types 2025-05-20 14:02:34 +02:00
oSumAtrIX
8387ada245 feat: Use correct casing in module description 2025-05-20 14:02:32 +02:00
Ax333l
048ba12703 chore: bump patcher 2025-05-20 14:02:31 +02:00
Robert
1b6a77a463 feat: check for updates on startup (#1462) 2025-05-20 14:02:29 +02:00
Ushie
ff9d021a2b feat(Changelogs): overall improvement (#1429) 2025-05-20 14:02:26 +02:00
Ushie
6ac4819478 feat(Installer): use BottomAppBar (#1428) 2025-05-20 14:02:25 +02:00
Benjamin
4b5e2e97f7 fix: option state crash (#1456)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-05-20 14:02:21 +02:00
Ax333l
7a4b0bd7c8 refactor(ui-components): deduplicate colors and move to settings folder 2025-05-20 14:02:18 +02:00
Ushie
205650865a feat(NotificationCard): rewrite & consistent usage (#1426) 2025-05-20 14:02:17 +02:00
Ushie
39ff42db01 feat(Settings): use SettingsListItem consistently and overall improvements (#1427) 2025-05-20 14:02:13 +02:00
Ax333l
62f5acee1a feat: remember patch options (#1449) 2025-05-20 14:02:11 +02:00
Benjamin
67ecc13a28 chore: add issue template (#1432) 2025-05-20 14:02:09 +02:00
Ax333l
ad10a19acd feat(installer): sign apk in patcher worker 2025-05-20 14:02:07 +02:00
Ax333l
a35c62a99d fix: use correct checksum 2025-05-20 14:02:05 +02:00
Benjamin
8450243ddc chore: upgrade dependencies (#1401) 2025-05-20 14:02:03 +02:00
Ax333l
d239efcf14 fix: perform selected app operations in the correct order 2025-05-20 14:02:01 +02:00
Ax333l
691b615b02 feat(bundles tab): add BackHandler 2025-05-20 14:01:59 +02:00
Ax333l
3f34407741 docs: clarify license 2025-05-20 14:01:57 +02:00
Ax333l
da4153039c feat: show toast when no patches are selected 2025-05-20 14:01:54 +02:00
Ax333l
1de59f420b feat: add checkboxes to the downloaded apps page 2025-05-20 14:01:51 +02:00
Ax333l
464aa753f4 fix: more android 34 fixes 2025-05-20 14:01:48 +02:00
Ax333l
0cf49998e0 fix: handle exceptions when checking for bundle updates 2025-05-20 14:01:47 +02:00
Ax333l
991a8cb5d1 feat(patch-selector): remove TODO about an unplanned feature 2025-05-20 14:01:45 +02:00
Ax333l
ac75d1da27 fix: bundles not loading on Android 14 2025-05-20 14:01:42 +02:00
Ax333l
5907659cc8 fix: jvm signature clash error 2025-05-20 14:01:40 +02:00
Ax333l
d8d2478d0f fix: use upsert when modifying installed apps 2025-05-20 14:01:38 +02:00
Ax333l
4ad3c3fb72 feat: selected app info page (#1395) 2025-05-20 14:01:35 +02:00
Ax333l
0e00b9f526 refactor: move mount code to when block 2025-05-20 14:01:32 +02:00
Benjamin
88f3701a6c fix: hide patch button (#1284) 2025-05-20 14:01:31 +02:00
Benjamin
a15924617e feat: add user agent (#1382) 2025-05-20 14:01:30 +02:00
Ax333l
db04672d72 chore: bump patcher 2025-05-20 14:01:27 +02:00
Ax333l
977345e5aa chore: bump compose 2025-05-20 14:01:25 +02:00
Ax333l
76e5731eb8 fix: broken logo in about page on release builds 2025-05-20 14:01:23 +02:00
Ax333l
99bfd84e03 feat: hide unfinished pages in release mode 2025-05-20 14:01:20 +02:00
Ax333l
edb387e1a8 feat: armv7 warning 2025-05-20 14:01:18 +02:00
Ax333l
80ff6711f4 refactor(downloaders): improve file system code (#1379) 2025-05-20 14:01:16 +02:00
Benjamin
cadbb3f46d feat: settings migration (compose) (#1309) 2025-05-20 14:01:15 +02:00
Ax333l
e1742fd4c0 feat: add patches selector bottom sheet (#1360) 2025-05-20 14:01:14 +02:00
Ax333l
c2c4895a29 feat: use revanced api for changelogs 2025-05-20 14:01:11 +02:00
Ax333l
ffe5c058e0 fix: delete temporary files (#1341) 2025-05-20 14:01:08 +02:00
Ax333l
59ddd9f393 fix: use correct classes to determine option type
I can't believe this happened
2025-05-20 14:01:06 +02:00
Ax333l
57ba3ad374 feat(settings): move experimental patches option to advanced 2025-05-20 14:01:05 +02:00
Ax333l
6fed17705b feat(installer): adjust arrow icon size 2025-05-20 14:01:03 +02:00
Ax333l
f915b544c4 feat(installer): adjust step icon size and alignment 2025-05-20 14:01:02 +02:00
Ax333l
11a383a13a chore: switch to revanced library and bump patcher (#1314) 2025-05-20 14:01:01 +02:00
Ax333l
4b178d947c feat(patch-selector): default patches selection (#1272) 2025-05-20 14:00:58 +02:00
Ax333l
f2e7661b5c feat: remove dead help icons
These never did anything and were removed from the figma a while ago.
2025-05-20 14:00:57 +02:00
Ax333l
e33862f436 chore: fully remove idea project files 2025-05-20 14:00:55 +02:00
Benjamin Halko
51dc429330 fix: remove misc.xml and kotlinc.xml 2025-05-20 14:00:53 +02:00
Benjamin
5a41cc1162 docs: init (#1224) 2025-05-20 14:00:32 +02:00
Benjamin
28ab79d962 ci: Add release workflow (#1235) 2025-05-20 14:00:30 +02:00
Benjamin
8f2c18585f fix: Updates popup shows incorrect names (#1283) 2025-05-20 14:00:29 +02:00
Benjamin
2f533d12b9 fix: use ReVanced ring logo in about section (#1302) 2025-05-20 14:00:27 +02:00
Benjamin
44cec48a7f feat: implement Submit Issue button (#1276) 2025-05-20 14:00:25 +02:00
Benjamin
395da595a2 refactor: update progress onBackClick function (#1277) 2025-05-20 14:00:23 +02:00
Benjamin
18ea6adb20 fix: disable WebView history (#1278) 2025-05-20 14:00:21 +02:00
Benjamin
daeb534692 fix(ui): make entire patches view button selectable (#1271) 2025-05-20 14:00:19 +02:00
Benjamin Halko
0b2ddbe0bf feat: change appID and name of debug builds 2025-05-20 14:00:17 +02:00
Benjamin Halko
3c3ff64b18 ci: build pull requests (#1228) 2025-05-20 14:00:15 +02:00
Benjamin
43befa8713 fix: typo in string name import_keystore_description (#1273) 2025-05-20 14:00:13 +02:00
Benjamin
3c820405a8 fix: contributors screen fix (#1256) 2025-05-20 14:00:10 +02:00
Patryk Miś
d65e830467 chore: update dependencies (#1247) 2025-05-20 14:00:08 +02:00
Robert
154b23202c feat: root installation (#1243) 2025-05-20 14:00:05 +02:00
Benjamin
91e0d48721 fix: minify crash on building release (#1245) 2025-05-20 14:00:02 +02:00
Benjamin
ae5eef0f2c fix: providers.gradleProperty (#1223) 2025-05-20 14:00:01 +02:00
Tyff
382c068a03 feat: make bundles selectable (#1237) 2025-05-20 13:59:58 +02:00
Pun Butrach
cfaf874326 ci(config): appreciation for first-time contributors
Show appreciation message for new contributors
2025-05-20 13:59:55 +02:00
Benjamin
97d25b5602 docs: update readme badges (#1227) 2025-05-20 13:59:54 +02:00
Pun Butrach
cde470f867 ci(release): don't build when not necessary
Add paths-ignore to all markdown files, and .idea folder
2025-05-20 13:59:52 +02:00
Pun Butrach
1ad3e3423c docs: update badge's repository
The repository was moved from `revanced-manager-compose` to the main one, which is `revanced-manager`.

The organisation's name has also switched to `ReVanced` (used to be `revanced`).
2025-05-20 13:59:50 +02:00
Ax333l
d62f0a96fb chore: bump kotlinx.serialization plugin and patcher 2025-05-20 13:59:47 +02:00
Patryk Miś
d4ee3334e0 build: updates (#85) 2025-05-20 13:59:44 +02:00
Ax333l
384fb19ddf fix(deps): use correct work-runtime version string 2025-05-20 13:59:42 +02:00
Tyff
ab04ef99c3 feat: more info for the select from application screen (#81) 2025-05-20 13:59:41 +02:00
Pun Butrach
c812ce2011 ci(release): migrate from node12 to node16
This bump `actions/upload-artifact`@v2 to `actions/upload-artifact`@v3
2025-05-20 13:59:39 +02:00
Robert
fa8f154d65 feat: store patched apps (#79)
* feat: store patched apps

* fix: missing string

* feat: save patch selection

* feat: things

* fix: fix broken query

* fix: remove redundant `withContext`

* fix: fix
2025-05-20 13:59:36 +02:00
Palm
af03eec4b5 ci(release): use correct vars context object
why am i so stupid
2025-05-20 13:59:33 +02:00
Palm
da66b43497 ci(release): no longer store keystore alias in secrets
fixes an issue where GitHub Actions logs would be censored
2025-05-20 13:59:32 +02:00
Ax333l
e302ea9f9e fix: patches not being reloaded 2025-05-20 13:59:30 +02:00
Ax333l
6aa3b6c4b0 fix: permission error when using installed app 2025-05-20 13:59:27 +02:00
Ax333l
5cb887ebe6 feat: patch options UI (#80) 2025-05-20 13:59:25 +02:00
Ax333l
4cd00c122d feat: switch to the new api (#75) 2025-05-20 13:59:22 +02:00
Ax333l
5744bdda80 chore: bump patcher 2025-05-20 13:59:20 +02:00
Ax333l
89e373f98c feat: improve bundle dialog UI 2025-05-20 13:59:19 +02:00
Ax333l
ecd4b01108 feat: finish implementing the sources system (#70) 2025-05-20 13:59:15 +02:00
Ax333l
08686252bb fix: library info not being embedded 2025-05-20 13:59:13 +02:00
Pun Butrach
ab1dd8862d ci(release): task naming consistency 2025-05-20 13:59:11 +02:00
CnC-Robert
c4abf8a324 fix: don't store app list in parcel 2025-05-20 13:59:09 +02:00
Ax333l
05adb78932 fix(installer): progress tracking 2025-05-20 13:59:07 +02:00
Robert
3ae1d3374a ci: init 2025-05-20 13:59:06 +02:00
CnC-Robert
067f8adf4b feat: show installed app in version selector 2025-05-20 13:59:05 +02:00
Robert
83f6d287b3 feat: download apps in patcher screen (#73) 2025-05-20 13:59:01 +02:00
Pun
3dde82fc18 docs(readme): minor fix to displaying url
When you hover on Commit & Activity badges, `revanced` will appear in url display, but on License badge, `ReVanced` will display

This commit fix that by changing the organisation to what we're supposed to be using which is {org_name}/{repo_name} (ReVanced/...)
2025-05-20 13:58:59 +02:00
Tyff
de0af4c489 feat: add patch bundle info screen (#55) 2025-05-20 13:58:56 +02:00
Ax333l
f98386dcc8 fix: serialization not working 2025-05-20 13:58:54 +02:00
Patryk Miś
49209ca562 fix: buildfile syntax (#66)
Signed-off-by: Patryk Miś <foss@patrykmis.com>
2025-05-20 13:58:53 +02:00
Patryk Miś
d68e7f71e9 build: updates (#63)
* Update Java base to 17
* update Kotlin to 1.8.22
* update Bouncycastle
* update all dependencies
* follow the manifest on jni libs packaging
* enhance app optimization by specifying resource configurations, excluding dependencies info and unnessesary files
* Remove obsolete SDK check as we are already using minSdk 26

Signed-off-by: Patryk Miś <foss@patrykmis.com>
2025-05-20 13:58:49 +02:00
Patryk Miś
fffdb314a1 feat: improve accessibility (#64)
* Label Back button
* Mark group section headings as headings

Signed-off-by: Patryk Miś <foss@patrykmis.com>
2025-05-20 13:58:47 +02:00
Ax333l
ee41e315fb feat: switch to Preferences DataStore (#60) 2025-05-20 13:58:45 +02:00
CnC-Robert
cd3d654318 feat: disable filter chips when there are no patches 2025-05-20 13:58:43 +02:00
CnC-Robert
3bd1ef3de7 feat: ReVanced theme colors 2025-05-20 13:58:41 +02:00
Ax333l
ba1a152231 fix: release builds not working properly 2025-05-20 13:58:40 +02:00
Rom Reviewer
55573eb94f chore: migrate dependencies to version catalogs (#58) 2025-05-20 13:58:38 +02:00
Robert
80e78f544b feat: app downloader (#43) 2025-05-20 13:58:35 +02:00
Pun Butrach
7572944c9e build: update gradle to v8.2.1 2025-05-20 13:58:34 +02:00
Pun
f5e9826dfb docs(readme): minor changes to how badges works
* Better description for the repository license badge

* Clicking on badges open you the relevant url
2025-05-20 13:58:32 +02:00
Ax333l
c8ac94d82d feat: improve keystore UI and UX (#52) 2025-05-20 13:58:29 +02:00
Pun Butrach
d9ff833100 revert: downgrade Kotlin to 1.8.21
"A what? 1.8.22 isn't compatible, but the version bump indicate that it's supposed to be bug fixes????"
2025-05-20 13:58:27 +02:00
Ax333l
7150fb4435 feat: advanced settings page with device info (#51) 2025-05-20 13:58:25 +02:00
Pun Butrach
34c331f39b build: update dependencies
There are 9 dependencies update, changelog of this commit are available
below here.

Android Gradle Plugin: 8.0.1 -> 8.0.2
Kotlin: 1.8.21 -> 1.8.22
Android Compose BOM: 2023.05.01 -> 2023.06.01
Room: 2.5.1 -> 2.5.2
ReVanced Patcher: 11.0.1 -> 11.0.4
APKsig: 8.2.0-alpha05 -> 8.2.0-alpha10
Koin (Android, workmanager): 3.4.0 -> 3.4.2
Koin (Androidx Compose): 3.4.4 -> 3.4.5
Ktor: 2.3.0 -> 2.3.1
2025-05-20 13:58:24 +02:00
Ax333l
1ff76cf584 fix(installer): sign and install on threads
This is needed to avoid ANRs because it takes a while if the Apk is 100+
MB.
2025-05-20 13:58:23 +02:00
Ax333l
1de0e87983 feat: updater changelogs (#48)
---------

Co-authored-by: Aunali321 <aunvakil.aa@gmail.com>
2025-05-20 13:58:20 +02:00
Ax333l
93b2dd6176 feat: allow user to save logs 2025-05-20 13:58:18 +02:00
Ax333l
f3e2435fef feat: save patch options and selected patches in bundle (#50) 2025-05-20 13:58:17 +02:00
Ax333l
b42d8842d5 feat: patch options (#45) 2025-05-20 13:58:15 +02:00
Ax333l
c052a0c0f5 refactor: use getDir instead of filesDir directly 2025-05-20 13:58:13 +02:00
Ax333l
34cf91d4b6 fix: use correct directory 2025-05-20 13:58:10 +02:00
Ax333l
f99504d3e4 build: bump patcher 2025-05-20 13:58:08 +02:00
Pun Butrach
3ec1df9650 build: update gradle to v8.2 2025-05-20 13:58:05 +02:00
Ax333l
871a34df23 feat: licenses screen (#47) 2025-05-20 13:58:03 +02:00
Ax333l
b65ec4560f chore: update links in about page 2025-05-20 13:58:01 +02:00
Ax333l
0eaeb5d5ea feat: animate the arrow button 2025-05-20 13:57:59 +02:00
Ax333l
060f39fb9b refactor: use correct coroutine scopes 2025-05-20 13:57:57 +02:00
Ax333l
722dfadb3c fix(installer): save step incorrectly being marked as completed 2025-05-20 13:57:56 +02:00
Ax333l
6567be40cb fix: sources screen being misaligned during transitions 2025-05-20 13:57:54 +02:00
Tyff
9539d23c12 feat: contributors screen (#42)
* Contributors page
- https://github.com/revanced/revanced-manager-compose/issues/34

* feat: adding ContributorScreen as clickable icons like the website

* feat: adding ContributorScreen
- Made changes that were asked for in prev PR
- Currently just waiting on a git merge to get ArrowButton in

* feat: adding ContributorScreen
- Made changes that were asked for in prev PR
- ArrowButton is also in use

* feat: adding ContributorScreen
- Made changes that were asked for in prev PR
- ArrowButton is also in use
- Fixed other PR comment changes

* Apply suggestions from code review

* Remove unused string resources

---------

Co-authored-by: Ax333l <main@axelen.xyz>
2025-05-20 13:57:51 +02:00
Ax333l
d0d0a17a55 fix: pass worker inputs without serialization (#44)
Because androidx.work.Data sucks and causes our app to crash.
2025-05-20 13:57:50 +02:00
Ax333l
d2e965f056 fix(installer): make the correct column scrollable 2025-05-20 13:57:49 +02:00
Ax333l
cda0e127d9 feat: experimental patches setting 2025-05-20 13:57:45 +02:00
Ax333l
fea11dfef6 feat: save patch selection using room db (#38) 2025-05-20 13:57:43 +02:00
Ax333l
dcc4477e3e refactor: better PatchBundle docs and naming 2025-05-20 13:57:40 +02:00
Ax333l
6eb21e1fab build: bump patcher 2025-05-20 13:57:38 +02:00
Ax333l
b8902d04d7 feat: show stacktrace in installer ui (#36) 2025-05-20 13:57:36 +02:00
CnC-Robert
99efdb130f feat: filter options for patches 2025-05-20 13:57:34 +02:00
Ax333l
5177cd3083 fix: run blocking IO operations in the correct context 2025-05-20 13:57:32 +02:00
Ax333l
ff4b9ab960 fix(patcher): add notification and wakelock to worker; chore: add app icon 2025-05-20 13:57:30 +02:00
Ax333l
ad998ac22d feat: keystore import/export (#30) 2025-05-20 13:57:27 +02:00
Ax333l
881d2430c3 fix(installer): properly track worker state (#32) 2025-05-20 13:57:25 +02:00
Ax333l
b07ae90c86 feat(koin): use the android logger 2025-05-20 13:57:23 +02:00
CnC-Robert
8e6519cfb0 feat: ProGuard 2025-05-20 13:57:22 +02:00
CnC-Robert
bb90cc6e81 feat: rename package to app.revanced.manager 2025-05-20 13:57:18 +02:00
CnC-Robert
fd02e0799c feat: improved compose stability 2025-05-20 13:57:17 +02:00
CnC-Robert
f07204460c fix: use correct getViewModel 2025-05-20 13:57:15 +02:00
CnC-Robert
66be0f96e0 feat: rename ViewModels for consistency 2025-05-20 13:57:13 +02:00
CnC-Robert
a1ca19b289 feat: hide tabs when 1 bundle is used 2025-05-20 13:57:09 +02:00
Robert
af779153d5 refactor: PackageManager (#31)
* refactor: refactor `PM`

* feat: use plurals for patch count

* fix: support apk's from storage

* feat: use ViewModel for loading apps and bundles

* fix: fix file selector that has no reason to be broken

* refactor: rename parameter

* refactor: `MainViewModel`

* feat: make all apps use `path`

* build: target java 11
2025-05-20 13:57:05 +02:00
Ax333l
78966e13c4 refactor(logs): use consistent tag 2025-05-20 13:57:03 +02:00
Ax333l
8bdcf76832 refactor(di): use constructor DSL for VMs
Instead of doing it manually with viewModel { }
2025-05-20 13:57:00 +02:00
Ax333l
05ecbde6c2 chore(deps): bump revanced-patcher to 9.0.0 2025-05-20 13:56:57 +02:00
Ax333l
e558a47204 feat: better installer ui (#29)
based cossale

Co-authored-by: Aunali321 <aunvakil.aa@gmail.com>
2025-05-20 13:56:56 +02:00
Ax333l
61de7568cb feat: patch bundle sources system (#24) 2025-05-20 13:56:51 +02:00
Aunali321
2e7f8457d3 feat: in-app updater (#25) 2025-05-20 13:56:47 +02:00
Aunali321
332bad699d feat(settings screen): add battery optimization notification 2025-05-20 13:56:43 +02:00
Aunali321
0b5ab33b3e feat(update screen): complete main update screen 2025-05-20 13:56:40 +02:00
Aunali321
5b4242d28b feat(about screen): complete about screen 2025-05-20 13:56:38 +02:00
Aunali321
0c76ed3af0 feat(settings screen): match typography from figma 2025-05-20 13:56:36 +02:00
Aunali321
39d698e545 refactor(settings screen): clean code up a bit 2025-05-20 13:56:34 +02:00
Ax333l
18e91e7cbc fix: dont crash when the bundle cannot be downloaded 2025-05-20 13:56:32 +02:00
Ax333l
14dfe07795 feat(installer): apk signing and installation 2025-05-20 13:56:30 +02:00
Ax333l
8e011a5d6b fix(patches selector): copy the selected patches list 2025-05-20 13:56:28 +02:00
Ax333l
fc5f97e54b refactor(ui): move PatchItem to the only file where it is used 2025-05-20 13:56:27 +02:00
Ax333l
78728c1f2a refactor(net apis): remove unnecessary interfaces
Having interfaces like that is only really useful if you have unit
tests, which we don't.

Other similar compose projects don't make interfaces either.
Not having them is more readable.
2025-05-20 13:56:25 +02:00
Ax333l
90c95c0669 style: run formatter 2025-05-20 13:56:23 +02:00
Patryk Miś
fbd1e221da build: updates (#23) 2025-05-20 13:56:21 +02:00
Ax333l
c35c776ce2 feat: integrate revanced patcher (#22) 2025-05-20 13:56:18 +02:00
CnC-Robert
f275f57c11 feat: improved dashboard screen 2025-05-20 13:56:15 +02:00
CnC-Robert
520b86df0a feat: patches selector screen 2025-05-20 13:56:13 +02:00
CnC-Robert
8991827ac7 feat: settings screen 2025-05-20 13:56:11 +02:00
Patryk Miś
0871180dcc build: updates (#21)
* perf: obsolete sdk check

Signed-off-by: Patryk Mis <foss@patrykmis.com>

* chore: bump dependencies

Signed-off-by: Patryk Mis <foss@patrykmis.com>

---------

Signed-off-by: Patryk Mis <foss@patrykmis.com>
2025-05-20 13:56:08 +02:00
CnC-Robert
7103bd2ec1 feat: app selector screen 2025-05-20 13:56:06 +02:00
Aunali321
e5029c7d2c feat: Dashboard Screen (#18)
* feat: add Dashboard Screen and Sources Screen

* fix: fix tab onClick not working

* refactor: remove AppBar

---------

Co-authored-by: CnC-Robert <CnC.Rob3rt@gmail.com>
2025-05-20 13:56:05 +02:00
Ax333l
a512af50b5 fix: gradlew permissions on unix 2025-05-20 13:54:32 +02:00
Patryk Miś
cc59d60dfd build: dependency and syntax updates (#17)
* build: Update Gradle to v8.1.1

* build: Bump dependencies

* build: move repo configurations to settings

---------

Co-authored-by: Patryk Mis <24607131+PatrickMis@users.noreply.github.com>
2025-05-20 13:54:31 +02:00
CnC-Robert
4d894e908e feat: backend 2025-05-20 13:54:29 +02:00
Alexandre Teles
77b499ef29 Create README.md 2025-05-20 13:54:27 +02:00
Canny
0142b85ede feat: splash screen 2025-05-20 13:54:25 +02:00
Canny
d9633906f5 feat: implement navigation 2025-05-20 13:54:22 +02:00
Canny
3dd14fd34b feat: implement DI 2025-05-20 13:54:21 +02:00
oSumAtrIX
0b19a9865d chore: Migrate to compose-dev branch 2025-05-20 13:49:36 +02:00
LisoUseInAIKyrios
b0464408f1 ci: Run Crowdin Cron task on dev branch (#2543) 2025-05-12 14:51:42 +02:00
semantic-release-bot
767fa77436 chore(release): 1.25.0-dev.1 [skip ci]
# [1.25.0-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.24.1-dev.5...v1.25.0-dev.1) (2025-05-05)

### Bug Fixes

* Fix installation being cancelled at installation by not prematurely deleting patched APK  ([#2490](https://github.com/ReVanced/revanced-manager/issues/2490)) ([dedcb3c](dedcb3c51a))
* Use device locale for app language (Default to English) ([#2488](https://github.com/ReVanced/revanced-manager/issues/2488)) ([3074766](3074766ff2))

### Features

* Add toggle to use pre-releases ([#2485](https://github.com/ReVanced/revanced-manager/issues/2485)) ([89b48ce](89b48cebcf))
2025-05-05 14:15:17 +00:00
aAbed
89b48cebcf feat: Add toggle to use pre-releases (#2485)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2025-05-05 16:00:41 +02:00
kitadai31
dedcb3c51a fix: Fix installation being cancelled at installation by not prematurely deleting patched APK (#2490) 2025-05-05 15:56:28 +02:00
aAbed
3074766ff2 fix: Use device locale for app language (Default to English) (#2488) 2025-05-05 15:54:42 +02:00
semantic-release-bot
722f2b645f chore(release): 1.24.1-dev.5 [skip ci]
## [1.24.1-dev.5](https://github.com/ReVanced/revanced-manager/compare/v1.24.1-dev.4...v1.24.1-dev.5) (2025-04-17)

### Bug Fixes

* Use device locale when no preference is set ([#2483](https://github.com/ReVanced/revanced-manager/issues/2483)) ([f79aa9e](f79aa9edd7))
2025-04-17 13:17:52 +00:00
Chase Hays
f79aa9edd7 fix: Use device locale when no preference is set (#2483) 2025-04-17 20:06:57 +07:00
Pun Butrach
5127c7f599 ci: Cache Gradle on PR build 2025-04-16 02:12:11 +07:00
Pun Butrach
23dcbbecb2 ci: Avoid repository push access token 2025-04-14 19:08:01 +07:00
ReVanced Bot
1c84265dc4 chore: Sync translations (#2384)
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2025-04-14 18:53:36 +07:00
Pun Butrach
7ccc689bd3 chore: Modify language assets to match Nuke 2025-04-14 17:50:42 +07:00
Pun Butrach
007dce800e build: Nuke script now able to remove empty JSON/File 2025-04-14 17:50:15 +07:00
Pun Butrach
ba758f3d8b ci: Flutter caching for build PR 2025-04-14 17:20:20 +07:00
Pun Butrach
a1f9a2786f chore: Miscellaneous code clean-up 2025-04-14 17:17:51 +07:00
Pun Butrach
b11a720621 chore: Remove x86 libaapt2.so binary (#2480) 2025-04-14 17:16:22 +07:00
Pun Butrach
aedf475310 ci: Use correct directory for Gradle cache 2025-04-14 15:51:28 +07:00
semantic-release-bot
10f35eb727 chore(release): 1.24.1-dev.4 [skip ci]
## [1.24.1-dev.4](https://github.com/ReVanced/revanced-manager/compare/v1.24.1-dev.3...v1.24.1-dev.4) (2025-04-13)

### Bug Fixes

* Log errors and warnings when compiling resources ([5c7d52c](5c7d52c8e9))
2025-04-13 15:48:47 +00:00
oSumAtrIX
5c7d52c8e9 fix: Log errors and warnings when compiling resources 2025-04-13 17:38:20 +02:00
Pun Butrach
841d61278b chore: Ignore Dart analysis on generated slang file 2025-04-12 01:27:28 +07:00
Pun Butrach
534e4c2453 ci: Point to Android directory 2025-04-10 23:59:39 +07:00
oSumAtrIX
062f28387f ci: Modernize workflows (#2473)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2025-04-10 23:47:26 +07:00
semantic-release-bot
a8a4ffabed chore(release): 1.24.1-dev.3 [skip ci]
## [1.24.1-dev.3](https://github.com/ReVanced/revanced-manager/compare/v1.24.1-dev.2...v1.24.1-dev.3) (2025-04-10)

### Bug Fixes

* Correct supported required patch option types  ([#2475](https://github.com/ReVanced/revanced-manager/issues/2475)) ([cde3f8d](cde3f8d62c))
2025-04-10 15:26:56 +00:00
Pun Butrach
cde3f8d62c fix: Correct supported required patch option types (#2475)
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2025-04-10 22:15:29 +07:00
Pun Butrach
8182228a46 chore: Default project Flutter devtools options configuration for debugging 2025-04-10 22:08:04 +07:00
Pun Butrach
7fa5daf623 chore: Remove Android cxx generated file
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2025-04-10 22:05:38 +07:00
semantic-release-bot
221e663e47 chore(release): 1.24.1-dev.2 [skip ci]
## [1.24.1-dev.2](https://github.com/ReVanced/revanced-manager/compare/v1.24.1-dev.1...v1.24.1-dev.2) (2025-04-09)

### Bug Fixes

* Unable to Share Logs due to missing ProGuard rules ([#2474](https://github.com/ReVanced/revanced-manager/issues/2474)) ([915ec0e](915ec0e260))
2025-04-09 20:20:00 +00:00
Pun Butrach
915ec0e260 fix: Unable to Share Logs due to missing ProGuard rules (#2474)
Technical commit message: fix: Unable to Share Logs due to CCE in FileProvider

Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2025-04-10 03:09:15 +07:00
semantic-release-bot
783f313ed8 chore(release): 1.24.1-dev.1 [skip ci]
## [1.24.1-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.24.0...v1.24.1-dev.1) (2025-04-04)

### Bug Fixes

* Crash using when Integer type in Patch Options ([#2453](https://github.com/ReVanced/revanced-manager/issues/2453)) ([05575cc](05575cccfb))
2025-04-04 16:11:35 +00:00
Pun Butrach
05575cccfb fix: Crash using when Integer type in Patch Options (#2453) 2025-04-04 22:59:06 +07:00
semantic-release-bot
a8e192b85f chore(release): 1.24.0 [skip ci]
# [1.24.0](https://github.com/ReVanced/revanced-manager/compare/v1.23.3...v1.24.0) (2025-03-07)

### Bug Fixes

* Build failure caused by Internal R8 NPE on field "b" ([08a9d2a](08a9d2a64f))
* Change duplicated app suffix and allow profile variant compilation ([5b6426c](5b6426c453))
* Flutter Impeller renderer causing artifacts on rare occasions ([7462291](746229120c))
* Slight tweak and use Flutter suggested config ([4b7b05a](4b7b05ac0f))

### Features

* Distinguish between release, debug, and profile variants ([64cbb68](64cbb68344))
2025-03-07 17:53:22 +00:00
Pun Butrach
4b591effed chore: Merge branch dev to main (#2406) 2025-03-08 00:42:05 +07:00
semantic-release-bot
123c51794b chore(release): 1.24.0-dev.1 [skip ci]
# [1.24.0-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.23.4-dev.1...v1.24.0-dev.1) (2025-03-06)

### Bug Fixes

* Flutter Impeller renderer causing artifacts on rare occasions ([7462291](746229120c))

### Features

* Distinguish between release, debug, and profile variants ([64cbb68](64cbb68344))
2025-03-06 16:56:44 +00:00
validcube
53d64a0636 build: Use dependency meant for Stable branch of Flutter
Signed-off-by: validcube <pun.butrach@gmail.com>
2025-03-06 23:44:47 +07:00
validcube
64cbb68344 feat: Distinguish between release, debug, and profile variants
Signed-off-by: validcube <pun.butrach@gmail.com>
2025-03-06 23:12:35 +07:00
validcube
00950c79f0 build: Bump pubspec dependencies
Signed-off-by: validcube <pun.butrach@gmail.com>
2025-03-06 23:06:09 +07:00
validcube
746229120c fix: Flutter Impeller renderer causing artifacts on rare occasions
This sets minimum flutter version to 3.29.0 so that it will discourage any version lower than that.

Signed-off-by: validcube <pun.butrach@gmail.com>
2025-03-06 22:36:06 +07:00
semantic-release-bot
133f6ee28f chore(release): 1.23.4-dev.1 [skip ci]
## [1.23.4-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.23.3...v1.23.4-dev.1) (2025-03-06)

### Bug Fixes

* Build failure caused by Internal R8 NPE on field "b" ([08a9d2a](08a9d2a64f))
* Change duplicated app suffix and allow profile variant compilation ([5b6426c](5b6426c453))
* Slight tweak and use Flutter suggested config ([4b7b05a](4b7b05ac0f))
2025-03-06 14:56:29 +00:00
Pun Butrach
08a9d2a64f fix: Build failure caused by Internal R8 NPE on field "b"
See: https://issuetracker.google.com/issues/389508413
2025-03-06 21:45:11 +07:00
validcube
4b7b05ac0f fix: Slight tweak and use Flutter suggested config
Signed-off-by: validcube <pun.butrach@gmail.com>
2025-02-15 17:25:29 +07:00
Pun Butrach
5b6426c453 fix: Change duplicated app suffix and allow profile variant compilation 2025-02-15 13:54:57 +07:00
Pun Butrach
235489dcdf ci: Use american spelling
ReVanced uses US EN spelling.
2025-02-14 21:35:19 +07:00
Pun Butrach
b4e5c66f9c ci: Fix commit hash related issues 2025-02-14 21:22:42 +07:00
Pun Butrach
5c58f624de ci: Cover before build failure and registry authentication 2025-02-14 21:20:47 +07:00
Pun Butrach
89ad88c0ef ci: Improve build pull request v3 2025-02-14 21:06:18 +07:00
Pun Butrach
d3036105bb ci: Make attestation runs on every release (stable)
Sometimes build will not be made due to CI Configuration
2025-02-11 19:54:39 +07:00
Pun Butrach
3e8862ea5a ci: Generate release artifact provenance (#2315) 2025-02-10 19:34:12 +07:00
dependabot[bot]
0c59bbb7be build(deps-dev): bump the npm group with 2 updates (#2404) 2025-02-01 10:23:30 +07:00
semantic-release-bot
f4b279d1fd chore(release): 1.23.3 [skip ci]
## [1.23.3](https://github.com/ReVanced/revanced-manager/compare/v1.23.2...v1.23.3) (2025-01-15)

### Bug Fixes

* Delete cached APK only after successful patch ([#2331](https://github.com/ReVanced/revanced-manager/issues/2331)) ([4ba7ec1](4ba7ec1854))
2025-01-15 15:21:07 +00:00
Pun Butrach
c652d196fc ci: Move Nuke script to after normalisation 2025-01-15 21:39:44 +07:00
ReVanced Bot
632b9502b2 chore: Sync translations (#2316)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2025-01-15 21:32:42 +07:00
dependabot[bot]
dfb3fe3749 build(deps): bump slang_flutter and slang (#2374)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2025-01-15 21:15:30 +07:00
Pun Butrach
b3ba0fcd6a chore: Remove deprecated linter rules 2025-01-03 23:39:32 +07:00
dependabot[bot]
8a98b8448b build(deps-dev): bump semantic-release-pub from 0.9.1 to 0.9.3 in the npm group (#2372)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-01 11:21:20 +07:00
dependabot[bot]
da604e89ac build(deps): bump the pubspec group with 2 updates (#2373)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-01 11:18:54 +07:00
semantic-release-bot
624b43733e chore(release): 1.23.3-dev.1 [skip ci]
## [1.23.3-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.23.2...v1.23.3-dev.1) (2024-12-24)

### Bug Fixes

* Delete cached APK only after successful patch ([#2331](https://github.com/ReVanced/revanced-manager/issues/2331)) ([4ba7ec1](4ba7ec1854))
2024-12-24 00:59:50 +00:00
Benjamin
4ba7ec1854 fix: Delete cached APK only after successful patch (#2331) 2024-12-24 01:48:57 +01:00
dependabot[bot]
1d6b074856 build(deps): bump the pubspec group with 13 updates (#2338)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2024-12-19 19:35:55 +07:00
oSumAtrIX
695329088b docs: Navigate to next sub-page and explain mounting [skip ci] 2024-12-18 04:18:23 +01:00
dependabot[bot]
f2b20e6e7f build(deps-dev): bump the npm group with 2 updates (#2334)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-01 11:03:14 +07:00
ReVanced Bot
a5c3aa3744 chore: Sync translations (#2314) 2024-11-13 22:56:59 +07:00
ReVanced Bot
900058a6e5 chore: Sync translations (#2296) 2024-11-13 22:50:41 +07:00
semantic-release-bot
4c51ad3650 chore(release): 1.23.2 [skip ci]
## [1.23.2](https://github.com/ReVanced/revanced-manager/compare/v1.23.1...v1.23.2) (2024-11-12)

### Bug Fixes

* Handle migration of default URL used in v1.22 as well ([851b06b](851b06b0d2))
2024-11-12 23:45:30 +00:00
oSumAtrIX
a0c2a17bab chore: Merge branch dev to main (#2311) 2024-11-13 00:34:25 +01:00
oSumAtrIX
851b06b0d2 fix: Handle migration of default URL used in v1.22 as well 2024-11-13 00:33:58 +01:00
semantic-release-bot
57018a65df chore(release): 1.23.1 [skip ci]
## [1.23.1](https://github.com/ReVanced/revanced-manager/compare/v1.23.0...v1.23.1) (2024-11-10)
2024-11-10 16:24:53 +00:00
oSumAtrIX
b44419133a build(Needs bump): Put keystore to correct file path 2024-11-10 17:14:10 +01:00
semantic-release-bot
8961cf9044 chore(release): 1.23.0 [skip ci]
# [1.23.0](https://github.com/ReVanced/revanced-manager/compare/v1.22.0...v1.23.0) (2024-11-10)

### Bug Fixes

* Don't show toasts when export cancelled ([#2230](https://github.com/ReVanced/revanced-manager/issues/2230)) ([bd79496](bd79496433))
* Fix the connectivity check toast again ([#2216](https://github.com/ReVanced/revanced-manager/issues/2216)) ([a7e2281](a7e2281805))
* Get changelogs for alternative sources ([#1766](https://github.com/ReVanced/revanced-manager/issues/1766)) ([c729842](c7298424e5))
* missing parameter in translations ([1c6c5d5](1c6c5d53ae))
* Resolve EACCESS error in special cases ([#2135](https://github.com/ReVanced/revanced-manager/issues/2135)) ([1f95767](1f95767aeb))
* Restore apk renaming during compile ([abdd9dc](abdd9dc430))

### Features

* Also show new patches in the removed patches dialog ([#2257](https://github.com/ReVanced/revanced-manager/issues/2257)) ([8872165](8872165a99))
* Import and export manager settings ([#2268](https://github.com/ReVanced/revanced-manager/issues/2268)) ([a45d959](a45d9598cc))
* Show changelogs from the latest to the last used patches version ([#2219](https://github.com/ReVanced/revanced-manager/issues/2219)) ([daba737](daba737ecb))
* Use ReVanced API v4 ([7b7d91d](7b7d91d661))

### Performance Improvements

* Don't recalculate universal patches or compatible packages if not necessary ([7e3afe0](7e3afe0cb2))
2024-11-10 15:04:46 +00:00
oSumAtrIX
5139873f79 chore: Merge branch dev to main (#2217) 2024-11-10 15:56:03 +01:00
ReVanced Bot
5caa79eb0d chore: Sync translations (#2267) 2024-11-10 05:57:57 +01:00
semantic-release-bot
9552b2ebc5 chore(release): 1.23.0-dev.7 [skip ci]
# [1.23.0-dev.7](https://github.com/ReVanced/revanced-manager/compare/v1.23.0-dev.6...v1.23.0-dev.7) (2024-11-10)

### Features

* Use ReVanced API v4 ([7b7d91d](7b7d91d661))

### Performance Improvements

* Don't recalculate universal patches or compatible packages if not necessary ([7e3afe0](7e3afe0cb2))
2024-11-10 04:04:12 +00:00
oSumAtrIX
7e3afe0cb2 perf: Don't recalculate universal patches or compatible packages if not necessary 2024-11-10 04:53:59 +01:00
oSumAtrIX
7b7d91d661 feat: Use ReVanced API v4 2024-11-10 04:53:59 +01:00
oSumAtrIX
44b8d4ceee build: Configure output file name 2024-11-08 19:43:45 +01:00
semantic-release-bot
aaa97ebb71 chore(release): 1.23.0-dev.6 [skip ci]
# [1.23.0-dev.6](https://github.com/ReVanced/revanced-manager/compare/v1.23.0-dev.5...v1.23.0-dev.6) (2024-11-08)
2024-11-08 17:49:03 +00:00
oSumAtrIX
d99e5af384 build: Fix build 2024-11-08 18:39:02 +01:00
oSumAtrIX
c47c7c0a88 build(Needs bump): Bump dependencies 2024-11-05 20:13:08 +01:00
semantic-release-bot
3e32c0fd90 chore(release): 1.23.0-dev.5 [skip ci]
# [1.23.0-dev.5](https://github.com/ReVanced/revanced-manager/compare/v1.23.0-dev.4...v1.23.0-dev.5) (2024-11-05)

### Features

* Import and export manager settings ([#2268](https://github.com/ReVanced/revanced-manager/issues/2268)) ([a45d959](a45d9598cc))
2024-11-05 18:52:52 +00:00
aAbed
a45d9598cc feat: Import and export manager settings (#2268) 2024-11-05 19:43:35 +01:00
semantic-release-bot
8c8df698d4 chore(release): 1.23.0-dev.4 [skip ci]
# [1.23.0-dev.4](https://github.com/ReVanced/revanced-manager/compare/v1.23.0-dev.3...v1.23.0-dev.4) (2024-10-26)
2024-10-26 15:50:06 +00:00
oSumAtrIX
8d0d782ab5 build(Needs bump): Bump ReVanced Patcher (#2242)
Co-authored-by: aAbed <aabedhkhan@gmail.com>
2024-10-26 17:41:49 +02:00
semantic-release-bot
4db4789a06 chore(release): 1.23.0-dev.3 [skip ci]
# [1.23.0-dev.3](https://github.com/ReVanced/revanced-manager/compare/v1.23.0-dev.2...v1.23.0-dev.3) (2024-10-22)

### Bug Fixes

* Restore apk renaming during compile ([abdd9dc](abdd9dc430))
2024-10-22 16:16:20 +00:00
validcube
abdd9dc430 fix: Restore apk renaming during compile
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-10-22 23:01:51 +07:00
semantic-release-bot
5193042e6b chore(release): 1.23.0-dev.2 [skip ci]
# [1.23.0-dev.2](https://github.com/ReVanced/revanced-manager/compare/v1.23.0-dev.1...v1.23.0-dev.2) (2024-10-21)

### Features

* Show changelogs from the latest to the last used patches version ([#2219](https://github.com/ReVanced/revanced-manager/issues/2219)) ([daba737](daba737ecb))
2024-10-21 10:27:00 +00:00
aAbed
daba737ecb feat: Show changelogs from the latest to the last used patches version (#2219) 2024-10-21 17:17:23 +07:00
ReVanced Bot
bd96701103 chore: Sync translations (#2233) 2024-10-21 17:16:15 +07:00
Pun Butrach
69c20b74cf chore: Restore format consistency 2024-10-21 04:27:53 +07:00
Pun Butrach
7297436ab4 ci: Update config 2024-10-21 03:18:21 +07:00
dependabot[bot]
a329626715 build(deps-dev): bump semantic-release from 23.1.1 to 24.1.3 (#2265)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-20 03:47:39 +07:00
Robert
50a20d0535 ci: Use semantic-release-pub for updating build number (#2263) 2024-10-19 05:34:26 +02:00
semantic-release-bot
c52edc99c0 chore(release): 1.23.0-dev.1 [skip ci]
# [1.23.0-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.22.1-dev.2...v1.23.0-dev.1) (2024-10-17)

### Bug Fixes

* Don't show toasts when export cancelled ([#2230](https://github.com/ReVanced/revanced-manager/issues/2230)) ([bd79496](bd79496433))
* missing parameter in translations ([1c6c5d5](1c6c5d53ae))

### Features

* Also show new patches in the removed patches dialog ([#2257](https://github.com/ReVanced/revanced-manager/issues/2257)) ([8872165](8872165a99))
2024-10-17 19:10:51 +00:00
aAbed
1c6c5d53ae fix: missing parameter in translations 2024-10-18 00:02:54 +05:45
aAbed
1b110e5bd5 fixup: string correction 2024-10-17 22:00:11 +05:45
aAbed
8872165a99 feat: Also show new patches in the removed patches dialog (#2257)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-10-17 17:48:19 +02:00
aAbed
bd79496433 fix: Don't show toasts when export cancelled (#2230) 2024-10-17 17:48:04 +02:00
oSumAtrIX
820cd720b5 chore: Modernize project setup
Update dependencies, move to Gradle KTs and overall improve build and project files.
2024-10-06 03:14:12 +02:00
ReVanced Bot
31ff1e0492 chore: Sync translations (#2200) 2024-10-01 00:02:20 +07:00
Pun Butrach
8b429f03c2 ci: Use the correct expression to grab translation files (#2232) 2024-09-30 23:59:43 +07:00
semantic-release-bot
a68a83940d chore(release): 1.22.1-dev.2 [skip ci]
## [1.22.1-dev.2](https://github.com/ReVanced/revanced-manager/compare/v1.22.1-dev.1...v1.22.1-dev.2) (2024-09-19)

### Bug Fixes

* Get changelogs for alternative sources ([#1766](https://github.com/ReVanced/revanced-manager/issues/1766)) ([c729842](c7298424e5))
* Resolve EACCESS error in special cases ([#2135](https://github.com/ReVanced/revanced-manager/issues/2135)) ([1f95767](1f95767aeb))
2024-09-19 23:07:33 +00:00
LightCat
1f95767aeb fix: Resolve EACCESS error in special cases (#2135)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-09-20 00:59:27 +02:00
aAbed
c7298424e5 fix: Get changelogs for alternative sources (#1766) 2024-09-20 00:57:07 +02:00
semantic-release-bot
d53f8cf130 chore(release): 1.22.1-dev.1 [skip ci]
## [1.22.1-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.22.0...v1.22.1-dev.1) (2024-09-17)

### Bug Fixes

* Fix the connectivity check toast again ([#2216](https://github.com/ReVanced/revanced-manager/issues/2216)) ([a7e2281](a7e2281805))
2024-09-17 12:56:13 +00:00
kitadai31
a7e2281805 fix: Fix the connectivity check toast again (#2216) 2024-09-17 19:48:05 +07:00
semantic-release-bot
0ce23d2d60 chore(release): 1.22.0 [skip ci]
# [1.22.0](https://github.com/ReVanced/revanced-manager/compare/v1.21.2...v1.22.0) (2024-09-09)

### Bug Fixes

* Bump SDK of each plugin using SDK lower than 31 ([01e4a76](01e4a76caa)), closes [/github.com/flutter/flutter/issues/153281#issuecomment-2292201697](https://github.com//github.com/flutter/flutter/issues/153281/issues/issuecomment-2292201697)
* Empty “tmp-XXXXXX” directory keeps growing in cacheDir ([#2194](https://github.com/ReVanced/revanced-manager/issues/2194)) ([f5a12e0](f5a12e01bd))
* Fix missing notification icon when shrinking resouces ([#2195](https://github.com/ReVanced/revanced-manager/issues/2195)) ([224be29](224be29a3d))
* Handle selecting files and folders for patch options correctly ([#2144](https://github.com/ReVanced/revanced-manager/issues/2144)) ([f1c2f41](f1c2f4146c))
* Lack of connectivity toast not showing due to incorrect comparison ([81f05e1](81f05e1b19))
* Migrate to onPopInvokedWithResult ([43d5888](43d5888182))
* Move temporary files outside of the cache directory ([#2193](https://github.com/ReVanced/revanced-manager/issues/2193)) ([1ef1f8d](1ef1f8d47a))
* Reland commit 01e4a76caa ([3dc695e](3dc695eafb))
* Specify our own FGS Type ([37c912b](37c912b598))

### Features

* Improve "Installation incompatible" dialog message ([#2164](https://github.com/ReVanced/revanced-manager/issues/2164)) ([51c0f14](51c0f14055))
* Support Flutter 3.24 ([3d8318d](3d8318da14))
2024-09-09 10:59:13 +00:00
Ushie
d0fe57970f chore: Merge branch dev to main (#2149) 2024-09-09 13:51:11 +03:00
semantic-release-bot
4dcdc57ffd chore(release): 1.22.0-dev.4 [skip ci]
# [1.22.0-dev.4](https://github.com/ReVanced/revanced-manager/compare/v1.22.0-dev.3...v1.22.0-dev.4) (2024-09-09)

### Bug Fixes

* Move temporary files outside of the cache directory ([#2193](https://github.com/ReVanced/revanced-manager/issues/2193)) ([1ef1f8d](1ef1f8d47a))
2024-09-09 10:50:05 +00:00
kitadai31
1ef1f8d47a fix: Move temporary files outside of the cache directory (#2193)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2024-09-09 17:42:03 +07:00
ReVanced Bot
d688f38a63 chore: Sync translations (#2166)
Signed-off-by: validcube <pun.butrach@gmail.com>
Co-authored-by: validcube <pun.butrach@gmail.com>
2024-09-09 14:14:59 +07:00
semantic-release-bot
582db18d83 chore(release): 1.22.0-dev.3 [skip ci]
# [1.22.0-dev.3](https://github.com/ReVanced/revanced-manager/compare/v1.22.0-dev.2...v1.22.0-dev.3) (2024-09-07)

### Bug Fixes

* Empty “tmp-XXXXXX” directory keeps growing in cacheDir ([#2194](https://github.com/ReVanced/revanced-manager/issues/2194)) ([f5a12e0](f5a12e01bd))
2024-09-07 03:09:04 +00:00
kitadai31
f5a12e01bd fix: Empty “tmp-XXXXXX” directory keeps growing in cacheDir (#2194) 2024-09-07 09:59:37 +07:00
semantic-release-bot
09fd9c4e04 chore(release): 1.22.0-dev.2 [skip ci]
# [1.22.0-dev.2](https://github.com/ReVanced/revanced-manager/compare/v1.22.0-dev.1...v1.22.0-dev.2) (2024-09-06)

### Bug Fixes

* Bump SDK of each plugin using SDK lower than 31 ([01e4a76](01e4a76caa)), closes [/github.com/flutter/flutter/issues/153281#issuecomment-2292201697](https://github.com//github.com/flutter/flutter/issues/153281/issues/issuecomment-2292201697)
* Fix missing notification icon when shrinking resouces ([#2195](https://github.com/ReVanced/revanced-manager/issues/2195)) ([224be29](224be29a3d))
* Lack of connectivity toast not showing due to incorrect comparison ([81f05e1](81f05e1b19))
* Migrate to onPopInvokedWithResult ([43d5888](43d5888182))
* Reland commit 01e4a76caa ([3dc695e](3dc695eafb))
* Specify our own FGS Type ([37c912b](37c912b598))

### Features

* Support Flutter 3.24 ([3d8318d](3d8318da14))
2024-09-06 14:53:03 +00:00
validcube
43d5888182 fix: Migrate to onPopInvokedWithResult
Reference: https://docs.flutter.dev/release/breaking-changes/popscope-with-result
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-09-06 21:44:56 +07:00
validcube
646feae0ec build: Bump dependency and resolve removed function(s)
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-09-06 21:44:55 +07:00
validcube
e73ce99f1d build: Restrict Flutter 4.0.0
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-09-06 21:44:55 +07:00
validcube
af2d8226de docs: Specify Android 8.x version & CPU arch requirements
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-09-06 21:44:55 +07:00
validcube
37c912b598 fix: Specify our own FGS Type
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-09-06 21:44:54 +07:00
validcube
3102272a31 build: Reduce clutter in buildTypes
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-09-06 21:44:54 +07:00
validcube
3dc695eafb fix: Reland commit 01e4a76caa
Amended: Remove secret @ Fri Sep 6 21:06:58 2024 +0700

Signed-off-by: validcube <pun.butrach@gmail.com>
2024-09-06 21:44:33 +07:00
validcube
6f0721b066 chore: Temporary disable workaround for testing
The local enviroment deemed unreliable, before applying it doesn't work - after applying the workaround, it work - after removing the workaround with clearing cache, it doesn't work. (what?)

Signed-off-by: validcube <pun.butrach@gmail.com>
2024-09-06 20:52:21 +07:00
validcube
3dfe6b1080 ci: Attempt to group all dependabot dependency update
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-09-06 20:44:40 +07:00
validcube
02e5641227 build: Bump Gradle to v8.10
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-09-06 20:18:53 +07:00
validcube
01e4a76caa fix: Bump SDK of each plugin using SDK lower than 31
Reference: https://github.com/flutter/flutter/issues/153281#issuecomment-2292201697
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-09-06 20:12:01 +07:00
validcube
59838a51ca ci: Potientially improve Gradle detection
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-09-06 19:27:55 +07:00
kitadai31
224be29a3d fix: Fix missing notification icon when shrinking resouces (#2195) 2024-09-06 18:10:30 +07:00
dependabot[bot]
921052acce build(deps): bump burrunan/gradle-cache-action from 1 to 2 (#2177)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-03 06:02:32 +07:00
validcube
81f05e1b19 fix: Lack of connectivity toast not showing due to incorrect comparison
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-08-28 00:26:41 +07:00
ReVanced Bot
b769a66d16 chore: Sync translations (#2090)
Signed-off-by: validcube <pun.butrach@gmail.com>
Co-authored-by: validcube <pun.butrach@gmail.com>
2024-08-27 22:01:29 +07:00
Pun Butrach
5d612fe790 ci: Run nuke in correct steps 2024-08-27 21:11:52 +07:00
Pun Butrach
61251deffa ci: Fix permission not given to Slang 2024-08-27 21:09:33 +07:00
Pun Butrach
f2931443d9 ci: Fix translation normalization feature (#2165) 2024-08-27 21:04:15 +07:00
validcube
3d8318da14 feat: Support Flutter 3.24
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-08-27 21:01:41 +07:00
semantic-release-bot
f6bfe0d3f9 chore(release): 1.22.0-dev.1 [skip ci]
# [1.22.0-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.21.3-dev.1...v1.22.0-dev.1) (2024-08-27)

### Features

* Improve "Installation incompatible" dialog message ([#2164](https://github.com/ReVanced/revanced-manager/issues/2164)) ([51c0f14](51c0f14055))
2024-08-27 08:07:13 +00:00
KobeW50
51c0f14055 feat: Improve "Installation incompatible" dialog message (#2164) 2024-08-27 09:59:18 +02:00
semantic-release-bot
2a6dc09a9b chore(release): 1.21.3-dev.1 [skip ci]
## [1.21.3-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.21.2...v1.21.3-dev.1) (2024-08-18)

### Bug Fixes

* Handle selecting files and folders for patch options correctly ([#2144](https://github.com/ReVanced/revanced-manager/issues/2144)) ([f1c2f41](f1c2f4146c))
2024-08-18 08:19:05 +00:00
Francesco Marastoni
f1c2f4146c fix: Handle selecting files and folders for patch options correctly (#2144) 2024-08-18 12:11:10 +04:00
semantic-release-bot
2f46b3c84e chore(release): 1.21.2 [skip ci]
## [1.21.2](https://github.com/ReVanced/revanced-manager/compare/v1.21.1...v1.21.2) (2024-08-11)

### Bug Fixes

* Add haptics to save last APK switch ([#2133](https://github.com/ReVanced/revanced-manager/issues/2133)) ([e063b3d](e063b3d102))
* Don't crash installation when saving last APK is disabled ([#2128](https://github.com/ReVanced/revanced-manager/issues/2128)) ([427928e](427928e542))
* Don't crash when installing the last patched APK ([#2131](https://github.com/ReVanced/revanced-manager/issues/2131)) ([cb722f2](cb722f2634))
* Unable to scroll in the removed patches dialog ([#2113](https://github.com/ReVanced/revanced-manager/issues/2113)) ([295c5a7](295c5a74ea))
2024-08-11 16:08:42 +00:00
Benjamin
5f388abf95 chore: Merge branch dev to main (#2118) 2024-08-11 09:00:47 -07:00
semantic-release-bot
7acdb8e660 chore(release): 1.21.2-dev.3 [skip ci]
## [1.21.2-dev.3](https://github.com/ReVanced/revanced-manager/compare/v1.21.2-dev.2...v1.21.2-dev.3) (2024-08-11)

### Bug Fixes

* Add haptics to save last APK switch ([#2133](https://github.com/ReVanced/revanced-manager/issues/2133)) ([e063b3d](e063b3d102))
* Don't crash when installing the last patched APK ([#2131](https://github.com/ReVanced/revanced-manager/issues/2131)) ([cb722f2](cb722f2634))
2024-08-11 15:59:16 +00:00
Benjamin
e063b3d102 fix: Add haptics to save last APK switch (#2133) 2024-08-11 08:51:18 -07:00
Benjamin
cb722f2634 fix: Don't crash when installing the last patched APK (#2131) 2024-08-11 08:51:02 -07:00
semantic-release-bot
0499d2b08a chore(release): 1.21.2-dev.2 [skip ci]
## [1.21.2-dev.2](https://github.com/ReVanced/revanced-manager/compare/v1.21.2-dev.1...v1.21.2-dev.2) (2024-08-11)

### Bug Fixes

* Don't crash installation when saving last APK is disabled ([#2128](https://github.com/ReVanced/revanced-manager/issues/2128)) ([427928e](427928e542))
2024-08-11 15:39:29 +00:00
Benjamin
427928e542 fix: Don't crash installation when saving last APK is disabled (#2128) 2024-08-11 19:31:18 +04:00
semantic-release-bot
ceb9d66f17 chore(release): 1.21.2-dev.1 [skip ci]
## [1.21.2-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.21.1...v1.21.2-dev.1) (2024-08-06)

### Bug Fixes

* Unable to scroll in the removed patches dialog ([#2113](https://github.com/ReVanced/revanced-manager/issues/2113)) ([295c5a7](295c5a74ea))
2024-08-06 00:55:10 +00:00
aAbed
295c5a74ea fix: Unable to scroll in the removed patches dialog (#2113) 2024-08-06 03:46:01 +03:00
semantic-release-bot
400df69528 chore(release): 1.21.1 [skip ci]
## [1.21.1](https://github.com/ReVanced/revanced-manager/compare/v1.21.0...v1.21.1) (2024-07-29)

### Bug Fixes

* Revert commit b26760b2 to fix file and folder selection ([e707e51](e707e51719))
2024-07-29 20:47:18 +00:00
aAbed
5bc7b135d5 chore: Merge branch dev to main (#2092) 2024-07-30 02:22:56 +05:45
semantic-release-bot
6dce353d78 chore(release): 1.21.1-dev.1 [skip ci]
## [1.21.1-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.21.0...v1.21.1-dev.1) (2024-07-29)

### Bug Fixes

* Revert commit b26760b2 to fix file and folder selection ([e707e51](e707e51719))
2024-07-29 20:12:35 +00:00
oSumAtrIX
e707e51719 fix: Revert commit b26760b2 to fix file and folder selection 2024-07-29 22:00:25 +02:00
semantic-release-bot
1cea9600a2 chore(release): 1.21.0 [skip ci]
# [1.21.0](https://github.com/ReVanced/revanced-manager/compare/v1.20.1...v1.21.0) (2024-07-29)

### Bug Fixes

* Add missing import to patch options field ([d60f9aa](d60f9aa1d8))
* Adjust scroll from clipping children form fields in `AlertDialog` from `showSourcesDialog` ([#1782](https://github.com/ReVanced/revanced-manager/issues/1782)) ([bbeb836](bbeb836923))
* Cache external API calls  ([#1911](https://github.com/ReVanced/revanced-manager/issues/1911)) ([2c3e2e6](2c3e2e639f))
* Change problematic translation string ([6b03f3a](6b03f3a169))
* Correct architecture to armeabi-v7a ([63c6412](63c6412736))
* Download latest integrations non-pre-release ([4a72267](4a72267d41))
* Follow language update immediately ([#1944](https://github.com/ReVanced/revanced-manager/issues/1944)) ([c13827e](c13827e8e1))
* Follow system theme immediately ([#1942](https://github.com/ReVanced/revanced-manager/issues/1942)) ([694f2a9](694f2a9fae))
* Handle selecting files and folders for patch options correctly ([#1941](https://github.com/ReVanced/revanced-manager/issues/1941)) ([b26760b](b26760b216))
* Increase dashboard RefreshIndicator edge offset ([#1859](https://github.com/ReVanced/revanced-manager/issues/1859)) ([232b702](232b702789))
* Patching Screen draw-behind Navigation Bar ([#1945](https://github.com/ReVanced/revanced-manager/issues/1945)) ([f1b25d0](f1b25d09da))
* Restore consistency with the app ([ea9654e](ea9654edec))
* SecurityException when patching application ([#1856](https://github.com/ReVanced/revanced-manager/issues/1856)) ([e0a6de2](e0a6de2c2b))
* Select previously applied patches when loading patch selection ([#1865](https://github.com/ReVanced/revanced-manager/issues/1865)) ([7ef8f04](7ef8f0454b))
* Unable to install application regardless of preference ([c7627ce](c7627ced8e))
* Unsupported patch toast says "patchItem.unsupportedPatchVersion" ([#2011](https://github.com/ReVanced/revanced-manager/issues/2011)) ([3209c0e](3209c0e430))
* Update dialog shows dev version & loading gets stuck in certain circumstances ([#1792](https://github.com/ReVanced/revanced-manager/issues/1792)) ([fc52560](fc52560244))

### Features

* Add ability to set `null` in patch options ([#1947](https://github.com/ReVanced/revanced-manager/issues/1947)) ([5c68d51](5c68d513a3))
* Include primary architecture in external search ([#2068](https://github.com/ReVanced/revanced-manager/issues/2068)) ([23690a9](23690a98df))
* open browser when clicking on changelog link ([bc300d8](bc300d81d9))
* Save last patched app ([#1414](https://github.com/ReVanced/revanced-manager/issues/1414)) ([7720408](77204087bb))
* Support patching on ARMv7a ([a766352](a7663524e6))
2024-07-29 18:38:53 +00:00
Pun Butrach
d81808ad7b chore: Merge branch dev to main (#1857) 2024-07-30 01:30:51 +07:00
validcube
ea9654edec fix: Restore consistency with the app 2024-07-30 01:30:59 +07:00
semantic-release-bot
ced37f7c76 chore(release): 1.21.0-dev.9 [skip ci]
# [1.21.0-dev.9](https://github.com/ReVanced/revanced-manager/compare/v1.21.0-dev.8...v1.21.0-dev.9) (2024-07-29)

### Bug Fixes

* Patching Screen draw-behind Navigation Bar ([#1945](https://github.com/ReVanced/revanced-manager/issues/1945)) ([f1b25d0](f1b25d09da))
2024-07-29 18:24:51 +00:00
validcube
4c6e214bf6 refactor: Remove empty keys 2024-07-30 01:16:48 +07:00
Pun Butrach
d10abd4829 ci: Remove redundancy 2024-07-30 01:15:23 +07:00
Pun Butrach
25f1640fd6 ci: Remove empty value 2024-07-30 01:13:05 +07:00
ReVanced Bot
5690adc0de chore: Sync translations (#2005) 2024-07-30 01:02:02 +07:00
Snehith
f1b25d09da fix: Patching Screen draw-behind Navigation Bar (#1945)
Co-authored-by: surya-technovert <surya.m@technovert.com>
2024-07-30 00:58:40 +07:00
semantic-release-bot
96a21a5564 chore(release): 1.21.0-dev.8 [skip ci]
# [1.21.0-dev.8](https://github.com/ReVanced/revanced-manager/compare/v1.21.0-dev.7...v1.21.0-dev.8) (2024-07-29)

### Bug Fixes

* Correct architecture to armeabi-v7a ([63c6412](63c6412736))
* Unable to install application regardless of preference ([c7627ce](c7627ced8e))

### Features

* Support patching on ARMv7a ([a766352](a7663524e6))
2024-07-29 17:51:14 +00:00
validcube
0b21bb9807 build: Allocate more memory 2024-07-30 00:43:25 +07:00
Pun Butrach
557ee8d472 ci: Fix accident 2024-07-30 00:22:22 +07:00
validcube
6da3751a8a ci: Don't include Slang's analyser generated file 2024-07-30 00:17:29 +07:00
validcube
cf708de005 ci: Remove deleted strings from translated file 2024-07-30 00:12:43 +07:00
validcube
b649c4539f chore: Remove all long forever deleted translated strings 2024-07-30 00:11:09 +07:00
validcube
c63342bc21 chore: Normalise all translated strings 2024-07-30 00:03:06 +07:00
validcube
9f56b277ca ci: Use Slang's Normalisation feature 2024-07-30 00:03:06 +07:00
validcube
73c92b9c72 build: Update multiple dependencies at once
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-07-30 00:03:06 +07:00
validcube
c7627ced8e fix: Unable to install application regardless of preference
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-07-30 00:03:06 +07:00
validcube
63c6412736 fix: Correct architecture to armeabi-v7a
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-07-30 00:03:05 +07:00
validcube
a7663524e6 feat: Support patching on ARMv7a
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-07-30 00:03:05 +07:00
semantic-release-bot
65feb34242 chore(release): 1.21.0-dev.7 [skip ci]
# [1.21.0-dev.7](https://github.com/ReVanced/revanced-manager/compare/v1.21.0-dev.6...v1.21.0-dev.7) (2024-07-29)

### Features

* Include primary architecture in external search ([#2068](https://github.com/ReVanced/revanced-manager/issues/2068)) ([23690a9](23690a98df))
2024-07-29 16:04:12 +00:00
Pun Butrach
23690a98df feat: Include primary architecture in external search (#2068) 2024-07-29 22:56:00 +07:00
Pun Butrach
7449d4e318 docs: Link user to the latest version of app (#2077) 2024-07-25 09:27:29 +07:00
validcube
c6f9e36f4b refactor: Migrate deprecated member 2024-07-13 17:32:34 +07:00
Pun Butrach
e9cee0abe2 ci: Prefer installing NPM dependencies from lock 2024-07-13 17:04:43 +07:00
Benjamin
9440f23b55 chore: Remove NDK constraint (#2016)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2024-07-13 16:55:02 +07:00
dependabot[bot]
c67b4b438c build(deps): bump flutter_markdown from 0.7.1 to 0.7.3 (#2022)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-12 14:07:16 +07:00
kitadai31
1bdb820aed refactor: Remove unused strings (#2010) 2024-07-11 11:28:02 +07:00
semantic-release-bot
a28d77bc65 chore(release): 1.21.0-dev.6 [skip ci]
# [1.21.0-dev.6](https://github.com/ReVanced/revanced-manager/compare/v1.21.0-dev.5...v1.21.0-dev.6) (2024-06-30)

### Bug Fixes

* Add missing import to patch options field ([d60f9aa](d60f9aa1d8))
* Follow system theme immediately ([#1942](https://github.com/ReVanced/revanced-manager/issues/1942)) ([694f2a9](694f2a9fae))
* Handle selecting files and folders for patch options correctly ([#1941](https://github.com/ReVanced/revanced-manager/issues/1941)) ([b26760b](b26760b216))
* Increase dashboard RefreshIndicator edge offset ([#1859](https://github.com/ReVanced/revanced-manager/issues/1859)) ([232b702](232b702789))
* Select previously applied patches when loading patch selection ([#1865](https://github.com/ReVanced/revanced-manager/issues/1865)) ([7ef8f04](7ef8f0454b))
* Unsupported patch toast says "patchItem.unsupportedPatchVersion" ([#2011](https://github.com/ReVanced/revanced-manager/issues/2011)) ([3209c0e](3209c0e430))

### Features

* Save last patched app ([#1414](https://github.com/ReVanced/revanced-manager/issues/1414)) ([7720408](77204087bb))
2024-06-30 20:45:38 +00:00
Benjamin Halko
d60f9aa1d8 fix: Add missing import to patch options field
Patch options fields was missing the `patch_options_viewmodel` import, preventing building to complete successfully
2024-06-30 13:38:01 -07:00
kitadai31
3209c0e430 fix: Unsupported patch toast says "patchItem.unsupportedPatchVersion" (#2011) 2024-06-30 15:24:25 +07:00
aAbed
7ef8f0454b fix: Select previously applied patches when loading patch selection (#1865) 2024-06-29 14:40:20 +02:00
DMzS
232b702789 fix: Increase dashboard RefreshIndicator edge offset (#1859) 2024-06-29 14:40:04 +02:00
Snehith
694f2a9fae fix: Follow system theme immediately (#1942)
Co-authored-by: surya-technovert <surya.m@technovert.com>
2024-06-29 14:39:00 +02:00
Benjamin
77204087bb feat: Save last patched app (#1414)
Co-authored-by: aAbed <39409020+TheAabedKhan@users.noreply.github.com>
Co-authored-by: Ushie <ushiekane@gmail.com>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
Co-authored-by: Mr. X <79870712+n30mrx@users.noreply.github.com>
Co-authored-by: festry0 <153519925+festry0@users.noreply.github.com>
2024-06-29 14:38:00 +02:00
Francesco Marastoni
b26760b216 fix: Handle selecting files and folders for patch options correctly (#1941) 2024-06-29 14:34:34 +02:00
semantic-release-bot
3c36950aeb chore(release): 1.21.0-dev.5 [skip ci]
# [1.21.0-dev.5](https://github.com/ReVanced/revanced-manager/compare/v1.21.0-dev.4...v1.21.0-dev.5) (2024-06-26)

### Bug Fixes

* Adjust scroll from clipping children form fields in `AlertDialog` from `showSourcesDialog` ([#1782](https://github.com/ReVanced/revanced-manager/issues/1782)) ([bbeb836](bbeb836923))
2024-06-26 22:53:56 +00:00
DMzS
bbeb836923 fix: Adjust scroll from clipping children form fields in AlertDialog from showSourcesDialog (#1782) 2024-06-27 05:45:55 +07:00
semantic-release-bot
a99406f0a9 chore(release): 1.21.0-dev.4 [skip ci]
# [1.21.0-dev.4](https://github.com/ReVanced/revanced-manager/compare/v1.21.0-dev.3...v1.21.0-dev.4) (2024-06-24)

### Bug Fixes

* Cache external API calls  ([#1911](https://github.com/ReVanced/revanced-manager/issues/1911)) ([2c3e2e6](2c3e2e639f))
* Follow language update immediately ([#1944](https://github.com/ReVanced/revanced-manager/issues/1944)) ([c13827e](c13827e8e1))
* SecurityException when patching application ([#1856](https://github.com/ReVanced/revanced-manager/issues/1856)) ([e0a6de2](e0a6de2c2b))
* Update dialog shows dev version & loading gets stuck in certain circumstances ([#1792](https://github.com/ReVanced/revanced-manager/issues/1792)) ([fc52560](fc52560244))

### Features

* Add ability to set `null` in patch options ([#1947](https://github.com/ReVanced/revanced-manager/issues/1947)) ([5c68d51](5c68d513a3))
2024-06-24 17:03:46 +00:00
Pun Butrach
73368b58be build: Support for Flutter 3.22 (#1921)
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-06-24 23:55:37 +07:00
ReVanced Bot
ca14e77ba3 chore: Sync translations (#1899) 2024-06-24 23:55:03 +07:00
Pun Butrach
cafdfcda47 ci: Don't fail validation on unimportant warnings 2024-06-24 23:52:23 +07:00
aAbed
5c68d513a3 feat: Add ability to set null in patch options (#1947) 2024-06-24 23:37:16 +07:00
kitadai31
fc52560244 fix: Update dialog shows dev version & loading gets stuck in certain circumstances (#1792)
Signed-off-by: validcube <pun.butrach@gmail.com>
Co-authored-by: validcube <pun.butrach@gmail.com>
2024-06-19 14:44:09 +07:00
Pun Butrach
46f6a49a7a ci: Always run on dev branch only 2024-06-15 17:36:25 +07:00
Snehith
c13827e8e1 fix: Follow language update immediately (#1944)
Co-authored-by: surya-technovert <surya.m@technovert.com>
2024-06-15 17:21:47 +07:00
Pun Butrach
e0a6de2c2b fix: SecurityException when patching application (#1856) 2024-05-28 11:36:31 +07:00
yonggamer
afdba00722 build: Fix invalid Gradle wrapper checksum (#1919) 2024-05-28 09:31:48 +07:00
oSumAtrIX
9084c71aa3 build: Bump dependencies 2024-05-26 01:21:14 +02:00
oSumAtrIX
8fc5fb6a80 docs: Improve issue templates 2024-05-26 00:43:38 +02:00
validcube
5f762c5442 build: Update Dart dependencies
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-05-19 19:15:35 +07:00
Pun Butrach
8b21ec1ea3 ci: Switch to Flutter instead 2024-05-19 18:54:48 +07:00
Pun Butrach
e83fbb864e ci: Run slang first before validating translation 2024-05-19 18:46:49 +07:00
KobeW50
f03af17f71 docs: Fix issue template mistakes (#1910) 2024-05-19 01:33:18 +07:00
kitadai31
2c3e2e639f fix: Cache external API calls (#1911) 2024-05-18 10:52:13 -07:00
KobeW50
cc85b393dc docs: Fix punctuation in issue forms (#1909) 2024-05-18 01:18:29 +07:00
semantic-release-bot
fa6ad214f9 chore(release): 1.21.0-dev.3 [skip ci]
# [1.21.0-dev.3](https://github.com/ReVanced/revanced-manager/compare/v1.21.0-dev.2...v1.21.0-dev.3) (2024-05-07)

### Bug Fixes

* Change problematic translation string ([6b03f3a](6b03f3a169))
2024-05-07 14:01:16 +00:00
validcube
3ceb63be1d build: Downgrade intl to 0.18.1
1.19.0 is for beta channel atm
2024-05-07 20:53:43 +07:00
validcube
200483d733 ci: Always validate Dart file during translation 2024-05-07 20:51:34 +07:00
validcube
6b03f3a169 fix: Change problematic translation string 2024-05-07 20:51:01 +07:00
validcube
612a3bab49 build: Safely upgrade dependencies 2024-05-07 20:50:26 +07:00
ReVanced Bot
3ac08512f3 chore: Sync translations (#1888)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2024-05-06 21:24:51 +07:00
ReVanced Bot
1adc673c44 chore: Sync translations (#1842) 2024-04-29 10:24:25 +07:00
semantic-release-bot
1aa1bd84cf chore(release): 1.21.0-dev.2 [skip ci]
# [1.21.0-dev.2](https://github.com/ReVanced/revanced-manager/compare/v1.21.0-dev.1...v1.21.0-dev.2) (2024-04-28)

### Bug Fixes

* Download latest integrations non-pre-release ([4a72267](4a72267d41))
2024-04-28 21:49:47 +00:00
oSumAtrIX
4a72267d41 fix: Download latest integrations non-pre-release 2024-04-28 23:40:28 +02:00
oSumAtrIX
7e0f18e3b7 build: Bump dependencies 2024-04-28 23:39:20 +02:00
hellidox
aab5d4411b docs: Remove duplicate section in README (#1879)
[skip ci]
2024-04-23 18:29:06 +02:00
semantic-release-bot
e5d83f424a chore(release): 1.21.0-dev.1 [skip ci]
# [1.21.0-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.20.1...v1.21.0-dev.1) (2024-04-16)

### Features

* open browser when clicking on changelog link ([bc300d8](bc300d81d9))
2024-04-16 14:39:51 +00:00
Aunali321
bc300d81d9 feat: open browser when clicking on changelog link 2024-04-16 20:00:46 +05:30
dependabot[bot]
5e6cc86c7e build(deps-dev): bump semantic-release from 23.0.6 to 23.0.7 (#1844)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-05 14:57:28 +07:00
dependabot[bot]
d91ea62903 build(deps): bump flutter_local_notifications from 16.3.2 to 17.0.0 (#1848)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-05 14:57:16 +07:00
dependabot[bot]
f00dc4d3e6 build(deps): bump flutter_markdown from 0.6.20+1 to 0.6.22+1 (#1851)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-05 14:55:48 +07:00
dependabot[bot]
6c0c961ca0 build(deps): bump build_runner from 2.4.8 to 2.4.9 (#1850)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-05 14:54:31 +07:00
dependabot[bot]
a99de99202 build(deps): bump share_plus from 7.2.2 to 8.0.2 (#1853)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-05 14:53:59 +07:00
dependabot[bot]
a31ec9d1fe build(deps): bump permission_handler from 11.3.0 to 11.3.1 (#1852)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-05 14:53:30 +07:00
semantic-release-bot
a23f032fd2 chore(release): 1.20.1 [skip ci]
## [1.20.1](https://github.com/ReVanced/revanced-manager/compare/v1.20.0...v1.20.1) (2024-04-05)

### Bug Fixes

* Don't crash on patch ([a7e481c](a7e481c827))
2024-04-05 02:52:15 +00:00
Ushie
95a8234e2d chore: Merge branch dev to main (#1855) 2024-04-05 05:43:17 +03:00
Ushie
a7e481c827 fix: Don't crash on patch
This reverts commit 7833a0d552.
2024-04-05 05:35:36 +03:00
semantic-release-bot
975870e254 chore(release): 1.20.0 [skip ci]
# [1.20.0](https://github.com/ReVanced/revanced-manager/compare/v1.19.3...v1.20.0) (2024-04-05)

### Bug Fixes

* disable proguard obfuscation ([401646a](401646ace4))
* Do not crash when selecting an APK from storage ([#1768](https://github.com/ReVanced/revanced-manager/issues/1768)) ([8564c1a](8564c1a72e))
* Don't translation ReVanced repository ([c265794](c265794d0e))
* Ensure safe area usage in Changelogs Modal Bottom Sheet ([#1772](https://github.com/ReVanced/revanced-manager/issues/1772)) ([c981cb4](c981cb4a41))
* Pre-releases changelog being shown ([#1767](https://github.com/ReVanced/revanced-manager/issues/1767)) ([add49e1](add49e14fb))
* Replace Spacer with Expanded to avoid overflow ([#1791](https://github.com/ReVanced/revanced-manager/issues/1791)) ([6f70a07](6f70a07970))
* Set text colour on dropdown menu for Custom Value ([966796d](966796dfec)), closes [#1584](https://github.com/ReVanced/revanced-manager/issues/1584)
* **ui:** Support free-scroll and auto-scroll for the installer logs ([#1736](https://github.com/ReVanced/revanced-manager/issues/1736)) ([#1836](https://github.com/ReVanced/revanced-manager/issues/1836)) ([025ff52](025ff527ee))

### Features

* Improve language update settings ([#1838](https://github.com/ReVanced/revanced-manager/issues/1838)) ([f9e6ef3](f9e6ef3fd3))
2024-04-05 01:19:30 +00:00
Ushie
b7c838fd25 chore: Merge branch dev to main (#1763) 2024-04-05 04:11:17 +03:00
semantic-release-bot
3776674eb4 chore(release): 1.20.0-dev.1 [skip ci]
# [1.20.0-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.19.4-dev.7...v1.20.0-dev.1) (2024-04-05)

### Bug Fixes

* Do not crash when selecting an APK from storage ([#1768](https://github.com/ReVanced/revanced-manager/issues/1768)) ([8564c1a](8564c1a72e))

### Features

* Improve language update settings ([#1838](https://github.com/ReVanced/revanced-manager/issues/1838)) ([f9e6ef3](f9e6ef3fd3))
2024-04-05 01:10:39 +00:00
ReVanced Bot
4293e27681 chore: Sync translations (#1804) 2024-04-05 04:03:11 +03:00
aAbed
8564c1a72e fix: Do not crash when selecting an APK from storage (#1768) 2024-04-05 03:58:59 +03:00
Lam Thanh Nhan
f9e6ef3fd3 feat: Improve language update settings (#1838) 2024-04-05 03:55:16 +03:00
semantic-release-bot
e80ee09893 chore(release): 1.19.4-dev.7 [skip ci]
## [1.19.4-dev.7](https://github.com/ReVanced/revanced-manager/compare/v1.19.4-dev.6...v1.19.4-dev.7) (2024-04-04)

### Bug Fixes

* **ui:** Support free-scroll and auto-scroll for the installer logs ([#1736](https://github.com/ReVanced/revanced-manager/issues/1736)) ([#1836](https://github.com/ReVanced/revanced-manager/issues/1836)) ([025ff52](025ff527ee))
2024-04-04 02:35:20 +00:00
DMzS
025ff527ee fix(ui): Support free-scroll and auto-scroll for the installer logs (#1736) (#1836) 2024-04-04 09:27:47 +07:00
semantic-release-bot
35fdbb5988 chore(release): 1.19.4-dev.6 [skip ci]
## [1.19.4-dev.6](https://github.com/ReVanced/revanced-manager/compare/v1.19.4-dev.5...v1.19.4-dev.6) (2024-04-02)

### Bug Fixes

* disable proguard obfuscation ([401646a](401646ace4))
2024-04-02 16:19:30 +00:00
Ax333l
401646ace4 fix: disable proguard obfuscation 2024-04-02 18:09:38 +02:00
dependabot[bot]
a62a8852e7 build(deps): bump connectivity_plus from 5.0.2 to 6.0.1 (#1808)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-01 11:49:03 +07:00
dependabot[bot]
04a3df3642 build(deps): bump package_info_plus from 5.0.1 to 6.0.0 (#1806)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-01 11:48:46 +07:00
dependabot[bot]
ecb041187b build(deps-dev): bump semantic-release from 23.0.2 to 23.0.6 (#1816)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-01 11:43:57 +07:00
dependabot[bot]
1fd44e1cfc build(deps-dev): bump @droidsolutions-oss/semantic-release-update-file from 1.4.0-beta.1 to 1.4.0 (#1815)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-01 11:43:29 +07:00
dependabot[bot]
fb29036d0a build(deps): bump flutter_lints from 3.0.1 to 3.0.2 (#1805)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-01 10:18:52 +07:00
Ushie
aba2ed4378 ci: Don't specify bundle 2024-03-30 03:16:39 +03:00
Ushie
076e17d670 chore: Don't preserve hierachy in Crowdin 2024-03-30 03:12:06 +03:00
semantic-release-bot
a971cbd519 chore(release): 1.19.4-dev.5 [skip ci]
## [1.19.4-dev.5](https://github.com/ReVanced/revanced-manager/compare/v1.19.4-dev.4...v1.19.4-dev.5) (2024-03-28)

### Bug Fixes

* Don't translation ReVanced repository ([c265794](c265794d0e))
2024-03-28 06:23:34 +00:00
Pun Butrach
c265794d0e fix: Don't translation ReVanced repository
Regex:

,
    "patcherContributors":.*,
    "patchesContributors":.*,
    "integrationsContributors":.*,
    "cliContributors":.*,
    "managerContributors":.*
2024-03-28 06:13:05 +00:00
semantic-release-bot
ecadb80113 chore(release): 1.19.4-dev.4 [skip ci]
## [1.19.4-dev.4](https://github.com/ReVanced/revanced-manager/compare/v1.19.4-dev.3...v1.19.4-dev.4) (2024-03-28)

### Bug Fixes

* Set text colour on dropdown menu for Custom Value ([966796d](966796dfec)), closes [#1584](https://github.com/ReVanced/revanced-manager/issues/1584)
2024-03-28 05:35:25 +00:00
Pun Butrach
9a66357f7a refactor: slight format change
This is so unreadable, there must've been a better way to do this.
2024-03-28 05:26:35 +00:00
Pun Butrach
63d83a43ad chore: Remove unused en_US file
This file contains absolulely nothing, whereabout: Unknown.
2024-03-28 05:20:32 +00:00
Pun Butrach
7833a0d552 build: Switch flutter_background to official sources
https://github.com/JulianAssmann/flutter_background/pull/79 is merged.
2024-03-28 05:17:49 +00:00
Pun Butrach
966796dfec fix: Set text colour on dropdown menu for Custom Value
This fix #1584 and a continuation of acb1e2434b

Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2024-03-28 05:15:02 +00:00
semantic-release-bot
2d19f36901 chore(release): 1.19.4-dev.3 [skip ci]
## [1.19.4-dev.3](https://github.com/ReVanced/revanced-manager/compare/v1.19.4-dev.2...v1.19.4-dev.3) (2024-03-28)

### Bug Fixes

* Replace Spacer with Expanded to avoid overflow ([#1791](https://github.com/ReVanced/revanced-manager/issues/1791)) ([6f70a07](6f70a07970))
2024-03-28 04:45:28 +00:00
Pun Butrach
6f70a07970 fix: Replace Spacer with Expanded to avoid overflow (#1791) 2024-03-28 11:38:07 +07:00
Pun Butrach
e85ed5a8e3 build: Bump language_code to v0.4.2
This fix #1714 regarding country name of es-AR (Argentina) does not exist.

Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2024-03-28 04:06:52 +00:00
Ushie
ad416387c2 ci(Crowdin): Specify bundle to download 2024-03-28 02:02:55 +03:00
kitadai31
58d8e7f34f build: Bump dependencies (#1796) 2024-03-27 13:46:37 +01:00
Pun Butrach
bb105b5662 chore(Branding): Update ReVanced Logo name (#1794) 2024-03-27 17:33:42 +07:00
semantic-release-bot
a71a930125 chore(release): 1.19.4-dev.2 [skip ci]
## [1.19.4-dev.2](https://github.com/ReVanced/revanced-manager/compare/v1.19.4-dev.1...v1.19.4-dev.2) (2024-03-23)

### Bug Fixes

* Ensure safe area usage in Changelogs Modal Bottom Sheet ([#1772](https://github.com/ReVanced/revanced-manager/issues/1772)) ([c981cb4](c981cb4a41))
2024-03-23 11:03:27 +00:00
github-actions[bot]
af7e39b7f0 chore(i18n): Sync translations (#1719)
Co-authored-by: revanced-bot <github@revanced.app>
2024-03-23 17:55:11 +07:00
DMzS
c981cb4a41 fix: Ensure safe area usage in Changelogs Modal Bottom Sheet (#1772) 2024-03-23 17:51:17 +07:00
Pun Butrach
3ea6ef0bbf ci(Dependabot): Add Gradle ecosystem to RVM Flutter 2024-03-22 04:54:57 +00:00
Pun Butrach
2772a96727 docs(Build): Shorten build_runner args 2024-03-22 04:41:34 +00:00
oSumAtrIX
50b4a5f1d8 ci: Fix PR build success message 2024-03-18 11:51:07 +01:00
semantic-release-bot
e52a6ce734 chore(release): 1.19.4-dev.1 [skip ci]
## [1.19.4-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.19.3...v1.19.4-dev.1) (2024-03-17)

### Bug Fixes

* Pre-releases changelog being shown ([#1767](https://github.com/ReVanced/revanced-manager/issues/1767)) ([add49e1](add49e14fb))
2024-03-17 17:22:14 +00:00
aAbed
add49e14fb fix: Pre-releases changelog being shown (#1767) 2024-03-17 10:14:22 -07:00
Pun Butrach
ab13895196 docs(Security): Improve badges' accessibility
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2024-03-11 15:05:40 +07:00
Pun Butrach
846afb420b ci(PR Sync): Use revanced-bot acount
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2024-03-11 14:59:29 +07:00
Pun Butrach
dca8a1dab6 ci(Crowdin): Add workflow change to trigger event
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2024-03-11 14:49:46 +07:00
Pun Butrach
d1c36c1bcc ci(Crowdin): Improve configuration of the workflow
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2024-03-11 14:49:13 +07:00
semantic-release-bot
c209c32613 chore(release): 1.19.3 [skip ci]
## [1.19.3](https://github.com/ReVanced/revanced-manager/compare/v1.19.2...v1.19.3) (2024-03-09)

### Bug Fixes

* Copy APK to working directory before trying to write to it ([5cd1cba](5cd1cba668))
2024-03-09 09:16:08 +00:00
oSumAtrIX
9e5e89ac95 chore: Merge branch dev to main (#1756) 2024-03-09 10:09:13 +01:00
semantic-release-bot
7cc6b88e4e chore(release): 1.19.3-dev.1 [skip ci]
## [1.19.3-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.19.2...v1.19.3-dev.1) (2024-03-09)

### Bug Fixes

* Copy APK to working directory before trying to write to it ([5cd1cba](5cd1cba668))
2024-03-09 09:09:02 +00:00
oSumAtrIX
5cd1cba668 fix: Copy APK to working directory before trying to write to it 2024-03-09 10:01:36 +01:00
oSumAtrIX
ca365bac6e build: Bump dependencies to fix generating keystore 2024-03-09 09:58:41 +01:00
semantic-release-bot
f1fc48ce5a chore(release): 1.19.2 [skip ci]
## [1.19.2](https://github.com/ReVanced/revanced-manager/compare/v1.19.1...v1.19.2) (2024-03-09)

### Bug Fixes

* App list is empty if all apps are installed ([#1750](https://github.com/ReVanced/revanced-manager/issues/1750)) ([1f5461f](1f5461fbe5))
* Fix white-screen when trying to install conflicting apps ([4acd738](4acd738353))
2024-03-09 03:55:35 +00:00
oSumAtrIX
316e440d0d chore: Merge branch dev to main (#1739) 2024-03-09 04:48:12 +01:00
oSumAtrIX
95018814a7 ci: Bump dependencies to fix release workflow 2024-03-09 04:44:38 +01:00
oSumAtrIX
b52e49d90a build: Bump dependencies to fix signing issues 2024-03-09 04:39:58 +01:00
oSumAtrIX
4acd738353 fix: Fix white-screen when trying to install conflicting apps
When you tried to install a patched app, but it conflicted with an existing installation, the screen would go blank. This was caused by trying to use an argument on a translation with no arguments.
2024-03-09 04:39:58 +01:00
semantic-release-bot
982249f974 chore(release): 1.19.2-dev.1 [skip ci]
## [1.19.2-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.19.1...v1.19.2-dev.1) (2024-03-08)

### Bug Fixes

* App list is empty if all apps are installed ([#1750](https://github.com/ReVanced/revanced-manager/issues/1750)) ([1f5461f](1f5461fbe5))
2024-03-08 14:49:35 +00:00
Nikita
1f5461fbe5 fix: App list is empty if all apps are installed (#1750)
Co-authored-by: Nikita <n.petrjakov@niitp.in>
2024-03-08 21:41:16 +07:00
oSumAtrIX
adb7e5663a docs: Fix small mistakes [skip ci] 2024-03-05 14:58:11 +01:00
Benjamin
ffc14f2146 chore: Upgrade dependencies (#1734) 2024-03-05 14:09:02 +07:00
semantic-release-bot
0c57322051 chore(release): 1.19.1 [skip ci]
## [1.19.1](https://github.com/ReVanced/revanced-manager/compare/v1.19.0...v1.19.1) (2024-03-05)

### Bug Fixes

* Keep names for needed classes to fix crash at launch ([eef7016](eef701615b))
2024-03-05 02:29:37 +00:00
oSumAtrIX
a8b7debf8d chore: Merge branch dev to main (#1729) 2024-03-05 03:22:11 +01:00
oSumAtrIX
7ed9787b58 ci: Add workflow to open a PR to main 2024-03-05 03:21:07 +01:00
oSumAtrIX
eef701615b fix: Keep names for needed classes to fix crash at launch 2024-03-05 03:19:20 +01:00
semantic-release-bot
97d8519b8b chore(release): 1.19.0 [skip ci]
# [1.19.0](https://github.com/ReVanced/revanced-manager/compare/v1.18.0...v1.19.0) (2024-03-05)

### Bug Fixes

* added a trailing comma ([975180b](975180b075))
* adjust padding ([3559477](3559477247))
* Allow mounting without Magisk ([3f96608](3f96608398))
* Bump dependencies to support BCS keystore ([6ec6546](6ec6546cc5))
* Do not delete files from post-fs-data.d ([70a1086](70a1086edf))
* Fix patched APKs exports after installation ([1200360](1200360588))
* fix redundant buttons on dialog ([079c0de](079c0defaf))
* Incorrect strings and logics ([#1619](https://github.com/ReVanced/revanced-manager/issues/1619)) ([4f22e88](4f22e88e42))
* **Keystore Password:** textfield title display ([8e52abd](8e52abda9a))
* Mount script causes build to fail ([#1613](https://github.com/ReVanced/revanced-manager/issues/1613)) ([f3c78c2](f3c78c2c24))
* **Patch Option:** Set text colour on dropdown menu ([acb1e24](acb1e2434b))
* **PopScope:** User able to exit patch screen when the installer is still running ([#1663](https://github.com/ReVanced/revanced-manager/issues/1663)) ([eb6d3cd](eb6d3cd64e))
* **Release CI:** truncate the "v" from version ([8595099](85950991ab))
* Show version label correctly ([c72d10a](c72d10ac85))
* Specify that dark theme is dark ([#1699](https://github.com/ReVanced/revanced-manager/issues/1699)) ([d4b15ae](d4b15aee4d))
* Stop patch when signing fails ([#1553](https://github.com/ReVanced/revanced-manager/issues/1553)) ([5b2c551](5b2c55142e))
* **Update Confirmation Sheet:** Add top padding ([9aeb156](9aeb156d92))
* Use correct title size for bottom sheet ([#1687](https://github.com/ReVanced/revanced-manager/issues/1687)) ([3436523](34365239c1))
* Use correct version code & name ([#1647](https://github.com/ReVanced/revanced-manager/issues/1647)) ([d933997](d933997c89))
* use lowercase repo names ([#1626](https://github.com/ReVanced/revanced-manager/issues/1626)) ([edd8602](edd86024b9))

### Features

* Add a toggle for alternative sources ([#1686](https://github.com/ReVanced/revanced-manager/issues/1686)) ([f89c742](f89c742c90))
* Add API migration code ([#1615](https://github.com/ReVanced/revanced-manager/issues/1615)) ([28ae276](28ae2766f0))
* add haptic feedback ([#1459](https://github.com/ReVanced/revanced-manager/issues/1459)) ([7911459](7911459817))
* Allow changing languages ([#1488](https://github.com/ReVanced/revanced-manager/issues/1488)) ([f82c439](f82c439b26))
* Display current app language at the top of the list ([aa0575a](aa0575a637))
* Hide the Install button during installation ([#1633](https://github.com/ReVanced/revanced-manager/issues/1633)) ([3e696d6](3e696d6847))
* Improve app selector and patcher UI ([#1616](https://github.com/ReVanced/revanced-manager/issues/1616)) ([efb2d5e](efb2d5ef32))
* Improve consistency on language selector ([b2119ce](b2119ce60e))
* Improve language distinguishness and resolve language-specific issues ([#1706](https://github.com/ReVanced/revanced-manager/issues/1706)) ([6d866d4](6d866d4424))
* Improve Split APK warning readability ([#1625](https://github.com/ReVanced/revanced-manager/issues/1625)) ([6fd740f](6fd740f8c0))
* Show a dialog when an update is available ([#1654](https://github.com/ReVanced/revanced-manager/issues/1654)) ([c7d975e](c7d975e612))
* Simplify settings strings ([#1618](https://github.com/ReVanced/revanced-manager/issues/1618)) ([0d45fe4](0d45fe4a97))
* Use more appropriate progress values ([2d7026a](2d7026ac7a))
* use native TextField ([9ed43ef](9ed43efe5d))

### Performance Improvements

* Load patched apps as soon as possible ([c94eb7a](c94eb7a48e))

### Reverts

* WillPopScope migration ([3b0fed5](3b0fed55e4))
2024-03-05 01:57:21 +00:00
oSumAtrIX
00210f7f0e chore: Workaround CI bug by setting the expected version 2024-03-05 02:49:42 +01:00
Pun Butrach
cea4c6c27a chore: Merge dev to main (#1611)
100 commits 
2024-03-05 07:48:42 +07:00
semantic-release-bot
bc83a39b0f chore(release): 1.19.0-dev.21 [skip ci]
# [1.19.0-dev.21](https://github.com/ReVanced/revanced-manager/compare/v1.19.0-dev.20...v1.19.0-dev.21) (2024-03-05)

### Features

* Display current app language at the top of the list ([aa0575a](aa0575a637))
2024-03-05 00:12:19 +00:00
Ushie
aa0575a637 feat: Display current app language at the top of the list 2024-03-05 03:04:01 +03:00
semantic-release-bot
4ca7b8a7c1 chore(release): 1.19.0-dev.20 [skip ci]
# [1.19.0-dev.20](https://github.com/ReVanced/revanced-manager/compare/v1.19.0-dev.19...v1.19.0-dev.20) (2024-03-04)

### Bug Fixes

* Bump dependencies to support BCS keystore ([6ec6546](6ec6546cc5))
2024-03-04 14:56:19 +00:00
oSumAtrIX
6ec6546cc5 fix: Bump dependencies to support BCS keystore 2024-03-04 15:48:13 +01:00
oSumAtrIX
c5e04cc824 build: Bump dependencies 2024-03-04 13:53:33 +01:00
semantic-release-bot
4fc913eae1 chore(release): 1.19.0-dev.19 [skip ci]
# [1.19.0-dev.19](https://github.com/ReVanced/revanced-manager/compare/v1.19.0-dev.18...v1.19.0-dev.19) (2024-03-04)

### Bug Fixes

* Fix patched APKs exports after installation ([1200360](1200360588))

### Features

* Use more appropriate progress values ([2d7026a](2d7026ac7a))
2024-03-04 12:51:06 +00:00
oSumAtrIX
2d7026ac7a feat: Use more appropriate progress values 2024-03-04 13:43:35 +01:00
oSumAtrIX
1200360588 fix: Fix patched APKs exports after installation 2024-03-04 13:43:34 +01:00
semantic-release-bot
02722fc0be chore(release): 1.19.0-dev.18 [skip ci]
# [1.19.0-dev.18](https://github.com/ReVanced/revanced-manager/compare/v1.19.0-dev.17...v1.19.0-dev.18) (2024-03-04)
2024-03-04 12:25:39 +00:00
oSumAtrIX
2e1de94623 chore: Fix builds 2024-03-04 13:14:30 +01:00
oSumAtrIX
10bae69db6 build(Needs bump): Bump dependencies (#1717) 2024-03-04 12:47:38 +01:00
oSumAtrIX
6dee3aa1b7 docs: Fix consistency issues with other repositories (#1707) 2024-03-04 12:42:46 +01:00
github-actions[bot]
e76418d48d chore: Sync translations (#1701) 2024-03-04 11:28:34 +01:00
Pun Butrach
52e1020a90 chore(Dependency): Switch language_code back to Upstream version 2024-03-04 13:31:51 +07:00
Pun Butrach
c170392123 ci(Release): Use ReVanced account instead of semantic-release 2024-03-04 11:51:54 +07:00
Benjamin
d414a91f40 ci: Match changelog format of other ReVanced repos (#1705) 2024-02-26 03:01:30 +01:00
semantic-release-bot
6d6fae1ecd chore(release): 1.19.0-dev.17 [skip ci]
## Features
* Improve language distinguishness and resolve language-specific issues (#1706) ([Ushie](6d866d4424))
2024-02-26 01:15:28 +00:00
Ushie
6d866d4424 feat: Improve language distinguishness and resolve language-specific issues (#1706) 2024-02-26 08:08:14 +07:00
semantic-release-bot
f4dea6e58c chore(release): 1.19.0-dev.16 [skip ci]
## Features
* Hide the Install button during installation (#1633) ([Eray Erdin (&mut self)](3e696d6847))
## Bug Fixes
* Show version label correctly ([oSumAtrIX](c72d10ac85))
2024-02-25 20:57:07 +00:00
oSumAtrIX
c72d10ac85 fix: Show version label correctly 2024-02-25 21:49:38 +01:00
Eray Erdin (&mut self)
3e696d6847 feat: Hide the Install button during installation (#1633)
Co-authored-by: Ushie <ushiekane@gmail.com>
2024-02-25 23:48:52 +03:00
semantic-release-bot
28d6ab692e chore(release): 1.19.0-dev.15 [skip ci]
## Bug Fixes
* Specify that dark theme is dark (#1699) ([Benjamin](d4b15aee4d))
## Documentation
* Switch order of note and tip [skip ci] ([oSumAtrIX](d0689555f1))
## Continuous Integration
* **Release:** Remove unnecessary upload (#1695) ([Benjamin](82d6e3f105))
## Chores
* **i18n:** Sync translations (#1694) ([github-actions[bot]](f7747809f2))
2024-02-25 02:50:24 +00:00
github-actions[bot]
f7747809f2 chore(i18n): Sync translations (#1694)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: revanced-bot <github@revanced.app>
2024-02-25 09:42:15 +07:00
Benjamin
d4b15aee4d fix: Specify that dark theme is dark (#1699) 2024-02-25 09:37:55 +07:00
oSumAtrIX
d0689555f1 docs: Switch order of note and tip [skip ci] 2024-02-25 01:01:00 +01:00
Benjamin
82d6e3f105 ci(Release): Remove unnecessary upload (#1695) 2024-02-20 06:41:03 +07:00
semantic-release-bot
244d078b11 chore(release): 1.19.0-dev.14 [skip ci]
## Features
* Add a toggle for alternative sources (#1686) ([aAbed](f89c742c90))
2024-02-19 14:49:04 +00:00
aAbed
f89c742c90 feat: Add a toggle for alternative sources (#1686)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-02-19 20:26:42 +05:45
semantic-release-bot
ce5088ab53 chore(release): 1.19.0-dev.13 [skip ci]
## Chores
* **i18n:** Sync translations (#1688) ([github-actions[bot]](0443c8c200))
* Upgrade dependencies (#1693) ([Benjamin](8a4161753e))
2024-02-18 22:40:36 +00:00
github-actions[bot]
0443c8c200 chore(i18n): Sync translations (#1688)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: revanced-bot <github@revanced.app>
2024-02-19 05:33:11 +07:00
Benjamin
8a4161753e chore: Upgrade dependencies (#1693) 2024-02-19 05:31:24 +07:00
semantic-release-bot
f2e7071f6d chore(release): 1.19.0-dev.12 [skip ci]
## Documentation
* Add a tip for the prompt to select an APK from storage ([oSumAtrIX](bfe59ea57a))
* Adjust footnote regarding obtaining APK files ([oSumAtrIX](f5ba84d81e))
* Use consistent wording ([oSumAtrIX](933c71923e))
## Code Refactoring
* PopScope Migration (#1674) ([Pun Butrach](3b58d229da))
## Continuous Integration
* Dependabot (#1692) ([Benjamin](25d53ce9a8))
2024-02-18 22:05:57 +00:00
Benjamin
25d53ce9a8 ci: Dependabot (#1692)
And accept more commit.

Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2024-02-19 04:58:29 +07:00
Pun Butrach
3b58d229da refactor: PopScope Migration (#1674)
Co-authored-by: Benjamin Halko <benjaminhalko@hotmail.com>
2024-02-18 08:32:32 +07:00
oSumAtrIX
f5ba84d81e docs: Adjust footnote regarding obtaining APK files 2024-02-15 19:03:35 +01:00
oSumAtrIX
933c71923e docs: Use consistent wording 2024-02-15 18:55:54 +01:00
oSumAtrIX
bfe59ea57a docs: Add a tip for the prompt to select an APK from storage 2024-02-15 18:54:32 +01:00
semantic-release-bot
953209ca13 chore(release): 1.19.0-dev.11 [skip ci]
## Features
* Improve consistency on language selector ([Pun Butrach](b2119ce60e))
## Code Refactoring
* Check-in pubspec.lock ([Pun Butrach](5a24911fad))
## Build System
* Bump Gradle to v8.6 ([Pun Butrach](f57898a471))
* Enable ProGuard (#1650) ([kitadai31](b754a045eb))
## Continuous Integration
* **build:** Upload build artifact ([Pun Butrach](e0c750d27e))
## Chores
* Update .gitignore ([Pun Butrach](0ec6897fda))
2024-02-15 09:48:29 +00:00
Pun Butrach
b2119ce60e feat: Improve consistency on language selector 2024-02-15 16:41:09 +07:00
Pun Butrach
e0c750d27e ci(build): Upload build artifact 2024-02-15 16:31:19 +07:00
kitadai31
b754a045eb build: Enable ProGuard (#1650) 2024-02-15 16:24:24 +07:00
Pun Butrach
5a24911fad refactor: Check-in pubspec.lock 2024-02-15 08:17:11 +00:00
Pun Butrach
0ec6897fda chore: Update .gitignore 2024-02-15 08:17:10 +00:00
Pun Butrach
f57898a471 build: Bump Gradle to v8.6 2024-02-15 08:17:10 +00:00
semantic-release-bot
3ee29c2256 chore(release): 1.19.0-dev.10 [skip ci]
## Chores
* **i18n:** Sync translations (#1685) ([github-actions[bot]](31a32eb11d))
## Reverts
* WillPopScope migration ([Pun Butrach](3b0fed55e4))
2024-02-15 08:08:25 +00:00
Pun Butrach
3b0fed55e4 revert: WillPopScope migration
This reverts commit ef9b1d5c2d.

Why is this so hard to implement??? Are we missing something??
2024-02-15 08:00:52 +00:00
github-actions[bot]
31a32eb11d chore(i18n): Sync translations (#1685)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: revanced-bot <github@revanced.app>
2024-02-13 13:26:08 +07:00
semantic-release-bot
64c10b44f5 chore(release): 1.19.0-dev.9 [skip ci]
## Bug Fixes
* Use correct title size for bottom sheet (#1687) ([oSumAtrIX](34365239c1))
2024-02-12 19:55:06 +00:00
oSumAtrIX
34365239c1 fix: Use correct title size for bottom sheet (#1687)
Co-authored-by: aAbed <aabedhkhan@gmail.com>
2024-02-12 20:46:58 +01:00
semantic-release-bot
bdfeda23b6 chore(release): 1.19.0-dev.8 [skip ci]
## Features
* Allow changing languages (#1488) ([Ushie](f82c439b26))
## Chores
* **i18n:** Sync translations (#1671) ([github-actions[bot]](f5578b0fc1))
* update dependencies ([Benjamin Halko](1aaeac1fe3))
2024-02-12 17:39:10 +00:00
Benjamin Halko
1aaeac1fe3 chore: update dependencies 2024-02-13 09:31:23 -08:00
github-actions[bot]
f5578b0fc1 chore(i18n): Sync translations (#1671) 2024-02-12 02:25:59 +03:00
Ushie
f82c439b26 feat: Allow changing languages (#1488)
Co-authored-by: validcube <pun.butrach@gmail.com>
2024-02-12 02:22:25 +03:00
semantic-release-bot
c498cff096 chore(release): 1.19.0-dev.7 [skip ci]
## Bug Fixes
* adjust padding ([aAbed](3559477247))
## Documentation
* **Security:** Format badges ([Pun Butrach](b9241fa1b2))
2024-02-06 15:14:29 +00:00
aAbed
3559477247 fix: adjust padding 2024-02-06 20:52:19 +05:45
Pun Butrach
b9241fa1b2 docs(Security): Format badges 2024-02-03 08:16:33 +00:00
semantic-release-bot
9bf5153e6b chore(release): 1.19.0-dev.6 [skip ci]
## Bug Fixes
* **PopScope:** User able to exit patch screen when the installer is still running (#1663) ([Benjamin](eb6d3cd64e))
## Code Refactoring
* Disable update for dev build (#1662) ([Benjamin](c900d09cf8))
## Continuous Integration
* Add scope to changelog (#1672) ([Benjamin](8cda2c164d))
2024-02-03 03:36:47 +00:00
Benjamin
eb6d3cd64e fix(PopScope): User able to exit patch screen when the installer is still running (#1663) 2024-02-03 10:29:34 +07:00
Benjamin
8cda2c164d ci: Add scope to changelog (#1672) 2024-02-03 09:02:53 +07:00
Benjamin
c900d09cf8 refactor: Disable update for dev build (#1662) 2024-02-02 21:12:10 +07:00
semantic-release-bot
edc8ef4f44 chore(release): 1.19.0-dev.5 [skip ci]
## Bug Fixes
* Add top padding ([Pun Butrach](9aeb156d92))
2024-02-02 13:12:37 +00:00
Pun Butrach
9aeb156d92 fix(Update Confirmation Sheet): Add top padding
Before the "Changelog" or homeView.updateChangelogTitle was almost at the edge of the [DraggableScrollableSheet]

We fix it by adding 12px padding off the top, 12px was chosen because [bottom] padding is using 12px so it would make sense for [top] to be using 12px.
2024-02-02 13:05:15 +00:00
Pun Butrach
8be07de373 ci(release): Migrate deprecated Node version 2024-02-02 11:38:53 +07:00
semantic-release-bot
93482b0041 chore(release): 1.19.0-dev.4 [skip ci]
## Bug Fixes
* Stop patch when signing fails ([#1553](https://github.com/ReVanced/revanced-manager/issues/1553)) ([kitadai31](5b2c55142e))
2024-02-02 00:02:38 +00:00
kitadai31
5b2c55142e fix: Stop patch when signing fails (#1553) 2024-02-02 00:55:18 +01:00
Benjamin
088a3b7c28 ci: Improve build workflow (#1668) 2024-02-01 08:57:15 +07:00
semantic-release-bot
b115643034 chore(release): 1.19.0-dev.3 [skip ci]
# [1.19.0-dev.3](https://github.com/ReVanced/revanced-manager/compare/v1.19.0-dev.2...v1.19.0-dev.3) (2024-01-29)

### Bug Fixes

* Do not delete files from post-fs-data.d ([70a1086](70a1086edf))

### Features

* Show a dialog when an update is available ([#1654](https://github.com/ReVanced/revanced-manager/issues/1654)) ([c7d975e](c7d975e612))
2024-01-29 10:19:31 +00:00
Benjamin
07fc964f9c ci: Specify paths in release workflow (#1664) 2024-01-29 11:11:42 +01:00
Pun Butrach
3e51caf111 docs(Security): Avoid table shifting layout 2024-01-29 11:11:42 +01:00
Pun Butrach
deb1ba339f docs(Security): Use dynamic information on version
Meanwhile latest get the static treatment.
2024-01-29 11:11:42 +01:00
aAbed
70a1086edf fix: Do not delete files from post-fs-data.d 2024-01-27 09:08:44 +05:45
aAbed
c7d975e612 feat: Show a dialog when an update is available (#1654) 2024-01-27 09:08:44 +05:45
semantic-release-bot
7104d6d6dd chore(release): 1.19.0-dev.2 [skip ci]
# [1.19.0-dev.2](https://github.com/ReVanced/revanced-manager/compare/v1.19.0-dev.1...v1.19.0-dev.2) (2024-01-22)

### Bug Fixes

* Use correct version code & name ([#1647](https://github.com/ReVanced/revanced-manager/issues/1647)) ([d933997](d933997c89))
2024-01-22 22:34:38 +00:00
Benjamin
d933997c89 fix: Use correct version code & name (#1647) 2024-01-23 05:27:33 +07:00
semantic-release-bot
bea99bb4c6 chore(release): 1.19.0-dev.1 [skip ci]
# [1.19.0-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.18.0...v1.19.0-dev.1) (2024-01-22)

### Bug Fixes

* added a trailing comma ([975180b](975180b075))
* Allow mounting without Magisk ([3f96608](3f96608398))
* fix redundant buttons on dialog ([079c0de](079c0defaf))
* Incorrect strings and logics ([#1619](https://github.com/ReVanced/revanced-manager/issues/1619)) ([4f22e88](4f22e88e42))
* **Keystore Password:** textfield title display ([8e52abd](8e52abda9a))
* Mount script causes build to fail ([#1613](https://github.com/ReVanced/revanced-manager/issues/1613)) ([f3c78c2](f3c78c2c24))
* **Patch Option:** Set text colour on dropdown menu ([acb1e24](acb1e2434b))
* **Release CI:** truncate the "v" from version ([8595099](85950991ab))
* use lowercase repo names ([#1626](https://github.com/ReVanced/revanced-manager/issues/1626)) ([edd8602](edd86024b9))

### Features

* Add API migration code ([#1615](https://github.com/ReVanced/revanced-manager/issues/1615)) ([28ae276](28ae2766f0))
* add haptic feedback ([#1459](https://github.com/ReVanced/revanced-manager/issues/1459)) ([7911459](7911459817))
* Improve app selector and patcher UI ([#1616](https://github.com/ReVanced/revanced-manager/issues/1616)) ([efb2d5e](efb2d5ef32))
* Improve Split APK warning readability ([#1625](https://github.com/ReVanced/revanced-manager/issues/1625)) ([6fd740f](6fd740f8c0))
* Simplify settings strings ([#1618](https://github.com/ReVanced/revanced-manager/issues/1618)) ([0d45fe4](0d45fe4a97))
* use native TextField ([9ed43ef](9ed43efe5d))

### Performance Improvements

* Load patched apps as soon as possible ([c94eb7a](c94eb7a48e))
2024-01-22 11:41:51 +00:00
Pun Butrach
f38a593434 ci(Release Build): Use correct syntax in getting the version 2024-01-22 18:34:35 +07:00
Pun Butrach
85950991ab fix(Release CI): truncate the "v" from version
ci: cleanup

force push soon™️
2024-01-22 18:30:16 +07:00
Osama Tahir
6fd740f8c0 feat: Improve Split APK warning readability (#1625)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2024-01-22 12:20:09 +01:00
Benjamin
ec2c2d8ccb ci: Build pre-release versions (#1606) 2024-01-22 09:29:57 +01:00
oSumAtrIX
efb2d5ef32 feat: Improve app selector and patcher UI (#1616) 2024-01-22 09:20:17 +01:00
validcube
acb1e2434b fix(Patch Option): Set text colour on dropdown menu
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-01-21 20:36:23 +07:00
validcube
8e52abda9a fix(Keystore Password): textfield title display
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-01-21 16:58:00 +07:00
validcube
9764326242 chore(patch_item): Remove import directive
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-01-21 15:15:37 +07:00
validcube
97c33d6c54 chore: Remove deprecated lint rules
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-01-21 15:10:03 +07:00
Pun Butrach
30d5f3ad3f docs(security): Prepare for v1.19.0 2024-01-21 15:02:52 +07:00
validcube
079c0defaf fix: fix redundant buttons on dialog
Signed-off-by: validcube <pun.butrach@gmail.com>
2024-01-21 14:45:25 +07:00
Benjamin
cf1afddb9e chore: remove unused dependencies (#1603) 2024-01-21 14:07:30 +07:00
Pun Butrach
b07b9351c4 docs(security): init (#1599)
Co-authored-by: Ax333l <main@axelen.xyz>
2024-01-21 13:59:57 +07:00
Benjamin
7911459817 feat: add haptic feedback (#1459)
Co-authored-by: Ushie <ushiekane@gmail.com>
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2024-01-14 14:29:24 -08:00
Benjamin
ef9b1d5c2d refactor: Replace deprecated WillPopScope (#1604) 2024-01-13 19:34:04 -08:00
Benjamin Halko
fd2780624a chore: remove unused import 2024-01-12 09:49:26 -08:00
aAbed
4f22e88e42 fix: Incorrect strings and logics (#1619) 2024-01-12 05:15:37 +07:00
oSumAtrIX
0d45fe4a97 feat: Simplify settings strings (#1618) 2024-01-09 20:23:54 +01:00
oSumAtrIX
28ae2766f0 feat: Add API migration code (#1615) 2024-01-09 20:23:26 +01:00
Benjamin
edd86024b9 fix: use lowercase repo names (#1626) 2024-01-09 05:07:18 +07:00
Benjamin
f3c78c2c24 fix: Mount script causes build to fail (#1613) 2024-01-01 00:32:57 +03:00
Ushie
3f96608398 fix: Allow mounting without Magisk 2023-12-31 03:32:04 +03:00
validcube
9ed43efe5d feat: use native TextField
Signed-off-by: validcube <pun.butrach@gmail.com>
2023-12-30 14:37:46 +07:00
Benjamin Halko
975180b075 fix: added a trailing comma 2023-12-28 13:17:25 -08:00
oSumAtrIX
c94eb7a48e perf: Load patched apps as soon as possible 2023-12-24 00:12:33 +01:00
oSumAtrIX
bb1b0da749 chore: merge dev to main (#1573) 2023-12-23 22:43:10 +01:00
oSumAtrIX
85c8006977 build: Bump version to v1.18.0 2023-12-23 22:20:32 +01:00
oSumAtrIX
850bdc4a4d fix: Reset progress if patch was cancelled 2023-12-23 22:19:56 +01:00
oSumAtrIX
ca95e32164 chore: Ignore autogenerated project file 2023-12-23 22:14:44 +01:00
oSumAtrIX
a141ec85b0 fix: Correct update message 2023-12-23 22:11:38 +01:00
oSumAtrIX
1298a96b0e fix: Update the progress properly until installation finishes successfully 2023-12-23 22:10:22 +01:00
oSumAtrIX
1928b150ad fix: Use correct installation type labels 2023-12-23 22:10:22 +01:00
oSumAtrIX
7426f5484d fix: Update home screen after installation 2023-12-23 21:58:53 +01:00
oSumAtrIX
11a8f313b0 feat: Clarify non root installation button 2023-12-23 21:46:58 +01:00
oSumAtrIX
69b6ef07a1 feat: Improve dialog text clarity 2023-12-23 21:36:47 +01:00
oSumAtrIX
7a1ba9dabf fix: Add missing confirmation dialog 2023-12-23 21:11:24 +01:00
oSumAtrIX
48a739c94e refactor: Simplify uninstallApp code 2023-12-23 20:53:51 +01:00
oSumAtrIX
9680f0cf12 refactor: Remove unnecessary quotation marks 2023-12-23 20:53:31 +01:00
oSumAtrIX
5b1c89a0c5 perf: Reduce amount of shell commands 2023-12-23 20:52:52 +01:00
oSumAtrIX
8a1ab478a3 fix: Prevent crash by escaping string correctly 2023-12-23 20:52:52 +01:00
Benjamin
2ae8d49526 fix: exported logs patch selection (#1535)
Co-authored-by: validcube <pun.butrach@gmail.com>
2023-12-23 11:29:36 +07:00
validcube
a0b673c138 refactor: apply suggestions from analyser
Signed-off-by: validcube <pun.butrach@gmail.com>
2023-12-23 10:47:12 +07:00
validcube
c56c445fb7 fix: migration latest changes to native buttons
Signed-off-by: validcube <pun.butrach@gmail.com>
2023-12-23 10:36:59 +07:00
aAbed
c23275f2fe feat: Improve installation robustness (#1528)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
Co-authored-by: Ushie <ushiekane@gmail.com>
Co-authored-by: Dhruvan Bhalara <53393418+dhruvanbhalara@users.noreply.github.com>
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2023-12-23 10:16:28 +07:00
Pun Butrach
8b28a33b73 ci(security): resolve arbitrary code execution 2023-12-22 20:39:21 +07:00
Pun Butrach
f8d086a743 feat: dialogs correctly follows Material 3 specifications (#1560)
Signed-off-by: validcube <pun.butrach@gmail.com>
2023-12-22 20:34:03 +07:00
Radon Rosborough
c06d15de5f docs: Improve troubleshooting solutions (#1543)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-12-22 05:50:10 +01:00
validcube
dcaf1f54e4 build(gradle): bump Gradle to v8.5
Signed-off-by: validcube <pun.butrach@gmail.com>
2023-12-17 20:16:46 +07:00
festry0
aa91abb022 docs(readme): Correct grammar mistake (#1569) 2023-12-16 10:40:50 +07:00
Ushie
67d204eb02 build: Bump version to v1.17.3 2023-12-12 08:22:10 +03:00
aAbed
18e680b298 fix: Unable to unselect new patches 2023-12-12 10:37:35 +05:45
Benjamin Halko
6ef1b072e8 build: Bump version to v1.17.2 2023-12-11 18:27:19 -08:00
Benjamin
ca9ef544ce chore: merge dev to main (#1545) 2023-12-11 18:23:08 -08:00
oSumAtrIX
7831a3438d fix: Include new patches that are used by default 2023-12-12 02:32:57 +01:00
oSumAtrIX
1fad90441c perf: Use hashset for fast comparison 2023-12-12 02:32:45 +01:00
validcube
7f26c5bd45 revert: "feat: improve predictive back (#1487)"
This reverts commit 06ff36c836.

Signed-off-by: validcube <pun.butrach@gmail.com>
2023-12-11 19:02:13 +07:00
Pun Butrach
637641cf54 feat: output suggested version into patch log (#1557)
Signed-off-by: validcube <pun.butrach@gmail.com>
2023-12-11 11:26:52 +07:00
Pun Butrach
d9a316abbb docs(contributing): update branding 2023-12-09 11:49:19 +07:00
Pun Butrach
093cfa5269 docs(contributing): use correct semantic 2023-12-09 11:48:20 +07:00
Pun Butrach
61a025de4d docs: correct styling issue 2023-12-09 11:47:26 +07:00
Dhruvan Bhalara
7df1ae7ed8 feat: append patch version to the APK name while sharing/exporting (#1547) 2023-12-05 12:58:32 +05:45
Pun Butrach
eb6e75b156 ci: use migrate setup-java to Node 20 (#1542) 2023-12-05 09:43:04 +07:00
validcube
8480b3ac3d chore: update repository's owner name 2023-12-02 17:39:02 +07:00
validcube
6339a31fec build(dart-dependency): bump FlutterToast to v8.2.4 2023-12-02 17:35:35 +07:00
validcube
71b5bb3f8f build(dart-dependency): prefer immutable for dependency using git 2023-12-02 17:33:42 +07:00
Ushie
a9878dbbdf chore: Merge dev to main (#1544) 2023-12-02 03:46:17 +03:00
Ushie
b1fb9dd7d3 build: Bump version to v1.17.1 2023-12-02 03:44:51 +03:00
Dhruvan Bhalara
de51fbd7be fix: Incorrect duplicate filename handling when exporting files (#1541) 2023-12-01 20:31:46 +05:45
Ax333l
c9412a97d0 build(dependency): Bump patcher to 19.1.0 2023-12-01 13:22:38 +01:00
Ushie
63c29bdd75 chore: Merge dev to main (#1529) 2023-11-27 11:06:43 +03:00
Ushie
bace26063d build: Bump version to v1.17.0 2023-11-27 11:05:56 +03:00
Benjamin
7931eb97b9 feat: updated logs (#1526) 2023-11-25 17:06:18 -08:00
aAbed
9df89c7b74 fix: Disable wakelock when patching is canceled (#1514) 2023-11-22 16:21:27 +03:00
aAbed
78978276c4 fix(App Selector): Unable to select APK from storage when asked to (#1513) 2023-11-22 16:20:51 +03:00
Ushie
011eddbbc5 chore: Merge dev to main (#1478) 2023-11-21 17:37:40 +03:00
Ushie
4e9f3fe1dc build: Bump version to v1.16.0 2023-11-21 17:36:24 +03:00
Aditya Arora
9bd48c19ff feat: ability to search query for suggested version (#1151)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
Co-authored-by: Ushie <ushiekane@gmail.com>
2023-11-21 17:33:21 +03:00
Pun Butrach
c0516c3665 ci(build): Improve pull request build (#1305)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-11-20 14:50:44 +07:00
Pun Butrach
06ff36c836 feat: improve predictive back (#1487)
Signed-off-by: validcube <pun.butrach@gmail.com>
2023-11-20 14:49:39 +07:00
Pun Butrach
98c16eb1dc docs(readme): remove redundant feature information 2023-11-20 07:34:08 +07:00
KAZI MMT
35d80840e5 fix: Remove incorrect punctuation (#1499) 2023-11-19 05:38:34 +01:00
validcube
ad3a778fb9 refactor: apply lint from analyzer 2023-11-12 10:02:40 +05:45
Pun Butrach
d25d1efe9c fix(build): allow profile variant to compile
fix backported from #1305
2023-11-12 10:02:10 +05:45
Pun Butrach
de58dff423 docs: improve readme (#1484) 2023-11-12 10:02:07 +05:45
Pun Butrach
ec26e4d8d1 feat: update color scheme (#1483) 2023-11-12 09:59:55 +05:45
validcube
c24da41505 refactor: replace deprecated command 2023-11-12 09:59:50 +05:45
Pun Butrach
f785185e1c chore: update label for template 2023-11-11 13:19:01 +07:00
aAbed
5ed3ed9a2d fix: patcher logs hiding behind navigation bar (#1476) 2023-11-11 12:00:21 +07:00
oSumAtrIX
a3adace60e build: Update Gradle to v8.4 2023-11-08 17:22:06 +01:00
oSumAtrIX
3db4de09e2 chore: Remove unnecessary project files 2023-11-08 17:21:02 +01:00
aAbed
70b2ee0a84 feat: Disable selection of un-suggested app version by default (#1471)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-11-08 03:38:54 +01:00
aAbed
e7d82850c9 fix: Log saved patch option values (#1420) 2023-11-07 23:37:59 +01:00
oSumAtrIX
e6a8f4e6dc build: Bump version to v1.15.1 2023-11-04 22:41:48 +01:00
oSumAtrIX
494e268bc5 fix: Use correct method name for string replacement 2023-11-04 22:41:27 +01:00
oSumAtrIX
e1c6f65b7e chore: Merge branch dev to main (#1446) 2023-11-04 22:10:14 +01:00
oSumAtrIX
89075c5588 build: Bump version to v1.15.0 2023-11-04 22:08:20 +01:00
Benjamin
c7fa9b8ce7 chore: upgrade dependencies (#1404) 2023-11-04 22:08:20 +01:00
oSumAtrIX
cb70082d31 docs: Remove unneeded steps to build from source 2023-11-04 22:08:19 +01:00
Mr. X
48b9ac8f5b docs: use correct directory path (#1440) 2023-11-04 22:08:19 +01:00
aAbed
0be568bbbd fix: Hide empty patches category labels (#1439) 2023-11-04 22:08:19 +01:00
aAbed
ba44fa620f build: Bump dependencies to support patch option values (#1431)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-11-04 22:08:19 +01:00
Ushie
dde402afbf chore: merge dev to main (#1437) 2023-10-26 17:22:07 +03:00
Ushie
bbe5142ca9 build: bump version to v1.14.2 2023-10-26 17:21:25 +03:00
aAbed
e74ffac5b0 fix: unable to use custom API (#1435) 2023-10-26 17:20:34 +03:00
Ushie
cfb8980e3a chore: merge dev to main (#1425) 2023-10-25 11:42:54 +03:00
Ushie
e06e1bdcbe build: bump version to v1.14.1 2023-10-25 11:42:19 +03:00
Ushie
d60ced2f61 fix: remove codeblock from log export
Fixes: #1416
2023-10-25 11:40:30 +03:00
aAbed
e68689828e fix: Material You toggle not updating sometimes (#1421) 2023-10-25 11:37:03 +03:00
validcube
ba932758c8 build: bump version to v1.14.0 2023-10-21 23:00:51 +07:00
Pun Butrach
ee43fa6311 chore: merge dev to main (#1399) 2023-10-21 22:58:58 +07:00
Pun Butrach
ad6b164d51 feat: root status in export patch log (#1407)
Co-authored-by: Ushie <ushiekane@gmail.com>
2023-10-21 17:46:51 +07:00
validcube
4a5510acb2 refactor: remove the remaining of semantic release
Removal reason: not maintained
2023-10-21 15:37:23 +07:00
validcube
970dbc4428 refactor(social): use correct github organisation name
the correct name is "ReVanced" not "revanced", we changed for a while now.
2023-10-21 15:33:36 +07:00
validcube
f8f37325eb refactor(social): change Twitter to X 2023-10-21 15:32:13 +07:00
Benjamin
bb999019ef feat: show patch options in error log (#1394) 2023-10-17 13:21:59 +07:00
KobeW50
533b6a155a feat: clarify "Version compatibility check" description (#1397) 2023-10-17 13:20:46 +07:00
KobeW50
4cdc92388c refactor: fix patch log order to be consistent with settings order (#1398) 2023-10-17 13:19:18 +07:00
Pun Butrach
ccc6be1e71 refactor(accessibility): improve patch options (#1369)
Co-authored-by: Palm <palmpasuthorn@gmail.com>
2023-10-16 16:47:59 +07:00
Ushie
b355778a92 chore: merge dev to main (#1388) 2023-10-15 20:19:54 +03:00
Ushie
6a12e8f37a build: bump version to v1.13.1 2023-10-15 20:19:23 +03:00
Ushie
59adb91f5f fix(settings): inverted version compatibility switch 2023-10-15 20:16:58 +03:00
KobeW50
53677e2f39 fix: typo in reset patch selection dialog (#1387) 2023-10-15 20:14:19 +03:00
validcube
1c74f43b22 build: bump version to 1.13.0 2023-10-15 18:22:42 +07:00
Pun Butrach
b4801970e8 chore: merge dev to main (#1384)
ReVanced Manager 1.13.0!!
2023-10-15 18:18:09 +07:00
Pun Butrach
7a3a6b512f docs(building): use new highlight format 2023-10-15 18:04:19 +07:00
Pun Butrach
72ea33b6de fix(patch_selector): correct popup menu style
fix: #1372
2023-10-15 17:46:44 +07:00
Pun Butrach
d97192e0ee refactor(patch_options): disable card tap (#1368) 2023-10-15 16:56:43 +07:00
KobeW50
196d9fe4d2 refactor: reorganize and rename settings (#1307)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
Co-authored-by: Ushie <ushiekane@gmail.com>
2023-10-15 16:56:02 +07:00
Benjamin
e960fcc303 feat: add user agent (#1380)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2023-10-15 16:51:31 +07:00
Benjamin
f334da95ff feat: Remove full external storage access (#1381) 2023-10-15 16:44:11 +07:00
aAbed
5d5f311e36 fix(settings-view): list items jumping on scroll up (#1375) 2023-10-15 16:17:28 +07:00
aAbed
d577e97758 fix(app-bar): title not hiding completely (#1376) 2023-10-15 16:16:55 +07:00
aAbed
2dc92e26d3 fix(patches-selector): ignore punctuation marks when searching for patch (#1377) 2023-10-14 19:43:18 +07:00
oSumAtrIX
f4994a36a3 chore: Merge branch dev to main (#1366) 2023-10-13 00:22:02 +02:00
oSumAtrIX
7a785a8163 build: Bump version to v1.12.1 2023-10-13 00:14:14 +02:00
oSumAtrIX
6ad0d860c7 fix: Load patches from older versions of ReVanced Manager correctly 2023-10-13 00:12:27 +02:00
oSumAtrIX
38a2fa55df chore: Merge branch dev to main (#1350) 2023-10-12 21:58:29 +02:00
oSumAtrIX
a21b170b52 build: Bump version to v1.12.0 2023-10-12 21:55:06 +02:00
oSumAtrIX
44265b2362 chore: Setup Crowdin configuration file 2023-10-12 18:51:16 +02:00
oSumAtrIX
069193342b docs: use correct alert syntax 2023-10-12 14:25:13 +02:00
oSumAtrIX
54e9a56cda docs: Add options setting 2023-10-12 14:22:20 +02:00
oSumAtrIX
39bc9227dc docs: Improve readability 2023-10-12 14:20:44 +02:00
aAbed
ac636670c3 feat: Add patch options (#1354) 2023-10-12 02:00:39 +02:00
MD Danish Ansari
2abadc73e4 fix: selected patches order (#1345) 2023-10-10 18:54:42 +07:00
KobeW50
377368f6bf docs: reflect the latest changes of ReVanced Manager (#1349) 2023-10-10 01:07:58 +07:00
Sagar
4085c10bfc fix: search with package name (#1344) 2023-10-09 11:22:15 +07:00
oSumAtrIX
657ba11e7e chore: Merge branch dev to main (#1340) 2023-10-07 02:04:26 +02:00
oSumAtrIX
a9ae45fe63 build: Bump version to v1.11.2 2023-10-07 02:01:10 +02:00
oSumAtrIX
61bb39b46f build: Bump dependencies to improve merging integrations speed 2023-10-07 02:01:10 +02:00
Benjamin Halko
2ad106f7d7 fix(export-settings): remove boolean workaround 2023-10-07 02:01:09 +02:00
Benjamin
8fd4fe0e55 feat(patcher): improve logs (#1299)
Co-authored-by: Ushie <ushiekane@gmail.com>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-10-07 02:01:09 +02:00
oSumAtrIX
b1c9aedac3 build: Bump version to v1.11.1 2023-10-05 17:45:56 +02:00
oSumAtrIX
a80415be02 build: Bump dependencies 2023-10-05 17:45:56 +02:00
oSumAtrIX
d9acd0d74b chore: Merge branch dev to main (#1329) 2023-10-05 01:35:08 +02:00
oSumAtrIX
7ae09159ba build: Bump version to v1.11.0 2023-10-05 01:23:48 +02:00
oSumAtrIX
a709abd80c perf: Do not load patches twice (#1328) 2023-10-04 21:58:25 +02:00
Benjamin Halko
cd07f39b69 fix: reset patches after patching 2023-10-04 12:16:56 -07:00
Benjamin Halko
f7c11d07a8 fix(export-settings): export patches as json object 2023-10-04 11:33:13 -07:00
oSumAtrIX
b07439d402 fix: Reload patches 2023-10-04 19:38:34 +02:00
oSumAtrIX
d8eadc2a2d feat: Use simpler wording 2023-10-04 19:01:17 +02:00
oSumAtrIX
3a88d4d3e6 build: Bump dependencies 2023-10-04 18:39:24 +02:00
oSumAtrIX
012110f008 perf: Do not load patches twice 2023-10-04 18:39:24 +02:00
oSumAtrIX
4de274bf62 feat: Export settings migration activity (#1308) 2023-10-01 19:12:31 +02:00
oSumAtrIX
76b89baee3 build: Bump dependencies (#1311) 2023-10-01 19:03:26 +02:00
oSumAtrIX
697ae92031 Apply suggestions from code review [skip ci] 2023-10-01 19:02:49 +02:00
oSumAtrIX
c87f92b346 feat: Adjust install dialog labels 2023-10-01 06:21:03 +02:00
oSumAtrIX
6961bb7fd0 fix: Do not delete cached downloads 2023-10-01 04:48:24 +02:00
oSumAtrIX
6e26130744 chore: Add todo 2023-09-30 22:15:46 +02:00
oSumAtrIX
123a375a27 refactor: Remove unused strings 2023-09-30 22:14:51 +02:00
oSumAtrIX
2b4b3ca0a5 fix: Retrieve app information from patched app 2023-09-30 21:40:03 +02:00
oSumAtrIX
c4a795418f fix: Move installation log to correct place 2023-09-30 21:13:32 +02:00
oSumAtrIX
91837ebade feat: Remove original package name in app info view 2023-09-30 21:07:26 +02:00
oSumAtrIX
0492e910ea fix: Fill the preferred action 2023-09-30 20:11:53 +02:00
oSumAtrIX
36c86e22b1 fix: Load installed apps 2023-09-30 20:03:09 +02:00
oSumAtrIX
6bdc0c7bb2 feat: Simplify label 2023-09-30 19:58:45 +02:00
aAbed
1e8d8f749a fix: do not ask for patches consent before initializing model 2023-09-30 14:57:48 +05:45
oSumAtrIX
2e8e3b0d1e fix: Do not hardcode any predefined packages 2023-09-29 20:12:39 +02:00
oSumAtrIX
15b8613d3c feat: Only log relevant records 2023-09-29 19:40:22 +02:00
oSumAtrIX
8ce266bc94 perf: Reduce amount of network requests 2023-09-29 18:39:07 +02:00
oSumAtrIX
8661d72e45 feat: Simplify label 2023-09-29 17:00:34 +02:00
oSumAtrIX
62505f2543 build: Bump dependencies 2023-09-28 17:36:10 +02:00
Pun Butrach
37986c58ec docs(building): correct path to gradle.properties 2023-09-28 21:45:41 +07:00
Benjamin Halko
2968d96fe9 remove log import 2023-09-27 14:42:11 -07:00
Benjamin Halko
e7c8d0e78c use same fingerprint 2023-09-27 14:36:39 -07:00
Benjamin Halko
83cbb34a5b use revanced fingerprint 2023-09-27 14:27:38 -07:00
Benjamin Halko
7559c7b67e verify fingerprint of calling app 2023-09-27 14:17:29 -07:00
Benjamin Halko
02822f4b38 remove user interaction 2023-09-27 13:47:59 -07:00
Benjamin Halko
96736afb94 make bars transparent 2023-09-27 12:32:19 -07:00
Benjamin Halko
72ae132fcd make export settings activity transparent 2023-09-27 12:21:27 -07:00
Benjamin Halko
2250e1bcab convert Booleans to Ints 2023-09-26 16:46:49 -07:00
Benjamin Halko
d9d5b746c3 Added ExportSettingsActivity 2023-09-26 16:21:46 -07:00
Benjamin Halko
f1ea306291 change booleans to numbers 2023-09-25 14:42:40 -07:00
Benjamin Halko
378d62395a remove newlines from base64 output 2023-09-25 10:15:56 -07:00
Benjamin Halko
99c92069b9 export saved patches and keystore 2023-09-25 08:43:10 -07:00
Benjamin Halko
2a89ef797f feat: share settings 2023-09-24 16:56:25 -07:00
Ushie
5838550188 build: bump version to v1.10.3 2023-09-23 13:10:46 +03:00
Ushie
e0e01ae3ee chore: merge dev to main (#1300) 2023-09-23 13:10:08 +03:00
Benjamin
0983ba8a0f fix: search bar overflow (#1301) 2023-09-23 00:51:25 +03:00
Ushie
0bfa776ce7 fix: npe when loading patch bundle on android 8 2023-09-23 00:24:17 +03:00
Pun Butrach
d2b09936d1 chore: merge dev to main (#1295) 2023-09-22 22:08:13 +07:00
Pun Butrach
68e9f0f7c1 build: bump version 1.10.2
!!
2023-09-22 22:05:31 +07:00
Benjamin
c3d345de80 fix: force disable material you on Android 11 and below (#1293) 2023-09-22 21:05:13 +07:00
Pun Butrach
385c0e246a build: use correct version code
The user won't notice it :shhh: we're fine, continue as normal.
2023-09-21 19:32:10 +07:00
Benjamin Halko
5ead49a5b7 build: bump version to v1.10.1 2023-09-20 20:06:19 -07:00
Benjamin
c0760b1347 chore: merge dev to main (#1289) 2023-09-20 20:04:10 -07:00
Benjamin Halko
e01b323aee fix: make entire theme item clickable 2023-09-20 20:03:47 -07:00
Benjamin Halko
6f4866ef63 fix: default theme not following system (#1288) 2023-09-20 20:03:15 -07:00
Benjamin Halko
1b6d72661c build: bump version to v1.10.0 2023-09-20 17:40:23 -07:00
Benjamin
c59d4aea81 chore: merge dev to main (#1239) 2023-09-20 17:35:01 -07:00
Benjamin
6260a80738 feat(settings - appearance): add system option (#1279)
Closes #1260
2023-09-21 03:25:23 +03:00
Benjamin
e75d3c8273 fix(install-type): update padding and enable radio list scrolling (#1287)
fix(install-type): update padding and enable radio list scrolling
2023-09-20 17:24:37 -07:00
Benjamin Halko
b7acb475e9 fix: update install type dialog padding 2023-09-20 16:57:13 -07:00
Benjamin
42b6bbff7c fix: update youtube link (#1286) 2023-09-21 02:16:55 +03:00
aAbed
4b8542b35b fix: load patches via PatchBundle (#1242) 2023-09-21 01:35:32 +03:00
Julienraptor01
9ad1d6cbfb fix(custom-sources): ignore casing when checking if default repo is being used (#1281) 2023-09-21 00:42:29 +03:00
KobeW50
4cdd9acd73 docs(readme): add documentation and minor fixes (#1264)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2023-09-16 17:38:06 +07:00
Benjamin
f4b0a695d6 fix: improve app list loading speed (#1166) 2023-09-15 22:58:15 +07:00
Benjamin
b525ea1ba4 ci: remove analyze workflow (#1262)
Code style is not enforced so analysis is not needed.
2023-09-12 23:40:00 +07:00
Pun Butrach
c1fc2c4766 ci: bump actions/checkout to v4 2023-09-10 14:43:58 +07:00
Ushie
5c733932c7 ci(pr-build): revert "sign apk with keystore (#1231)"
This reverts commit 8bf08ff464, as it fails for PRs originating from forks
2023-09-08 01:14:13 +02:00
Ushie
d1218616ec docs(readme): minor improvements 2023-09-08 01:14:13 +02:00
aAbed
2bf6a03d56 fix: back button closing the app from any page 2023-09-08 01:14:13 +02:00
Pun Butrach
b6ee63c1ea ci(pr-build): sign apk with keystore (#1231) 2023-09-08 01:14:13 +02:00
oSumAtrIX
6d08efdcd7 chore: fix issue template 2023-09-08 01:13:42 +02:00
Ushie
a0a43a5651 build: bump version to v1.9.5 2023-09-08 01:13:42 +02:00
Ushie
3af2f5b032 chore: merge dev to main (#1177) 2023-09-04 04:15:12 +03:00
Ushie
8f54b226b4 refactor(patches-selector): improve universal patches header 2023-09-03 21:14:09 +03:00
Ushie
9f64011b26 fix: npe when patching on android 8 2023-09-03 20:54:42 +03:00
Pun Butrach
c5fc54e721 fix(installer): open the patched app after install (#1233) 2023-09-03 21:48:28 +07:00
Jay Gajjar
fc8a4fc5b6 fix: Don't use 'BuildContext's across async gaps. (#1148) 2023-09-03 01:47:20 +03:00
Benjamin
6f9ab232ae chore: ignore the root .gradle folder (#1160) 2023-09-02 09:29:49 -07:00
aAbed
8cb96f1e45 fix: permissions handling at first launch 2023-08-31 19:34:12 +05:45
Pun Butrach
5733acb77a build(dependency): update patcher to v14.2.2
https://github.com/ReVanced/revanced-patcher/releases/tag/v14.2.2
2023-08-31 20:35:24 +07:00
oSumAtrIX
e49bcb2a69 chore: simplify issue templates (#1165) 2023-08-31 17:36:29 +07:00
Ushie
42e41c399f fix: hide install button on error 2023-08-28 19:05:30 +03:00
Ushie
166a3180d3 build: correct version code 2023-08-28 03:20:15 +03:00
Ushie
3bf4982f23 chore: merge dev to main (#1163) 2023-08-28 02:47:47 +03:00
oSumAtrIX
f4e1cccfac build: bump version to v1.9.4 2023-08-28 01:44:46 +02:00
oSumAtrIX
7911a8f49e fix: properly log messages and progress 2023-08-28 01:44:46 +02:00
oSumAtrIX
64a96fc3ce fix: close before returning 2023-08-28 01:44:46 +02:00
BenjaminHalko
8e2cfbddc5 fix: ignore the root .gradle folder 2023-08-27 14:05:39 -07:00
oSumAtrIX
45fae3f0fd build: bump ReVanced Patcher back to v14.2.1
This reverts the previous regression with the dependency to ReVanced Patcher.
2023-08-27 22:35:03 +02:00
aAbed
e45a7824c1 build: bump version to v1.9.3 2023-08-27 13:27:53 +07:00
aAbed
5d72c48a76 chore: merge dev to main (#1157) 2023-08-27 13:27:01 +07:00
aAbed
d6169c6fa2 fix: broken settings page 2023-08-27 11:55:21 +05:45
Ushie
9df6d52e2d build: bump version to v1.9.2 2023-08-27 05:40:50 +03:00
Ushie
239de8e923 chore: merge dev to main (#1156) 2023-08-27 05:40:13 +03:00
Ushie
7d553a87f3 build: revert patcher to v11.0.4 2023-08-27 05:39:24 +03:00
Ushie
557b42bc56 build: bump version to 1.9.1 2023-08-27 03:58:30 +03:00
Ushie
8423914748 chore: merge dev to main (#1155) 2023-08-27 03:57:57 +03:00
Ushie
07dce23794 build: bump patcher to v14.2.0 2023-08-27 03:55:56 +03:00
Ushie
18fd0552db build: bump version to v1.9.0 2023-08-27 02:23:36 +03:00
Ushie
d537d48f8e chore: merge dev to main (#1125) 2023-08-27 02:21:48 +03:00
Ushie
b456512bbb build: bump patcher to v14.1.0 (#1153)
Co-authored-by: aAbed <aabedhkhan@gmail.com>
2023-08-27 02:21:16 +03:00
Pun Butrach
d9953b1473 fix(installer): use correct elevation level 2023-08-24 19:00:50 +07:00
aAbed
c6ac898390 fix: universal patches not selectable 2023-08-17 18:25:23 +05:45
Pun Butrach
43f98cec43 build: make variant more identifiable
Release variant will use the "ReVanced Manager" app name, Debug will use "ReVanced Manager Debug"
2023-08-15 21:31:34 +07:00
Pun Butrach
63175cdec6 ci(build): create debug variant instead of release 2023-08-15 20:55:11 +07:00
Pun Butrach
6436a1ec61 build: debug apk come with application suffix
Instead of using the same one as Release, app.revanced.manager.flutter - We add .debug to it, yay, co-installation of two variants!
2023-08-15 20:37:43 +07:00
aAbed
c400619338 feat: disable changing patches selection by default (#1132)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-08-15 16:05:27 +07:00
Ushie
dcd5ba41cf build: add mavenlocal to repositories 2023-08-14 03:40:05 +03:00
Pun Butrach
7525e52fab fix(installer): use correct bg colour for dialog 2023-08-12 15:07:04 +07:00
Pun Butrach
72fd24e624 fix: use i18n translation for installer page 2023-08-12 15:06:17 +07:00
Pun Butrach
11d8f9fd30 refactor: apply changes according to Dart
trailing commas
2023-08-12 14:53:54 +07:00
Pun Butrach
4b0c8cecc8 ci(build): update event trigger
This add ".github/workflows/pr-build.yml" to build on every change to the CI Build to check if there's no error when it got modified.

And also remove "fastlane/**" because that's not related to the ReVanced Manager's code
2023-08-12 13:56:18 +07:00
Dhruvan Bhalara
372ce174c9 fix: overlapping issue in application selection page (#1128) 2023-08-11 19:19:44 +03:00
kitadai31
381daff980 fix: exclude x86 aapt2 binary from release builds (#1126) 2023-08-11 19:19:33 +03:00
Subhamoy Biswas
94acebbebd docs(fixed): replaced some emoji icons, not rendering on chromium based browsers on windows (#1123) 2023-08-11 10:17:46 +07:00
aAbed
f90f6e81ee feat: patch apps without internet (#1114) 2023-08-11 08:11:19 +07:00
Dhruvan Bhalara
97e37f304b refactor: migrate MediaQuery properties to InheritedModel (#1115)
Co-authored-by: Ushie <ushiekane@gmail.com>
2023-08-10 15:25:07 +03:00
Pun Butrach
f5e45ead26 ci(build): don't build on every pull request unrelated to application 2023-08-10 19:14:13 +07:00
Pun Butrach
14f765f4b4 ci(build): don't cache Gradle
Gradle take up so much space in cache that it wouldn't make sense for us to cache it since we are rapidly hitting the cache limit every time.
2023-08-10 19:12:15 +07:00
Pun Butrach
b77d46b2c2 feat(installer): redesign utility options (#1062)
Co-authored-by: Ushie <ushiekane@gmail.com>
2023-08-10 19:02:30 +07:00
Ushie
1442916b20 build: bump version to 1.8.0 2023-08-10 03:01:03 +03:00
Ushie
c6a5f42d23 chore: merge dev to main (#1120) 2023-08-10 03:00:27 +03:00
Ushie
580d50eb8d fix: use right label for auto patch 2023-08-10 00:05:47 +03:00
Ushie
9a66b6e50d fix(root-install): create service and postfs directories if they dont exist (#1116)
Fixes #860
2023-08-09 23:57:09 +03:00
aAbed
acec064cb7 feat(patcher-view): show notice for removed patches that were used previously (#1107) 2023-08-09 22:32:13 +03:00
aAbed
ea05d13a1f fix(patches-selector): New tag showing for old patches (#1113) 2023-08-09 22:31:37 +03:00
Ushie
fd741f2ccf build: bump version to v1.7.0 2023-08-08 03:52:03 +03:00
Ushie
055c52178f chore: merge dev branch to main branch (#1096) 2023-08-08 03:51:05 +03:00
aAbed
722a5859a5 fix: pair integrations and patches updates (#1102) 2023-08-08 03:30:48 +03:00
aAbed
1714c3fa86 feat(patches-selector): show New tag for new patches (#1099) 2023-08-07 22:28:09 +07:00
Pun Butrach
131df28110 docs(managing): update to reflect current changes
The chip was removed because it was not implemented for too long.
2023-08-07 20:13:23 +07:00
aAbed
1be284f8d8 feat: switch to the new ReVanced API (#1101) 2023-08-07 17:14:16 +07:00
Pun Butrach
218e53ae75 refactor(analysis): migrate deprecated rule
deprecated since Dart 2.0, yike
2023-08-06 14:41:15 +07:00
Pun Butrach
264d8d90c4 refactor: apply changes according to analysis
trailing commas, and sort import alphabetically
2023-08-06 14:39:46 +07:00
aAbed
0b529c2629 fix(patches-selector): separate all universal patches to the bottom (#1092) 2023-08-06 12:12:01 +07:00
aAbed
5abcc7191f fix: experimental/universal patches being used even when turned off (#1090)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2023-08-06 12:10:57 +07:00
aAbed
5346f6e1bf fix(patch-item): hide universal patches if not enabled (#1087) 2023-08-05 20:19:36 +07:00
oSumAtrIX
2f471b3de4 fix: use user friendly strings (#1088) 2023-08-05 20:19:03 +07:00
Ushie
3cf06efddf build: bump version to v1.6.1 2023-08-04 03:33:19 +03:00
Ushie
1f4f0a3bb7 build: revert patcher to v11.0.4 2023-08-04 03:32:50 +03:00
Ushie
c07f8eae9b build: bump version to v1.6.0 2023-08-04 00:54:13 +03:00
aAbed
374eb3d06d feat: abort patching process at any time (#1072) 2023-08-04 00:40:08 +03:00
BrentBoyMeBob
fe75b75ddc feat: dpi responsive layout (#361) 2023-08-04 00:38:38 +03:00
Pun Butrach
d3790bf64b refactor: remove unimplemented features (#1061)
Co-authored-by: Ushie <ushiekane@gmail.com>
2023-08-03 23:58:50 +03:00
aAbed
f905a52988 feat: allow control over patches update (#1063)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-08-03 23:23:56 +03:00
aAbed
e55f427b05 build: bump patcher version to v12.1.1 2023-08-04 01:53:19 +05:45
aAbed
0f000fc4d1 build: bump version to v1.5.2 2023-08-04 01:52:24 +05:45
Ushie
a0339e3c19 chore: merge dev to main (#1077) 2023-08-03 05:24:25 +03:00
Ushie
9cfa274d81 build: bump version to v1.5.1 2023-08-03 05:23:47 +03:00
Ushie
8c79f5e371 build: bump patcher to v12.1.0 2023-08-03 05:23:16 +03:00
aAbed
0d716513d7 fix: keystore password dialog showing up before importing (#1068) 2023-08-03 08:36:39 +07:00
Ushie
08f6724060 chore: merge dev branch to main branch (#1060) 2023-08-03 02:20:24 +03:00
Ushie
29daf51e64 build: bump version to 2023-08-03 02:19:14 +03:00
Pun Butrach
b3b2b01c0f ci(build): use pr event trigger for now
I just heard of cache eviction policy :)
2023-08-01 20:20:27 +07:00
Pun Butrach
c3212d0308 ci(build): update event trigger
Run on every PR

Run on every Push, ignore main branch, and ignore tag
2023-08-01 19:32:52 +07:00
Pun Butrach
aaa114ba13 ci(pr-build): reinstate functionality
PR Build was never use because it have to be manually trigger
2023-08-01 19:26:26 +07:00
Pun Butrach
8ca6418630 refactor(settings): improve clarity of the warning dialogs (#1058) 2023-07-31 21:53:23 +07:00
Pun Butrach
95632b7f55 chore(deps): update revanced-patcher to v12.0.0 2023-07-30 11:49:01 +07:00
aAbed
64744b2abf fix: original.apk not found despite existing (#1052) 2023-07-30 10:35:34 +07:00
aAbed
096b315701 fix(patch-item): remove redundant patch version completely (#1059)
https://github.com/ReVanced/revanced-patches/pull/2709
2023-07-29 16:21:30 +07:00
Pun Butrach
c27ca08d3a docs: leftovers from 6495687841 2023-07-29 16:08:54 +07:00
Aunali321
0011222371 chore:fix incorrect version 2023-07-23 14:25:11 +05:30
Aunali321
29db947e25 fix: using non const value in a const variable 2023-07-23 14:04:35 +05:30
Aunali321
fd43ac7581 chore: merge dev branch to main branch (#1032) 2023-07-23 13:53:25 +05:30
Aunali321
e49c19b3cd feat: support older version of android for reddit client patches 2023-07-23 13:51:36 +05:30
Pun
06f0e59967 chore(deps): update libsu to v5.2.0 2023-07-22 13:21:13 +07:00
Pun
c5fc5ee93b build: speed up compilation time
faster build faster build faster build faster build faster build
2023-07-19 18:30:50 +07:00
Dhruvan Bhalara
159c85bd1f fix: close previous dialog when user reset the API URL (#1025) 2023-07-16 21:04:35 +07:00
Pun
2460acf0f4 ci(analyze): don't run when PR is in draft 2023-07-16 17:10:29 +07:00
Pun
6495687841 docs: correct misspelling (EN_US)
This correct spelling to English American, because by default, we use English US.
2023-07-16 16:31:08 +07:00
Pun
d229ccb36c ci(analyze): clarify job name that the job do static analysis & format checking 2023-07-16 16:21:16 +07:00
Pun
4d6a57ddcf ci(analyze): restore run when commit push to dev branch 2023-07-16 16:17:15 +07:00
Aabed Khan
d161d55aaf fix: patched applications not showing at launch (#1031) 2023-07-16 12:46:01 +07:00
Pun
768ad0c9bc chore: merge dev branch to main branch (#1011)
ReVanced Manager v1.4.1
2023-07-15 20:33:30 +07:00
Pun Butrach
29323d4e20 build: update app version to v1.4.1 2023-07-15 12:55:59 +07:00
Pun Butrach
630b22e193 refactor: applies changes from formatter & linter 2023-07-15 12:41:03 +07:00
Aabed Khan
79116f9e67 fix(patched-applications): non-patched app showing on Installed section (#1022) 2023-07-15 08:11:51 +07:00
Aabed Khan
eb58475259 fix: showing Installed when it's actually not (#1021) 2023-07-15 08:10:36 +07:00
ponces
a879ac30fb fix: prevent unsupported operation exception (#1018) 2023-07-14 17:55:04 +07:00
Aabed Khan
c5b0621323 fix(navigation-view): back button closing the app from any page (#1019) 2023-07-13 19:25:48 +05:45
Aabed Khan
0462815014 fix(app-selector): fix text overflow on small screen (#1017) 2023-07-13 00:16:53 +05:45
Aabed Khan
e64318c947 fix(app-selector): fix text overflow on small screen 2023-07-13 00:14:47 +05:45
Pun Butrach
b784482788 chore: update libsu to 5.1.0
This should fixes some issues with root
2023-07-11 19:28:59 +07:00
Aabed Khan
2834e8b348 fix: patchable apps not showing if none of them is installed (#1009) 2023-07-11 17:11:45 +07:00
Aunali321
b23dfd4289 chore: merge dev branch to main branch (#1010) 2023-07-11 01:24:54 +05:30
Aunali321
217d525cb2 build: update app version to v1.4.0 2023-07-11 01:22:57 +05:30
Aunali321
85b166cbda fix: update hardcoded patch name 2023-07-11 01:21:45 +05:30
Pun Butrach
9a57f8b858 ci(build): use correct JDK version
There's no reasons to go higher than JDK 11 since we compile the application using JDK 11
2023-07-10 21:42:24 +07:00
Pun
3bfdc932c2 chore: update app description
👍👍 Patch your favourite apps, right on your device.
2023-07-10 21:27:20 +07:00
Ushie
48c878af21 chore: merge dev branch to main branch (#996) 2023-07-10 16:56:50 +03:00
Pun Butrach
490a7a58fc build: update app version to v1.3.9
ReVanced Manager, 1.3.9 (10030009)

See PR #996
2023-07-10 20:40:40 +07:00
Pun Butrach
567b1a3ace refactor: improve code readability according to linter 2023-07-10 19:45:50 +07:00
Pun Butrach
6a45db8a38 refactor: improve code readability according to formatter 2023-07-10 19:36:50 +07:00
Pun
b272988929 build: always compile with the latest SDK supported by Flutter
`targetSdkVersion` is still the same, we want to test the application first before bumping up to latest.
2023-07-10 18:43:07 +07:00
Aabed Khan
9828857570 fix: fixed typo 2023-07-10 12:16:51 +05:45
KobeW50
ecb54d8e44 docs: improve clarity of speech in issue template (#1005)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-07-09 23:15:20 +02:00
Aabed Khan
344717b021 fix: app crash after custom source (#1003) 2023-07-08 23:07:19 +05:45
Aabed Khan
da6cf585c0 fix: app crash after custom source 2023-07-08 22:26:31 +05:45
Pun Butrach
9e93177afd feat: show warning dialog when resetting stored patches
This prevent user from accidentally resetting stored patches by showing
them warning dialog.
2023-07-08 11:01:10 +07:00
Pun Butrach
16318efb01 refactor: seperate translation string by context 2023-07-08 10:45:13 +07:00
Pun Butrach
e83e13b6d4 refactor: fix more problem with analyser
Missing trailing comma in app_selector_view
2023-07-07 22:21:22 +07:00
Pun Butrach
7c2c695d88 refactor: apply changes from analyser 2023-07-07 22:15:12 +07:00
Pun Butrach
c7b227529d chore: disable unnecessary tooltip
Remove tooltip in Navigation View, there's no impact to accessibility.

Tested using: Android TalkBack
2023-07-07 22:11:13 +07:00
oSumAtrIX
14f49e9d30 docs: fix description for next page 2023-07-05 15:43:40 +02:00
Aabed Khan
1875c4ee73 fix: update button being clickable when offline (#987) 2023-07-05 19:59:53 +07:00
Pun Butrach
76c68baa1f build: update gradle to v7.6.2 2023-07-01 18:21:49 +07:00
Aunali321
68876a4414 build: bump version to v1.3.8 and patcher dep 2023-07-01 14:33:25 +05:30
Ushie
26d7e5b60f build: bump version to v1.3.7 and patcher dep 2023-07-01 02:46:43 +03:00
Ushie
e78af6ae99 chore: merge dev to main (#976) 2023-07-01 02:41:57 +03:00
Aabed Khan
6fe05cd86e feat: show all the unseen changelogs on changelog section (#970) 2023-07-01 02:41:03 +03:00
Aabed Khan
4100d7a391 fix: different message when trying to patch spilt apk (#973) 2023-07-01 02:40:30 +03:00
Ushie
c1cc812ea4 build: bump version to v1.3.6 2023-06-24 19:17:59 +03:00
Ushie
9663e3f0f4 chore: merge dev branch to main branch (#945) 2023-06-24 19:16:22 +03:00
Aabed Khan
941f618153 fix(app-selector): remove direct use of strings (#944) 2023-06-23 16:39:12 +03:00
Aabed Khan
716a30bf7b fix: experimental patches stay selected when toggled off (#946) 2023-06-23 16:37:23 +03:00
Aabed Khan
d051ae576b feat(updater): download successful dialog (#938) 2023-06-23 16:36:36 +03:00
ponces
35e99cb014 feat(mount): use /data/adb/revanced again and ensure migration scenario (#948) 2023-06-23 01:03:03 +03:00
taku
af054fba49 docs: improve clarity of footnotes [skip ci] (#950) 2023-06-17 14:48:57 +02:00
Aabed Khan
58d837d641 feat(app-selector): Improve app item UI to avoid overflow issues (#943) 2023-06-16 10:04:55 +03:00
Aabed Khan
6cc1bd21cd fix(updater): ability to start again after cancelling (#937) 2023-06-16 10:04:07 +03:00
oSumAtrIX
cebfa7c8ae docs: simplify steps 2023-06-16 05:09:52 +02:00
oSumAtrIX
e2d7ab8f8f chore: fix broken docs link 2023-06-15 16:42:09 +02:00
Aabed Khan
ec77987fcd feat(app-selector): improve skeleton UI (#939) 2023-06-15 12:57:39 +03:00
ponces
b161608d02 feat(patches-selector): improve disabled card UI (#941) 2023-06-15 12:54:49 +03:00
Aabed Khan
5e7458ff1c fix: import patches selects unsupported patches (#942) 2023-06-14 21:34:11 +07:00
Pun
ed06aaa1f5 docs(readme): fix invalid url for building manager from source
📜 fix invalid URL for building manager from source.

Old: https://github.com/revanced/revanced-manager/blob/docs/docs/5_building-from-source.md
New: https://github.com/revanced/revanced-manager/blob/main/docs/4_building.md
2023-06-14 19:52:10 +07:00
Aunali321
13b7179941 fix: fix not asking for permission 2023-06-12 09:56:49 +05:30
Aunali321
da0d88d86f build: bump patcher 2023-06-12 09:08:29 +05:30
Aunali321
b7347c312a build: bump version to v1.3.4 2023-06-12 08:59:49 +05:30
Aunali321
c876f2f7e3 feat: add permission to manage storage 2023-06-12 08:59:14 +05:30
Aunali321
adad5fd8ff build: bump version to v1.3.3 2023-06-12 07:02:49 +05:30
Aunali321
2aaa7ae8c9 chore: merge dev to main (#935) 2023-06-12 07:01:12 +05:30
Aunali321
1f64ea37bd fix: using wrong string 2023-06-12 06:59:43 +05:30
Aunali321
cac1525da0 build: bump patcher 2023-06-12 06:02:16 +05:30
Aunali321
1ad906fedc refactor: improve code 2023-06-12 06:01:57 +05:30
Aabed Khan
20ffef39a3 fix: update button being shown as clickable on launch (#932) 2023-06-12 05:55:53 +05:30
Aabed Khan
185460c054 chore(fastlane): update description (#933)
Co-authored-by: Ushie <ushiekane@gmail.com>
2023-06-12 03:21:33 +03:00
Aabed Khan
0079e74d77 feat: clarify suggested version in app list (#934)
Co-authored-by: Aunali321 <48486084+Aunali321@users.noreply.github.com>
2023-06-12 05:35:02 +05:30
oSumAtrIX
a8e019482f ci: add workflow to update documentation repository 2023-06-10 23:41:36 +02:00
Yaros
f01b8e47aa fix: aborting message changed (#928)
Change aborting message from "aborting..." to "aborted..."

----------------------
Co-authored-by: Ushie <github@ushie.dev>
Co-authored-by: Ushie <ushiekane@gmail.com>
2023-06-09 17:34:55 +07:00
Pun
e43dfb7599 docs(troubleshooting): fix markdown styling (#929)
`docs`: `84a9168` - Self-explanatory, fix markdown styling issue
2023-06-09 17:24:31 +07:00
Ushie
6b8cfe2b49 build: bump version to v1.3.2 2023-06-09 11:42:06 +03:00
Ushie
7f7b14bae3 fix: use correct variable name for armv7 check 2023-06-09 11:40:54 +03:00
Ushie
810b02d9fd build: bump version to v1.3.1 2023-06-09 10:45:22 +03:00
Ushie
62813145b2 chore: merge dev to main (#926) 2023-06-09 01:59:18 +03:00
Ushie
4877058253 chore(fastlane): add banner 2023-06-09 01:58:02 +03:00
Ushie
2a9fd3abb8 chore(fastlane): add missing directory 2023-06-09 01:57:49 +03:00
Ushie
a244f7b598 chore: merge dev to main 2023-06-08 21:31:41 +03:00
Ushie
5396457ad5 chore: move fastlane to correct directory 2023-06-08 21:30:44 +03:00
Ushie
0186b6ea61 chore: merge dev to main (#924) 2023-06-07 20:18:21 +03:00
fe
f6e99f7e88 fix: return fetched patch version if non default patch repo is used (#922) 2023-06-07 20:16:25 +03:00
Pun
c24a3828be ci(analyze): don't run when pushed to repository (#920) 2023-06-07 20:15:43 +03:00
Pun
2e38a4567a feat: clarify architecture in about section
This commit changes `Arch` to `Supported Arch(s)`
2023-06-07 20:13:42 +03:00
Yaros
67c5d67a61 feat: update icons for the new logo
fixed #918
2023-06-07 20:10:14 +03:00
Aunali321
9592dde534 feat: add fastlane for F-Droid (#889)
Co-authored-by: Ushie <ushiekane@gmail.com>
2023-06-07 19:59:17 +03:00
oSumAtrIX
d030b0af70 docs: init (#911)
Co-authored-by: afn <_@afn.lol>
2023-06-07 12:01:36 +02:00
MrAngelos6
4ccb9ac94d fix: remove redundant "v" in the downloader screen (#895) 2023-05-26 13:54:52 +03:00
Ushie
8af62b917c build: bump version to 1.3.0 (#892) 2023-05-24 23:33:04 +03:00
Steven
311f114132 chore: update v1.3.0 2023-05-24 21:46:00 +02:00
Ushie
d015bd03f7 chore: merge dev to main (#891) 2023-05-24 22:17:16 +03:00
oSumAtrIX
a61b9de0fa chore(deps): bump revanced-patcher to 9.0.0 2023-05-24 02:02:59 +02:00
Ushie
ef1b283917 chore(deps): bump revanced-patcher to 8.0.0 (#880) 2023-05-24 01:07:22 +05:30
Ushie
c677f00105 build: bump version to v1.2.0 2023-05-20 02:30:18 +03:00
Ushie
8d2f778dfe chore: merge dev to main (#881) 2023-05-20 02:28:58 +03:00
Aunali321
c549d102f6 build: migrate to dart 3 (#871) 2023-05-20 04:07:53 +05:30
Aunali321
39a9ee4e9d chore: remove coreLibraryDesugaring (#873) 2023-05-20 04:05:46 +05:30
Sangam Shrestha
a27dc6ad1c feat: migrate to dart3 2023-05-19 14:23:48 +05:45
kitadai31
8ccb75fc8d chore: remove coreLibraryDesugaring 2023-05-17 15:38:03 +09:00
Ushie
8fc86dbe02 feat: allow selecting installed if app is full apk 2023-05-13 04:54:35 +03:00
Sebok Andras
359f052608 fix: export keystore not working in some conditions (#862) 2023-05-12 19:36:47 +03:00
Hokora Yinphine
4150e2265c fix: use correct version in update download dialog (#859) 2023-05-10 13:23:02 +03:00
Dhruvan Bhalara
b803ce7435 fix: system navigation overlapping UI (#853) 2023-05-10 13:18:51 +03:00
Aunali321
289c6cd7a9 chore: merge dev to main (#857) 2023-05-08 21:46:33 +05:30
Aunali321
31fc7b74c2 build: bump version to v1.1.0 2023-05-08 21:38:19 +05:30
Aunali321
3e565f25be fix(appselector): closing dialog closes app selector 2023-05-08 21:27:07 +05:30
Aunali321
e509be4e21 chore(deps): bump patcher to 7.1.1 2023-05-08 21:19:45 +05:30
Aunali321
170fc537ac fix: fix armv7 dialog shown for x86, x86_64 2023-05-07 04:14:57 +05:30
Aunali321
3fe5882145 feat: remove cronet 2023-05-06 05:39:46 +05:30
Aunali321
a290791410 chore: merge dev to main (#844) 2023-05-06 03:26:14 +05:30
Pun
2ebd38ff68 feat: add checksums verification to Gradle (#813) 2023-05-03 21:38:47 +03:00
Dhruvan Bhalara
cd987a5b19 fix: broken filename when saving files with the same name (#837) 2023-05-03 21:34:30 +03:00
Ushie
7f1dab7ee1 ci: temporarily restore old release workflow 2023-05-02 17:50:07 +03:00
SodaWithoutSparkles
bed3945aa5 feat: clarify warning and consequences for ARMv7 users (#836) 2023-05-02 16:41:11 +07:00
Aunali321
15a32a18b7 fix: fix broken manager update implmentation 2023-04-30 17:38:08 +07:00
Palm
d2e8e7dd5d chore: comply with review changes 2023-04-30 01:03:36 +07:00
Palm
ce12ec89c4 ci(release): automatically bump version codes 2023-04-29 20:53:54 +07:00
EvadeMaster
b286444ad9 fix(i18n): update translation for refreshSucess 2023-04-29 20:43:02 +07:00
EvadeMaster
941263102d refactor: change name from "recommendedVersion" to "suggestedVersion" 2023-04-29 20:43:02 +07:00
Palm
e2ed296dc7 chore(deps): constrain get_it to 7.2.0 2023-04-29 19:46:07 +07:00
Ushie
cfc866bef2 feat: change continue anyways to cancel 2023-04-29 15:37:30 +03:00
Sebok Andras
affba669ce feat: add continue anyway button to select from storage dialog (#810) 2023-04-29 15:36:25 +03:00
Palm
7230152ab8 chore: fix issues with gitignore [skip ci] 2023-04-29 17:42:19 +07:00
Palm
21fee7171f chore: update pubspec version
skip-checks: true
2023-04-29 15:40:25 +07:00
SodaWithoutSparkles
ad17995f28 feat: improve suggested app version text (#822) 2023-04-28 17:41:28 +03:00
Yaros
ac830cbe7f fix: resized monochrome icon to match the original (#789)
cherry-pick from 6281ae82876c69ff4194a782e4b08b398a1285d6
2023-04-27 18:12:48 +07:00
Aunali321
65da6af3f9 fix: update pubspec version 2023-04-21 14:56:31 +03:00
oSumAtrIX
3d90bf7588 ci: bypass push permission on protected branches with owner PAT 2023-04-21 14:55:29 +03:00
EvadeMaster
62ef1c88fe feat: resetting source to default dismiss the sources pop-up (#797)
* feat: resetting source to default dismiss the sources pop-up

* chore: format using `dart format`
2023-04-21 00:29:37 +05:30
Aunali321
d6918920b6 chore: add missing translations 2023-04-20 23:53:24 +05:30
Aunali321
cdfb09fbfa feat: warning for armv7 devices 2023-04-20 23:20:30 +05:30
Aunali321
bb681e31c9 feat: disable selecting installed apps for nonroot 2023-04-20 22:25:29 +05:30
Aunali321
c7483936ec docs: remove alpha disclaimer 2023-04-20 05:07:46 +05:30
Aunali321
0a1f2da33d feat: appreciation message for new contributors 2023-04-20 05:04:37 +05:30
Aunali321
f5aafdb7d6 feat: progress bar for manager updates 2023-04-20 04:45:46 +05:30
Aunali321
c9adf1c492 style: sort imports 2023-04-19 01:32:43 +05:30
Aunali321
4c9cb560e3 feat: auto select default patches 2023-04-19 01:21:08 +05:30
Yaros
f0b028279c fix: open contributor links externally (#791) 2023-04-18 19:46:16 +05:30
Aman Sikarwar
197770b68b chore: update dependencies (#772)
* chore: updated some dependencies

* refactor: reimplemented cache interceptor

* Revert "Updated dependencies & migrated breaking changes"

This reverts commit e6743b0d6b2552fdbf1c99d23e158e682362dd5d.

* chore: migrated flutter_local_notifications

* revert: reimplemented cache interceptor
2023-04-18 19:45:29 +05:30
EvadeMaster
37b583f560 feat: trim extra space when setting custom source (#771) 2023-04-18 17:15:04 +07:00
Sebok Andras
dca2d4fe12 feat: add option to import/export keystore (#776)
* feat: add option to import/export keystore

* change the order of import/export keystore buttons

* feat: add option to change the keystore password
2023-04-18 15:08:10 +05:30
Aunali321
3b677f8ae3 feat: improve ux (#752)
* feat: restart app toast when changing sources, api url

* fix: potentially fix manager stuck on black screen

* feat: remove select all patches chip

* feat: show all apps and recommended versions

* chore(i18n): remove unused strings

remove unused strings left out in 7e05bca

* feat: select install type before patching

* feat: update patches button (#782)

* feat: update patches button

* feat: show toast when force refresh

* chore: don't translate "ReVanced Manager" and "ReVanced Patches"

* Revert "feat: select install type before patching"

This reverts commit 74e0c09b54.

* feat: rename recommended patches to default patches

* feat: add missing localization

* feat: display restart app toast for resetting source

---------

Co-authored-by: EvadeMaster <93124920+EvadeMaster@users.noreply.github.com>
2023-04-18 13:27:26 +05:30
Palm
0b952578d1 ci(release): update semantic-release 2023-04-02 02:37:49 +07:00
EvadeMaster
054afbbedd feat: confirmation dialog for deleting keystore (#764)
* feat: confirmation dialog for deleting keystore

* refactor(i18n): apply suggestion from code-reviewer

Co-authored-by: Ushie <github@ushie.dev>

* refactor: apply suggestion from code-reviewer

Co-authored-by: Mipirakas <borismichiels@gmail.com>

---------

Co-authored-by: Ushie <github@ushie.dev>
Co-authored-by: Mipirakas <borismichiels@gmail.com>
2023-04-01 21:02:28 +07:00
Palm
866a6e4a44 chore(CHANGELOG): reset changelog 2023-03-30 23:29:26 +07:00
Palm
8ea7dd478b ci(release): update node dependencies 2023-03-30 23:20:31 +07:00
EvadeMaster
7839252934 ci(analyze): only run when necessary (#766)
* ci(analyser): only run on lib/`.dart` changes

* ci(analyser): runs on workflow changes

* ci(analyze): run on all dart file changes

---------

Co-authored-by: Palm <palmpasuthorn@gmail.com>
2023-03-29 20:51:08 +03:00
EvadeMaster
fa4063220f ci: dart analyser (#761)
* ci: dart analyser

* ci(analyser): clarify the dart analysing step

* refactor: ignore generated files

* ci(analyser): apply suggestion from code-reviewer

Co-Authored-By: Palm <palmpasuthorn@gmail.com>

* ci(analyser): apply suggestion from code-reviewer

Co-Authored-By: Palm <palmpasuthorn@gmail.com>

* ci(analyser): apply suggestion from code-reviewer

Co-authored-by: Palm <palmpasuthorn@gmail.com>

---------

Co-authored-by: Palm <palmpasuthorn@gmail.com>
2023-03-28 15:47:34 +07:00
Palm
d214a02abd ci(release): fix argument parsing of npm exec 2023-03-26 23:02:57 +07:00
Palm
d1c12edd1b ci(release): use appropriate npm commands for ci environment 2023-03-26 23:02:57 +07:00
Palm
ded1a44c37 ci(release): fix step not moving artifact to accessible path 2023-03-26 23:02:57 +07:00
Ushie
790a6cd1e3 ci(release): remove unnecessary variables in flutter build step 2023-03-26 18:57:27 +03:00
EvadeMaster
a79f883a0f ci: use caching to speed up workflows (#760)
Use caching to speed up workflows: 9-14 minutes (ish) to 6-8 minutes (ish)

Commits:
* ci(release): use GitHub cache

* ci(release): restore signing
2023-03-26 20:02:56 +07:00
Palm
d9c5a540a3 ci(release): fix wrong artifact name and ci not uploading build 2023-03-24 01:01:44 +07:00
Palm
276f33b9ec ci: use semantic-release (#746) 2023-03-23 17:34:52 +01:00
Ushie
ded59d2da0 feat(ci): update crowdin workflow to use new main branch 2023-03-20 22:39:29 +03:00
Ushie
62f7a820d8 feat: remove notice about stale development [skip ci] 2023-03-20 18:03:58 +03:00
Ushie
7063ffa013 build: bump version to v0.0.57 2023-03-14 21:00:48 +03:00
Ushie
bf4dc3c095 chore: bump stacked
stacked: ^3.0.0 -> ^3.2.0
stacked_generator: ^0.8.0 -> ^1.0.0
stacked_services: ^0.9.3 -> ^1.0.0
2023-03-14 21:00:28 +03:00
EvadeMaster
c10e5848bf Merge pull request #707 from revanced/dev
chore: merge branch `dev` to `flutter`
2023-03-14 22:07:35 +07:00
EvadeMaster
92a3b0d6e0 feat(style): use native switch & chip (#732)
* chore: remove useless themedata

* feat(style): new switch

* feat(style): use native chip components

* chore: remove unused import

* feat(accessibility): set tooltip

* chore: remove unneeded themedata

* chore: fix theme

* feat(i18n): add 3 new strings

* feat(style): correct material 3 theme on nondynamic
2023-03-14 21:53:42 +07:00
Aunali321
b475bd25c8 build: remove env setup step 2023-03-11 23:01:26 +05:30
Aunali321
d318224a6f fix: black screen after resetting custom sources 2023-03-06 18:08:48 +05:30
Aunali321
0074fee865 build: new ci (#731)
New Build CI

Commits:
* buid: re-do ci

* build: ignore tags

* build: get the latest flutter version automatically && formatting

---------

Co-authored-by: EvadeMaster <93124920+EvadeMaster@users.noreply.github.com>
2023-03-05 16:23:51 +07:00
Aunali321
5617535a63 refactor: remove sentry and crowdin (#730)
We no longer use sentry and crowdin.
2023-03-05 16:12:46 +07:00
EvadeMaster
68ccefc59f revert: "refactor: update deprecated and minor code refactors (#710)"
This reverts commit 6829d3cdea.

Signed-off-by: EvadeMaster <93124920+EvadeMaster@users.noreply.github.com>
2023-03-03 18:06:24 +07:00
Ushie
6d60541626 chore(deps): meet patcher breaking changes 2023-03-03 03:11:44 +03:00
EvadeMaster
a635e5b8d0 chore: addFiles -> addIntegrations (#725)
fix #721
2023-03-02 14:51:35 +07:00
EvadeMaster
48a10440fe ci(build): remove environment on PR build 2023-03-02 11:06:15 +07:00
EvadeMaster
8e3ba88318 chore: bump gradle 7.5-rc.1 -> 7.6.1 (#717)
* chore: upgrade gradle from 7.5-rc.1 -> 7.6.1

* chore: remove unrelated changes
2023-02-27 19:26:10 +07:00
EvadeMaster
ab8fccc544 chore(deps): bump patcher version from 6.4.3 -> 7.0.0 2023-02-27 19:19:19 +07:00
EvadeMaster
8319dc9164 fix: improperly sized monochrome icon (#715) 2023-02-27 19:07:44 +07:00
Sailesh Dahal
6829d3cdea refactor: update deprecated and minor code refactors (#710)
Improve code readability & additional refactoring

Commits:
chore: exclude generated from analyzer

refactor: add SharedPreferences to locator

refactor: access shared pref from locator, and code refactor

refactor: remove unwanted `await`

refactor: remove `const` from `CacheConfig`
2023-02-27 19:06:05 +07:00
EvadeMaster
3ae4d69110 chore: migrate deprecation code && code cleanup (#708)
Fixes all issues in `flutter analyze`.
<Reviewed>

Commits:
* chore: migrate deprecated text style

* chore: migrate `toggleableActiveColor` to individual theme

* chore: don't use 'BuildContext's across async gaps
2023-02-20 16:53:53 +07:00
LisoUseInAIKyrios
dc665f227e fix: use high resolution adaptive icons (#675)
Use high-resolution icons instead of the low-resolution ones on ReVanced Manager.

Commits:
* High resolution adaptive icons, built using revanced-logo-no-background.svg

Same icons currently used for ReVanced YouTube.

* tweak background color to match revanced-logo-no-background.svg

* recreated foreground using 'revanced-logo-shape.svg'

* updated full resolution icons, using same ratio as original SVG

* updated icons with gradient border
2023-02-17 19:28:01 +07:00
EvadeMaster
a83496568f chore: code cleanup (#681)
Improve the readability of the code.

Commits:
* chore: correct typos `fragement` to `fragment`

* chore: put a single newline at end of file.
2023-02-17 18:53:23 +07:00
Alex
12d25570af fix: Long patch description truncated (#702)
fix: long patch description truncated (#702)

Allow flexible height
2023-02-14 18:42:24 +07:00
EvadeMaster
378c947654 chore: bump version to v0.0.56 2023-02-12 13:04:34 +07:00
EvadeMaster
bd39a3140e feat: fix patch bundle version no longer displayed (#686) 2023-02-12 00:02:30 +07:00
Boris Michiels
7d3ca3dec1 fix: display patches version on first load (#687) 2023-02-12 00:00:01 +07:00
oSumAtrIX
1cb556c8f8 chore: bump version to 0.0.55 2023-02-11 23:59:53 +07:00
oSumAtrIX
8c8f96de1c build: bump patcher version 2023-02-11 23:59:47 +07:00
424 changed files with 30249 additions and 16541 deletions

3
.env
View File

@@ -1,3 +0,0 @@
sentryDSN=
apiKey=
appId=

View File

@@ -1,120 +0,0 @@
name: 🐞 Bug report
description: Report a very clearly broken issue.
title: 'bug: <title>'
labels: [bug]
body:
- type: markdown
attributes:
value: |
# ReVanced Manager bug report
Important to note that your issue may have already been reported before. Please check for existing issues [here](https://github.com/revanced/revanced-manager/labels/bug).
- type: dropdown
attributes:
label: Type
options:
- Error while running the manager
- Error at runtime
- Cosmetic
- Other
validations:
required: true
- type: textarea
attributes:
label: Bug description
description: How did you find the bug? Any additional details that might help?
validations:
required: true
- type: textarea
attributes:
label: Steps to reproduce
description: Add the steps to reproduce this bug including your environment.
placeholder: Step 1. Download some files. Step 2. ...
validations:
required: true
- type: textarea
attributes:
label: Android version
description: Android version used.
validations:
required: true
- type: textarea
attributes:
label: Manager version
description: Manager version used.
validations:
required: true
- type: textarea
attributes:
label: Target package name
description: App you tried to patch.
validations:
required: true
- type: textarea
attributes:
label: Target package version.
description: Version of the app you tried to patch.
validations:
required: true
- type: dropdown
attributes:
label: Installation type
options:
- Non-root
- Root
validations:
required: true
- type: textarea
attributes:
label: Patches selected.
description: Patches you selected for the app.
validations:
required: true
- type: textarea
attributes:
label: Device logs (exported using Manager settings).
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
render: shell
validations:
required: true
- type: textarea
attributes:
label: Installer logs (exported using Installer menu option) [unneeded if issue is not during patching].
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
render: shell
validations:
required: false
- type: textarea
attributes:
label: Screenshots or videos
description: Add screenshots or videos that show the bug here.
placeholder: Drag and drop the screenshots/videos into this box.
validations:
required: false
- type: textarea
attributes:
label: Solution
description: If applicable, add a possible solution.
validations:
required: false
- type: textarea
attributes:
label: Additional context
description: Add additional context here.
validations:
required: false
- type: checkboxes
id: acknowledgements
attributes:
label: Acknowledgements
description: Your issue will be closed if you haven't done these steps.
options:
- label: I have searched the existing issues and this is a new and no duplicate or related to another open issue.
required: true
- 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
- label: The issue is related solely to the ReVanced Manager and not related to patching errors or patches
required: true

109
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,109 @@
name: 🐞 Bug report
description: Report a bug or an issue.
title: 'bug: '
labels: ['Bug report']
body:
- type: markdown
attributes:
value: |
<p align="center">
<picture>
<source
width="256px"
media="(prefers-color-scheme: dark)"
srcset="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-headline/revanced-headline-vertical-dark.svg"
>
<img
width="256px"
src="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-headline/revanced-headline-vertical-light.svg"
>
</picture>
<br>
<a href="https://revanced.app/">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-logo/revanced-logo.svg" />
<img height="24px" src="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-logo/revanced-logo.svg" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://github.com/ReVanced">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" />
<img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="http://revanced.app/discord">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://reddit.com/r/revancedapp">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://t.me/app_revanced">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://x.com/revancedapp">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png">
<img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://www.youtube.com/@ReVanced">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" />
</picture>
</a>
<br>
<br>
Continuing the legacy of Vanced
</p>
# ReVanced Manager bug report
Before creating a new bug report, please keep the following in mind:
- **Do not submit a duplicate bug report**: Search for existing bug reports [here](https://github.com/ReVanced/revanced-manager/issues?q=label%3A%22Bug+report%22).
- **Review the contribution guidelines**: Make sure your bug report adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-manager/blob/main/CONTRIBUTING.md).
- **Do not use the issue page for support**: If you need help or have questions, check out other platforms on [revanced.app](https://revanced.app).
- type: textarea
attributes:
label: Bug description
description: |
- Describe your bug in detail
- Add steps to reproduce the bug if possible (Step 1. ... Step 2. ...)
- Add images and videos if possible
- List used patches, downloader and settings if applicable
validations:
required: true
- type: textarea
attributes:
label: Patch logs
description: Patch logs can be exported by clicking on the "Logs" button in the "Patcher" screen, when patching finishes.
render: shell
- type: textarea
attributes:
label: Debug logs
description: Debug logs can be exported by clicking on "Export debug logs" in "Settings" > "Advanced".
validations:
required: true
- type: checkboxes
attributes:
label: Acknowledgements
description: Your bug report will be closed if you don't follow the checklist below.
options:
- label: I have checked all open and closed bug reports and this is not a duplicate.
required: true
- label: I have chosen an appropriate title.
required: true
- label: All requested information has been provided properly.
required: true
- label: The bug is only related to ReVanced Manager.
required: true

View File

@@ -1 +1,5 @@
blank_issues_enabled: false
blank_issues_enabled: false
contact_links:
- name: 🗨 Discussions
url: https://github.com/revanced/revanced-suggestions/discussions
about: Have something unspecific to ReVanced Manager in mind? Search for or start a new discussion!

View File

@@ -1,52 +0,0 @@
name: ⭐ Feature request
description: Create a detailed feature request.
title: 'feat: <title>'
labels: [feature-request]
body:
- type: dropdown
attributes:
label: Type
options:
- Functionality
- Cosmetic
- Other
validations:
required: true
- type: textarea
attributes:
label: Issue
description: What is the current problem. Why does it require a feature request?
validations:
required: true
- type: textarea
attributes:
label: Feature
description: Describe your feature in detail. How does it solve the issue?
validations:
required: true
- type: textarea
attributes:
label: Motivation
description: Why should your feature should be considered?
validations:
required: true
- type: textarea
attributes:
label: Additional context
description: Add additional context here.
validations:
required: false
- type: checkboxes
id: acknowledgements
attributes:
label: Acknowledgements
description: Your issue will be closed if you haven't done these steps.
options:
- label: I have searched the existing issues and this is a new and no duplicate or related to another open issue.
required: true
- 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
- label: The issue is related solely to the ReVanced Manager
required: true

View File

@@ -0,0 +1,103 @@
body:
- type: markdown
attributes:
value: |
<p align="center">
<picture>
<source
width="256px"
media="(prefers-color-scheme: dark)"
srcset="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-headline/revanced-headline-vertical-dark.svg"
>
<img
width="256px"
src="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-headline/revanced-headline-vertical-light.svg"
>
</picture>
<br>
<a href="https://revanced.app/">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-logo/revanced-logo.svg" />
<img height="24px" src="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-logo/revanced-logo.svg" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://github.com/ReVanced">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" />
<img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="http://revanced.app/discord">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://reddit.com/r/revancedapp">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://t.me/app_revanced">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://x.com/revancedapp">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png">
<img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://www.youtube.com/@ReVanced">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" />
</picture>
</a>
<br>
<br>
Continuing the legacy of Vanced
</p>
# ReVanced Manager feature request
Before creating a new feature request, please keep the following in mind:
- **Do not submit a duplicate feature request**: Search for existing feature requests [here](https://github.com/ReVanced/revanced-manager/issues?q=label%3A%22Feature+request%22).
- **Review the contribution guidelines**: Make sure your feature request adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-manager/blob/main/CONTRIBUTING.md).
- **Do not use the issue page for support**: If you need help or have questions, check out other platforms on [revanced.app](https://revanced.app).
- type: textarea
attributes:
label: Feature description
description: |
- Describe your feature in detail
- Add images, videos, links, examples, references, etc. if possible
- type: textarea
attributes:
label: Motivation
description: |
A strong motivation is necessary for a feature request to be considered.
- Why should this feature be implemented?
- What is the explicit use case?
- What are the benefits?
- What makes this feature important?
validations:
required: true
- type: checkboxes
id: acknowledgements
attributes:
label: Acknowledgements
description: Your feature request will be closed if you don't follow the checklist below.
options:
- label: I have checked all open and closed feature requests and this is not a duplicate
required: true
- label: I have chosen an appropriate title.
required: true
- label: All requested information has been provided properly.
required: true
- label: The feature request is only related to ReVanced Manager.
required: true

2
.github/config.yaml vendored Normal file
View File

@@ -0,0 +1,2 @@
firstPRMergeComment: >
Thank you for contributing to ReVanced. Join us on [Discord](https://revanced.app/discord) to receive a role for your contribution.

View File

@@ -0,0 +1,33 @@
name: Build pull request
on:
workflow_dispatch:
pull_request:
branches:
- dev
jobs:
release:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cache Gradle
uses: burrunan/gradle-cache-action@v1
- name: Build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./gradlew assembleRelease --no-daemon
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: revanced-manager
path: |
app/build/outputs/apk/release/revanced-manager*.apk
app/build/outputs/apk/release/revanced-manager*.apk.asc

View File

@@ -1,55 +0,0 @@
name: "Android CI Actions"
on:
push:
branches:
- "**"
tags-ignore:
- "v*" # Ignore tags that start with "v" (e.g. v1.0.0) because they are handled by release-build.yml
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set env
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Set up JDK 12
uses: actions/setup-java@v3
with:
java-version: '12'
distribution: 'zulu'
- uses: subosito/flutter-action@v2
with:
channel: 'stable'
- name: Set environment variables
run: echo $SECRETS | base64 -d > lib/utils/environment.dart
env:
SECRETS: ${{ secrets.SECRETS }}
- name: Set up Flutter
run: flutter pub get
- name: Generate files with Builder
run: flutter packages pub run build_runner build --delete-conflicting-outputs
- name: Build with Flutter
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS }}
SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD }}
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_KEYSTORE_PASSWORD }}
run: flutter build apk
- name: Sign APK
id: sign_apk
uses: ilharp/sign-android-release@v1
with:
releaseDir: build/app/outputs/apk/release
signingKey: ${{ secrets.SIGNING_KEYSTORE }}
keyStorePassword: ${{ secrets.SIGNING_KEYSTORE_PASSWORD }}
keyAlias: ${{ secrets.SIGNING_KEY_ALIAS }}
keyPassword: ${{ secrets.SIGNING_KEY_PASSWORD }}
- name: Add version to APK
run: mv ${{ steps.sign_apk.outputs.signedFile }} revanced-manager-${{ env.RELEASE_VERSION }}.apk
- name: Upload APK
uses: actions/upload-artifact@v3
with:
name: revanced-manager-${{ env.RELEASE_VERSION }}
path: revanced-manager-${{ env.RELEASE_VERSION }}.apk

View File

@@ -1,46 +0,0 @@
name: Sync Crowdin translations
on:
push:
branches:
- "flutter"
paths:
- "assets/i18n/en_US.json"
- ".github/workflows/crowdin.yml"
schedule:
- cron: "0 0 * * *" # daily
workflow_dispatch:
jobs:
sync-crowdin:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Crowdin
uses: crowdin/github-action@v1
with:
config: crowdin.yml
upload_sources: true
upload_translations: false
download_translations: true
push_translations: true
create_pull_request: false
localization_branch_name: i18n_flutter
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
# commented due to Manager not being ready for the translated files to be in the main branch
# - name: GitHub is so dumb i just cant
# run: |
# sudo chmod -R ugo+rwX .
# - name: Merge
# run: |
# git checkout flutter
# git add *
# git merge i18n_flutter
# git push

26
.github/workflows/open_pull_request.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: Open a PR to main
on:
push:
branches:
- dev
workflow_dispatch:
env:
MESSAGE: Merge branch `${{ github.head_ref || github.ref_name }}` to `main`
jobs:
pull-request:
name: Open pull request
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Open pull request
uses: repo-sync/pull-request@v2
with:
destination_branch: 'main'
pr_title: 'chore: ${{ env.MESSAGE }}'
pr_body: 'This pull request will ${{ env.MESSAGE }}.'
pr_draft: true

View File

@@ -1,41 +0,0 @@
name: "Android CI PR Build"
on:
pull_request:
branches:
- "**"
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set env
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Set up JDK 12
uses: actions/setup-java@v3
with:
java-version: '12'
distribution: 'zulu'
- uses: subosito/flutter-action@v2
with:
channel: 'stable'
- name: Set environment variables
run: echo $SECRETS | base64 -d > lib/utils/environment.dart
env:
SECRETS: ${{ secrets.SECRETS }}
- name: Set up Flutter
run: flutter pub get
- name: Generate files with Builder
run: flutter packages pub run build_runner build --delete-conflicting-outputs
- name: Build with Flutter
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: flutter build apk
- name: Add version to APK
run: mv build/app/outputs/flutter-apk/app-release.apk revanced-manager-${{ env.RELEASE_VERSION }}.apk
- name: Upload APK
uses: actions/upload-artifact@v3
with:
name: revanced-manager-${{ env.RELEASE_VERSION }}
path: revanced-manager-${{ env.RELEASE_VERSION }}.apk

View File

@@ -1,54 +0,0 @@
name: "Release Build"
on:
push:
tags:
- "v*"
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set env
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Set up JDK 12
uses: actions/setup-java@v3
with:
java-version: '12'
distribution: 'zulu'
- uses: subosito/flutter-action@v2
with:
channel: 'stable'
- name: Set environment variables
run: echo $SECRETS | base64 -d > lib/utils/environment.dart
env:
SECRETS: ${{ secrets.SECRETS }}
- name: Set up Flutter
run: flutter pub get
- name: Generate files with Builder
run: flutter packages pub run build_runner build --delete-conflicting-outputs
- name: Build with Flutter
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS }}
SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD }}
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_KEYSTORE_PASSWORD }}
run: flutter build apk
- name: Sign APK
id: sign_apk
uses: ilharp/sign-android-release@v1
with:
releaseDir: build/app/outputs/apk/release
signingKey: ${{ secrets.SIGNING_KEYSTORE }}
keyStorePassword: ${{ secrets.SIGNING_KEYSTORE_PASSWORD }}
keyAlias: ${{ secrets.SIGNING_KEY_ALIAS }}
keyPassword: ${{ secrets.SIGNING_KEY_PASSWORD }}
- name: Add version to APK
run: mv ${{steps.sign_apk.outputs.signedFile}} revanced-manager-${{ env.RELEASE_VERSION }}.apk
- name: Publish release APK
uses: "marvinpinto/action-automatic-releases@latest"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: false
files: revanced-manager-${{ env.RELEASE_VERSION }}.apk

72
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,72 @@
name: Release
on:
workflow_dispatch:
push:
branches:
- main
- dev
jobs:
release:
name: Release
permissions:
contents: write
id-token: write
attestations: write
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
- name: Cache Gradle
uses: burrunan/gradle-cache-action@v1
- name: Build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./gradlew assembleRelease
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "lts/*"
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v6
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
fingerprint: ${{ vars.GPG_FINGERPRINT }}
- name: Setup keystore
run: |
echo "${{ secrets.KEYSTORE }}" | base64 --decode > "app/keystore.jks"
- name: Semantic Release
uses: cycjimmy/semantic-release-action@v4
id: semantic
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEYSTORE_ENTRY_ALIAS: ${{ secrets.KEYSTORE_ENTRY_ALIAS }}
KEYSTORE_ENTRY_PASSWORD: ${{ secrets.KEYSTORE_ENTRY_PASSWORD }}
- name: Attest
if: steps.semantic.outputs.new_release_published == 'true'
uses: actions/attest-build-provenance@v2
with:
subject-name: 'ReVanced Manager ${{ steps.release.outputs.new_release_git_tag }}'
subject-path: app/build/outputs/apk/release/revanced-manager*.apk

View File

@@ -0,0 +1,19 @@
name: Update documentation
on:
push:
paths:
- docs/**
jobs:
trigger:
runs-on: ubuntu-latest
name: Dispatch event to documentation repository
if: github.ref == 'refs/heads/main'
steps:
- uses: peter-evans/repository-dispatch@v3
with:
token: ${{ secrets.DOCUMENTATION_REPO_ACCESS_TOKEN }}
repository: revanced/revanced-documentation
event-type: update-documentation
client-payload: '{"repo": "${{ github.event.repository.name }}", "ref": "${{ github.ref }}"}'

252
.gitignore vendored
View File

@@ -1,138 +1,132 @@
# Miscellaneous
### Java template
# Compiled class file
*.class
*.lock
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
# IntelliJ related
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
.idea/artifacts
.idea/compiler.xml
.idea/jarRepositories.xml
.idea/modules.xml
.idea/*.iml
.idea/modules
*.iml
*.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### Gradle template
.gradle
**/build/
!src/**/build/
# Ignore Gradle GUI config
gradle-app.setting
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar
# Cache of project
.gradletasknamecache
# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
# gradle/wrapper/gradle-wrapper.properties
# Potentially copyrighted test APK
*.apk
# Ignore vscode config
.vscode/
# Dependency directories
node_modules/
# Ignore IDEA files
.idea/
# Visual Studio Code related
.classpath
.project
.settings/
.kotlin/
# Flutter repo-specific
/bin/cache/
/bin/mingit/
/dev/benchmarks/mega_gallery/
/dev/bots/.recipe_deps
/dev/bots/android_tools/
/dev/docs/doc/
/dev/docs/flutter.docs.zip
/dev/docs/lib/
/dev/docs/pubspec.yaml
/dev/integration_tests/**/xcuserdata
/dev/integration_tests/**/Pods
/packages/flutter/coverage/
version
local.properties
# packages file containing multi-root paths
.packages.generated
# Flutter/Dart/Pub related
**/doc/api/
**/*.g.dart
**/*.locator.dart
**/*.router.dart
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
**/generated_plugin_registrant.dart
.packages
.pub-cache/
.pub/
build/
flutter_*.png
linked_*.ds
unlinked.ds
unlinked_spec.ds
# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java
**/android/key.properties
*.jks
# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/.last_build_id
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Flutter.podspec
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/Flutter/flutter_export_environment.sh
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*
# macOS related
**/macos/Flutter/GeneratedPluginRegistrant.swift
**/macos/Flutter/Flutter-Debug.xcconfig
**/macos/Flutter/Flutter-Release.xcconfig
**/macos/Flutter/Flutter-Profile.xcconfig
# Windows related
**/windows/flutter/ephemeral/
**/windows/**/*.suo
**/windows/**/*.user
**/windows/**/*.userosscache
**/windows/**/*.sln.docstates
**/windows/x64/
**/windows/x86/
**/windows/**/*.[Cc]ache
**/windows/**/!*.[Cc]ache/
# Web related
lib/generated_plugin_registrant.dart
# Coverage
coverage/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
!/dev/ci/**/Gemfile.lock
Firebase related
.firebase
.cxx

View File

@@ -1,45 +0,0 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled.
version:
revision: 85684f9300908116a78138ea4c6036c35c9a1236
channel: stable
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 85684f9300908116a78138ea4c6036c35c9a1236
base_revision: 85684f9300908116a78138ea4c6036c35c9a1236
- platform: android
create_revision: 85684f9300908116a78138ea4c6036c35c9a1236
base_revision: 85684f9300908116a78138ea4c6036c35c9a1236
- platform: ios
create_revision: 85684f9300908116a78138ea4c6036c35c9a1236
base_revision: 85684f9300908116a78138ea4c6036c35c9a1236
- platform: linux
create_revision: 85684f9300908116a78138ea4c6036c35c9a1236
base_revision: 85684f9300908116a78138ea4c6036c35c9a1236
- platform: macos
create_revision: 85684f9300908116a78138ea4c6036c35c9a1236
base_revision: 85684f9300908116a78138ea4c6036c35c9a1236
- platform: web
create_revision: 85684f9300908116a78138ea4c6036c35c9a1236
base_revision: 85684f9300908116a78138ea4c6036c35c9a1236
- platform: windows
create_revision: 85684f9300908116a78138ea4c6036c35c9a1236
base_revision: 85684f9300908116a78138ea4c6036c35c9a1236
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'

49
.releaserc Normal file
View File

@@ -0,0 +1,49 @@
{
"branches": [
"main",
{
"name": "dev",
"prerelease": true
}
],
"plugins": [
[
"@semantic-release/commit-analyzer", {
"releaseRules": [
{ "type": "build", "scope": "Needs bump", "release": "patch" }
]
}
],
"@semantic-release/release-notes-generator",
"@semantic-release/changelog",
"gradle-semantic-release-plugin",
[
"@semantic-release/git",
{
"assets": [
"CHANGELOG.md",
"gradle.properties",
],
"message": "chore: Release v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}
],
[
"@semantic-release/github",
{
"assets": [
{
"path": "app/build/outputs/apk/release/revanced-manager*.apk?(.asc)"
},
],
successComment: false
}
],
[
"@saithodev/semantic-release-backmerge",
{
backmergeBranches: [{"from": "main", "to": "dev"}],
clearWorkspace: true
}
]
]
}

View File

@@ -1,6 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="main.dart" type="FlutterRunConfigurationType" factoryName="Flutter">
<option name="filePath" value="$PROJECT_DIR$/lib/main.dart" />
<method v="2" />
</configuration>
</component>

91
.vscode/tasks.json vendored
View File

@@ -1,91 +0,0 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Generate (Builder)",
"type": "shell",
"command": "flutter packages pub run build_runner build --delete-conflicting-outputs",
"problemMatcher": []
},
{
"label": "Build (Android)",
"type": "shell",
"command": "flutter build apk",
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "Install (Android)",
"type": "shell",
"command": "adb install build\\app\\outputs\\flutter-apk\\app-release.apk",
"problemMatcher": []
},
{
"label": "Clean (Flutter)",
"type": "shell",
"command": "flutter clean && flutter pub get",
"problemMatcher": []
},
{
"label": "Clean (Builder)",
"type": "shell",
"command": "flutter packages pub run build_runner clean",
"problemMatcher": []
},
{
"label": "Build all (Android)",
"dependsOrder": "sequence",
"dependsOn": [
"Generate (Builder)",
"Build (Android)"
],
"problemMatcher": []
},
{
"label": "Clean all",
"dependsOrder": "sequence",
"dependsOn": [
"Clean (Flutter)",
"Clean (Builder)"
],
"problemMatcher": []
},
{
"label": "Clean all & Build all (Android)",
"dependsOrder": "sequence",
"dependsOn": [
"Clean all",
"Build all (Android)"
],
"problemMatcher": []
},
{
"label": "Clean all & Install (Android)",
"dependsOrder": "sequence",
"dependsOn": [
"Clean all",
"Build all (Android)",
"Install (Android)",
],
"problemMatcher": []
},
{
"label": "Build & Install (Android)",
"dependsOrder": "sequence",
"dependsOn": [
"Build (Android)",
"Install (Android)"
],
"problemMatcher": []
},
{
"label": "Validate translations",
"type": "shell",
"command": "flutter pub run flutter_i18n diff en.json pt.json",
"problemMatcher": []
}
]
}

103
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,103 @@
<p align="center">
<picture>
<source
width="256px"
media="(prefers-color-scheme: dark)"
srcset="assets/revanced-headline/revanced-headline-vertical-dark.svg"
>
<img
width="256px"
src="assets/revanced-headline/revanced-headline-vertical-light.svg"
>
</picture>
<br>
<a href="https://revanced.app/">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="assets/revanced-logo/revanced-logo.svg" />
<img height="24px" src="assets/revanced-logo/revanced-logo.svg" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://github.com/ReVanced">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" />
<img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="http://revanced.app/discord">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://reddit.com/r/revancedapp">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://t.me/app_revanced">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://x.com/revancedapp">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png">
<img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://www.youtube.com/@ReVanced">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" />
</picture>
</a>
<br>
<br>
Continuing the legacy of Vanced
</p>
# 👋 Contribution guidelines
This document describes how to contribute to ReVanced Manager.
## 📖 Resources to help you get started
* The [documentation](/docs/README.md) provides steps to build ReVanced Manager from source
* Our [backlog](https://github.com/orgs/ReVanced/projects/12) is where we keep track of what we're working on
* [Issues](https://github.com/ReVanced/revanced-manager/issues) are where we keep track of bugs and feature requests
## 🙏 Submitting a feature request
Features can be requested by opening an issue using the
[Feature request issue template](https://github.com/ReVanced/revanced-manager/issues/new?assignees=&labels=Feature+request&projects=&template=feature_request.yml&title=feat%3A+).
> **Note**
> Requests can be accepted or rejected at the discretion of maintainers of ReVanced Manager.
> Good motivation has to be provided for a request to be accepted.
## 🐞 Submitting a bug report
If you encounter a bug while using ReVanced Manager, open an issue using the
[Bug report issue template](https://github.com/ReVanced/revanced-manager/issues/new?assignees=&labels=Bug+report&projects=&template=bug_report.yml&title=bug%3A+).
## 📝 How to contribute
1. Before contributing, it is recommended to open an issue to discuss your change
with the maintainers of ReVanced Manager. This will help you determine whether your change is acceptable
and whether it is worth your time to implement it
2. Development happens on the `dev` branch. Fork the repository and create your branch from `dev`
3. Commit your changes
4. Submit a pull request to the `dev` branch of the repository and reference issues
that your pull request closes in the description of your pull request
5. Our team will review your pull request and provide feedback. Once your pull request is approved,
it will be merged into the `dev` branch and will be included in the next release of ReVanced Manager
## 🤚 I want to contribute but don't know how to code
Even if you don't know how to code, you can still contribute by
translating ReVanced Manager on [Crowdin](https://translate.revanced.app/).
❤️ Thank you for considering contributing to ReVanced Manager,
ReVanced

115
README.md
View File

@@ -1,37 +1,104 @@
<p align="center">
<picture>
<source
width="256px"
media="(prefers-color-scheme: dark)"
srcset="assets/revanced-headline/revanced-headline-vertical-dark.svg"
>
<img
width="256px"
src="assets/revanced-headline/revanced-headline-vertical-light.svg"
>
</picture>
<br>
<a href="https://revanced.app/">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="assets/revanced-logo/revanced-logo.svg" />
<img height="24px" src="assets/revanced-logo/revanced-logo.svg" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://github.com/ReVanced">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" />
<img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="http://revanced.app/discord">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://reddit.com/r/revancedapp">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://t.me/app_revanced">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://x.com/revancedapp">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png">
<img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" />
</picture>
</a>&nbsp;&nbsp;&nbsp;
<a href="https://www.youtube.com/@ReVanced">
<picture>
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" />
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" />
</picture>
</a>
<br>
<br>
Continuing the legacy of Vanced
</p>
# 💊 ReVanced Manager
The official ReVanced Manager based on Flutter.
![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/ReVanced/revanced-manager/release.yml)
![GPLv3 License](https://img.shields.io/badge/License-GPL%20v3-yellow.svg)
> **Warning**: This repository currently has no active maintainer. For that reason, development is stale. Active development continues for [revanced-cli](https://github.com/revanced/revanced-cli). If you are interested in maintaining this repository, please let us know at manager@revanced.app.
Application to use ReVanced on Android
## ❓ About
ReVanced Manager is an application that uses [ReVanced Patcher](https://github.com/revanced/revanced-patcher) to patch Android apps.
## 💪 Features
Some of the features ReVanced Manager provides are:
- ⬇️ **Download**: Automatically download apps using the ReVanced Manager downloader plugin system
- 💉 **Patch**: Select and apply patches to any Android app
- 🛠️ **Customize**: Manage patches, apps, signing, themes, updates, and many more settings
## 🔽 Download
To download the Alpha version of Manager, go [here](https://github.com/revanced/revanced-manager/releases/latest) and install the provided APK file.
## 📝 Prerequisites
1. Android 8 or higher
2. Does not work on some armv7 devices
3. [Vanced MicroG](https://github.com/TeamVanced/VancedMicroG/releases) required for YouTube and YouTube Music (Only for non-root)
You can download the most recent version of ReVanced Manager at [revanced.app/download](https://revanced.app/download) or from [GitHub releases](https://github.com/ReVanced/revanced-manager/releases/latest).
Learn how to use ReVanced Manager by following the [documentation](/docs).
## ⚠️ Disclaimer
*Please note that even though we're releasing the Manager, it is an ALPHA version. There's a big chance that the Manager might not work at all for you.*
## 📚 Everything else
## 🔴 Issues
For suggestions and bug reports, open an issue [here](https://github.com/revanced/revanced-manager/issues/new/choose).
### 📙 Contributing
## 💭 Discussion
If you wish to discuss the Manager, a thread has been made under the [#development](https://discord.com/channels/952946952348270622/1002922226443632761) channel in the Discord server, please note that this thread may be temporary and may be removed in the future.
Thank you for considering contributing to ReVanced Manager.
You can find the contribution guidelines [here](CONTRIBUTING.md).
### 🛠️ Building
## 🌐 Translation
[![Crowdin](https://badges.crowdin.net/revanced/localized.svg)](https://crowdin.com/project/revanced)
To build a ReVanced Manager, you can follow the [documentation](/docs).
If you wish to translate ReVanced Manager, we're accepting translations on [Crowdin](https://translate.revanced.app)
### 📄 Documentation
## 🛠️ Building Manager from source
1. Setup flutter environment for your [platform](https://docs.flutter.dev/get-started/install)
2. Clone the repository locally
3. Add your github token in gradle.properties like [this](https://github.com/revanced/revanced-manager/blob/docs/docs/5_building-from-source.md)
4. Open the project in terminal
5. Run `flutter pub get` in terminal
6. Then `flutter packages pub run build_runner build --delete-conflicting-outputs` (Must be done on each git pull)
7. To build release apk run `flutter build apk`
You can find the documentation for ReVanced Manager [here](/docs).
## ⚖️ License
ReVanced Manager is licensed under the GPLv3 license. Please see the [license file](LICENSE) for more information.
[tl;dr](https://www.tldrlegal.com/license/gnu-general-public-license-v3-gpl-3) you may copy, distribute and modify ReVanced Manager as long as you track changes/dates in source files.
Any modifications to ReVanced Manager must also be made available under the GPL, along with build & install instructions.

View File

@@ -1,162 +0,0 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
analyzer:
exclude:
- lib/utils/env_class.g.dart
linter:
rules:
- always_declare_return_types
- require_trailing_commas
- always_put_control_body_on_new_line
- always_require_non_null_named_parameters
- always_use_package_imports # we do this commonly
- annotate_overrides
- avoid_bool_literals_in_conditional_expressions
- avoid_double_and_int_checks
- avoid_empty_else
- avoid_equals_and_hash_code_on_mutable_classes
- avoid_escaping_inner_quotes
- avoid_field_initializers_in_const_classes
- avoid_function_literals_in_foreach_calls
- avoid_implementing_value_types
- avoid_init_to_null
- avoid_js_rounded_ints
- avoid_null_checks_in_equality_operators
- avoid_print
- avoid_redundant_argument_values
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
- avoid_returning_null
- avoid_returning_null_for_future
- avoid_returning_null_for_void
- avoid_setters_without_getters
- avoid_shadowing_type_parameters
- avoid_single_cascade_in_expression_statements
- avoid_type_to_string
- avoid_types_as_parameter_names
- avoid_unnecessary_containers
- avoid_void_async
- avoid_web_libraries_in_flutter # we use web libraries in web-specific code, and our tests prevent us from using them elsewhere
- await_only_futures
- camel_case_extensions
- camel_case_types
- cancel_subscriptions
- cast_nullable_to_non_nullable
- close_sinks # not reliable enough
- control_flow_in_finally
- curly_braces_in_flow_control_structures
- depend_on_referenced_packages
- deprecated_consistency
- directives_ordering
- empty_catches
- empty_constructor_bodies
- empty_statements
- eol_at_end_of_file
- exhaustive_cases
- file_names
- flutter_style_todos
- hash_and_equals
- implementation_imports
- iterable_contains_unrelated_type
- leading_newlines_in_multiline_strings
- library_names
- library_prefixes
- library_private_types_in_public_api
- list_remove_unrelated_type
- missing_whitespace_between_adjacent_strings
- no_adjacent_strings_in_list
- no_duplicate_case_values
- no_logic_in_create_state
- non_constant_identifier_names
- noop_primitive_operations
- null_check_on_nullable_type_parameter
- null_closures
- overridden_fields
- package_api_docs
- package_names
- package_prefixed_library_names
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
- prefer_collection_literals
- prefer_conditional_assignment
- prefer_const_constructors
- prefer_const_constructors_in_immutables
- prefer_const_declarations
- prefer_const_literals_to_create_immutables
- prefer_contains
- prefer_equal_for_default_values
- prefer_final_fields
- prefer_final_in_for_each
- prefer_final_locals
- prefer_for_elements_to_map_fromIterable
- prefer_foreach
- prefer_function_declarations_over_variables
- prefer_generic_function_type_aliases
- prefer_if_elements_to_conditional_expressions
- prefer_if_null_operators
- prefer_initializing_formals
- prefer_inlined_adds
- prefer_interpolation_to_compose_strings
- prefer_is_empty
- prefer_is_not_empty
- prefer_is_not_operator
- prefer_iterable_whereType
- prefer_mixin # Has false positives, see https://github.com/dart-lang/linter/issues/3018
- prefer_null_aware_method_calls # "call()" is confusing to people new to the language since it's not documented anywhere
- prefer_null_aware_operators
- prefer_single_quotes
- prefer_spread_collections
- prefer_typing_uninitialized_variables
- prefer_void_to_null
- provide_deprecation_message
- recursive_getters
- sized_box_for_whitespace
- slash_for_doc_comments
- sort_child_properties_last
- sort_constructors_first
- sort_unnamed_constructors_first
- test_types_in_equals
- throw_in_finally
- tighten_type_of_initializing_formals
- type_init_formals
- unnecessary_brace_in_string_interps
- unnecessary_const
- unnecessary_getters_setters
- unnecessary_new
- unnecessary_null_aware_assignments
- unnecessary_null_checks
- unnecessary_null_in_if_null_operators
- unnecessary_nullable_for_final_variable_declarations
- unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_statements
- unnecessary_string_escapes
- unnecessary_string_interpolations
- unnecessary_this
- unrelated_type_equality_checks
- unsafe_html
- use_build_context_synchronously
- use_full_hex_values_for_flutter_colors
- use_function_type_syntax_for_parameters
- use_if_null_to_convert_nulls_to_bools
- use_is_even_rather_than_modulo
- use_key_in_widget_constructors
- use_late_for_private_fields_and_variables
- use_named_constants
- use_raw_strings
- use_rethrow_when_possible
- use_setters_to_change_properties
- use_test_throws_matchers
- valid_regexps
- void_checks

13
android/.gitignore vendored
View File

@@ -1,13 +0,0 @@
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
**/*.keystore
**/*.jks

View File

@@ -1,84 +0,0 @@
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
compileSdkVersion 33
ndkVersion flutter.ndkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '11'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
applicationId "app.revanced.manager.flutter"
minSdkVersion 26
targetSdkVersion 33
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
buildTypes {
release {
shrinkResources false
minifyEnabled false
signingConfig signingConfigs.debug
}
}
packagingOptions {
exclude '/prebuilt/**'
}
}
flutter {
source '../..'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
// ReVanced
implementation "app.revanced:revanced-patcher:6.4.2"
// Signing & aligning
implementation("org.bouncycastle:bcpkix-jdk15on:1.70")
implementation("com.android.tools.build:apksig:7.2.2")
// MicroG cronet
implementation("org.microg:cronet-common:$cronetVersion")
implementation("org.microg:cronet-native:$cronetVersion")
}

View File

@@ -1,4 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="app.revanced.manager.flutter">
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@@ -1,51 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="app.revanced.manager.flutter">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:label="ReVanced Manager"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:largeHeap="true"
android:extractNativeLibs="true"
android:enableOnBackInvokedCallback="true">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>

View File

@@ -1,317 +0,0 @@
package app.revanced.manager.flutter
import android.os.Build
import android.os.Handler
import android.os.Looper
import androidx.annotation.NonNull
import app.revanced.manager.flutter.utils.Aapt
import app.revanced.manager.flutter.utils.aligning.ZipAligner
import app.revanced.manager.flutter.utils.signing.Signer
import app.revanced.manager.flutter.utils.zip.ZipFile
import app.revanced.manager.flutter.utils.zip.structures.ZipEntry
import app.revanced.patcher.Patcher
import app.revanced.patcher.PatcherOptions
import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages
import app.revanced.patcher.extensions.PatchExtensions.patchName
import app.revanced.patcher.logging.Logger
import app.revanced.patcher.util.patch.PatchBundle
import dalvik.system.DexClassLoader
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import java.io.File
private const val PATCHER_CHANNEL = "app.revanced.manager.flutter/patcher"
private const val INSTALLER_CHANNEL = "app.revanced.manager.flutter/installer"
class MainActivity : FlutterActivity() {
private val handler = Handler(Looper.getMainLooper())
private lateinit var installerChannel: MethodChannel
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
val mainChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, PATCHER_CHANNEL)
installerChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, INSTALLER_CHANNEL)
mainChannel.setMethodCallHandler { call, result ->
when (call.method) {
"runPatcher" -> {
val patchBundleFilePath = call.argument<String>("patchBundleFilePath")
val originalFilePath = call.argument<String>("originalFilePath")
val inputFilePath = call.argument<String>("inputFilePath")
val patchedFilePath = call.argument<String>("patchedFilePath")
val outFilePath = call.argument<String>("outFilePath")
val integrationsPath = call.argument<String>("integrationsPath")
val selectedPatches = call.argument<List<String>>("selectedPatches")
val cacheDirPath = call.argument<String>("cacheDirPath")
val mergeIntegrations = call.argument<Boolean>("mergeIntegrations")
val keyStoreFilePath = call.argument<String>("keyStoreFilePath")
if (patchBundleFilePath != null &&
originalFilePath != null &&
inputFilePath != null &&
patchedFilePath != null &&
outFilePath != null &&
integrationsPath != null &&
selectedPatches != null &&
cacheDirPath != null &&
mergeIntegrations != null &&
keyStoreFilePath != null
) {
runPatcher(
result,
patchBundleFilePath,
originalFilePath,
inputFilePath,
patchedFilePath,
outFilePath,
integrationsPath,
selectedPatches,
cacheDirPath,
mergeIntegrations,
keyStoreFilePath
)
} else {
result.notImplemented()
}
}
else -> result.notImplemented()
}
}
}
private fun runPatcher(
result: MethodChannel.Result,
patchBundleFilePath: String,
originalFilePath: String,
inputFilePath: String,
patchedFilePath: String,
outFilePath: String,
integrationsPath: String,
selectedPatches: List<String>,
cacheDirPath: String,
mergeIntegrations: Boolean,
keyStoreFilePath: String
) {
val originalFile = File(originalFilePath)
val inputFile = File(inputFilePath)
val patchedFile = File(patchedFilePath)
val outFile = File(outFilePath)
val integrations = File(integrationsPath)
val keyStoreFile = File(keyStoreFilePath)
Thread {
try {
handler.post {
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 0.1,
"header" to "",
"log" to "Copying original apk"
)
)
}
originalFile.copyTo(inputFile, true)
handler.post {
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 0.2,
"header" to "Unpacking apk...",
"log" to "Unpacking input apk"
)
)
}
val patcher =
Patcher(
PatcherOptions(
inputFile,
cacheDirPath,
Aapt.binary(applicationContext).absolutePath,
cacheDirPath,
logger = ManagerLogger()
)
)
handler.post {
installerChannel.invokeMethod(
"update",
mapOf("progress" to 0.3, "header" to "", "log" to "")
)
}
if (mergeIntegrations) {
handler.post {
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 0.4,
"header" to "Merging integrations...",
"log" to "Merging integrations"
)
)
}
patcher.addFiles(listOf(integrations)) {}
}
handler.post {
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 0.5,
"header" to "Applying patches...",
"log" to ""
)
)
}
val patches = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
PatchBundle.Dex(
patchBundleFilePath,
DexClassLoader(
patchBundleFilePath,
cacheDirPath,
null,
javaClass.classLoader
)
).loadPatches().filter { patch ->
(patch.compatiblePackages?.any { it.name == patcher.context.packageMetadata.packageName } == true || patch.compatiblePackages.isNullOrEmpty()) &&
selectedPatches.any { it == patch.patchName }
}
} else {
TODO("VERSION.SDK_INT < CUPCAKE")
}
patcher.addPatches(patches)
patcher.executePatches().forEach { (patch, res) ->
if (res.isSuccess) {
val msg = "Applied $patch"
handler.post {
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 0.5,
"header" to "",
"log" to msg
)
)
}
return@forEach
}
val msg = "Failed to apply $patch: " + "${res.exceptionOrNull()!!.message ?: res.exceptionOrNull()!!.cause!!::class.simpleName}"
handler.post {
installerChannel.invokeMethod(
"update",
mapOf("progress" to 0.5, "header" to "", "log" to msg)
)
}
}
handler.post {
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 0.7,
"header" to "Repacking apk...",
"log" to "Repacking patched apk"
)
)
}
val res = patcher.save()
ZipFile(patchedFile).use { file ->
res.dexFiles.forEach {
file.addEntryCompressData(
ZipEntry.createWithName(it.name),
it.stream.readBytes()
)
}
res.resourceFile?.let {
file.copyEntriesFromFileAligned(
ZipFile(it),
ZipAligner::getEntryAlignment
)
}
file.copyEntriesFromFileAligned(
ZipFile(inputFile),
ZipAligner::getEntryAlignment
)
}
handler.post {
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 0.9,
"header" to "Signing apk...",
"log" to ""
)
)
}
// Signer("ReVanced", "s3cur3p@ssw0rd").signApk(patchedFile, outFile, keyStoreFile)
try {
Signer("ReVanced", "s3cur3p@ssw0rd").signApk(patchedFile, outFile, keyStoreFile)
} catch (e: Exception) {
//log to console
print("Error signing apk: ${e.message}")
e.printStackTrace()
}
handler.post {
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 1.0,
"header" to "Finished!",
"log" to "Finished!"
)
)
}
} catch (ex: Throwable) {
val stack = ex.stackTraceToString()
handler.post {
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to -100.0,
"header" to "Aborting...",
"log" to "An error occurred! Aborting\nError:\n$stack"
)
)
}
}
handler.post { result.success(null) }
}.start()
}
inner class ManagerLogger : Logger {
override fun error(msg: String) {
handler.post {
installerChannel
.invokeMethod(
"update",
mapOf("progress" to -1.0, "header" to "", "log" to msg)
)
}
}
override fun warn(msg: String) {
handler.post {
installerChannel.invokeMethod(
"update",
mapOf("progress" to -1.0, "header" to "", "log" to msg)
)
}
}
override fun info(msg: String) {
handler.post {
installerChannel.invokeMethod(
"update",
mapOf("progress" to -1.0, "header" to "", "log" to msg)
)
}
}
override fun trace(_msg: String) { /* unused */
}
}
}

View File

@@ -1,12 +0,0 @@
package app.revanced.manager.flutter.utils
import android.content.Context
import java.io.File
object Aapt {
fun binary(context: Context): File {
return File(context.applicationInfo.nativeLibraryDir).resolveAapt()
}
}
private fun File.resolveAapt() = resolve(list { _, f -> !File(f).isDirectory && f.contains("aapt") }!!.first())

View File

@@ -1,11 +0,0 @@
package app.revanced.manager.flutter.utils.aligning
import app.revanced.manager.flutter.utils.zip.structures.ZipEntry
internal object ZipAligner {
private const val DEFAULT_ALIGNMENT = 4
private const val LIBRARY_ALIGNMENT = 4096
fun getEntryAlignment(entry: ZipEntry): Int? =
if (entry.compression.toUInt() != 0u) null else if (entry.fileName.endsWith(".so")) LIBRARY_ALIGNMENT else DEFAULT_ALIGNMENT
}

View File

@@ -1,74 +0,0 @@
package app.revanced.manager.flutter.utils.signing
import com.android.apksig.ApkSigner
import org.bouncycastle.asn1.x500.X500Name
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
import org.bouncycastle.cert.X509v3CertificateBuilder
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter
import org.bouncycastle.jce.provider.BouncyCastleProvider
import org.bouncycastle.operator.ContentSigner
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.math.BigInteger
import java.security.*
import java.security.cert.X509Certificate
import java.util.*
internal class Signer(
private val cn: String, password: String
) {
private val passwordCharArray = password.toCharArray()
private fun newKeystore(out: File) {
val (publicKey, privateKey) = createKey()
val privateKS = KeyStore.getInstance("BKS", "BC")
privateKS.load(null, passwordCharArray)
privateKS.setKeyEntry("alias", privateKey, passwordCharArray, arrayOf(publicKey))
privateKS.store(FileOutputStream(out), passwordCharArray)
}
private fun createKey(): Pair<X509Certificate, PrivateKey> {
val gen = KeyPairGenerator.getInstance("RSA")
gen.initialize(2048)
val pair = gen.generateKeyPair()
var serialNumber: BigInteger
do serialNumber =
BigInteger.valueOf(SecureRandom().nextLong()) while (serialNumber < BigInteger.ZERO)
val x500Name = X500Name("CN=$cn")
val builder = X509v3CertificateBuilder(
x500Name,
serialNumber,
Date(System.currentTimeMillis() - 1000L * 60L * 60L * 24L * 30L),
Date(System.currentTimeMillis() + 1000L * 60L * 60L * 24L * 366L * 30L),
Locale.ENGLISH,
x500Name,
SubjectPublicKeyInfo.getInstance(pair.public.encoded)
)
val signer: ContentSigner = JcaContentSignerBuilder("SHA256withRSA").build(pair.private)
return JcaX509CertificateConverter().getCertificate(builder.build(signer)) to pair.private
}
fun signApk(input: File, output: File, ks: File) {
Security.addProvider(BouncyCastleProvider())
if (!ks.exists()) newKeystore(ks)
val keyStore = KeyStore.getInstance("BKS", "BC")
FileInputStream(ks).use { fis -> keyStore.load(fis, null) }
val alias = keyStore.aliases().nextElement()
val config = ApkSigner.SignerConfig.Builder(
cn,
keyStore.getKey(alias, passwordCharArray) as PrivateKey,
listOf(keyStore.getCertificate(alias) as X509Certificate)
).build()
val signer = ApkSigner.Builder(listOf(config))
signer.setCreatedBy(cn)
signer.setInputApk(input)
signer.setOutputApk(output)
signer.build().sign()
}
}

View File

@@ -1,35 +0,0 @@
@file:Suppress("unused")
package app.revanced.manager.flutter.utils.zip
import java.io.DataInput
import java.io.DataOutput
import java.nio.ByteBuffer
fun UInt.toLittleEndian() =
(((this.toInt() and 0xff000000.toInt()) shr 24) or ((this.toInt() and 0x00ff0000) shr 8) or ((this.toInt() and 0x0000ff00) shl 8) or (this.toInt() shl 24)).toUInt()
fun UShort.toLittleEndian() = (this.toUInt() shl 16).toLittleEndian().toUShort()
fun UInt.toBigEndian() = (((this.toInt() and 0xff) shl 24) or ((this.toInt() and 0xff00) shl 8)
or ((this.toInt() and 0x00ff0000) ushr 8) or (this.toInt() ushr 24)).toUInt()
fun UShort.toBigEndian() = (this.toUInt() shl 16).toBigEndian().toUShort()
fun ByteBuffer.getUShort() = this.short.toUShort()
fun ByteBuffer.getUInt() = this.int.toUInt()
fun ByteBuffer.putUShort(ushort: UShort): ByteBuffer = this.putShort(ushort.toShort())
fun ByteBuffer.putUInt(uint: UInt): ByteBuffer = this.putInt(uint.toInt())
fun DataInput.readUShort() = this.readShort().toUShort()
fun DataInput.readUInt() = this.readInt().toUInt()
fun DataOutput.writeUShort(ushort: UShort) = this.writeShort(ushort.toInt())
fun DataOutput.writeUInt(uint: UInt) = this.writeInt(uint.toInt())
fun DataInput.readUShortLE() = this.readUShort().toBigEndian()
fun DataInput.readUIntLE() = this.readUInt().toBigEndian()
fun DataOutput.writeUShortLE(ushort: UShort) = this.writeUShort(ushort.toLittleEndian())
fun DataOutput.writeUIntLE(uint: UInt) = this.writeUInt(uint.toLittleEndian())

View File

@@ -1,176 +0,0 @@
package app.revanced.manager.flutter.utils.zip
import app.revanced.manager.flutter.utils.zip.structures.ZipEndRecord
import app.revanced.manager.flutter.utils.zip.structures.ZipEntry
import java.io.Closeable
import java.io.File
import java.io.RandomAccessFile
import java.nio.ByteBuffer
import java.nio.channels.FileChannel
import java.util.zip.CRC32
import java.util.zip.Deflater
class ZipFile(file: File) : Closeable {
var entries: MutableList<ZipEntry> = mutableListOf()
private val filePointer: RandomAccessFile = RandomAccessFile(file, "rw")
private var CDNeedsRewrite = false
private val compressionLevel = 5
init {
//if file isn't empty try to load entries
if (file.length() > 0) {
val endRecord = findEndRecord()
if (endRecord.diskNumber > 0u || endRecord.totalEntries != endRecord.diskEntries)
throw IllegalArgumentException("Multi-file archives are not supported")
entries = readEntries(endRecord).toMutableList()
}
//seek back to start for writing
filePointer.seek(0)
}
private fun findEndRecord(): ZipEndRecord {
//look from end to start since end record is at the end
for (i in filePointer.length() - 1 downTo 0) {
filePointer.seek(i)
//possible beginning of signature
if (filePointer.readByte() == 0x50.toByte()) {
//seek back to get the full int
filePointer.seek(i)
val possibleSignature = filePointer.readUIntLE()
if (possibleSignature == ZipEndRecord.ECD_SIGNATURE) {
filePointer.seek(i)
return ZipEndRecord.fromECD(filePointer)
}
}
}
throw Exception("Couldn't find end record")
}
private fun readEntries(endRecord: ZipEndRecord): List<ZipEntry> {
filePointer.seek(endRecord.centralDirectoryStartOffset.toLong())
val numberOfEntries = endRecord.diskEntries.toInt()
return buildList(numberOfEntries) {
for (i in 1..numberOfEntries) {
add(
ZipEntry.fromCDE(filePointer).also
{
//for some reason the local extra field can be different from the central one
it.readLocalExtra(
filePointer.channel.map(
FileChannel.MapMode.READ_ONLY,
it.localHeaderOffset.toLong() + 28,
2
)
)
})
}
}
}
private fun writeCD() {
val CDStart = filePointer.channel.position().toUInt()
entries.forEach {
filePointer.channel.write(it.toCDE())
}
val entriesCount = entries.size.toUShort()
val endRecord = ZipEndRecord(
0u,
0u,
entriesCount,
entriesCount,
filePointer.channel.position().toUInt() - CDStart,
CDStart,
""
)
filePointer.channel.write(endRecord.toECD())
}
private fun addEntry(entry: ZipEntry, data: ByteBuffer) {
CDNeedsRewrite = true
entry.localHeaderOffset = filePointer.channel.position().toUInt()
filePointer.channel.write(entry.toLFH())
filePointer.channel.write(data)
entries.add(entry)
}
fun addEntryCompressData(entry: ZipEntry, data: ByteArray) {
val compressor = Deflater(compressionLevel, true)
compressor.setInput(data)
compressor.finish()
val uncompressedSize = data.size
val compressedData =
ByteArray(uncompressedSize) //i'm guessing compression won't make the data bigger
val compressedDataLength = compressor.deflate(compressedData)
val compressedBuffer =
ByteBuffer.wrap(compressedData.take(compressedDataLength).toByteArray())
compressor.end()
val crc = CRC32()
crc.update(data)
entry.compression = 8u //deflate compression
entry.uncompressedSize = uncompressedSize.toUInt()
entry.compressedSize = compressedDataLength.toUInt()
entry.crc32 = crc.value.toUInt()
addEntry(entry, compressedBuffer)
}
private fun addEntryCopyData(entry: ZipEntry, data: ByteBuffer, alignment: Int? = null) {
alignment?.let {
//calculate where data would end up
val dataOffset = filePointer.filePointer + entry.LFHSize
val mod = dataOffset % alignment
//wrong alignment
if (mod != 0L) {
//add padding at end of extra field
entry.localExtraField =
entry.localExtraField.copyOf((entry.localExtraField.size + (alignment - mod)).toInt())
}
}
addEntry(entry, data)
}
fun getDataForEntry(entry: ZipEntry): ByteBuffer {
return filePointer.channel.map(
FileChannel.MapMode.READ_ONLY,
entry.dataOffset.toLong(),
entry.compressedSize.toLong()
)
}
fun copyEntriesFromFileAligned(file: ZipFile, entryAlignment: (entry: ZipEntry) -> Int?) {
for (entry in file.entries) {
if (entries.any { it.fileName == entry.fileName }) continue //don't add duplicates
val data = file.getDataForEntry(entry)
addEntryCopyData(entry, data, entryAlignment(entry))
}
}
override fun close() {
if (CDNeedsRewrite) writeCD()
filePointer.close()
}
}

View File

@@ -1,78 +0,0 @@
package app.revanced.manager.flutter.utils.zip.structures
import app.revanced.manager.flutter.utils.zip.putUInt
import app.revanced.manager.flutter.utils.zip.putUShort
import app.revanced.manager.flutter.utils.zip.readUIntLE
import app.revanced.manager.flutter.utils.zip.readUShortLE
import java.io.DataInput
import java.nio.ByteBuffer
import java.nio.ByteOrder
data class ZipEndRecord(
val diskNumber: UShort,
val startingDiskNumber: UShort,
val diskEntries: UShort,
val totalEntries: UShort,
val centralDirectorySize: UInt,
val centralDirectoryStartOffset: UInt,
val fileComment: String,
) {
companion object {
const val ECD_HEADER_SIZE = 22
const val ECD_SIGNATURE = 0x06054b50u
fun fromECD(input: DataInput): ZipEndRecord {
val signature = input.readUIntLE()
if (signature != ECD_SIGNATURE)
throw IllegalArgumentException("Input doesn't start with end record signature")
val diskNumber = input.readUShortLE()
val startingDiskNumber = input.readUShortLE()
val diskEntries = input.readUShortLE()
val totalEntries = input.readUShortLE()
val centralDirectorySize = input.readUIntLE()
val centralDirectoryStartOffset = input.readUIntLE()
val fileCommentLength = input.readUShortLE()
var fileComment = ""
if (fileCommentLength > 0u) {
val fileCommentBytes = ByteArray(fileCommentLength.toInt())
input.readFully(fileCommentBytes)
fileComment = fileCommentBytes.toString(Charsets.UTF_8)
}
return ZipEndRecord(
diskNumber,
startingDiskNumber,
diskEntries,
totalEntries,
centralDirectorySize,
centralDirectoryStartOffset,
fileComment
)
}
}
fun toECD(): ByteBuffer {
val commentBytes = fileComment.toByteArray(Charsets.UTF_8)
val buffer = ByteBuffer.allocate(ECD_HEADER_SIZE + commentBytes.size)
.also { it.order(ByteOrder.LITTLE_ENDIAN) }
buffer.putUInt(ECD_SIGNATURE)
buffer.putUShort(diskNumber)
buffer.putUShort(startingDiskNumber)
buffer.putUShort(diskEntries)
buffer.putUShort(totalEntries)
buffer.putUInt(centralDirectorySize)
buffer.putUInt(centralDirectoryStartOffset)
buffer.putUShort(commentBytes.size.toUShort())
buffer.put(commentBytes)
buffer.flip()
return buffer
}
}

View File

@@ -1,190 +0,0 @@
package app.revanced.manager.flutter.utils.zip.structures
import app.revanced.manager.flutter.utils.zip.*
import java.io.DataInput
import java.nio.ByteBuffer
import java.nio.ByteOrder
data class ZipEntry(
val version: UShort,
val versionNeeded: UShort,
val flags: UShort,
var compression: UShort,
val modificationTime: UShort,
val modificationDate: UShort,
var crc32: UInt,
var compressedSize: UInt,
var uncompressedSize: UInt,
val diskNumber: UShort,
val internalAttributes: UShort,
val externalAttributes: UInt,
var localHeaderOffset: UInt,
val fileName: String,
val extraField: ByteArray,
val fileComment: String,
var localExtraField: ByteArray = ByteArray(0), //separate for alignment
) {
val LFHSize: Int
get() = LFH_HEADER_SIZE + fileName.toByteArray(Charsets.UTF_8).size + localExtraField.size
val dataOffset: UInt
get() = localHeaderOffset + LFHSize.toUInt()
companion object {
const val CDE_HEADER_SIZE = 46
const val CDE_SIGNATURE = 0x02014b50u
const val LFH_HEADER_SIZE = 30
const val LFH_SIGNATURE = 0x04034b50u
fun createWithName(fileName: String): ZipEntry {
return ZipEntry(
0x1403u, //made by unix, version 20
0u,
0u,
0u,
0x0821u, //seems to be static time google uses, no idea
0x0221u, //same as above
0u,
0u,
0u,
0u,
0u,
0u,
0u,
fileName,
ByteArray(0),
""
)
}
fun fromCDE(input: DataInput): ZipEntry {
val signature = input.readUIntLE()
if (signature != CDE_SIGNATURE)
throw IllegalArgumentException("Input doesn't start with central directory entry signature")
val version = input.readUShortLE()
val versionNeeded = input.readUShortLE()
var flags = input.readUShortLE()
val compression = input.readUShortLE()
val modificationTime = input.readUShortLE()
val modificationDate = input.readUShortLE()
val crc32 = input.readUIntLE()
val compressedSize = input.readUIntLE()
val uncompressedSize = input.readUIntLE()
val fileNameLength = input.readUShortLE()
var fileName = ""
val extraFieldLength = input.readUShortLE()
val extraField = ByteArray(extraFieldLength.toInt())
val fileCommentLength = input.readUShortLE()
var fileComment = ""
val diskNumber = input.readUShortLE()
val internalAttributes = input.readUShortLE()
val externalAttributes = input.readUIntLE()
val localHeaderOffset = input.readUIntLE()
val variableFieldsLength =
fileNameLength.toInt() + extraFieldLength.toInt() + fileCommentLength.toInt()
if (variableFieldsLength > 0) {
val fileNameBytes = ByteArray(fileNameLength.toInt())
input.readFully(fileNameBytes)
fileName = fileNameBytes.toString(Charsets.UTF_8)
input.readFully(extraField)
val fileCommentBytes = ByteArray(fileCommentLength.toInt())
input.readFully(fileCommentBytes)
fileComment = fileCommentBytes.toString(Charsets.UTF_8)
}
flags = (flags and 0b1000u.inv()
.toUShort()) //disable data descriptor flag as they are not used
return ZipEntry(
version,
versionNeeded,
flags,
compression,
modificationTime,
modificationDate,
crc32,
compressedSize,
uncompressedSize,
diskNumber,
internalAttributes,
externalAttributes,
localHeaderOffset,
fileName,
extraField,
fileComment,
)
}
}
fun readLocalExtra(buffer: ByteBuffer) {
buffer.order(ByteOrder.LITTLE_ENDIAN)
localExtraField = ByteArray(buffer.getUShort().toInt())
}
fun toLFH(): ByteBuffer {
val nameBytes = fileName.toByteArray(Charsets.UTF_8)
val buffer = ByteBuffer.allocate(LFH_HEADER_SIZE + nameBytes.size + localExtraField.size)
.also { it.order(ByteOrder.LITTLE_ENDIAN) }
buffer.putUInt(LFH_SIGNATURE)
buffer.putUShort(versionNeeded)
buffer.putUShort(flags)
buffer.putUShort(compression)
buffer.putUShort(modificationTime)
buffer.putUShort(modificationDate)
buffer.putUInt(crc32)
buffer.putUInt(compressedSize)
buffer.putUInt(uncompressedSize)
buffer.putUShort(nameBytes.size.toUShort())
buffer.putUShort(localExtraField.size.toUShort())
buffer.put(nameBytes)
buffer.put(localExtraField)
buffer.flip()
return buffer
}
fun toCDE(): ByteBuffer {
val nameBytes = fileName.toByteArray(Charsets.UTF_8)
val commentBytes = fileComment.toByteArray(Charsets.UTF_8)
val buffer =
ByteBuffer.allocate(CDE_HEADER_SIZE + nameBytes.size + extraField.size + commentBytes.size)
.also { it.order(ByteOrder.LITTLE_ENDIAN) }
buffer.putUInt(CDE_SIGNATURE)
buffer.putUShort(version)
buffer.putUShort(versionNeeded)
buffer.putUShort(flags)
buffer.putUShort(compression)
buffer.putUShort(modificationTime)
buffer.putUShort(modificationDate)
buffer.putUInt(crc32)
buffer.putUInt(compressedSize)
buffer.putUInt(uncompressedSize)
buffer.putUShort(nameBytes.size.toUShort())
buffer.putUShort(extraField.size.toUShort())
buffer.putUShort(commentBytes.size.toUShort())
buffer.putUShort(diskNumber)
buffer.putUShort(internalAttributes)
buffer.putUInt(externalAttributes)
buffer.putUInt(localHeaderOffset)
buffer.put(nameBytes)
buffer.put(extraField)
buffer.put(commentBytes)
buffer.flip()
return buffer
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 814 B

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/ic_launcher_round</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/ic_launcher_round</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#1B1B1B</color>
</resources>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<paths>
<cache-path name="cache" path="." />
</paths>

View File

@@ -1,4 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="app.revanced.manager.flutter">
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@@ -1,37 +0,0 @@
buildscript {
ext.cronetVersion = '102.5005.125'
ext.kotlin_version = '1.8.0'
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.1.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
mavenCentral()
maven {
url = uri("https://maven.pkg.github.com/revanced/revanced-patcher")
credentials {
username = (project.findProperty("gpr.user") ?: System.getenv("GITHUB_ACTOR")) as String
password = (project.findProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN")) as String
}
}
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
project.evaluationDependsOn(':app')
}
task clean(type: Delete) {
delete rootProject.buildDir
}

View File

@@ -1,3 +0,0 @@
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true

View File

@@ -1,11 +0,0 @@
include ':app'
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()
assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"

182
api/api/api.api Normal file
View File

@@ -0,0 +1,182 @@
public abstract interface class app/revanced/manager/plugin/downloader/BaseDownloadScope : app/revanced/manager/plugin/downloader/Scope {
}
public final class app/revanced/manager/plugin/downloader/ConstantsKt {
public static final field PLUGIN_HOST_PERMISSION Ljava/lang/String;
}
public final class app/revanced/manager/plugin/downloader/DownloadUrl : android/os/Parcelable {
public static final field $stable I
public static final field CREATOR Landroid/os/Parcelable$Creator;
public fun <init> (Ljava/lang/String;Ljava/util/Map;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Ljava/util/Map;
public final fun copy (Ljava/lang/String;Ljava/util/Map;)Lapp/revanced/manager/plugin/downloader/DownloadUrl;
public static synthetic fun copy$default (Lapp/revanced/manager/plugin/downloader/DownloadUrl;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lapp/revanced/manager/plugin/downloader/DownloadUrl;
public final fun describeContents ()I
public fun equals (Ljava/lang/Object;)Z
public final fun getHeaders ()Ljava/util/Map;
public final fun getUrl ()Ljava/lang/String;
public fun hashCode ()I
public final fun toDownloadResult ()Lkotlin/Pair;
public fun toString ()Ljava/lang/String;
public final fun writeToParcel (Landroid/os/Parcel;I)V
}
public final class app/revanced/manager/plugin/downloader/DownloadUrl$Creator : android/os/Parcelable$Creator {
public fun <init> ()V
public final fun createFromParcel (Landroid/os/Parcel;)Lapp/revanced/manager/plugin/downloader/DownloadUrl;
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
public final fun newArray (I)[Lapp/revanced/manager/plugin/downloader/DownloadUrl;
public synthetic fun newArray (I)[Ljava/lang/Object;
}
public final class app/revanced/manager/plugin/downloader/Downloader {
public static final field $stable I
}
public final class app/revanced/manager/plugin/downloader/DownloaderBuilder {
public static final field $stable I
}
public final class app/revanced/manager/plugin/downloader/DownloaderKt {
public static final fun Downloader (Lkotlin/jvm/functions/Function1;)Lapp/revanced/manager/plugin/downloader/DownloaderBuilder;
}
public final class app/revanced/manager/plugin/downloader/DownloaderScope : app/revanced/manager/plugin/downloader/Scope {
public static final field $stable I
public final fun download (Lkotlin/jvm/functions/Function3;)V
public final fun get (Lkotlin/jvm/functions/Function4;)V
public fun getHostPackageName ()Ljava/lang/String;
public fun getPluginPackageName ()Ljava/lang/String;
public final fun useService (Landroid/content/Intent;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}
public final class app/revanced/manager/plugin/downloader/ExtensionsKt {
public static final fun download (Lapp/revanced/manager/plugin/downloader/DownloaderScope;Lkotlin/jvm/functions/Function4;)V
}
public abstract interface class app/revanced/manager/plugin/downloader/GetScope : app/revanced/manager/plugin/downloader/Scope {
public abstract fun requestStartActivity (Landroid/content/Intent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}
public abstract interface class app/revanced/manager/plugin/downloader/InputDownloadScope : app/revanced/manager/plugin/downloader/BaseDownloadScope {
}
public abstract interface class app/revanced/manager/plugin/downloader/OutputDownloadScope : app/revanced/manager/plugin/downloader/BaseDownloadScope {
public abstract fun reportSize (JLkotlin/coroutines/Continuation;)Ljava/lang/Object;
}
public final class app/revanced/manager/plugin/downloader/Package : android/os/Parcelable {
public static final field $stable I
public static final field CREATOR Landroid/os/Parcelable$Creator;
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/manager/plugin/downloader/Package;
public static synthetic fun copy$default (Lapp/revanced/manager/plugin/downloader/Package;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lapp/revanced/manager/plugin/downloader/Package;
public final fun describeContents ()I
public fun equals (Ljava/lang/Object;)Z
public final fun getName ()Ljava/lang/String;
public final fun getVersion ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
public final fun writeToParcel (Landroid/os/Parcel;I)V
}
public final class app/revanced/manager/plugin/downloader/Package$Creator : android/os/Parcelable$Creator {
public fun <init> ()V
public final fun createFromParcel (Landroid/os/Parcel;)Lapp/revanced/manager/plugin/downloader/Package;
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
public final fun newArray (I)[Lapp/revanced/manager/plugin/downloader/Package;
public synthetic fun newArray (I)[Ljava/lang/Object;
}
public abstract interface annotation class app/revanced/manager/plugin/downloader/PluginHostApi : java/lang/annotation/Annotation {
}
public abstract interface class app/revanced/manager/plugin/downloader/Scope {
public abstract fun getHostPackageName ()Ljava/lang/String;
public abstract fun getPluginPackageName ()Ljava/lang/String;
}
public abstract class app/revanced/manager/plugin/downloader/UserInteractionException : java/lang/Exception {
public static final field $stable I
public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
}
public abstract class app/revanced/manager/plugin/downloader/UserInteractionException$Activity : app/revanced/manager/plugin/downloader/UserInteractionException {
public static final field $stable I
public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
}
public final class app/revanced/manager/plugin/downloader/UserInteractionException$Activity$Cancelled : app/revanced/manager/plugin/downloader/UserInteractionException$Activity {
public static final field $stable I
}
public final class app/revanced/manager/plugin/downloader/UserInteractionException$Activity$NotCompleted : app/revanced/manager/plugin/downloader/UserInteractionException$Activity {
public static final field $stable I
public final fun getIntent ()Landroid/content/Intent;
public final fun getResultCode ()I
}
public final class app/revanced/manager/plugin/downloader/UserInteractionException$RequestDenied : app/revanced/manager/plugin/downloader/UserInteractionException {
public static final field $stable I
}
public final class app/revanced/manager/plugin/downloader/webview/APIKt {
public static final fun WebViewDownloader (Lkotlin/jvm/functions/Function4;)Lapp/revanced/manager/plugin/downloader/DownloaderBuilder;
public static final fun runWebView (Lapp/revanced/manager/plugin/downloader/GetScope;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}
public class app/revanced/manager/plugin/downloader/webview/IWebView$Default : app/revanced/manager/plugin/downloader/webview/IWebView {
public fun <init> ()V
public fun asBinder ()Landroid/os/IBinder;
public fun finish ()V
public fun load (Ljava/lang/String;)V
}
public abstract class app/revanced/manager/plugin/downloader/webview/IWebView$Stub : android/os/Binder, app/revanced/manager/plugin/downloader/webview/IWebView {
public fun <init> ()V
public fun asBinder ()Landroid/os/IBinder;
public static fun asInterface (Landroid/os/IBinder;)Lapp/revanced/manager/plugin/downloader/webview/IWebView;
public fun onTransact (ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
}
public class app/revanced/manager/plugin/downloader/webview/IWebViewEvents$Default : app/revanced/manager/plugin/downloader/webview/IWebViewEvents {
public fun <init> ()V
public fun asBinder ()Landroid/os/IBinder;
public fun download (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public fun pageLoad (Ljava/lang/String;)V
public fun ready (Lapp/revanced/manager/plugin/downloader/webview/IWebView;)V
}
public abstract class app/revanced/manager/plugin/downloader/webview/IWebViewEvents$Stub : android/os/Binder, app/revanced/manager/plugin/downloader/webview/IWebViewEvents {
public fun <init> ()V
public fun asBinder ()Landroid/os/IBinder;
public static fun asInterface (Landroid/os/IBinder;)Lapp/revanced/manager/plugin/downloader/webview/IWebViewEvents;
public fun onTransact (ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
}
public final class app/revanced/manager/plugin/downloader/webview/WebViewActivity$Parameters$Creator : android/os/Parcelable$Creator {
public fun <init> ()V
public final fun createFromParcel (Landroid/os/Parcel;)Lapp/revanced/manager/plugin/downloader/webview/WebViewActivity$Parameters;
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
public final fun newArray (I)[Lapp/revanced/manager/plugin/downloader/webview/WebViewActivity$Parameters;
public synthetic fun newArray (I)[Ljava/lang/Object;
}
public abstract interface class app/revanced/manager/plugin/downloader/webview/WebViewCallbackScope : app/revanced/manager/plugin/downloader/Scope {
public abstract fun finish (Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun load (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}
public final class app/revanced/manager/plugin/downloader/webview/WebViewScope : app/revanced/manager/plugin/downloader/Scope {
public static final field $stable I
public final fun download (Lkotlin/jvm/functions/Function5;)V
public fun getHostPackageName ()Ljava/lang/String;
public fun getPluginPackageName ()Ljava/lang/String;
public final fun pageLoad (Lkotlin/jvm/functions/Function3;)V
}

151
api/build.gradle.kts Normal file
View File

@@ -0,0 +1,151 @@
import java.io.IOException
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.parcelize)
alias(libs.plugins.compose.compiler)
alias(libs.plugins.binary.compatibility.validator)
`maven-publish`
signing
}
group = "app.revanced"
dependencies {
implementation(libs.androidx.ktx)
implementation(libs.runtime.ktx)
implementation(libs.activity.compose)
implementation(libs.appcompat)
}
fun String.runCommand(): String {
val process = ProcessBuilder(split("\\s".toRegex()))
.redirectErrorStream(true)
.directory(rootDir)
.start()
val output = StringBuilder()
val reader = process.inputStream.bufferedReader()
val thread = Thread {
reader.forEachLine {
output.appendLine(it)
}
}
thread.start()
if (!process.waitFor(10, TimeUnit.SECONDS)) {
process.destroy()
throw IOException("Command timed out: $this")
}
thread.join()
return output.toString().trim()
}
val projectPath: String = projectDir.relativeTo(rootDir).path
val lastTag = "git describe --tags --abbrev=0".runCommand()
val hasChangesInThisModule = "git diff --name-only $lastTag..HEAD".runCommand().lineSequence().any {
it.startsWith(projectPath)
}
tasks.matching { it.name.startsWith("publish") }.configureEach {
onlyIf {
hasChangesInThisModule
}
}
android {
namespace = "app.revanced.manager.plugin.downloader"
compileSdk = 35
buildToolsVersion = "35.0.1"
defaultConfig {
minSdk = 26
consumerProguardFiles("consumer-rules.pro")
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
buildFeatures {
aidl = true
}
}
apiValidation {
nonPublicMarkers += "app.revanced.manager.plugin.downloader.PluginHostApi"
}
publishing {
repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/revanced/revanced-manager")
credentials {
username = System.getenv("GITHUB_ACTOR") ?: extra["gpr.user"] as String?
password = System.getenv("GITHUB_TOKEN") ?: extra["gpr.key"] as String?
}
}
}
publications {
create<MavenPublication>("Api") {
afterEvaluate {
from(components["release"])
}
groupId = "app.revanced"
artifactId = "revanced-manager-api"
version = project.version.toString()
pom {
name = "ReVanced Manager API"
description = "API for ReVanced Manager."
url = "https://revanced.app"
licenses {
license {
name = "GNU General Public License v3.0"
url = "https://www.gnu.org/licenses/gpl-3.0.en.html"
}
}
developers {
developer {
id = "ReVanced"
name = "ReVanced"
email = "contact@revanced.app"
}
}
scm {
connection = "scm:git:git://github.com/revanced/revanced-manager.git"
developerConnection = "scm:git:git@github.com:revanced/revanced-manager.git"
url = "https://github.com/revanced/revanced-manager"
}
}
}
}
}
signing {
useGpgCmd()
sign(publishing.publications["Api"])
}

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>

View File

@@ -0,0 +1,8 @@
// IWebView.aidl
package app.revanced.manager.plugin.downloader.webview;
@JavaPassthrough(annotation="@app.revanced.manager.plugin.downloader.PluginHostApi")
oneway interface IWebView {
void load(String url);
void finish();
}

View File

@@ -0,0 +1,11 @@
// IWebViewEvents.aidl
package app.revanced.manager.plugin.downloader.webview;
import app.revanced.manager.plugin.downloader.webview.IWebView;
@JavaPassthrough(annotation="@app.revanced.manager.plugin.downloader.PluginHostApi")
oneway interface IWebViewEvents {
void ready(IWebView iface);
void pageLoad(String url);
void download(String url, String mimetype, String userAgent);
}

View File

@@ -0,0 +1,7 @@
package app.revanced.manager.plugin.downloader
/**
* The permission ID of the special plugin host permission. Only ReVanced Manager will have this permission.
* Plugin UI activities and internal services can be protected using this permission.
*/
const val PLUGIN_HOST_PERMISSION = "app.revanced.manager.permission.PLUGIN_HOST"

View File

@@ -0,0 +1,165 @@
package app.revanced.manager.plugin.downloader
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.os.IBinder
import android.app.Activity
import android.os.Parcelable
import kotlinx.coroutines.withTimeout
import java.io.InputStream
import java.io.OutputStream
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
@RequiresOptIn(
level = RequiresOptIn.Level.ERROR,
message = "This API is only intended for plugin hosts, don't use it in a plugin.",
)
@Retention(AnnotationRetention.BINARY)
annotation class PluginHostApi
/**
* The base interface for all DSL scopes.
*/
interface Scope {
/**
* The package name of ReVanced Manager.
*/
val hostPackageName: String
/**
* The package name of the plugin.
*/
val pluginPackageName: String
}
/**
* The scope of [DownloaderScope.get].
*/
interface GetScope : Scope {
/**
* Ask the user to perform some required interaction in the activity specified by the provided [Intent].
* This function returns normally with the resulting [Intent] when the activity finishes with code [Activity.RESULT_OK].
*
* @throws UserInteractionException.RequestDenied User decided to skip this plugin.
* @throws UserInteractionException.Activity.Cancelled The activity was cancelled.
* @throws UserInteractionException.Activity.NotCompleted The activity finished with an unknown result code.
*/
suspend fun requestStartActivity(intent: Intent): Intent?
}
interface BaseDownloadScope : Scope
/**
* The scope for [DownloaderScope.download].
*/
interface InputDownloadScope : BaseDownloadScope
typealias Size = Long
typealias DownloadResult = Pair<InputStream, Size?>
typealias Version = String
typealias GetResult<T> = Pair<T, Version?>
class DownloaderScope<T : Parcelable> internal constructor(
private val scopeImpl: Scope,
internal val context: Context
) : Scope by scopeImpl {
// Returning an InputStream is the primary way for plugins to implement the download function, but we also want to offer an OutputStream API since using InputStream might not be convenient in all cases.
// It is much easier to implement the main InputStream API on top of OutputStreams compared to doing it the other way around, which is why we are using OutputStream here. This detail is not visible to plugins.
internal var download: (suspend OutputDownloadScope.(T, OutputStream) -> Unit)? = null
internal var get: (suspend GetScope.(String, String?) -> GetResult<T>?)? = null
private val inputDownloadScopeImpl = object : InputDownloadScope, Scope by scopeImpl {}
/**
* Define the download block of the plugin.
*/
fun download(block: suspend InputDownloadScope.(data: T) -> DownloadResult) {
download = { app, outputStream ->
val (inputStream, size) = inputDownloadScopeImpl.block(app)
inputStream.use {
if (size != null) reportSize(size)
it.copyTo(outputStream)
}
}
}
/**
* Define the get block of the plugin.
* The block should return null if the app cannot be found. The version in the result must match the version argument unless it is null.
*/
fun get(block: suspend GetScope.(packageName: String, version: String?) -> GetResult<T>?) {
get = block
}
/**
* Utilize the service specified by the provided [Intent]. The service will be unbound when the scope ends.
*/
suspend fun <R : Any?> useService(intent: Intent, block: suspend (IBinder) -> R): R {
var onBind: ((IBinder) -> Unit)? = null
val serviceConn = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) =
onBind!!(service!!)
override fun onServiceDisconnected(name: ComponentName?) {}
}
return try {
val binder = withTimeout(10000L) {
suspendCoroutine { continuation ->
onBind = continuation::resume
context.bindService(intent, serviceConn, Context.BIND_AUTO_CREATE)
}
}
block(binder)
} finally {
onBind = null
context.unbindService(serviceConn)
}
}
}
class DownloaderBuilder<T : Parcelable> internal constructor(private val block: DownloaderScope<T>.() -> Unit) {
@PluginHostApi
fun build(scopeImpl: Scope, context: Context) =
with(DownloaderScope<T>(scopeImpl, context)) {
block()
Downloader(
download = download!!,
get = get!!
)
}
}
class Downloader<T : Parcelable> internal constructor(
@property:PluginHostApi val get: suspend GetScope.(packageName: String, version: String?) -> GetResult<T>?,
@property:PluginHostApi val download: suspend OutputDownloadScope.(data: T, outputStream: OutputStream) -> Unit
)
/**
* Define a downloader plugin.
*/
fun <T : Parcelable> Downloader(block: DownloaderScope<T>.() -> Unit) = DownloaderBuilder(block)
/**
* @see GetScope.requestStartActivity
*/
sealed class UserInteractionException(message: String) : Exception(message) {
class RequestDenied @PluginHostApi constructor() :
UserInteractionException("Request denied by user")
sealed class Activity(message: String) : UserInteractionException(message) {
class Cancelled @PluginHostApi constructor() : Activity("Interaction cancelled")
/**
* @param resultCode The result code of the activity.
* @param intent The [Intent] of the activity.
*/
class NotCompleted @PluginHostApi constructor(val resultCode: Int, val intent: Intent?) :
Activity("Unexpected activity result code: $resultCode")
}
}

View File

@@ -0,0 +1,42 @@
package app.revanced.manager.plugin.downloader
import android.app.Activity
import android.app.Service
import android.content.Intent
import android.os.IBinder
import android.os.Parcelable
import java.io.OutputStream
/**
* The scope of the [OutputStream] version of [DownloaderScope.download].
*/
interface OutputDownloadScope : BaseDownloadScope {
suspend fun reportSize(size: Long)
}
/**
* A replacement for [DownloaderScope.download] that uses [OutputStream].
* The provided [OutputStream] does not need to be closed manually.
*/
fun <T : Parcelable> DownloaderScope<T>.download(block: suspend OutputDownloadScope.(T, OutputStream) -> Unit) {
download = block
}
/**
* Performs [GetScope.requestStartActivity] with an [Intent] created using the type information of [ACTIVITY].
* @see [GetScope.requestStartActivity]
*/
suspend inline fun <reified ACTIVITY : Activity> GetScope.requestStartActivity() =
requestStartActivity(
Intent().apply { setClassName(pluginPackageName, ACTIVITY::class.qualifiedName!!) }
)
/**
* Performs [DownloaderScope.useService] with an [Intent] created using the type information of [SERVICE].
* @see [DownloaderScope.useService]
*/
suspend inline fun <reified SERVICE : Service, R : Any?> DownloaderScope<*>.useService(
noinline block: suspend (IBinder) -> R
) = useService(
Intent().apply { setClassName(pluginPackageName, SERVICE::class.qualifiedName!!) }, block
)

View File

@@ -0,0 +1,39 @@
package app.revanced.manager.plugin.downloader
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import java.net.HttpURLConnection
import java.net.URI
/**
* A simple parcelable data class for storing a package name and version.
* This can be used as the data type for plugins that only need a name and version to implement their [DownloaderScope.download] function.
*
* @param name The package name.
* @param version The version.
*/
@Parcelize
data class Package(val name: String, val version: String) : Parcelable
/**
* A data class for storing a download URL.
*
* @param url The download URL.
* @param headers The headers to use for the request.
*/
@Parcelize
data class DownloadUrl(val url: String, val headers: Map<String, String> = emptyMap()) : Parcelable {
/**
* Converts this into a [DownloadResult].
*/
fun toDownloadResult(): DownloadResult = with(URI.create(url).toURL().openConnection() as HttpURLConnection) {
useCaches = false
allowUserInteraction = false
headers.forEach(::setRequestProperty)
connectTimeout = 10_000
connect()
inputStream to getHeaderField("Content-Length").toLong()
}
}

View File

@@ -0,0 +1,176 @@
package app.revanced.manager.plugin.downloader.webview
import android.content.Intent
import app.revanced.manager.plugin.downloader.DownloadUrl
import app.revanced.manager.plugin.downloader.DownloaderScope
import app.revanced.manager.plugin.downloader.GetScope
import app.revanced.manager.plugin.downloader.Scope
import app.revanced.manager.plugin.downloader.Downloader
import app.revanced.manager.plugin.downloader.PluginHostApi
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.launch
import kotlinx.coroutines.supervisorScope
import kotlinx.coroutines.withContext
import kotlin.properties.Delegates
typealias InitialUrl = String
typealias PageLoadCallback<T> = suspend WebViewCallbackScope<T>.(url: String) -> Unit
typealias DownloadCallback<T> = suspend WebViewCallbackScope<T>.(url: String, mimeType: String, userAgent: String) -> Unit
interface WebViewCallbackScope<T> : Scope {
/**
* Finishes the activity and returns the [result].
*/
suspend fun finish(result: T)
/**
* Tells the WebView to load the specified [url].
*/
suspend fun load(url: String)
}
@OptIn(PluginHostApi::class)
class WebViewScope<T> internal constructor(
coroutineScope: CoroutineScope,
private val scopeImpl: Scope,
setResult: (T) -> Unit
) : Scope by scopeImpl {
private var onPageLoadCallback: PageLoadCallback<T> = {}
private var onDownloadCallback: DownloadCallback<T> = { _, _, _ -> }
@OptIn(ExperimentalCoroutinesApi::class)
private val dispatcher = Dispatchers.Default.limitedParallelism(1)
private lateinit var webView: IWebView
internal lateinit var initialUrl: String
internal val binder = object : IWebViewEvents.Stub() {
override fun ready(iface: IWebView?) {
coroutineScope.launch(dispatcher) {
webView = iface!!.also {
it.load(initialUrl)
}
}
}
override fun pageLoad(url: String?) {
coroutineScope.launch(dispatcher) { onPageLoadCallback(callbackScope, url!!) }
}
override fun download(url: String?, mimetype: String?, userAgent: String?) {
coroutineScope.launch(dispatcher) {
onDownloadCallback(
callbackScope,
url!!,
mimetype!!,
userAgent!!
)
}
}
}
private val callbackScope = object : WebViewCallbackScope<T>, Scope by scopeImpl {
override suspend fun finish(result: T) {
setResult(result)
// Tell the WebViewActivity to finish
webView.let { withContext(Dispatchers.IO) { it.finish() } }
}
override suspend fun load(url: String) {
webView.let { withContext(Dispatchers.IO) { it.load(url) } }
}
}
/**
* Called when the WebView attempts to download a file to disk.
*/
fun download(block: DownloadCallback<T>) {
onDownloadCallback = block
}
/**
* Called when the WebView finishes loading a page.
*/
fun pageLoad(block: PageLoadCallback<T>) {
onPageLoadCallback = block
}
}
@JvmInline
private value class Container<U>(val value: U)
/**
* Run a [android.webkit.WebView] Activity controlled by the provided code block.
* The activity will keep running until it is cancelled or an event handler calls [WebViewCallbackScope.finish].
* The [block] defines the event handlers and returns the initial URL.
*
* @param title The string displayed in the action bar.
* @param block The control block.
*/
@OptIn(PluginHostApi::class)
suspend fun <T> GetScope.runWebView(
title: String,
block: suspend WebViewScope<T>.() -> InitialUrl
) = supervisorScope {
var result by Delegates.notNull<Container<T>>()
val scope = WebViewScope<T>(this@supervisorScope, this@runWebView) { result = Container(it) }
scope.initialUrl = scope.block()
// Start the webview activity and wait until it finishes.
requestStartActivity(Intent().apply {
putExtra(
WebViewActivity.KEY,
WebViewActivity.Parameters(title, scope.binder)
)
setClassName(
hostPackageName,
WebViewActivity::class.qualifiedName!!
)
})
// Return the result and cancel any leftover coroutines.
coroutineContext.cancelChildren()
result.value
}
/**
* Implement a downloader using [runWebView] and [DownloadUrl]. This function will automatically define a handler for download events unlike [runWebView].
* Returning null inside the [block] is equivalent to returning null inside [DownloaderScope.get].
*
* @see runWebView
*/
fun WebViewDownloader(block: suspend WebViewScope<DownloadUrl>.(packageName: String, version: String?) -> InitialUrl?) =
Downloader<DownloadUrl> {
val label = context.applicationInfo.loadLabel(
context.packageManager
).toString()
get { packageName, version ->
class ReturnNull : Exception()
try {
runWebView(label) {
download { url, _, userAgent ->
finish(
DownloadUrl(
url,
mapOf("User-Agent" to userAgent)
)
)
}
block(this@runWebView, packageName, version) ?: throw ReturnNull()
} to version
} catch (_: ReturnNull) {
null
}
}
download {
it.toDownloadResult()
}
}

View File

@@ -0,0 +1,161 @@
package app.revanced.manager.plugin.downloader.webview
import android.annotation.SuppressLint
import android.os.Bundle
import android.os.IBinder
import android.os.Parcelable
import android.view.MenuItem
import android.webkit.CookieManager
import android.webkit.WebSettings
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.activity.ComponentActivity
import androidx.activity.addCallback
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.lifecycle.viewModelScope
import app.revanced.manager.plugin.downloader.PluginHostApi
import app.revanced.manager.plugin.downloader.R
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.launch
import kotlinx.parcelize.Parcelize
@OptIn(PluginHostApi::class)
@PluginHostApi
class WebViewActivity : ComponentActivity() {
@SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vm by viewModels<WebViewModel>()
enableEdgeToEdge()
setContentView(R.layout.activity_webview)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
val webView = findViewById<WebView>(R.id.webview)
onBackPressedDispatcher.addCallback {
if (webView.canGoBack()) webView.goBack()
else cancelActivity()
}
val params = intent.getParcelableExtra<Parameters>(KEY)!!
actionBar?.apply {
title = params.title
setHomeAsUpIndicator(android.R.drawable.ic_menu_close_clear_cancel)
setDisplayHomeAsUpEnabled(true)
}
val events = IWebViewEvents.Stub.asInterface(params.events)!!
vm.setup(events)
webView.apply {
settings.apply {
cacheMode = WebSettings.LOAD_NO_CACHE
allowContentAccess = false
domStorageEnabled = true
javaScriptEnabled = true
}
webViewClient = vm.webViewClient
setDownloadListener { url, userAgent, _, mimetype, _ ->
vm.onDownload(url, mimetype, userAgent)
}
}
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
vm.commands.collect {
when (it) {
is WebViewModel.Command.Finish -> {
setResult(RESULT_OK)
finish()
}
is WebViewModel.Command.Load -> webView.loadUrl(it.url)
}
}
}
}
}
private fun cancelActivity() {
setResult(RESULT_CANCELED)
finish()
}
override fun onOptionsItemSelected(item: MenuItem) = if (item.itemId == android.R.id.home) {
cancelActivity()
true
} else super.onOptionsItemSelected(item)
@Parcelize
internal class Parameters(
val title: String, val events: IBinder
) : Parcelable
internal companion object {
const val KEY = "params"
}
}
@OptIn(PluginHostApi::class)
internal class WebViewModel : ViewModel() {
init {
CookieManager.getInstance().apply {
removeAllCookies(null)
setAcceptCookie(true)
}
}
private val commandChannel = Channel<Command>()
val commands = commandChannel.receiveAsFlow()
private var eventBinder: IWebViewEvents? = null
private val ctrlBinder = object : IWebView.Stub() {
override fun load(url: String?) {
viewModelScope.launch {
commandChannel.send(Command.Load(url!!))
}
}
override fun finish() {
viewModelScope.launch {
commandChannel.send(Command.Finish)
}
}
}
val webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
eventBinder!!.pageLoad(url)
}
}
fun onDownload(url: String, mimeType: String, userAgent: String) {
eventBinder!!.download(url, mimeType, userAgent)
}
fun setup(binder: IWebViewEvents) {
if (eventBinder != null) return
eventBinder = binder
binder.ready(ctrlBinder)
}
sealed interface Command {
data class Load(val url: String) : Command
data object Finish : Command
}
}

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/main">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

View File

@@ -0,0 +1 @@
<resources></resources>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.WebViewActivity" parent="Theme.AppCompat.DayNight">
<item name="android:windowActionBar">true</item>
<item name="android:windowNoTitle">false</item>
</style>
</resources>

1
app/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

252
app/build.gradle.kts Normal file
View File

@@ -0,0 +1,252 @@
import kotlin.random.Random
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.kotlin.parcelize)
alias(libs.plugins.compose.compiler)
alias(libs.plugins.devtools)
alias(libs.plugins.about.libraries)
signing
}
val outputApkFileName = "${rootProject.name}-$version.apk"
dependencies {
// AndroidX Core
implementation(libs.androidx.ktx)
implementation(libs.runtime.ktx)
implementation(libs.runtime.compose)
implementation(libs.splash.screen)
implementation(libs.activity.compose)
implementation(libs.work.runtime.ktx)
implementation(libs.preferences.datastore)
implementation(libs.appcompat)
// Compose
implementation(platform(libs.compose.bom))
implementation(libs.compose.ui)
implementation(libs.compose.ui.preview)
implementation(libs.compose.ui.tooling)
implementation(libs.compose.livedata)
implementation(libs.compose.material.icons.extended)
implementation(libs.compose.material3)
implementation(libs.navigation.compose)
// Accompanist
implementation(libs.accompanist.drawablepainter)
// Placeholder
implementation(libs.placeholder.material3)
// Coil (async image loading, network image)
implementation(libs.coil.compose)
implementation(libs.coil.appiconloader)
// KotlinX
implementation(libs.kotlinx.serialization.json)
implementation(libs.kotlinx.collection.immutable)
implementation(libs.kotlinx.datetime)
// Room
implementation(libs.room.runtime)
implementation(libs.room.ktx)
annotationProcessor(libs.room.compiler)
ksp(libs.room.compiler)
// ReVanced
implementation(libs.revanced.patcher)
implementation(libs.revanced.library)
// Downloader plugins
implementation(project(":api"))
// Native processes
implementation(libs.kotlin.process)
// HiddenAPI
compileOnly(libs.hidden.api.stub)
// LibSU
implementation(libs.libsu.core)
implementation(libs.libsu.service)
implementation(libs.libsu.nio)
// Koin
implementation(libs.koin.android)
implementation(libs.koin.compose)
implementation(libs.koin.compose.navigation)
implementation(libs.koin.workmanager)
// Licenses
implementation(libs.about.libraries)
// Ktor
implementation(libs.ktor.core)
implementation(libs.ktor.logging)
implementation(libs.ktor.okhttp)
implementation(libs.ktor.content.negotiation)
implementation(libs.ktor.serialization)
// Markdown
implementation(libs.markdown.renderer)
// Fading Edges
implementation(libs.fading.edges)
// Scrollbars
implementation(libs.scrollbars)
// EnumUtil
implementation(libs.enumutil)
ksp(libs.enumutil.ksp)
// Reorderable lists
implementation(libs.reorderable)
// Compose Icons
implementation(libs.compose.icons.fontawesome)
}
android {
namespace = "app.revanced.manager"
compileSdk = 35
buildToolsVersion = "35.0.1"
defaultConfig {
applicationId = "app.revanced.manager"
minSdk = 26
targetSdk = 35
versionCode = 1
versionName = "0.0.1"
vectorDrawables.useSupportLibrary = true
}
buildTypes {
debug {
applicationIdSuffix = ".debug"
resValue("string", "app_name", "ReVanced Manager (Debug)")
isPseudoLocalesEnabled = true
buildConfigField("long", "BUILD_ID", "${Random.nextLong()}L")
}
release {
if (!project.hasProperty("noProguard")) {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
val keystoreFile = file("keystore.jks")
if (project.hasProperty("signAsDebug") || !keystoreFile.exists()) {
applicationIdSuffix = ".debug_signed"
resValue("string", "app_name", "ReVanced Manager (Debug signed)")
signingConfig = signingConfigs.getByName("debug")
isPseudoLocalesEnabled = true
} else {
signingConfig = signingConfigs.create("release") {
storeFile = keystoreFile
storePassword = System.getenv("KEYSTORE_PASSWORD")
keyAlias = System.getenv("KEYSTORE_ENTRY_ALIAS")
keyPassword = System.getenv("KEYSTORE_ENTRY_PASSWORD")
}
}
buildConfigField("long", "BUILD_ID", "0L")
}
}
applicationVariants.all {
outputs.all {
this as com.android.build.gradle.internal.api.ApkVariantOutputImpl
outputFileName = outputApkFileName
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
dependenciesInfo {
includeInApk = false
includeInBundle = false
}
packaging {
resources.excludes.addAll(
listOf(
"/prebuilt/**",
"META-INF/DEPENDENCIES",
"META-INF/**.version",
"DebugProbesKt.bin",
"kotlin-tooling-metadata.json",
"org/bouncycastle/pqc/**.properties",
"org/bouncycastle/x509/**.properties",
)
)
jniLibs {
useLegacyPackaging = true
}
}
ksp {
arg("room.schemaLocation", "$projectDir/schemas")
}
kotlinOptions {
jvmTarget = "17"
}
buildFeatures {
compose = true
aidl = true
buildConfig = true
}
android {
androidResources {
generateLocaleConfig = true
}
}
externalNativeBuild {
cmake {
path = file("src/main/cpp/CMakeLists.txt")
version = "3.22.1"
}
}
}
kotlin {
jvmToolchain(17)
}
tasks {
// Needed by gradle-semantic-release-plugin.
// Tracking: https://github.com/KengoTODA/gradle-semantic-release-plugin/issues/435.
val publish by registering {
group = "publishing"
description = "Build the release APK"
dependsOn("assembleRelease")
val apk = project.layout.buildDirectory.file("outputs/apk/release/${outputApkFileName}")
val ascFile = apk.map { it.asFile.resolveSibling("${it.asFile.name}.asc") }
inputs.file(apk).withPropertyName("inputApk")
outputs.file(ascFile).withPropertyName("outputAsc")
doLast {
signing {
useGpgCmd()
sign(apk.get().asFile)
}
}
}
}

63
app/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,63 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.kts.kts.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
-dontobfuscate
# Required for serialization to work properly
-if @kotlinx.serialization.Serializable class **
-keepclassmembers class <1> {
static <1>$Companion Companion;
}
-if @kotlinx.serialization.Serializable class ** {
static **$* *;
}
-keepclassmembers class <2>$<3> {
kotlinx.serialization.KSerializer serializer(...);
}
-if @kotlinx.serialization.Serializable class ** {
public static ** INSTANCE;
}
-keepclassmembers class <1> {
public static <1> INSTANCE;
kotlinx.serialization.KSerializer serializer(...);
}
# This required for the process runtime.
-keep class app.revanced.manager.patcher.runtime.process.* {
*;
}
# Required for the patcher to function correctly
-keep class app.revanced.patcher.** {
*;
}
-keep class brut.** {
*;
}
-keep class org.xmlpull.** {
*;
}
-keep class kotlin.** {
*;
}
-keep class org.jf.** {
*;
}
-keep class com.android.** {
*;
}
-keep class app.revanced.manager.plugin.** {
*;
}
-dontwarn com.google.auto.value.**
-dontwarn java.awt.**
-dontwarn javax.**
-dontwarn org.slf4j.**
-dontwarn it.skrape.fetcher.*
-dontwarn com.google.j2objc.annotations.*
-keepattributes RuntimeVisibleAnnotations,AnnotationDefault

View File

@@ -0,0 +1,429 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "d0119047505da435972c5247181de675",
"entities": [
{
"tableName": "patch_bundles",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER NOT NULL, `name` TEXT NOT NULL, `version` TEXT, `source` TEXT NOT NULL, `auto_update` INTEGER NOT NULL, PRIMARY KEY(`uid`))",
"fields": [
{
"fieldPath": "uid",
"columnName": "uid",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "version",
"columnName": "version",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "autoUpdate",
"columnName": "auto_update",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"uid"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "patch_selections",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER NOT NULL, `patch_bundle` INTEGER NOT NULL, `package_name` TEXT NOT NULL, PRIMARY KEY(`uid`), FOREIGN KEY(`patch_bundle`) REFERENCES `patch_bundles`(`uid`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "uid",
"columnName": "uid",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "patchBundle",
"columnName": "patch_bundle",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "packageName",
"columnName": "package_name",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"uid"
]
},
"indices": [
{
"name": "index_patch_selections_patch_bundle_package_name",
"unique": true,
"columnNames": [
"patch_bundle",
"package_name"
],
"orders": [],
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_patch_selections_patch_bundle_package_name` ON `${TABLE_NAME}` (`patch_bundle`, `package_name`)"
}
],
"foreignKeys": [
{
"table": "patch_bundles",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"patch_bundle"
],
"referencedColumns": [
"uid"
]
}
]
},
{
"tableName": "selected_patches",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`selection` INTEGER NOT NULL, `patch_name` TEXT NOT NULL, PRIMARY KEY(`selection`, `patch_name`), FOREIGN KEY(`selection`) REFERENCES `patch_selections`(`uid`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "selection",
"columnName": "selection",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "patchName",
"columnName": "patch_name",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"selection",
"patch_name"
]
},
"indices": [],
"foreignKeys": [
{
"table": "patch_selections",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"selection"
],
"referencedColumns": [
"uid"
]
}
]
},
{
"tableName": "downloaded_app",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`package_name` TEXT NOT NULL, `version` TEXT NOT NULL, `directory` TEXT NOT NULL, `last_used` INTEGER NOT NULL, PRIMARY KEY(`package_name`, `version`))",
"fields": [
{
"fieldPath": "packageName",
"columnName": "package_name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "version",
"columnName": "version",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "directory",
"columnName": "directory",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUsed",
"columnName": "last_used",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"package_name",
"version"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "installed_app",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`current_package_name` TEXT NOT NULL, `original_package_name` TEXT NOT NULL, `version` TEXT NOT NULL, `install_type` TEXT NOT NULL, PRIMARY KEY(`current_package_name`))",
"fields": [
{
"fieldPath": "currentPackageName",
"columnName": "current_package_name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "originalPackageName",
"columnName": "original_package_name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "version",
"columnName": "version",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "installType",
"columnName": "install_type",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"current_package_name"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "applied_patch",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`package_name` TEXT NOT NULL, `bundle` INTEGER NOT NULL, `patch_name` TEXT NOT NULL, PRIMARY KEY(`package_name`, `bundle`, `patch_name`), FOREIGN KEY(`package_name`) REFERENCES `installed_app`(`current_package_name`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`bundle`) REFERENCES `patch_bundles`(`uid`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "packageName",
"columnName": "package_name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "bundle",
"columnName": "bundle",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "patchName",
"columnName": "patch_name",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"package_name",
"bundle",
"patch_name"
]
},
"indices": [
{
"name": "index_applied_patch_bundle",
"unique": false,
"columnNames": [
"bundle"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_applied_patch_bundle` ON `${TABLE_NAME}` (`bundle`)"
}
],
"foreignKeys": [
{
"table": "installed_app",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"package_name"
],
"referencedColumns": [
"current_package_name"
]
},
{
"table": "patch_bundles",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"bundle"
],
"referencedColumns": [
"uid"
]
}
]
},
{
"tableName": "option_groups",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER NOT NULL, `patch_bundle` INTEGER NOT NULL, `package_name` TEXT NOT NULL, PRIMARY KEY(`uid`), FOREIGN KEY(`patch_bundle`) REFERENCES `patch_bundles`(`uid`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "uid",
"columnName": "uid",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "patchBundle",
"columnName": "patch_bundle",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "packageName",
"columnName": "package_name",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"uid"
]
},
"indices": [
{
"name": "index_option_groups_patch_bundle_package_name",
"unique": true,
"columnNames": [
"patch_bundle",
"package_name"
],
"orders": [],
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_option_groups_patch_bundle_package_name` ON `${TABLE_NAME}` (`patch_bundle`, `package_name`)"
}
],
"foreignKeys": [
{
"table": "patch_bundles",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"patch_bundle"
],
"referencedColumns": [
"uid"
]
}
]
},
{
"tableName": "options",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`group` INTEGER NOT NULL, `patch_name` TEXT NOT NULL, `key` TEXT NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`group`, `patch_name`, `key`), FOREIGN KEY(`group`) REFERENCES `option_groups`(`uid`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "group",
"columnName": "group",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "patchName",
"columnName": "patch_name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "key",
"columnName": "key",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "value",
"columnName": "value",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"group",
"patch_name",
"key"
]
},
"indices": [],
"foreignKeys": [
{
"table": "option_groups",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"group"
],
"referencedColumns": [
"uid"
]
}
]
},
{
"tableName": "trusted_downloader_plugins",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`package_name` TEXT NOT NULL, `signature` BLOB NOT NULL, PRIMARY KEY(`package_name`))",
"fields": [
{
"fieldPath": "packageName",
"columnName": "package_name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "signature",
"columnName": "signature",
"affinity": "BLOB",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"package_name"
]
},
"indices": [],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd0119047505da435972c5247181de675')"
]
}
}

View File

@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<permission
android:name="app.revanced.manager.permission.PLUGIN_HOST"
android:protectionLevel="signature"
android:label="@string/plugin_host_permission_label"
android:description="@string/plugin_host_permission_description"
/>
<uses-permission android:name="app.revanced.manager.permission.PLUGIN_HOST" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ENFORCE_UPDATE_OWNERSHIP" />
<application
android:name=".ManagerApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:largeHeap="true"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.ReVancedManager"
android:enableOnBackInvokedCallback="true"
tools:targetApi="34">
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.ReVancedManager">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".plugin.downloader.webview.WebViewActivity" android:exported="false" android:theme="@style/Theme.WebViewActivity" />
<service android:name=".service.InstallService" />
<service android:name=".service.UninstallService" />
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:foregroundServiceType="specialUse"
android:exported="false"
tools:node="merge">
<property
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
android:value="patching"
/>
</service>
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
</application>
</manifest>

View File

@@ -0,0 +1,8 @@
// IRootService.aidl
package app.revanced.manager;
// Declare any non-default types here with import statements
interface IRootSystemService {
IBinder getFileSystemService();
}

View File

@@ -0,0 +1,11 @@
// IPatcherEvents.aidl
package app.revanced.manager.patcher.runtime.process;
// Interface for sending events back to the main app process.
oneway interface IPatcherEvents {
void log(String level, String msg);
void patchSucceeded();
void progress(String name, String state, String msg);
// The patching process has ended. The exceptionStackTrace is null if it finished successfully.
void finished(String exceptionStackTrace);
}

View File

@@ -0,0 +1,14 @@
// IPatcherProcess.aidl
package app.revanced.manager.patcher.runtime.process;
import app.revanced.manager.patcher.runtime.process.Parameters;
import app.revanced.manager.patcher.runtime.process.IPatcherEvents;
interface IPatcherProcess {
// Returns BuildConfig.BUILD_ID, which is used to ensure the main app and runner process are running the same code.
long buildId();
// Makes the patcher process exit with code 0
oneway void exit();
// Starts patching.
oneway void start(in Parameters parameters, IPatcherEvents events);
}

View File

@@ -0,0 +1,4 @@
// Parameters.aidl
package app.revanced.manager.patcher.runtime.process;
parcelable Parameters;

View File

@@ -0,0 +1,6 @@
id=__PKG_NAME__-ReVanced
name=__LABEL__ ReVanced
version=__VERSION__
versionCode=0
author=ReVanced
description=Mounts the patched APK on top of the original one

View File

@@ -0,0 +1,40 @@
#!/system/bin/sh
DIR=${0%/*}
package_name="__PKG_NAME__"
version="__VERSION__"
rm "$DIR/log"
{
until [ "$(getprop sys.boot_completed)" = 1 ]; do sleep 5; done
sleep 5
base_path="$DIR/$package_name.apk"
stock_path="$(pm path "$package_name" | grep base | sed 's/package://g')"
stock_version="$(dumpsys package "$package_name" | grep versionName | cut -d "=" -f2)"
echo "base_path: $base_path"
echo "stock_path: $stock_path"
echo "base_version: $version"
echo "stock_version: $stock_version"
if mount | grep -q "$stock_path" ; then
echo "Not mounting as stock path is already mounted"
exit 1
fi
if [ "$version" != "$stock_version" ]; then
echo "Not mounting as versions don't match"
exit 1
fi
if [ -z "$stock_path" ]; then
echo "Not mounting as app info could not be loaded"
exit 1
fi
mount -o bind "$base_path" "$stock_path"
} >> "$DIR/log"

View File

@@ -0,0 +1,38 @@
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html.
# For more examples on how to use CMake, see https://github.com/android/ndk-samples.
# Sets the minimum CMake version required for this project.
cmake_minimum_required(VERSION 3.22.1)
# Declares the project name. The project name can be accessed via ${ PROJECT_NAME},
# Since this is the top level CMakeLists.txt, the project name is also accessible
# with ${CMAKE_PROJECT_NAME} (both CMake variables are in-sync within the top level
# build script scope).
project("prop_override")
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
#
# In this top level CMakeLists.txt, ${CMAKE_PROJECT_NAME} is used to define
# the target library name; in the sub-module's CMakeLists.txt, ${PROJECT_NAME}
# is preferred for the same purpose.
#
# In order to load a library into your app from Java/Kotlin, you must call
# System.loadLibrary() and pass the name of the library defined here;
# for GameActivity/NativeActivity derived applications, the same library name must be
# used in the AndroidManifest.xml file.
add_library(${CMAKE_PROJECT_NAME} SHARED
# List C/C++ source files with relative paths to this CMakeLists.txt.
prop_override.cpp)
# Specifies libraries CMake should link to your target library. You
# can link libraries from various origins, such as libraries defined in this
# build script, prebuilt third-party libraries, or Android system libraries.
target_link_libraries(${CMAKE_PROJECT_NAME}
# List libraries link to the target library
android
log)

View File

@@ -0,0 +1,62 @@
// Library for overriding Android system properties via environment variables.
//
// Usage: LD_PRELOAD=prop_override.so PROP_dalvik.vm.heapsize=123M getprop dalvik.vm.heapsize
// Output: 123M
#include <string>
#include <cstring>
#include <cstdlib>
#include <dlfcn.h>
// Source: https://android.googlesource.com/platform/system/core/+/100b08a848d018eeb1caa5d5e7c7c2aaac65da15/libcutils/include/cutils/properties.h
#define PROP_VALUE_MAX 92
// This is the mangled name of "android::base::GetProperty".
#define GET_PROPERTY_MANGLED_NAME "_ZN7android4base11GetPropertyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_"
extern "C" typedef int (*property_get_ptr)(const char *, char *, const char *);
typedef std::string (*GetProperty_ptr)(const std::string &, const std::string &);
char *GetPropOverride(const std::string &key) {
auto envKey = "PROP_" + key;
return getenv(envKey.c_str());
}
// See: https://android.googlesource.com/platform/system/core/+/100b08a848d018eeb1caa5d5e7c7c2aaac65da15/libcutils/properties.cpp
extern "C" int property_get(const char *key, char *value, const char *default_value) {
auto replacement = GetPropOverride(std::string(key));
if (replacement) {
int len = strnlen(replacement, PROP_VALUE_MAX);
strncpy(value, replacement, len);
return len;
}
static property_get_ptr original = NULL;
if (!original) {
// Get the address of the original function.
original = reinterpret_cast<property_get_ptr>(dlsym(RTLD_NEXT, "property_get"));
}
return original(key, value, default_value);
}
// Defining android::base::GetProperty ourselves won't work because std::string has a slightly different "path" in the NDK version of the C++ standard library.
// We can get around this by forcing the function to adopt a specific name using the asm keyword.
std::string GetProperty(const std::string &, const std::string &) asm(GET_PROPERTY_MANGLED_NAME);
// See: https://android.googlesource.com/platform/system/libbase/+/1a34bb67c4f3ba0a1ea6f4f20ac9fe117ba4fe64/properties.cpp
// This isn't used for the properties we want to override, but property_get is deprecated so that could change in the future.
std::string GetProperty(const std::string &key, const std::string &default_value) {
auto replacement = GetPropOverride(key);
if (replacement) {
return std::string(replacement);
}
static GetProperty_ptr original = NULL;
if (!original) {
original = reinterpret_cast<GetProperty_ptr>(dlsym(RTLD_NEXT, GET_PROPERTY_MANGLED_NAME));
}
return original(key, default_value);
}

View File

@@ -0,0 +1,336 @@
package app.revanced.manager
import android.content.ActivityNotFoundException
import android.os.Bundle
import android.os.Parcelable
import androidx.activity.ComponentActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.slideInHorizontally
import androidx.compose.animation.slideOutHorizontally
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.WindowCompat
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
import androidx.navigation.compose.rememberNavController
import androidx.navigation.toRoute
import app.revanced.manager.ui.model.navigation.AppSelector
import app.revanced.manager.ui.model.navigation.ComplexParameter
import app.revanced.manager.ui.model.navigation.Dashboard
import app.revanced.manager.ui.model.navigation.InstalledApplicationInfo
import app.revanced.manager.ui.model.navigation.Patcher
import app.revanced.manager.ui.model.navigation.SelectedApplicationInfo
import app.revanced.manager.ui.model.navigation.Settings
import app.revanced.manager.ui.model.navigation.Update
import app.revanced.manager.ui.screen.AppSelectorScreen
import app.revanced.manager.ui.screen.DashboardScreen
import app.revanced.manager.ui.screen.InstalledAppInfoScreen
import app.revanced.manager.ui.screen.PatcherScreen
import app.revanced.manager.ui.screen.PatchesSelectorScreen
import app.revanced.manager.ui.screen.RequiredOptionsScreen
import app.revanced.manager.ui.screen.SelectedAppInfoScreen
import app.revanced.manager.ui.screen.SettingsScreen
import app.revanced.manager.ui.screen.UpdateScreen
import app.revanced.manager.ui.screen.settings.AboutSettingsScreen
import app.revanced.manager.ui.screen.settings.AdvancedSettingsScreen
import app.revanced.manager.ui.screen.settings.ContributorSettingsScreen
import app.revanced.manager.ui.screen.settings.DeveloperSettingsScreen
import app.revanced.manager.ui.screen.settings.DownloadsSettingsScreen
import app.revanced.manager.ui.screen.settings.GeneralSettingsScreen
import app.revanced.manager.ui.screen.settings.ImportExportSettingsScreen
import app.revanced.manager.ui.screen.settings.LicensesSettingsScreen
import app.revanced.manager.ui.screen.settings.update.ChangelogsSettingsScreen
import app.revanced.manager.ui.screen.settings.update.UpdatesSettingsScreen
import app.revanced.manager.ui.theme.ReVancedManagerTheme
import app.revanced.manager.ui.theme.Theme
import app.revanced.manager.ui.viewmodel.MainViewModel
import app.revanced.manager.ui.viewmodel.SelectedAppInfoViewModel
import app.revanced.manager.util.EventEffect
import kotlinx.coroutines.launch
import org.koin.androidx.compose.koinViewModel
import org.koin.androidx.compose.navigation.koinNavViewModel
import org.koin.core.parameter.parametersOf
import org.koin.androidx.viewmodel.ext.android.getViewModel as getActivityViewModel
class MainActivity : ComponentActivity() {
@ExperimentalAnimationApi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
enableEdgeToEdge()
installSplashScreen()
val vm: MainViewModel = getActivityViewModel()
setContent {
val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.StartActivityForResult(),
onResult = vm::applyLegacySettings
)
val theme by vm.prefs.theme.getAsState()
val dynamicColor by vm.prefs.dynamicColor.getAsState()
EventEffect(vm.legacyImportActivityFlow) {
try {
launcher.launch(it)
} catch (_: ActivityNotFoundException) {
}
}
ReVancedManagerTheme(
darkTheme = theme == Theme.SYSTEM && isSystemInDarkTheme() || theme == Theme.DARK,
dynamicColor = dynamicColor
) {
ReVancedManager(vm)
}
}
}
}
@Composable
private fun ReVancedManager(vm: MainViewModel) {
val navController = rememberNavController()
EventEffect(vm.appSelectFlow) { app ->
navController.navigateComplex(
SelectedApplicationInfo,
SelectedApplicationInfo.ViewModelParams(app)
)
}
NavHost(
navController = navController,
startDestination = Dashboard,
enterTransition = { slideInHorizontally(initialOffsetX = { it }) },
exitTransition = { slideOutHorizontally(targetOffsetX = { -it / 3 }) },
popEnterTransition = { slideInHorizontally(initialOffsetX = { -it / 3 }) },
popExitTransition = { slideOutHorizontally(targetOffsetX = { it }) },
) {
composable<Dashboard> {
DashboardScreen(
onSettingsClick = { navController.navigate(Settings) },
onAppSelectorClick = {
navController.navigate(AppSelector)
},
onUpdateClick = {
navController.navigate(Update())
},
onDownloaderPluginClick = {
navController.navigate(Settings.Downloads)
},
onAppClick = { packageName ->
navController.navigate(InstalledApplicationInfo(packageName))
}
)
}
composable<InstalledApplicationInfo> {
val data = it.toRoute<InstalledApplicationInfo>()
InstalledAppInfoScreen(
onPatchClick = vm::selectApp,
onBackClick = navController::popBackStack,
viewModel = koinViewModel { parametersOf(data.packageName) }
)
}
composable<AppSelector> {
AppSelectorScreen(
onSelect = vm::selectApp,
onStorageSelect = vm::selectApp,
onBackClick = navController::popBackStack
)
}
composable<Patcher> {
PatcherScreen(
onBackClick = {
navController.navigate(route = Dashboard) {
launchSingleTop = true
popUpTo<Dashboard> {
inclusive = false
}
}
},
viewModel = koinViewModel { parametersOf(it.getComplexArg<Patcher.ViewModelParams>()) }
)
}
composable<Update> {
val data = it.toRoute<Update>()
UpdateScreen(
onBackClick = navController::popBackStack,
vm = koinViewModel { parametersOf(data.downloadOnScreenEntry) }
)
}
navigation<SelectedApplicationInfo>(startDestination = SelectedApplicationInfo.Main) {
composable<SelectedApplicationInfo.Main> {
val parentBackStackEntry = navController.navGraphEntry(it)
val data =
parentBackStackEntry.getComplexArg<SelectedApplicationInfo.ViewModelParams>()
val viewModel =
koinNavViewModel<SelectedAppInfoViewModel>(viewModelStoreOwner = parentBackStackEntry) {
parametersOf(data)
}
SelectedAppInfoScreen(
onBackClick = navController::popBackStack,
onPatchClick = {
it.lifecycleScope.launch {
navController.navigateComplex(
Patcher,
viewModel.getPatcherParams()
)
}
},
onPatchSelectorClick = { app, patches, options ->
navController.navigateComplex(
SelectedApplicationInfo.PatchesSelector,
SelectedApplicationInfo.PatchesSelector.ViewModelParams(
app,
patches,
options
)
)
},
onRequiredOptions = { app, patches, options ->
navController.navigateComplex(
SelectedApplicationInfo.RequiredOptions,
SelectedApplicationInfo.PatchesSelector.ViewModelParams(
app,
patches,
options
)
)
},
vm = viewModel
)
}
composable<SelectedApplicationInfo.PatchesSelector> {
val data =
it.getComplexArg<SelectedApplicationInfo.PatchesSelector.ViewModelParams>()
val selectedAppInfoVm = koinNavViewModel<SelectedAppInfoViewModel>(
viewModelStoreOwner = navController.navGraphEntry(it)
)
PatchesSelectorScreen(
onBackClick = navController::popBackStack,
onSave = { patches, options ->
selectedAppInfoVm.updateConfiguration(patches, options)
navController.popBackStack()
},
viewModel = koinViewModel { parametersOf(data) }
)
}
composable<SelectedApplicationInfo.RequiredOptions> {
val data =
it.getComplexArg<SelectedApplicationInfo.PatchesSelector.ViewModelParams>()
val selectedAppInfoVm = koinNavViewModel<SelectedAppInfoViewModel>(
viewModelStoreOwner = navController.navGraphEntry(it)
)
RequiredOptionsScreen(
onBackClick = navController::popBackStack,
onContinue = { patches, options ->
selectedAppInfoVm.updateConfiguration(patches, options)
it.lifecycleScope.launch {
navController.navigateComplex(
Patcher,
selectedAppInfoVm.getPatcherParams()
)
}
},
vm = koinViewModel { parametersOf(data) }
)
}
}
navigation<Settings>(startDestination = Settings.Main) {
composable<Settings.Main> {
SettingsScreen(
onBackClick = navController::popBackStack,
navigate = navController::navigate
)
}
composable<Settings.General> {
GeneralSettingsScreen(onBackClick = navController::popBackStack)
}
composable<Settings.Advanced> {
AdvancedSettingsScreen(onBackClick = navController::popBackStack)
}
composable<Settings.Developer> {
DeveloperSettingsScreen(onBackClick = navController::popBackStack)
}
composable<Settings.Updates> {
UpdatesSettingsScreen(
onBackClick = navController::popBackStack,
onChangelogClick = { navController.navigate(Settings.Changelogs) },
onUpdateClick = { navController.navigate(Update()) }
)
}
composable<Settings.Downloads> {
DownloadsSettingsScreen(onBackClick = navController::popBackStack)
}
composable<Settings.ImportExport> {
ImportExportSettingsScreen(onBackClick = navController::popBackStack)
}
composable<Settings.About> {
AboutSettingsScreen(
onBackClick = navController::popBackStack,
navigate = navController::navigate
)
}
composable<Settings.Changelogs> {
ChangelogsSettingsScreen(onBackClick = navController::popBackStack)
}
composable<Settings.Contributors> {
ContributorSettingsScreen(onBackClick = navController::popBackStack)
}
composable<Settings.Licenses> {
LicensesSettingsScreen(onBackClick = navController::popBackStack)
}
}
}
}
@Composable
private fun NavController.navGraphEntry(entry: NavBackStackEntry) =
remember(entry) { getBackStackEntry(entry.destination.parent!!.id) }
// Androidx Navigation does not support storing complex types in route objects, so we have to store them inside the saved state handle of the back stack entry instead.
private fun <T : Parcelable, R : ComplexParameter<T>> NavController.navigateComplex(
route: R,
data: T
) {
navigate(route)
getBackStackEntry(route).savedStateHandle["args"] = data
}
private fun <T : Parcelable> NavBackStackEntry.getComplexArg() = savedStateHandle.get<T>("args")!!

View File

@@ -0,0 +1,110 @@
package app.revanced.manager
import android.app.Activity
import android.app.Application
import android.os.Bundle
import android.util.Log
import app.revanced.manager.data.platform.Filesystem
import app.revanced.manager.di.*
import app.revanced.manager.domain.manager.PreferencesManager
import app.revanced.manager.domain.repository.DownloaderPluginRepository
import app.revanced.manager.domain.repository.PatchBundleRepository
import app.revanced.manager.util.tag
import kotlinx.coroutines.Dispatchers
import coil.Coil
import coil.ImageLoader
import com.topjohnwu.superuser.Shell
import com.topjohnwu.superuser.internal.BuilderImpl
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
import me.zhanghai.android.appiconloader.coil.AppIconFetcher
import me.zhanghai.android.appiconloader.coil.AppIconKeyer
import org.koin.android.ext.android.inject
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.androidx.workmanager.koin.workManagerFactory
import org.koin.core.context.startKoin
class ManagerApplication : Application() {
private val scope = MainScope()
private val prefs: PreferencesManager by inject()
private val patchBundleRepository: PatchBundleRepository by inject()
private val downloaderPluginRepository: DownloaderPluginRepository by inject()
private val fs: Filesystem by inject()
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@ManagerApplication)
androidLogger()
workManagerFactory()
modules(
httpModule,
preferencesModule,
repositoryModule,
serviceModule,
managerModule,
workerModule,
viewModelModule,
databaseModule,
rootModule
)
}
val pixels = 512
Coil.setImageLoader(
ImageLoader.Builder(this)
.components {
add(AppIconKeyer())
add(AppIconFetcher.Factory(pixels, true, this@ManagerApplication))
}
.build()
)
val shellBuilder = BuilderImpl.create().setFlags(Shell.FLAG_MOUNT_MASTER)
Shell.setDefaultBuilder(shellBuilder)
scope.launch {
prefs.preload()
}
scope.launch(Dispatchers.Default) {
downloaderPluginRepository.reload()
}
scope.launch(Dispatchers.Default) {
with(patchBundleRepository) {
reload()
updateCheck()
}
}
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
private var firstActivityCreated = false
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
if (firstActivityCreated) return
firstActivityCreated = true
// We do not want to call onFreshProcessStart() if there is state to restore.
// This can happen on system-initiated process death.
if (savedInstanceState == null) {
Log.d(tag, "Fresh process created")
onFreshProcessStart()
} else Log.d(tag, "System-initiated process death detected")
}
override fun onActivityStarted(activity: Activity) {}
override fun onActivityResumed(activity: Activity) {}
override fun onActivityPaused(activity: Activity) {}
override fun onActivityStopped(activity: Activity) {}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
override fun onActivityDestroyed(activity: Activity) {}
})
}
private fun onFreshProcessStart() {
fs.uiTempDir.apply {
deleteRecursively()
mkdirs()
}
}
}

View File

@@ -0,0 +1,51 @@
package app.revanced.manager.data.platform
import android.Manifest
import android.app.Application
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.os.Environment
import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.result.contract.ActivityResultContracts
import app.revanced.manager.util.RequestManageStorageContract
import java.io.File
import java.nio.file.Path
class Filesystem(private val app: Application) {
val contentResolver = app.contentResolver // TODO: move Content Resolver operations to here.
/**
* A directory that gets cleared when the app restarts.
* Do not store paths to this directory in a parcel.
*/
val tempDir: File = app.getDir("ephemeral", Context.MODE_PRIVATE).apply {
deleteRecursively()
mkdirs()
}
/**
* A directory for storing temporary files related to UI.
* This is the same as [tempDir], but does not get cleared on system-initiated process death.
* Paths to this directory can be safely stored in parcels.
*/
val uiTempDir: File = app.getDir("ui_ephemeral", Context.MODE_PRIVATE)
fun externalFilesDir(): Path = Environment.getExternalStorageDirectory().toPath()
private fun usesManagePermission() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
private val storagePermissionName =
if (usesManagePermission()) Manifest.permission.MANAGE_EXTERNAL_STORAGE else Manifest.permission.READ_EXTERNAL_STORAGE
fun permissionContract(): Pair<ActivityResultContract<String, Boolean>, String> {
val contract =
if (usesManagePermission()) RequestManageStorageContract() else ActivityResultContracts.RequestPermission()
return contract to storagePermissionName
}
fun hasStoragePermission() =
if (usesManagePermission()) Environment.isExternalStorageManager() else app.checkSelfPermission(
storagePermissionName
) == PackageManager.PERMISSION_GRANTED
}

View File

@@ -0,0 +1,19 @@
package app.revanced.manager.data.platform
import android.app.Application
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import androidx.core.content.getSystemService
class NetworkInfo(app: Application) {
private val connectivityManager = app.getSystemService<ConnectivityManager>()!!
private fun getCapabilities() = connectivityManager.activeNetwork?.let { connectivityManager.getNetworkCapabilities(it) }
fun isConnected() = connectivityManager.activeNetwork != null
fun isUnmetered() = getCapabilities()?.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) ?: true
/**
* Returns true if it is safe to download large files.
*/
fun isSafe() = isConnected() && isUnmetered()
}

View File

@@ -0,0 +1,74 @@
package app.revanced.manager.data.redux
import android.util.Log
import app.revanced.manager.util.tag
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withTimeoutOrNull
// This file implements React Redux-like state management.
class Store<S>(private val coroutineScope: CoroutineScope, initialState: S) : ActionContext {
private val _state = MutableStateFlow(initialState)
val state = _state.asStateFlow()
// Do not touch these without the lock.
private var isRunningActions = false
private val queueChannel = Channel<Action<S>>(capacity = 10)
private val lock = Mutex()
suspend fun dispatch(action: Action<S>) = lock.withLock {
Log.d(tag, "Dispatching $action")
queueChannel.send(action)
if (isRunningActions) return@withLock
isRunningActions = true
coroutineScope.launch {
runActions()
}
}
@OptIn(ExperimentalCoroutinesApi::class)
private suspend fun runActions() {
while (true) {
val action = withTimeoutOrNull(200L) { queueChannel.receive() }
if (action == null) {
Log.d(tag, "Stopping action runner")
lock.withLock {
// New actions may be dispatched during the timeout.
isRunningActions = !queueChannel.isEmpty
if (!isRunningActions) return
}
continue
}
Log.d(tag, "Running $action")
_state.value = try {
with(action) { this@Store.execute(_state.value) }
} catch (c: CancellationException) {
// This is done without the lock, but cancellation usually means the store is no longer needed.
isRunningActions = false
throw c
} catch (e: Exception) {
action.catch(e)
continue
}
}
}
}
interface ActionContext
interface Action<S> {
suspend fun ActionContext.execute(current: S): S
suspend fun catch(exception: Exception) {
Log.e(tag, "Got exception while executing $this", exception)
}
}

View File

@@ -0,0 +1,39 @@
package app.revanced.manager.data.room
import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import app.revanced.manager.data.room.apps.downloaded.DownloadedAppDao
import app.revanced.manager.data.room.apps.downloaded.DownloadedApp
import app.revanced.manager.data.room.apps.installed.AppliedPatch
import app.revanced.manager.data.room.apps.installed.InstalledApp
import app.revanced.manager.data.room.apps.installed.InstalledAppDao
import app.revanced.manager.data.room.selection.PatchSelection
import app.revanced.manager.data.room.selection.SelectedPatch
import app.revanced.manager.data.room.selection.SelectionDao
import app.revanced.manager.data.room.bundles.PatchBundleDao
import app.revanced.manager.data.room.bundles.PatchBundleEntity
import app.revanced.manager.data.room.options.Option
import app.revanced.manager.data.room.options.OptionDao
import app.revanced.manager.data.room.options.OptionGroup
import app.revanced.manager.data.room.plugins.TrustedDownloaderPlugin
import app.revanced.manager.data.room.plugins.TrustedDownloaderPluginDao
import kotlin.random.Random
@Database(
entities = [PatchBundleEntity::class, PatchSelection::class, SelectedPatch::class, DownloadedApp::class, InstalledApp::class, AppliedPatch::class, OptionGroup::class, Option::class, TrustedDownloaderPlugin::class],
version = 1
)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun patchBundleDao(): PatchBundleDao
abstract fun selectionDao(): SelectionDao
abstract fun downloadedAppDao(): DownloadedAppDao
abstract fun installedAppDao(): InstalledAppDao
abstract fun optionDao(): OptionDao
abstract fun trustedDownloaderPluginDao(): TrustedDownloaderPluginDao
companion object {
fun generateUid() = Random.Default.nextInt()
}
}

View File

@@ -0,0 +1,26 @@
package app.revanced.manager.data.room
import androidx.room.TypeConverter
import app.revanced.manager.data.room.bundles.Source
import app.revanced.manager.data.room.options.Option.SerializedValue
import java.io.File
class Converters {
@TypeConverter
fun sourceFromString(value: String) = Source.from(value)
@TypeConverter
fun sourceToString(value: Source) = value.toString()
@TypeConverter
fun fileFromString(value: String) = File(value)
@TypeConverter
fun fileToString(file: File): String = file.path
@TypeConverter
fun serializedOptionFromString(value: String) = SerializedValue.fromJsonString(value)
@TypeConverter
fun serializedOptionToString(value: SerializedValue) = value.toJsonString()
}

View File

@@ -0,0 +1,16 @@
package app.revanced.manager.data.room.apps.downloaded
import androidx.room.ColumnInfo
import androidx.room.Entity
import java.io.File
@Entity(
tableName = "downloaded_app",
primaryKeys = ["package_name", "version"]
)
data class DownloadedApp(
@ColumnInfo(name = "package_name") val packageName: String,
@ColumnInfo(name = "version") val version: String,
@ColumnInfo(name = "directory") val directory: File,
@ColumnInfo(name = "last_used") val lastUsed: Long = System.currentTimeMillis()
)

View File

@@ -0,0 +1,26 @@
package app.revanced.manager.data.room.apps.downloaded
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
import androidx.room.Upsert
import kotlinx.coroutines.flow.Flow
@Dao
interface DownloadedAppDao {
@Query("SELECT * FROM downloaded_app")
fun getAllApps(): Flow<List<DownloadedApp>>
@Query("SELECT * FROM downloaded_app WHERE package_name = :packageName AND version = :version")
suspend fun get(packageName: String, version: String): DownloadedApp?
@Upsert
suspend fun upsert(downloadedApp: DownloadedApp)
@Query("UPDATE downloaded_app SET last_used = :newValue WHERE package_name = :packageName AND version = :version")
suspend fun markUsed(packageName: String, version: String, newValue: Long = System.currentTimeMillis())
@Delete
suspend fun delete(downloadedApps: Collection<DownloadedApp>)
}

View File

@@ -0,0 +1,35 @@
package app.revanced.manager.data.room.apps.installed
import android.os.Parcelable
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.Index
import app.revanced.manager.data.room.bundles.PatchBundleEntity
import kotlinx.parcelize.Parcelize
@Parcelize
@Entity(
tableName = "applied_patch",
primaryKeys = ["package_name", "bundle", "patch_name"],
foreignKeys = [
ForeignKey(
InstalledApp::class,
parentColumns = ["current_package_name"],
childColumns = ["package_name"],
onDelete = ForeignKey.CASCADE
),
ForeignKey(
PatchBundleEntity::class,
parentColumns = ["uid"],
childColumns = ["bundle"],
onDelete = ForeignKey.CASCADE
)
],
indices = [Index(value = ["bundle"], unique = false)]
)
data class AppliedPatch(
@ColumnInfo(name = "package_name") val packageName: String,
@ColumnInfo(name = "bundle") val bundle: Int,
@ColumnInfo(name = "patch_name") val patchName: String
) : Parcelable

View File

@@ -0,0 +1,20 @@
package app.revanced.manager.data.room.apps.installed
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import app.revanced.manager.R
enum class InstallType(val stringResource: Int) {
DEFAULT(R.string.default_install),
MOUNT(R.string.mount_install)
}
@Entity(tableName = "installed_app")
data class InstalledApp(
@PrimaryKey
@ColumnInfo(name = "current_package_name") val currentPackageName: String,
@ColumnInfo(name = "original_package_name") val originalPackageName: String,
@ColumnInfo(name = "version") val version: String,
@ColumnInfo(name = "install_type") val installType: InstallType
)

View File

@@ -0,0 +1,46 @@
package app.revanced.manager.data.room.apps.installed
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.MapColumn
import androidx.room.Query
import androidx.room.Transaction
import androidx.room.Upsert
import kotlinx.coroutines.flow.Flow
@Dao
interface InstalledAppDao {
@Query("SELECT * FROM installed_app")
fun getAll(): Flow<List<InstalledApp>>
@Query("SELECT * FROM installed_app WHERE current_package_name = :packageName")
suspend fun get(packageName: String): InstalledApp?
@Query(
"SELECT bundle, patch_name FROM applied_patch" +
" WHERE package_name = :packageName"
)
suspend fun getPatchesSelection(packageName: String): Map<@MapColumn("bundle") Int, List<@MapColumn(
"patch_name"
) String>>
@Transaction
suspend fun upsertApp(installedApp: InstalledApp, appliedPatches: List<AppliedPatch>) {
upsertApp(installedApp)
deleteAppliedPatches(installedApp.currentPackageName)
insertAppliedPatches(appliedPatches)
}
@Upsert
suspend fun upsertApp(installedApp: InstalledApp)
@Insert
suspend fun insertAppliedPatches(appliedPatches: List<AppliedPatch>)
@Query("DELETE FROM applied_patch WHERE package_name = :packageName")
suspend fun deleteAppliedPatches(packageName: String)
@Delete
suspend fun delete(installedApp: InstalledApp)
}

View File

@@ -0,0 +1,30 @@
package app.revanced.manager.data.room.bundles
import androidx.room.*
@Dao
interface PatchBundleDao {
@Query("SELECT * FROM patch_bundles")
suspend fun all(): List<PatchBundleEntity>
@Query("UPDATE patch_bundles SET version = :patches WHERE uid = :uid")
suspend fun updateVersionHash(uid: Int, patches: String?)
@Query("DELETE FROM patch_bundles WHERE uid != 0")
suspend fun purgeCustomBundles()
@Transaction
suspend fun reset() {
purgeCustomBundles()
updateVersionHash(0, null) // Reset the main source
}
@Query("DELETE FROM patch_bundles WHERE uid = :uid")
suspend fun remove(uid: Int)
@Query("SELECT name, version, auto_update, source FROM patch_bundles WHERE uid = :uid")
suspend fun getProps(uid: Int): PatchBundleProperties?
@Upsert
suspend fun upsert(source: PatchBundleEntity)
}

Some files were not shown because too many files have changed in this diff Show More