Compare commits

..

383 Commits

Author SHA1 Message Date
Pun Butrach
239b03584c fix: commas 2025-08-27 23:04:06 +07:00
Pun Butrach
1dcd3d8aa2 Merge branch 'compose-dev' into feat/tooltip
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2025-08-27 23:01:26 +07:00
Pun Butrach
9b53ffd7cf refactor: Remove redundant modifier parameter from Tooltip components 2025-08-27 22:52:29 +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
Pun Butrach
05afc6bd0c Apply suggestion from @Copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-11 16:18:05 +07:00
Pun Butrach
a2caffb089 fix: leftovers 2025-07-11 16:12:58 +07:00
Pun Butrach
71b0fd48ab Merge branch 'compose-dev' into feat/tooltip
# Conflicts:
#	app/src/main/java/app/revanced/manager/ui/component/ExceptionViewerDialog.kt
2025-07-11 16:07:30 +07:00
Pun Butrach
438fa485bd feat: Tooltip{component}.kt 2025-07-11 16:04:05 +07:00
oSumAtrIX
7148ee66f8 feat: Rename strings 2025-07-10 22:29:25 +02:00
Pun Butrach
1510aa58f2 chore: Merge branch 'compose-dev' into feat/tooltip 2025-07-09 21:01:08 +07: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
Pun Butrach
111c74329f feat: Enable tooltip for unobvious elements 2025-07-06 00:47:40 +07: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
Pun Butrach
aebad0b0e2 chore: Merge branch 'dev' into compose-dev 2025-05-31 14:26:25 +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
63 changed files with 1621 additions and 1653 deletions

View File

@@ -1,7 +1,3 @@
name: ⭐ Feature request
description: Create a detailed request for a new feature.
title: 'feat: '
labels: ['Feature request']
body:
- type: markdown
attributes:

View File

@@ -13,6 +13,8 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cache Gradle
uses: burrunan/gradle-cache-action@v1

View File

@@ -12,13 +12,14 @@ jobs:
name: Release
permissions:
contents: write
packages: 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
@@ -27,11 +28,10 @@ jobs:
java-version: '17'
- name: Cache Gradle
uses: burrunan/gradle-cache-action@v3
uses: burrunan/gradle-cache-action@v1
- name: Build
env:
GITHUB_ACTOR: ${{ github.actor }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./gradlew assembleRelease
@@ -55,26 +55,18 @@ jobs:
run: |
echo "${{ secrets.KEYSTORE }}" | base64 --decode > "app/keystore.jks"
- name: Release API
run: npx multi-semantic-release --tag-format 'api@${version}' --ignore-packages app
- name: Semantic Release
uses: cycjimmy/semantic-release-action@v4
id: semantic
env:
GITHUB_ACTOR: ${{ github.actor }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Release
id: release
run: |
echo "NEW_TAG=$(npx multi-semantic-release --tag-format 'v${version}' --ignore-packages api | tee | grep 'Created tag ' | sed -E 's/.*Created tag ([^ ]+).*/\1/')" >> $GITHUB_OUTPUT
env:
GITHUB_ACTOR: ${{ github.actor }}
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.release.outputs.NEW_TAG != ''
if: steps.semantic.outputs.new_release_published == 'true'
uses: actions/attest-build-provenance@v2
with:
subject-name: 'ReVanced Manager ${{ steps.release.outputs.NEW_TAG }}'
subject-name: 'ReVanced Manager ${{ steps.release.outputs.new_release_git_tag }}'
subject-path: app/build/outputs/apk/release/revanced-manager*.apk

View File

@@ -8,8 +8,7 @@
],
"plugins": [
[
"@semantic-release/commit-analyzer",
{
"@semantic-release/commit-analyzer", {
"releaseRules": [
{ "type": "build", "scope": "Needs bump", "release": "patch" }
]
@@ -23,7 +22,7 @@
{
"assets": [
"CHANGELOG.md",
"gradle.properties"
"gradle.properties",
],
"message": "chore: Release v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}
@@ -33,17 +32,17 @@
{
"assets": [
{
"path": "build/outputs/apk/release/revanced-manager*.apk?(.asc)"
}
"path": "app/build/outputs/apk/release/revanced-manager*.apk?(.asc)"
},
],
"successComment": false
successComment: false
}
],
[
"@saithodev/semantic-release-backmerge",
{
"backmergeBranches": [{"from": "main", "to": "dev"}],
"clearWorkspace": true
backmergeBranches: [{"from": "main", "to": "dev"}],
clearWorkspace: true
}
]
]

View File

@@ -1,8 +0,0 @@
{
"info": "This is verification file for ads.fund project",
"project": {
"name": "ReVanced Manager",
"walletAddress": "0x7ab4091e00363654bf84B34151225742cd92FCE5",
"tokenAddress": "0xadf954bc6f509b3a32fb5e97ed4ba6c000e37155"
}
}

View File

@@ -1,39 +0,0 @@
{
"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 API v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}
],
[
"@saithodev/semantic-release-backmerge",
{
"backmergeBranches": [{"from": "main", "to": "dev"}],
"clearWorkspace": true
}
]
]
}

View File

@@ -1,3 +1,5 @@
import java.io.IOException
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
@@ -17,6 +19,43 @@ dependencies {
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
@@ -108,4 +147,4 @@ publishing {
signing {
useGpgCmd()
sign(publishing.publications["Api"])
}
}

1
api/gradlew vendored
View File

@@ -1 +0,0 @@
../gradlew

View File

@@ -1,11 +0,0 @@
{
"name": "api",
"private": false,
"devDependencies": {
"@anolilab/multi-semantic-release": "^1.1.10",
"@saithodev/semantic-release-backmerge": "^4.0.1",
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"gradle-semantic-release-plugin": "^1.10.1"
}
}

View File

@@ -1,352 +0,0 @@
# app [1.26.0-dev.12](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.11...v1.26.0-dev.12) (2025-12-17)
### Features
* Improve trust plugin dialog design ([#2420](https://github.com/ReVanced/revanced-manager/issues/2420)) ([0300da9](https://github.com/ReVanced/revanced-manager/commit/0300da9eac6c0fc29dbbb66622c0d52f4cf68934))
# app [1.26.0-dev.11](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.10...v1.26.0-dev.11) (2025-10-25)
### Features
* Add pure black theme ([#2824](https://github.com/ReVanced/revanced-manager/issues/2824)) ([3d75ffe](https://github.com/ReVanced/revanced-manager/commit/3d75ffe6a7a39efdebe13dbd07c937c1de409ead))
# app [1.26.0-dev.10](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.9...v1.26.0-dev.10) (2025-10-06)
### Bug Fixes
* prevent back presses during installation ([2ff7072](https://github.com/ReVanced/revanced-manager/commit/2ff70728b490b92f212a82dcf599bc0c23f589e7))
# app [1.26.0-dev.9](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.8...v1.26.0-dev.9) (2025-10-06)
### Bug Fixes
* Instantly re-fetch patch bundle on pre-release preference update ([d5671db](https://github.com/ReVanced/revanced-manager/commit/d5671db3a77541c07bbbb4c3baca02f3ba0703f2)), closes [#2784](https://github.com/ReVanced/revanced-manager/issues/2784)
# app [1.26.0-dev.8](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.7...v1.26.0-dev.8) (2025-10-06)
### Bug Fixes
* Offcenter loading indicator in AppSelector ([12d92ba](https://github.com/ReVanced/revanced-manager/commit/12d92ba8110f5d1ac78aeecfa575444b5c53f561))
# app [1.26.0-dev.7](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.6...v1.26.0-dev.7) (2025-10-03)
### Bug Fixes
* Improve consistency between pre-release toggles ([e1b768c](https://github.com/ReVanced/revanced-manager/commit/e1b768c4679ecae8bff8007bdab56ff6544b12b6))
# app [1.26.0-dev.6](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.5...v1.26.0-dev.6) (2025-10-03)
### Bug Fixes
* Broken version comparison ([c327857](https://github.com/ReVanced/revanced-manager/commit/c3278578237dcddd9e7ab79ee80a02fdeef9604d))
### Features
* Open contributor's GitHub profile when clicked ([#2775](https://github.com/ReVanced/revanced-manager/issues/2775)) ([2571cb8](https://github.com/ReVanced/revanced-manager/commit/2571cb8c1108e9c1ed84950f17692c09d66e0556))
# app [1.26.0-dev.5](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.4...v1.26.0-dev.5) (2025-10-03)
### Features
* Toggle to use pre-release versions of ReVanced Patches ([08cec67](https://github.com/ReVanced/revanced-manager/commit/08cec674bbbe5297090ac5ee6039569975fbe9e7))
# app [1.26.0-dev.4](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.3...v1.26.0-dev.4) (2025-10-03)
### Bug Fixes
* add newlines to debug logs ([4753873](https://github.com/ReVanced/revanced-manager/commit/4753873866b575e2dcb160020df63f63862c8f33))
# app [1.26.0-dev.3](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.2...v1.26.0-dev.3) (2025-10-03)
### Features
* Toggle to use pre-release versions of ReVanced Manager ([#2773](https://github.com/ReVanced/revanced-manager/issues/2773)) ([d758964](https://github.com/ReVanced/revanced-manager/commit/d7589647426b3d3438161a2f0b59bf4f154ac34b))
# app [1.26.0-dev.2](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.1...v1.26.0-dev.2) (2025-10-03)
### Bug Fixes
* Migration of keystore, by fixing mislabeling of alias as cn ([#2769](https://github.com/ReVanced/revanced-manager/issues/2769)) ([aeab639](https://github.com/ReVanced/revanced-manager/commit/aeab639b2b09e8bbd2478cfbf5a518586405c0f7))
# app [1.26.0-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.25.1...v1.26.0-dev.1) (2025-10-02)
### Bug Fixes
* `ExtendedFloatingActionButton` not accessible by screen readers ([#2080](https://github.com/ReVanced/revanced-manager/issues/2080)) ([e4f19b0](https://github.com/ReVanced/revanced-manager/commit/e4f19b0c251e818cce59e11362a29dc8f657e065))
* add bounds checks in patch selector ([483be5d](https://github.com/ReVanced/revanced-manager/commit/483be5d722db2be2595f6f6dd0c537a6c8487daf))
* Add missing header for "Updates" settings ([#2642](https://github.com/ReVanced/revanced-manager/issues/2642)) ([d4d2056](https://github.com/ReVanced/revanced-manager/commit/d4d2056585ccd4a0456318448dc822c0f40c9c50))
* Allow different app version when downloading via plugin if setting is off ([#2579](https://github.com/ReVanced/revanced-manager/issues/2579)) ([59d233e](https://github.com/ReVanced/revanced-manager/commit/59d233e15c885104900c7d4129fb4839c4da81e0))
* always use default patch selection if customization is disabled ([cc77181](https://github.com/ReVanced/revanced-manager/commit/cc771817cba3dfd8f704cb7ecc9089ad7911c6ce))
* android icon not loading in app selector ([deea682](https://github.com/ReVanced/revanced-manager/commit/deea68265157da65ef98986d751e2551797522e0))
* automatically focus search views ([d23d673](https://github.com/ReVanced/revanced-manager/commit/d23d673c4703cdfa3be3a292873bbb37bea30ac7))
* available updates dialog list item color ([1a54313](https://github.com/ReVanced/revanced-manager/commit/1a54313c1dc4efbb8b274201a79e28661a7ecf64))
* Broken header padding in `AlertDialogExtended` when using an Icon ([8d939a6](https://github.com/ReVanced/revanced-manager/commit/8d939a6669909a44382fc7404276f2eeefcf728d))
* broken logo in about page on release builds ([ad775f3](https://github.com/ReVanced/revanced-manager/commit/ad775f3059345dd93ff2baf6d018c2beecc413df))
* buildfile syntax ([#66](https://github.com/ReVanced/revanced-manager/issues/66)) ([5c17a78](https://github.com/ReVanced/revanced-manager/commit/5c17a78e46db586642d53362267472fbbd47ae8c))
* bundles not loading on Android 14 ([56896d6](https://github.com/ReVanced/revanced-manager/commit/56896d6197baa836bcd4a499ea2cee487e3d07c8))
* Change the title in the Update screen from "Updates" to "Update" ([5f23769](https://github.com/ReVanced/revanced-manager/commit/5f2376919bd036987eba8188e3a1a2ff53ef6793)), closes [#1960](https://github.com/ReVanced/revanced-manager/issues/1960)
* cleanup advanced settings screen ([02ea5c6](https://github.com/ReVanced/revanced-manager/commit/02ea5c6d4a2e6baa7c034b614deb6e4232cf6d0b))
* **Compose:** Adjusted universal patches safeguard and warnings ([#2550](https://github.com/ReVanced/revanced-manager/issues/2550)) ([663cf2d](https://github.com/ReVanced/revanced-manager/commit/663cf2d6b86c276c6bb236af8e05a4f69df9eba0))
* contributors screen fix ([#1256](https://github.com/ReVanced/revanced-manager/issues/1256)) ([dc73462](https://github.com/ReVanced/revanced-manager/commit/dc73462ac41bd5f1813358eb5e2265a3e2e7c0f9))
* contributors screen repository name ([426b289](https://github.com/ReVanced/revanced-manager/commit/426b28932fe37a6d7412685819ffc8e26b69d31c))
* Correct preference description ([#2619](https://github.com/ReVanced/revanced-manager/issues/2619)) ([0096169](https://github.com/ReVanced/revanced-manager/commit/0096169af8f9e2db6c22b8e88f0dfe1cab1260be))
* Correctly display universal patches warning ([#2570](https://github.com/ReVanced/revanced-manager/issues/2570)) ([24c4cd3](https://github.com/ReVanced/revanced-manager/commit/24c4cd3f991953dd00b5bf5e7c3ec965315a9528))
* correctly patch apk files ([c5cb18a](https://github.com/ReVanced/revanced-manager/commit/c5cb18a7eab838ea096577780335a29b9771b43d))
* crash caused by compose inlining bug ([05fe058](https://github.com/ReVanced/revanced-manager/commit/05fe0581516a373cc26dd559d3fc7f21fcf16f3f))
* crash when removing used bundles ([189c993](https://github.com/ReVanced/revanced-manager/commit/189c993ada6406db6f8c48c4051c5bd9fac98e2b))
* delete temporary files ([#1341](https://github.com/ReVanced/revanced-manager/issues/1341)) ([b03f7b1](https://github.com/ReVanced/revanced-manager/commit/b03f7b18a029465142d08fe1ed68e92c81586a5f))
* disable `WebView` history ([#1278](https://github.com/ReVanced/revanced-manager/issues/1278)) ([a811df9](https://github.com/ReVanced/revanced-manager/commit/a811df9547da33fc61397cb33ba5fd35ee470ff9))
* display version from manifest ([#2634](https://github.com/ReVanced/revanced-manager/issues/2634)) ([1fb94b7](https://github.com/ReVanced/revanced-manager/commit/1fb94b711fdbbbca7d9baaa90c53faf208fc4d0d))
* Do not poll battery optimization status ([#2491](https://github.com/ReVanced/revanced-manager/issues/2491)) ([26778f5](https://github.com/ReVanced/revanced-manager/commit/26778f57e6dd185d9aed1086aa03659a2e91d1a9))
* don't store app list in parcel ([e7802ed](https://github.com/ReVanced/revanced-manager/commit/e7802ed3d714cbe6e29409d27989c65d4d7ce6a5))
* dont crash when the bundle cannot be downloaded ([4d201f1](https://github.com/ReVanced/revanced-manager/commit/4d201f17f2ce01aad6adb456a49c3f03526c5ad3))
* **downloader:** versions not loading correctly ([16c4290](https://github.com/ReVanced/revanced-manager/commit/16c4290f05d94cbe53e68cb98307d7be1bfce7af))
* handle edge-to-edge properly in fullscreen dialogs ([eba92e2](https://github.com/ReVanced/revanced-manager/commit/eba92e2644663b10e7e17f2cf955afefe260d769))
* handle exceptions when checking for bundle updates ([1dd6738](https://github.com/ReVanced/revanced-manager/commit/1dd673896454710094e83789abb585c106ee6bcb))
* Handle open source licenses page crash ([#2569](https://github.com/ReVanced/revanced-manager/issues/2569)) ([f2ea007](https://github.com/ReVanced/revanced-manager/commit/f2ea00757a76ed8758bc0d4df54843c89483c986))
* hide patch button ([#1284](https://github.com/ReVanced/revanced-manager/issues/1284)) ([dadc546](https://github.com/ReVanced/revanced-manager/commit/dadc5462e352e91cf971395def91d693677701bc))
* Ignore long click when already in delete mode ([6f6296b](https://github.com/ReVanced/revanced-manager/commit/6f6296b8cde56d5fc73e00ef671ca7ab431455f4)), closes [#2503](https://github.com/ReVanced/revanced-manager/issues/2503)
* import bundles on another thread ([0383bd7](https://github.com/ReVanced/revanced-manager/commit/0383bd74f73a3523d539c44cdf38b0e857c16bdc))
* import export screen UX ([69c119d](https://github.com/ReVanced/revanced-manager/commit/69c119d545ac811c605124173e5cbc97a9064c79))
* Improve background running notification ([#2614](https://github.com/ReVanced/revanced-manager/issues/2614)) ([05444d8](https://github.com/ReVanced/revanced-manager/commit/05444d8824a429c7e554d0597f8997e670936a63))
* improve bundle page strings ([2a63a61](https://github.com/ReVanced/revanced-manager/commit/2a63a6163a8d2e6ee649cb22099b426ed605de8f))
* improve keystore import error handling and show toast ([cd142a7](https://github.com/ReVanced/revanced-manager/commit/cd142a70d3f210161d3c1f20d2cb82a70432469f))
* Inconsistent padding for battery optimisation warning ([6c3a99a](https://github.com/ReVanced/revanced-manager/commit/6c3a99a4921ab4438a038ad4c4bccd0326fdd565))
* **installer:** make the correct column scrollable ([64496bf](https://github.com/ReVanced/revanced-manager/commit/64496bfbe77a9a44f5535fd5f12eee803ac7c26a))
* **installer:** progress tracking ([f547bb7](https://github.com/ReVanced/revanced-manager/commit/f547bb7ab1b7149d7290729527714168a2561b23))
* **installer:** properly track worker state ([#32](https://github.com/ReVanced/revanced-manager/issues/32)) ([de1ef23](https://github.com/ReVanced/revanced-manager/commit/de1ef23824227796c8583242e624f83d9dae5af3))
* **installer:** save step incorrectly being marked as completed ([0264308](https://github.com/ReVanced/revanced-manager/commit/0264308b6dad051db80da6f130e8d28d86b38f04))
* **installer:** sign and install on threads ([3d59ee5](https://github.com/ReVanced/revanced-manager/commit/3d59ee51acc5a6ebb17f68c0462d17d7ecb0f07c))
* jvm signature clash error ([ee0f342](https://github.com/ReVanced/revanced-manager/commit/ee0f34245636027d55bd5bdfce4d6a5e6c3b3dcd))
* library info not being embedded ([8c9fe69](https://github.com/ReVanced/revanced-manager/commit/8c9fe6989fc6d05afd53baa877f1e6dffc067b50))
* load patch bundles earlier ([a2f9e2f](https://github.com/ReVanced/revanced-manager/commit/a2f9e2f1da961a13b2b20e2812593031c9339b88))
* Match "Installation incompatible" dialog message with Flutter Manager ([#2231](https://github.com/ReVanced/revanced-manager/issues/2231)) ([fedaedf](https://github.com/ReVanced/revanced-manager/commit/fedaedfda112260144b0b9b0776509ddb3438046))
* minify crash on building release ([#1245](https://github.com/ReVanced/revanced-manager/issues/1245)) ([6561e4c](https://github.com/ReVanced/revanced-manager/commit/6561e4c97c19134b22b72e19fad3884f99327b9a))
* more android 34 fixes ([7fb1e27](https://github.com/ReVanced/revanced-manager/commit/7fb1e27617b69803b3d4463993b2290877502545))
* move battery warning to dashboard ([3a05150](https://github.com/ReVanced/revanced-manager/commit/3a05150fa33f119ecdf436f8508862ef81c327a0))
* Move temporary files outside of the cache directory ([#2122](https://github.com/ReVanced/revanced-manager/issues/2122)) ([b93ecc0](https://github.com/ReVanced/revanced-manager/commit/b93ecc0db20339393e1296c44ce4b1dbd837b577))
* Offset badge ([c73fdfd](https://github.com/ReVanced/revanced-manager/commit/c73fdfdd2d3a1b8552d9c26df575b3019346596d))
* only perform haptics on events ([e55566d](https://github.com/ReVanced/revanced-manager/commit/e55566d3df25480260922f0418b4bbee5d7b7a07))
* option state crash ([#1456](https://github.com/ReVanced/revanced-manager/issues/1456)) ([f183b6d](https://github.com/ReVanced/revanced-manager/commit/f183b6d8a6b139fe3e84d5ea3a9658ef900453bc))
* parcel error for nullable types ([336eed3](https://github.com/ReVanced/revanced-manager/commit/336eed3a95111ebbe456321f5986e6875ded354e))
* pass worker inputs without serialization ([#44](https://github.com/ReVanced/revanced-manager/issues/44)) ([059a72b](https://github.com/ReVanced/revanced-manager/commit/059a72b9dd9103d2b3704daa7dbb13ad83971460))
* patch count remaining at zero when using process runtime ([#2542](https://github.com/ReVanced/revanced-manager/issues/2542)) ([f5e1e0b](https://github.com/ReVanced/revanced-manager/commit/f5e1e0b0659e5775dd460b8dfc15427eb0175139))
* patch options reset button being broken ([e1647fd](https://github.com/ReVanced/revanced-manager/commit/e1647fdef0c9f68e171a2d15e2b6e744da6bbaf5))
* Patch process cancelation dialog conditions ([#2554](https://github.com/ReVanced/revanced-manager/issues/2554)) ([e97b19d](https://github.com/ReVanced/revanced-manager/commit/e97b19d2b65dbfc49ed062b123c363e412b9bf8e))
* Patch selection screen padding ([#2533](https://github.com/ReVanced/revanced-manager/issues/2533)) ([cd2dbcc](https://github.com/ReVanced/revanced-manager/commit/cd2dbcc841e56dac99230ea6501af87c43e9c572))
* **patcher:** add notification and wakelock to worker; chore: add app icon ([8b6d32d](https://github.com/ReVanced/revanced-manager/commit/8b6d32dd7b3ca4c694414a55a1b6202b62636530))
* patches not being reloaded ([dccf861](https://github.com/ReVanced/revanced-manager/commit/dccf86163af34341e3e451df9f24356c7294ae1e))
* **patches selector:** copy the selected patches list ([70e49aa](https://github.com/ReVanced/revanced-manager/commit/70e49aaaa3a42510cb9ced2209c90cd1da98391d))
* perform selected app operations in the correct order ([34cf848](https://github.com/ReVanced/revanced-manager/commit/34cf848baaaa2504d162c515a95240d45bd7092a))
* permission error when using installed app ([8767f0e](https://github.com/ReVanced/revanced-manager/commit/8767f0e99c6de5bbb0a690ced40f6e9a486f0828))
* Playback Switch's Haptic Feedback ([#2639](https://github.com/ReVanced/revanced-manager/issues/2639)) ([9fdca5a](https://github.com/ReVanced/revanced-manager/commit/9fdca5a0afd6be8a24e2ec09eec0000b0b9cd179))
* process death resilience and account for android 11 bug ([#2355](https://github.com/ReVanced/revanced-manager/issues/2355)) ([83eeeae](https://github.com/ReVanced/revanced-manager/commit/83eeeae801827800a0787e9e753c72d2a24d7970))
* progress bar not updating ([dcaa38c](https://github.com/ReVanced/revanced-manager/commit/dcaa38c8824f54da7a833c354b247f309d1c9871))
* release builds not working properly ([6f6476e](https://github.com/ReVanced/revanced-manager/commit/6f6476e85158cad4e2497e9f72b73c4dc948f0bc))
* remove battery optimization notification if user grants the permission ([9863c51](https://github.com/ReVanced/revanced-manager/commit/9863c5161a1bc16941a323e654f80f8cb0122f9f))
* remove the unique constraint for patch bundle names ([ea29d0f](https://github.com/ReVanced/revanced-manager/commit/ea29d0f00c3b3b2c137c4849e6c445a6bf9a180f))
* Remove unnecessary screen padding ([8419f75](https://github.com/ReVanced/revanced-manager/commit/8419f75d597dd198aa1029fae2109646c5874078)), closes [#2062](https://github.com/ReVanced/revanced-manager/issues/2062)
* remove unused function preventing compilation ([2297e94](https://github.com/ReVanced/revanced-manager/commit/2297e94cb81a9a22ea032d8e247769774ca85087))
* Reset cached theme on theme change to avoid broken colors ([#2527](https://github.com/ReVanced/revanced-manager/issues/2527)) ([9a82b78](https://github.com/ReVanced/revanced-manager/commit/9a82b785280954973cafc5e6dccb3c90fdb5ef49))
* run blocking IO operations in the correct context ([969ddb7](https://github.com/ReVanced/revanced-manager/commit/969ddb7bef321d7aa2a682b8128b1f755f35c28b))
* run props flow on correct dispatcher ([#2035](https://github.com/ReVanced/revanced-manager/issues/2035)) ([d3d4c27](https://github.com/ReVanced/revanced-manager/commit/d3d4c27f6d7affceef233a0138ee6c985c7f56bc))
* Screen turns off while patching due to wrong WakeLock ([#2147](https://github.com/ReVanced/revanced-manager/issues/2147)) ([4de5340](https://github.com/ReVanced/revanced-manager/commit/4de534094adc0665021d3ba129a648d896718568))
* scrolling in patch selector ([154f036](https://github.com/ReVanced/revanced-manager/commit/154f036fe956096bca983fe9d6654ccca38fd8ac))
* Selected patch count ([#2559](https://github.com/ReVanced/revanced-manager/issues/2559)) ([a91ff60](https://github.com/ReVanced/revanced-manager/commit/a91ff60533b44629ea60e8cd6acceeb80b0253b7))
* serialization not working ([4d04ae0](https://github.com/ReVanced/revanced-manager/commit/4d04ae088c406d84936120cb753cd1f11fb8a8c2))
* show available and selected patches in patch selector screen ([61f1ee0](https://github.com/ReVanced/revanced-manager/commit/61f1ee0627d6cbb6b9a4d226eb6c2f9e0b8c6453))
* show install button when installation has been cancelled ([93f4a5b](https://github.com/ReVanced/revanced-manager/commit/93f4a5bb7c912ca77bb04e414432922c89d3e2c0))
* Show selection warning also on patch option ([#2643](https://github.com/ReVanced/revanced-manager/issues/2643)) ([3b82767](https://github.com/ReVanced/revanced-manager/commit/3b82767a897eeca1dda1d8343f1db4207050e960))
* sources screen being misaligned during transitions ([2ac3d5c](https://github.com/ReVanced/revanced-manager/commit/2ac3d5c483d5cc4776681ed3f900550a4e45f616))
* specify `multithreadingDexFileWriter` in `PatcherOptions` ([#1402](https://github.com/ReVanced/revanced-manager/issues/1402)) ([3f362b6](https://github.com/ReVanced/revanced-manager/commit/3f362b605fbce3ea72e7c95b7e0bc614443c7d44))
* Support patching on ARMv7 by updating AAPT2 ([#2084](https://github.com/ReVanced/revanced-manager/issues/2084)) ([15b47f9](https://github.com/ReVanced/revanced-manager/commit/15b47f9bb6cd6bb0360fda6ac641cd4c75542287))
* Transparent status on fullscreen dialog ([#2654](https://github.com/ReVanced/revanced-manager/issues/2654)) ([a8820a4](https://github.com/ReVanced/revanced-manager/commit/a8820a4daf71704f6945b8f794495fe8a8d7589e))
* Turn off filters by default ([#2079](https://github.com/ReVanced/revanced-manager/issues/2079)) ([44f8b1f](https://github.com/ReVanced/revanced-manager/commit/44f8b1fb6bffed5866ada356910119465320a9a8))
* typo in string name `import_keystore_description` ([#1273](https://github.com/ReVanced/revanced-manager/issues/1273)) ([933e69e](https://github.com/ReVanced/revanced-manager/commit/933e69e21e97fede2183a26dd1645a6eb96c4509))
* **ui:** make entire patches view button selectable ([#1271](https://github.com/ReVanced/revanced-manager/issues/1271)) ([83cdaae](https://github.com/ReVanced/revanced-manager/commit/83cdaaee183ff1b6d905977df38fe4e47f7d5973))
* Updates popup shows incorrect names ([#1283](https://github.com/ReVanced/revanced-manager/issues/1283)) ([c879faf](https://github.com/ReVanced/revanced-manager/commit/c879faf2eb338476c6abd9f104922b0d49f95cd6))
* Use `compatible` rather than `support` when referring to patch compatibility ([#2422](https://github.com/ReVanced/revanced-manager/issues/2422)) ([8b3c4eb](https://github.com/ReVanced/revanced-manager/commit/8b3c4eb91c491a0971e2ccf7d46012437eca5c25))
* use correct `getViewModel` ([5b6ae80](https://github.com/ReVanced/revanced-manager/commit/5b6ae800fdfc93ef5058b21b3e48daac2a4e1358))
* use correct classes to determine option type ([e833bf4](https://github.com/ReVanced/revanced-manager/commit/e833bf4ad14811bb6880ae2d97055e4ce0de222f))
* use correct directory ([9e1ebb3](https://github.com/ReVanced/revanced-manager/commit/9e1ebb390244dcb9af03a9164a32386481ec5691))
* Use FAB instead of ListItem to patch in App Overview ([6ace71b](https://github.com/ReVanced/revanced-manager/commit/6ace71b739302466274ce9b46f5f7dd6ab9da05d)), closes [#1995](https://github.com/ReVanced/revanced-manager/issues/1995)
* use proper update icon ([b59a161](https://github.com/ReVanced/revanced-manager/commit/b59a16191a61c64275137c4a6145fd30d68aa480))
* use ReVanced ring logo in about section ([#1302](https://github.com/ReVanced/revanced-manager/issues/1302)) ([933a4a3](https://github.com/ReVanced/revanced-manager/commit/933a4a32203425e745e05615217a8d0975c2e959))
* Use the correct icon in API URL dialog ([c22e5b4](https://github.com/ReVanced/revanced-manager/commit/c22e5b4051515e0f02828a2b30f6af19b48ba55f)), closes [#1972](https://github.com/ReVanced/revanced-manager/issues/1972)
* use upsert when modifying installed apps ([90edf1d](https://github.com/ReVanced/revanced-manager/commit/90edf1ddd0de29b299855810402a31828d989d04))
* **VersionSelector:** use correct LazyColumn item key ([413fe98](https://github.com/ReVanced/revanced-manager/commit/413fe980a8c0b45e3924c98b2fbd1a3e9b579528))
### Features
* **about screen:** complete about screen ([1d6b34a](https://github.com/ReVanced/revanced-manager/commit/1d6b34a39f76e8e733649f7fcfeb20eb1009a39a))
* Add `isScrollingUp` support for ScrollState ([bf049c3](https://github.com/ReVanced/revanced-manager/commit/bf049c3c1ac12a60c5c6226b5c3fec7f72caa7db))
* add ability to share debug logs ([feb0ca4](https://github.com/ReVanced/revanced-manager/commit/feb0ca4cf315e5d332f36039fbb989b3cfb9cf58))
* add checkboxes to the downloaded apps page ([ca93524](https://github.com/ReVanced/revanced-manager/commit/ca93524be0b37f38b860d8512c81d2898b2860af))
* Add confirm dialogs when toggling dangerous settings ([#2072](https://github.com/ReVanced/revanced-manager/issues/2072)) ([6643276](https://github.com/ReVanced/revanced-manager/commit/66432764cfe8192f4cf8e599a592f27c675f25ec))
* Add confirmation dialog to "Reset" options ([#2576](https://github.com/ReVanced/revanced-manager/issues/2576)) ([f32ffbb](https://github.com/ReVanced/revanced-manager/commit/f32ffbb6f2224f886af14205721fb2372f396de2))
* Add downloader plugin system ([#2041](https://github.com/ReVanced/revanced-manager/issues/2041)) ([ca38737](https://github.com/ReVanced/revanced-manager/commit/ca3873778307612b93af3273ffe4821c6a5e398d))
* add external process runtime ([#1799](https://github.com/ReVanced/revanced-manager/issues/1799)) ([0d73e0c](https://github.com/ReVanced/revanced-manager/commit/0d73e0cd32b6af3526c226ce4695c7e905f65b15))
* Add haptic feedback ([#1457](https://github.com/ReVanced/revanced-manager/issues/1457)) ([76e0c95](https://github.com/ReVanced/revanced-manager/commit/76e0c9518746620cd2723a99c310f92f5b3fd996))
* Add installer status dialog ([#1473](https://github.com/ReVanced/revanced-manager/issues/1473)) ([43b3743](https://github.com/ReVanced/revanced-manager/commit/43b37432138d7cd8a507efad80827d6f3bdcdf08))
* add network checks for features that require it ([f3f8bc4](https://github.com/ReVanced/revanced-manager/commit/f3f8bc4ec2f593ade91324d78f9ce83f60ef65cc))
* add patch bundle info screen ([#55](https://github.com/ReVanced/revanced-manager/issues/55)) ([8ae4e85](https://github.com/ReVanced/revanced-manager/commit/8ae4e850dae9cf4df14afe90048ca0b0a48389ac))
* add patches selector bottom sheet ([#1360](https://github.com/ReVanced/revanced-manager/issues/1360)) ([f6fb534](https://github.com/ReVanced/revanced-manager/commit/f6fb534e04777b4f0ec2ff2b13768c724c68c028))
* add required options screen ([#2378](https://github.com/ReVanced/revanced-manager/issues/2378)) ([3a63e42](https://github.com/ReVanced/revanced-manager/commit/3a63e42df9ce50069a573d98cf44a8abec03b639))
* Add reset button to custom API ([#2076](https://github.com/ReVanced/revanced-manager/issues/2076)) ([df52a7b](https://github.com/ReVanced/revanced-manager/commit/df52a7bdef05e1c9f034ae067c3dd183fb8fdffd)), closes [#2051](https://github.com/ReVanced/revanced-manager/issues/2051)
* Add sensitivity to `isScrollingUp` ([f6ca4e9](https://github.com/ReVanced/revanced-manager/commit/f6ca4e95551193c8d21afd09872d9bbe6c80c0e8))
* add social links ([#1294](https://github.com/ReVanced/revanced-manager/issues/1294)) ([7df3350](https://github.com/ReVanced/revanced-manager/commit/7df3350acb4aae957e2a7c0d2f30faf6cae6ab85))
* add toast feedback to the bundle update button ([ea50e65](https://github.com/ReVanced/revanced-manager/commit/ea50e65ab1d626152bdd40c1893cd408b7271472))
* add user agent ([#1382](https://github.com/ReVanced/revanced-manager/issues/1382)) ([3aea6cb](https://github.com/ReVanced/revanced-manager/commit/3aea6cbaecc9db103e9a3925b3c4a531de6c5f0e))
* advanced settings page with device info ([#51](https://github.com/ReVanced/revanced-manager/issues/51)) ([86e4244](https://github.com/ReVanced/revanced-manager/commit/86e42449eb553417726b95f79f6edd7f526f6d44))
* allow bundles to use classes from other bundles ([#1951](https://github.com/ReVanced/revanced-manager/issues/1951)) ([af8e2b4](https://github.com/ReVanced/revanced-manager/commit/af8e2b44c027d978046a0e7926f1425f0348b098))
* allow user to save logs ([a008cf5](https://github.com/ReVanced/revanced-manager/commit/a008cf5dd143fafb1f642cd037db29393716f7d5))
* animate the arrow button ([db070b1](https://github.com/ReVanced/revanced-manager/commit/db070b125bf08ff251450259045755e6469c2d5e))
* app downloader ([#43](https://github.com/ReVanced/revanced-manager/issues/43)) ([1f1a480](https://github.com/ReVanced/revanced-manager/commit/1f1a480d51edb310934523024c52e0c19b066662))
* app selector screen ([373cc4b](https://github.com/ReVanced/revanced-manager/commit/373cc4bbb1a8194bf9475d0a13e1c154cd87480b))
* **app-selector:** show patchable installed apps first ([#1496](https://github.com/ReVanced/revanced-manager/issues/1496)) ([afb0f80](https://github.com/ReVanced/revanced-manager/commit/afb0f80de5a73c213f77bfde761ea1ea0886abef))
* armv7 warning ([2ffcaec](https://github.com/ReVanced/revanced-manager/commit/2ffcaec724d5a13b816e04813d45cde75681eb69))
* Automatic language detection ([#2032](https://github.com/ReVanced/revanced-manager/issues/2032)) ([36a1c3f](https://github.com/ReVanced/revanced-manager/commit/36a1c3f36807500fbe820bf4142fef159b138c7d))
* backend ([45a54d1](https://github.com/ReVanced/revanced-manager/commit/45a54d1608a77547e06748867d63a452224727b6))
* better installer ui ([#29](https://github.com/ReVanced/revanced-manager/issues/29)) ([14888f9](https://github.com/ReVanced/revanced-manager/commit/14888f9da71ecf1c50d770123d1e8dd09aa6c8b1))
* **bundles tab:** add BackHandler ([a9171e1](https://github.com/ReVanced/revanced-manager/commit/a9171e17bd628601f1e074a7fcdf74c15cb73709))
* Change "Update" to "Show" in Update Available notification ([5c43413](https://github.com/ReVanced/revanced-manager/commit/5c434137d332aabaaca236b6f9616d7727d0b3d2)), closes [#1959](https://github.com/ReVanced/revanced-manager/issues/1959)
* change appID and name of debug builds ([5b3e9e5](https://github.com/ReVanced/revanced-manager/commit/5b3e9e595cded277c051cc669d9f29bcb6ce5d18))
* **Changelogs:** overall improvement ([#1429](https://github.com/ReVanced/revanced-manager/issues/1429)) ([2a3590d](https://github.com/ReVanced/revanced-manager/commit/2a3590ddd2cc74b746a3f632a93970bfa23cf384))
* check for updates on startup ([#1462](https://github.com/ReVanced/revanced-manager/issues/1462)) ([bb2164e](https://github.com/ReVanced/revanced-manager/commit/bb2164e1a95a698b1b0f69e725af5e0e1e45b868))
* check if the version being used is the recommended version ([#1675](https://github.com/ReVanced/revanced-manager/issues/1675)) ([9d961f6](https://github.com/ReVanced/revanced-manager/commit/9d961f6a52d15ed6116afc78c7008460347da69a))
* Collapse ExtendedFAB on scroll ([#1630](https://github.com/ReVanced/revanced-manager/issues/1630)) ([b5c1f6d](https://github.com/ReVanced/revanced-manager/commit/b5c1f6d732b65c1c9becb7962c51a70a840dea73))
* **Compose:** Add confirmation dialog on multiple operations ([#2529](https://github.com/ReVanced/revanced-manager/issues/2529)) ([2671e68](https://github.com/ReVanced/revanced-manager/commit/2671e68004269deebdedaee38a6692b2302ca732))
* **Compose:** hide developer settings ([#2551](https://github.com/ReVanced/revanced-manager/issues/2551)) ([0030c7a](https://github.com/ReVanced/revanced-manager/commit/0030c7a7885feee0578ee1423ee2aefc6a0e2c2c))
* **Compose:** Improve patches selector tab by adding the bundle version ([#2545](https://github.com/ReVanced/revanced-manager/issues/2545)) ([3710675](https://github.com/ReVanced/revanced-manager/commit/3710675ac0ca77cecfb172b4cf148f41a762bf06))
* **Compose:** Move developer options to top level ([#2528](https://github.com/ReVanced/revanced-manager/issues/2528)) ([cedc6ad](https://github.com/ReVanced/revanced-manager/commit/cedc6ad49f23d778a52a8846f9e384fd2106e074))
* contributors screen ([#42](https://github.com/ReVanced/revanced-manager/issues/42)) ([3f54381](https://github.com/ReVanced/revanced-manager/commit/3f54381d307fd71296be18e97a1ab870f1cdc297))
* **Contributors Screen:** implement design from Figma ([#1465](https://github.com/ReVanced/revanced-manager/issues/1465)) ([d5bdc29](https://github.com/ReVanced/revanced-manager/commit/d5bdc293f308e2a283d744afdc1aed6a165f7166))
* Dashboard Screen ([#18](https://github.com/ReVanced/revanced-manager/issues/18)) ([a127b95](https://github.com/ReVanced/revanced-manager/commit/a127b959ead5a9c83a0c4f7e7840aeeb68362c0d))
* disable filter chips when there are no patches ([fd520bb](https://github.com/ReVanced/revanced-manager/commit/fd520bba700bae9d8eae745ce23a95b07b7f7d34))
* dont ask for root on launch ([9562d80](https://github.com/ReVanced/revanced-manager/commit/9562d80bfdc785fe5ed512a15cfd7c0e09091acc))
* download apps in patcher screen ([#73](https://github.com/ReVanced/revanced-manager/issues/73)) ([a854221](https://github.com/ReVanced/revanced-manager/commit/a854221969c363712a0b3de84607092709db291f))
* experimental patches setting ([b07fd23](https://github.com/ReVanced/revanced-manager/commit/b07fd2321dd0aecce556f341e2b18f930baa58fd))
* filter options for patches ([62bccd1](https://github.com/ReVanced/revanced-manager/commit/62bccd150441747e5cd6de71de304e416922bdda))
* finish implementing the sources system ([#70](https://github.com/ReVanced/revanced-manager/issues/70)) ([858b0ec](https://github.com/ReVanced/revanced-manager/commit/858b0ec5b456043fa61b681bbbd195fd9c30a6f0))
* get bundle information from jar manifest ([#2027](https://github.com/ReVanced/revanced-manager/issues/2027)) ([60fdec9](https://github.com/ReVanced/revanced-manager/commit/60fdec9804c763ef9308a7a56d245401dbd35d7c))
* hide tabs when 1 bundle is used ([41268ca](https://github.com/ReVanced/revanced-manager/commit/41268ca80b71f68dbf9523fa7bac34feeec7d011))
* hide unfinished pages in release mode ([c199801](https://github.com/ReVanced/revanced-manager/commit/c199801fb7f91306538391177d240cf1121964d2))
* Highlight links in Markdown ([7bf8988](https://github.com/ReVanced/revanced-manager/commit/7bf89887e420a402b30da4796ba3648147f00394)), closes [#1962](https://github.com/ReVanced/revanced-manager/issues/1962)
* implement DI ([7fa7b9d](https://github.com/ReVanced/revanced-manager/commit/7fa7b9d53a3217c7e1e4c70a524fd68ae170c832))
* implement more patch option types ([#2015](https://github.com/ReVanced/revanced-manager/issues/2015)) ([b18c678](https://github.com/ReVanced/revanced-manager/commit/b18c6783547e910fa2dbd3d7edcc5fe329e6d921))
* implement navigation ([7fc6ec5](https://github.com/ReVanced/revanced-manager/commit/7fc6ec5c2cf8eb9ebfc3dda01cdfd80962be1f8f))
* implement Submit Issue button ([#1276](https://github.com/ReVanced/revanced-manager/issues/1276)) ([a269a39](https://github.com/ReVanced/revanced-manager/commit/a269a39aa4a34b94aef4e1e85126c571e96be575))
* improve accessibility ([#64](https://github.com/ReVanced/revanced-manager/issues/64)) ([39b08e5](https://github.com/ReVanced/revanced-manager/commit/39b08e5201d2cec6bdb67f9386120a7a40c9ccc6))
* Improve APK file name formatting on save ([#2421](https://github.com/ReVanced/revanced-manager/issues/2421)) ([a53a8ba](https://github.com/ReVanced/revanced-manager/commit/a53a8ba62734daf9bd80ab79265241a4a22f489c))
* improve bundle dialog UI ([409c888](https://github.com/ReVanced/revanced-manager/commit/409c888d523f398505daaaff9d2490dc5a863680))
* Improve bundle info screen design ([#2548](https://github.com/ReVanced/revanced-manager/issues/2548)) ([55524f7](https://github.com/ReVanced/revanced-manager/commit/55524f7284a44bbf8e8c782eedd7fc06d54944cf))
* Improve custom API URL dialog ([#2033](https://github.com/ReVanced/revanced-manager/issues/2033)) ([7dae562](https://github.com/ReVanced/revanced-manager/commit/7dae56281994942577bac7bf50c59e805672d0e1))
* Improve device information in debugging section ([d889677](https://github.com/ReVanced/revanced-manager/commit/d889677b29aeb4a49a025da98060265e88876ddf)), closes [#1977](https://github.com/ReVanced/revanced-manager/issues/1977)
* Improve initial update popup wording ([5901372](https://github.com/ReVanced/revanced-manager/commit/5901372523643eef5a605256662c8e1f0a9f2263)), closes [#1956](https://github.com/ReVanced/revanced-manager/issues/1956)
* improve keystore UI and UX ([#52](https://github.com/ReVanced/revanced-manager/issues/52)) ([49b4bbb](https://github.com/ReVanced/revanced-manager/commit/49b4bbbf0ba84b006a1694ca95662cf224a84b0f))
* Improve patch bundle screen ([#2070](https://github.com/ReVanced/revanced-manager/issues/2070)) ([a907528](https://github.com/ReVanced/revanced-manager/commit/a907528a2096d8de9778efa8f85e0cdc1d7c2b80))
* improve patcher screen labels ([f4d6c60](https://github.com/ReVanced/revanced-manager/commit/f4d6c60b9ec4c76e8e3fa233f79e062b802860e5))
* improve patcher UI ([#1494](https://github.com/ReVanced/revanced-manager/issues/1494)) ([429b428](https://github.com/ReVanced/revanced-manager/commit/429b428f673dd949289baaf27ed2e08970db83ae))
* Improve Settings order ([#2060](https://github.com/ReVanced/revanced-manager/issues/2060)) ([fa86c1a](https://github.com/ReVanced/revanced-manager/commit/fa86c1a0bb039a86e0649eae30c7b33620f98dbe))
* improve the safeguards ([#2038](https://github.com/ReVanced/revanced-manager/issues/2038)) ([e5b414e](https://github.com/ReVanced/revanced-manager/commit/e5b414e277341967c7b5a5f071ddac1fdfdb8e63))
* Improve unsupported patch warnings ([#2066](https://github.com/ReVanced/revanced-manager/issues/2066)) ([3c23d57](https://github.com/ReVanced/revanced-manager/commit/3c23d573bf3998304cad4485016004a871cf1636)), closes [#2052](https://github.com/ReVanced/revanced-manager/issues/2052)
* Improve update screen design ([#2487](https://github.com/ReVanced/revanced-manager/issues/2487)) ([7007010](https://github.com/ReVanced/revanced-manager/commit/7007010f14239452e565736fe7cee7666a682ffb))
* Improve update setting tile titles ([e2623d6](https://github.com/ReVanced/revanced-manager/commit/e2623d6d79b3b87e9ba29016e42f1d645b2f9e19)), closes [#1968](https://github.com/ReVanced/revanced-manager/issues/1968)
* improve UX for failed or missing bundles ([49f8510](https://github.com/ReVanced/revanced-manager/commit/49f851022db72b110c8597aa1c711461c1b01882))
* improved compose stability ([8c40119](https://github.com/ReVanced/revanced-manager/commit/8c40119609c650d1f012d810a4117e84fbe2da52))
* improved dashboard screen ([5c2f9d9](https://github.com/ReVanced/revanced-manager/commit/5c2f9d91a6e803d9b3705e2b3aa84176353ba963))
* in-app updater ([#25](https://github.com/ReVanced/revanced-manager/issues/25)) ([d71a4bf](https://github.com/ReVanced/revanced-manager/commit/d71a4bf3c3457a02578bb8ad3c7615b074f6e3f1))
* **installer:** adjust arrow icon size ([e997255](https://github.com/ReVanced/revanced-manager/commit/e997255cf3c3c5ba777da07752217f99e01dd789))
* **installer:** adjust step icon size and alignment ([cfcabf6](https://github.com/ReVanced/revanced-manager/commit/cfcabf6ef1c212f2627d5d02f4d59981bdc276ca))
* **installer:** apk signing and installation ([da32ff9](https://github.com/ReVanced/revanced-manager/commit/da32ff954a84cf8ff321bbbf71cc5b544d6e6be9))
* **installer:** sign apk in patcher worker ([c003c3c](https://github.com/ReVanced/revanced-manager/commit/c003c3c3245f5a663a0371d4e9df71777ba728b9))
* **Installer:** use BottomAppBar ([#1428](https://github.com/ReVanced/revanced-manager/issues/1428)) ([ceb7623](https://github.com/ReVanced/revanced-manager/commit/ceb762379461443e7e62c37511df1c84a6068bb4))
* integrate revanced patcher ([#22](https://github.com/ReVanced/revanced-manager/issues/22)) ([caeabfc](https://github.com/ReVanced/revanced-manager/commit/caeabfc91b2aa7e3de9e6a31859049d4b2d37388))
* keystore import/export ([#30](https://github.com/ReVanced/revanced-manager/issues/30)) ([fd0ec6c](https://github.com/ReVanced/revanced-manager/commit/fd0ec6c6a7fc8488db859056a95ebe0455e2843b))
* **koin:** use the android logger ([f30333e](https://github.com/ReVanced/revanced-manager/commit/f30333e75338dd2c1ef891723ecb834fc1eb10f7))
* licenses screen ([#47](https://github.com/ReVanced/revanced-manager/issues/47)) ([e3cb056](https://github.com/ReVanced/revanced-manager/commit/e3cb056858ea8917162c1a421a7a8d03ddaa08e2))
* make bundles selectable ([#1237](https://github.com/ReVanced/revanced-manager/issues/1237)) ([a246863](https://github.com/ReVanced/revanced-manager/commit/a246863a89fe8781feaf2a45fcb7ea991d26028f))
* Make patch bundles list scrollable ([#2322](https://github.com/ReVanced/revanced-manager/issues/2322)) ([a5c8a23](https://github.com/ReVanced/revanced-manager/commit/a5c8a23f9ffb36543d45b46bb5f01c5dea56bf90))
* more info for the select from application screen ([#81](https://github.com/ReVanced/revanced-manager/issues/81)) ([3f446f8](https://github.com/ReVanced/revanced-manager/commit/3f446f8236101755a9d51a2aa759f70a0bd429da))
* move plugin api to another repository ([55e7ebf](https://github.com/ReVanced/revanced-manager/commit/55e7ebf4fc5adf8800430ad4aa2579cb6210290d))
* Move safeguards above patcher preference group ([9f7eaa2](https://github.com/ReVanced/revanced-manager/commit/9f7eaa212339f2093050087dc7ab0b8237356939))
* move update to notification card ([#1917](https://github.com/ReVanced/revanced-manager/issues/1917)) ([b80f94b](https://github.com/ReVanced/revanced-manager/commit/b80f94b77bba89e31608cdb302dab0619bf7c5cc))
* **NotificationCard:** rewrite & consistent usage ([#1426](https://github.com/ReVanced/revanced-manager/issues/1426)) ([f8aafa0](https://github.com/ReVanced/revanced-manager/commit/f8aafa050328423b3168a7943f566fce58100cb0))
* Open the app-specific manage all files permission dialog ([#2148](https://github.com/ReVanced/revanced-manager/issues/2148)) ([a3f31ea](https://github.com/ReVanced/revanced-manager/commit/a3f31ea65788a43ce57d548e8240e5b1fe3005d0))
* Order bundles by number of patches ([bb5d414](https://github.com/ReVanced/revanced-manager/commit/bb5d414abb4f294aa88d795486836a99ade2b388))
* patch bundle sources system ([#24](https://github.com/ReVanced/revanced-manager/issues/24)) ([9675a27](https://github.com/ReVanced/revanced-manager/commit/9675a2777b364e5ede0d44b92eb7e551d4f7b3d6))
* patch options ([#45](https://github.com/ReVanced/revanced-manager/issues/45)) ([8540d30](https://github.com/ReVanced/revanced-manager/commit/8540d301962669e3d79ca345c852f5b01df641a4))
* patch options UI ([#80](https://github.com/ReVanced/revanced-manager/issues/80)) ([0a1acd2](https://github.com/ReVanced/revanced-manager/commit/0a1acd24e3f0d06fde412b8eeecd923d92ee64a9))
* **patch-selector:** default patches selection ([#1272](https://github.com/ReVanced/revanced-manager/issues/1272)) ([a17c2de](https://github.com/ReVanced/revanced-manager/commit/a17c2de228cccb4a0bb0ca7497720011bec131fc))
* **patch-selector:** remove TODO about an unplanned feature ([4924eae](https://github.com/ReVanced/revanced-manager/commit/4924eaef800c429f2a59b8a15fd48fae0292810c))
* **patcher:** Improve installation ([#2185](https://github.com/ReVanced/revanced-manager/issues/2185)) ([3bd4f0d](https://github.com/ReVanced/revanced-manager/commit/3bd4f0d8f3f60d079d4647d42592b10a15f0dae8))
* patches selector screen ([55e871a](https://github.com/ReVanced/revanced-manager/commit/55e871aa7d27885e44ef33faab1bb4ae33e7a460))
* Progressive AlertDialog for adding bundles ([9a01273](https://github.com/ReVanced/revanced-manager/commit/9a01273c43bd6bcdb0cdfd26c5a467cd3193e5d7)), closes [#1992](https://github.com/ReVanced/revanced-manager/issues/1992)
* ProGuard ([d84e6a3](https://github.com/ReVanced/revanced-manager/commit/d84e6a3ffc20d018b2edeb505de20a920785ba5c))
* Purple default theme ([#1601](https://github.com/ReVanced/revanced-manager/issues/1601)) ([0616666](https://github.com/ReVanced/revanced-manager/commit/0616666d5ef9b53bef5fd630b1b1a47088097d37))
* Redesign the patches screen ([#2381](https://github.com/ReVanced/revanced-manager/issues/2381)) ([8dc4e5b](https://github.com/ReVanced/revanced-manager/commit/8dc4e5b89ee4d36263c8b4187650691b68484688))
* remember patch options ([#1449](https://github.com/ReVanced/revanced-manager/issues/1449)) ([90db765](https://github.com/ReVanced/revanced-manager/commit/90db765c9aa014495775a34927904dedf5fef1e3))
* remove dead help icons ([3bb071d](https://github.com/ReVanced/revanced-manager/commit/3bb071d80d319d4943b0d4c3048f232f3eb9f5cf))
* Remove tag from changelog ([d2119d3](https://github.com/ReVanced/revanced-manager/commit/d2119d36430198151140b469192f76f781df6dd3))
* Rename "Patch bundle" to "Patches" ([#2541](https://github.com/ReVanced/revanced-manager/issues/2541)) ([2cdd6d1](https://github.com/ReVanced/revanced-manager/commit/2cdd6d1843f1e49c7c720f8859e11d6a30c0eea6))
* rename debug build to `ReVanced Manager (dev)` ([d3417ad](https://github.com/ReVanced/revanced-manager/commit/d3417adbeba0a8e06d3494a2fd108f735f73632c))
* rename main bundle to `Default` ([e44d3fd](https://github.com/ReVanced/revanced-manager/commit/e44d3fdee444d915e3e8b8143e55f1353980aad2))
* rename package to `app.revanced.manager` ([5ec97f4](https://github.com/ReVanced/revanced-manager/commit/5ec97f4a852a07d0e554bbe1eacc379179ac089e))
* Rename strings ([e127845](https://github.com/ReVanced/revanced-manager/commit/e1278452b9c73479cdfb0eb0703db1552b158633))
* rename ViewModels for consistency ([064a54e](https://github.com/ReVanced/revanced-manager/commit/064a54eaf0675a1cc9d21f3e1071160deb25c201))
* Reorder Import & Export settings ([#2403](https://github.com/ReVanced/revanced-manager/issues/2403)) ([2697077](https://github.com/ReVanced/revanced-manager/commit/2697077fc88bb795027303558c9d52448a4daded))
* ReVanced theme colors ([59b894d](https://github.com/ReVanced/revanced-manager/commit/59b894dce4b99c51151a4cccd03a998ceec31778))
* revert to blue theme colors ([5f4c958](https://github.com/ReVanced/revanced-manager/commit/5f4c9584a94a1edd1eeaa0b9ecfcd9b281b7cccc))
* root installation ([#1243](https://github.com/ReVanced/revanced-manager/issues/1243)) ([62e934c](https://github.com/ReVanced/revanced-manager/commit/62e934c4032096bed36201510fc55304ba48de68))
* save patch options and selected patches in bundle ([#50](https://github.com/ReVanced/revanced-manager/issues/50)) ([23162f6](https://github.com/ReVanced/revanced-manager/commit/23162f6233fa6a176514b35feff731f8f28b4d4b))
* save patch selection using room db ([#38](https://github.com/ReVanced/revanced-manager/issues/38)) ([1efccda](https://github.com/ReVanced/revanced-manager/commit/1efccda3f55d964fae3bee9ee1f0bd260bb1cc74))
* Screen slide transition ([#2396](https://github.com/ReVanced/revanced-manager/issues/2396)) ([2de16e1](https://github.com/ReVanced/revanced-manager/commit/2de16e18e8ba5e84149b377f225693ea35fa2385))
* Scrollbars ([#1479](https://github.com/ReVanced/revanced-manager/issues/1479)) ([b5558ea](https://github.com/ReVanced/revanced-manager/commit/b5558ea3ffef40f96b271f8dfe3a5cf95328781e))
* Select bundle type before adding bundle ([#1490](https://github.com/ReVanced/revanced-manager/issues/1490)) ([88e860c](https://github.com/ReVanced/revanced-manager/commit/88e860cf0132aed23a3cfd3d9d12e472aa895718))
* selected app info page ([#1395](https://github.com/ReVanced/revanced-manager/issues/1395)) ([b69a369](https://github.com/ReVanced/revanced-manager/commit/b69a369d4e304c8a4c8a8db052309b485171e353))
* Set app ownership when installing apps ([#2558](https://github.com/ReVanced/revanced-manager/issues/2558)) ([7c410fe](https://github.com/ReVanced/revanced-manager/commit/7c410fef4512087657e3978d5be049c422b25456))
* settings migration (compose) ([#1309](https://github.com/ReVanced/revanced-manager/issues/1309)) ([bf1d628](https://github.com/ReVanced/revanced-manager/commit/bf1d628944cb5a439d0bda7c49d820a5fa7576b3))
* settings screen ([b7d53cf](https://github.com/ReVanced/revanced-manager/commit/b7d53cfca84d7239bed9189e265a03fd44dc2e45))
* **settings screen:** add battery optimization notification ([5754864](https://github.com/ReVanced/revanced-manager/commit/57548641e7ecd06decfc926cb860674ce7443d7a))
* **settings screen:** match typography from figma ([948a6d1](https://github.com/ReVanced/revanced-manager/commit/948a6d14404e067907c9e84576cfeba76134aaf6))
* **settings:** move experimental patches option to advanced ([805d440](https://github.com/ReVanced/revanced-manager/commit/805d440450d821a26d3ef90a4f97cd796635057d))
* **Settings:** use SettingsListItem consistently and overall improvements ([#1427](https://github.com/ReVanced/revanced-manager/issues/1427)) ([5e35893](https://github.com/ReVanced/revanced-manager/commit/5e35893883fa109d74b028478e60b51f97a2e12d))
* show installed app in version selector ([1ab1e46](https://github.com/ReVanced/revanced-manager/commit/1ab1e4682ffbfe16c02c438ad833adbfdec58b33))
* Show manager update dialog ([#2069](https://github.com/ReVanced/revanced-manager/issues/2069)) ([113a74d](https://github.com/ReVanced/revanced-manager/commit/113a74d270c1c222d4d06049b4edda8f27724a20)), closes [#1963](https://github.com/ReVanced/revanced-manager/issues/1963) [#1958](https://github.com/ReVanced/revanced-manager/issues/1958)
* show stacktrace in installer ui ([#36](https://github.com/ReVanced/revanced-manager/issues/36)) ([8d53180](https://github.com/ReVanced/revanced-manager/commit/8d53180d86e6e9d9c8a4056a5fde0603f17e3157))
* show toast when no patches are selected ([8aa70d3](https://github.com/ReVanced/revanced-manager/commit/8aa70d350e07aae8b4a22b6bc6fb90c0f6227acd))
* splash screen ([60a5a11](https://github.com/ReVanced/revanced-manager/commit/60a5a11c71634aeda414c2ed85f7706ba3deefe1))
* store patched apps ([#79](https://github.com/ReVanced/revanced-manager/issues/79)) ([b14285b](https://github.com/ReVanced/revanced-manager/commit/b14285b2c83e60376ad42fa6ea508257cd04d47d))
* switch to androidx.navigation ([#2362](https://github.com/ReVanced/revanced-manager/issues/2362)) ([7438f45](https://github.com/ReVanced/revanced-manager/commit/7438f45903ec6ed3436a895d4c32d34d41b00010))
* switch to Preferences DataStore ([#60](https://github.com/ReVanced/revanced-manager/issues/60)) ([1852799](https://github.com/ReVanced/revanced-manager/commit/18527999b5f8752faf36c145276d51e2e095c8ee))
* switch to revanced api v4 ([7e858a2](https://github.com/ReVanced/revanced-manager/commit/7e858a244cc4038bdb029c4418278700f6a6490f))
* switch to the new api ([#75](https://github.com/ReVanced/revanced-manager/issues/75)) ([a55160e](https://github.com/ReVanced/revanced-manager/commit/a55160e7c619ec5541de72fa80f079c9bc94d2d5))
* TopAppBar scroll behavior ([#2397](https://github.com/ReVanced/revanced-manager/issues/2397)) ([dc51d61](https://github.com/ReVanced/revanced-manager/commit/dc51d6134dae0fdc415f66e2716c6bffa35dfdb5))
* **Update Screen:** changelogs & handle states ([#1464](https://github.com/ReVanced/revanced-manager/issues/1464)) ([3af26e7](https://github.com/ReVanced/revanced-manager/commit/3af26e706571339a3c69688098a51616549c58a8))
* **update screen:** complete main update screen ([553af83](https://github.com/ReVanced/revanced-manager/commit/553af831393d7276088ceb0b0a854ec654f72def))
* updater changelogs ([#48](https://github.com/ReVanced/revanced-manager/issues/48)) ([6dbcd62](https://github.com/ReVanced/revanced-manager/commit/6dbcd6293e94d8d20cccc401b0edeb1d7047553e))
* updater UI and code improvements ([#1597](https://github.com/ReVanced/revanced-manager/issues/1597)) ([a12cae7](https://github.com/ReVanced/revanced-manager/commit/a12cae72998d85138dcf29c0e5d430359e338d5e))
* Use "Debug" and "Debug signed" for build names respectively ([5133f02](https://github.com/ReVanced/revanced-manager/commit/5133f02ad61b85af28608c7180b7a2accb4811ab))
* Use correct casing in module description ([59b4c0b](https://github.com/ReVanced/revanced-manager/commit/59b4c0b2d2e426dfe66b5a01d219b57bb0df5b8b))
* use revanced api for changelogs ([686eb40](https://github.com/ReVanced/revanced-manager/commit/686eb40cb0f8b8d785732dd2bc82d17b5a4fd042))
* Use simpler strings ([83d33e8](https://github.com/ReVanced/revanced-manager/commit/83d33e87e3f89cb3efce63dcabcde6478f69b8e7))
* View bundle patches ([#2065](https://github.com/ReVanced/revanced-manager/issues/2065)) ([089f200](https://github.com/ReVanced/revanced-manager/commit/089f200fe6ff59020a87883a47ef20a0c4c08565))
### Reverts
* downgrade Kotlin to 1.8.21 ([fc90bbc](https://github.com/ReVanced/revanced-manager/commit/fc90bbc27ce765e0b55bb5ac9132e58f46aee9aa))

View File

@@ -1,4 +1,3 @@
import io.github.z4kn4fein.semver.toVersion
import kotlin.random.Random
plugins {
@@ -110,16 +109,6 @@ dependencies {
implementation(libs.compose.icons.fontawesome)
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
// Semantic versioning string parser
classpath(libs.semver.parser)
}
}
android {
namespace = "app.revanced.manager"
compileSdk = 35
@@ -129,15 +118,8 @@ android {
applicationId = "app.revanced.manager"
minSdk = 26
targetSdk = 35
val versionStr = if (version == "unspecified") "1.0.0" else version.toString()
versionName = versionStr
versionCode = with(versionStr.toVersion()) {
major * 10_000_000 +
minor * 10_000 +
patch * 100 +
(preRelease?.substringAfterLast('.')?.toInt() ?: 99)
}
versionCode = 1
versionName = "0.0.1"
vectorDrawables.useSupportLibrary = true
}

View File

@@ -1 +0,0 @@
version = 1.26.0-dev.12

1
app/gradlew vendored
View File

@@ -1 +0,0 @@
../gradlew

View File

@@ -1,11 +0,0 @@
{
"name": "app",
"private": false,
"devDependencies": {
"@anolilab/multi-semantic-release": "^1.1.10",
"@saithodev/semantic-release-backmerge": "^4.0.1",
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"gradle-semantic-release-plugin": "^1.10.1"
}
}

View File

@@ -1,14 +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
-keep class app.revanced.manager.patcher.runtime.process.* { *; }
-keep class app.revanced.manager.plugin.** { *; }
-keep class app.revanced.patcher.** { *; }
-keep class com.android.tools.smali.** { *; }
-keep class kotlin.** { *; }
-keepnames class com.android.apksig.internal.** { *; }
-keepnames class org.xmlpull.** { *; }
# 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(...);
}
-dontwarn com.google.j2objc.annotations.*
# 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 org.slf4j.**
-dontwarn it.skrape.fetcher.*
-dontwarn com.google.j2objc.annotations.*
-keepattributes RuntimeVisibleAnnotations,AnnotationDefault

View File

@@ -81,7 +81,6 @@ class MainActivity : ComponentActivity() {
)
val theme by vm.prefs.theme.getAsState()
val dynamicColor by vm.prefs.dynamicColor.getAsState()
val pureBlackTheme by vm.prefs.pureBlackTheme.getAsState()
EventEffect(vm.legacyImportActivityFlow) {
try {
@@ -92,8 +91,7 @@ class MainActivity : ComponentActivity() {
ReVancedManagerTheme(
darkTheme = theme == Theme.SYSTEM && isSystemInDarkTheme() || theme == Theme.DARK,
dynamicColor = dynamicColor,
pureBlackTheme = pureBlackTheme
dynamicColor = dynamicColor
) {
ReVancedManager(vm)
}

View File

@@ -27,25 +27,25 @@ class KeystoreManager(app: Application, private val prefs: PreferencesManager) {
private val keystorePath =
app.getDir("signing", Context.MODE_PRIVATE).resolve("manager.keystore")
private suspend fun updatePrefs(alias: String, pass: String) = prefs.edit {
prefs.keystoreAlias.value = alias
private suspend fun updatePrefs(cn: String, pass: String) = prefs.edit {
prefs.keystoreCommonName.value = cn
prefs.keystorePass.value = pass
}
private suspend fun signingDetails(path: File = keystorePath) = ApkUtils.KeyStoreDetails(
keyStore = path,
keyStorePassword = null,
alias = prefs.keystoreAlias.get(),
alias = prefs.keystoreCommonName.get(),
password = prefs.keystorePass.get()
)
suspend fun sign(input: File, output: File) = withContext(Dispatchers.Default) {
ApkUtils.signApk(input, output, prefs.keystoreAlias.get(), signingDetails())
ApkUtils.signApk(input, output, prefs.keystoreCommonName.get(), signingDetails())
}
suspend fun regenerate() = withContext(Dispatchers.Default) {
val keyCertPair = ApkSigner.newPrivateKeyCertificatePair(
prefs.keystoreAlias.get(),
prefs.keystoreCommonName.get(),
eightYearsFromNow
)
val ks = ApkSigner.newKeyStore(
@@ -64,13 +64,13 @@ class KeystoreManager(app: Application, private val prefs: PreferencesManager) {
updatePrefs(DEFAULT, DEFAULT)
}
suspend fun import(alias: String, pass: String, keystore: InputStream): Boolean {
suspend fun import(cn: String, pass: String, keystore: InputStream): Boolean {
val keystoreData = withContext(Dispatchers.IO) { keystore.readBytes() }
try {
val ks = ApkSigner.readKeyStore(ByteArrayInputStream(keystoreData), null)
ApkSigner.readPrivateKeyCertificatePair(ks, alias, pass)
ApkSigner.readPrivateKeyCertificatePair(ks, cn, pass)
} catch (_: UnrecoverableKeyException) {
return false
} catch (_: IllegalArgumentException) {
@@ -81,7 +81,7 @@ class KeystoreManager(app: Application, private val prefs: PreferencesManager) {
Files.write(keystorePath.toPath(), keystoreData)
}
updatePrefs(alias, pass)
updatePrefs(cn, pass)
return true
}

View File

@@ -9,7 +9,6 @@ class PreferencesManager(
context: Context
) : BasePreferencesManager(context, "settings") {
val dynamicColor = booleanPreference("dynamic_color", true)
val pureBlackTheme = booleanPreference("pure_black_theme", false)
val theme = enumPreference("theme", Theme.SYSTEM)
val api = stringPreference("api_url", "https://api.revanced.app")
@@ -17,14 +16,12 @@ class PreferencesManager(
val useProcessRuntime = booleanPreference("use_process_runtime", false)
val patcherProcessMemoryLimit = intPreference("process_runtime_memory_limit", 700)
val keystoreAlias = stringPreference("keystore_alias", KeystoreManager.DEFAULT)
val keystoreCommonName = stringPreference("keystore_cn", KeystoreManager.DEFAULT)
val keystorePass = stringPreference("keystore_pass", KeystoreManager.DEFAULT)
val firstLaunch = booleanPreference("first_launch", true)
val managerAutoUpdates = booleanPreference("manager_auto_updates", false)
val showManagerUpdateDialogOnLaunch = booleanPreference("show_manager_update_dialog_on_launch", true)
val useManagerPrereleases = booleanPreference("manager_prereleases", false)
val usePatchesPrereleases = booleanPreference("patches_prereleases", false)
val disablePatchVersionCompatCheck = booleanPreference("disable_patch_version_compatibility_check", false)
val disableSelectionWarning = booleanPreference("disable_selection_warning", false)

View File

@@ -1,6 +1,6 @@
package app.revanced.manager.network.api
import app.revanced.manager.BuildConfig
import android.os.Build
import app.revanced.manager.domain.manager.PreferencesManager
import app.revanced.manager.network.dto.ReVancedAsset
import app.revanced.manager.network.dto.ReVancedGitRepository
@@ -30,12 +30,11 @@ class ReVancedAPI(
private suspend inline fun <reified T> request(route: String) = request<T>(apiUrl(), route)
suspend fun getAppUpdate() =
getLatestAppInfo().getOrThrow().takeIf { it.version.removePrefix("v") != BuildConfig.VERSION_NAME }
getLatestAppInfo().getOrThrow().takeIf { it.version != Build.VERSION.RELEASE }
suspend fun getLatestAppInfo() =
request<ReVancedAsset>("manager?prerelease=${prefs.useManagerPrereleases.get()}")
suspend fun getLatestAppInfo() = request<ReVancedAsset>("manager")
suspend fun getPatchesUpdate() = request<ReVancedAsset>("patches?prerelease=${prefs.usePatchesPrereleases.get()}")
suspend fun getPatchesUpdate() = request<ReVancedAsset>("patches")
suspend fun getContributors() = request<List<ReVancedGitRepository>>("contributors")

View File

@@ -6,7 +6,6 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
@@ -22,6 +21,7 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import app.revanced.manager.R
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -69,7 +69,10 @@ fun AppTopBar(
scrollBehavior = scrollBehavior,
navigationIcon = {
if (onBackClick != null) {
IconButton(onClick = onBackClick) {
TooltipIconButton(
onClick = onBackClick,
tooltip = stringResource(R.string.back),
) {
backIcon()
}
}
@@ -108,7 +111,10 @@ fun AppTopBar(
scrollBehavior = scrollBehavior,
navigationIcon = {
if (onBackClick != null) {
IconButton(onClick = onBackClick) {
TooltipIconButton(
onClick = onBackClick,
tooltip = stringResource(R.string.back),
) {
backIcon()
}
}

View File

@@ -4,13 +4,13 @@ import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.KeyboardArrowUp
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.res.stringResource
import app.revanced.manager.R
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
@Composable
fun ArrowButton(
@@ -27,7 +27,11 @@ fun ArrowButton(
)
onClick?.let {
IconButton(onClick = it) {
TooltipIconButton(
modifier = Modifier,
onClick = it,
tooltip = stringResource(description),
) {
Icon(
imageVector = Icons.Filled.KeyboardArrowUp,
contentDescription = stringResource(description),

View File

@@ -9,7 +9,6 @@ import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.outlined.Share
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -18,6 +17,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import app.revanced.manager.R
import app.revanced.manager.ui.component.bundle.BundleTopBar
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -39,7 +39,8 @@ fun ExceptionViewerDialog(text: String, onDismiss: () -> Unit) {
)
},
actions = {
IconButton(
TooltipIconButton(
modifier = Modifier,
onClick = {
val sendIntent: Intent = Intent().apply {
action = Intent.ACTION_SEND
@@ -52,7 +53,8 @@ fun ExceptionViewerDialog(text: String, onDismiss: () -> Unit) {
val shareIntent = Intent.createChooser(sendIntent, null)
context.startActivity(shareIntent)
}
},
tooltip = stringResource(R.string.share),
) {
Icon(
Icons.Outlined.Share,

View File

@@ -14,7 +14,6 @@ import androidx.compose.material.icons.outlined.Close
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -25,6 +24,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import app.revanced.manager.R
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
@Composable
fun NotificationCard(
@@ -138,7 +138,10 @@ fun NotificationCard(
)
}
if (onDismiss != null) {
IconButton(onClick = onDismiss) {
TooltipIconButton(
onClick = onDismiss,
tooltip = stringResource(R.string.close),
) {
Icon(
imageVector = Icons.Outlined.Close,
contentDescription = stringResource(R.string.close),

View File

@@ -5,7 +5,6 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Visibility
import androidx.compose.material.icons.outlined.VisibilityOff
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.OutlinedTextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@@ -19,6 +18,7 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import app.revanced.manager.R
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
@Composable
fun PasswordField(modifier: Modifier = Modifier, value: String, onValueChange: (String) -> Unit, label: @Composable (() -> Unit)? = null, placeholder: @Composable (() -> Unit)? = null) {
@@ -33,9 +33,15 @@ fun PasswordField(modifier: Modifier = Modifier, value: String, onValueChange: (
label = label,
modifier = modifier,
trailingIcon = {
IconButton(onClick = {
visible = !visible
}) {
TooltipIconButton(
modifier = Modifier,
onClick = {
visible = !visible
},
tooltip = if (visible) stringResource(R.string.show_password_field) else stringResource(
R.string.hide_password_field
),
) {
val (icon, description) = remember(visible) {
if (visible) Icons.Outlined.VisibilityOff to R.string.hide_password_field else Icons.Outlined.Visibility to R.string.show_password_field
}

View File

@@ -5,7 +5,6 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SearchBar
import androidx.compose.material3.SearchBarColors
@@ -19,6 +18,7 @@ import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
import app.revanced.manager.R
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -48,7 +48,10 @@ fun SearchView(
onExpandedChange = onActiveChange,
placeholder = placeholder,
leadingIcon = {
IconButton(onClick = { onActiveChange(false) }) {
TooltipIconButton(
tooltip = stringResource(R.string.back),
onClick = { onActiveChange(false) }
) {
Icon(
Icons.AutoMirrored.Filled.ArrowBack,
stringResource(R.string.back)

View File

@@ -45,11 +45,11 @@ import app.revanced.manager.domain.bundles.LocalPatchBundle
import app.revanced.manager.domain.bundles.PatchBundleSource
import app.revanced.manager.domain.bundles.PatchBundleSource.Extensions.asRemoteOrNull
import app.revanced.manager.domain.bundles.PatchBundleSource.Extensions.isDefault
import app.revanced.manager.domain.manager.PreferencesManager
import app.revanced.manager.domain.repository.PatchBundleRepository
import app.revanced.manager.ui.component.ColumnWithScrollbar
import app.revanced.manager.ui.component.ExceptionViewerDialog
import app.revanced.manager.ui.component.FullscreenDialog
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
import app.revanced.manager.ui.component.TextInputDialog
import app.revanced.manager.ui.component.haptics.HapticSwitch
import kotlinx.coroutines.launch
@@ -66,14 +66,12 @@ fun BundleInformationDialog(
) {
val bundleRepo = koinInject<PatchBundleRepository>()
val networkInfo = koinInject<NetworkInfo>()
val prefs = koinInject<PreferencesManager>()
val hasNetwork = remember { networkInfo.isConnected() }
val composableScope = rememberCoroutineScope()
var viewCurrentBundlePatches by remember { mutableStateOf(false) }
val isLocal = src is LocalPatchBundle
val bundleManifestAttributes = src.patchBundle?.manifestAttributes
val (autoUpdate, endpoint) = src.asRemoteOrNull?.let { it.autoUpdate to it.endpoint }
?: (null to null)
val (autoUpdate, endpoint) = src.asRemoteOrNull?.let { it.autoUpdate to it.endpoint } ?: (null to null)
fun onAutoUpdateChange(new: Boolean) = composableScope.launch {
with(bundleRepo) {
@@ -106,7 +104,11 @@ fun BundleInformationDialog(
},
actions = {
if (!src.isDefault) {
IconButton(onClick = onDeleteRequest) {
TooltipIconButton(
modifier = Modifier,
onClick = onDeleteRequest,
tooltip = stringResource(R.string.delete),
) {
Icon(
Icons.Outlined.DeleteOutline,
stringResource(R.string.delete)
@@ -114,7 +116,11 @@ fun BundleInformationDialog(
}
}
if (!isLocal && hasNetwork) {
IconButton(onClick = onUpdate) {
TooltipIconButton(
modifier = Modifier,
onClick = onUpdate,
tooltip = stringResource(R.string.refresh),
) {
Icon(
Icons.Outlined.Update,
stringResource(R.string.refresh)
@@ -176,34 +182,6 @@ fun BundleInformationDialog(
)
}
if (src.isDefault) {
val useBundlePrerelease by prefs.usePatchesPrereleases.getAsState()
BundleListItem(
headlineText = stringResource(R.string.patches_prereleases),
supportingText = stringResource(R.string.patches_prereleases_description, src.name),
trailingContent = {
HapticSwitch(
checked = useBundlePrerelease,
onCheckedChange = {
composableScope.launch {
prefs.usePatchesPrereleases.update(
it
)
onUpdate()
}
}
)
},
modifier = Modifier.clickable {
composableScope.launch {
prefs.usePatchesPrereleases.update(!useBundlePrerelease)
onUpdate()
}
}
)
}
endpoint?.takeUnless { src.isDefault }?.let { url ->
var showUrlInputDialog by rememberSaveable {
mutableStateOf(false)

View File

@@ -2,7 +2,6 @@ package app.revanced.manager.ui.component.bundle
import androidx.compose.foundation.layout.RowScope
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
@@ -10,7 +9,11 @@ import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.material3.surfaceColorAtElevation
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import app.revanced.manager.R
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -33,7 +36,10 @@ fun BundleTopBar(
scrollBehavior = scrollBehavior,
navigationIcon = {
if (onBackClick != null) {
IconButton(onClick = onBackClick) {
TooltipIconButton(
tooltip = stringResource(R.string.back),
onClick = onBackClick
) {
backIcon()
}
}

View File

@@ -193,6 +193,7 @@ private fun ImportBundleStep(
},
supportingContent = { Text(stringResource(if (patchBundle != null) R.string.file_field_set else R.string.file_field_not_set)) },
trailingContent = {
// TODO: Determine if this button should be [TooltipWrap]'ped
IconButton(onClick = launchPatchActivity) {
Icon(imageVector = Icons.Default.Topic, contentDescription = null)
}

View File

@@ -0,0 +1,38 @@
package app.revanced.manager.ui.component.haptics
import android.view.HapticFeedbackConstants
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.FloatingActionButtonDefaults
import androidx.compose.material3.FloatingActionButtonElevation
import androidx.compose.material3.SmallFloatingActionButton
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import app.revanced.manager.util.withHapticFeedback
@Composable
fun HapticSmallFloatingActionButton (
onClick: () -> Unit,
modifier: Modifier = Modifier,
shape: Shape = FloatingActionButtonDefaults.smallShape,
containerColor: Color = FloatingActionButtonDefaults.containerColor,
contentColor: Color = contentColorFor(containerColor),
elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
content: @Composable () -> Unit,
) {
SmallFloatingActionButton(
onClick = onClick.withHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY),
modifier = modifier,
shape = shape,
containerColor = containerColor,
contentColor = contentColor,
elevation = elevation,
interactionSource = interactionSource,
content = content
)
}

View File

@@ -67,6 +67,7 @@ import app.revanced.manager.ui.component.LongInputDialog
import app.revanced.manager.ui.component.haptics.HapticExtendedFloatingActionButton
import app.revanced.manager.ui.component.haptics.HapticRadioButton
import app.revanced.manager.ui.component.haptics.HapticSwitch
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
import app.revanced.manager.util.isScrollingUp
import app.revanced.manager.util.mutableStateSetOf
import app.revanced.manager.util.saver.snapshotStateListSaver
@@ -123,7 +124,11 @@ private interface OptionEditor<T : Any> {
@Composable
fun ListItemTrailingContent(scope: OptionEditorScope<T>) {
IconButton(onClick = { scope.checkSafeguard { clickAction(scope) } }) {
TooltipIconButton(
modifier = Modifier,
tooltip = stringResource(R.string.edit),
onClick = { scope.checkSafeguard { clickAction(scope) } }
) {
Icon(Icons.Outlined.Edit, stringResource(R.string.edit))
}
}
@@ -270,7 +275,9 @@ private object StringOptionEditor : OptionEditor<String> {
},
trailingIcon = {
var showDropdownMenu by rememberSaveable { mutableStateOf(false) }
IconButton(
TooltipIconButton(
modifier = Modifier,
tooltip = stringResource(R.string.string_option_menu_description),
onClick = { showDropdownMenu = true }
) {
Icon(
@@ -580,7 +587,9 @@ private class ListOptionEditor<T : Serializable>(private val elementEditor: Opti
},
actions = {
if (deleteMode) {
IconButton(
TooltipIconButton(
modifier = Modifier,
tooltip = stringResource(R.string.select_deselect_all),
onClick = {
if (items.size == deletionTargets.size) deletionTargets.clear()
else deletionTargets.addAll(items.map { it.key })
@@ -591,7 +600,9 @@ private class ListOptionEditor<T : Serializable>(private val elementEditor: Opti
stringResource(R.string.select_deselect_all)
)
}
IconButton(
TooltipIconButton(
modifier = Modifier,
tooltip = stringResource(R.string.delete),
onClick = {
items.removeIf { it.key in deletionTargets }
deletionTargets.clear()
@@ -604,8 +615,15 @@ private class ListOptionEditor<T : Serializable>(private val elementEditor: Opti
)
}
} else {
IconButton(onClick = items::clear) {
Icon(Icons.Outlined.Restore, stringResource(R.string.reset))
TooltipIconButton(
modifier = Modifier,
tooltip = stringResource(R.string.reset),
onClick = items::clear
) {
Icon(
Icons.Outlined.Restore,
stringResource(R.string.reset)
)
}
}
}
@@ -673,9 +691,10 @@ private class ListOptionEditor<T : Serializable>(private val elementEditor: Opti
),
tonalElevation = if (deleteMode && item.key in deletionTargets) 8.dp else 0.dp,
leadingContent = {
IconButton(
TooltipIconButton(
modifier = Modifier.draggableHandle(interactionSource = interactionSource),
onClick = {},
tooltip = stringResource(R.string.delete),
onClick = { }
) {
Icon(
Icons.Filled.DragHandle,

View File

@@ -5,7 +5,6 @@ import androidx.compose.foundation.clickable
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Edit
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -17,6 +16,7 @@ import androidx.compose.ui.res.stringResource
import app.revanced.manager.R
import app.revanced.manager.domain.manager.base.Preference
import app.revanced.manager.ui.component.IntInputDialog
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@@ -65,10 +65,14 @@ fun IntegerItem(
headlineContent = stringResource(headline),
supportingContent = stringResource(description),
trailingContent = {
IconButton(onClick = { dialogOpen = true }) {
TooltipIconButton(
modifier = modifier,
onClick = { dialogOpen = true },
tooltip = stringResource(R.string.edit),
) {
Icon(
Icons.Outlined.Edit,
contentDescription = stringResource(R.string.edit)
imageVector = Icons.Outlined.Edit,
contentDescription = stringResource(R.string.edit),
)
}
}

View File

@@ -0,0 +1,107 @@
package app.revanced.manager.ui.component.tooltip
import androidx.annotation.StringRes
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FloatingActionButtonDefaults
import androidx.compose.material3.FloatingActionButtonElevation
import androidx.compose.material3.TooltipDefaults
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.window.PopupPositionProvider
import app.revanced.manager.ui.component.haptics.HapticFloatingActionButton
/**
* [HapticFloatingActionButton] with tooltip-specific params.
*
* @param tooltip [String] text to show in a tooltip.
* @param positionProvider [PopupPositionProvider] Anchor point for the tooltip.
* @param haptic Whether to perform haptic feedback when the tooltip shown.
* @param hapticFeedbackType The type of haptic feedback to perform.
*
* @see [HapticFloatingActionButton]
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TooltipFloatingActionButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
shape: Shape = FloatingActionButtonDefaults.shape,
containerColor: Color = FloatingActionButtonDefaults.containerColor,
contentColor: Color = contentColorFor(containerColor),
elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
tooltip: String,
positionProvider: PopupPositionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
haptic: Boolean = true,
hapticFeedbackType: HapticFeedbackType = HapticFeedbackType.LongPress,
content: @Composable (() -> Unit)
) {
TooltipWrap(
tooltip = tooltip,
positionProvider = positionProvider,
haptic = haptic,
hapticFeedbackType = hapticFeedbackType,
) {
HapticFloatingActionButton(
onClick = onClick,
modifier = modifier,
shape = shape,
containerColor = containerColor,
contentColor = contentColor,
elevation = elevation,
interactionSource = interactionSource,
content = content,
)
}
}
/**
* [HapticFloatingActionButton] with tooltip-specific params.
*
* @param tooltip [Int] or `id` string resource to show in a tooltip.
* @param positionProvider [PopupPositionProvider] Anchor point for the tooltip.
* @param haptic Whether to perform haptic feedback when the tooltip shown.
* @param hapticFeedbackType The type of haptic feedback to perform.
*
* @see [HapticFloatingActionButton]
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TooltipFloatingActionButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
shape: Shape = FloatingActionButtonDefaults.shape,
containerColor: Color = FloatingActionButtonDefaults.containerColor,
contentColor: Color = contentColorFor(containerColor),
elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
@StringRes tooltip: Int,
positionProvider: PopupPositionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
haptic: Boolean = true,
hapticFeedbackType: HapticFeedbackType = HapticFeedbackType.LongPress,
content: @Composable (() -> Unit)
) {
TooltipWrap(
tooltip = tooltip,
positionProvider = positionProvider,
haptic = haptic,
hapticFeedbackType = hapticFeedbackType,
) {
HapticFloatingActionButton(
onClick = onClick,
modifier = modifier,
shape = shape,
containerColor = containerColor,
contentColor = contentColor,
elevation = elevation,
interactionSource = interactionSource,
content = content,
)
}
}

View File

@@ -0,0 +1,96 @@
package app.revanced.manager.ui.component.tooltip
import androidx.annotation.StringRes
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.IconButton
import androidx.compose.material3.IconButtonColors
import androidx.compose.material3.IconButtonDefaults
import androidx.compose.material3.TooltipDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.window.PopupPositionProvider
/**
* [IconButton] with tooltip-specific params.
*
* @param tooltip [String] text to show in a tooltip.
* @param positionProvider [PopupPositionProvider] Anchor point for the tooltip.
* @param haptic Whether to perform haptic feedback when the tooltip shown.
* @param hapticFeedbackType The type of haptic feedback to perform.
*
* @see [IconButton]
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TooltipIconButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
colors: IconButtonColors = IconButtonDefaults.iconButtonColors(),
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
tooltip: String,
positionProvider: PopupPositionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
haptic: Boolean = true,
hapticFeedbackType: HapticFeedbackType = HapticFeedbackType.LongPress,
content: @Composable (() -> Unit),
) {
TooltipWrap(
tooltip = tooltip,
positionProvider = positionProvider,
haptic = haptic,
hapticFeedbackType = hapticFeedbackType,
) {
IconButton(
onClick = onClick,
modifier = modifier,
enabled = enabled,
colors = colors,
interactionSource = interactionSource,
content = content,
)
}
}
/**
* [IconButton] with tooltip-specific params.
*
* @param tooltip [Int] or `id` string resource to show in a tooltip.
* @param positionProvider [PopupPositionProvider] Anchor point for the tooltip.
* @param haptic Whether to perform haptic feedback when the tooltip shown.
* @param hapticFeedbackType The type of haptic feedback to perform.
*
* @see [IconButton]
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TooltipIconButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
colors: IconButtonColors = IconButtonDefaults.iconButtonColors(),
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
@StringRes tooltip: Int,
positionProvider: PopupPositionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
haptic: Boolean = true,
hapticFeedbackType: HapticFeedbackType = HapticFeedbackType.LongPress,
content: @Composable (() -> Unit),
) {
TooltipWrap(
tooltip = tooltip,
positionProvider = positionProvider,
haptic = haptic,
hapticFeedbackType = hapticFeedbackType,
) {
IconButton(
onClick = onClick,
modifier = modifier,
enabled = enabled,
colors = colors,
interactionSource = interactionSource,
content = content,
)
}
}

View File

@@ -0,0 +1,107 @@
package app.revanced.manager.ui.component.tooltip
import androidx.annotation.StringRes
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FloatingActionButtonDefaults
import androidx.compose.material3.FloatingActionButtonElevation
import androidx.compose.material3.TooltipDefaults
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.window.PopupPositionProvider
import app.revanced.manager.ui.component.haptics.HapticSmallFloatingActionButton
/**
* [HapticSmallFloatingActionButton] with tooltip-specific params.
*
* @param tooltip [String] text to show in a tooltip.
* @param positionProvider [PopupPositionProvider] Anchor point for the tooltip.
* @param haptic Whether to perform haptic feedback when the tooltip shown.
* @param hapticFeedbackType The type of haptic feedback to perform.
*
* @see [HapticSmallFloatingActionButton]
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TooltipSmallFloatingActionButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
shape: Shape = FloatingActionButtonDefaults.smallShape,
containerColor: Color = FloatingActionButtonDefaults.containerColor,
contentColor: Color = contentColorFor(containerColor),
elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
tooltip: String,
positionProvider: PopupPositionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
haptic: Boolean = true,
hapticFeedbackType: HapticFeedbackType = HapticFeedbackType.LongPress,
content: @Composable (() -> Unit)
) {
TooltipWrap(
tooltip = tooltip,
positionProvider = positionProvider,
haptic = haptic,
hapticFeedbackType = hapticFeedbackType,
) {
HapticSmallFloatingActionButton(
onClick = onClick,
modifier = modifier,
shape = shape,
containerColor = containerColor,
contentColor = contentColor,
elevation = elevation,
interactionSource = interactionSource,
content = content,
)
}
}
/**
* [HapticSmallFloatingActionButton] with tooltip-specific params.
*
* @param tooltip [Int] or `id` string resource to show in a tooltip.
* @param positionProvider [PopupPositionProvider] Anchor point for the tooltip.
* @param haptic Whether to perform haptic feedback when the tooltip shown.
* @param hapticFeedbackType The type of haptic feedback to perform.
*
* @see [HapticSmallFloatingActionButton]
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TooltipSmallFloatingActionButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
shape: Shape = FloatingActionButtonDefaults.smallShape,
containerColor: Color = FloatingActionButtonDefaults.containerColor,
contentColor: Color = contentColorFor(containerColor),
elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
@StringRes tooltip: Int,
positionProvider: PopupPositionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
haptic: Boolean = true,
hapticFeedbackType: HapticFeedbackType = HapticFeedbackType.LongPress,
content: @Composable (() -> Unit)
) {
TooltipWrap(
tooltip = tooltip,
positionProvider = positionProvider,
haptic = haptic,
hapticFeedbackType = hapticFeedbackType,
) {
HapticSmallFloatingActionButton(
onClick = onClick,
modifier = modifier,
shape = shape,
containerColor = containerColor,
contentColor = contentColor,
elevation = elevation,
interactionSource = interactionSource,
content = content,
)
}
}

View File

@@ -0,0 +1,96 @@
package app.revanced.manager.ui.component.tooltip
import androidx.annotation.StringRes
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.PlainTooltip
import androidx.compose.material3.Text
import androidx.compose.material3.TooltipBox
import androidx.compose.material3.TooltipDefaults
import androidx.compose.material3.rememberTooltipState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.window.PopupPositionProvider
/**
* Wraps a composable with a tooltip.
*
* @param modifier the [Modifier] to applied to Tooltip.
* @param tooltip [String] text to show in a tooltip.
* @param positionProvider [PopupPositionProvider] Anchor point for the tooltip.
* @param content The composable UI to wrapped with.
* @param haptic Whether to perform haptic feedback when the tooltip shown.
* @param hapticFeedbackType The type of haptic feedback to perform.
*
* @see [TooltipBox]
*/
@Composable
@OptIn(ExperimentalMaterial3Api::class)
fun TooltipWrap(
modifier: Modifier = Modifier,
tooltip: String,
positionProvider: PopupPositionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
haptic: Boolean = true,
hapticFeedbackType: HapticFeedbackType = HapticFeedbackType.LongPress,
content: @Composable () -> Unit
) {
val tooltipState = rememberTooltipState()
val localHaptic = LocalHapticFeedback.current
LaunchedEffect(tooltipState.isVisible) {
if (tooltipState.isVisible && haptic) {
localHaptic.performHapticFeedback(hapticFeedbackType)
}
}
TooltipBox(
modifier = modifier,
positionProvider = positionProvider,
tooltip = { PlainTooltip { Text(tooltip) } },
state = tooltipState,
content = content,
)
}
/**
* Wraps a composable with a tooltip.
*
* @param modifier the [Modifier] to applied to tooltip.
* @param tooltip [Int] or `id` string resource to show in a tooltip.
* @param positionProvider [PopupPositionProvider] Anchor point for the tooltip.
* @param content The composable UI to wrapped with.
* @param haptic Whether to perform haptic feedback when the tooltip shown.
* @param hapticFeedbackType The type of haptic feedback to perform.
*
* @see [TooltipBox]
*/
@Composable
@OptIn(ExperimentalMaterial3Api::class)
fun TooltipWrap(
modifier: Modifier = Modifier,
@StringRes tooltip: Int,
positionProvider: PopupPositionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
haptic: Boolean = true,
hapticFeedbackType: HapticFeedbackType = HapticFeedbackType.LongPress,
content: @Composable () -> Unit
) {
val tooltipState = rememberTooltipState()
val localHaptic = LocalHapticFeedback.current
LaunchedEffect(tooltipState.isVisible) {
if (tooltipState.isVisible && haptic) {
localHaptic.performHapticFeedback(hapticFeedbackType)
}
}
TooltipBox(
modifier = modifier,
positionProvider = positionProvider,
tooltip = { PlainTooltip { Text(stringResource(tooltip)) } },
state = tooltipState,
content = content,
)
}

View File

@@ -16,7 +16,6 @@ import androidx.compose.material.icons.outlined.Search
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.ListItem
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
@@ -44,6 +43,7 @@ import app.revanced.manager.ui.component.LazyColumnWithScrollbar
import app.revanced.manager.ui.component.LoadingIndicator
import app.revanced.manager.ui.component.NonSuggestedVersionDialog
import app.revanced.manager.ui.component.SearchView
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
import app.revanced.manager.ui.model.SelectedApp
import app.revanced.manager.ui.viewmodel.AppSelectorViewModel
import app.revanced.manager.util.APK_MIMETYPE
@@ -162,8 +162,14 @@ fun AppSelectorScreen(
scrollBehavior = scrollBehavior,
onBackClick = onBackClick,
actions = {
IconButton(onClick = { search = true }) {
Icon(Icons.Outlined.Search, stringResource(R.string.search))
TooltipIconButton(
tooltip = stringResource(R.string.search_patches),
onClick = { search = true }
) {
Icon(
Icons.Outlined.Search,
stringResource(R.string.search)
)
}
}
)
@@ -234,13 +240,7 @@ fun AppSelectorScreen(
}
} else {
item {
Box(
modifier = Modifier.fillParentMaxSize(), contentAlignment = Alignment.Center
) {
LoadingIndicator()
}
}
item { LoadingIndicator() }
}
}
}

View File

@@ -66,8 +66,9 @@ import app.revanced.manager.ui.component.NotificationCard
import app.revanced.manager.ui.component.ConfirmDialog
import app.revanced.manager.ui.component.bundle.BundleTopBar
import app.revanced.manager.ui.component.bundle.ImportPatchBundleDialog
import app.revanced.manager.ui.component.haptics.HapticFloatingActionButton
import app.revanced.manager.ui.component.haptics.HapticTab
import app.revanced.manager.ui.component.tooltip.TooltipFloatingActionButton
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
import app.revanced.manager.ui.viewmodel.DashboardViewModel
import app.revanced.manager.util.RequestInstallAppsContract
import app.revanced.manager.util.toast
@@ -181,18 +182,20 @@ fun DashboardScreen(
)
},
actions = {
IconButton(
TooltipIconButton(
onClick = {
showDeleteConfirmationDialog = true
}
},
tooltip = stringResource(R.string.delete),
) {
Icon(
Icons.Outlined.DeleteOutline,
stringResource(R.string.delete)
)
}
IconButton(
onClick = vm::updateSources
TooltipIconButton(
onClick = vm::updateSources,
tooltip = stringResource(R.string.refresh)
) {
Icon(
Icons.Outlined.Refresh,
@@ -206,8 +209,9 @@ fun DashboardScreen(
title = stringResource(R.string.app_name),
actions = {
if (!vm.updatedManagerVersion.isNullOrEmpty()) {
IconButton(
TooltipIconButton(
onClick = onUpdateClick,
tooltip = stringResource(R.string.update),
) {
BadgedBox(
badge = {
@@ -218,8 +222,17 @@ fun DashboardScreen(
}
}
}
IconButton(onClick = onSettingsClick) {
Icon(Icons.Outlined.Settings, stringResource(R.string.settings))
TooltipIconButton(
onClick = onSettingsClick,
tooltip = stringResource(R.string.settings),
) {
BadgedBox(
badge = {
Badge(modifier = Modifier.size(6.dp))
}
) {
Icon(Icons.Outlined.Settings, stringResource(R.string.settings))
}
}
},
applyContainerColor = true
@@ -227,7 +240,8 @@ fun DashboardScreen(
}
},
floatingActionButton = {
HapticFloatingActionButton(
TooltipFloatingActionButton(
tooltip = stringResource(R.string.add),
onClick = {
vm.cancelSourceSelection()
@@ -240,11 +254,11 @@ fun DashboardScreen(
DashboardPage.BUNDLES.ordinal
)
}
return@HapticFloatingActionButton
return@TooltipFloatingActionButton
}
if (vm.android11BugActive) {
showAndroid11Dialog = true
return@HapticFloatingActionButton
return@TooltipFloatingActionButton
}
onAppSelectorClick()

View File

@@ -25,7 +25,6 @@ import androidx.compose.material3.AlertDialog
import androidx.compose.material3.BottomAppBar
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
@@ -51,11 +50,11 @@ import app.revanced.manager.ui.component.InstallerStatusDialog
import app.revanced.manager.ui.component.haptics.HapticExtendedFloatingActionButton
import app.revanced.manager.ui.component.patcher.InstallPickerDialog
import app.revanced.manager.ui.component.patcher.Steps
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
import app.revanced.manager.ui.model.StepCategory
import app.revanced.manager.ui.viewmodel.PatcherViewModel
import app.revanced.manager.util.APK_MIMETYPE
import app.revanced.manager.util.EventEffect
import app.revanced.manager.util.toast
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -77,10 +76,11 @@ fun PatcherScreen(
var showInstallPicker by rememberSaveable { mutableStateOf(false) }
var showDismissConfirmationDialog by rememberSaveable { mutableStateOf(false) }
fun onPageBack() = when {
patcherSucceeded == null -> showDismissConfirmationDialog = true
viewModel.isInstalling -> context.toast(context.getString(R.string.patcher_install_in_progress))
else -> onLeave()
fun onPageBack() {
if(patcherSucceeded == null)
showDismissConfirmationDialog = true
else
onLeave()
}
BackHandler(onBack = ::onPageBack)
@@ -164,15 +164,17 @@ fun PatcherScreen(
bottomBar = {
BottomAppBar(
actions = {
IconButton(
TooltipIconButton(
onClick = { exportApkLauncher.launch("${viewModel.packageName}_${viewModel.version}_revanced_patched.apk") },
enabled = patcherSucceeded == true
enabled = patcherSucceeded == true,
tooltip = stringResource(R.string.save_apk),
) {
Icon(Icons.Outlined.Save, stringResource(id = R.string.save_apk))
}
IconButton(
TooltipIconButton(
onClick = { viewModel.exportLogs(context) },
enabled = patcherSucceeded != null
enabled = patcherSucceeded != null,
tooltip = stringResource(R.string.save_logs),
) {
Icon(Icons.Outlined.PostAdd, stringResource(id = R.string.save_logs))
}

View File

@@ -41,7 +41,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Scaffold
import androidx.compose.material3.ScrollableTabRow
import androidx.compose.material3.SmallFloatingActionButton
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.surfaceColorAtElevation
@@ -73,6 +72,9 @@ import app.revanced.manager.ui.component.haptics.HapticCheckbox
import app.revanced.manager.ui.component.haptics.HapticExtendedFloatingActionButton
import app.revanced.manager.ui.component.haptics.HapticTab
import app.revanced.manager.ui.component.patches.OptionItem
import app.revanced.manager.ui.component.tooltip.TooltipFloatingActionButton
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
import app.revanced.manager.ui.component.tooltip.TooltipSmallFloatingActionButton
import app.revanced.manager.ui.component.patches.SelectionWarningDialog
import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel
import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel.Companion.SHOW_INCOMPATIBLE
@@ -259,14 +261,15 @@ fun PatchesSelectorScreen(
animationSpec = tween(durationMillis = 400, easing = EaseInOut),
label = "SearchBar back button"
)
IconButton(
TooltipIconButton(
onClick = {
if (searchExpanded) {
setSearchExpanded(false)
} else {
onBackClick()
}
}
},
tooltip = stringResource(R.string.back),
) {
Icon(
modifier = Modifier.rotate(rotation),
@@ -282,9 +285,10 @@ fun PatchesSelectorScreen(
transitionSpec = { fadeIn() togetherWith fadeOut() }
) { searchExpanded ->
if (searchExpanded) {
IconButton(
TooltipIconButton(
onClick = { setQuery("") },
enabled = query.isNotEmpty()
enabled = query.isNotEmpty(),
tooltip = stringResource(R.string.clear),
) {
Icon(
imageVector = Icons.Filled.Close,
@@ -292,7 +296,10 @@ fun PatchesSelectorScreen(
)
}
} else {
IconButton(onClick = { showBottomSheet = true }) {
TooltipIconButton(
onClick = { showBottomSheet = true },
tooltip = stringResource(R.string.more),
) {
Icon(
imageVector = Icons.Outlined.FilterList,
contentDescription = stringResource(R.string.more)
@@ -354,7 +361,8 @@ fun PatchesSelectorScreen(
horizontalAlignment = Alignment.End,
verticalArrangement = Arrangement.spacedBy(4.dp)
) {
SmallFloatingActionButton(
TooltipSmallFloatingActionButton(
tooltip = stringResource(R.string.reset),
onClick = viewModel::reset,
containerColor = MaterialTheme.colorScheme.tertiaryContainer
) {
@@ -506,6 +514,7 @@ private fun PatchItem(
supportingContent = patch.description?.let { { Text(it) } },
trailingContent = {
if (patch.options?.isNotEmpty() == true) {
// TODO: Determine if this button should be [TooltipWrap]
IconButton(onClick = onOptionsDialog, enabled = compatible) {
Icon(Icons.Outlined.Settings, null)
}
@@ -529,7 +538,10 @@ fun ListHeader(
},
trailingContent = onHelpClick?.let {
{
IconButton(onClick = it) {
TooltipIconButton(
tooltip = stringResource(R.string.help),
onClick = it
) {
Icon(
Icons.AutoMirrored.Outlined.HelpOutline,
stringResource(R.string.help)
@@ -609,7 +621,10 @@ private fun OptionsDialog(
title = patch.name,
onBackClick = onDismissRequest,
actions = {
IconButton(onClick = reset) {
TooltipIconButton(
tooltip = stringResource(R.string.reset),
onClick = reset
) {
Icon(Icons.Outlined.Restore, stringResource(R.string.reset))
}
}

View File

@@ -19,7 +19,6 @@ import androidx.compose.material.icons.outlined.MailOutline
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedCard
import androidx.compose.material3.Scaffold
@@ -50,6 +49,7 @@ import app.revanced.manager.network.dto.ReVancedSocial
import app.revanced.manager.ui.component.AppTopBar
import app.revanced.manager.ui.component.ColumnWithScrollbar
import app.revanced.manager.ui.component.settings.SettingsListItem
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
import app.revanced.manager.ui.model.navigation.Settings
import app.revanced.manager.ui.viewmodel.AboutViewModel
import app.revanced.manager.ui.viewmodel.AboutViewModel.Companion.DEVELOPER_OPTIONS_TAPS
@@ -252,9 +252,10 @@ fun AboutSettingsScreen(
horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally)
) {
socialButtons.forEach { (icon, text, onClick) ->
IconButton(
onClick = onClick,
TooltipIconButton(
modifier = Modifier.padding(end = 8.dp),
tooltip = text,
onClick = onClick
) {
Icon(
icon,

View File

@@ -21,7 +21,6 @@ import androidx.compose.material.icons.outlined.Restore
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
@@ -52,6 +51,7 @@ import app.revanced.manager.ui.component.settings.BooleanItem
import app.revanced.manager.ui.component.settings.IntegerItem
import app.revanced.manager.ui.component.settings.SafeguardBooleanItem
import app.revanced.manager.ui.component.settings.SettingsListItem
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
import app.revanced.manager.ui.viewmodel.AdvancedSettingsViewModel
import app.revanced.manager.util.toast
import app.revanced.manager.util.withHapticFeedback
@@ -243,7 +243,11 @@ private fun APIUrlDialog(currentUrl: String, defaultUrl: String, onSubmit: (Stri
onValueChange = { url = it },
label = { Text(stringResource(R.string.api_url)) },
trailingIcon = {
IconButton(onClick = { url = defaultUrl }) {
TooltipIconButton(
modifier = Modifier,
tooltip = stringResource(R.string.api_url_dialog_reset),
onClick = { url = defaultUrl }
) {
Icon(Icons.Outlined.Restore, stringResource(R.string.api_url_dialog_reset))
}
}

View File

@@ -1,7 +1,6 @@
package app.revanced.manager.ui.screen.settings
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
@@ -35,8 +34,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.platform.UriHandler
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
@@ -60,7 +57,6 @@ fun ContributorSettingsScreen(
) {
val repositories = viewModel.repositories
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
val uriHandler = LocalUriHandler.current
Scaffold(
topBar = {
@@ -97,8 +93,7 @@ fun ContributorSettingsScreen(
) {
ContributorsCard(
title = it.name,
contributors = it.contributors,
uriHandler = uriHandler
contributors = it.contributors
)
}
}
@@ -120,8 +115,7 @@ fun ContributorsCard(
title: String,
contributors: List<ReVancedContributor>,
itemsPerPage: Int = 12,
numberOfRows: Int = 2,
uriHandler: UriHandler
numberOfRows: Int = 2
) {
val itemsPerRow = (itemsPerPage / numberOfRows)
@@ -178,11 +172,7 @@ fun ContributorsCard(
contributorsByPage[page].forEach {
if (itemSize > 100.dp) {
Row(
modifier = Modifier
.width(itemSize - 1.dp)
.clickable {
uriHandler.openUri("https://github.com/${it.username}")
}, // we delete 1.dp to account for not-so divisible numbers
modifier = Modifier.width(itemSize - 1.dp), // we delete 1.dp to account for not-so divisible numbers
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
@@ -213,9 +203,6 @@ fun ContributorsCard(
modifier = Modifier
.size(size = (itemSize - 1.dp).coerceAtMost(50.dp)) // we delete 1.dp to account for not-so divisible numbers
.clip(CircleShape)
.clickable {
uriHandler.openUri("https://github.com/${it.username}")
}
)
}
}

View File

@@ -2,8 +2,6 @@ package app.revanced.manager.ui.screen.settings
import androidx.annotation.StringRes
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
@@ -11,14 +9,12 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.outlined.Search
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedCard
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
@@ -33,7 +29,6 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
@@ -42,12 +37,14 @@ import app.revanced.manager.R
import app.revanced.manager.network.downloader.DownloaderPluginState
import app.revanced.manager.ui.component.AppLabel
import app.revanced.manager.ui.component.AppTopBar
import app.revanced.manager.ui.component.ConfirmDialog
import app.revanced.manager.ui.component.ExceptionViewerDialog
import app.revanced.manager.ui.component.GroupHeader
import app.revanced.manager.ui.component.LazyColumnWithScrollbar
import app.revanced.manager.ui.component.ConfirmDialog
import app.revanced.manager.ui.component.tooltip.TooltipWrap
import app.revanced.manager.ui.component.haptics.HapticCheckbox
import app.revanced.manager.ui.component.settings.SettingsListItem
import app.revanced.manager.ui.component.tooltip.TooltipIconButton
import app.revanced.manager.ui.viewmodel.DownloadsViewModel
import org.koin.androidx.compose.koinViewModel
import java.security.MessageDigest
@@ -58,7 +55,6 @@ fun DownloadsSettingsScreen(
onBackClick: () -> Unit,
viewModel: DownloadsViewModel = koinViewModel()
) {
val context = LocalContext.current
val downloadedApps by viewModel.downloadedApps.collectAsStateWithLifecycle(emptyList())
val pluginStates by viewModel.downloaderPluginStates.collectAsStateWithLifecycle()
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
@@ -82,7 +78,10 @@ fun DownloadsSettingsScreen(
onBackClick = onBackClick,
actions = {
if (viewModel.appSelection.isNotEmpty()) {
IconButton(onClick = { viewModel.deleteApps() }) {
TooltipIconButton(
tooltip = stringResource(R.string.delete),
onClick = { showDeleteConfirmationDialog = true }
) {
Icon(Icons.Default.Delete, stringResource(R.string.delete))
}
}
@@ -128,11 +127,6 @@ fun DownloadsSettingsScreen(
.digest(androidSignature.toByteArray())
hash.toHexString(format = HexFormat.UpperCase)
}
val appName = remember {
packageInfo.applicationInfo?.loadLabel(context.packageManager)
?.toString()
?: packageName
}
when (state) {
is DownloaderPluginState.Loaded -> TrustDialog(
@@ -142,8 +136,6 @@ fun DownloadsSettingsScreen(
packageName,
signature
),
pluginName = appName,
signature = signature,
onDismiss = ::dismiss,
onConfirm = {
viewModel.revokePluginTrust(packageName)
@@ -161,10 +153,10 @@ fun DownloadsSettingsScreen(
is DownloaderPluginState.Untrusted -> TrustDialog(
title = R.string.downloader_plugin_trust_dialog_title,
body = stringResource(
R.string.downloader_plugin_trust_dialog_body
R.string.downloader_plugin_trust_dialog_body,
packageName,
signature
),
pluginName = appName,
signature = signature,
onDismiss = ::dismiss,
onConfirm = {
viewModel.trustPlugin(packageName)
@@ -240,8 +232,6 @@ fun DownloadsSettingsScreen(
private fun TrustDialog(
@StringRes title: Int,
body: String,
pluginName: String,
signature: String,
onDismiss: () -> Unit,
onConfirm: () -> Unit
) {
@@ -254,39 +244,10 @@ private fun TrustDialog(
},
dismissButton = {
TextButton(onClick = onDismiss) {
Text(stringResource(R.string.cancel))
Text(stringResource(R.string.dismiss))
}
},
title = { Text(stringResource(title)) },
text = {
Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
Text(body)
Card {
Column(
Modifier.padding(12.dp),
verticalArrangement = Arrangement.spacedBy(12.dp)
) {
Text(
stringResource(
R.string.downloader_plugin_trust_dialog_plugin,
pluginName
),
)
OutlinedCard(
colors = CardDefaults.outlinedCardColors(
containerColor = MaterialTheme.colorScheme.surfaceContainerHighest
)
) {
Text(
stringResource(
R.string.downloader_plugin_trust_dialog_signature,
signature.chunked(2).joinToString(" ")
), modifier = Modifier.padding(12.dp)
)
}
}
}
}
}
text = { Text(body) }
)
}

View File

@@ -1,7 +1,6 @@
package app.revanced.manager.ui.screen.settings
import android.os.Build
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -97,14 +96,6 @@ fun GeneralSettingsScreen(
description = R.string.dynamic_color_description
)
}
AnimatedVisibility(theme != Theme.LIGHT) {
BooleanItem(
preference = prefs.pureBlackTheme,
coroutineScope = coroutineScope,
headline = R.string.pure_black_theme,
description = R.string.pure_black_theme_description
)
}
}
}
}

View File

@@ -104,10 +104,10 @@ fun ImportExportSettingsScreen(
if (vm.showCredentialsDialog) {
KeystoreCredentialsDialog(
onDismissRequest = vm::cancelKeystoreImport,
onSubmit = { alias, pass ->
onSubmit = { cn, pass ->
vm.viewModelScope.launch {
uiSafe(context, R.string.failed_to_import_keystore, "Failed to import keystore") {
val result = vm.tryKeystoreImport(alias, pass)
val result = vm.tryKeystoreImport(cn, pass)
if (!result) context.toast(context.getString(R.string.import_keystore_wrong_credentials))
}
}
@@ -382,7 +382,7 @@ fun KeystoreCredentialsDialog(
onDismissRequest: () -> Unit,
onSubmit: (String, String) -> Unit
) {
var alias by rememberSaveable { mutableStateOf("") }
var cn by rememberSaveable { mutableStateOf("") }
var pass by rememberSaveable { mutableStateOf("") }
AlertDialog(
@@ -390,7 +390,7 @@ fun KeystoreCredentialsDialog(
confirmButton = {
TextButton(
onClick = {
onSubmit(alias, pass)
onSubmit(cn, pass)
}
) {
Text(stringResource(R.string.import_keystore_dialog_button))
@@ -422,8 +422,8 @@ fun KeystoreCredentialsDialog(
color = MaterialTheme.colorScheme.onSurfaceVariant
)
OutlinedTextField(
value = alias,
onValueChange = { alias = it },
value = cn,
onValueChange = { cn = it },
label = { Text(stringResource(R.string.import_keystore_dialog_alias_field)) }
)
PasswordField(

View File

@@ -92,12 +92,6 @@ fun UpdatesSettingsScreen(
headline = R.string.show_manager_update_dialog_on_launch,
description = R.string.show_manager_update_dialog_on_launch_description
)
BooleanItem(
preference = vm.useManagerPrereleases,
headline = R.string.manager_prereleases,
description = R.string.manager_prereleases_description
)
}
}
}

View File

@@ -80,7 +80,6 @@ private val LightColorScheme = lightColorScheme(
fun ReVancedManagerTheme(
darkTheme: Boolean,
dynamicColor: Boolean,
pureBlackTheme: Boolean,
content: @Composable () -> Unit
) {
val colorScheme = when {
@@ -94,10 +93,6 @@ fun ReVancedManagerTheme(
darkTheme -> DarkColorScheme
else -> LightColorScheme
}.let {
if (darkTheme && pureBlackTheme)
it.copy(background = Color.Black, surface = Color.Black)
else it
}
val view = LocalView.current

View File

@@ -47,7 +47,7 @@ class AdvancedSettingsViewModel(
app.contentResolver.openOutputStream(target)!!.bufferedWriter().use { writer ->
val consumer = Redirect.Consume { flow ->
flow.onEach {
writer.write("${it}\n")
writer.write(it)
}.flowOn(Dispatchers.IO).collect()
}

View File

@@ -154,12 +154,12 @@ class ImportExportViewModel(
keystoreImportPath = null
}
suspend fun tryKeystoreImport(alias: String, pass: String) =
tryKeystoreImport(alias, pass, keystoreImportPath!!)
suspend fun tryKeystoreImport(cn: String, pass: String) =
tryKeystoreImport(cn, pass, keystoreImportPath!!)
private suspend fun tryKeystoreImport(alias: String, pass: String, path: Path): Boolean {
private suspend fun tryKeystoreImport(cn: String, pass: String, path: Path): Boolean {
path.inputStream().use { stream ->
if (keystoreManager.import(alias, pass, stream)) {
if (keystoreManager.import(cn, pass, stream)) {
app.toast(app.getString(R.string.import_keystore_success))
cancelKeystoreImport()
return true

View File

@@ -120,10 +120,6 @@ class MainViewModel(
settings.useDynamicTheme?.let { dynamicColor ->
prefs.dynamicColor.update(dynamicColor)
}
settings.usePrereleases?.let { prereleases ->
prefs.useManagerPrereleases.update(prereleases)
prefs.usePatchesPrereleases.update(prereleases)
}
settings.apiUrl?.let { api ->
prefs.api.update(api.removeSuffix("/"))
}
@@ -147,7 +143,7 @@ class MainViewModel(
settings.keystore?.let { keystore ->
val keystoreBytes = Base64.decode(keystore, Base64.DEFAULT)
keystoreManager.import(
"alias",
"ReVanced",
settings.keystorePassword,
keystoreBytes.inputStream()
)
@@ -163,7 +159,6 @@ class MainViewModel(
val keystorePassword: String,
val themeMode: Int? = null,
val useDynamicTheme: Boolean? = null,
val usePrereleases: Boolean? = null,
val apiUrl: String? = null,
val experimentalPatchesEnabled: Boolean? = null,
val patchesAutoUpdate: Boolean? = null,

View File

@@ -17,8 +17,6 @@ class UpdatesSettingsViewModel(
) : ViewModel() {
val managerAutoUpdates = prefs.managerAutoUpdates
val showManagerUpdateDialogOnLaunch = prefs.showManagerUpdateDialogOnLaunch
val useManagerPrereleases = prefs.useManagerPrereleases
val isConnected: Boolean
get() = network.isConnected()

View File

@@ -3,4 +3,4 @@
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
</adaptive-icon>

View File

@@ -5,8 +5,8 @@
<item quantity="other">%d patches</item>
</plurals>
<plurals name="patches_executed">
<item quantity="one">Execute %d patch</item>
<item quantity="other">Execute %d patches</item>
<item quantity="one">Executed %d patch</item>
<item quantity="other">Executed %d patches</item>
</plurals>
<plurals name="selected_count">
<item quantity="other">%d selected</item>

View File

@@ -1,17 +1,3 @@
<!--
Strings with new lines must be raw strings, where the string is wrapped in double quotes and new lines are regular line breaks and not \n
Raw strings still require escaping embedded double quotes, but single quote characters can be escaped or used as-is.
Raw strings are required because Crowdin AI translations regularly gets confused and
replace \n with an encoded new line character.
Bad:
<string name="summary_key">First \'item\' text\nSecond \"item\" text</string>
Good:
<string name="summary_key">"First 'item' text
Second \"item\" text"</string>
-->
<resources>
<string name="app_name">ReVanced Manager</string>
<string name="patcher">Patcher</string>
@@ -69,7 +55,7 @@ Second \"item\" text"</string>
<string name="network_metered_warning">You are currently on a metered connection. Data charges from your service provider may apply.</string>
<string name="apk_source_selector_item">Select APK source</string>
<string name="apk_source_auto">Using all APK downloaders</string>
<string name="apk_source_auto">Using all APK downloader</string>
<string name="apk_source_downloader">Using %s</string>
<string name="apk_source_installed">Using installed APK</string>
<string name="apk_source_local">Using a local APK file</string>
@@ -100,31 +86,21 @@ Second \"item\" text"</string>
<string name="contributors_description">View the contributors of ReVanced</string>
<string name="dynamic_color">Dynamic color</string>
<string name="dynamic_color_description">Adapt colors to the wallpaper</string>
<string name="pure_black_theme">Pure black theme</string>
<string name="pure_black_theme_description">Use pure black backgrounds for dark theme</string>
<string name="theme">Theme</string>
<string name="theme_description">Choose between light or dark theme</string>
<string name="safeguards">Safeguards</string>
<string name="patch_compat_check">Disable version compatibility check</string>
<string name="patch_compat_check_description">Do not restrict patches to compatible app versions</string>
<string name="patch_compat_check_confirmation">"Selecting incompatible patches can result in a broken app.
Do you want to proceed anyways?"</string>
<string name="patch_compat_check_description">The check restricts patches to compatible app versions</string>
<string name="patch_compat_check_confirmation">Selecting incompatible patches can result in a broken app.\n\nDo you want to proceed anyways?</string>
<string name="suggested_version_safeguard">Require suggested app version</string>
<string name="suggested_version_safeguard_description">Enforce selection of the suggested app version</string>
<string name="suggested_version_safeguard_confirmation">"Selecting an app that is not the suggested version may cause unexpected issues.
Do you want to proceed anyways?"</string>
<string name="suggested_version_safeguard_confirmation">Selecting an app that is not the suggested version may cause unexpected issues.\n\nDo you want to proceed anyways?</string>
<string name="patch_selection_safeguard">Allow changing patch selection and options</string>
<string name="patch_selection_safeguard_description">Do not prevent selecting or deselecting patches and customization of options</string>
<string name="patch_selection_safeguard_confirmation">"Changing the selection of patches may cause unexpected issues.
Enable anyways?"</string>
<string name="patch_selection_safeguard_confirmation">Changing the selection of patches may cause unexpected issues.\n\nEnable anyways?</string>
<string name="universal_patches_safeguard">Allow using universal patches</string>
<string name="universal_patches_safeguard_description">Do not prevent using universal patches</string>
<string name="universal_patches_safeguard_confirmation">"Universal patches are not as well tested as those that target specific apps.
Enable anyways?"</string>
<string name="universal_patches_safeguard_confirmation">Universal patches are not as well tested as those that target specific apps.\n\nEnable anyways?</string>
<string name="import_keystore">Import keystore</string>
<string name="import_keystore_description">Import a custom keystore</string>
<string name="import_keystore_dialog_title">Enter keystore credentials</string>
@@ -140,9 +116,7 @@ Enable anyways?"</string>
<string name="export_keystore_success">Exported keystore</string>
<string name="regenerate_keystore">Regenerate keystore</string>
<string name="regenerate_keystore_description">Generate a new keystore</string>
<string name="regenerate_keystore_dialog_description">"You are about to regenerate your keystore the manager will use during the patching process.
You will not be able to update the previously installed apps from this source."</string>
<string name="regenerate_keystore_dialog_description">You are about to regenerate your keystore the manager will use during the patching process.\n\nYou will not be able to update the previously installed apps from this source.</string>
<string name="regenerate_keystore_success">The keystore has been successfully replaced</string>
<string name="import_patch_selection">Import patch selection</string>
<string name="import_patch_selection_description">Import patch selection from a JSON file</string>
@@ -158,8 +132,8 @@ You will not be able to update the previously installed apps from this source."<
<string name="reset_patch_options_description">Reset the stored patch options</string>
<string name="reset_patch_selection_success">Patch selection has been reset</string>
<string name="patch_selection_reset_all">Reset patch selection globally</string>
<string name="patch_selection_reset_all_dialog_description">You are about to reset all patch selections. You will need to manually select each patch again.</string>
<string name="patch_selection_reset_all_description">Resets all patch selections</string>
<string name="patch_selection_reset_all_dialog_description">You are about to reset all the patch selections. You will need to manually select each patch again.</string>
<string name="patch_selection_reset_all_description">Resets all the patch selections</string>
<string name="patch_selection_reset_package">Reset patch selection for app</string>
<string name="patch_selection_reset_package_dialog_description">You are about to reset the patch selection for the app \"%s\". You will have to manually select each patch again.</string>
<string name="patch_selection_reset_package_description">Resets patch selection for a single app</string>
@@ -173,7 +147,7 @@ You will not be able to update the previously installed apps from this source."<
<string name="patch_options_reset_patches_dialog_description">You are about to reset the patch options for \"%s\". You will have to reapply each option again.</string>
<string name="patch_options_reset_patches_description">Resets the patch options for a specific collection of patches</string>
<string name="patch_options_reset_all">Reset patch options globally</string>
<string name="patch_options_reset_all_dialog_description">You are about to reset all patch options. You will have to reapply each option again.</string>
<string name="patch_options_reset_all_dialog_description">You are about to reset patch options. You will have to reapply each option again.</string>
<string name="patch_options_reset_all_description">Resets all patch options</string>
<string name="downloader_plugins">Plugins</string>
<string name="downloader_plugin_state_trusted">Trusted</string>
@@ -181,12 +155,10 @@ You will not be able to update the previously installed apps from this source."<
<string name="downloader_plugin_state_untrusted">Untrusted</string>
<string name="downloader_plugin_trust_dialog_title">Trust plugin?</string>
<string name="downloader_plugin_revoke_trust_dialog_title">Revoke trust?</string>
<string name="downloader_plugin_trust_dialog_body">Continuing will allow this plugin to run on your system.\n\nOnly enable this plugin if you trust it. Plugins can execute arbitrary code and may compromise your device.</string>
<string name="downloader_plugin_trust_dialog_signature">Signature:\n\n%s</string>
<string name="downloader_plugin_trust_dialog_plugin">Plugin:\n%s</string>
<string name="downloader_plugin_trust_dialog_body">Package name: %1$s\nSignature (SHA-256): %2$s</string>
<string name="downloader_plugin_delete_apps_title">Delete selected apps</string>
<string name="downloader_plugin_delete_apps_description">Are you sure you want to delete the selected apps?</string>
<string name="downloader_settings_no_apps">No downloaded apps found.</string>
<string name="downloader_settings_no_apps">No downloaded apps found</string>
<string name="search_apps">Search apps…</string>
<string name="loading_body">Loading…</string>
@@ -219,7 +191,7 @@ You will not be able to update the previously installed apps from this source."<
<string name="appearance">Appearance</string>
<string name="downloaded_apps">Downloaded apps</string>
<string name="process_runtime">Run Patcher in another process (experimental)</string>
<string name="process_runtime_description">This is faster and allows Patcher to use more memory</string>
<string name="process_runtime_description">This is faster and allows Patcher to use more memory.</string>
<string name="process_runtime_memory_limit">Patcher process memory limit</string>
<string name="process_runtime_memory_limit_description">The max amount of memory that the Patcher process can use (in megabytes)</string>
<string name="debug_logs_export">Export debug logs</string>
@@ -227,7 +199,7 @@ You will not be able to update the previously installed apps from this source."<
<string name="debug_logs_export_failed">Failed to export logs</string>
<string name="debug_logs_export_success">Exported logs</string>
<string name="api_url">API URL</string>
<string name="api_url_description">The API used to download necessary files</string>
<string name="api_url_description">The API used to download necessary files.</string>
<string name="api_url_dialog_title">Change API URL</string>
<string name="api_url_dialog_description">Change the API URL of ReVanced Manager. ReVanced Manager uses the API to download patches and updates.</string>
<string name="api_url_dialog_warning">ReVanced Manager connects to the API to download patches and updates. Make sure that you trust it.</string>
@@ -263,23 +235,14 @@ You will not be able to update the previously installed apps from this source."<
<string name="patch_selection_reset_toast">Patch selection and options has been reset to recommended defaults</string>
<string name="patch_options_reset_toast">Patch options have been reset</string>
<string name="non_suggested_version_warning_title">Non suggested version</string>
<string name="non_suggested_version_warning_description">"The version of the app you have selected does not match the suggested version.
Please use the suggested version: %s
To continue anyway, disable \"Require suggested app version\" in the advanced settings."</string>
<string name="non_suggested_version_warning_description">The version of the app you have selected does not match the suggested version.\nPlease use the suggested version: %s\n\nTo continue anyway, disable \"Require suggested app version\" in the advanced settings.</string>
<string name="selection_warning_title">Stop using defaults?</string>
<string name="selection_warning_description">"It is recommended to use the default patch selection and options. Changing them may result in unexpected issues.
You need to turn on \"Allow changing patch selection and options\" in the advanced settings before toggling patches."</string>
<string name="universal_patch_warning_description">"Universal patches have a more generalized use and do not work as reliably as patches that target specific apps. You may encounter issues while using them.
You need to turn on \"Allow using universal patches\" in the advanced settings before using universal patches."</string>
<string name="selection_warning_description">It is recommended to use the default patch selection and options. Changing them may result in unexpected issues.\n\nYou need to turn on \"Allow changing patch selection\" in the advanced settings before toggling patches.</string>
<string name="universal_patch_warning_description">Universal patches have a more generalized use and do not work as reliably as patches that target specific apps. You may encounter issues while using them.\n\nYou need to turn on \"Allow using universal patches\" in the advanced settings before using universal patches.</string>
<string name="this_version">This version</string>
<string name="universal">Any app</string>
<string name="search_patches">Search patches</string>
<string name="app_version_not_compatible">"This patch is not compatible with the selected app version (%1$s)
It is only compatible with the following version(s): %2$s"</string>
<string name="app_version_not_compatible">This patch is not compatible with the selected app version (%1$s).\n\nIt is only compatible with the following version(s): %2$s.</string>
<string name="continue_with_version">Continue with this version?</string>
<string name="version_not_compatible">Not all patches are compatible with this version (%s). Do you want to continue anyway?</string>
<string name="download_application">Download application?</string>
@@ -313,7 +276,7 @@ It is only compatible with the following version(s): %2$s"</string>
<string name="downloader_app_not_found">Downloader did not find the app</string>
<string name="downloader_error">Downloader error: %s</string>
<string name="downloader_no_plugins_installed">No downloader installed.</string>
<string name="downloader_no_plugins_available">There are downloaders installed but none are trusted. Check your settings.</string>
<string name="downloader_no_plugins_available">There are downloader installed but none is trusted. Check your settings.</string>
<string name="already_patched">Already patched</string>
<string name="patch_selector_sheet_filter_title">Filter</string>
@@ -355,7 +318,6 @@ It is only compatible with the following version(s): %2$s"</string>
<string name="patcher_notification_text">Tap to return to the patcher</string>
<string name="patcher_stop_confirm_title">Stop patcher</string>
<string name="patcher_stop_confirm_description">Are you sure you want to stop the patching process?</string>
<string name="patcher_install_in_progress">Installation is in progress. Please wait</string>
<string name="execute_patches">Execute patches</string>
<string name="executing_patch">Execute %s</string>
<string name="failed_to_execute_patch">Failed to execute %s</string>
@@ -406,8 +368,6 @@ It is only compatible with the following version(s): %2$s"</string>
<string name="manual_update_check_description">Manually check for updates</string>
<string name="update_checking_manager">Check for updates on launch</string>
<string name="update_checking_manager_description">Check for new versions of ReVanced Manager when the application starts</string>
<string name="manager_prereleases">Use pre-releases</string>
<string name="manager_prereleases_description">Use pre-release versions of ReVanced Manager</string>
<string name="changelog">View changelogs</string>
<string name="changelog_loading">Loading changelog</string>
<string name="changelog_download_fail">Failed to download changelog: %s</string>
@@ -421,8 +381,7 @@ It is only compatible with the following version(s): %2$s"</string>
<string name="save_with_count">Save (%1$s)</string>
<string name="update">Update</string>
<string name="empty">Empty</string>
<string name="installing_message">"Tap on <b>Update</b> when prompted.
ReVanced Manager will close when updating."</string>
<string name="installing_message">Tap on <b>Update</b> when prompted.\nReVanced Manager will close when updating.</string>
<string name="no_changelogs_found">No changelogs found</string>
<string name="just_now">Just now</string>
<string name="minutes_ago">%sm ago</string>
@@ -441,9 +400,7 @@ ReVanced Manager will close when updating."</string>
<string name="update_available_dialog_description">A new version of ReVanced Manager (%s) is available.</string>
<string name="failed_to_download_update">Failed to download update: %s</string>
<string name="download">Download</string>
<string name="download_confirmation_metered">"You are currently on a metered connection, and data charges from your service provider may apply.
Do you still want to continue?"</string>
<string name="download_confirmation_metered">You are currently on a metered connection, and data charges from your service provider may apply.\n\nDo you still want to continue?</string>
<string name="download_update_confirmation">Download update?</string>
<string name="no_contributors_found">No contributors found</string>
<string name="select">Select</string>
@@ -478,17 +435,13 @@ Do you still want to continue?"</string>
<string name="auto_update">Auto update</string>
<string name="add_patches">Add patches</string>
<string name="auto_update_description">Automatically update when a new version is available</string>
<string name="patches_prereleases">Use pre-releases</string>
<string name="patches_prereleases_description">Use pre-release versions of %s</string>
<string name="patches_url">Patches URL</string>
<string name="incompatible_patches_dialog">"These patches are not compatible with the selected app version (%1$s).
Click on the patches to see more details."</string>
<string name="incompatible_patches_dialog">These patches are not compatible with the selected app version (%1$s).\n\nClick on the patches to see more details.</string>
<string name="incompatible_patch">Incompatible patch</string>
<string name="any_version">Any</string>
<string name="never_show_again">Never show again</string>
<string name="show_manager_update_dialog_on_launch">Show update message on launch</string>
<string name="show_manager_update_dialog_on_launch_description">Show a popup notification whenever a new update is available on launch</string>
<string name="show_manager_update_dialog_on_launch_description">Shows a popup notification whenever there is a new update available on launch.</string>
<string name="failed_to_import_keystore">Failed to import keystore</string>
<string name="export">Export</string>
<string name="confirm">Confirm</string>

View File

@@ -13,9 +13,9 @@ Learn how to use ReVanced Manager to patch apps.
7. Tap on the `Install` button to install the patched app[^4]
[^1]: Here you can see all the apps that are supported by ReVanced.
You can also add custom apps by tapping on the `Select from storage` button at the top.
You can also add custom apps by tapping on the `+` button in the top right corner.
[^2]: It is recommended to use the default set of patches by tapping on the `Reset` button in the bottom right corner.
[^3]: By default, all available downloaders will be used to download the app.
[^3]: By default, all available downloader will be used to download the app.
If you want to use a specific downloader, you can change it here.
[^4]: You can export the patched app or the patch logs in the bottom left corner.

View File

@@ -16,7 +16,7 @@ Learn how to add new, manage existing or remove patches.
## ⏭️ What's next
The next page will explain how to manage downloaders.
The next page will explain how to update ReVanced Manager.
Continue: [🔄 Updating ReVanced Manager](2_4_managing_downloaders.md)
Continue: [🔄 Updating ReVanced Manager](2_4_updating.md)

View File

@@ -1,15 +0,0 @@
# 🧩 Managing downloaders
Learn how to manage downloaders.
Refer to the [template](https://github.com/ReVanced/revanced-manager-downloader-template) if you are developer who wants to create a plugin.
Downloaders are APK files and are installed, updated and uninstalled just like regular Android apps.
Downloaders can execute arbitrary code inside ReVanced Manager and must be marked as trusted before use. Manager will show a notification in the dashboard when a new downloader is discovered.
Trust can also be granted and revoked under `Settings` > `Downloads`.
## ⏭️ What's next
The next page will explain how to update ReVanced Manager.
Continue: [🔄 Updating ReVanced Manager](2_5_updating.md)

View File

@@ -9,10 +9,10 @@ Learn how to update ReVanced Manager.
3. Configure the update settings accordingly[^1]
[^1]: By default, ReVanced Manager will check for updates automatically on launch
and let you know when an update is available.
and let you when an update is available.
## ⏭️ What's next
The next page will explain how to configure ReVanced Manager.
Continue: [⚙️ Configuring ReVanced Manager](2_6_settings.md)
Continue: [⚙️ Configuring ReVanced Manager](2_5_settings.md)

View File

@@ -4,29 +4,29 @@ Learn how to configure ReVanced Manager.
## 🔧 Settings
- **Downloads**: Enable or disable ReVanced Manager downloader and manage past downloaded apps here
- **Import & export**: Import or export patch selections, patch options and the signing keystore
- **Downloads**: Enable or disable ReVanced Manager downloader and manage past downloaded apps here
- **Advanced**:
- **API URL**: Set the URL of the ReVanced API, ReVanced Manager will use
- **Disable version compatibility check**: Patching versions of apps the patches are explicitly compatible with is enforced.
Disabling this will allow patching versions of apps the patches are not explicitly compatible with
> ⚠️ Warning
> Patches may fail on app versions they are not explicitly compatible with.
> Patches may fail patching versions they are not explicitly compatible with.
> Unless you know what you are doing, it is recommended to keep this enabled.
- **Allow changing patch selection**: The default selection of patches is enforced.
Enabling this will allow you to change the patch selection
> ⚠️ Warning
> Changing the selection may cause unexpected issues.
> Unless you know what you are doing, it is recommended to keep this disabled.
- **Require suggested app version**: Specific versions of apps is enforced based on the patch selection automatically.
Disabling this will allow you to patch any version of apps
> ⚠️ Warning
> Patches not compatible with the selected version of the app will not be used.
> Unless you know what you are doing, it is recommended to keep this enabled.
- **Allow changing patch selection and options**: The default selection of patches is enforced.
Enabling this will allow you to change the patch selection
> ⚠️ Warning
> Changing the selection may cause unexpected issues.
> Unless you know what you are doing, it is recommended to keep this disabled.
- **Allow using universal patches**: Patches that do not specify compatibility with an app are forcibly disabled.
- **Allow universal patches**: Patches that do not specify compatibility with an app explicitly are forcibly disabled.
Enabling this will allow selecting such patches
> ⚠️ Warning
> Universal patches do not specify compatibility with an app and may not work on all apps regardless.
> Universal patches do not specify compatibility with an app explicitly may not work on all apps regardless.
> Unless you know what you are doing, it is recommended to keep this disabled.
- **About**: View more information and links about ReVanced and ReVanced Manager.

View File

@@ -1,6 +1,28 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
android.nonFinalResIds=false
# Task :app:assembleReleaseSignApk fails if this is set to true.
org.gradle.configuration-cache=false
org.gradle.caching=true
version=1.25.0-dev.1

View File

@@ -36,7 +36,6 @@ compose-icons = "1.2.4"
kotlin-process = "1.5.1"
hidden-api-stub = "4.3.3"
binary-compatibility-validator = "0.17.0"
semver-parser = "3.0.0"
[libraries]
# AndroidX Core
@@ -130,9 +129,6 @@ reorderable = { module = "sh.calvin.reorderable:reorderable", version.ref = "reo
# switch to br.com.devsrsouza.compose.icons after DevSrSouza/compose-icons#30 is merged
compose-icons-fontawesome = { group = "com.github.BenjaminHalko.compose-icons", name = "font-awesome", version.ref = "compose-icons" }
# Semantic versioning parser
semver-parser = { module = "io.github.z4kn4fein:semver", version.ref = "semver-parser" }
[plugins]
android-application = { id = "com.android.application", version.ref = "android-gradle-plugin" }
android-library = { id = "com.android.library", version.ref = "android-gradle-plugin" }

1593
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,10 @@
{
"private": true,
"workspaces": [
"api",
"app"
],
"devDependencies": {
"@anolilab/multi-semantic-release": "^2.0.3",
"semantic-release": "^24.2.7"
"@anolilab/multi-semantic-release": "^1.1.10",
"gradle-semantic-release-plugin": "^1.10.1",
"@saithodev/semantic-release-backmerge": "^4.0.1",
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/exec": "^6.0.3",
"@semantic-release/git": "^10.0.1"
}
}