Compare commits

..

402 Commits

Author SHA1 Message Date
semantic-release-bot
ffd08c737c chore: Release v1.26.0-dev.7 [skip ci]
# 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](e1b768c467))
2025-10-03 16:34:21 +00:00
Ushie
e1b768c467 fix: Improve consistency between pre-release toggles 2025-10-03 19:26:31 +03:00
semantic-release-bot
df6ecd27dd chore: Release v1.26.0-dev.6 [skip ci]
# 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](c327857823))

### Features

* Open contributor's GitHub profile when clicked ([#2775](https://github.com/ReVanced/revanced-manager/issues/2775)) ([2571cb8](2571cb8c11))
2025-10-03 15:55:06 +00:00
Ushie
2571cb8c11 feat: Open contributor's GitHub profile when clicked (#2775) 2025-10-03 18:47:32 +03:00
Ax333l
c327857823 fix: Broken version comparison 2025-10-03 17:44:07 +02:00
semantic-release-bot
03160ccef1 chore: Release v1.26.0-dev.5 [skip ci]
# 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](08cec674bb))
2025-10-03 15:37:24 +00:00
Ax333l
08cec674bb feat: Toggle to use pre-release versions of ReVanced Patches 2025-10-03 17:29:06 +02:00
semantic-release-bot
95fb97ec31 chore: Release v1.26.0-dev.4 [skip ci]
# 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](4753873866))
2025-10-03 14:34:30 +00:00
Ax333l
4753873866 fix: add newlines to debug logs 2025-10-03 16:26:54 +02:00
semantic-release-bot
ca322f2da8 chore: Release v1.26.0-dev.3 [skip ci]
# 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](d758964742))
2025-10-03 14:26:09 +00:00
Ushie
d758964742 feat: Toggle to use pre-release versions of ReVanced Manager (#2773) 2025-10-03 17:18:27 +03:00
semantic-release-bot
a592e0b302 chore: Release v1.26.0-dev.2 [skip ci]
# 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](aeab639b2b))
2025-10-03 13:38:38 +00:00
Ushie
aeab639b2b fix: Migration of keystore, by fixing mislabeling of alias as cn (#2769) 2025-10-03 16:31:05 +03:00
semantic-release-bot
4016ae732c chore: Release v1.26.0-dev.1 [skip ci]
# 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](e4f19b0c25))
* add bounds checks in patch selector ([483be5d](483be5d722))
* Add missing header for "Updates" settings ([#2642](https://github.com/ReVanced/revanced-manager/issues/2642)) ([d4d2056](d4d2056585))
* Allow different app version when downloading via plugin if setting is off ([#2579](https://github.com/ReVanced/revanced-manager/issues/2579)) ([59d233e](59d233e15c))
* always use default patch selection if customization is disabled ([cc77181](cc771817cb))
* android icon not loading in app selector ([deea682](deea682651))
* automatically focus search views ([d23d673](d23d673c47))
* available updates dialog list item color ([1a54313](1a54313c1d))
* Broken header padding in `AlertDialogExtended` when using an Icon ([8d939a6](8d939a6669))
* broken logo in about page on release builds ([ad775f3](ad775f3059))
* buildfile syntax ([#66](https://github.com/ReVanced/revanced-manager/issues/66)) ([5c17a78](5c17a78e46))
* bundles not loading on Android 14 ([56896d6](56896d6197))
* Change the title in the Update screen from "Updates" to "Update" ([5f23769](5f2376919b)), closes [#1960](https://github.com/ReVanced/revanced-manager/issues/1960)
* cleanup advanced settings screen ([02ea5c6](02ea5c6d4a))
* **Compose:** Adjusted universal patches safeguard and warnings ([#2550](https://github.com/ReVanced/revanced-manager/issues/2550)) ([663cf2d](663cf2d6b8))
* contributors screen fix ([#1256](https://github.com/ReVanced/revanced-manager/issues/1256)) ([dc73462](dc73462ac4))
* contributors screen repository name ([426b289](426b28932f))
* Correct preference description ([#2619](https://github.com/ReVanced/revanced-manager/issues/2619)) ([0096169](0096169af8))
* Correctly display universal patches warning ([#2570](https://github.com/ReVanced/revanced-manager/issues/2570)) ([24c4cd3](24c4cd3f99))
* correctly patch apk files ([c5cb18a](c5cb18a7ea))
* crash caused by compose inlining bug ([05fe058](05fe058151))
* crash when removing used bundles ([189c993](189c993ada))
* delete temporary files ([#1341](https://github.com/ReVanced/revanced-manager/issues/1341)) ([b03f7b1](b03f7b18a0))
* disable `WebView` history ([#1278](https://github.com/ReVanced/revanced-manager/issues/1278)) ([a811df9](a811df9547))
* display version from manifest ([#2634](https://github.com/ReVanced/revanced-manager/issues/2634)) ([1fb94b7](1fb94b711f))
* Do not poll battery optimization status ([#2491](https://github.com/ReVanced/revanced-manager/issues/2491)) ([26778f5](26778f57e6))
* don't store app list in parcel ([e7802ed](e7802ed3d7))
* dont crash when the bundle cannot be downloaded ([4d201f1](4d201f17f2))
* **downloader:** versions not loading correctly ([16c4290](16c4290f05))
* handle edge-to-edge properly in fullscreen dialogs ([eba92e2](eba92e2644))
* handle exceptions when checking for bundle updates ([1dd6738](1dd6738964))
* Handle open source licenses page crash ([#2569](https://github.com/ReVanced/revanced-manager/issues/2569)) ([f2ea007](f2ea00757a))
* hide patch button ([#1284](https://github.com/ReVanced/revanced-manager/issues/1284)) ([dadc546](dadc5462e3))
* Ignore long click when already in delete mode ([6f6296b](6f6296b8cd)), closes [#2503](https://github.com/ReVanced/revanced-manager/issues/2503)
* import bundles on another thread ([0383bd7](0383bd74f7))
* import export screen UX ([69c119d](69c119d545))
* Improve background running notification ([#2614](https://github.com/ReVanced/revanced-manager/issues/2614)) ([05444d8](05444d8824))
* improve bundle page strings ([2a63a61](2a63a6163a))
* improve keystore import error handling and show toast ([cd142a7](cd142a70d3))
* Inconsistent padding for battery optimisation warning ([6c3a99a](6c3a99a492))
* **installer:** make the correct column scrollable ([64496bf](64496bfbe7))
* **installer:** progress tracking ([f547bb7](f547bb7ab1))
* **installer:** properly track worker state ([#32](https://github.com/ReVanced/revanced-manager/issues/32)) ([de1ef23](de1ef23824))
* **installer:** save step incorrectly being marked as completed ([0264308](0264308b6d))
* **installer:** sign and install on threads ([3d59ee5](3d59ee51ac))
* jvm signature clash error ([ee0f342](ee0f342456))
* library info not being embedded ([8c9fe69](8c9fe6989f))
* load patch bundles earlier ([a2f9e2f](a2f9e2f1da))
* Match "Installation incompatible" dialog message with Flutter Manager ([#2231](https://github.com/ReVanced/revanced-manager/issues/2231)) ([fedaedf](fedaedfda1))
* minify crash on building release ([#1245](https://github.com/ReVanced/revanced-manager/issues/1245)) ([6561e4c](6561e4c97c))
* more android 34 fixes ([7fb1e27](7fb1e27617))
* move battery warning to dashboard ([3a05150](3a05150fa3))
* Move temporary files outside of the cache directory ([#2122](https://github.com/ReVanced/revanced-manager/issues/2122)) ([b93ecc0](b93ecc0db2))
* Offset badge ([c73fdfd](c73fdfdd2d))
* only perform haptics on events ([e55566d](e55566d3df))
* option state crash ([#1456](https://github.com/ReVanced/revanced-manager/issues/1456)) ([f183b6d](f183b6d8a6))
* parcel error for nullable types ([336eed3](336eed3a95))
* pass worker inputs without serialization ([#44](https://github.com/ReVanced/revanced-manager/issues/44)) ([059a72b](059a72b9dd))
* patch count remaining at zero when using process runtime ([#2542](https://github.com/ReVanced/revanced-manager/issues/2542)) ([f5e1e0b](f5e1e0b065))
* patch options reset button being broken ([e1647fd](e1647fdef0))
* Patch process cancelation dialog conditions ([#2554](https://github.com/ReVanced/revanced-manager/issues/2554)) ([e97b19d](e97b19d2b6))
* Patch selection screen padding ([#2533](https://github.com/ReVanced/revanced-manager/issues/2533)) ([cd2dbcc](cd2dbcc841))
* **patcher:** add notification and wakelock to worker; chore: add app icon ([8b6d32d](8b6d32dd7b))
* patches not being reloaded ([dccf861](dccf86163a))
* **patches selector:** copy the selected patches list ([70e49aa](70e49aaaa3))
* perform selected app operations in the correct order ([34cf848](34cf848baa))
* permission error when using installed app ([8767f0e](8767f0e99c))
* Playback Switch's Haptic Feedback ([#2639](https://github.com/ReVanced/revanced-manager/issues/2639)) ([9fdca5a](9fdca5a0af))
* process death resilience and account for android 11 bug ([#2355](https://github.com/ReVanced/revanced-manager/issues/2355)) ([83eeeae](83eeeae801))
* progress bar not updating ([dcaa38c](dcaa38c882))
* release builds not working properly ([6f6476e](6f6476e851))
* remove battery optimization notification if user grants the permission ([9863c51](9863c5161a))
* remove the unique constraint for patch bundle names ([ea29d0f](ea29d0f00c))
* Remove unnecessary screen padding ([8419f75](8419f75d59)), closes [#2062](https://github.com/ReVanced/revanced-manager/issues/2062)
* remove unused function preventing compilation ([2297e94](2297e94cb8))
* Reset cached theme on theme change to avoid broken colors ([#2527](https://github.com/ReVanced/revanced-manager/issues/2527)) ([9a82b78](9a82b78528))
* run blocking IO operations in the correct context ([969ddb7](969ddb7bef))
* run props flow on correct dispatcher ([#2035](https://github.com/ReVanced/revanced-manager/issues/2035)) ([d3d4c27](d3d4c27f6d))
* Screen turns off while patching due to wrong WakeLock ([#2147](https://github.com/ReVanced/revanced-manager/issues/2147)) ([4de5340](4de534094a))
* scrolling in patch selector ([154f036](154f036fe9))
* Selected patch count ([#2559](https://github.com/ReVanced/revanced-manager/issues/2559)) ([a91ff60](a91ff60533))
* serialization not working ([4d04ae0](4d04ae088c))
* show available and selected patches in patch selector screen ([61f1ee0](61f1ee0627))
* show install button when installation has been cancelled ([93f4a5b](93f4a5bb7c))
* Show selection warning also on patch option ([#2643](https://github.com/ReVanced/revanced-manager/issues/2643)) ([3b82767](3b82767a89))
* sources screen being misaligned during transitions ([2ac3d5c](2ac3d5c483))
* specify `multithreadingDexFileWriter` in `PatcherOptions` ([#1402](https://github.com/ReVanced/revanced-manager/issues/1402)) ([3f362b6](3f362b605f))
* Support patching on ARMv7 by updating AAPT2 ([#2084](https://github.com/ReVanced/revanced-manager/issues/2084)) ([15b47f9](15b47f9bb6))
* Transparent status on fullscreen dialog ([#2654](https://github.com/ReVanced/revanced-manager/issues/2654)) ([a8820a4](a8820a4daf))
* Turn off filters by default ([#2079](https://github.com/ReVanced/revanced-manager/issues/2079)) ([44f8b1f](44f8b1fb6b))
* typo in string name `import_keystore_description` ([#1273](https://github.com/ReVanced/revanced-manager/issues/1273)) ([933e69e](933e69e21e))
* **ui:** make entire patches view button selectable ([#1271](https://github.com/ReVanced/revanced-manager/issues/1271)) ([83cdaae](83cdaaee18))
* Updates popup shows incorrect names ([#1283](https://github.com/ReVanced/revanced-manager/issues/1283)) ([c879faf](c879faf2eb))
* Use `compatible` rather than `support` when referring to patch compatibility ([#2422](https://github.com/ReVanced/revanced-manager/issues/2422)) ([8b3c4eb](8b3c4eb91c))
* use correct `getViewModel` ([5b6ae80](5b6ae800fd))
* use correct classes to determine option type ([e833bf4](e833bf4ad1))
* use correct directory ([9e1ebb3](9e1ebb3902))
* Use FAB instead of ListItem to patch in App Overview ([6ace71b](6ace71b739)), closes [#1995](https://github.com/ReVanced/revanced-manager/issues/1995)
* use proper update icon ([b59a161](b59a16191a))
* use ReVanced ring logo in about section ([#1302](https://github.com/ReVanced/revanced-manager/issues/1302)) ([933a4a3](933a4a3220))
* Use the correct icon in API URL dialog ([c22e5b4](c22e5b4051)), closes [#1972](https://github.com/ReVanced/revanced-manager/issues/1972)
* use upsert when modifying installed apps ([90edf1d](90edf1ddd0))
* **VersionSelector:** use correct LazyColumn item key ([413fe98](413fe980a8))

### Features

* **about screen:** complete about screen ([1d6b34a](1d6b34a39f))
* Add `isScrollingUp` support for ScrollState ([bf049c3](bf049c3c1a))
* add ability to share debug logs ([feb0ca4](feb0ca4cf3))
* add checkboxes to the downloaded apps page ([ca93524](ca93524be0))
* Add confirm dialogs when toggling dangerous settings ([#2072](https://github.com/ReVanced/revanced-manager/issues/2072)) ([6643276](66432764cf))
* Add confirmation dialog to "Reset" options ([#2576](https://github.com/ReVanced/revanced-manager/issues/2576)) ([f32ffbb](f32ffbb6f2))
* Add downloader plugin system ([#2041](https://github.com/ReVanced/revanced-manager/issues/2041)) ([ca38737](ca38737783))
* add external process runtime ([#1799](https://github.com/ReVanced/revanced-manager/issues/1799)) ([0d73e0c](0d73e0cd32))
* Add haptic feedback ([#1457](https://github.com/ReVanced/revanced-manager/issues/1457)) ([76e0c95](76e0c95187))
* Add installer status dialog ([#1473](https://github.com/ReVanced/revanced-manager/issues/1473)) ([43b3743](43b3743213))
* add network checks for features that require it ([f3f8bc4](f3f8bc4ec2))
* add patch bundle info screen ([#55](https://github.com/ReVanced/revanced-manager/issues/55)) ([8ae4e85](8ae4e850da))
* add patches selector bottom sheet ([#1360](https://github.com/ReVanced/revanced-manager/issues/1360)) ([f6fb534](f6fb534e04))
* add required options screen ([#2378](https://github.com/ReVanced/revanced-manager/issues/2378)) ([3a63e42](3a63e42df9))
* Add reset button to custom API ([#2076](https://github.com/ReVanced/revanced-manager/issues/2076)) ([df52a7b](df52a7bdef)), closes [#2051](https://github.com/ReVanced/revanced-manager/issues/2051)
* Add sensitivity to `isScrollingUp` ([f6ca4e9](f6ca4e9555))
* add social links ([#1294](https://github.com/ReVanced/revanced-manager/issues/1294)) ([7df3350](7df3350acb))
* add toast feedback to the bundle update button ([ea50e65](ea50e65ab1))
* add user agent ([#1382](https://github.com/ReVanced/revanced-manager/issues/1382)) ([3aea6cb](3aea6cbaec))
* advanced settings page with device info ([#51](https://github.com/ReVanced/revanced-manager/issues/51)) ([86e4244](86e42449eb))
* allow bundles to use classes from other bundles ([#1951](https://github.com/ReVanced/revanced-manager/issues/1951)) ([af8e2b4](af8e2b44c0))
* allow user to save logs ([a008cf5](a008cf5dd1))
* animate the arrow button ([db070b1](db070b125b))
* app downloader ([#43](https://github.com/ReVanced/revanced-manager/issues/43)) ([1f1a480](1f1a480d51))
* app selector screen ([373cc4b](373cc4bbb1))
* **app-selector:** show patchable installed apps first ([#1496](https://github.com/ReVanced/revanced-manager/issues/1496)) ([afb0f80](afb0f80de5))
* armv7 warning ([2ffcaec](2ffcaec724))
* Automatic language detection ([#2032](https://github.com/ReVanced/revanced-manager/issues/2032)) ([36a1c3f](36a1c3f368))
* backend ([45a54d1](45a54d1608))
* better installer ui ([#29](https://github.com/ReVanced/revanced-manager/issues/29)) ([14888f9](14888f9da7))
* **bundles tab:** add BackHandler ([a9171e1](a9171e17bd))
* Change "Update" to "Show" in Update Available notification ([5c43413](5c434137d3)), closes [#1959](https://github.com/ReVanced/revanced-manager/issues/1959)
* change appID and name of debug builds ([5b3e9e5](5b3e9e595c))
* **Changelogs:** overall improvement ([#1429](https://github.com/ReVanced/revanced-manager/issues/1429)) ([2a3590d](2a3590ddd2))
* check for updates on startup ([#1462](https://github.com/ReVanced/revanced-manager/issues/1462)) ([bb2164e](bb2164e1a9))
* check if the version being used is the recommended version ([#1675](https://github.com/ReVanced/revanced-manager/issues/1675)) ([9d961f6](9d961f6a52))
* Collapse ExtendedFAB on scroll ([#1630](https://github.com/ReVanced/revanced-manager/issues/1630)) ([b5c1f6d](b5c1f6d732))
* **Compose:** Add confirmation dialog on multiple operations  ([#2529](https://github.com/ReVanced/revanced-manager/issues/2529)) ([2671e68](2671e68004))
* **Compose:** hide developer settings ([#2551](https://github.com/ReVanced/revanced-manager/issues/2551)) ([0030c7a](0030c7a788))
* **Compose:** Improve patches selector tab by adding the bundle version ([#2545](https://github.com/ReVanced/revanced-manager/issues/2545)) ([3710675](3710675ac0))
* **Compose:** Move developer options to top level ([#2528](https://github.com/ReVanced/revanced-manager/issues/2528)) ([cedc6ad](cedc6ad49f))
* contributors screen ([#42](https://github.com/ReVanced/revanced-manager/issues/42)) ([3f54381](3f54381d30))
* **Contributors Screen:** implement design from Figma ([#1465](https://github.com/ReVanced/revanced-manager/issues/1465)) ([d5bdc29](d5bdc293f3))
* Dashboard Screen ([#18](https://github.com/ReVanced/revanced-manager/issues/18)) ([a127b95](a127b959ea))
* disable filter chips when there are no patches ([fd520bb](fd520bba70))
* dont ask for root on launch ([9562d80](9562d80bfd))
* download apps in patcher screen ([#73](https://github.com/ReVanced/revanced-manager/issues/73)) ([a854221](a854221969))
* experimental patches setting ([b07fd23](b07fd2321d))
* filter options for patches ([62bccd1](62bccd1504))
* finish implementing the sources system ([#70](https://github.com/ReVanced/revanced-manager/issues/70)) ([858b0ec](858b0ec5b4))
* get bundle information from jar manifest ([#2027](https://github.com/ReVanced/revanced-manager/issues/2027)) ([60fdec9](60fdec9804))
* hide tabs when 1 bundle is used ([41268ca](41268ca80b))
* hide unfinished pages in release mode ([c199801](c199801fb7))
* Highlight links in Markdown ([7bf8988](7bf89887e4)), closes [#1962](https://github.com/ReVanced/revanced-manager/issues/1962)
* implement DI ([7fa7b9d](7fa7b9d53a))
* implement more patch option types ([#2015](https://github.com/ReVanced/revanced-manager/issues/2015)) ([b18c678](b18c678354))
* implement navigation ([7fc6ec5](7fc6ec5c2c))
* implement Submit Issue button ([#1276](https://github.com/ReVanced/revanced-manager/issues/1276)) ([a269a39](a269a39aa4))
* improve accessibility ([#64](https://github.com/ReVanced/revanced-manager/issues/64)) ([39b08e5](39b08e5201))
* Improve APK file name formatting on save ([#2421](https://github.com/ReVanced/revanced-manager/issues/2421)) ([a53a8ba](a53a8ba627))
* improve bundle dialog UI ([409c888](409c888d52))
* Improve bundle info screen design ([#2548](https://github.com/ReVanced/revanced-manager/issues/2548)) ([55524f7](55524f7284))
* Improve custom API URL dialog ([#2033](https://github.com/ReVanced/revanced-manager/issues/2033)) ([7dae562](7dae562819))
* Improve device information in debugging section ([d889677](d889677b29)), closes [#1977](https://github.com/ReVanced/revanced-manager/issues/1977)
* Improve initial update popup wording ([5901372](5901372523)), 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](49b4bbbf0b))
* Improve patch bundle screen ([#2070](https://github.com/ReVanced/revanced-manager/issues/2070)) ([a907528](a907528a20))
* improve patcher screen labels ([f4d6c60](f4d6c60b9e))
* improve patcher UI ([#1494](https://github.com/ReVanced/revanced-manager/issues/1494)) ([429b428](429b428f67))
* Improve Settings order ([#2060](https://github.com/ReVanced/revanced-manager/issues/2060)) ([fa86c1a](fa86c1a0bb))
* improve the safeguards ([#2038](https://github.com/ReVanced/revanced-manager/issues/2038)) ([e5b414e](e5b414e277))
* Improve unsupported patch warnings ([#2066](https://github.com/ReVanced/revanced-manager/issues/2066)) ([3c23d57](3c23d573bf)), closes [#2052](https://github.com/ReVanced/revanced-manager/issues/2052)
* Improve update screen design ([#2487](https://github.com/ReVanced/revanced-manager/issues/2487)) ([7007010](7007010f14))
* Improve update setting tile titles ([e2623d6](e2623d6d79)), closes [#1968](https://github.com/ReVanced/revanced-manager/issues/1968)
* improve UX for failed or missing bundles ([49f8510](49f851022d))
* improved compose stability ([8c40119](8c40119609))
* improved dashboard screen ([5c2f9d9](5c2f9d91a6))
* in-app updater ([#25](https://github.com/ReVanced/revanced-manager/issues/25)) ([d71a4bf](d71a4bf3c3))
* **installer:** adjust arrow icon size ([e997255](e997255cf3))
* **installer:** adjust step icon size and alignment ([cfcabf6](cfcabf6ef1))
* **installer:** apk signing and installation ([da32ff9](da32ff954a))
* **installer:** sign apk in patcher worker ([c003c3c](c003c3c324))
* **Installer:** use BottomAppBar ([#1428](https://github.com/ReVanced/revanced-manager/issues/1428)) ([ceb7623](ceb7623794))
* integrate revanced patcher ([#22](https://github.com/ReVanced/revanced-manager/issues/22)) ([caeabfc](caeabfc91b))
* keystore import/export ([#30](https://github.com/ReVanced/revanced-manager/issues/30)) ([fd0ec6c](fd0ec6c6a7))
* **koin:** use the android logger ([f30333e](f30333e753))
* licenses screen ([#47](https://github.com/ReVanced/revanced-manager/issues/47)) ([e3cb056](e3cb056858))
* make bundles selectable ([#1237](https://github.com/ReVanced/revanced-manager/issues/1237)) ([a246863](a246863a89))
* Make patch bundles list scrollable ([#2322](https://github.com/ReVanced/revanced-manager/issues/2322)) ([a5c8a23](a5c8a23f9f))
* more info for the select from application screen ([#81](https://github.com/ReVanced/revanced-manager/issues/81)) ([3f446f8](3f446f8236))
* move plugin api to another repository ([55e7ebf](55e7ebf4fc))
* Move safeguards above patcher preference group ([9f7eaa2](9f7eaa2123))
* move update to notification card ([#1917](https://github.com/ReVanced/revanced-manager/issues/1917)) ([b80f94b](b80f94b77b))
* **NotificationCard:** rewrite & consistent usage ([#1426](https://github.com/ReVanced/revanced-manager/issues/1426)) ([f8aafa0](f8aafa0503))
* Open the app-specific manage all files permission dialog ([#2148](https://github.com/ReVanced/revanced-manager/issues/2148)) ([a3f31ea](a3f31ea657))
* Order bundles by number of patches ([bb5d414](bb5d414abb))
* patch bundle sources system ([#24](https://github.com/ReVanced/revanced-manager/issues/24)) ([9675a27](9675a2777b))
* patch options ([#45](https://github.com/ReVanced/revanced-manager/issues/45)) ([8540d30](8540d30196))
* patch options UI ([#80](https://github.com/ReVanced/revanced-manager/issues/80)) ([0a1acd2](0a1acd24e3))
* **patch-selector:** default patches selection ([#1272](https://github.com/ReVanced/revanced-manager/issues/1272)) ([a17c2de](a17c2de228))
* **patch-selector:** remove TODO about an unplanned feature ([4924eae](4924eaef80))
* **patcher:** Improve installation ([#2185](https://github.com/ReVanced/revanced-manager/issues/2185)) ([3bd4f0d](3bd4f0d8f3))
* patches selector screen ([55e871a](55e871aa7d))
* Progressive AlertDialog for adding bundles ([9a01273](9a01273c43)), closes [#1992](https://github.com/ReVanced/revanced-manager/issues/1992)
* ProGuard ([d84e6a3](d84e6a3ffc))
* Purple default theme ([#1601](https://github.com/ReVanced/revanced-manager/issues/1601)) ([0616666](0616666d5e))
* Redesign the patches screen ([#2381](https://github.com/ReVanced/revanced-manager/issues/2381)) ([8dc4e5b](8dc4e5b89e))
* remember patch options ([#1449](https://github.com/ReVanced/revanced-manager/issues/1449)) ([90db765](90db765c9a))
* remove dead help icons ([3bb071d](3bb071d80d))
* Remove tag from changelog ([d2119d3](d2119d3643))
* Rename "Patch bundle" to "Patches" ([#2541](https://github.com/ReVanced/revanced-manager/issues/2541)) ([2cdd6d1](2cdd6d1843))
* rename debug build to `ReVanced Manager (dev)` ([d3417ad](d3417adbeb))
* rename main bundle to `Default` ([e44d3fd](e44d3fdee4))
* rename package to `app.revanced.manager` ([5ec97f4](5ec97f4a85))
* Rename strings ([e127845](e1278452b9))
* rename ViewModels for consistency ([064a54e](064a54eaf0))
* Reorder Import & Export settings ([#2403](https://github.com/ReVanced/revanced-manager/issues/2403)) ([2697077](2697077fc8))
* ReVanced theme colors ([59b894d](59b894dce4))
* revert to blue theme colors ([5f4c958](5f4c9584a9))
* root installation ([#1243](https://github.com/ReVanced/revanced-manager/issues/1243)) ([62e934c](62e934c403))
* save patch options and selected patches in bundle ([#50](https://github.com/ReVanced/revanced-manager/issues/50)) ([23162f6](23162f6233))
* save patch selection using room db ([#38](https://github.com/ReVanced/revanced-manager/issues/38)) ([1efccda](1efccda3f5))
* Screen slide transition ([#2396](https://github.com/ReVanced/revanced-manager/issues/2396)) ([2de16e1](2de16e18e8))
* Scrollbars ([#1479](https://github.com/ReVanced/revanced-manager/issues/1479)) ([b5558ea](b5558ea3ff))
* Select bundle type before adding bundle ([#1490](https://github.com/ReVanced/revanced-manager/issues/1490)) ([88e860c](88e860cf01))
* selected app info page ([#1395](https://github.com/ReVanced/revanced-manager/issues/1395)) ([b69a369](b69a369d4e))
* Set app ownership when installing apps ([#2558](https://github.com/ReVanced/revanced-manager/issues/2558)) ([7c410fe](7c410fef45))
* settings migration (compose) ([#1309](https://github.com/ReVanced/revanced-manager/issues/1309)) ([bf1d628](bf1d628944))
* settings screen ([b7d53cf](b7d53cfca8))
* **settings screen:** add battery optimization notification ([5754864](57548641e7))
* **settings screen:** match typography from figma ([948a6d1](948a6d1440))
* **settings:** move experimental patches option to advanced ([805d440](805d440450))
* **Settings:** use SettingsListItem consistently and overall improvements ([#1427](https://github.com/ReVanced/revanced-manager/issues/1427)) ([5e35893](5e35893883))
* show installed app in version selector ([1ab1e46](1ab1e4682f))
* Show manager update dialog ([#2069](https://github.com/ReVanced/revanced-manager/issues/2069)) ([113a74d](113a74d270)), 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](8d53180d86))
* show toast when no patches are selected ([8aa70d3](8aa70d350e))
* splash screen ([60a5a11](60a5a11c71))
* store patched apps ([#79](https://github.com/ReVanced/revanced-manager/issues/79)) ([b14285b](b14285b2c8))
* switch to androidx.navigation ([#2362](https://github.com/ReVanced/revanced-manager/issues/2362)) ([7438f45](7438f45903))
* switch to Preferences DataStore ([#60](https://github.com/ReVanced/revanced-manager/issues/60)) ([1852799](18527999b5))
* switch to revanced api v4 ([7e858a2](7e858a244c))
* switch to the new api ([#75](https://github.com/ReVanced/revanced-manager/issues/75)) ([a55160e](a55160e7c6))
* TopAppBar scroll behavior ([#2397](https://github.com/ReVanced/revanced-manager/issues/2397)) ([dc51d61](dc51d6134d))
* **Update Screen:** changelogs & handle states ([#1464](https://github.com/ReVanced/revanced-manager/issues/1464)) ([3af26e7](3af26e7065))
* **update screen:** complete main update screen ([553af83](553af83139))
* updater changelogs ([#48](https://github.com/ReVanced/revanced-manager/issues/48)) ([6dbcd62](6dbcd6293e))
* updater UI and code improvements ([#1597](https://github.com/ReVanced/revanced-manager/issues/1597)) ([a12cae7](a12cae7299))
* Use "Debug" and "Debug signed" for build names respectively ([5133f02](5133f02ad6))
* Use correct casing in module description ([59b4c0b](59b4c0b2d2))
* use revanced api for changelogs ([686eb40](686eb40cb0))
* Use simpler strings ([83d33e8](83d33e87e3))
* View bundle patches ([#2065](https://github.com/ReVanced/revanced-manager/issues/2065)) ([089f200](089f200fe6))

### Reverts

* downgrade Kotlin to 1.8.21 ([fc90bbc](fc90bbc27c))
2025-10-02 17:46:22 +00:00
Ax333l
a1cb18f9c8 feat: Overhaul ReVanced Manager from Flutter to Jetpack Compose (#1409) 2025-10-02 17:14:26 +02:00
Ax333l
8d9c2439dd docs: add information about downloaders 2025-10-01 22:59:12 +02:00
Pun Butrach
c1e90a45cd chore: ads.fund verification (#2761)
This is ads fund verification from main branch of revanced manager (flutter) which is diverged from dev branch.
2025-10-02 03:08:49 +07:00
brosssh
775c2d5cde ci: Adjust to release app and api module respectively (#2675)
Co-authored-by: semantic-release-bot <semantic-release-bot@martynus.net>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
Co-authored-by: Ax333l <main@axelen.xyz>
2025-10-01 21:53:55 +02:00
kitadai31
de27b4b109 build: Clean up ProGuard rules (#2663) 2025-10-01 21:53:54 +02:00
Pun Butrach
b58a11f9f1 ci: Remove fetch-depth from checkout (#2628) 2025-10-01 21:53:53 +02:00
Ax333l
2297e94cb8 fix: remove unused function preventing compilation 2025-10-01 21:53:52 +02:00
Ax333l
a84ab244c7 chore: remove unused dependency 2025-10-01 21:53:51 +02:00
oSumAtrIX
2cdd6d1843 feat: Rename "Patch bundle" to "Patches" (#2541)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-10-01 21:53:50 +02:00
brosssh
3b82767a89 fix: Show selection warning also on patch option (#2643) 2025-10-01 21:53:49 +02:00
Ax333l
af8e2b44c0 feat: allow bundles to use classes from other bundles (#1951) 2025-10-01 21:53:47 +02:00
Pun Butrach
a8820a4daf fix: Transparent status on fullscreen dialog (#2654) 2025-10-01 21:53:47 +02:00
oSumAtrIX
e1278452b9 feat: Rename strings 2025-10-01 21:53:46 +02:00
brosssh
d4d2056585 fix: Add missing header for "Updates" settings (#2642) 2025-10-01 21:53:45 +02:00
brosssh
55524f7284 feat: Improve bundle info screen design (#2548) 2025-10-01 21:53:44 +02:00
brosssh
cd2dbcc841 fix: Patch selection screen padding (#2533) 2025-10-01 21:53:43 +02:00
Pun Butrach
9fdca5a0af fix: Playback Switch's Haptic Feedback (#2639)
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2025-10-01 21:53:42 +02:00
kitadai31
05444d8824 fix: Improve background running notification (#2614) 2025-10-01 21:53:41 +02:00
brosssh
59d233e15c fix: Allow different app version when downloading via plugin if setting is off (#2579)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-10-01 21:53:40 +02:00
Ax333l
1fb94b711f fix: display version from manifest (#2634) 2025-10-01 21:53:39 +02:00
aAbed
0096169af8 fix: Correct preference description (#2619) 2025-10-01 21:53:38 +02:00
brosssh
7c410fef45 feat: Set app ownership when installing apps (#2558) 2025-10-01 21:53:37 +02:00
brosssh
a91ff60533 fix: Selected patch count (#2559) 2025-10-01 21:53:36 +02:00
brosssh
0ce49582f1 fix: CI flows (#2598) 2025-10-01 21:53:35 +02:00
brosssh
f32ffbb6f2 feat: Add confirmation dialog to "Reset" options (#2576) 2025-10-01 21:53:34 +02:00
oSumAtrIX
3851983a44 ci: Upload artifacts when building pull requests 2025-10-01 21:53:33 +02:00
Brosssh
e97b19d2b6 fix: Patch process cancelation dialog conditions (#2554) 2025-10-01 21:53:32 +02:00
Brosssh
24c4cd3f99 fix: Correctly display universal patches warning (#2570) 2025-10-01 21:53:31 +02:00
Brosssh
f2ea00757a fix: Handle open source licenses page crash (#2569) 2025-10-01 21:53:30 +02:00
oSumAtrIX
51132731a4 ci: Set build attestation subject name 2025-10-01 21:53:29 +02:00
oSumAtrIX
bf311664d5 build: Do not sign all releases with debug key 2025-10-01 21:53:28 +02:00
oSumAtrIX
581f7922ed docs: Update docs with all manager features and improve consistency 2025-10-01 21:53:27 +02:00
oSumAtrIX
83d33e87e3 feat: Use simpler strings 2025-10-01 21:53:26 +02:00
oSumAtrIX
537e0b5bed 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-10-01 21:53:25 +02:00
Brosssh
663cf2d6b8 fix(Compose): Adjusted universal patches safeguard and warnings (#2550) 2025-10-01 21:53:24 +02:00
Ax333l
0030c7a788 feat(Compose): hide developer settings (#2551) 2025-10-01 21:53:23 +02:00
Ax333l
eba92e2644 fix: handle edge-to-edge properly in fullscreen dialogs 2025-10-01 21:53:22 +02:00
Brosssh
2671e68004 feat(Compose): Add confirmation dialog on multiple operations (#2529) 2025-10-01 21:53:21 +02:00
Robert
6e08e9dc39 refactor: Rename settings screens for consistency (#2547) 2025-10-01 21:53:20 +02:00
Brosssh
3710675ac0 feat(Compose): Improve patches selector tab by adding the bundle version (#2545) 2025-10-01 21:53:19 +02:00
oSumAtrIX
244a8f4e17 ci: Adjust and modernize workflow files to match other repos 2025-10-01 21:53:18 +02:00
oSumAtrIX
015a2df457 docs: Adjust issue templates to match other repos 2025-10-01 21:53:17 +02:00
oSumAtrIX
8686c058ce docs: Add contribution guidelines and adjust README 2025-10-01 21:53:16 +02:00
oSumAtrIX
5c21ec6eb5 build: Update Gradle Wrapper 2025-10-01 21:53:15 +02:00
Ax333l
f5e1e0b065 fix: patch count remaining at zero when using process runtime (#2542) 2025-10-01 21:53:14 +02:00
Robert
bb5d414abb feat: Order bundles by number of patches 2025-10-01 21:53:13 +02:00
oSumAtrIX
bd07435d4b style: Apply formatting 2025-10-01 21:53:12 +02:00
oSumAtrIX
54c56f1d81 build: Sign releases using keystore if available 2025-10-01 21:53:11 +02:00
oSumAtrIX
5133f02ad6 feat: Use "Debug" and "Debug signed" for build names respectively 2025-10-01 21:53:10 +02:00
oSumAtrIX
9f7eaa2123 feat: Move safeguards above patcher preference group 2025-10-01 21:53:09 +02:00
Brosssh
9a82b78528 fix: Reset cached theme on theme change to avoid broken colors (#2527) 2025-10-01 21:53:08 +02:00
Brosssh
cedc6ad49f feat(Compose): Move developer options to top level (#2528) 2025-10-01 21:53:07 +02:00
oSumAtrIX
4d95a29a1c build: Remove repos that are not required 2025-10-01 21:53:06 +02:00
Ushie
6f6296b8cd fix: Ignore long click when already in delete mode
closes #2503
2025-10-01 21:53:05 +02:00
Ax333l
f3f8bc4ec2 feat: add network checks for features that require it 2025-10-01 21:53:04 +02:00
Ax333l
55e7ebf4fc feat: move plugin api to another repository 2025-10-01 21:53:03 +02:00
kitadai31
26778f57e6 fix: Do not poll battery optimization status (#2491) 2025-10-01 21:53:01 +02:00
Ushie
7007010f14 feat: Improve update screen design (#2487) 2025-10-01 21:53:01 +02:00
Ushie
8b3c4eb91c fix: Use compatible rather than support when referring to patch compatibility (#2422) 2025-10-01 21:52:59 +02:00
Ushie
a53a8ba627 feat: Improve APK file name formatting on save (#2421) 2025-10-01 21:52:59 +02:00
dependabot[bot]
f07f75a55f build(deps): bump the gradle-compose group with 16 updates (#2407) 2025-10-01 21:52:58 +02:00
Ushie
2697077fc8 feat: Reorder Import & Export settings (#2403) 2025-10-01 21:52:57 +02:00
Ushie
dc51d6134d feat: TopAppBar scroll behavior (#2397) 2025-10-01 21:52:56 +02:00
Pun Butrach
a9a21fd15a ci: Generate release artifact provenance (#2324)
Signed-off-by: validcube <pun.butrach@gmail.com>
2025-10-01 21:52:55 +02:00
Robert
cd142a70d3 fix: improve keystore import error handling and show toast 2025-10-01 21:52:54 +02:00
validcube
ac0625892d build: Enable pseudo locale for debug variant 2025-10-01 21:52:53 +02:00
validcube
7f5a291c99 chore: Update project's dependencies to latest 2025-10-01 21:52:52 +02:00
Robert
93f4a5bb7c fix: show install button when installation has been cancelled 2025-10-01 21:52:51 +02:00
Ushie
2de16e18e8 feat: Screen slide transition (#2396) 2025-10-01 21:52:50 +02:00
Ushie
c73fdfdd2d fix: Offset badge 2025-10-01 21:52:49 +02:00
validcube
bdfb5a9462 build: Bump AGP to 8.8.0
build: Bump AGP to 8.8.0
2025-10-01 21:52:48 +02:00
Pun Butrach
ca918eea46 docs: Merge documentation from Flutter to Compose 2025-10-01 21:52:47 +02:00
Tornike Khintibidze
8dc4e5b89e feat: Redesign the patches screen (#2381) 2025-10-01 21:52:46 +02:00
Ax333l
1a54313c1d fix: available updates dialog list item color 2025-10-01 21:52:45 +02:00
Ax333l
a3604579fe refactor: use EventEffect for legacy import 2025-10-01 21:52:44 +02:00
Ax333l
3a63e42df9 feat: add required options screen (#2378) 2025-10-01 21:52:43 +02:00
aAbed
66432764cf feat: Add confirm dialogs when toggling dangerous settings (#2072)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-10-01 21:52:42 +02:00
Ax333l
7ef496b98c chore: add .kotlin to gitignore 2025-10-01 21:52:41 +02:00
Ax333l
9863c5161a fix: remove battery optimization notification if user grants the permission 2025-10-01 21:52:40 +02:00
Ax333l
7438f45903 feat: switch to androidx.navigation (#2362) 2025-10-01 21:52:39 +02:00
Ax333l
5662863a64 refactor: remove unnecessary function 2025-10-01 21:52:38 +02:00
Ax333l
426b28932f fix: contributors screen repository name 2025-10-01 21:52:37 +02:00
Ax333l
83eeeae801 fix: process death resilience and account for android 11 bug (#2355) 2025-10-01 21:52:36 +02:00
kitadai31
4de534094a fix: Screen turns off while patching due to wrong WakeLock (#2147) 2025-10-01 21:52:35 +02:00
Ax333l
ca38737783 feat: Add downloader plugin system (#2041) 2025-10-01 21:52:34 +02:00
Ax333l
7e858a244c feat: switch to revanced api v4 2025-10-01 21:52:32 +02:00
Pun Butrach
dbe5c44ec3 chore: Nitpick on misspelling of comment 2025-10-01 21:52:31 +02:00
somni
a5c8a23f9f feat: Make patch bundles list scrollable (#2322) 2025-10-01 21:52:30 +02:00
Ax333l
f92cb9e191 chore: update dependencies
🦀 integrations are gone! 🦀
2025-10-01 21:52:29 +02:00
Ax333l
e55566d3df fix: only perform haptics on events 2025-10-01 21:52:28 +02:00
Benjamin
76e0c95187 feat: Add haptic feedback (#1457)
Co-authored-by: Ushie <ushiekane@gmail.com>
2025-10-01 21:52:26 +02:00
kitadai31
fedaedfda1 fix: Match "Installation incompatible" dialog message with Flutter Manager (#2231) 2025-10-01 21:52:25 +02:00
alieRN
3bd4f0d8f3 feat(patcher): Improve installation (#2185) 2025-10-01 21:52:24 +02:00
oSumAtrIX
43b3743213 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-10-01 21:52:23 +02:00
Ushie
089f200fe6 feat: View bundle patches (#2065) 2025-10-01 21:52:22 +02:00
kitadai31
a3f31ea657 feat: Open the app-specific manage all files permission dialog (#2148) 2025-10-01 21:52:21 +02:00
Ushie
a907528a20 feat: Improve patch bundle screen (#2070) 2025-10-01 21:52:20 +02:00
Pun Butrach
fa86c1a0bb feat: Improve Settings order (#2060)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
Co-authored-by: Ax333l <main@axelen.xyz>
2025-10-01 21:52:19 +02:00
Ax333l
ea29d0f00c fix: remove the unique constraint for patch bundle names 2025-10-01 21:52:17 +02:00
kitadai31
b93ecc0db2 fix: Move temporary files outside of the cache directory (#2122) 2025-10-01 21:52:16 +02:00
Ushie
55be7a6a9c refactor: Add parameters for custom rotation values in ArrowButton 2025-10-01 21:52:15 +02:00
validcube
95efff8b66 ci: Actually enable caching of Gradle 2025-10-01 21:52:14 +02:00
aAbed
44f8b1fb6b fix: Turn off filters by default (#2079) 2025-10-01 21:52:13 +02:00
aAbed
e4f19b0c25 fix: ExtendedFloatingActionButton not accessible by screen readers (#2080) 2025-10-01 21:52:12 +02:00
Ushie
3c23d573bf feat: Improve unsupported patch warnings (#2066)
Closes #2052
2025-10-01 21:52:11 +02:00
Robert
61f1ee0627 fix: show available and selected patches in patch selector screen 2025-10-01 21:52:10 +02:00
Ushie
df52a7bdef feat: Add reset button to custom API (#2076)
Closes #2051
2025-10-01 21:52:09 +02:00
Ushie
113a74d270 feat: Show manager update dialog (#2069)
Closes #1963, closes #1958
2025-10-01 21:52:08 +02:00
oSumAtrIX
15b47f9bb6 fix: Support patching on ARMv7 by updating AAPT2 (#2084) 2025-10-01 21:52:07 +02:00
Ushie
e2623d6d79 feat: Improve update setting tile titles
Closes #1968
2025-10-01 21:52:06 +02:00
Pun Butrach
79a513f94b build: Enable Gradle Configuration Cache (#2059) 2025-10-01 21:52:06 +02:00
Ax333l
cc771817cb fix: always use default patch selection if customization is disabled 2025-10-01 21:52:05 +02:00
Robert
deea682651 fix: android icon not loading in app selector 2025-10-01 21:52:03 +02:00
Pun Butrach
7dae562819 feat: Improve custom API URL dialog (#2033)
Signed-off-by: validcube <pun.butrach@gmail.com>
2025-10-01 21:52:02 +02:00
Ushie
8d939a6669 fix: Broken header padding in AlertDialogExtended when using an Icon 2025-10-01 21:52:01 +02:00
Ushie
8419f75d59 fix: Remove unnecessary screen padding
Closes #2062
2025-10-01 21:52:00 +02:00
Ushie
d2119d3643 feat: Remove tag from changelog 2025-10-01 21:51:59 +02:00
Ushie
9a01273c43 feat: Progressive AlertDialog for adding bundles
Closes #1992
2025-10-01 21:51:58 +02:00
Ushie
c22e5b4051 fix: Use the correct icon in API URL dialog
Closes #1972
2025-10-01 21:51:57 +02:00
Ushie
f6ca4e9555 feat: Add sensitivity to isScrollingUp 2025-10-01 21:51:56 +02:00
Ushie
bf049c3c1a feat: Add isScrollingUp support for ScrollState 2025-10-01 21:51:55 +02:00
Ushie
6ace71b739 fix: Use FAB instead of ListItem to patch in App Overview
Closes #1995
2025-10-01 21:51:54 +02:00
Ushie
d889677b29 feat: Improve device information in debugging section
Closes #1977
2025-10-01 21:51:53 +02:00
Ushie
5f2376919b fix: Change the title in the Update screen from "Updates" to "Update"
Closes #1960
2025-10-01 21:51:52 +02:00
Ushie
5c434137d3 feat: Change "Update" to "Show" in Update Available notification
Closes #1959
2025-10-01 21:51:51 +02:00
Ushie
7bf89887e4 feat: Highlight links in Markdown
Closes #1962
2025-10-01 21:51:50 +02:00
Ushie
5901372523 feat: Improve initial update popup wording
Closes #1956
2025-10-01 21:51:49 +02:00
Ushie
537b7084e0 chore: Remove unused ARMv7 AAPT binary
Closes #1954
2025-10-01 21:51:48 +02:00
Ushie
45d64117bf refactor: Improve naming consistency in libs.version.toml
Closes #1953
2025-10-01 21:51:47 +02:00
validcube
6c3a99a492 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-10-01 21:51:45 +02:00
validcube
ea007adecd refactor: Use TextButton instead of FilledButton for consistency 2025-10-01 21:51:44 +02:00
Pun Butrach
72cd8ebca8 ci: Bump dependencies to latest (#2039) 2025-10-01 21:51:43 +02:00
Ax333l
7ab191ed2b chore: update dependencies 2025-10-01 21:51:42 +02:00
Ax333l
3a05150fa3 fix: move battery warning to dashboard 2025-10-01 21:51:41 +02:00
Ax333l
e5b414e277 feat: improve the safeguards (#2038) 2025-10-01 21:51:40 +02:00
Ax333l
d3d4c27f6d fix: run props flow on correct dispatcher (#2035) 2025-10-01 21:51:39 +02:00
Pun Butrach
36a1c3f368 feat: Automatic language detection (#2032) 2025-10-01 21:51:38 +02:00
Ax333l
2a63a6163a fix: improve bundle page strings 2025-10-01 21:51:37 +02:00
Ax333l
02ea5c6d4a fix: cleanup advanced settings screen 2025-10-01 21:51:36 +02:00
Ax333l
9562d80bfd feat: dont ask for root on launch 2025-10-01 21:51:35 +02:00
Ax333l
49f851022d feat: improve UX for failed or missing bundles 2025-10-01 21:51:34 +02:00
Ax333l
b18c678354 feat: implement more patch option types (#2015) 2025-10-01 21:51:33 +02:00
Ax333l
189c993ada fix: crash when removing used bundles 2025-10-01 21:51:32 +02:00
Ax333l
69c119d545 fix: import export screen UX 2025-10-01 21:51:31 +02:00
Ax333l
feb0ca4cf3 feat: add ability to share debug logs 2025-10-01 21:51:29 +02:00
Ax333l
0383bd74f7 fix: import bundles on another thread 2025-10-01 21:51:28 +02:00
Ax333l
60fdec9804 feat: get bundle information from jar manifest (#2027) 2025-10-01 21:51:27 +02:00
Ax333l
483be5d722 fix: add bounds checks in patch selector 2025-10-01 21:51:26 +02:00
Robert
e44d3fdee4 feat: rename main bundle to Default 2025-10-01 21:51:25 +02:00
Robert
b59a16191a fix: use proper update icon 2025-10-01 21:51:24 +02:00
Robert
f4d6c60b9e feat: improve patcher screen labels 2025-10-01 21:51:23 +02:00
Robert
154f036fe9 fix: scrolling in patch selector 2025-10-01 21:51:22 +02:00
Robert
d3417adbeb feat: rename debug build to ReVanced Manager (dev) 2025-10-01 21:51:21 +02:00
Robert
16c4290f05 fix(downloader): versions not loading correctly 2025-10-01 21:51:20 +02:00
Robert
d23d673c47 fix: automatically focus search views 2025-10-01 21:51:19 +02:00
Robert
b80f94b77b feat: move update to notification card (#1917) 2025-10-01 21:51:17 +02:00
Robert
5f4c9584a9 feat: revert to blue theme colors 2025-10-01 21:51:17 +02:00
Ax333l
9a085f4091 refactor: fix more warnings 2025-10-01 21:51:16 +02:00
Ax333l
8d7886f7eb build(deps): update ksp 2025-10-01 21:51:15 +02:00
Ax333l
c21076f2fb refactor: replace deprecated functions 2025-10-01 21:51:13 +02:00
Ax333l
05fe058151 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-10-01 21:51:12 +02:00
dependabot[bot]
752310fe94 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-10-01 21:51:11 +02:00
dependabot[bot]
75500bbc43 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-10-01 21:51:10 +02:00
dependabot[bot]
84013ffca2 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-10-01 21:51:09 +02:00
dependabot[bot]
9da798dac1 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-10-01 21:51:08 +02:00
dependabot[bot]
d622208b17 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-10-01 21:51:07 +02:00
Ax333l
c5cb18a7ea fix: correctly patch apk files 2025-10-01 21:51:06 +02:00
Ax333l
0d73e0cd32 feat: add external process runtime (#1799) 2025-10-01 21:51:05 +02:00
Ax333l
9d961f6a52 feat: check if the version being used is the recommended version (#1675) 2025-10-01 21:51:04 +02:00
Benjamin
7df3350acb 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-10-01 21:51:03 +02:00
Benjamin
858dd99ffa 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-10-01 21:51:02 +02:00
Benjamin
757e132321 chore: upgrade dependencies (#1670) 2025-10-01 21:51:01 +02:00
Ax333l
413fe980a8 fix(VersionSelector): use correct LazyColumn item key 2025-10-01 21:51:00 +02:00
Benjamin
1aba6bc874 refactor: Disable update for dev build (#1673)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2025-10-01 21:50:59 +02:00
Ushie
b5c1f6d732 feat: Collapse ExtendedFAB on scroll (#1630) 2025-10-01 21:50:57 +02:00
Ax333l
ea50e65ab1 feat: add toast feedback to the bundle update button 2025-10-01 21:50:56 +02:00
Ax333l
e1647fdef0 fix: patch options reset button being broken 2025-10-01 21:50:55 +02:00
Ax333l
0b362e3393 refactor: use consistent wording for the version compat check 2025-10-01 21:50:53 +02:00
Pun Butrach
159461356e docs(security): init (#1612)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-10-01 21:50:52 +02:00
Ax333l
b1206cb663 refactor: fix terminology and wording related to patches (#1623) 2025-10-01 21:50:50 +02:00
Ushie
b5558ea3ff feat: Scrollbars (#1479) 2025-10-01 21:50:49 +02:00
Robert
dcaa38c882 fix: progress bar not updating 2025-10-01 21:50:48 +02:00
Robert
429b428f67 feat: improve patcher UI (#1494) 2025-10-01 21:50:47 +02:00
Ax333l
a12cae7299 feat: updater UI and code improvements (#1597) 2025-10-01 21:50:46 +02:00
Ushie
88e860cf01 feat: Select bundle type before adding bundle (#1490) 2025-10-01 21:50:45 +02:00
Benjamin
0616666d5e feat: Purple default theme (#1601) 2025-10-01 21:50:44 +02:00
Benjamin
2700d45e4d chore: upgrade AGP to 8.2.0 + migrate deprecated functions (#1574) 2025-10-01 21:50:43 +02:00
Ax333l
c3a32a1142 chore(deps): update jetpack compose 2025-10-01 21:50:42 +02:00
aAbed
afb0f80de5 feat(app-selector): show patchable installed apps first (#1496) 2025-10-01 21:50:41 +02:00
validcube
4aaa88e353 docs: update revanced url 2025-10-01 21:50:40 +02:00
validcube
359095a6f8 build: bump Gradle to v8.5
build: update Gradle wrapper
2025-10-01 21:50:39 +02:00
validcube
e1c3d61ec6 refactor: slight formatting of build.gradle.kts 2025-10-01 21:50:38 +02:00
validcube
72b7d24b33 chore(template): update label name for feature 2025-10-01 21:50:38 +02:00
validcube
0ccc2c13ac 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-10-01 21:50:37 +02:00
Ax333l
fa414ce6ee chore(deps): bump revanced patcher and library 2025-10-01 21:50:35 +02:00
Benjamin
3f362b605f fix: specify multithreadingDexFileWriter in PatcherOptions (#1402)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-10-01 21:50:34 +02:00
Ax333l
a2f9e2f1da fix: load patch bundles earlier 2025-10-01 21:50:33 +02:00
Ushie
3af26e7065 feat(Update Screen): changelogs & handle states (#1464)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-10-01 21:50:32 +02:00
Ushie
d5bdc293f3 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-10-01 21:50:31 +02:00
Ax333l
336eed3a95 fix: parcel error for nullable types 2025-10-01 21:50:30 +02:00
oSumAtrIX
59b4c0b2d2 feat: Use correct casing in module description 2025-10-01 21:50:30 +02:00
Ax333l
0934b24591 chore: bump patcher 2025-10-01 21:50:29 +02:00
Robert
bb2164e1a9 feat: check for updates on startup (#1462) 2025-10-01 21:50:27 +02:00
Ushie
2a3590ddd2 feat(Changelogs): overall improvement (#1429) 2025-10-01 21:50:26 +02:00
Ushie
ceb7623794 feat(Installer): use BottomAppBar (#1428) 2025-10-01 21:50:25 +02:00
Benjamin
f183b6d8a6 fix: option state crash (#1456)
Co-authored-by: Ax333l <main@axelen.xyz>
2025-10-01 21:50:24 +02:00
Ax333l
a6174eee8f refactor(ui-components): deduplicate colors and move to settings folder 2025-10-01 21:50:23 +02:00
Ushie
f8aafa0503 feat(NotificationCard): rewrite & consistent usage (#1426) 2025-10-01 21:50:22 +02:00
Ushie
5e35893883 feat(Settings): use SettingsListItem consistently and overall improvements (#1427) 2025-10-01 21:50:21 +02:00
Ax333l
90db765c9a feat: remember patch options (#1449) 2025-10-01 21:50:20 +02:00
Benjamin
e61c98ca59 chore: add issue template (#1432) 2025-10-01 21:50:19 +02:00
Ax333l
c003c3c324 feat(installer): sign apk in patcher worker 2025-10-01 21:50:18 +02:00
Ax333l
5a3a619d16 fix: use correct checksum 2025-10-01 21:50:17 +02:00
Benjamin
89addf3f78 chore: upgrade dependencies (#1401) 2025-10-01 21:50:16 +02:00
Ax333l
34cf848baa fix: perform selected app operations in the correct order 2025-10-01 21:50:15 +02:00
Ax333l
a9171e17bd feat(bundles tab): add BackHandler 2025-10-01 21:50:14 +02:00
Ax333l
2e64022229 docs: clarify license 2025-10-01 21:50:13 +02:00
Ax333l
8aa70d350e feat: show toast when no patches are selected 2025-10-01 21:50:12 +02:00
Ax333l
ca93524be0 feat: add checkboxes to the downloaded apps page 2025-10-01 21:50:11 +02:00
Ax333l
7fb1e27617 fix: more android 34 fixes 2025-10-01 21:50:10 +02:00
Ax333l
1dd6738964 fix: handle exceptions when checking for bundle updates 2025-10-01 21:50:09 +02:00
Ax333l
4924eaef80 feat(patch-selector): remove TODO about an unplanned feature 2025-10-01 21:50:08 +02:00
Ax333l
56896d6197 fix: bundles not loading on Android 14 2025-10-01 21:50:07 +02:00
Ax333l
ee0f342456 fix: jvm signature clash error 2025-10-01 21:50:06 +02:00
Ax333l
90edf1ddd0 fix: use upsert when modifying installed apps 2025-10-01 21:50:04 +02:00
Ax333l
b69a369d4e feat: selected app info page (#1395) 2025-10-01 21:50:03 +02:00
Ax333l
663d21c6af refactor: move mount code to when block 2025-10-01 21:50:02 +02:00
Benjamin
dadc5462e3 fix: hide patch button (#1284) 2025-10-01 21:50:01 +02:00
Benjamin
3aea6cbaec feat: add user agent (#1382) 2025-10-01 21:50:00 +02:00
Ax333l
8425b6fa81 chore: bump patcher 2025-10-01 21:49:59 +02:00
Ax333l
c62f772284 chore: bump compose 2025-10-01 21:49:58 +02:00
Ax333l
ad775f3059 fix: broken logo in about page on release builds 2025-10-01 21:49:57 +02:00
Ax333l
c199801fb7 feat: hide unfinished pages in release mode 2025-10-01 21:49:56 +02:00
Ax333l
2ffcaec724 feat: armv7 warning 2025-10-01 21:49:55 +02:00
Ax333l
08eb995220 refactor(downloaders): improve file system code (#1379) 2025-10-01 21:49:54 +02:00
Benjamin
bf1d628944 feat: settings migration (compose) (#1309) 2025-10-01 21:49:53 +02:00
Ax333l
f6fb534e04 feat: add patches selector bottom sheet (#1360) 2025-10-01 21:49:51 +02:00
Ax333l
686eb40cb0 feat: use revanced api for changelogs 2025-10-01 21:49:49 +02:00
Ax333l
b03f7b18a0 fix: delete temporary files (#1341) 2025-10-01 21:49:48 +02:00
Ax333l
e833bf4ad1 fix: use correct classes to determine option type
I can't believe this happened
2025-10-01 21:49:47 +02:00
Ax333l
805d440450 feat(settings): move experimental patches option to advanced 2025-10-01 21:49:46 +02:00
Ax333l
e997255cf3 feat(installer): adjust arrow icon size 2025-10-01 21:49:45 +02:00
Ax333l
cfcabf6ef1 feat(installer): adjust step icon size and alignment 2025-10-01 21:49:44 +02:00
Ax333l
7af6c79076 chore: switch to revanced library and bump patcher (#1314) 2025-10-01 21:49:42 +02:00
Ax333l
a17c2de228 feat(patch-selector): default patches selection (#1272) 2025-10-01 21:49:41 +02:00
Ax333l
3bb071d80d feat: remove dead help icons
These never did anything and were removed from the figma a while ago.
2025-10-01 21:49:40 +02:00
Ax333l
9950d85779 chore: fully remove idea project files 2025-10-01 21:49:39 +02:00
Benjamin Halko
e7ec239783 fix: remove misc.xml and kotlinc.xml 2025-10-01 21:49:38 +02:00
Benjamin
3246269937 docs: init (#1224) 2025-10-01 21:49:37 +02:00
Benjamin
85692f8596 ci: Add release workflow (#1235) 2025-10-01 21:49:36 +02:00
Benjamin
c879faf2eb fix: Updates popup shows incorrect names (#1283) 2025-10-01 21:49:35 +02:00
Benjamin
933a4a3220 fix: use ReVanced ring logo in about section (#1302) 2025-10-01 21:49:33 +02:00
Benjamin
a269a39aa4 feat: implement Submit Issue button (#1276) 2025-10-01 21:49:32 +02:00
Benjamin
cff9c5ed09 refactor: update progress onBackClick function (#1277) 2025-10-01 21:49:32 +02:00
Benjamin
a811df9547 fix: disable WebView history (#1278) 2025-10-01 21:49:31 +02:00
Benjamin
83cdaaee18 fix(ui): make entire patches view button selectable (#1271) 2025-10-01 21:49:30 +02:00
Benjamin Halko
5b3e9e595c feat: change appID and name of debug builds 2025-10-01 21:49:29 +02:00
Benjamin Halko
97aa8c06c8 ci: build pull requests (#1228) 2025-10-01 21:49:28 +02:00
Benjamin
933e69e21e fix: typo in string name import_keystore_description (#1273) 2025-10-01 21:49:27 +02:00
Benjamin
dc73462ac4 fix: contributors screen fix (#1256) 2025-10-01 21:49:26 +02:00
Patryk Miś
ad903533f8 chore: update dependencies (#1247) 2025-10-01 21:49:25 +02:00
Robert
62e934c403 feat: root installation (#1243) 2025-10-01 21:49:24 +02:00
Benjamin
6561e4c97c fix: minify crash on building release (#1245) 2025-10-01 21:49:23 +02:00
Benjamin
ac98ef834a fix: providers.gradleProperty (#1223) 2025-10-01 21:49:22 +02:00
Tyff
a246863a89 feat: make bundles selectable (#1237) 2025-10-01 21:49:21 +02:00
Pun Butrach
39b5b87c40 ci(config): appreciation for first-time contributors
Show appreciation message for new contributors
2025-10-01 21:49:20 +02:00
Benjamin
35595fb4bc docs: update readme badges (#1227) 2025-10-01 21:49:19 +02:00
Pun Butrach
02fb47d3b5 ci(release): don't build when not necessary
Add paths-ignore to all markdown files, and .idea folder
2025-10-01 21:49:18 +02:00
Pun Butrach
eef50888bb 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-10-01 21:49:17 +02:00
Ax333l
9b3974414c chore: bump kotlinx.serialization plugin and patcher 2025-10-01 21:49:16 +02:00
Patryk Miś
88deadcf08 build: updates (#85) 2025-10-01 21:49:15 +02:00
Ax333l
bad847d89b fix(deps): use correct work-runtime version string 2025-10-01 21:49:14 +02:00
Tyff
3f446f8236 feat: more info for the select from application screen (#81) 2025-10-01 21:49:12 +02:00
Pun Butrach
31cbab209c ci(release): migrate from node12 to node16
This bump `actions/upload-artifact`@v2 to `actions/upload-artifact`@v3
2025-10-01 21:49:11 +02:00
Robert
b14285b2c8 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-10-01 21:49:10 +02:00
Palm
8e28f06e26 ci(release): use correct vars context object
why am i so stupid
2025-10-01 21:49:08 +02:00
Palm
5b46c58af9 ci(release): no longer store keystore alias in secrets
fixes an issue where GitHub Actions logs would be censored
2025-10-01 21:49:07 +02:00
Ax333l
dccf86163a fix: patches not being reloaded 2025-10-01 21:49:05 +02:00
Ax333l
8767f0e99c fix: permission error when using installed app 2025-10-01 21:49:04 +02:00
Ax333l
0a1acd24e3 feat: patch options UI (#80) 2025-10-01 21:49:02 +02:00
Ax333l
a55160e7c6 feat: switch to the new api (#75) 2025-10-01 21:49:00 +02:00
Ax333l
6436483206 chore: bump patcher 2025-10-01 21:48:58 +02:00
Ax333l
409c888d52 feat: improve bundle dialog UI 2025-10-01 21:48:57 +02:00
Ax333l
858b0ec5b4 feat: finish implementing the sources system (#70) 2025-10-01 21:48:55 +02:00
Ax333l
8c9fe6989f fix: library info not being embedded 2025-10-01 21:48:54 +02:00
Pun Butrach
17d1874381 ci(release): task naming consistency 2025-10-01 21:48:53 +02:00
CnC-Robert
e7802ed3d7 fix: don't store app list in parcel 2025-10-01 21:48:51 +02:00
Ax333l
f547bb7ab1 fix(installer): progress tracking 2025-10-01 21:48:50 +02:00
Robert
bfcd1fb977 ci: init 2025-10-01 21:48:49 +02:00
CnC-Robert
1ab1e4682f feat: show installed app in version selector 2025-10-01 21:48:47 +02:00
Robert
a854221969 feat: download apps in patcher screen (#73) 2025-10-01 21:48:46 +02:00
Pun
ab42b946ef 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-10-01 21:48:45 +02:00
Tyff
8ae4e850da feat: add patch bundle info screen (#55) 2025-10-01 21:48:43 +02:00
Ax333l
4d04ae088c fix: serialization not working 2025-10-01 21:48:42 +02:00
Patryk Miś
5c17a78e46 fix: buildfile syntax (#66)
Signed-off-by: Patryk Miś <foss@patrykmis.com>
2025-10-01 21:48:40 +02:00
Patryk Miś
3492dc4e83 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-10-01 21:48:39 +02:00
Patryk Miś
39b08e5201 feat: improve accessibility (#64)
* Label Back button
* Mark group section headings as headings

Signed-off-by: Patryk Miś <foss@patrykmis.com>
2025-10-01 21:48:38 +02:00
Ax333l
18527999b5 feat: switch to Preferences DataStore (#60) 2025-10-01 21:48:36 +02:00
CnC-Robert
fd520bba70 feat: disable filter chips when there are no patches 2025-10-01 21:48:35 +02:00
CnC-Robert
59b894dce4 feat: ReVanced theme colors 2025-10-01 21:48:34 +02:00
Ax333l
6f6476e851 fix: release builds not working properly 2025-10-01 21:48:31 +02:00
Rom Reviewer
37c1754098 chore: migrate dependencies to version catalogs (#58) 2025-10-01 21:48:30 +02:00
Robert
1f1a480d51 feat: app downloader (#43) 2025-10-01 21:48:29 +02:00
Pun Butrach
6cf51d71c5 build: update gradle to v8.2.1 2025-10-01 21:48:28 +02:00
Pun
06ef9dee44 docs(readme): minor changes to how badges works
* Better description for the repository license badge

* Clicking on badges open you the relevant url
2025-10-01 21:48:27 +02:00
Ax333l
49b4bbbf0b feat: improve keystore UI and UX (#52) 2025-10-01 21:48:25 +02:00
Pun Butrach
fc90bbc27c 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-10-01 21:48:23 +02:00
Ax333l
86e42449eb feat: advanced settings page with device info (#51) 2025-10-01 21:48:23 +02:00
Pun Butrach
45142841d5 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-10-01 21:48:22 +02:00
Ax333l
3d59ee51ac 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-10-01 21:48:20 +02:00
Ax333l
6dbcd6293e feat: updater changelogs (#48)
---------

Co-authored-by: Aunali321 <aunvakil.aa@gmail.com>
2025-10-01 21:48:18 +02:00
Ax333l
a008cf5dd1 feat: allow user to save logs 2025-10-01 21:48:16 +02:00
Ax333l
23162f6233 feat: save patch options and selected patches in bundle (#50) 2025-10-01 21:48:15 +02:00
Ax333l
8540d30196 feat: patch options (#45) 2025-10-01 21:48:13 +02:00
Ax333l
f06da2ba56 refactor: use getDir instead of filesDir directly 2025-10-01 21:48:12 +02:00
Ax333l
9e1ebb3902 fix: use correct directory 2025-10-01 21:48:11 +02:00
Ax333l
2aec6e1e55 build: bump patcher 2025-10-01 21:48:09 +02:00
Pun Butrach
6134ed78b4 build: update gradle to v8.2 2025-10-01 21:48:08 +02:00
Ax333l
e3cb056858 feat: licenses screen (#47) 2025-10-01 21:48:06 +02:00
Ax333l
eb2270673d chore: update links in about page 2025-10-01 21:48:05 +02:00
Ax333l
db070b125b feat: animate the arrow button 2025-10-01 21:48:04 +02:00
Ax333l
a510d59e64 refactor: use correct coroutine scopes 2025-10-01 21:48:03 +02:00
Ax333l
0264308b6d fix(installer): save step incorrectly being marked as completed 2025-10-01 21:48:02 +02:00
Ax333l
2ac3d5c483 fix: sources screen being misaligned during transitions 2025-10-01 21:47:59 +02:00
Tyff
3f54381d30 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-10-01 21:47:58 +02:00
Ax333l
059a72b9dd fix: pass worker inputs without serialization (#44)
Because androidx.work.Data sucks and causes our app to crash.
2025-10-01 21:47:57 +02:00
Ax333l
64496bfbe7 fix(installer): make the correct column scrollable 2025-10-01 21:47:56 +02:00
Ax333l
b07fd2321d feat: experimental patches setting 2025-10-01 21:47:54 +02:00
Ax333l
1efccda3f5 feat: save patch selection using room db (#38) 2025-10-01 21:47:52 +02:00
Ax333l
b9231b4de0 refactor: better PatchBundle docs and naming 2025-10-01 21:47:50 +02:00
Ax333l
1a164ebe30 build: bump patcher 2025-10-01 21:47:48 +02:00
Ax333l
8d53180d86 feat: show stacktrace in installer ui (#36) 2025-10-01 21:47:47 +02:00
CnC-Robert
62bccd1504 feat: filter options for patches 2025-10-01 21:47:45 +02:00
Ax333l
969ddb7bef fix: run blocking IO operations in the correct context 2025-10-01 21:47:42 +02:00
Ax333l
8b6d32dd7b fix(patcher): add notification and wakelock to worker; chore: add app icon 2025-10-01 21:47:41 +02:00
Ax333l
fd0ec6c6a7 feat: keystore import/export (#30) 2025-10-01 21:47:40 +02:00
Ax333l
de1ef23824 fix(installer): properly track worker state (#32) 2025-10-01 21:47:38 +02:00
Ax333l
f30333e753 feat(koin): use the android logger 2025-10-01 21:47:37 +02:00
CnC-Robert
d84e6a3ffc feat: ProGuard 2025-10-01 21:47:36 +02:00
CnC-Robert
5ec97f4a85 feat: rename package to app.revanced.manager 2025-10-01 21:47:34 +02:00
CnC-Robert
8c40119609 feat: improved compose stability 2025-10-01 21:47:33 +02:00
CnC-Robert
5b6ae800fd fix: use correct getViewModel 2025-10-01 21:47:32 +02:00
CnC-Robert
064a54eaf0 feat: rename ViewModels for consistency 2025-10-01 21:47:31 +02:00
CnC-Robert
41268ca80b feat: hide tabs when 1 bundle is used 2025-10-01 21:47:29 +02:00
Robert
f0d9def3dd 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-10-01 21:47:28 +02:00
Ax333l
44e5dad6e9 refactor(logs): use consistent tag 2025-10-01 21:47:27 +02:00
Ax333l
83eb88170a refactor(di): use constructor DSL for VMs
Instead of doing it manually with viewModel { }
2025-10-01 21:47:26 +02:00
Ax333l
e7599e1386 chore(deps): bump revanced-patcher to 9.0.0 2025-10-01 21:47:25 +02:00
Ax333l
14888f9da7 feat: better installer ui (#29)
based cossale

Co-authored-by: Aunali321 <aunvakil.aa@gmail.com>
2025-10-01 21:47:24 +02:00
Ax333l
9675a2777b feat: patch bundle sources system (#24) 2025-10-01 21:47:22 +02:00
Aunali321
d71a4bf3c3 feat: in-app updater (#25) 2025-10-01 21:47:21 +02:00
Aunali321
57548641e7 feat(settings screen): add battery optimization notification 2025-10-01 21:47:19 +02:00
Aunali321
553af83139 feat(update screen): complete main update screen 2025-10-01 21:47:19 +02:00
Aunali321
1d6b34a39f feat(about screen): complete about screen 2025-10-01 21:47:17 +02:00
Aunali321
948a6d1440 feat(settings screen): match typography from figma 2025-10-01 21:47:16 +02:00
Aunali321
0dd036574f refactor(settings screen): clean code up a bit 2025-10-01 21:47:15 +02:00
Ax333l
4d201f17f2 fix: dont crash when the bundle cannot be downloaded 2025-10-01 21:47:14 +02:00
Ax333l
da32ff954a feat(installer): apk signing and installation 2025-10-01 21:47:13 +02:00
Ax333l
70e49aaaa3 fix(patches selector): copy the selected patches list 2025-10-01 21:47:12 +02:00
Ax333l
4e43938f7f refactor(ui): move PatchItem to the only file where it is used 2025-10-01 21:47:11 +02:00
Ax333l
f620a887ad 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-10-01 21:47:10 +02:00
Ax333l
8fa4d1d26d style: run formatter 2025-10-01 21:47:09 +02:00
Patryk Miś
925be5a168 build: updates (#23) 2025-10-01 21:47:07 +02:00
Ax333l
caeabfc91b feat: integrate revanced patcher (#22) 2025-10-01 21:47:06 +02:00
CnC-Robert
5c2f9d91a6 feat: improved dashboard screen 2025-10-01 21:47:05 +02:00
CnC-Robert
55e871aa7d feat: patches selector screen 2025-10-01 21:47:04 +02:00
CnC-Robert
b7d53cfca8 feat: settings screen 2025-10-01 21:47:03 +02:00
Patryk Miś
85a03a6472 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-10-01 21:47:01 +02:00
CnC-Robert
373cc4bbb1 feat: app selector screen 2025-10-01 21:46:59 +02:00
Aunali321
a127b959ea 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-10-01 21:46:57 +02:00
Ax333l
476a6e5771 fix: gradlew permissions on unix 2025-10-01 21:46:55 +02:00
Patryk Miś
037a11aeb8 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-10-01 21:46:54 +02:00
CnC-Robert
45a54d1608 feat: backend 2025-10-01 21:46:48 +02:00
Alexandre Teles
ca85b38bdc Create README.md 2025-10-01 21:46:46 +02:00
Canny
60a5a11c71 feat: splash screen 2025-10-01 21:46:45 +02:00
Canny
7fc6ec5c2c feat: implement navigation 2025-10-01 21:46:44 +02:00
Canny
7fa7b9d53a feat: implement DI 2025-10-01 21:46:27 +02:00
oSumAtrIX
045a5483f1 chore: Migrate to compose-dev branch 2025-10-01 21:46:17 +02:00
semantic-release-bot
40dd81eba3 chore(release): 1.25.1 [skip ci]
## [1.25.1](https://github.com/ReVanced/revanced-manager/compare/v1.25.0...v1.25.1) (2025-07-07)

### Bug Fixes

* Disable Impeller Flutter render engine correctly to fix rendering issues ([#2631](https://github.com/ReVanced/revanced-manager/issues/2631)) ([c97e4ad](c97e4adace))
2025-07-07 13:01:12 +00:00
Pun Butrach
9f99fcf808 chore: Merge branch dev to main (#2632) 2025-07-07 19:51:42 +07:00
github-actions[bot]
1b11a0ad7a chore: Sync translations (#2581)
Signed-off-by: GitHub <noreply@github.com>
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
2025-07-07 19:46:40 +07:00
Pun Butrach
8f60bf44e5 ci: Remove fetch-depth from checkout (#2629) 2025-07-06 01:41:32 +03:00
semantic-release-bot
3b459160d7 chore(release): 1.25.1-dev.1 [skip ci]
## [1.25.1-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.25.0...v1.25.1-dev.1) (2025-07-03)

### Bug Fixes

* Disable Impeller Flutter render engine correctly to fix rendering issues ([#2631](https://github.com/ReVanced/revanced-manager/issues/2631)) ([c97e4ad](c97e4adace))
2025-07-03 05:13:31 +00:00
ZargEzey
c97e4adace fix: Disable Impeller Flutter render engine correctly to fix rendering issues (#2631) 2025-07-03 07:05:08 +02:00
semantic-release-bot
875ce6439d chore(release): 1.25.0 [skip ci]
# [1.25.0](https://github.com/ReVanced/revanced-manager/compare/v1.24.0...v1.25.0) (2025-06-27)

### Bug Fixes

* "Save patched app" attempts to copy APK when patching fails ([#2565](https://github.com/ReVanced/revanced-manager/issues/2565)) ([bdb0317](bdb0317a9e))
* Correct supported required patch option types  ([#2475](https://github.com/ReVanced/revanced-manager/issues/2475)) ([cde3f8d](cde3f8d62c))
* Crash using when Integer type in Patch Options ([#2453](https://github.com/ReVanced/revanced-manager/issues/2453)) ([05575cc](05575cccfb))
* Fix installation being cancelled at installation by not prematurely deleting patched APK  ([#2490](https://github.com/ReVanced/revanced-manager/issues/2490)) ([dedcb3c](dedcb3c51a))
* Log errors and warnings when compiling resources ([5c7d52c](5c7d52c8e9))
* Nearly all rare cases of GPU renderer issues, and allow building on manager again ([#2602](https://github.com/ReVanced/revanced-manager/issues/2602)) ([21ceada](21ceadaf7f))
* Obscure Flutter Impeller renderer bugs ([a5e909c](a5e909cfc8))
* Unable to Share Logs due to missing ProGuard rules ([#2474](https://github.com/ReVanced/revanced-manager/issues/2474)) ([915ec0e](915ec0e260))
* Use device locale for app language (Default to English) ([#2488](https://github.com/ReVanced/revanced-manager/issues/2488)) ([3074766](3074766ff2))
* Use device locale when no preference is set ([#2483](https://github.com/ReVanced/revanced-manager/issues/2483)) ([f79aa9e](f79aa9edd7))

### Features

* Add toggle to use pre-releases ([#2485](https://github.com/ReVanced/revanced-manager/issues/2485)) ([89b48ce](89b48cebcf))
2025-06-27 10:13:41 +00:00
Ushie
c45d579406 chore: Merge branch dev to main (#2468) 2025-06-27 13:00:07 +03:00
semantic-release-bot
b6b8f4e069 chore(release): 1.25.0-dev.2 [skip ci]
# [1.25.0-dev.2](https://github.com/ReVanced/revanced-manager/compare/v1.25.0-dev.1...v1.25.0-dev.2) (2025-06-26)

### Bug Fixes

* "Save patched app" attempts to copy APK when patching fails ([#2565](https://github.com/ReVanced/revanced-manager/issues/2565)) ([bdb0317](bdb0317a9e))
* Nearly all rare cases of GPU renderer issues, and allow building on manager again ([#2602](https://github.com/ReVanced/revanced-manager/issues/2602)) ([21ceada](21ceadaf7f))
* Obscure Flutter Impeller renderer bugs ([a5e909c](a5e909cfc8))
2025-06-26 05:52:36 +00:00
Pun Butrach
21ceadaf7f fix: Nearly all rare cases of GPU renderer issues, and allow building on manager again (#2602)
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
2025-06-26 12:40:14 +07:00
57 changed files with 1449 additions and 1569 deletions

View File

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

View File

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

8
adsfund.json Normal file
View File

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

39
api/.releaserc Normal file
View File

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

1
api/gradlew vendored Symbolic link
View File

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

11
api/package.json Normal file
View File

@@ -0,0 +1,11 @@
{
"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

@@ -8,7 +8,8 @@
],
"plugins": [
[
"@semantic-release/commit-analyzer", {
"@semantic-release/commit-analyzer",
{
"releaseRules": [
{ "type": "build", "scope": "Needs bump", "release": "patch" }
]
@@ -22,7 +23,7 @@
{
"assets": [
"CHANGELOG.md",
"gradle.properties",
"gradle.properties"
],
"message": "chore: Release v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}
@@ -32,17 +33,17 @@
{
"assets": [
{
"path": "app/build/outputs/apk/release/revanced-manager*.apk?(.asc)"
},
"path": "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
}
]
]

317
app/CHANGELOG.md Normal file
View File

@@ -0,0 +1,317 @@
# 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,3 +1,4 @@
import io.github.z4kn4fein.semver.toVersion
import kotlin.random.Random
plugins {
@@ -109,6 +110,16 @@ 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
@@ -118,8 +129,15 @@ android {
applicationId = "app.revanced.manager"
minSdk = 26
targetSdk = 35
versionCode = 1
versionName = "0.0.1"
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)
}
vectorDrawables.useSupportLibrary = true
}

1
app/gradle.properties Normal file
View File

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

1
app/gradlew vendored Symbolic link
View File

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

11
app/package.json Normal file
View File

@@ -0,0 +1,11 @@
{
"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,63 +1,14 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.kts.kts.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
-dontobfuscate
# Required for serialization to work properly
-if @kotlinx.serialization.Serializable class **
-keepclassmembers class <1> {
static <1>$Companion Companion;
}
-if @kotlinx.serialization.Serializable class ** {
static **$* *;
}
-keepclassmembers class <2>$<3> {
kotlinx.serialization.KSerializer serializer(...);
}
-if @kotlinx.serialization.Serializable class ** {
public static ** INSTANCE;
}
-keepclassmembers class <1> {
public static <1> INSTANCE;
kotlinx.serialization.KSerializer serializer(...);
}
-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.** { *; }
# 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 com.google.j2objc.annotations.*
-dontwarn java.awt.**
-dontwarn javax.**
-dontwarn org.slf4j.**
-dontwarn it.skrape.fetcher.*
-dontwarn com.google.j2objc.annotations.*
-keepattributes RuntimeVisibleAnnotations,AnnotationDefault
-dontwarn org.slf4j.**

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(cn: String, pass: String) = prefs.edit {
prefs.keystoreCommonName.value = cn
private suspend fun updatePrefs(alias: String, pass: String) = prefs.edit {
prefs.keystoreAlias.value = alias
prefs.keystorePass.value = pass
}
private suspend fun signingDetails(path: File = keystorePath) = ApkUtils.KeyStoreDetails(
keyStore = path,
keyStorePassword = null,
alias = prefs.keystoreCommonName.get(),
alias = prefs.keystoreAlias.get(),
password = prefs.keystorePass.get()
)
suspend fun sign(input: File, output: File) = withContext(Dispatchers.Default) {
ApkUtils.signApk(input, output, prefs.keystoreCommonName.get(), signingDetails())
ApkUtils.signApk(input, output, prefs.keystoreAlias.get(), signingDetails())
}
suspend fun regenerate() = withContext(Dispatchers.Default) {
val keyCertPair = ApkSigner.newPrivateKeyCertificatePair(
prefs.keystoreCommonName.get(),
prefs.keystoreAlias.get(),
eightYearsFromNow
)
val ks = ApkSigner.newKeyStore(
@@ -64,13 +64,13 @@ class KeystoreManager(app: Application, private val prefs: PreferencesManager) {
updatePrefs(DEFAULT, DEFAULT)
}
suspend fun import(cn: String, pass: String, keystore: InputStream): Boolean {
suspend fun import(alias: String, pass: String, keystore: InputStream): Boolean {
val keystoreData = withContext(Dispatchers.IO) { keystore.readBytes() }
try {
val ks = ApkSigner.readKeyStore(ByteArrayInputStream(keystoreData), null)
ApkSigner.readPrivateKeyCertificatePair(ks, cn, pass)
ApkSigner.readPrivateKeyCertificatePair(ks, alias, 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(cn, pass)
updatePrefs(alias, pass)
return true
}

View File

@@ -16,12 +16,14 @@ class PreferencesManager(
val useProcessRuntime = booleanPreference("use_process_runtime", false)
val patcherProcessMemoryLimit = intPreference("process_runtime_memory_limit", 700)
val keystoreCommonName = stringPreference("keystore_cn", KeystoreManager.DEFAULT)
val keystoreAlias = stringPreference("keystore_alias", 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 android.os.Build
import app.revanced.manager.BuildConfig
import app.revanced.manager.domain.manager.PreferencesManager
import app.revanced.manager.network.dto.ReVancedAsset
import app.revanced.manager.network.dto.ReVancedGitRepository
@@ -30,11 +30,12 @@ class ReVancedAPI(
private suspend inline fun <reified T> request(route: String) = request<T>(apiUrl(), route)
suspend fun getAppUpdate() =
getLatestAppInfo().getOrThrow().takeIf { it.version != Build.VERSION.RELEASE }
getLatestAppInfo().getOrThrow().takeIf { it.version.removePrefix("v") != BuildConfig.VERSION_NAME }
suspend fun getLatestAppInfo() = request<ReVancedAsset>("manager")
suspend fun getLatestAppInfo() =
request<ReVancedAsset>("manager?prerelease=${prefs.useManagerPrereleases.get()}")
suspend fun getPatchesUpdate() = request<ReVancedAsset>("patches")
suspend fun getPatchesUpdate() = request<ReVancedAsset>("patches?prerelease=${prefs.usePatchesPrereleases.get()}")
suspend fun getContributors() = request<List<ReVancedGitRepository>>("contributors")

View File

@@ -6,6 +6,7 @@ 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
@@ -21,7 +22,6 @@ 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,10 +69,7 @@ fun AppTopBar(
scrollBehavior = scrollBehavior,
navigationIcon = {
if (onBackClick != null) {
TooltipIconButton(
onClick = onBackClick,
tooltip = stringResource(R.string.back),
) {
IconButton(onClick = onBackClick) {
backIcon()
}
}
@@ -111,10 +108,7 @@ fun AppTopBar(
scrollBehavior = scrollBehavior,
navigationIcon = {
if (onBackClick != null) {
TooltipIconButton(
onClick = onBackClick,
tooltip = stringResource(R.string.back),
) {
IconButton(onClick = onBackClick) {
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,11 +27,7 @@ fun ArrowButton(
)
onClick?.let {
TooltipIconButton(
modifier = Modifier,
onClick = it,
tooltip = stringResource(description),
) {
IconButton(onClick = it) {
Icon(
imageVector = Icons.Filled.KeyboardArrowUp,
contentDescription = stringResource(description),

View File

@@ -9,6 +9,7 @@ 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
@@ -17,7 +18,6 @@ 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,8 +39,7 @@ fun ExceptionViewerDialog(text: String, onDismiss: () -> Unit) {
)
},
actions = {
TooltipIconButton(
modifier = Modifier,
IconButton(
onClick = {
val sendIntent: Intent = Intent().apply {
action = Intent.ACTION_SEND
@@ -53,8 +52,7 @@ 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,6 +14,7 @@ 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
@@ -24,7 +25,6 @@ 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,10 +138,7 @@ fun NotificationCard(
)
}
if (onDismiss != null) {
TooltipIconButton(
onClick = onDismiss,
tooltip = stringResource(R.string.close),
) {
IconButton(onClick = onDismiss) {
Icon(
imageVector = Icons.Outlined.Close,
contentDescription = stringResource(R.string.close),

View File

@@ -5,6 +5,7 @@ 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
@@ -18,7 +19,6 @@ 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,15 +33,9 @@ fun PasswordField(modifier: Modifier = Modifier, value: String, onValueChange: (
label = label,
modifier = modifier,
trailingIcon = {
TooltipIconButton(
modifier = Modifier,
onClick = {
visible = !visible
},
tooltip = if (visible) stringResource(R.string.show_password_field) else stringResource(
R.string.hide_password_field
),
) {
IconButton(onClick = {
visible = !visible
}) {
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,6 +5,7 @@ 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
@@ -18,7 +19,6 @@ 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,10 +48,7 @@ fun SearchView(
onExpandedChange = onActiveChange,
placeholder = placeholder,
leadingIcon = {
TooltipIconButton(
tooltip = stringResource(R.string.back),
onClick = { onActiveChange(false) }
) {
IconButton(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,12 +66,14 @@ 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) {
@@ -104,11 +106,7 @@ fun BundleInformationDialog(
},
actions = {
if (!src.isDefault) {
TooltipIconButton(
modifier = Modifier,
onClick = onDeleteRequest,
tooltip = stringResource(R.string.delete),
) {
IconButton(onClick = onDeleteRequest) {
Icon(
Icons.Outlined.DeleteOutline,
stringResource(R.string.delete)
@@ -116,11 +114,7 @@ fun BundleInformationDialog(
}
}
if (!isLocal && hasNetwork) {
TooltipIconButton(
modifier = Modifier,
onClick = onUpdate,
tooltip = stringResource(R.string.refresh),
) {
IconButton(onClick = onUpdate) {
Icon(
Icons.Outlined.Update,
stringResource(R.string.refresh)
@@ -182,6 +176,32 @@ 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
)
}
}
)
},
modifier = Modifier.clickable {
composableScope.launch {
prefs.usePatchesPrereleases.update(!useBundlePrerelease)
}
}
)
}
endpoint?.takeUnless { src.isDefault }?.let { url ->
var showUrlInputDialog by rememberSaveable {
mutableStateOf(false)

View File

@@ -2,6 +2,7 @@ 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
@@ -9,11 +10,7 @@ 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
@@ -36,10 +33,7 @@ fun BundleTopBar(
scrollBehavior = scrollBehavior,
navigationIcon = {
if (onBackClick != null) {
TooltipIconButton(
tooltip = stringResource(R.string.back),
onClick = onBackClick
) {
IconButton(onClick = onBackClick) {
backIcon()
}
}

View File

@@ -193,7 +193,6 @@ 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

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

View File

@@ -5,6 +5,7 @@ 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
@@ -16,7 +17,6 @@ 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,14 +65,10 @@ fun IntegerItem(
headlineContent = stringResource(headline),
supportingContent = stringResource(description),
trailingContent = {
TooltipIconButton(
modifier = modifier,
onClick = { dialogOpen = true },
tooltip = stringResource(R.string.edit),
) {
IconButton(onClick = { dialogOpen = true }) {
Icon(
imageVector = Icons.Outlined.Edit,
contentDescription = stringResource(R.string.edit),
Icons.Outlined.Edit,
contentDescription = stringResource(R.string.edit)
)
}
}

View File

@@ -1,107 +0,0 @@
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

@@ -1,96 +0,0 @@
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

@@ -1,107 +0,0 @@
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

@@ -1,96 +0,0 @@
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,6 +16,7 @@ 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
@@ -43,7 +44,6 @@ 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,14 +162,8 @@ fun AppSelectorScreen(
scrollBehavior = scrollBehavior,
onBackClick = onBackClick,
actions = {
TooltipIconButton(
tooltip = stringResource(R.string.search_patches),
onClick = { search = true }
) {
Icon(
Icons.Outlined.Search,
stringResource(R.string.search)
)
IconButton(onClick = { search = true }) {
Icon(Icons.Outlined.Search, stringResource(R.string.search))
}
}
)

View File

@@ -66,9 +66,8 @@ 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
@@ -182,20 +181,18 @@ fun DashboardScreen(
)
},
actions = {
TooltipIconButton(
IconButton(
onClick = {
showDeleteConfirmationDialog = true
},
tooltip = stringResource(R.string.delete),
}
) {
Icon(
Icons.Outlined.DeleteOutline,
stringResource(R.string.delete)
)
}
TooltipIconButton(
onClick = vm::updateSources,
tooltip = stringResource(R.string.refresh)
IconButton(
onClick = vm::updateSources
) {
Icon(
Icons.Outlined.Refresh,
@@ -209,9 +206,8 @@ fun DashboardScreen(
title = stringResource(R.string.app_name),
actions = {
if (!vm.updatedManagerVersion.isNullOrEmpty()) {
TooltipIconButton(
IconButton(
onClick = onUpdateClick,
tooltip = stringResource(R.string.update),
) {
BadgedBox(
badge = {
@@ -222,17 +218,8 @@ fun DashboardScreen(
}
}
}
TooltipIconButton(
onClick = onSettingsClick,
tooltip = stringResource(R.string.settings),
) {
BadgedBox(
badge = {
Badge(modifier = Modifier.size(6.dp))
}
) {
Icon(Icons.Outlined.Settings, stringResource(R.string.settings))
}
IconButton(onClick = onSettingsClick) {
Icon(Icons.Outlined.Settings, stringResource(R.string.settings))
}
},
applyContainerColor = true
@@ -240,8 +227,7 @@ fun DashboardScreen(
}
},
floatingActionButton = {
TooltipFloatingActionButton(
tooltip = stringResource(R.string.add),
HapticFloatingActionButton(
onClick = {
vm.cancelSourceSelection()
@@ -254,11 +240,11 @@ fun DashboardScreen(
DashboardPage.BUNDLES.ordinal
)
}
return@TooltipFloatingActionButton
return@HapticFloatingActionButton
}
if (vm.android11BugActive) {
showAndroid11Dialog = true
return@TooltipFloatingActionButton
return@HapticFloatingActionButton
}
onAppSelectorClick()

View File

@@ -25,6 +25,7 @@ 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
@@ -50,7 +51,6 @@ 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
@@ -164,17 +164,15 @@ fun PatcherScreen(
bottomBar = {
BottomAppBar(
actions = {
TooltipIconButton(
IconButton(
onClick = { exportApkLauncher.launch("${viewModel.packageName}_${viewModel.version}_revanced_patched.apk") },
enabled = patcherSucceeded == true,
tooltip = stringResource(R.string.save_apk),
enabled = patcherSucceeded == true
) {
Icon(Icons.Outlined.Save, stringResource(id = R.string.save_apk))
}
TooltipIconButton(
IconButton(
onClick = { viewModel.exportLogs(context) },
enabled = patcherSucceeded != null,
tooltip = stringResource(R.string.save_logs),
enabled = patcherSucceeded != null
) {
Icon(Icons.Outlined.PostAdd, stringResource(id = R.string.save_logs))
}

View File

@@ -41,6 +41,7 @@ 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
@@ -72,9 +73,6 @@ 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
@@ -261,15 +259,14 @@ fun PatchesSelectorScreen(
animationSpec = tween(durationMillis = 400, easing = EaseInOut),
label = "SearchBar back button"
)
TooltipIconButton(
IconButton(
onClick = {
if (searchExpanded) {
setSearchExpanded(false)
} else {
onBackClick()
}
},
tooltip = stringResource(R.string.back),
}
) {
Icon(
modifier = Modifier.rotate(rotation),
@@ -285,10 +282,9 @@ fun PatchesSelectorScreen(
transitionSpec = { fadeIn() togetherWith fadeOut() }
) { searchExpanded ->
if (searchExpanded) {
TooltipIconButton(
IconButton(
onClick = { setQuery("") },
enabled = query.isNotEmpty(),
tooltip = stringResource(R.string.clear),
enabled = query.isNotEmpty()
) {
Icon(
imageVector = Icons.Filled.Close,
@@ -296,10 +292,7 @@ fun PatchesSelectorScreen(
)
}
} else {
TooltipIconButton(
onClick = { showBottomSheet = true },
tooltip = stringResource(R.string.more),
) {
IconButton(onClick = { showBottomSheet = true }) {
Icon(
imageVector = Icons.Outlined.FilterList,
contentDescription = stringResource(R.string.more)
@@ -361,8 +354,7 @@ fun PatchesSelectorScreen(
horizontalAlignment = Alignment.End,
verticalArrangement = Arrangement.spacedBy(4.dp)
) {
TooltipSmallFloatingActionButton(
tooltip = stringResource(R.string.reset),
SmallFloatingActionButton(
onClick = viewModel::reset,
containerColor = MaterialTheme.colorScheme.tertiaryContainer
) {
@@ -514,7 +506,6 @@ 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)
}
@@ -538,10 +529,7 @@ fun ListHeader(
},
trailingContent = onHelpClick?.let {
{
TooltipIconButton(
tooltip = stringResource(R.string.help),
onClick = it
) {
IconButton(onClick = it) {
Icon(
Icons.AutoMirrored.Outlined.HelpOutline,
stringResource(R.string.help)
@@ -621,10 +609,7 @@ private fun OptionsDialog(
title = patch.name,
onBackClick = onDismissRequest,
actions = {
TooltipIconButton(
tooltip = stringResource(R.string.reset),
onClick = reset
) {
IconButton(onClick = reset) {
Icon(Icons.Outlined.Restore, stringResource(R.string.reset))
}
}

View File

@@ -19,6 +19,7 @@ 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
@@ -49,7 +50,6 @@ 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,10 +252,9 @@ fun AboutSettingsScreen(
horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally)
) {
socialButtons.forEach { (icon, text, onClick) ->
TooltipIconButton(
IconButton(
onClick = onClick,
modifier = Modifier.padding(end = 8.dp),
tooltip = text,
onClick = onClick
) {
Icon(
icon,

View File

@@ -21,6 +21,7 @@ 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
@@ -51,7 +52,6 @@ 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,11 +243,7 @@ private fun APIUrlDialog(currentUrl: String, defaultUrl: String, onSubmit: (Stri
onValueChange = { url = it },
label = { Text(stringResource(R.string.api_url)) },
trailingIcon = {
TooltipIconButton(
modifier = Modifier,
tooltip = stringResource(R.string.api_url_dialog_reset),
onClick = { url = defaultUrl }
) {
IconButton(onClick = { url = defaultUrl }) {
Icon(Icons.Outlined.Restore, stringResource(R.string.api_url_dialog_reset))
}
}

View File

@@ -1,6 +1,7 @@
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
@@ -34,6 +35,8 @@ 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
@@ -57,6 +60,7 @@ fun ContributorSettingsScreen(
) {
val repositories = viewModel.repositories
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
val uriHandler = LocalUriHandler.current
Scaffold(
topBar = {
@@ -93,7 +97,8 @@ fun ContributorSettingsScreen(
) {
ContributorsCard(
title = it.name,
contributors = it.contributors
contributors = it.contributors,
uriHandler = uriHandler
)
}
}
@@ -115,7 +120,8 @@ fun ContributorsCard(
title: String,
contributors: List<ReVancedContributor>,
itemsPerPage: Int = 12,
numberOfRows: Int = 2
numberOfRows: Int = 2,
uriHandler: UriHandler
) {
val itemsPerRow = (itemsPerPage / numberOfRows)
@@ -172,7 +178,11 @@ fun ContributorsCard(
contributorsByPage[page].forEach {
if (itemSize > 100.dp) {
Row(
modifier = Modifier.width(itemSize - 1.dp), // we delete 1.dp to account for not-so divisible numbers
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
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
@@ -203,6 +213,9 @@ 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

@@ -9,7 +9,6 @@ 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.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
@@ -41,10 +40,8 @@ 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
@@ -78,10 +75,7 @@ fun DownloadsSettingsScreen(
onBackClick = onBackClick,
actions = {
if (viewModel.appSelection.isNotEmpty()) {
TooltipIconButton(
tooltip = stringResource(R.string.delete),
onClick = { showDeleteConfirmationDialog = true }
) {
IconButton(onClick = { showDeleteConfirmationDialog = true }) {
Icon(Icons.Default.Delete, stringResource(R.string.delete))
}
}

View File

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

View File

@@ -92,6 +92,12 @@ 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

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

View File

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

View File

@@ -120,6 +120,10 @@ 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("/"))
}
@@ -143,7 +147,7 @@ class MainViewModel(
settings.keystore?.let { keystore ->
val keystoreBytes = Base64.decode(keystore, Base64.DEFAULT)
keystoreManager.import(
"ReVanced",
"alias",
settings.keystorePassword,
keystoreBytes.inputStream()
)
@@ -159,6 +163,7 @@ 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,6 +17,8 @@ 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

@@ -368,6 +368,8 @@
<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>
@@ -435,6 +437,8 @@
<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 version 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).\n\nClick on the patches to see more details.</string>
<string name="incompatible_patch">Incompatible patch</string>

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 update ReVanced Manager.
The next page will explain how to manage downloaders.
Continue: [🔄 Updating ReVanced Manager](2_4_updating.md)
Continue: [🔄 Updating ReVanced Manager](2_4_managing_downloaders.md)

View File

@@ -0,0 +1,15 @@
# 🧩 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

@@ -15,4 +15,4 @@ and let you when an update is available.
The next page will explain how to configure ReVanced Manager.
Continue: [⚙️ Configuring ReVanced Manager](2_5_settings.md)
Continue: [⚙️ Configuring ReVanced Manager](2_6_settings.md)

View File

@@ -1,28 +1,6 @@
# 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,6 +36,7 @@ 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
@@ -129,6 +130,9 @@ 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" }

1589
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,11 @@
{
"private": true,
"workspaces": [
"api",
"app"
],
"devDependencies": {
"@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"
"@anolilab/multi-semantic-release": "^2.0.3",
"semantic-release": "^24.2.7"
}
}