├── .gitattributes ├── app ├── .gitignore ├── src │ └── main │ │ ├── play_store_512.png │ │ ├── res │ │ ├── font │ │ │ ├── jetbrainsmonoregular.ttf │ │ │ └── jetbrainsmono.xml │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_monochrome.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_monochrome.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_monochrome.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_monochrome.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_monochrome.png │ │ ├── values-land │ │ │ └── dimens.xml │ │ ├── values-w1240dp │ │ │ └── dimens.xml │ │ ├── values-w600dp │ │ │ └── dimens.xml │ │ ├── values-pt-rPT │ │ │ └── strings.xml │ │ ├── values │ │ │ ├── styles.xml │ │ │ ├── bools.xml │ │ │ ├── themable.xml │ │ │ ├── dimens.xml │ │ │ ├── colors.xml │ │ │ └── arrays.xml │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ ├── values-v31 │ │ │ └── bools.xml │ │ ├── xml │ │ │ ├── full_backup_content.xml │ │ │ ├── shared_file_paths.xml │ │ │ ├── data_extraction_rules.xml │ │ │ ├── credits_preferences.xml │ │ │ ├── app_info_preferences.xml │ │ │ ├── network_security_config.xml │ │ │ ├── privacy_preferences.xml │ │ │ ├── security_preferences.xml │ │ │ ├── theme_preferences.xml │ │ │ └── debugging_preferences.xml │ │ ├── drawable │ │ │ ├── baseline_keyboard_arrow_right_24.xml │ │ │ ├── baseline_privacy_tip_24.xml │ │ │ ├── baseline_access_time_24.xml │ │ │ ├── baseline_people_24.xml │ │ │ ├── ic_baseline_download_24.xml │ │ │ ├── ic_baseline_warning_24.xml │ │ │ ├── baseline_check_24.xml │ │ │ ├── baseline_close_24.xml │ │ │ ├── bg_baseline_circle_24.xml │ │ │ ├── ic_baseline_delete_24.xml │ │ │ ├── ic_baseline_info_24.xml │ │ │ ├── baseline_arrow_back_24.xml │ │ │ ├── ic_baseline_error_24.xml │ │ │ ├── ic_baseline_keyboard_return_24.xml │ │ │ ├── ic_patreon.xml │ │ │ ├── ic_baseline_storage_24.xml │ │ │ ├── ic_baseline_delete_outline_24.xml │ │ │ ├── ic_baseline_security_24.xml │ │ │ ├── ic_baseline_add_box_24.xml │ │ │ ├── ic_baseline_list_24.xml │ │ │ ├── ic_baseline_numbers_24.xml │ │ │ ├── baseline_verified_user_24.xml │ │ │ ├── ic_baseline_vpn_key_24.xml │ │ │ ├── ic_baseline_system_update_24.xml │ │ │ ├── ic_baseline_upload_file_24.xml │ │ │ ├── ic_reboot_24.xml │ │ │ ├── ic_baseline_notifications_24.xml │ │ │ ├── ic_baseline_refresh_24.xml │ │ │ ├── baseline_favorite_24.xml │ │ │ ├── baseline_save_24.xml │ │ │ ├── baseline_system_update_24.xml │ │ │ ├── baseline_cloud_download_24.xml │ │ │ ├── baseline_network_wifi_24.xml │ │ │ ├── ic_baseline_delete_forever_24.xml │ │ │ ├── ic_baseline_sort_by_alpha_24.xml │ │ │ ├── ic_gitlab.xml │ │ │ ├── baseline_block_24.xml │ │ │ ├── baseline_notification_important_24.xml │ │ │ ├── ic_baseline_lock_24.xml │ │ │ ├── ic_baseline_update_24.xml │ │ │ ├── ic_xda.xml │ │ │ ├── ic_baseline_extension_24.xml │ │ │ ├── baseline_copy_all_24.xml │ │ │ ├── ic_baseline_cloud_off_24.xml │ │ │ ├── baseline_restart_alt_24.xml │ │ │ ├── ic_baseline_hide_source_24.xml │ │ │ ├── ic_baseline_bug_report_24.xml │ │ │ ├── ic_baseline_monetization_on_24.xml │ │ │ ├── ic_baseline_android_24.xml │ │ │ ├── ic_baseline_support_24.xml │ │ │ ├── baseline_monetization_on_24.xml │ │ │ ├── ic_baseline_paypal_24.xml │ │ │ ├── ic_baseline_palette_24.xml │ │ │ ├── ic_baseline_telegram_24.xml │ │ │ ├── ic_baseline_design_services_24.xml │ │ │ ├── ic_github.xml │ │ │ ├── ic_baseline_settings_24.xml │ │ │ ├── ic_baseline_language_24.xml │ │ │ ├── ic_baseline_discord_24.xml │ │ │ ├── ic_baseline_app_settings_alt_24.xml │ │ │ ├── ic_foreground.xml │ │ │ └── ic_baseline_blur_on_24.xml │ │ ├── menu │ │ │ ├── compat_menu.xml │ │ │ ├── update_nav.xml │ │ │ ├── setup_bottom_nav.xml │ │ │ ├── bottom_nav_install.xml │ │ │ └── bottom_nav_menu.xml │ │ ├── values-night │ │ │ └── themes.xml │ │ ├── values-night-v31 │ │ │ └── themes.xml │ │ ├── layout │ │ │ ├── dialog_checkbox.xml │ │ │ ├── preference_material_switch.xml │ │ │ ├── custom_repo_input.xml │ │ │ ├── settings_activity.xml │ │ │ ├── webview.xml │ │ │ ├── installer_wrap.xml │ │ │ ├── installer.xml │ │ │ └── markdown_view.xml │ │ ├── raw │ │ │ ├── gstatic_root_ca │ │ │ ├── androidacy_root_ca │ │ │ ├── sentry_io_root_ca │ │ │ ├── gh_main_crt │ │ │ ├── gh_root_ca │ │ │ └── sentry_root_ca │ │ ├── values-v27 │ │ │ └── themes.xml │ │ ├── values-v29 │ │ │ └── themes.xml │ │ ├── values-th │ │ │ └── strings.xml │ │ └── values-lt │ │ │ └── strings.xml │ │ ├── kotlin │ │ └── com │ │ │ └── fox2code │ │ │ └── mmm │ │ │ ├── NotificationTypeCst.kt │ │ │ ├── OverScrollManager.kt │ │ │ ├── utils │ │ │ ├── room │ │ │ │ ├── ReposListDatabase.kt │ │ │ │ ├── ModuleListCacheDatabase.kt │ │ │ │ ├── ReposList.kt │ │ │ │ └── ModuleListCache.kt │ │ │ ├── FastException.kt │ │ │ ├── TimberUtils.kt │ │ │ ├── io │ │ │ │ ├── net │ │ │ │ │ └── HttpException.kt │ │ │ │ ├── FileUtils.kt │ │ │ │ └── GMSProviderInstaller.kt │ │ │ ├── ProcessHelper.kt │ │ │ └── SyncManager.kt │ │ │ ├── XRepo.kt │ │ │ ├── markdown │ │ │ ├── MarkdownChip.kt │ │ │ └── MarkdownUrlLinker.kt │ │ │ ├── background │ │ │ └── BackgroundBootListener.kt │ │ │ ├── ExpiredActivity.kt │ │ │ ├── module │ │ │ └── ModuleSorter.kt │ │ │ ├── settings │ │ │ ├── LongClickablePreference.kt │ │ │ └── SharedPreferenceDataStore.kt │ │ │ ├── repo │ │ │ ├── CustomRepoData.kt │ │ │ └── RepoModule.kt │ │ │ ├── Constants.kt │ │ │ └── XHooks.kt │ │ └── assets │ │ ├── module_installer_test.sh │ │ ├── module_installer_wrapper.sh │ │ └── anykernel3_installer.sh └── roomSchemas │ └── com.fox2code.mmm.utils.room.ReposListDatabase │ └── 1.json ├── fastlane └── metadata │ └── android │ ├── zh-Hans │ ├── short_description.txt │ └── full_description.txt │ ├── ja │ ├── short_description.txt │ └── full_description.txt │ ├── ko │ ├── short_description.txt │ └── full_description.txt │ ├── zh-Hant │ ├── short_description.txt │ └── full_description.txt │ ├── bs │ ├── short_description.txt │ └── full_description.txt │ ├── cs │ ├── short_description.txt │ └── full_description.txt │ ├── nb-NO │ ├── short_description.txt │ └── full_description.txt │ ├── pl │ ├── short_description.txt │ └── full_description.txt │ ├── de │ ├── short_description.txt │ └── full_description.txt │ ├── es │ ├── short_description.txt │ └── full_description.txt │ ├── hu │ ├── short_description.txt │ └── full_description.txt │ ├── ro │ ├── short_description.txt │ └── full_description.txt │ ├── ru │ ├── short_description.txt │ └── full_description.txt │ ├── vi │ ├── short_description.txt │ └── full_description.txt │ ├── id │ ├── short_description.txt │ └── full_description.txt │ ├── nl-NL │ ├── short_description.txt │ └── full_description.txt │ ├── pt-BR │ ├── short_description.txt │ └── full_description.txt │ ├── sv │ ├── short_description.txt │ └── full_description.txt │ ├── tr │ ├── short_description.txt │ └── full_description.txt │ ├── uk │ ├── short_description.txt │ └── full_description.txt │ ├── ar │ ├── short_description.txt │ └── full_description.txt │ ├── da │ ├── short_description.txt │ └── full_description.txt │ ├── en-US │ ├── short_description.txt │ └── full_description.txt │ └── it │ ├── short_description.txt │ └── full_description.txt ├── docs ├── dark_screenshot.png ├── light_screenshot.png └── examples │ ├── example_module.zip │ ├── rainbow_module.zip │ ├── example_module │ ├── module.prop │ └── customize.sh │ └── rainbow_module │ ├── module.prop │ └── customize.sh ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── question.md │ ├── config.yml │ ├── feature_request.md │ └── bug_report.md ├── dependabot.yml └── workflows │ ├── dependencies.yml │ └── build-debug.yml ├── .gitignore ├── rundebug ├── settings.gradle.kts └── gradle.properties /.gitattributes: -------------------------------------------------------------------------------- 1 | # assets/*.db are binary 2 | 3 | *.db binary 4 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /default 3 | /release 4 | /mapping.txt 5 | /.vscode -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-Hans/short_description.txt: -------------------------------------------------------------------------------- 1 | Magick 模块管理器,官方应用程序已放弃对它的支持。 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ja/short_description.txt: -------------------------------------------------------------------------------- 1 | 公式アプリがサポートを終了した Magisk モジュールマネージャーだよ。 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ko/short_description.txt: -------------------------------------------------------------------------------- 1 | 공식 앱이 지원을 중단했기 때문에 만들어진 매지스크 모듈 매니저입니다. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-Hant/short_description.txt: -------------------------------------------------------------------------------- 1 | 一個 Magisk模組的模組管理工具,因為Magisk官方不支援了。 2 | -------------------------------------------------------------------------------- /docs/dark_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/docs/dark_screenshot.png -------------------------------------------------------------------------------- /docs/light_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/docs/light_screenshot.png -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-Hant/full_description.txt: -------------------------------------------------------------------------------- 1 | 本應用程式非Magisk或者其開發者的官方支持App 2 | 3 | 這些模組與本應用程式無關。請通知 4 | 倉庫管理員。 5 | -------------------------------------------------------------------------------- /app/src/main/play_store_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/play_store_512.png -------------------------------------------------------------------------------- /fastlane/metadata/android/bs/short_description.txt: -------------------------------------------------------------------------------- 1 | Menadžer modula za Magisk jer je zvanična aplikacija ukinula podršku. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/cs/short_description.txt: -------------------------------------------------------------------------------- 1 | Správce modulů pro Magisk místo původního v aplikaci , který byl ukončen. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/nb-NO/short_description.txt: -------------------------------------------------------------------------------- 1 | En modulhåndterer for Magisk fordi det offisielle støtten er trukket. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pl/short_description.txt: -------------------------------------------------------------------------------- 1 | AMM jest prostą w użyciu aplikacją zarządzającą modułami Magisk/KernelSU. 2 | -------------------------------------------------------------------------------- /docs/examples/example_module.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/docs/examples/example_module.zip -------------------------------------------------------------------------------- /docs/examples/rainbow_module.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/docs/examples/rainbow_module.zip -------------------------------------------------------------------------------- /fastlane/metadata/android/de/short_description.txt: -------------------------------------------------------------------------------- 1 | Ein Modul-Manager für Magisk, weil die offizielle App dies nicht mehr kann. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/es/short_description.txt: -------------------------------------------------------------------------------- 1 | Un administrador de módulos para Magisk porque la oficial dejó de admitirlo. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/hu/short_description.txt: -------------------------------------------------------------------------------- 1 | Egy modulkezező a Magisk-hez, mert az alkalmazás már nem támogatja azokat. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ro/short_description.txt: -------------------------------------------------------------------------------- 1 | Manager de module Magisk, deoarece aplicația oficială a renunțat la suport. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/short_description.txt: -------------------------------------------------------------------------------- 1 | Менеджер модулей Magisk на замену офиц. приложению без поддержки репозиториев. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/vi/short_description.txt: -------------------------------------------------------------------------------- 1 | Một trình quản lý mô-đun cho Magisk vì ứng dụng chính thức đã ngừng hỗ trợ nó. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-Hans/full_description.txt: -------------------------------------------------------------------------------- 1 | 此应用程序未受到 Magisk 或其官方人员的支持。 2 | 3 | 此应用程序中显示的模块与本程序无关。 4 | 如有需要请先联系仓库拥有者。 5 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /fastlane/metadata/android/id/short_description.txt: -------------------------------------------------------------------------------- 1 | Sebuah manajer modul untuk Magisk karena Magisk sudah tidak menyediakannya lagi. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/nl-NL/short_description.txt: -------------------------------------------------------------------------------- 1 | Modulebeheerder voor Magisk vermits de officiële app dit niet meer ondersteund. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt-BR/short_description.txt: -------------------------------------------------------------------------------- 1 | Um gerenciador de módulos do Magisk, pois o app oficial removeu esta função. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/sv/short_description.txt: -------------------------------------------------------------------------------- 1 | En modulhanterare för Magisk eftersom den officiella appen inte längre gör det. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/short_description.txt: -------------------------------------------------------------------------------- 1 | Magisk için bir modül yöneticisidir çünkü resmi uygulama bunun desteğini kesti. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/short_description.txt: -------------------------------------------------------------------------------- 1 | Менеджер модулів для Magisk, оскільки офіційний додаток припинив його підтримку. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ar/short_description.txt: -------------------------------------------------------------------------------- 1 | Androidacy مدير إضافات Magisk هو تطبيق سهل الاستخدام لإدارة إضافات Magisk / KernelSU. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/da/short_description.txt: -------------------------------------------------------------------------------- 1 | En modul manager for Magisk, fordi Magisk valgte at droppe understøttelse til dette. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | Androidacy Module Manager is an easy to use Magisk/KernelSU module management app. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/it/short_description.txt: -------------------------------------------------------------------------------- 1 | Androidacy Module Manager è un'app facile da usare per gestire moduli Magisk/KernelSU. 2 | -------------------------------------------------------------------------------- /app/src/main/res/font/jetbrainsmonoregular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/font/jetbrainsmonoregular.ttf -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | patreon: Androidacy 2 | custom: ["https://www.androidacy.com/membership-join/#utm_source=github&utm_medium=web&utm_campaign=ghsponsors"] 3 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | about: Question about this project 4 | title: '' 5 | labels: question 6 | assignees: '' 7 | 8 | --- 9 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ja/full_description.txt: -------------------------------------------------------------------------------- 1 | このアプリは Magisk またはその開発者によって公式にサポートされていないよ。 2 | 3 | このアプリに表示されているモジュールは完全に連携していないよ。 4 | 代わりにリポジトリのオーナーに連絡してね。 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Androidacy/MagiskModuleManager/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /fastlane/metadata/android/da/full_description.txt: -------------------------------------------------------------------------------- 1 | Denne app er ikke officielt understøttet af Magisk eller dets udviklere. 2 | 3 | Modulerne vist i denne app er ikke tilknyttet denne app. Venligst kontakt 4 | repo-ejere i stedet. 5 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Fox2Code Telegram group 4 | url: https://t.me/Fox2Code_Chat 5 | about: Join the Telegram group if you want to discuss with the community. 6 | -------------------------------------------------------------------------------- /fastlane/metadata/android/bs/full_description.txt: -------------------------------------------------------------------------------- 1 | Magisk ili njegovi programeri službeno ne podržavaju ovu aplikaciju. 2 | 3 | Moduli prikazani u ovoj aplikaciji nisu povezani s ovom aplikacijom. 4 | Molimo kontaktirajte vlasnike repozitorija. 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/hu/full_description.txt: -------------------------------------------------------------------------------- 1 | Ez az app hivatalosan nem támogatott a Magisk fejlesztői által. 2 | 3 | Az itt megjelenített modulok nem kapcsolódnak ehhez az apphoz. Kérdés esetén 4 | lépj kapcsolatba a repo üzemeltetővel. 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/nb-NO/full_description.txt: -------------------------------------------------------------------------------- 1 | Dette programmet har ikke offisiell støtte av Magisk eller dets utviklere. 2 | 3 | Modulene vist i programmet er ikke tilknyttet programmet. 4 | Kontakt respektive eiere av pakkebrønner ved feil. 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/full_description.txt: -------------------------------------------------------------------------------- 1 | Это приложение не связано с Magisk или его разработчиками. 2 | 3 | Модули, показанные в приложении, сами по себе. В случае проблем 4 | свяжитесь с владельцами репозиториев, где публикуются модули. 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/full_description.txt: -------------------------------------------------------------------------------- 1 | Цей додаток офіційно не підтримується Magisk або його розробниками. 2 | 3 | Модулі, показані в цьому додатку, не пов’язані з цим додатком. Будь ласка зв'яжіться 4 | натомість власники репозиторіїв. 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/sv/full_description.txt: -------------------------------------------------------------------------------- 1 | Den här appen stöda inte officiellt av Magisk eller dess utvecklare. 2 | 3 | Modulerna som visas i den här appen är inte tillhandahållna i samröre med den. Vänligen 4 | kontakta förrådsägare istället. 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/cs/full_description.txt: -------------------------------------------------------------------------------- 1 | Tato aplikace není oficiálně podporována společností Magisk ani jejími vývojáři. 2 | 3 | Moduly zobrazené v této aplikaci nejsou spojeny s touto aplikací. Prosím kontaktujte 4 | místo toho autory repozitářů. 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/it/full_description.txt: -------------------------------------------------------------------------------- 1 | Questa app non è ufficialmente supportata da Magisk o dai suoi sviluppatori. 2 | 3 | I moduli mostrati in questa app non sono affiliati a questa app. Si prega di contattare 4 | i proprietari della repository. 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/full_description.txt: -------------------------------------------------------------------------------- 1 | Bu uygulama Magisk veya geliştiricileri tarafından resmi olarak desteklenmiyor. 2 | 3 | Bu uygulamada gösterilen modüller bu uygulamayla ilişkili değildir. 4 | Onun yerine lütfen depo sahipleriyle iletişime geçin. 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/nl-NL/full_description.txt: -------------------------------------------------------------------------------- 1 | Deze app wordt niet officieel ondersteund door Magisk en zijn ontwikkelaars. 2 | 3 | De modules die in deze app getoond worden zijn onafhankelijk van de app. Contacteer de beheerders van de repo voor ondersteuning. 4 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt-BR/full_description.txt: -------------------------------------------------------------------------------- 1 | Este aplicativo não é oficialmente suportado pelo Magisk ou seus desenvolvedores. 2 | 3 | Os módulos exibidos neste aplicativo não têm afiliação com o AMM. 4 | Por favor, contate os donos dos respectivos repositórios. 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/id/full_description.txt: -------------------------------------------------------------------------------- 1 | Aplikasi ini tidak didukung secara resmi oleh Magisk atau oleh para pengembang Magisk. 2 | 3 | Modul-modul yang ditampilkan dalam aplikasi ini tidak memiliki afiliasi terhadap aplikasi ini. Mohon hubungi 4 | pemilik repo saja. 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ro/full_description.txt: -------------------------------------------------------------------------------- 1 | Această aplicație nu este susținută oficial de Magisk sau de dezvoltatorii săi. 2 | 3 | Modulele afișate în această aplicație nu sunt afiliate cu această aplicație. Vă rog să 4 | contactați proprietarii depozitelor în schimb. 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/es/full_description.txt: -------------------------------------------------------------------------------- 1 | Esta aplicación no cuenta con el apoyo oficial de Magisk o sus desarrolladores. 2 | 3 | Los módulos que se muestran en esta aplicación no están afiliados a esta aplicación. Por favor contactar 4 | propietarios de repos en su lugar. 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de/full_description.txt: -------------------------------------------------------------------------------- 1 | Diese App wird nicht von Magisk oder seinen Entwicklern unterstützt. 2 | 3 | Die Module, die in dieser App angezeigt werden, werden nicht von den App-Entwicklern verwaltet. 4 | Bitte kontaktieren Sie stattdessen die Repository-Besitzer. 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-w1240dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-w600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/vi/full_description.txt: -------------------------------------------------------------------------------- 1 | Ứng dụng này không được hỗ trợ chính thức bởi Magisk hoặc các nhà phát triển của Magisk. 2 | 3 | Những mô-đun được hiển thị trong ứng dụng không có bất kỳ liên kết nào đối với ứng dụng này. 4 | Vui lòng liên hệ người sở hữu mô-đun khi có thắc mắc. 5 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /app/src/main/res/values-pt-rPT/strings.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/ 5 | .DS_Store 6 | /build 7 | /app/build 8 | /app/default 9 | /app/fdroid 10 | /app/play 11 | /captures 12 | .externalNativeBuild 13 | .cxx 14 | local.properties 15 | sentry.properties 16 | androidacy.properties 17 | app/google-services.json 18 | signing.properties 19 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ko/full_description.txt: -------------------------------------------------------------------------------- 1 | Androidacy 모듈 관리자를 사용하면 Magisk 및 KernelSU용 모듈을 관리할 수 있습니다. Androidacy 모듈 리포지토리에서 모듈을 찾아보고, 검색하고, 다운로드하거나 호환되는 온라인 소스를 비롯한 다른 소스에서 모듈을 설치할 수 있습니다. 또한 모듈을 활성화, 비활성화 및 제거하는 등 설치된 모듈을 관리할 수 있습니다. 2 | 3 | 이 앱은 Magisk, Google 또는 해당 개발자와 어떠한 제휴 관계도 없습니다. 리포지토리는 독립적으로 관리되며, 트위터를 통해서는 이에대한 지원을 받을수 없습니다. 4 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/NotificationTypeCst.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm 6 | 7 | internal interface NotificationTypeCst -------------------------------------------------------------------------------- /docs/examples/example_module/module.prop: -------------------------------------------------------------------------------- 1 | id=fox_mmm_example 2 | name=AMM Example Module 3 | version=v1.0 4 | versionCode=1 5 | author=Fox2Code 6 | description=Androidacy Module Manager example module 7 | minApi=21 8 | minMagisk=19000 9 | support=https://github.com/Androidacy/MagiskModuleManager 10 | donate=https://paypal.me/fox2code 11 | config=com.fox2code.mmm 12 | -------------------------------------------------------------------------------- /docs/examples/rainbow_module/module.prop: -------------------------------------------------------------------------------- 1 | id=fox_mmm_rainbow 2 | name=AMM Rainbow Module 3 | version=v1.0 4 | versionCode=1 5 | author=Fox2Code 6 | description=Androidacy Module Manager rainbow module 7 | minApi=21 8 | minMagisk=19000 9 | support=https://github.com/Androidacy/MagiskModuleManager 10 | donate=https://paypal.me/fox2code 11 | config=com.fox2code.mmm 12 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | 4 | version: 2 5 | updates: 6 | - package-ecosystem: "gradle" # See documentation for possible values 7 | directory: "/" # Location of package manifests 8 | schedule: 9 | interval: "weekly" 10 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/bools.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | false 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-v31/bools.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | true 7 | -------------------------------------------------------------------------------- /app/src/main/res/xml/full_backup_content.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_keyboard_arrow_right_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_privacy_tip_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/themable.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | false 8 | 9 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ar/full_description.txt: -------------------------------------------------------------------------------- 1 | يسمح لك Androidacy مدير إضافات Magisk بإدارة الإضافات ل Magisk و KernelSU. تصفح الإضافات وابحث عنها وقم بتنزيلها من ريبو Androidacy، أو قم بتثبيت الإضافات من أي مصدر آخر ، بما في ذلك المصادر المتوافقة عبر الإنترنت. يمكنك أيضا إدارة الإضافات المثبتة، بما في ذلك تفعيلها وتعطيلها وإلغاء تثبيتها. 2 | 3 | لاحظ أن هذا التطبيق ليس له أي ارتباط مع Magisk أو Google أو أي من مطوريها. تتم إدارة الريبوز بشكل مستقل ولا يمكننا تقديم الدعم لها. 4 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/OverScrollManager.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm 6 | 7 | class OverScrollManager { 8 | interface OverScrollHelper { 9 | val overScrollInsetTop: Int 10 | val overScrollInsetBottom: Int 11 | } 12 | } -------------------------------------------------------------------------------- /fastlane/metadata/android/pl/full_description.txt: -------------------------------------------------------------------------------- 1 | AMM (Menedżer Modułów Androidacy) umożliwia zarządzanie modułami dla Magisk i KernelSU. Przeglądaj, wyszukuj i pobieraj moduły z repozytorium modułów Androidacy lub instaluj moduły z dowolnego innego źródła, w tym z kompatybilnych źródeł online. Możesz także zarządzać zainstalowanymi modułami, w tym włączać je, wyłączać i odinstalowywać. 2 | 3 | Aplikacja nie jest powiązana z Magisk, Google ani żadnym z ich programistów. Repozytoria są zarządzane niezależnie i nie możemy zapewnić dla nich wsparcia. 4 | -------------------------------------------------------------------------------- /rundebug: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 4 | # 5 | 6 | # File created to run debug when IDE is failing. 7 | ./gradlew app:assembleDefaultDebug 8 | adb install -r -t -d ./app/build/outputs/apk/default/debug/app-default-debug.apk 9 | if [ "$?" == "0" ]; then 10 | adb shell am start com.fox2code.mmm.debug/com.fox2code.mmm.MainActivity 11 | fi 12 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | Androidacy Module Manager allows you to manage modules for Magisk and KernelSU. Browse, search, and download modules from the Androidacy Module Repository, or install modules from any other source, including compatible online sources. You can also manage your installed modules, including enabling, disabling, and uninstalling them. 2 | 3 | Note that this app has no affiliation with Magisk, Google, or any of their developers. Repositories are independently managed and we cannot provide support for them. -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 8dp 7 | 8dp 8 | 5dp 9 | 10dp 10 | 20dp 11 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/utils/room/ReposListDatabase.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.utils.room 6 | 7 | import androidx.room.Database 8 | import androidx.room.RoomDatabase 9 | 10 | @Database(entities = [ReposList::class], version = 1) 11 | abstract class ReposListDatabase : RoomDatabase() { 12 | abstract fun reposListDao(): ReposListDao 13 | } -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/utils/FastException.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.utils 6 | 7 | class FastException private constructor() : RuntimeException() { 8 | @Synchronized 9 | override fun fillInStackTrace(): Throwable { 10 | return this 11 | } 12 | 13 | companion object { 14 | val INSTANCE = FastException() 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/res/font/jetbrainsmono.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_access_time_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCacheDatabase.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.utils.room 6 | 7 | import androidx.room.Database 8 | import androidx.room.RoomDatabase 9 | 10 | @Database(entities = [ModuleListCache::class], version = 1) 11 | abstract class ModuleListCacheDatabase : RoomDatabase() { 12 | abstract fun moduleListCacheDao(): ModuleListCacheDao 13 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_people_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/xml/shared_file_paths.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/menu/compat_menu.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 7 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_download_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/menu/update_nav.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 7 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_warning_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_check_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/XRepo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm 6 | 7 | import androidx.annotation.Keep 8 | 9 | /** 10 | * Class made to expose some repo functions to xposed modules. 11 | * It will not be obfuscated on release builds 12 | */ 13 | @Keep 14 | abstract class XRepo { 15 | @get:Keep 16 | abstract val isEnabledByDefault: Boolean 17 | 18 | @get:Keep 19 | @set:Keep 20 | abstract var isEnabled: Boolean 21 | 22 | @get:Keep 23 | abstract val name: String? 24 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_close_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_baseline_circle_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_delete_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_info_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_arrow_back_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_error_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_keyboard_return_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_patreon.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_storage_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_delete_outline_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_security_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/utils/room/ReposList.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.utils.room 6 | 7 | import androidx.room.Entity 8 | 9 | @Entity(tableName = "ReposList", primaryKeys = ["id"], indices = [androidx.room.Index(value = ["id"], unique = true)]) 10 | data class ReposList( 11 | var id: String, 12 | var url: String, 13 | var enabled: Boolean, 14 | var donate: String?, 15 | var support: String?, 16 | var submitModule: String?, 17 | var lastUpdate: Int, 18 | var name: String, 19 | var website: String? 20 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_add_box_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_list_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/values-night-v31/themes.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/utils/TimberUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.utils 6 | 7 | import com.fox2code.mmm.BuildConfig 8 | import com.fox2code.mmm.MainApplication.ReleaseTree 9 | import timber.log.Timber 10 | import timber.log.Timber.Forest.plant 11 | 12 | object TimberUtils { 13 | 14 | @JvmStatic 15 | fun configTimber() { 16 | // init timber 17 | // init timber 18 | if (BuildConfig.DEBUG) { 19 | plant(Timber.DebugTree()) 20 | } else { 21 | plant(ReleaseTree()) 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_numbers_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_verified_user_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_vpn_key_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_checkbox.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 9 | 10 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_system_update_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_upload_file_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reboot_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_material_switch.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/assets/module_installer_test.sh: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | # 3 | # Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 4 | # 5 | 6 | # This script is only used to test debug builds 7 | 8 | umask 022 9 | 10 | API=$(getprop ro.build.version.sdk) 11 | OUTFD=$2 12 | ZIPFILE=$3 13 | MODPATH="${ZIPFILE%/*}" 14 | 15 | ui_print() { echo "$1"; } 16 | abort() { 17 | ui_print "$1" 18 | [ -f $MODPATH/customize.sh ] && rm -f $MODPATH/customize.sh 19 | exit 1 20 | } 21 | 22 | ui_print "! Using rootless installer test script" 23 | 24 | unzip -o "$ZIPFILE" customize.sh -d $MODPATH >&2 25 | 26 | [ -f $MODPATH/customize.sh ] && . $MODPATH/customize.sh 27 | 28 | ui_print "- Done" 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_notifications_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_refresh_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_favorite_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_save_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_system_update_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_cloud_download_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_network_wifi_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_delete_forever_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_sort_by_alpha_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_gitlab.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG] REPLACE_ME" 5 | labels: bug, waiting for triage 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Device info(please complete the following information):** 27 | - Device: [e.g. iPhone6] 28 | - OS: [ROM and version, ie Havoc-OS 4.12] 29 | - App Version [e.g. 22] 30 | 31 | **Additional context** 32 | Add any other context about the problem here. 33 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_block_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_notification_important_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_lock_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_update_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_xda.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_extension_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/markdown/MarkdownChip.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.markdown 6 | 7 | import androidx.annotation.StringRes 8 | import com.fox2code.mmm.R 9 | 10 | enum class MarkdownChip( 11 | @field:StringRes @param:StringRes val title: Int, 12 | @field:StringRes @param:StringRes val desc: Int 13 | ) { 14 | CHANGE_BOOT( 15 | R.string.module_can_change_boot, 16 | R.string.module_can_change_boot_desc 17 | ), 18 | NEED_RAMDISK( 19 | R.string.module_needs_ramdisk, R.string.module_needs_ramdisk_desc 20 | ), 21 | MIN_MAGISK(R.string.module_min_magisk_chip, 0), MIN_SDK( 22 | R.string.module_min_sdk_chip, 0 23 | ), 24 | MAX_SDK(R.string.module_max_sdk_chip, 0) 25 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_copy_all_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_cloud_off_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_restart_alt_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_hide_source_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_bug_report_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_monetization_on_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_android_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_support_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/menu/setup_bottom_nav.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 7 | 8 | 15 | 16 | 17 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_monetization_on_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /.github/workflows/dependencies.yml: -------------------------------------------------------------------------------- 1 | name: Dependencies 2 | on: 3 | push: 4 | branches: 5 | - master # run the action on your projects default branch 6 | paths-ignore: 7 | - '**.md' 8 | 9 | jobs: 10 | build: 11 | name: Dependencies 12 | runs-on: ubuntu-latest 13 | permissions: # The Dependency Submission API requires write permission 14 | contents: write 15 | steps: 16 | - name: 'Checkout Repository' 17 | uses: actions/checkout@v3 18 | 19 | - name: Set up JDK 17 20 | uses: actions/setup-java@v3 21 | with: 22 | java-version: 17 23 | distribution: 'temurin' 24 | 25 | - name: Setup Android SDK 26 | uses: android-actions/setup-android@v2 27 | 28 | - name: Setup Gradle 29 | uses: gradle/gradle-build-action@v2 30 | 31 | - name: Change wrapper permissions 32 | run: chmod +x ./gradlew 33 | 34 | - name: Run snapshot action 35 | uses: mikepenz/gradle-dependency-submission@v1 36 | with: 37 | gradle-project-path: "." 38 | gradle-build-module: ":app" -------------------------------------------------------------------------------- /app/src/main/res/menu/bottom_nav_install.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 7 | 12 | 17 | 23 | 24 | -------------------------------------------------------------------------------- /docs/examples/example_module/customize.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 5 | # 6 | 7 | if [ -n "$MMM_EXT_SUPPORT" ]; then 8 | ui_print "#!useExt" 9 | mmm_exec() { 10 | ui_print "$(echo "#!$@")" 11 | } 12 | else 13 | mmm_exec() { true; } 14 | abort "! This module need to be executed in Androidacy Module Manager" 15 | exit 1 16 | fi 17 | 18 | ui_print "- Doing stuff" 19 | ui_print "- Current state: LOADING" 20 | mmm_exec showLoading 21 | sleep 4 22 | mmm_exec setLastLine "- Current state: LOADING AGAIN" 23 | sleep 4 24 | mmm_exec setLastLine "- Current state: LOADED" 25 | mmm_exec hideLoading 26 | ui_print "- Doing more stuff" 27 | sleep 4 28 | # You can even set youtube links as support links 29 | # Note: Button only appear once install ended 30 | mmm_exec setSupportLink "https://youtu.be/dQw4w9WgXcQ" 31 | ui_print "- Modules installer can also set custom shortcut" 32 | abort "! Check top right button to see where it goes" -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_paypal_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/menu/bottom_nav_menu.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 7 | 8 | 13 | 18 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_palette_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/utils/io/net/HttpException.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.utils.io.net 6 | 7 | import androidx.annotation.Keep 8 | import java.io.IOException 9 | 10 | class HttpException : IOException { 11 | val errorCode: Int 12 | 13 | internal constructor(text: String?, errorCode: Int) : super(text) { 14 | this.errorCode = errorCode 15 | } 16 | 17 | @Keep 18 | constructor(errorCode: Int) : super("Received error code: $errorCode") { 19 | this.errorCode = errorCode 20 | } 21 | 22 | fun shouldTimeout(): Boolean { 23 | return when (errorCode) { 24 | 419, 429, 503 -> true 25 | else -> false 26 | } 27 | } 28 | 29 | companion object { 30 | fun shouldTimeout(exception: Exception?): Boolean { 31 | return exception is HttpException && 32 | exception.shouldTimeout() 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_telegram_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_design_services_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_github.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | @file:Suppress("UnstableApiUsage") 6 | 7 | plugins { 8 | id("com.gradle.enterprise") version("3.13") 9 | } 10 | 11 | gradleEnterprise { 12 | if (System.getenv("CI") != null) { 13 | buildScan { 14 | publishAlways() 15 | termsOfServiceUrl = "https://gradle.com/terms-of-service" 16 | termsOfServiceAgree = "yes" 17 | } 18 | } 19 | } 20 | 21 | dependencyResolutionManagement { 22 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 23 | repositories { 24 | google() 25 | mavenCentral() 26 | maven { 27 | setUrl("https://jitpack.io") 28 | } 29 | gradlePluginPortal() 30 | } 31 | } 32 | 33 | enableFeaturePreview("STABLE_CONFIGURATION_CACHE") 34 | 35 | // val isCiServer = System.getenv().containsKey("CI") 36 | // Cache build artifacts, so expensive operations do not need to be re-computed 37 | buildCache { 38 | local { 39 | isEnabled = true 40 | } 41 | } 42 | 43 | rootProject.name = "MagiskModuleManager" 44 | include(":app") 45 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_settings_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/raw/gstatic_root_ca: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG 3 | A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv 4 | b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw 5 | MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i 6 | YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT 7 | aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ 8 | jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp 9 | xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp 10 | 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG 11 | snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ 12 | U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 13 | 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E 14 | BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B 15 | AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz 16 | yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE 17 | 38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP 18 | AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad 19 | DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME 20 | HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== 21 | -----END CERTIFICATE----- 22 | -------------------------------------------------------------------------------- /app/src/main/res/raw/androidacy_root_ca: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG 3 | A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv 4 | b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw 5 | MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i 6 | YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT 7 | aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ 8 | jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp 9 | xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp 10 | 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG 11 | snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ 12 | U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 13 | 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E 14 | BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B 15 | AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz 16 | yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE 17 | 38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP 18 | AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad 19 | DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME 20 | HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== 21 | -----END CERTIFICATE----- 22 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/background/BackgroundBootListener.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.background 6 | 7 | import android.content.BroadcastReceiver 8 | import android.content.Context 9 | import android.content.Intent 10 | import com.fox2code.mmm.MainApplication 11 | import com.fox2code.mmm.utils.io.net.Http 12 | 13 | class BackgroundBootListener : BroadcastReceiver() { 14 | override fun onReceive(context: Context, intent: Intent) { 15 | if (BOOT_COMPLETED != intent.action) return 16 | if (!MainApplication.isBackgroundUpdateCheckEnabled) return 17 | if (!Http.hasConnectivity(context)) return 18 | // clear boot shared prefs 19 | MainApplication.bootSharedPreferences!!.edit().clear().apply() 20 | synchronized(BackgroundUpdateChecker.lock) { 21 | Thread { 22 | BackgroundUpdateChecker.onMainActivityCreate(context) 23 | BackgroundUpdateChecker.doCheck(context) 24 | }.start() 25 | } 26 | } 27 | 28 | companion object { 29 | private const val BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED" 30 | } 31 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | ## For more details on how to configure your build environment visit 2 | # http://www.gradle.org/docs/current/userguide/build_environment.html 3 | # 4 | # Specifies the JVM arguments used for the daemon process. 5 | # The setting is particularly useful for tweaking memory settings. 6 | # Default value: -Xmx1024m -XX:MaxPermSize=256m 7 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 8 | # 9 | # When configured, Gradle will run in incubating parallel mode. 10 | # This option should only be used with decoupled projects. More details, visit 11 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 12 | # org.gradle.parallel=true 13 | #Tue Jul 18 21:42:11 EDT 2023 14 | #android.defaults.buildfeatures.buildconfig=true 15 | android.enableJetifier=false 16 | android.enableR8.fullMode=true 17 | android.useAndroidX=true 18 | org.gradle.caching=true 19 | org.gradle.configuration-cache=false # temporarily disabled due to https://github.com/getsentry/sentry-android-gradle-plugin/issues/554 20 | org.gradle.configuration-cache.problems=warn 21 | org.gradle.jvmargs=-Xmx1536M -Dorg.gradle.android.cache-fix.ignoreVersionCheck\=true -Dkotlin.daemon.jvm.options\="-Xmx1536M" -Dfile.encoding\=UTF-8 -XX\:+UseParallelGC -XX\:ReservedCodeCacheSize\=768m 22 | org.gradle.parallel=true 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_language_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/xml/credits_preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 13 | 14 | 20 | 21 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/raw/sentry_io_root_ca: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh 3 | MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 4 | d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD 5 | QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT 6 | MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j 7 | b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG 8 | 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB 9 | CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 10 | nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt 11 | 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P 12 | T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 13 | gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO 14 | BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR 15 | TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw 16 | DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr 17 | hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg 18 | 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF 19 | PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls 20 | YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk 21 | CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /app/src/main/assets/module_installer_wrapper.sh: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | 3 | # 4 | # Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 5 | # 6 | 7 | # echo before loading util_functions 8 | ui_print() { echo "$1"; } 9 | 10 | OUTFD=$2 11 | ZIPFILE=$3 12 | TMPDIR=/dev/tmp 13 | 14 | # Prevent setenforce because it can causes issues on some devices 15 | setenforce() { true; } 16 | # prevent old modules from disabling hidden_apis, please use LSPosed library instead. 17 | # See: https://github.com/LSPosed/AndroidHiddenApiBypass 18 | settings() { 19 | if [ "$1" == "put" ] && [ "$2" == "global" ] && ([ "$3" == "hidden_api_policy" ] || \ 20 | [ "$3" == "hidden_api_policy_p_apps" ] || [ "$3" == "hidden_api_policy_pre_p_apps" ]); then 21 | true 22 | else 23 | "$(which settings)" "$@" 24 | fi 25 | } 26 | 27 | rm -rf $TMPDIR 2>/dev/null 28 | mkdir -p $TMPDIR 29 | chcon u:object_r:system_file:s0 $TMPDIR || true 30 | cd $TMPDIR 31 | 32 | abort() { 33 | ui_print "$1" 34 | rm -rf $TMPDIR 35 | exit 1 36 | } 37 | 38 | unzip -o "$ZIPFILE" "META-INF/com/google/android/update-binary" -d $TMPDIR >&2 39 | [ ! -f "$TMPDIR/META-INF/com/google/android/update-binary" ] && abort "! Unable to extract zip file!" 40 | 41 | . "$TMPDIR/META-INF/com/google/android/update-binary" 42 | 43 | rm -rf $TMPDIR 44 | exit 0 45 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/utils/ProcessHelper.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | package com.fox2code.mmm.utils 5 | 6 | import android.app.AlarmManager 7 | import android.app.PendingIntent 8 | import android.content.Context 9 | import android.content.Intent 10 | import com.fox2code.mmm.MainActivity 11 | import java.util.concurrent.ThreadLocalRandom 12 | import kotlin.system.exitProcess 13 | 14 | enum class ProcessHelper { 15 | ; 16 | 17 | companion object { 18 | private val sPendingIntentId = ThreadLocalRandom.current().nextInt(100, 1000000 + 1) 19 | fun restartApplicationProcess(context: Context) { 20 | val mStartActivity = Intent(context, MainActivity::class.java) 21 | mStartActivity.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK 22 | val mPendingIntent = PendingIntent.getActivity( 23 | context, sPendingIntentId, 24 | mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE 25 | ) 26 | val mgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager 27 | mgr[AlarmManager.RTC, System.currentTimeMillis() + 100] = mPendingIntent 28 | exitProcess(0) // Exit app process 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_discord_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/raw/gh_main_crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIID0zCCArugAwIBAgIQVmcdBOpPmUxvEIFHWdJ1lDANBgkqhkiG9w0BAQwFADB7 3 | MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD 4 | VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE 5 | AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4 6 | MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5 7 | MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBO 8 | ZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0 9 | aG9yaXR5MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEGqxUWqn5aCPnetUkb1PGWthL 10 | q8bVttHmc3Gu3ZzWDGH926CJA7gFFOxXzu5dP+Ihs8731Ip54KODfi2X0GHE8Znc 11 | JZFjq38wo7Rw4sehM5zzvy5cU7Ffs30yf4o043l5o4HyMIHvMB8GA1UdIwQYMBaA 12 | FKARCiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1 13 | xmNjmjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zARBgNVHSAECjAI 14 | MAYGBFUdIAAwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5j 15 | b20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEEKDAmMCQG 16 | CCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQEM 17 | BQADggEBABns652JLCALBIAdGN5CmXKZFjK9Dpx1WywV4ilAbe7/ctvbq5AfjJXy 18 | ij0IckKJUAfiORVsAYfZFhr1wHUrxeZWEQff2Ji8fJ8ZOd+LygBkc7xGEJuTI42+ 19 | FsMuCIKchjN0djsoTI0DQoWz4rIjQtUfenVqGtF8qmchxDM6OW1TyaLtYiKou+JV 20 | bJlsQ2uRl9EMC5MCHdK8aXdJ5htN978UeAOwproLtOGFfy/cQjutdAFI3tZs4RmY 21 | CV4Ks2dH/hzg1cEo70qLRDEmBDeNiXQ2Lu+lIg+DdEmSx/cQwgwp+7e9un/jX9Wf 22 | 8qn0dNW44bOwgeThpWOjzOoEeJBuv/c= 23 | -----END CERTIFICATE----- 24 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/ExpiredActivity.kt: -------------------------------------------------------------------------------- 1 | package com.fox2code.mmm 2 | 3 | import android.annotation.SuppressLint 4 | import android.content.Intent 5 | import android.net.Uri 6 | import android.os.Bundle 7 | import androidx.appcompat.app.AppCompatActivity 8 | import com.google.android.material.button.MaterialButton 9 | 10 | class ExpiredActivity : AppCompatActivity() { 11 | @SuppressLint("RestrictedApi") 12 | override fun onCreate(savedInstanceState: Bundle?) { 13 | super.onCreate(savedInstanceState) 14 | setContentView(R.layout.activity_expired) 15 | // download_button leads to the download page and uninstall_button leads to the uninstall dialog 16 | val downloadBtn = findViewById(R.id.download_button) 17 | val uninstallBtn = findViewById(R.id.uninstall_button) 18 | downloadBtn.setOnClickListener { 19 | // open https://www.androidacy.com/downloads/?view=FoxMMM 20 | startActivity( 21 | Intent( 22 | Intent.ACTION_VIEW, 23 | Uri.parse("https://www.androidacy.com/downloads/?view=FoxMMM") 24 | ) 25 | ) 26 | } 27 | uninstallBtn.setOnClickListener { 28 | // open system uninstall dialog 29 | val intent = Intent(Intent.ACTION_DELETE) 30 | // discover our package name 31 | intent.data = Uri.parse("package:$packageName") 32 | startActivity(intent) 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/custom_repo_input.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 22 | 23 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_app_settings_alt_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | #70000000 7 | #70FFFFFF 8 | #00000000 9 | #FF000000 10 | #FFFFFFFF 11 | @color/transparent 12 | @color/white_transparent 13 | 14 | #FF9B08 15 | @android:color/white 16 | 17 | #FF202020 18 | #FF111111 19 | #FFFFFFFF 20 | #FFFFFFFF 21 | #3A3A3A 22 | #424242 23 | #2196F3 24 | #2196F3 25 | #1976D2 26 | #3F51B5 27 | #3F51B5 28 | #303F9F 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/settings_activity.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 12 | 20 | 21 | 32 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/module/ModuleSorter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.module 6 | 7 | import androidx.annotation.DrawableRes 8 | import com.fox2code.mmm.R 9 | 10 | enum class ModuleSorter(@field:DrawableRes @JvmField val icon: Int) : Comparator { 11 | UPDATE(R.drawable.ic_baseline_update_24) { 12 | override operator fun next(): ModuleSorter { 13 | return ALPHA 14 | } 15 | }, 16 | ALPHA(R.drawable.ic_baseline_sort_by_alpha_24) { 17 | override fun compare(holder1: ModuleHolder, holder2: ModuleHolder): Int { 18 | val type1 = holder1.type 19 | val type2 = holder2.type 20 | if (type1 === type2 && type1 === ModuleHolder.Type.INSTALLABLE) { 21 | var compare = holder1.filterLevel.compareTo(holder2.filterLevel) 22 | if (compare != 0) return compare 23 | compare = holder1.mainModuleNameLowercase 24 | .compareTo(holder2.mainModuleNameLowercase) 25 | if (compare != 0) return compare 26 | } 27 | return super.compare(holder1, holder2) 28 | } 29 | 30 | override operator fun next(): ModuleSorter { 31 | return UPDATE 32 | } 33 | }; 34 | 35 | override fun compare(holder1: ModuleHolder, holder2: ModuleHolder): Int { 36 | return holder1.compareTo(holder2) 37 | } 38 | 39 | abstract operator fun next(): ModuleSorter? 40 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_foreground.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 16 | 20 | 21 | 26 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/raw/gh_root_ca: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIEyDCCA7CgAwIBAgIQDPW9BitWAvR6uFAsI8zwZjANBgkqhkiG9w0BAQsFADBh 3 | MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 4 | d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH 5 | MjAeFw0yMTAzMzAwMDAwMDBaFw0zMTAzMjkyMzU5NTlaMFkxCzAJBgNVBAYTAlVT 6 | MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMzAxBgNVBAMTKkRpZ2lDZXJ0IEdsb2Jh 7 | bCBHMiBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTCCASIwDQYJKoZIhvcNAQEBBQAD 8 | ggEPADCCAQoCggEBAMz3EGJPprtjb+2QUlbFbSd7ehJWivH0+dbn4Y+9lavyYEEV 9 | cNsSAPonCrVXOFt9slGTcZUOakGUWzUb+nv6u8W+JDD+Vu/E832X4xT1FE3LpxDy 10 | FuqrIvAxIhFhaZAmunjZlx/jfWardUSVc8is/+9dCopZQ+GssjoP80j812s3wWPc 11 | 3kbW20X+fSP9kOhRBx5Ro1/tSUZUfyyIxfQTnJcVPAPooTncaQwywa8WV0yUR0J8 12 | osicfebUTVSvQpmowQTCd5zWSOTOEeAqgJnwQ3DPP3Zr0UxJqyRewg2C/Uaoq2yT 13 | zGJSQnWS+Jr6Xl6ysGHlHx+5fwmY6D36g39HaaECAwEAAaOCAYIwggF+MBIGA1Ud 14 | EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFHSFgMBmx9833s+9KTeqAx2+7c0XMB8G 15 | A1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485MA4GA1UdDwEB/wQEAwIBhjAd 16 | BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYIKwYBBQUHAQEEajBoMCQG 17 | CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQAYIKwYBBQUHMAKG 18 | NGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RH 19 | Mi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29t 20 | L0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDA9BgNVHSAENjA0MAsGCWCGSAGG/WwC 21 | ATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgGBmeBDAECAzANBgkqhkiG 22 | 9w0BAQsFAAOCAQEAkPFwyyiXaZd8dP3A+iZ7U6utzWX9upwGnIrXWkOH7U1MVl+t 23 | wcW1BSAuWdH/SvWgKtiwla3JLko716f2b4gp/DA/JIS7w7d7kwcsr4drdjPtAFVS 24 | slme5LnQ89/nD/7d+MS5EHKBCQRfz5eeLjJ1js+aWNJXMX43AYGyZm0pGrFmCW3R 25 | bpD0ufovARTFXFZkAdl9h6g4U5+LXUZtXMYnhIHUfoyMo5tS58aI7Dd8KvvwVVo4 26 | chDYABPPTHPbqjc1qCmBaZx2vN4Ye5DUys/vZwP9BFohFrH/6j/f3IL16/RZkiMN 27 | JCqVJUzKoZHm1Lesh3Sz8W2jmdv51b2EQJ8HmA== 28 | -----END CERTIFICATE----- 29 | -------------------------------------------------------------------------------- /app/src/main/assets/anykernel3_installer.sh: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) 2019-2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | # 4 | 5 | if [ -z "$AK3TMPFS" ]; then 6 | echo "AK3TMPFS is not defined? Are you running FoxMMM?" 7 | exit 1 8 | fi 9 | 10 | if [ ! -e "$AK3TMPFS" ]; then 11 | mkdir $AK3TMPFS 12 | chmod 755 $AK3TMPFS 13 | fi 14 | 15 | ZIPFILE=$3; 16 | 17 | # Mount tmpfs early 18 | mount -t tmpfs -o size=400M,noatime tmpfs $AK3TMPFS; 19 | mount | grep -q " $AK3TMPFS " || exit 1; 20 | 21 | unzip -p $Z tools*/busybox > $AK3TMPFS/busybox; 22 | unzip -p $Z META-INF/com/google/android/update-binary > $AK3TMPFS/update-binary; 23 | ## 24 | 25 | chmod 755 $AK3TMPFS/busybox; 26 | $AK3TMPFS/busybox chmod 755 $AK3TMPFS/update-binary; 27 | $AK3TMPFS/busybox chown root:root $AK3TMPFS/busybox $AK3TMPFS/update-binary; 28 | 29 | # work around Android passing the app what is actually a non-absolute path 30 | AK3TMPFS=$($AK3TMPFS/busybox readlink -f $AK3TMPFS); 31 | 32 | # AK3 allows the zip to be flashed from anywhere so avoids any need to remount / 33 | if $AK3TMPFS/busybox grep -q AnyKernel3 $AK3TMPFS/update-binary; then 34 | # work around more restrictive upstream SELinux policies for Magisk <19306 35 | magiskpolicy --live "allow kernel app_data_file file write" || true; 36 | else 37 | echo "Module is not an AnyKernel3 module!" 38 | exit 1 39 | fi; 40 | 41 | # update-binary 42 | ASH_STANDALONE=1 AKHOME=$AK3TMPFS/anykernel $AK3TMPFS/busybox ash $AK3TMPFS/update-binary 3 1 "$Z"; 43 | RC=$?; 44 | 45 | # Original script delete all generated files, 46 | # But we just need to unmount as we store everything inside tmpfs 47 | umount $AK3TMPFS; 48 | 49 | return $RC; -------------------------------------------------------------------------------- /app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | system 10 | dark 11 | black 12 | transparent_light 13 | 14 | light 15 | 16 | 17 | 18 | @string/theme_system 19 | @string/theme_dark 20 | @string/theme_black 21 | 22 | @string/theme_transparent_light 23 | @string/theme_light 24 | 25 | 26 | 27 | @string/update_frequency_15 28 | @string/update_frequency_30 29 | @string/update_frequency_60 30 | @string/update_frequency_360 31 | @string/update_frequency_720 32 | @string/update_frequency_1440 33 | 34 | 35 | 15 36 | 30 37 | 60 38 | 360 39 | 720 40 | 1440 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/webview.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 19 | 20 | 25 | 26 | 27 | 28 | 29 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/xml/app_info_preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 17 | 22 | 27 | 32 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | androidacy.com 8 | 9 | 10 | 11 | 12 | 13 | github.com 14 | 15 | 16 | 17 | 18 | 19 | githubusercontent.com 20 | 21 | 22 | 23 | 24 | 25 | gstatic.com 26 | 27 | 28 | 29 | 30 | 31 | ingest.sentry.io 32 | 33 | 34 | 35 | 36 | 37 | sentry.io 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/xml/privacy_preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 17 | 18 | 28 | 29 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/raw/sentry_root_ca: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw 3 | TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh 4 | cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 5 | WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu 6 | ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY 7 | MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc 8 | h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ 9 | 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U 10 | A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW 11 | T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH 12 | B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC 13 | B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv 14 | KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn 15 | OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn 16 | jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw 17 | qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI 18 | rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV 19 | HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq 20 | hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL 21 | ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ 22 | 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK 23 | NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 24 | ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur 25 | TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC 26 | jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc 27 | oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq 28 | 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA 29 | mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d 30 | emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= 31 | -----END CERTIFICATE----- 32 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/settings/LongClickablePreference.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.settings 6 | 7 | import android.content.Context 8 | import android.util.AttributeSet 9 | import android.view.View 10 | import androidx.preference.Preference 11 | import androidx.preference.PreferenceViewHolder 12 | 13 | class LongClickablePreference : Preference { 14 | var onPreferenceLongClickListener: OnPreferenceLongClickListener? = null 15 | 16 | constructor( 17 | context: Context, 18 | attrs: AttributeSet?, 19 | defStyleAttr: Int, 20 | defStyleRes: Int 21 | ) : super(context, attrs, defStyleAttr, defStyleRes) 22 | 23 | constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( 24 | context, 25 | attrs, 26 | defStyleAttr 27 | ) 28 | 29 | constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) 30 | constructor(context: Context) : super(context) 31 | 32 | override fun onBindViewHolder(holder: PreferenceViewHolder) { 33 | super.onBindViewHolder(holder) 34 | holder.itemView.setOnLongClickListener { _: View? -> performLongClick() } 35 | } 36 | 37 | private fun performLongClick(): Boolean { 38 | if (!this.isEnabled || !this.isSelectable) { 39 | return false 40 | } 41 | return if (onPreferenceLongClickListener != null) { 42 | onPreferenceLongClickListener!!.onPreferenceLongClick(this) 43 | } else false 44 | } 45 | 46 | fun interface OnPreferenceLongClickListener { 47 | /** 48 | * Called when a preference has been clicked. 49 | * 50 | * @param preference The preference that was clicked 51 | * @return `true` if the click was handled 52 | */ 53 | fun onPreferenceLongClick(preference: Preference): Boolean 54 | } 55 | } -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/repo/CustomRepoData.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | package com.fox2code.mmm.repo 5 | 6 | import com.fox2code.mmm.utils.io.net.Http.Companion.doHttpGet 7 | import org.json.JSONException 8 | import org.json.JSONObject 9 | import java.io.File 10 | import java.io.IOException 11 | import java.nio.charset.StandardCharsets 12 | 13 | class CustomRepoData internal constructor(url: String?, cacheRoot: File?) : RepoData( 14 | url!!, cacheRoot!! 15 | ) { 16 | var loadedExternal = false 17 | 18 | var override: String? = null 19 | override val isEnabledByDefault: Boolean 20 | get() = override != null || loadedExternal 21 | 22 | @Throws(IOException::class, JSONException::class) 23 | fun quickPrePopulate() { 24 | val jsonObject = JSONObject( 25 | String( 26 | doHttpGet( 27 | url, 28 | false 29 | ), StandardCharsets.UTF_8 30 | ) 31 | ) 32 | // make sure there's at least a name and a modules or data object 33 | require(!(!jsonObject.has("name") || !jsonObject.has("modules") && !jsonObject.has("data"))) { "Invalid repo: $url" } 34 | name = jsonObject.getString("name").trim { it <= ' ' } 35 | website = jsonObject.optString("website") 36 | support = jsonObject.optString("support") 37 | donate = jsonObject.optString("donate") 38 | submitModule = jsonObject.optString("submitModule") 39 | } 40 | 41 | fun toJSON(): Any? { 42 | return try { 43 | JSONObject() 44 | .put("id", preferenceId) 45 | .put("name", name) 46 | .put("website", website) 47 | .put("support", support) 48 | .put("donate", donate) 49 | .put("submitModule", submitModule) 50 | } catch (ignored: JSONException) { 51 | null 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/utils/room/ModuleListCache.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.utils.room 6 | 7 | import androidx.room.Entity 8 | 9 | @Entity(tableName = "modulelistcache", primaryKeys = ["codename"], indices = [androidx.room.Index(value = ["codename"], unique = true)]) 10 | class ModuleListCache ( 11 | var codename: String, 12 | var version: String, 13 | var versionCode: Int, 14 | var author: String, 15 | var description: String, 16 | var minApi: Int, 17 | var maxApi: Int, 18 | var minMagisk: Int, 19 | var needRamdisk: Boolean, 20 | var support: String, 21 | var donate: String, 22 | var config: String, 23 | var changeBoot: Boolean, 24 | var mmtReborn: Boolean, 25 | var repoId: String, 26 | var lastUpdate: Long, 27 | var name: String, 28 | var safe: Boolean, 29 | var stats: Int 30 | ) { 31 | // functions: 32 | // getAll(): List 33 | // getByCodename(codename: String): ModuleListCache 34 | // insert(moduleListCache: ModuleListCache) 35 | // update(moduleListCache: ModuleListCache) 36 | // delete(moduleListCache: ModuleListCache) 37 | // deleteAll() 38 | // count(): Int 39 | 40 | // get fun 41 | // getVersion(codename: String): String 42 | // getVersionCode(codename: String): Int 43 | // getAuthor(codename: String): String 44 | // getDescription(codename: String): String 45 | // getMinApi(codename: String): Int 46 | // getMaxApi(codename: String): Int 47 | // getMinMagisk(codename: String): Int 48 | // getNeedRamdisk(codename: String): Boolean 49 | // getSupport(codename: String): String 50 | // getDonate(codename: String): String 51 | // getConfig(codename: String): String 52 | // getChangeBoot(codename: String): Boolean 53 | // getMmtReborn(codename: String): Boolean 54 | // getRepoId(codename: String): String 55 | // getLastUpdate(codename: String): Long 56 | } -------------------------------------------------------------------------------- /app/src/main/res/xml/security_preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 15 | 16 | 17 | 18 | 26 | 27 | 35 | 36 | 37 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /app/src/main/res/layout/installer_wrap.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 12 | 25 | 26 | 34 | 35 | 42 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/utils/io/FileUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.utils.io 6 | 7 | import android.content.Context 8 | import com.fox2code.mmm.MainApplication 9 | import org.apache.commons.io.FileUtils 10 | import org.chromium.net.CronetEngine 11 | import timber.log.Timber 12 | import java.io.File 13 | import java.io.IOException 14 | import java.net.URL 15 | 16 | class FileUtils { 17 | private var urlFactoryInstalled = false 18 | 19 | fun ensureCacheDirs() { 20 | try { 21 | FileUtils.forceMkdir( 22 | File( 23 | (MainApplication.getInstance().dataDir.toString() + "/cache/WebView/Default/HTTP Cache/Code Cache/wasm").replace( 24 | "//".toRegex(), 25 | "/" 26 | ) 27 | ) 28 | ) 29 | FileUtils.forceMkdir( 30 | File( 31 | (MainApplication.getInstance().dataDir.toString() + "/cache/WebView/Default/HTTP Cache/Code Cache/js").replace( 32 | "//".toRegex(), 33 | "/" 34 | ) 35 | ) 36 | ) 37 | FileUtils.forceMkdir( 38 | File( 39 | (MainApplication.getInstance().dataDir.toString() + "/cache/cronet").replace( 40 | "//".toRegex(), 41 | "/" 42 | ) 43 | ) 44 | ) 45 | } catch (e: IOException) { 46 | Timber.e("Could not create cache dirs") 47 | } 48 | } 49 | 50 | fun ensureURLHandler(context: Context?) { 51 | if (!urlFactoryInstalled) { 52 | try { 53 | URL.setURLStreamHandlerFactory( 54 | CronetEngine.Builder(context).build().createURLStreamHandlerFactory() 55 | ) 56 | urlFactoryInstalled = true 57 | } catch (ignored: Error) { 58 | // Ignore 59 | } 60 | } 61 | } 62 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_blur_on_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /docs/examples/rainbow_module/customize.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 5 | # 6 | 7 | if [ ! "$ANSI_SUPPORT" == "true" ] || [ ! -n "$MMM_EXT_SUPPORT" ]; then 8 | abort "! This module need to be executed in Androidacy Module Manager with ANSI support" 9 | exit 1 10 | fi 11 | 12 | ui_print "#!useExt" 13 | mmm_exec() { 14 | ui_print "$(echo -e "#!$@")" 15 | } 16 | 17 | ESC="" 18 | # ESC="\e" 19 | RED="$ESC[91m" 20 | ORANGE="$ESC[33m" 21 | YELLOW="$ESC[93m" 22 | GREEN="$ESC[92m" 23 | CYAN="$ESC[96m" 24 | BLUE="$ESC[94m" 25 | PURPLE="$ESC[95m" 26 | RESET="$ESC[0m" 27 | 28 | ui_replace() { 29 | mmm_exec setLastLine "$1" 30 | } 31 | 32 | ui_print "${RED}R${ORANGE}A${YELLOW}I${GREEN}N${CYAN}B${BLUE}O${PURPLE}W${RESET}" 33 | mmm_exec showLoading 34 | sleep 1 35 | ui_replace "${PURPLE}R${RED}A${ORANGE}I${YELLOW}N${GREEN}B${CYAN}O${BLUE}W${RESET}" 36 | sleep 1 37 | ui_replace "${BLUE}R${PURPLE}A${RED}I${ORANGE}N${YELLOW}B${GREEN}O${CYAN}W${RESET}" 38 | sleep 1 39 | ui_replace "${CYAN}R${BLUE}A${PURPLE}I${RED}N${ORANGE}B${YELLOW}O${GREEN}W${RESET}" 40 | sleep 1 41 | ui_replace "${GREEN}R${CYAN}A${BLUE}I${PURPLE}N${RED}B${ORANGE}O${YELLOW}W${RESET}" 42 | sleep 1 43 | ui_replace "${YELLOW}R${GREEN}A${CYAN}I${BLUE}N${PURPLE}B${RED}O${ORANGE}W${RESET}" 44 | sleep 1 45 | ui_replace "${ORANGE}R${YELLOW}A${GREEN}I${CYAN}N${BLUE}B${PURPLE}O${RED}W${RESET}" 46 | sleep 1 47 | ui_replace "${RED}R${ORANGE}A${YELLOW}I${GREEN}N${CYAN}B${BLUE}O${PURPLE}W${RESET}" 48 | sleep 1 49 | ui_replace "${PURPLE}R${RED}A${ORANGE}I${YELLOW}N${GREEN}B${CYAN}O${BLUE}W${RESET}" 50 | sleep 1 51 | ui_replace "${BLUE}R${PURPLE}A${RED}I${ORANGE}N${YELLOW}B${GREEN}O${CYAN}W${RESET}" 52 | sleep 1 53 | ui_replace "${CYAN}R${BLUE}A${PURPLE}I${RED}N${ORANGE}B${YELLOW}O${GREEN}W${RESET}" 54 | sleep 1 55 | ui_replace "${GREEN}R${CYAN}A${BLUE}I${PURPLE}N${RED}B${ORANGE}O${YELLOW}W${RESET}" 56 | sleep 1 57 | ui_replace "${YELLOW}R${GREEN}A${CYAN}I${BLUE}N${PURPLE}B${RED}O${ORANGE}W${RESET}" 58 | sleep 1 59 | ui_replace "${ORANGE}R${YELLOW}A${GREEN}I${CYAN}N${BLUE}B${PURPLE}O${RED}W${RESET}" 60 | sleep 1 61 | ui_replace "${RED}R${ORANGE}A${YELLOW}I${GREEN}N${CYAN}B${BLUE}O${PURPLE}W${RESET}" 62 | mmm_exec hideLoading 63 | 64 | abort "! Rainbow module is not installable :3" 65 | 66 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/repo/RepoModule.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.repo 6 | 7 | import androidx.annotation.StringRes 8 | import com.fox2code.mmm.MainApplication 9 | import com.fox2code.mmm.manager.ModuleInfo 10 | 11 | class RepoModule { 12 | val repoData: RepoData 13 | 14 | val moduleInfo: ModuleInfo 15 | 16 | val id: String 17 | 18 | var repoName: String? = null 19 | 20 | var lastUpdated: Long = 0 21 | 22 | var propUrl: String? = null 23 | 24 | var zipUrl: String? = null 25 | 26 | var notesUrl: String? = null 27 | 28 | var checksum: String? = null 29 | 30 | var processed = false 31 | 32 | @StringRes 33 | var qualityText = 0 34 | 35 | var qualityValue = 0 36 | var safe: Boolean 37 | 38 | constructor(repoData: RepoData, id: String) { 39 | this.repoData = repoData 40 | moduleInfo = ModuleInfo(id) 41 | this.id = id 42 | moduleInfo.flags = moduleInfo.flags or ModuleInfo.FLAG_METADATA_INVALID 43 | safe = moduleInfo.safe 44 | } 45 | 46 | // allows all fields to be set- 47 | constructor( 48 | repoData: RepoData, 49 | id: String, 50 | name: String?, 51 | description: String?, 52 | author: String?, 53 | donate: String?, 54 | config: String?, 55 | support: String?, 56 | version: String?, 57 | versionCode: Int 58 | ) { 59 | this.repoData = repoData 60 | moduleInfo = ModuleInfo(id) 61 | this.id = id 62 | moduleInfo.name = name 63 | moduleInfo.description = description 64 | moduleInfo.author = author 65 | moduleInfo.donate = donate 66 | moduleInfo.config = config 67 | moduleInfo.support = support 68 | moduleInfo.version = version 69 | moduleInfo.versionCode = versionCode.toLong() 70 | moduleInfo.flags = moduleInfo.flags or ModuleInfo.FLAG_METADATA_INVALID and ModuleInfo.FLAG_MM_REMOTE_MODULE 71 | safe = moduleInfo.safe 72 | // if mainapplication.repomodules has this module, set the flag for remote module 73 | if (MainApplication.getInstance().repoModules.containsKey(id)) { 74 | moduleInfo.flags = moduleInfo.flags or ModuleInfo.FLAG_MM_REMOTE_MODULE 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/installer.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 12 | 23 | 24 | 32 | 33 | 34 | 42 | 43 | 50 | 51 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/utils/io/GMSProviderInstaller.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2021-2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | package com.fox2code.mmm.utils.io 5 | 6 | import android.content.Context 7 | import android.content.pm.PackageManager 8 | import com.fox2code.mmm.MainApplication 9 | import timber.log.Timber 10 | 11 | /** 12 | * Open implementation of ProviderInstaller.installIfNeeded 13 | * (Compatible with MicroG even without signature spoofing) 14 | */ 15 | // Note: This code is MIT because I took it from another unpublished project I had 16 | // I might upstream this to MicroG at some point 17 | enum class GMSProviderInstaller { 18 | ; 19 | 20 | companion object { 21 | private var called = false 22 | 23 | fun installIfNeeded(context: Context?) { 24 | if (context == null) { 25 | throw NullPointerException("Context must not be null") 26 | } 27 | if (called) return 28 | called = true 29 | try { 30 | // Trust default GMS implementation 31 | val remote = context.createPackageContext( 32 | "com.google.android.gms", 33 | Context.CONTEXT_INCLUDE_CODE or Context.CONTEXT_IGNORE_SECURITY 34 | ) 35 | val cl = 36 | remote.classLoader.loadClass("com.google.android.gms.common.security.ProviderInstallerImpl") 37 | cl.getDeclaredMethod("insertProvider", Context::class.java).invoke(null, remote) 38 | if (MainApplication.forceDebugLogging) Timber.i("Installed GMS security providers!") 39 | // next, try cronet provider 40 | val cronet = context.createPackageContext( 41 | "com.google.android.gms", 42 | Context.CONTEXT_INCLUDE_CODE or Context.CONTEXT_IGNORE_SECURITY 43 | ) 44 | val cronetCl = 45 | cronet.classLoader.loadClass("com.google.android.gms.common.security.ProviderInstallerImpl") 46 | cronetCl.getDeclaredMethod("insertProvider", Context::class.java).invoke(null, cronet) 47 | } catch (e: PackageManager.NameNotFoundException) { 48 | Timber.w("No GMS Implementation are installed on this device") 49 | } catch (e: Exception) { 50 | Timber.w(e) 51 | } 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/Constants.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm 6 | 7 | @Suppress("unused") 8 | enum class Constants { 9 | ; 10 | 11 | companion object { 12 | const val EXTRA_DOWNLOAD_TITLE: String = "Download" 13 | const val MAGISK_VER_CODE_FLAT_MODULES = 19000 14 | const val MAGISK_VER_CODE_UTIL_INSTALL = 20400 15 | const val MAGISK_VER_CODE_PATH_SUPPORT = 21000 16 | const val MAGISK_VER_CODE_INSTALL_COMMAND = 21200 17 | const val MAGISK_VER_CODE_MAGISK_ZYGOTE = 24000 18 | const val INTENT_INSTALL_INTERNAL = 19 | BuildConfig.APPLICATION_ID + ".intent.action.INSTALL_MODULE_INTERNAL" 20 | const val INTENT_ANDROIDACY_INTERNAL = 21 | BuildConfig.APPLICATION_ID + ".intent.action.OPEN_ANDROIDACY_INTERNAL" 22 | const val EXTRA_INSTALL_PATH = "extra_install_path" 23 | const val EXTRA_INSTALL_NAME = "extra_install_name" 24 | const val EXTRA_INSTALL_CONFIG = "extra_install_config" 25 | const val EXTRA_INSTALL_CHECKSUM = "extra_install_checksum" 26 | const val EXTRA_INSTALL_MMT_REBORN = "extra_install_mmt_reborn" 27 | const val EXTRA_INSTALL_NO_EXTENSIONS = "extra_install_no_extensions" 28 | const val EXTRA_INSTALL_TEST_ROOTLESS = "extra_install_test_rootless" 29 | const val EXTRA_ANDROIDACY_COMPAT_LEVEL = "extra_androidacy_compat_level" 30 | const val EXTRA_ANDROIDACY_ALLOW_INSTALL = "extra_androidacy_allow_install" 31 | const val EXTRA_ANDROIDACY_ACTIONBAR_TITLE = "extra_androidacy_actionbar_title" 32 | const val EXTRA_ANDROIDACY_ACTIONBAR_CONFIG = "extra_androidacy_actionbar_config" 33 | const val EXTRA_MARKDOWN_URL = "extra_markdown_url" 34 | const val EXTRA_MARKDOWN_TITLE = "extra_markdown_title" 35 | const val EXTRA_MARKDOWN_CONFIG = "extra_markdown_config" 36 | const val EXTRA_MARKDOWN_CHANGE_BOOT = "extra_markdown_change_boot" 37 | const val EXTRA_MARKDOWN_NEEDS_RAMDISK = "extra_markdown_needs_ramdisk" 38 | const val EXTRA_MARKDOWN_MIN_MAGISK = "extra_markdown_min_magisk" 39 | const val EXTRA_MARKDOWN_MIN_API = "extra_markdown_min_api" 40 | const val EXTRA_MARKDOWN_MAX_API = "extra_markdown_max_api" 41 | const val EXTRA_FADE_OUT = "extra_fade_out" 42 | const val EXTRA_FROM_MANAGER = "extra_from_manager" 43 | } 44 | } -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/markdown/MarkdownUrlLinker.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.markdown 6 | 7 | import com.fox2code.mmm.MainApplication 8 | import timber.log.Timber 9 | 10 | enum class MarkdownUrlLinker { 11 | ; 12 | 13 | private class LinkifyTask(val start: Int, val end: Int) { 14 | companion object { 15 | val NULL = LinkifyTask(0, 0) 16 | } 17 | } 18 | 19 | companion object { 20 | fun urlLinkify(url: String): String { 21 | var index = url.indexOf("https://") 22 | if (index == -1) return url 23 | val linkifyTasks = ArrayList() 24 | var extra = 0 25 | while (index != -1) { 26 | var end = url.indexOf(' ', index) 27 | end = if (end == -1) url.indexOf('\n', index) else url.indexOf('\n', index) 28 | .coerceAtMost(end) 29 | if (end == -1) end = url.length 30 | if (index == 0 || '\n' == url[index - 1] || ' ' == url[index - 1]) { 31 | val endDomain = url.indexOf('/', index + 9) 32 | val endCh = url[end - 1] 33 | if (endDomain != -1 && endDomain < end && endCh != '>' && endCh != ')' && endCh != ']') { 34 | linkifyTasks.add(LinkifyTask(index, end)) 35 | extra += end - index + 4 36 | if (MainApplication.forceDebugLogging) Timber.d("Linkify url: %s", url.substring(end)) 37 | } 38 | } 39 | index = url.indexOf("https://", end) 40 | } 41 | if (linkifyTasks.isEmpty()) return url 42 | var prev = LinkifyTask.NULL 43 | val stringBuilder = StringBuilder(url.length + extra) 44 | for (linkifyTask in linkifyTasks) { 45 | stringBuilder.append(url, prev.end, linkifyTask.start).append('[') 46 | .append(url, linkifyTask.start, linkifyTask.end).append("](") 47 | .append(url, linkifyTask.start, linkifyTask.end).append(')') 48 | prev = linkifyTask 49 | } 50 | if (prev.end != url.length) stringBuilder.append(url, prev.end, url.length) 51 | if (MainApplication.forceDebugLogging) Timber.i("Added Markdown link to " + linkifyTasks.size + " urls") 52 | return stringBuilder.toString() 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /app/src/main/res/values-v27/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/values-v29/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/markdown_view.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 13 | 22 | 23 | 27 | 28 | 33 | 34 | 40 | 41 | 48 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/utils/SyncManager.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | package com.fox2code.mmm.utils 5 | 6 | /** 7 | * Manager that want both to be thread safe and not to worry about thread safety 8 | * [.scan] and [.update] can be called from multiple 9 | * thread at the same time, [.scanInternal] will only be 10 | * called from one thread at a time only. 11 | */ 12 | abstract class SyncManager { 13 | protected val syncLock = Any() 14 | private var syncing = false 15 | private var lastSync: Long = 0 16 | fun scanAsync() { 17 | if (!syncing) { 18 | Thread({ this.scan() }, "Scan Thread").start() 19 | } 20 | } 21 | 22 | fun scan() { 23 | update(null) 24 | } 25 | 26 | // MultiThread friendly method 27 | @Suppress("NAME_SHADOWING") 28 | fun update(updateListener: UpdateListener?) { 29 | var updateListener = updateListener 30 | if (updateListener == null) updateListener = NO_OP 31 | if (!syncing) { 32 | // Do scan 33 | synchronized(syncLock) { 34 | if (System.currentTimeMillis() < lastSync + 50L) return // Skip sync if it was synced too recently 35 | syncing = true 36 | try { 37 | scanInternal(updateListener) 38 | } finally { 39 | lastSync = System.currentTimeMillis() 40 | syncing = false 41 | } 42 | } 43 | } else { 44 | // Wait for current scan 45 | synchronized(syncLock) { Thread.yield() } 46 | } 47 | } 48 | 49 | // Pause execution until the scan is completed if one is currently running 50 | fun afterScan() { 51 | if (syncing) synchronized(syncLock) { Thread.yield() } 52 | } 53 | 54 | fun runAfterScan(runnable: Runnable) { 55 | synchronized(syncLock) { runnable.run() } 56 | } 57 | 58 | fun afterUpdate() { 59 | if (syncing) synchronized(syncLock) { Thread.yield() } 60 | } 61 | 62 | fun runAfterUpdate(runnable: Runnable) { 63 | synchronized(syncLock) { runnable.run() } 64 | } 65 | 66 | // This method can't be called twice at the same time. 67 | protected abstract fun scanInternal(updateListener: UpdateListener) 68 | interface UpdateListener { 69 | fun update(value: Int) 70 | } 71 | 72 | companion object { 73 | private val NO_OP: UpdateListener = object : UpdateListener { 74 | override fun update(value: Int) { 75 | 76 | } 77 | } 78 | } 79 | } -------------------------------------------------------------------------------- /app/src/main/res/values-th/strings.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | สิทธิรูทถูกปฏิเสธโดยแอป Magisk 7 | กำลังโหลด 8 | อัพเดทได้ 9 | ติดตั้งแล้ว 10 | ข้อมูลออนไลน์ 11 | ดาวน์โหลดล้มเหลว 12 | การตั้งค่ากิจกรรม 13 | มีแอปเวอร์ชั่นใหม่พร้อมใช้งาน 14 | ไม่พบคำอธิบาย 15 | ติดตั้งโมดูล 16 | อัพเกรดโมดูล 17 | สนับสนุน 18 | บริจาค 19 | อัพเดท 20 | ติดตั้ง 21 | คำอธิบาย 22 | การกำหนดค่า 23 | รายงานจุดบกพร่อง 24 | ยอมรับโมดูล 25 | รีบูท 26 | ภาษา 27 | การอัพเดทครั้งล่าสุด 28 | ข้อมูลโมดูล 29 | โมดูลโดย 30 | ติดดาวโมดูล 31 | ไม่สามารถเปลี่ยนบูท 32 | ต้องการหน่วยข้อมูลแรมดิส 33 | ไม่สามารถเข้าถึง รูท หรือ Magisk 34 | แอป Magisk ไม่ได้ติดตั้งบนอุปกรณ์เครื่องนี้ 35 | แอปอยู่ในโหมดล็อกดาวน์ 36 | ไม่สามารถเชื่อมต่ออินเทอร์เน็ต 37 | ไม่สามารถเปิด ตัวแสดงเนื้อหาเว็บได้ 38 | ดาวน์โหลดโมดูล 39 | เว็บไซต์ 40 | ถอนการติดตั้ง 41 | ต้องการแอนดรอยด์12ขึ้นไป 42 | ดาวน์โหลดโมดูล 43 | ต้องการหน่วยข้อมูลแรมดิสเพื่อติดตั้ง 44 | โมดูลตัวนี้อาจเปลี่ยนไฟล์อิมเมจบูท 45 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/XHooks.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm 6 | 7 | import android.content.Context 8 | import android.content.Intent 9 | import android.content.pm.PackageManager 10 | import android.webkit.WebView 11 | import androidx.annotation.Keep 12 | import com.fox2code.mmm.manager.ModuleManager 13 | import com.fox2code.mmm.repo.RepoManager 14 | 15 | /** 16 | * Class made to expose some manager functions to xposed modules. 17 | * It will not be obfuscated on release builds 18 | * 19 | * TODO: Evaluate usage and deprecate if not needed 20 | */ 21 | @Suppress("UNUSED_PARAMETER") 22 | @Keep 23 | enum class XHooks { 24 | ; 25 | 26 | companion object { 27 | @Keep 28 | fun onRepoManagerInitialize() { 29 | // Call addXRepo here if you are an XPosed module 30 | } 31 | 32 | @Keep 33 | fun onRepoManagerInitialized() { 34 | } 35 | 36 | @Keep 37 | fun isModuleActive(moduleId: String?): Boolean { 38 | return ModuleManager.isModuleActive(moduleId!!) 39 | } 40 | 41 | @Keep 42 | @Throws(PackageManager.NameNotFoundException::class) 43 | fun checkConfigTargetExists(context: Context, packageName: String, config: String) { 44 | if ("org.lsposed.manager" == config && "org.lsposed.manager" == packageName && 45 | (isModuleActive("riru_lsposed") || isModuleActive("zygisk_lsposed")) 46 | ) return // Skip check for lsposed as it is probably injected into the system. 47 | context.packageManager.getPackageInfo(packageName, 0) 48 | } 49 | 50 | @Suppress("UNUSED_PARAMETER") 51 | @Keep 52 | fun getConfigIntent(context: Context, packageName: String?, config: String?): Intent? { 53 | return context.packageManager.getLaunchIntentForPackage(packageName!!) 54 | } 55 | 56 | @Keep 57 | fun onWebViewInitialize(webView: WebView?, allowInstall: Boolean) { 58 | if (webView == null) throw NullPointerException("WebView is null!") 59 | } 60 | 61 | @Keep 62 | fun addXRepo(url: String?, fallbackName: String?): XRepo { 63 | return url?.let { RepoManager.iNSTANCE_UNSAFE?.addOrGet(it, fallbackName) }!! 64 | } 65 | 66 | @Keep 67 | fun getXRepo(url: String?): XRepo { 68 | return RepoManager.iNSTANCE_UNSAFE?.get(url) 69 | ?: throw NullPointerException("Repo not found!") 70 | } 71 | 72 | @get:Keep 73 | val xRepos: Collection 74 | get() = RepoManager.iNSTANCE_UNSAFE!!.xRepos 75 | } 76 | } -------------------------------------------------------------------------------- /app/src/main/kotlin/com/fox2code/mmm/settings/SharedPreferenceDataStore.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 to present Androidacy and contributors. Names, logos, icons, and the Androidacy name are all trademarks of Androidacy and may not be used without license. See LICENSE for more information. 3 | */ 4 | 5 | package com.fox2code.mmm.settings 6 | 7 | import android.content.SharedPreferences 8 | import androidx.preference.PreferenceDataStore 9 | import com.fox2code.mmm.MainApplication 10 | import timber.log.Timber 11 | 12 | class SharedPreferenceDataStore(sharedPreferences: SharedPreferences) : PreferenceDataStore() { 13 | private val mSharedPreferences: SharedPreferences 14 | 15 | init { 16 | if (MainApplication.forceDebugLogging) Timber.d("SharedPreferenceDataStore: %s", sharedPreferences) 17 | mSharedPreferences = sharedPreferences 18 | } 19 | 20 | val sharedPreferences: SharedPreferences 21 | get() { 22 | if (MainApplication.forceDebugLogging) Timber.d("getSharedPreferences: %s", mSharedPreferences) 23 | return mSharedPreferences 24 | } 25 | 26 | override fun putString(key: String, value: String?) { 27 | mSharedPreferences.edit().putString(key, value).apply() 28 | } 29 | 30 | override fun putStringSet(key: String, values: Set?) { 31 | mSharedPreferences.edit().putStringSet(key, values).apply() 32 | } 33 | 34 | override fun putInt(key: String, value: Int) { 35 | mSharedPreferences.edit().putInt(key, value).apply() 36 | } 37 | 38 | override fun putLong(key: String, value: Long) { 39 | mSharedPreferences.edit().putLong(key, value).apply() 40 | } 41 | 42 | override fun putFloat(key: String, value: Float) { 43 | mSharedPreferences.edit().putFloat(key, value).apply() 44 | } 45 | 46 | override fun putBoolean(key: String, value: Boolean) { 47 | mSharedPreferences.edit().putBoolean(key, value).apply() 48 | } 49 | 50 | override fun getString(key: String, defValue: String?): String? { 51 | return mSharedPreferences.getString(key, defValue) 52 | } 53 | 54 | override fun getStringSet(key: String, defValues: Set?): Set? { 55 | return mSharedPreferences.getStringSet(key, defValues) 56 | } 57 | 58 | override fun getInt(key: String, defValue: Int): Int { 59 | return mSharedPreferences.getInt(key, defValue) 60 | } 61 | 62 | override fun getLong(key: String, defValue: Long): Long { 63 | return mSharedPreferences.getLong(key, defValue) 64 | } 65 | 66 | override fun getFloat(key: String, defValue: Float): Float { 67 | return mSharedPreferences.getFloat(key, defValue) 68 | } 69 | 70 | override fun getBoolean(key: String, defValue: Boolean): Boolean { 71 | return mSharedPreferences.getBoolean(key, defValue) 72 | } 73 | } -------------------------------------------------------------------------------- /app/src/main/res/values-lt/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | AMM 4 | Nepavyko pasiekti root ar Magisk 5 | Root buvo neleista per Magisk programėle 6 | Magisk nėra suinstaliuota 7 | Kraunama… 8 | Atnaujinama 9 | Instaliuota 10 | Internetinė repozitorija 11 | Nepavyko atsiųsti failo 12 | Nepavyko prisijungti prie interneto 13 | Nepavyko atidaryti sisteminio WebView 14 | Nustatymai 15 | Nėra aprašymo. 16 | Atsiųsti modulį 17 | Instaliuoti modulį 18 | Atnaujinti modulį 19 | Puslapis 20 | Pagalba 21 | Aukoti 22 | Atnaujinti 23 | Instaliuoti 24 | Aprašymas 25 | Ištrinti 26 | Konfigūruoti 27 | Pranešti klaidas 28 | Pasiūlyti modulį 29 | Perkrauti 30 | Kalba 31 | Paskutinis atnaujinimas: 32 | Repozitorija: 33 | Sukurė 34 | Atsiuntimas: 35 | Žvaigždutės: 36 | Reikia ramdisk 37 | Galima pakeisti paleidima 38 | Šiam moduliui galimai reikės pakeisti boot image 39 | Minim. Magisk %s 40 | Fox Magisk Modulių tvarkyklė 41 | Androidacy Modulių tvarkyklė 42 | Programėlė kritinio užrakinimo režime 43 | Pasiekiama nauja programėlės versija 44 | Reikia Android 12+ 45 | Šiam moduliui reikia paleidimo ramdisk 46 | -------------------------------------------------------------------------------- /app/src/main/res/xml/theme_preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 15 | 16 | 20 | 21 | 22 | 31 | 32 | 40 | 41 | 48 | 49 | 56 | 57 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /.github/workflows/build-debug.yml: -------------------------------------------------------------------------------- 1 | #file: noinspection SpellCheckingInspection 2 | name: Generate APK Debug 3 | 4 | on: 5 | push: 6 | branches: 7 | - '*' 8 | paths-ignore: 9 | - '**.md' 10 | pull_request: 11 | branches: 12 | - '*' 13 | paths-ignore: 14 | - '**.md' 15 | workflow_dispatch: 16 | 17 | jobs: 18 | build: 19 | 20 | runs-on: ubuntu-latest 21 | permissions: 22 | contents: read 23 | packages: write 24 | 25 | steps: 26 | - name: Check out repository 27 | uses: actions/checkout@v3 28 | with: 29 | submodules: true 30 | 31 | - name: Set up Java 17 32 | uses: actions/setup-java@v3 33 | with: 34 | java-version: 17 35 | distribution: 'temurin' 36 | 37 | - name: Setup Android SDK 38 | uses: android-actions/setup-android@v2 39 | 40 | - name: Setup Gradle 41 | uses: gradle/gradle-build-action@v2 42 | with: 43 | gradle-home-cache-includes: | 44 | caches 45 | notifications 46 | jdks 47 | ${{ github.workspace }}/.gradle/configuration-cache 48 | 49 | - name: Change wrapper permissions 50 | run: chmod +x ./gradlew 51 | 52 | # temporary disabled 53 | # - name: Run tests 54 | # run: ./gradlew test 55 | 56 | - name: Build apk debug 57 | run: ./gradlew app:assembleDefaultDebug 58 | 59 | # will not upload, just build to check if it builds 60 | - name: Build apk fdroid-debug 61 | run: ./gradlew app:assembleFdroidDebug 62 | 63 | # UPLOAD ARTIFACT SECTION 64 | # Will be shorter, when https://github.com/actions/upload-artifact/pull/354 will be merged 65 | # AMMM-default-debug 66 | - name: Upload AMMM-default-arm64-v8a-debug 67 | uses: actions/upload-artifact@v4 68 | with: 69 | name: AMMM-default-arm64-v8a-debug 70 | path: app/build/outputs/apk/default/debug/*-default-arm64-v8a-debug.apk 71 | 72 | - name: Upload AMMM-default-armeabi-v7a-debug 73 | uses: actions/upload-artifact@v4 74 | with: 75 | name: AMMM-default-armeabi-v7a-debug 76 | path: app/build/outputs/apk/default/debug/*-default-armeabi-v7a-debug.apk 77 | 78 | - name: Upload AMMM-default-universal-debug 79 | uses: actions/upload-artifact@v4 80 | with: 81 | name: AMMM-default-universal-debug 82 | path: app/build/outputs/apk/default/debug/*-default-universal-debug.apk 83 | 84 | - name: Upload AMMM-default-x86-debug 85 | uses: actions/upload-artifact@v4 86 | with: 87 | name: AMMM-default-x86-debug 88 | path: app/build/outputs/apk/default/debug/*-default-x86-debug.apk 89 | 90 | - name: Upload AMMM-default-x86_64-debug 91 | uses: actions/upload-artifact@v4 92 | with: 93 | name: AMMM-default-x86_64-debug 94 | path: app/build/outputs/apk/default/debug/*-default-x86_64-debug.apk 95 | -------------------------------------------------------------------------------- /app/roomSchemas/com.fox2code.mmm.utils.room.ReposListDatabase/1.json: -------------------------------------------------------------------------------- 1 | { 2 | "formatVersion": 1, 3 | "database": { 4 | "version": 1, 5 | "identityHash": "7ad41628a74233e6c6d2f88142274d85", 6 | "entities": [ 7 | { 8 | "tableName": "ReposList", 9 | "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `url` TEXT NOT NULL, `enabled` INTEGER NOT NULL, `donate` TEXT, `support` TEXT, `submitModule` TEXT, `lastUpdate` INTEGER NOT NULL, `name` TEXT NOT NULL, `website` TEXT, PRIMARY KEY(`id`))", 10 | "fields": [ 11 | { 12 | "fieldPath": "id", 13 | "columnName": "id", 14 | "affinity": "TEXT", 15 | "notNull": true 16 | }, 17 | { 18 | "fieldPath": "url", 19 | "columnName": "url", 20 | "affinity": "TEXT", 21 | "notNull": true 22 | }, 23 | { 24 | "fieldPath": "enabled", 25 | "columnName": "enabled", 26 | "affinity": "INTEGER", 27 | "notNull": true 28 | }, 29 | { 30 | "fieldPath": "donate", 31 | "columnName": "donate", 32 | "affinity": "TEXT", 33 | "notNull": false 34 | }, 35 | { 36 | "fieldPath": "support", 37 | "columnName": "support", 38 | "affinity": "TEXT", 39 | "notNull": false 40 | }, 41 | { 42 | "fieldPath": "submitModule", 43 | "columnName": "submitModule", 44 | "affinity": "TEXT", 45 | "notNull": false 46 | }, 47 | { 48 | "fieldPath": "lastUpdate", 49 | "columnName": "lastUpdate", 50 | "affinity": "INTEGER", 51 | "notNull": true 52 | }, 53 | { 54 | "fieldPath": "name", 55 | "columnName": "name", 56 | "affinity": "TEXT", 57 | "notNull": true 58 | }, 59 | { 60 | "fieldPath": "website", 61 | "columnName": "website", 62 | "affinity": "TEXT", 63 | "notNull": false 64 | } 65 | ], 66 | "primaryKey": { 67 | "autoGenerate": false, 68 | "columnNames": [ 69 | "id" 70 | ] 71 | }, 72 | "indices": [ 73 | { 74 | "name": "index_ReposList_id", 75 | "unique": true, 76 | "columnNames": [ 77 | "id" 78 | ], 79 | "orders": [], 80 | "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_ReposList_id` ON `${TABLE_NAME}` (`id`)" 81 | } 82 | ], 83 | "foreignKeys": [] 84 | } 85 | ], 86 | "views": [], 87 | "setupQueries": [ 88 | "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", 89 | "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7ad41628a74233e6c6d2f88142274d85')" 90 | ] 91 | } 92 | } -------------------------------------------------------------------------------- /app/src/main/res/xml/debugging_preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 15 | 16 | 24 | 25 | 33 | 34 | 42 | 43 | 48 | 49 | 54 | 55 | 61 | 62 | 67 | 68 | 69 | --------------------------------------------------------------------------------