├── settings.gradle
├── art
├── Phone_About.png
├── Phone_Logs.png
├── Tablet_Logs.png
├── Phone_Settings.png
├── Phone_Support.png
├── Phone_Warning.png
├── Tablet_About.png
├── Tablet_Support.png
├── Tablet_Welcome.png
├── Phone_Installed.png
├── Phone_Settings2.png
├── Phone_Settings3.png
├── Tablet_Bookmarks.png
├── Tablet_Settings.png
├── Phone_DownloadList.png
├── Phone_NougatError.png
├── Tablet_DownloadList.png
├── Tablet_InAppBrowser.png
├── Phone_SingleInstaller.png
├── Tablet_ModuleDetails.png
├── Tablet_SingleInstaller.png
└── Tablet_ModuleDetails_Bookmark.png
├── app
├── libs
│ └── AndroidHiddenAPI.jar
├── Xposed-Disabler-Recovery.zip
├── Xposed-Installer-Recovery.zip
├── src
│ └── main
│ │ ├── assets
│ │ ├── XposedBridge.jar
│ │ ├── arm
│ │ │ ├── busybox-xposed
│ │ │ ├── app_process_xposed_sdk15
│ │ │ ├── app_process_xposed_sdk16
│ │ │ └── app_process_xposed_sdk19
│ │ └── x86
│ │ │ ├── busybox-xposed
│ │ │ ├── app_process_xposed_sdk15
│ │ │ ├── app_process_xposed_sdk16
│ │ │ └── app_process_xposed_sdk19
│ │ ├── res
│ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_rovo.png
│ │ │ ├── circle_ic_launcher.png
│ │ │ ├── ic_launcher_hjmodi.png
│ │ │ ├── ic_launcher_staol.png
│ │ │ ├── ic_launcher_rovo_old.png
│ │ │ ├── circle_ic_launcher_rovo.png
│ │ │ └── circle_ic_launcher_hjmodi.png
│ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_rovo.png
│ │ │ ├── circle_ic_launcher.png
│ │ │ ├── ic_launcher_hjmodi.png
│ │ │ ├── ic_launcher_staol.png
│ │ │ ├── ic_launcher_rovo_old.png
│ │ │ ├── circle_ic_launcher_rovo.png
│ │ │ └── circle_ic_launcher_hjmodi.png
│ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── circle_ic_launcher.png
│ │ │ ├── ic_launcher_hjmodi.png
│ │ │ ├── ic_launcher_rovo.png
│ │ │ ├── ic_launcher_staol.png
│ │ │ ├── ic_launcher_rovo_old.png
│ │ │ ├── circle_ic_launcher_rovo.png
│ │ │ └── circle_ic_launcher_hjmodi.png
│ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_rovo.png
│ │ │ ├── ic_launcher_staol.png
│ │ │ ├── circle_ic_launcher.png
│ │ │ ├── ic_launcher_hjmodi.png
│ │ │ ├── circle_ic_launcher_rovo.png
│ │ │ └── circle_ic_launcher_hjmodi.png
│ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── circle_ic_launcher.png
│ │ │ ├── ic_launcher_hjmodi.png
│ │ │ ├── ic_launcher_staol.png
│ │ │ ├── circle_ic_launcher_rovo.png
│ │ │ └── circle_ic_launcher_hjmodi.png
│ │ ├── values
│ │ │ ├── bool.xml
│ │ │ ├── dimens.xml
│ │ │ ├── attrs.xml
│ │ │ ├── colors.xml
│ │ │ ├── donottranslate.xml
│ │ │ ├── styles.xml
│ │ │ └── arrays.xml
│ │ ├── values-sw600dp
│ │ │ ├── bool.xml
│ │ │ └── styles.xml
│ │ ├── layout
│ │ │ ├── color_icon_preview.xml
│ │ │ ├── activity_container.xml
│ │ │ ├── list_sticky_header_download.xml
│ │ │ ├── dialog_install_warning.xml
│ │ │ ├── toolbar.xml
│ │ │ ├── activity_download_details_not_found.xml
│ │ │ ├── fragment_app_list.xml
│ │ │ ├── tab_advanced_installer.xml
│ │ │ ├── fragment_compile_dialog.xml
│ │ │ ├── download_moreinfo.xml
│ │ │ ├── activity_welcome.xml
│ │ │ ├── list_fragment.xml
│ │ │ ├── xposed_not_active_note.xml
│ │ │ ├── download_details.xml
│ │ │ ├── icon_preference_item.xml
│ │ │ ├── list_item_download.xml
│ │ │ ├── tab_logs.xml
│ │ │ ├── activity_download_details.xml
│ │ │ ├── download_view.xml
│ │ │ ├── tab_downloader.xml
│ │ │ └── activity_installation.xml
│ │ ├── anim
│ │ │ ├── fade_in.xml
│ │ │ └── fade_out.xml
│ │ ├── drawable
│ │ │ ├── toolbar_shadow.xml
│ │ │ ├── ic_flash.xml
│ │ │ ├── background_card_dark.xml
│ │ │ ├── background_card_light.xml
│ │ │ ├── background_card_black.xml
│ │ │ ├── ic_verified.xml
│ │ │ ├── ic_menu_delete.xml
│ │ │ ├── ic_local_hospital.xml
│ │ │ ├── ic_block_.xml
│ │ │ ├── ic_sync.xml
│ │ │ ├── ic_format_list_bulleted.xml
│ │ │ ├── ic_public.xml
│ │ │ ├── background_card_normal_light.xml
│ │ │ ├── background_card_normal_black.xml
│ │ │ ├── background_card_normal_dark.xml
│ │ │ ├── background_card_pressed_light.xml
│ │ │ ├── background_card_pressed_black.xml
│ │ │ ├── background_card_pressed_dark.xml
│ │ │ ├── ic_menu_settings.xml
│ │ │ └── ic_menu_overflow_material.xml
│ │ ├── xml
│ │ │ ├── file_paths.xml
│ │ │ ├── module_prefs.xml
│ │ │ ├── pref_settings.xml
│ │ │ └── shortcuts.xml
│ │ ├── menu
│ │ │ ├── menu_about.xml
│ │ │ ├── menu_compat_list.xml
│ │ │ ├── menu_app_item.xml
│ │ │ ├── menu_black_list.xml
│ │ │ ├── menu_download.xml
│ │ │ ├── context_menu_modules_bookmark.xml
│ │ │ ├── context_menu_modules.xml
│ │ │ ├── menu_installer.xml
│ │ │ ├── menu_download_details.xml
│ │ │ ├── menu_logs.xml
│ │ │ ├── menu_modules.xml
│ │ │ └── drawer.xml
│ │ ├── drawable-anydpi
│ │ │ ├── ic_send.xml
│ │ │ ├── ic_warning.xml
│ │ │ ├── ic_menu_sort.xml
│ │ │ ├── ic_warning_grey.xml
│ │ │ ├── ic_bookmark.xml
│ │ │ ├── ic_delete.xml
│ │ │ ├── ic_close.xml
│ │ │ ├── ic_error.xml
│ │ │ ├── ic_no_image.xml
│ │ │ ├── ic_scroll_down.xml
│ │ │ ├── ic_scroll_top.xml
│ │ │ ├── ic_bookmark_outline.xml
│ │ │ ├── ic_check_circle.xml
│ │ │ ├── ic_person.xml
│ │ │ ├── ic_chip.xml
│ │ │ ├── ic_description.xml
│ │ │ ├── ic_info.xml
│ │ │ ├── ic_nav_downloads.xml
│ │ │ ├── ic_save.xml
│ │ │ ├── ic_nav_about.xml
│ │ │ ├── ic_update.xml
│ │ │ ├── ic_menu_refresh.xml
│ │ │ ├── ic_menu_refresh_black.xml
│ │ │ ├── ic_menu_search.xml
│ │ │ ├── ic_history.xml
│ │ │ ├── ic_action_thumb_up.xml
│ │ │ ├── ic_help.xml
│ │ │ ├── ic_nav_support.xml
│ │ │ ├── ic_action_thumb_down.xml
│ │ │ ├── ic_xda.xml
│ │ │ ├── ic_nav_modules.xml
│ │ │ ├── ic_notification.xml
│ │ │ ├── ic_donate.xml
│ │ │ ├── ic_action_share.xml
│ │ │ ├── ic_nav_logs.xml
│ │ │ ├── ic_manufacturer.xml
│ │ │ ├── ic_android.xml
│ │ │ ├── ic_github.xml
│ │ │ ├── ic_nav_settings.xml
│ │ │ ├── ic_language.xml
│ │ │ ├── ic_no_connection.xml
│ │ │ └── ic_nav_install.xml
│ │ ├── values-sw600dp-v21
│ │ │ └── styles.xml
│ │ ├── layout-v23
│ │ │ └── list_item_download.xml
│ │ └── values-v21
│ │ │ └── styles.xml
│ │ └── java
│ │ ├── de
│ │ └── robv
│ │ │ └── android
│ │ │ └── xposed
│ │ │ └── installer
│ │ │ ├── repo
│ │ │ ├── Repository.java
│ │ │ ├── ModuleVersion.java
│ │ │ ├── Module.java
│ │ │ └── ReleaseType.java
│ │ │ ├── util
│ │ │ ├── chrome
│ │ │ │ ├── ServiceConnectionCallback.java
│ │ │ │ ├── CustomTabsURLSpan.java
│ │ │ │ ├── ServiceConnection.java
│ │ │ │ └── LinkTransformationMethod.java
│ │ │ ├── ThemeUtil.java
│ │ │ ├── json
│ │ │ │ ├── XposedZip.java
│ │ │ │ ├── XposedTab.java
│ │ │ │ └── JSONUtils.java
│ │ │ ├── HashUtil.java
│ │ │ ├── NavUtil.java
│ │ │ └── AssetUtil.java
│ │ │ ├── widget
│ │ │ ├── ListPreferenceSummaryFix.java
│ │ │ └── IntegerListPreference.java
│ │ │ ├── receivers
│ │ │ ├── DownloadReceiver.java
│ │ │ ├── BootReceiver.java
│ │ │ └── PackageChangeReceiver.java
│ │ │ ├── installation
│ │ │ ├── FlashCallback.java
│ │ │ ├── Flashable.java
│ │ │ └── FlashRecoveryAuto.java
│ │ │ ├── XposedBaseActivity.java
│ │ │ ├── DownloadDetailsSettingsFragment.java
│ │ │ ├── SupportActivity.java
│ │ │ └── DownloadDetailsFragment.java
│ │ └── com
│ │ └── solohsu
│ │ └── android
│ │ └── edxp
│ │ └── manager
│ │ ├── util
│ │ ├── ToastUtils.java
│ │ └── Utils.java
│ │ ├── adapter
│ │ ├── CompatListAdapter.java
│ │ ├── CompileUtils.java
│ │ └── BlackListAdapter.java
│ │ └── fragment
│ │ └── BasePreferenceFragment.java
├── wanam-xposed-uninstaller-20160211.zip
├── lint.xml
├── proguard-project.txt
└── build.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── .github
├── PULL_REQUEST_TEMPLATE.md
└── ISSUE_TEMPLATE.md
├── .gitignore
├── .travis.yml
├── .pullapprove.yml
├── README.md
├── gradle.properties
├── XposedInstaller.iml
├── proguard-project.txt
├── import-summary.txt
└── gradlew.bat
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/art/Phone_About.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Phone_About.png
--------------------------------------------------------------------------------
/art/Phone_Logs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Phone_Logs.png
--------------------------------------------------------------------------------
/art/Tablet_Logs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Tablet_Logs.png
--------------------------------------------------------------------------------
/art/Phone_Settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Phone_Settings.png
--------------------------------------------------------------------------------
/art/Phone_Support.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Phone_Support.png
--------------------------------------------------------------------------------
/art/Phone_Warning.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Phone_Warning.png
--------------------------------------------------------------------------------
/art/Tablet_About.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Tablet_About.png
--------------------------------------------------------------------------------
/art/Tablet_Support.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Tablet_Support.png
--------------------------------------------------------------------------------
/art/Tablet_Welcome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Tablet_Welcome.png
--------------------------------------------------------------------------------
/art/Phone_Installed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Phone_Installed.png
--------------------------------------------------------------------------------
/art/Phone_Settings2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Phone_Settings2.png
--------------------------------------------------------------------------------
/art/Phone_Settings3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Phone_Settings3.png
--------------------------------------------------------------------------------
/art/Tablet_Bookmarks.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Tablet_Bookmarks.png
--------------------------------------------------------------------------------
/art/Tablet_Settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Tablet_Settings.png
--------------------------------------------------------------------------------
/art/Phone_DownloadList.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Phone_DownloadList.png
--------------------------------------------------------------------------------
/art/Phone_NougatError.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Phone_NougatError.png
--------------------------------------------------------------------------------
/art/Tablet_DownloadList.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Tablet_DownloadList.png
--------------------------------------------------------------------------------
/art/Tablet_InAppBrowser.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Tablet_InAppBrowser.png
--------------------------------------------------------------------------------
/app/libs/AndroidHiddenAPI.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/libs/AndroidHiddenAPI.jar
--------------------------------------------------------------------------------
/art/Phone_SingleInstaller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Phone_SingleInstaller.png
--------------------------------------------------------------------------------
/art/Tablet_ModuleDetails.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Tablet_ModuleDetails.png
--------------------------------------------------------------------------------
/app/Xposed-Disabler-Recovery.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/Xposed-Disabler-Recovery.zip
--------------------------------------------------------------------------------
/art/Tablet_SingleInstaller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Tablet_SingleInstaller.png
--------------------------------------------------------------------------------
/app/Xposed-Installer-Recovery.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/Xposed-Installer-Recovery.zip
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/assets/XposedBridge.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/assets/XposedBridge.jar
--------------------------------------------------------------------------------
/art/Tablet_ModuleDetails_Bookmark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/art/Tablet_ModuleDetails_Bookmark.png
--------------------------------------------------------------------------------
/app/src/main/assets/arm/busybox-xposed:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/assets/arm/busybox-xposed
--------------------------------------------------------------------------------
/app/src/main/assets/x86/busybox-xposed:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/assets/x86/busybox-xposed
--------------------------------------------------------------------------------
/app/wanam-xposed-uninstaller-20160211.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/wanam-xposed-uninstaller-20160211.zip
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | _If your pull request is a translation update, then the title of this pull must contains 'string' or 'translation'_
2 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/assets/arm/app_process_xposed_sdk15:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/assets/arm/app_process_xposed_sdk15
--------------------------------------------------------------------------------
/app/src/main/assets/arm/app_process_xposed_sdk16:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/assets/arm/app_process_xposed_sdk16
--------------------------------------------------------------------------------
/app/src/main/assets/arm/app_process_xposed_sdk19:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/assets/arm/app_process_xposed_sdk19
--------------------------------------------------------------------------------
/app/src/main/assets/x86/app_process_xposed_sdk15:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/assets/x86/app_process_xposed_sdk15
--------------------------------------------------------------------------------
/app/src/main/assets/x86/app_process_xposed_sdk16:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/assets/x86/app_process_xposed_sdk16
--------------------------------------------------------------------------------
/app/src/main/assets/x86/app_process_xposed_sdk19:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/assets/x86/app_process_xposed_sdk19
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_rovo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_rovo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_rovo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_rovo.png
--------------------------------------------------------------------------------
/app/src/main/res/values/bool.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | false
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/circle_ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-hdpi/circle_ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_hjmodi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_hjmodi.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_staol.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_staol.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/circle_ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-mdpi/circle_ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_hjmodi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_hjmodi.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_staol.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_staol.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/circle_ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xhdpi/circle_ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_hjmodi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_hjmodi.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_rovo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_rovo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_staol.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_staol.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_rovo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_rovo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_staol.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_staol.png
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp/bool.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | true
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_rovo_old.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_rovo_old.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_rovo_old.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_rovo_old.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_rovo_old.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_rovo_old.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/circle_ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxhdpi/circle_ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_hjmodi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_hjmodi.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/circle_ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxxhdpi/circle_ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_hjmodi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_hjmodi.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_staol.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_staol.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.apk
2 | *.ap_
3 | *.iml
4 | *.dex
5 | *.class
6 | .idea/
7 | .gradle/
8 | build/
9 | local.properties
10 | app/lint.xml
11 | app/proguard-project.txt
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/circle_ic_launcher_rovo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-hdpi/circle_ic_launcher_rovo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/circle_ic_launcher_rovo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-mdpi/circle_ic_launcher_rovo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/circle_ic_launcher_rovo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xhdpi/circle_ic_launcher_rovo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/circle_ic_launcher_hjmodi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-hdpi/circle_ic_launcher_hjmodi.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/circle_ic_launcher_hjmodi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-mdpi/circle_ic_launcher_hjmodi.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/circle_ic_launcher_hjmodi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xhdpi/circle_ic_launcher_hjmodi.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/circle_ic_launcher_rovo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxhdpi/circle_ic_launcher_rovo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/circle_ic_launcher_rovo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxxhdpi/circle_ic_launcher_rovo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/circle_ic_launcher_hjmodi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxhdpi/circle_ic_launcher_hjmodi.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/circle_ic_launcher_hjmodi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/solohsu/XposedInstaller/HEAD/app/src/main/res/mipmap-xxxhdpi/circle_ic_launcher_hjmodi.png
--------------------------------------------------------------------------------
/app/src/main/res/layout/color_icon_preview.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Tue Feb 05 01:44:21 CST 2019
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
7 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: android
2 | jdk: oraclejdk8
3 | android:
4 | components:
5 | - tools
6 | - platform-tools
7 | - tools
8 | - build-tools-27.0.3
9 | - android-27
10 | - extra-android-support
11 | - extra-android-m2repository
12 | - extra-google-m2repository
13 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/fade_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/fade_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/toolbar_shadow.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/file_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/lint.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/repo/Repository.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.repo;
2 |
3 | public class Repository {
4 | public String name;
5 | public String url;
6 | public boolean isPartial = false;
7 | public String partialUrl;
8 | public String version;
9 |
10 | /* package */ Repository() {
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_flash.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_send.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/background_card_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/background_card_light.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
7 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | ###### Include the following:
2 | - Xposed Version: `85`
3 | - [ ] Xposed Systemless
4 | - Device OS version: `6.0.1`
5 | - Device Manufacturer: `LG`
6 | - Device Name: `Nexus 5`
7 | - Material Xposed Installer version: `14/09/2016`
8 |
9 | ###### Reproduction Steps
10 |
11 | 1.
12 | 2.
13 | 3.
14 |
15 | ###### Expected Result
16 |
17 |
18 | ###### Actual Result
19 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/background_card_black.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_compat_list.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_warning.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_menu_sort.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_warning_grey.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_bookmark.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_delete.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/.pullapprove.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | groups:
3 | code-review:
4 | approve_by_comment:
5 | approve_regex: '^(Approved|:shipit:|:\+1:|LGTM)'
6 | reject_regex: '^(Rejected|:-1:)'
7 | enabled: true
8 | required: 1
9 | reset_on_push:
10 | enabled: true
11 | users:
12 | - DVDAndroid
13 | always_approved:
14 | title_regex: '(string|translation)'
15 | always_pending:
16 | title_regex: '(WIP|wip)'
17 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_close.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_error.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_no_image.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_scroll_down.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_scroll_top.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_bookmark_outline.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_verified.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_check_circle.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_person.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_menu_delete.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_chip.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_local_hospital.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_description.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_app_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_info.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_nav_downloads.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_save.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_nav_about.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_update.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_menu_refresh.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_menu_refresh_black.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/repo/ModuleVersion.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.repo;
2 |
3 | public class ModuleVersion {
4 | public final Module module;
5 | public String name;
6 | public int code;
7 | public String downloadLink;
8 | public String md5sum;
9 | public String changelog;
10 | public boolean changelogIsHtml = false;
11 | public ReleaseType relType = ReleaseType.STABLE;
12 | public long uploaded = -1;
13 |
14 | /* package */ ModuleVersion(Module module) {
15 | this.module = module;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_block_.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_sync.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_menu_search.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_history.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_black_list.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_action_thumb_up.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_help.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_nav_support.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_action_thumb_down.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_container.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
15 |
16 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | XposedInstaller
2 | ===============
3 | [](https://travis-ci.org/DVDAndroid/XposedInstaller)
4 |
5 | This is a materialised version of Xposed Installer
6 |
7 | [Show this project on XDA](http://forum.xda-developers.com/xposed/material-design-xposed-installer-t3137758)
8 |
9 | Credits
10 | -------
11 |
12 | [rovo89](https://github.com/rovo89) for original XposedInstaller
13 | [BioHaZard1](https://github.com/BioHaZard1) for graphics changes
14 |
15 | [afollestad](https://github.com/afollestad) for his [material-dialogs](https://github.com/afollestad/material-dialogs) library
16 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_xda.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/module_prefs.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_nav_modules.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_notification.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp-v21/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/util/chrome/ServiceConnectionCallback.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util.chrome;
2 |
3 | import androidx.browser.customtabs.CustomTabsClient;
4 |
5 | /**
6 | * Callback for events when connecting and disconnecting from Custom Tabs
7 | * Service.
8 | */
9 | public interface ServiceConnectionCallback {
10 | /**
11 | * Called when the service is connected.
12 | *
13 | * @param client a CustomTabsClient
14 | */
15 | void onServiceConnected(CustomTabsClient client);
16 |
17 | /**
18 | * Called when the service is disconnected.
19 | */
20 | void onServiceDisconnected();
21 | }
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_format_list_bulleted.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 4dp
4 |
5 |
6 | 264dp
7 | 650dp
8 | 500dp
9 |
10 |
11 | 8dip
12 | 3dip
13 | 2dp
14 | 2dp
15 | 5sp
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_public.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_download.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/widget/ListPreferenceSummaryFix.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.widget;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 |
6 | import androidx.preference.ListPreference;
7 |
8 | public class ListPreferenceSummaryFix extends ListPreference {
9 | public ListPreferenceSummaryFix(Context context) {
10 | super(context);
11 | }
12 |
13 | public ListPreferenceSummaryFix(Context context, AttributeSet attrs) {
14 | super(context, attrs);
15 | }
16 |
17 | @Override
18 | public void setValue(String value) {
19 | super.setValue(value);
20 | notifyChanged();
21 | }
22 | }
--------------------------------------------------------------------------------
/app/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_donate.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/util/chrome/CustomTabsURLSpan.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util.chrome;
2 |
3 | import android.app.Activity;
4 | import android.text.style.URLSpan;
5 | import android.view.View;
6 |
7 | import de.robv.android.xposed.installer.util.NavUtil;
8 |
9 | /**
10 | * Created by Nikola D. on 12/23/2015.
11 | */
12 | public class CustomTabsURLSpan extends URLSpan {
13 |
14 | private Activity activity;
15 |
16 | public CustomTabsURLSpan(Activity activity, String url) {
17 | super(url);
18 | this.activity = activity;
19 | }
20 |
21 | @Override
22 | public void onClick(View widget) {
23 | String url = getURL();
24 | NavUtil.startURL(activity, url);
25 | }
26 | }
--------------------------------------------------------------------------------
/app/src/main/res/menu/context_menu_modules_bookmark.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_action_share.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_nav_logs.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/list_sticky_header_download.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_manufacturer.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/context_menu_modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/receivers/DownloadReceiver.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.receivers;
2 |
3 | import android.app.DownloadManager;
4 | import android.content.BroadcastReceiver;
5 | import android.content.Context;
6 | import android.content.Intent;
7 |
8 | import de.robv.android.xposed.installer.util.DownloadsUtil;
9 |
10 | public class DownloadReceiver extends BroadcastReceiver {
11 | @Override
12 | public void onReceive(final Context context, final Intent intent) {
13 | String action = intent.getAction();
14 | if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
15 | long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
16 | DownloadsUtil.triggerDownloadFinishedCallback(context, downloadId);
17 | }
18 | }
19 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | ## Project-wide Gradle settings.
2 | #
3 | # For more details on how to configure your build environment visit
4 | # http://www.gradle.org/docs/current/userguide/build_environment.html
5 | #
6 | # Specifies the JVM arguments used for the daemon process.
7 | # The setting is particularly useful for tweaking memory settings.
8 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
9 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
10 | #
11 | # When configured, Gradle will run in incubating parallel mode.
12 | # This option should only be used with decoupled projects. More details, visit
13 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
14 | # org.gradle.parallel=true
15 | #Thu Jul 21 11:19:13 BST 2016
16 | android.enableJetifier=true
17 | android.useAndroidX=true
18 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/installation/FlashCallback.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.installation;
2 |
3 | import de.robv.android.xposed.installer.util.RootUtil;
4 | import eu.chainfire.libsuperuser.Shell;
5 |
6 | public interface FlashCallback extends RootUtil.LineCallback {
7 | void onStarted();
8 | void onDone();
9 | void onError(int exitCode, String error);
10 |
11 | int OK = 0;
12 | int ERROR_GENERIC = 1;
13 |
14 | // SU errors
15 | int ERROR_TIMEOUT = Shell.OnCommandResultListener.WATCHDOG_EXIT;
16 | int ERROR_SHELL_DIED = Shell.OnCommandResultListener.SHELL_DIED;
17 | int ERROR_NO_ROOT_ACCESS = Shell.OnCommandResultListener.SHELL_EXEC_FAILED;
18 |
19 | // ZIP errors
20 | int ERROR_INVALID_ZIP = -100;
21 | int ERROR_NOT_FLASHABLE_IN_APP = -101;
22 | int ERROR_INSTALLER_NEEDS_UPDATE = -102;
23 | }
24 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_installer.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/java/com/solohsu/android/edxp/manager/util/ToastUtils.java:
--------------------------------------------------------------------------------
1 | package com.solohsu.android.edxp.manager.util;
2 |
3 | import android.content.Context;
4 | import android.widget.Toast;
5 |
6 | import androidx.annotation.StringRes;
7 |
8 | public class ToastUtils {
9 |
10 | public static void showShortToast(Context context, @StringRes int resId) {
11 | Toast.makeText(context, resId, Toast.LENGTH_SHORT).show();
12 | }
13 |
14 | public static void showShortToast(Context context, String msg) {
15 | Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
16 | }
17 |
18 | public static void showLongToast(Context context, @StringRes int resId) {
19 | Toast.makeText(context, resId, Toast.LENGTH_LONG).show();
20 | }
21 |
22 | public static void showLongToast(Context context, String msg) {
23 | Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/XposedInstaller.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_download_details.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/java/com/solohsu/android/edxp/manager/util/Utils.java:
--------------------------------------------------------------------------------
1 | package com.solohsu.android.edxp.manager.util;
2 |
3 | import android.content.pm.ApplicationInfo;
4 | import android.content.pm.PackageManager;
5 | import android.content.res.Configuration;
6 | import android.content.res.Resources;
7 |
8 | import java.util.Locale;
9 |
10 | public class Utils {
11 |
12 | public static String getAppLabel(ApplicationInfo info, PackageManager pm) {
13 | try {
14 | if (info.labelRes > 0) {
15 | Resources res = pm.getResourcesForApplication(info);
16 | Configuration config = new Configuration();
17 | config.setLocale(Locale.getDefault());
18 | res.updateConfiguration(config, res.getDisplayMetrics());
19 | return res.getString(info.labelRes);
20 | }
21 | } catch (Exception ignored) {
22 | }
23 | return info.loadLabel(pm).toString();
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_android.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_install_warning.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
10 |
11 |
17 |
18 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/toolbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
15 |
16 |
21 |
22 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/repo/Module.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.repo;
2 |
3 | import android.util.Pair;
4 |
5 | import java.util.ArrayList;
6 | import java.util.LinkedList;
7 | import java.util.List;
8 |
9 | public class Module {
10 | public final Repository repository;
11 | public final List> moreInfo = new LinkedList>();
12 | public final List versions = new ArrayList();
13 | public final List screenshots = new ArrayList();
14 | public String packageName;
15 | public String name;
16 | public String summary;
17 | public String description;
18 | public boolean descriptionIsHtml = false;
19 | public String author;
20 | public String support;
21 | public long created = -1;
22 | public long updated = -1;
23 |
24 | /* package */ Module(Repository repository) {
25 | this.repository = repository;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/background_card_normal_light.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | -
18 |
21 |
22 |
23 |
24 |
25 |
26 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/background_card_normal_black.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | -
18 |
21 |
22 |
23 |
24 |
25 |
26 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/background_card_normal_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | -
18 |
21 |
22 |
23 |
24 |
25 |
26 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/background_card_pressed_light.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | -
18 |
21 |
22 |
23 |
24 |
25 |
26 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/background_card_pressed_black.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | -
18 |
21 |
22 |
23 |
24 |
25 |
26 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/background_card_pressed_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | -
18 |
21 |
22 |
23 |
24 |
25 |
26 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/app/proguard-project.txt:
--------------------------------------------------------------------------------
1 | -dontobfuscate
2 |
3 | # These are mostly picked from proguard-android-optimize.txt
4 | -optimizations !code/allocation/variable,!code/simplification/cast,!field/*,!class/merging/*
5 | -optimizationpasses 5
6 | -allowaccessmodification
7 | -dontpreverify
8 |
9 | -dontusemixedcaseclassnames
10 | -dontskipnonpubliclibraryclasses
11 | -verbose
12 |
13 | # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
14 | -keepclassmembers enum * {
15 | public static **[] values();
16 | public static ** valueOf(java.lang.String);
17 | }
18 |
19 | -keepclassmembers class **.R$* {
20 | public static ;
21 | }
22 |
23 | # The support library contains references to newer platform versions.
24 | # Don't warn about those in case this app is linking against an older
25 | # platform version. We know about them, and they are safe.
26 | -dontwarn android.support.**
27 |
28 | # These are ok as well
29 | -dontwarn android.os.FileUtils
30 | -dontwarn com.emilsjolander.components.stickylistheaders.**
31 | -dontwarn com.squareup.picasso.**
--------------------------------------------------------------------------------
/proguard-project.txt:
--------------------------------------------------------------------------------
1 | -dontobfuscate
2 |
3 | # These are mostly picked from proguard-android-optimize.txt
4 | -optimizations !code/allocation/variable,!code/simplification/cast,!field/*,!class/merging/*,!method/propagation/returnvalue,!method/inlining/*
5 | -optimizationpasses 5
6 | -allowaccessmodification
7 | -dontpreverify
8 |
9 | -dontusemixedcaseclassnames
10 | -dontskipnonpubliclibraryclasses
11 | -verbose
12 |
13 | # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
14 | -keepclassmembers enum * {
15 | public static **[] values();
16 | public static ** valueOf(java.lang.String);
17 | }
18 |
19 | -keepclassmembers class **.R$* {
20 | public static ;
21 | }
22 |
23 | # The support library contains references to newer platform versions.
24 | # Don't warn about those in case this app is linking against an older
25 | # platform version. We know about them, and they are safe.
26 | -dontwarn android.support.**
27 |
28 | # These are ok as well
29 | -dontwarn android.os.FileUtils
30 | -dontwarn com.emilsjolander.components.stickylistheaders.**
31 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_github.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/pref_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
13 |
18 |
23 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_download_details_not_found.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
14 |
15 |
22 |
23 |
28 |
29 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_menu_settings.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_nav_settings.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_app_list.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
16 |
17 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_language.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_menu_overflow_material.xml:
--------------------------------------------------------------------------------
1 |
2 |
17 |
22 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_no_connection.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
14 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/tab_advanced_installer.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
19 |
20 |
26 |
27 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/repo/ReleaseType.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.repo;
2 |
3 | import com.solohsu.android.edxp.manager.R;
4 |
5 | public enum ReleaseType {
6 | STABLE(R.string.reltype_stable, R.string.reltype_stable_summary), BETA(R.string.reltype_beta, R.string.reltype_beta_summary), EXPERIMENTAL(R.string.reltype_experimental, R.string.reltype_experimental_summary);
7 |
8 | private static final ReleaseType[] sValuesCache = values();
9 | private final int mTitleId;
10 | private final int mSummaryId;
11 |
12 | ReleaseType(int titleId, int summaryId) {
13 | mTitleId = titleId;
14 | mSummaryId = summaryId;
15 | }
16 |
17 | public static ReleaseType fromString(String value) {
18 | if (value == null || value.equals("stable"))
19 | return STABLE;
20 | else if (value.equals("beta"))
21 | return BETA;
22 | else if (value.equals("experimental"))
23 | return EXPERIMENTAL;
24 | else
25 | return STABLE;
26 | }
27 |
28 | public static ReleaseType fromOrdinal(int ordinal) {
29 | return sValuesCache[ordinal];
30 | }
31 |
32 | public int getTitleId() {
33 | return mTitleId;
34 | }
35 |
36 | public int getSummaryId() {
37 | return mSummaryId;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_compile_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
17 |
18 |
25 |
26 |
31 |
32 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_logs.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/java/com/solohsu/android/edxp/manager/adapter/CompatListAdapter.java:
--------------------------------------------------------------------------------
1 | package com.solohsu.android.edxp.manager.adapter;
2 |
3 | import android.content.Context;
4 | import android.content.pm.ApplicationInfo;
5 | import android.widget.CompoundButton;
6 |
7 | import com.solohsu.android.edxp.manager.util.ToastUtils;
8 |
9 | import java.util.List;
10 |
11 | import com.solohsu.android.edxp.manager.R;
12 |
13 | public class CompatListAdapter extends AppAdapter {
14 |
15 | private List checkedList;
16 |
17 | public CompatListAdapter(Context context) {
18 | super(context);
19 | }
20 |
21 | @Override
22 | protected List generateCheckedList() {
23 | AppHelper.makeSurePath();
24 | return checkedList = AppHelper.getCompatList();
25 | }
26 |
27 | @Override
28 | protected void onCheckedChange(CompoundButton view, boolean isChecked, ApplicationInfo info) {
29 | boolean success = isChecked ?
30 | AppHelper.addCompatList(info.packageName) : AppHelper.removeCompatList(info.packageName);
31 | if (success) {
32 | if (isChecked) {
33 | checkedList.add(info.packageName);
34 | } else {
35 | checkedList.remove(info.packageName);
36 | }
37 | } else {
38 | ToastUtils.showShortToast(context, R.string.add_package_failed);
39 | view.setChecked(!isChecked);
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/shortcuts.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
13 |
16 |
17 |
18 |
19 |
25 |
29 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/download_moreinfo.xml:
--------------------------------------------------------------------------------
1 |
2 |
14 |
15 |
20 |
21 |
27 |
28 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/util/chrome/ServiceConnection.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util.chrome;
2 |
3 | import android.content.ComponentName;
4 | import androidx.browser.customtabs.CustomTabsClient;
5 | import androidx.browser.customtabs.CustomTabsServiceConnection;
6 |
7 | import java.lang.ref.WeakReference;
8 |
9 | /**
10 | * Implementation for the CustomTabsServiceConnection that avoids leaking the
11 | * ServiceConnectionCallback
12 | */
13 | public class ServiceConnection extends CustomTabsServiceConnection {
14 | // A weak reference to the ServiceConnectionCallback to avoid leaking it.
15 | private WeakReference mConnectionCallback;
16 |
17 | public ServiceConnection(ServiceConnectionCallback connectionCallback) {
18 | mConnectionCallback = new WeakReference<>(connectionCallback);
19 | }
20 |
21 | @Override
22 | public void onCustomTabsServiceConnected(ComponentName name, CustomTabsClient client) {
23 | ServiceConnectionCallback connectionCallback = mConnectionCallback.get();
24 | if (connectionCallback != null)
25 | connectionCallback.onServiceConnected(client);
26 | }
27 |
28 | @Override
29 | public void onServiceDisconnected(ComponentName name) {
30 | ServiceConnectionCallback connectionCallback = mConnectionCallback.get();
31 | if (connectionCallback != null)
32 | connectionCallback.onServiceDisconnected();
33 | }
34 | }
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_welcome.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
17 |
18 |
22 |
23 |
24 |
25 |
26 |
27 |
38 |
39 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/list_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
20 |
21 |
27 |
28 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/xposed_not_active_note.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
20 |
21 |
27 |
28 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/util/ThemeUtil.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util;
2 |
3 | import android.content.Context;
4 | import android.content.res.Resources.Theme;
5 | import android.content.res.TypedArray;
6 |
7 | import com.solohsu.android.edxp.manager.R;
8 | import de.robv.android.xposed.installer.XposedApp;
9 | import de.robv.android.xposed.installer.XposedBaseActivity;
10 |
11 | public final class ThemeUtil {
12 | private static int[] THEMES = new int[]{
13 | R.style.Theme_XposedInstaller_Light,
14 | R.style.Theme_XposedInstaller_Dark,
15 | R.style.Theme_XposedInstaller_Dark_Black,};
16 |
17 | private ThemeUtil() {
18 | }
19 |
20 | public static int getSelectTheme() {
21 | int theme = XposedApp.getPreferences().getInt("theme", 0);
22 | return (theme >= 0 && theme < THEMES.length) ? theme : 0;
23 | }
24 |
25 | public static void setTheme(XposedBaseActivity activity) {
26 | activity.mTheme = getSelectTheme();
27 | activity.setTheme(THEMES[activity.mTheme]);
28 | }
29 |
30 | public static void reloadTheme(XposedBaseActivity activity) {
31 | int theme = getSelectTheme();
32 | if (theme != activity.mTheme)
33 | activity.recreate();
34 | }
35 |
36 | public static int getThemeColor(Context context, int id) {
37 | Theme theme = context.getTheme();
38 | TypedArray a = theme.obtainStyledAttributes(new int[]{id});
39 | int result = a.getColor(0, 0);
40 | a.recycle();
41 | return result;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/XposedBaseActivity.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.StringRes;
5 | import androidx.appcompat.app.AppCompatActivity;
6 | import android.view.WindowManager;
7 |
8 | import com.solohsu.android.edxp.manager.R;
9 |
10 | import de.robv.android.xposed.installer.util.ThemeUtil;
11 |
12 | public abstract class XposedBaseActivity extends AppCompatActivity {
13 | public int mTheme = -1;
14 |
15 | @Override
16 | protected void onCreate(Bundle savedInstanceBundle) {
17 | super.onCreate(savedInstanceBundle);
18 | ThemeUtil.setTheme(this);
19 | }
20 |
21 | @Override
22 | protected void onResume() {
23 | super.onResume();
24 | XposedApp.setColors(getSupportActionBar(), XposedApp.getColor(this), this);
25 | ThemeUtil.reloadTheme(this);
26 | }
27 |
28 | public void setFloating(androidx.appcompat.widget.Toolbar toolbar, @StringRes int details) {
29 | boolean isTablet = getResources().getBoolean(R.bool.isTablet);
30 | if (isTablet) {
31 | WindowManager.LayoutParams params = getWindow().getAttributes();
32 | params.height = getResources().getDimensionPixelSize(R.dimen.floating_height);
33 | params.width = getResources().getDimensionPixelSize(R.dimen.floating_width);
34 | params.alpha = 1.0f;
35 | params.dimAmount = 0.6f;
36 | params.flags |= 2;
37 | getWindow().setAttributes(params);
38 |
39 | if (details != 0) {
40 | toolbar.setTitle(details);
41 | }
42 | toolbar.setNavigationIcon(R.drawable.ic_close);
43 | setFinishOnTouchOutside(true);
44 | }
45 | }
46 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/solohsu/android/edxp/manager/adapter/CompileUtils.java:
--------------------------------------------------------------------------------
1 | package com.solohsu.android.edxp.manager.adapter;
2 |
3 | import android.content.Context;
4 | import android.content.pm.ApplicationInfo;
5 |
6 | import com.solohsu.android.edxp.manager.fragment.CompileDialogFragment;
7 |
8 | import androidx.fragment.app.FragmentManager;
9 | import com.solohsu.android.edxp.manager.R;
10 |
11 | public class CompileUtils {
12 |
13 | private static final String COMPILE_COMMAND_PREFIX = "cmd package compile ";
14 | private static final String COMPILE_RESET_COMMAND = COMPILE_COMMAND_PREFIX + "--reset ";
15 | private static final String COMPILE_SPEED_COMMAND = COMPILE_COMMAND_PREFIX + "-f -m speed ";
16 | private static final String TAG_COMPILE_DIALOG = "compile_dialog";
17 |
18 | public static void reset(Context context, FragmentManager fragmentManager,
19 | ApplicationInfo info) {
20 | compilePackageInBg(context, fragmentManager, info,
21 | context.getString(R.string.compile_reset_msg), COMPILE_RESET_COMMAND);
22 | }
23 |
24 | public static void compileSpeed(Context context, FragmentManager fragmentManager,
25 | ApplicationInfo info) {
26 | compilePackageInBg(context, fragmentManager, info,
27 | context.getString(R.string.compile_speed_msg), COMPILE_SPEED_COMMAND);
28 | }
29 |
30 | public static void compilePackageInBg(Context context, FragmentManager fragmentManager,
31 | ApplicationInfo info, String msg, String... commands) {
32 | CompileDialogFragment fragment = CompileDialogFragment.newInstance(info, msg, commands);
33 | fragment.show(fragmentManager, TAG_COMPILE_DIALOG);
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | #2196f3
5 | #1976d2
6 | #727272
7 | #448aff
8 | #F44336
9 | @color/red_500
10 | @color/darker_green
11 | #4CAF50
12 | #FFC107
13 |
14 |
15 |
16 | #ffeeeeee
17 | #fff
18 | #fff
19 | #dfdfdf
20 | #dbdbdb
21 | #222
22 | #e5e5e5
23 |
24 |
25 | #ff303030
26 | #363636
27 | #363636
28 | #505050
29 | #161616
30 | #222
31 | #505050
32 |
33 |
34 | #000000
35 | #181818
36 | #181818
37 | #303030
38 | #121212
39 |
40 |
41 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-anydpi/ic_nav_install.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/download_details.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
14 |
15 |
21 |
22 |
29 |
30 |
35 |
36 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/solohsu/android/edxp/manager/adapter/BlackListAdapter.java:
--------------------------------------------------------------------------------
1 | package com.solohsu.android.edxp.manager.adapter;
2 |
3 | import android.content.Context;
4 | import android.content.pm.ApplicationInfo;
5 | import android.widget.CompoundButton;
6 |
7 | import com.solohsu.android.edxp.manager.R;
8 | import com.solohsu.android.edxp.manager.util.ToastUtils;
9 |
10 | import java.util.List;
11 |
12 | public class BlackListAdapter extends AppAdapter {
13 |
14 | private volatile boolean isWhiteListMode;
15 | private List checkedList;
16 |
17 | public BlackListAdapter(Context context, boolean isWhiteListMode) {
18 | super(context);
19 | this.isWhiteListMode = isWhiteListMode;
20 | }
21 |
22 | public void setWhiteListMode(boolean isWhiteListMode) {
23 | this.isWhiteListMode = isWhiteListMode;
24 | }
25 |
26 | @Override
27 | protected List generateCheckedList() {
28 | AppHelper.makeSurePath();
29 | if (isWhiteListMode) {
30 | checkedList = AppHelper.getWhiteList();
31 | } else {
32 | checkedList = AppHelper.getBlackList();
33 | }
34 | return checkedList;
35 | }
36 |
37 | @Override
38 | protected void onCheckedChange(CompoundButton view, boolean isChecked, ApplicationInfo info) {
39 | boolean success = isChecked ?
40 | AppHelper.addPackageName(isWhiteListMode, info.packageName) :
41 | AppHelper.removePackageName(isWhiteListMode, info.packageName);
42 | if (success) {
43 | if (isChecked) {
44 | checkedList.add(info.packageName);
45 | } else {
46 | checkedList.remove(info.packageName);
47 | }
48 | } else {
49 | ToastUtils.showShortToast(context, R.string.add_package_failed);
50 | view.setChecked(!isChecked);
51 | }
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/icon_preference_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
19 |
23 |
24 |
30 |
31 |
45 |
46 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/util/chrome/LinkTransformationMethod.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util.chrome;
2 |
3 | import android.app.Activity;
4 | import android.graphics.Rect;
5 | import android.text.Spannable;
6 | import android.text.Spanned;
7 | import android.text.method.TransformationMethod;
8 | import android.text.style.URLSpan;
9 | import android.text.util.Linkify;
10 | import android.view.View;
11 | import android.widget.TextView;
12 |
13 | /**
14 | * Created by Nikola D. on 12/23/2015.
15 | */
16 | public class LinkTransformationMethod implements TransformationMethod {
17 |
18 | private Activity activity;
19 |
20 | public LinkTransformationMethod(Activity activity) {
21 | this.activity = activity;
22 | }
23 |
24 | @Override
25 | public CharSequence getTransformation(CharSequence source, View view) {
26 | if (view instanceof TextView) {
27 | TextView textView = (TextView) view;
28 | Linkify.addLinks(textView, Linkify.WEB_URLS);
29 | if (textView.getText() == null || !(textView.getText() instanceof Spannable)) {
30 | return source;
31 | }
32 | Spannable text = (Spannable) textView.getText();
33 | URLSpan[] spans = text.getSpans(0, textView.length(), URLSpan.class);
34 | for (int i = spans.length - 1; i >= 0; i--) {
35 | URLSpan oldSpan = spans[i];
36 | int start = text.getSpanStart(oldSpan);
37 | int end = text.getSpanEnd(oldSpan);
38 | String url = oldSpan.getURL();
39 | text.removeSpan(oldSpan);
40 | text.setSpan(new CustomTabsURLSpan(activity, url), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
41 | }
42 | return text;
43 | }
44 | return source;
45 | }
46 |
47 | @Override
48 | public void onFocusChanged(View view, CharSequence sourceText, boolean focused, int direction, Rect previouslyFocusedRect) {
49 | }
50 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout-v23/list_item_download.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
18 |
19 |
27 |
28 |
36 |
37 |
45 |
46 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/list_item_download.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
19 |
20 |
28 |
29 |
37 |
38 |
46 |
47 |
--------------------------------------------------------------------------------
/app/src/main/java/com/solohsu/android/edxp/manager/fragment/BasePreferenceFragment.java:
--------------------------------------------------------------------------------
1 | package com.solohsu.android.edxp.manager.fragment;
2 |
3 | import android.annotation.SuppressLint;
4 |
5 | import androidx.preference.Preference;
6 | import androidx.preference.PreferenceFragmentCompat;
7 | import androidx.preference.PreferenceGroup;
8 | import androidx.preference.PreferenceGroupAdapter;
9 | import androidx.preference.PreferenceScreen;
10 | import androidx.recyclerview.widget.RecyclerView;
11 |
12 | /**
13 | * Remove extra reserved space when preference icon is not set, this workaround is from
14 | * https://stackoverflow.com/a/51568782
15 | */
16 | public abstract class BasePreferenceFragment extends PreferenceFragmentCompat {
17 |
18 | private void setAllPreferencesToAvoidHavingExtraSpace(Preference preference) {
19 | preference.setIconSpaceReserved(false);
20 | if (preference instanceof PreferenceGroup) {
21 | PreferenceGroup preferenceGroup = ((PreferenceGroup) preference);
22 | for (int i = 0; i < preferenceGroup.getPreferenceCount(); i++) {
23 | setAllPreferencesToAvoidHavingExtraSpace(preferenceGroup.getPreference(i));
24 | }
25 | }
26 | }
27 |
28 | @Override
29 | public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
30 | if (preferenceScreen != null)
31 | setAllPreferencesToAvoidHavingExtraSpace(preferenceScreen);
32 | super.setPreferenceScreen(preferenceScreen);
33 | }
34 |
35 | @Override
36 | protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
37 | return new PreferenceGroupAdapter(preferenceScreen) {
38 | @SuppressLint("RestrictedApi")
39 | @Override
40 | public void onPreferenceHierarchyChange(Preference preference) {
41 | if (preference != null)
42 | setAllPreferencesToAvoidHavingExtraSpace(preference);
43 | super.onPreferenceHierarchyChange(preference);
44 | }
45 | };
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/widget/IntegerListPreference.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.widget;
2 |
3 | import android.content.Context;
4 | import android.content.SharedPreferences;
5 | import android.util.AttributeSet;
6 |
7 | import androidx.preference.ListPreference;
8 |
9 | public class IntegerListPreference extends ListPreference {
10 | public IntegerListPreference(Context context) {
11 | super(context);
12 | }
13 |
14 | public IntegerListPreference(Context context, AttributeSet attrs) {
15 | super(context, attrs);
16 | }
17 |
18 | public static int getIntValue(String value) {
19 | if (value == null)
20 | return 0;
21 |
22 | return (int) ((value.startsWith("0x"))
23 | ? Long.parseLong(value.substring(2), 16)
24 | : Long.parseLong(value));
25 | }
26 |
27 | @Override
28 | public void setValue(String value) {
29 | super.setValue(value);
30 | notifyChanged();
31 | }
32 |
33 | @Override
34 | protected boolean persistString(String value) {
35 | return value != null && persistInt(getIntValue(value));
36 |
37 | }
38 |
39 | @Override
40 | protected String getPersistedString(String defaultReturnValue) {
41 | SharedPreferences pref = getPreferenceManager().getSharedPreferences();
42 | String key = getKey();
43 | if (!shouldPersist() || !pref.contains(key))
44 | return defaultReturnValue;
45 |
46 | return String.valueOf(pref.getInt(key, 0));
47 | }
48 |
49 | @Override
50 | public int findIndexOfValue(String value) {
51 | CharSequence[] entryValues = getEntryValues();
52 | int intValue = getIntValue(value);
53 | if (value != null && entryValues != null) {
54 | for (int i = entryValues.length - 1; i >= 0; i--) {
55 | if (getIntValue(entryValues[i].toString()) == intValue) {
56 | return i;
57 | }
58 | }
59 | }
60 | return -1;
61 | }
62 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/tab_logs.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
17 |
18 |
24 |
25 |
26 |
27 |
50 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/util/json/XposedZip.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util.json;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import androidx.annotation.NonNull;
6 | import androidx.annotation.Nullable;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.widget.ArrayAdapter;
11 | import android.widget.TextView;
12 |
13 | import java.util.List;
14 |
15 | public class XposedZip {
16 |
17 | public String name;
18 | public String link;
19 | public String version;
20 | public String architecture;
21 |
22 | public static class MyAdapter extends ArrayAdapter {
23 |
24 | private final Context context;
25 | List list;
26 |
27 | public MyAdapter(Context context, List objects) {
28 | super(context, android.R.layout.simple_dropdown_item_1line, objects);
29 | this.context = context;
30 | this.list = objects;
31 | }
32 |
33 | @NonNull
34 | @Override
35 | public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
36 | return getMyView(parent, position);
37 | }
38 |
39 | @Override
40 | public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
41 | return getMyView(parent, position);
42 | }
43 |
44 | private View getMyView(ViewGroup parent, int position) {
45 | View row;
46 | ItemHolder holder = new ItemHolder();
47 |
48 | LayoutInflater inflater = ((Activity) context).getLayoutInflater();
49 | row = inflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false);
50 |
51 | holder.name = (TextView) row.findViewById(android.R.id.text1);
52 |
53 | row.setTag(holder);
54 |
55 | holder.name.setText(list.get(position).name);
56 | return row;
57 | }
58 |
59 | private class ItemHolder {
60 | TextView name;
61 | }
62 |
63 | }
64 |
65 | }
--------------------------------------------------------------------------------
/import-summary.txt:
--------------------------------------------------------------------------------
1 | ECLIPSE ANDROID PROJECT IMPORT SUMMARY
2 | ======================================
3 |
4 | Risky Project Location:
5 | -----------------------
6 | The tools *should* handle project locations in any directory. However,
7 | due to bugs, placing projects in directories containing spaces in the
8 | path, or characters like ", ' and &, have had issues. We're working to
9 | eliminate these bugs, but to save yourself headaches you may want to
10 | move your project to a location where this is not a problem.
11 | D:\Cloud Storage\Google Drive\Android Studio Projects\XDA-One\XposedInstaller1
12 | - - - -
13 |
14 | Ignored Files:
15 | --------------
16 | The following files were *not* copied into the new Gradle project; you
17 | should evaluate whether these are still needed in your project and if
18 | so manually move them:
19 |
20 | * .gitattributes
21 | * .gitignore
22 | * NOTICE.txt
23 | * lib\
24 | * lib\AndroidHiddenAPI.jar
25 | * logo.ai
26 | * logo.png
27 | * logo_transparent.png
28 |
29 | Moved Files:
30 | ------------
31 | Android Gradle projects use a different directory structure than ADT
32 | Eclipse projects. Here's how the projects were restructured:
33 |
34 | * AndroidManifest.xml => app\src\main\AndroidManifest.xml
35 | * assets\ => app\src\main\assets\
36 | * libs\android-support-v13.jar => app\libs\android-support-v13.jar
37 | * libs\libsuperuser-185868.jar => app\libs\libsuperuser-185868.jar
38 | * libs\StickyListHeaders-d7f6fc.jar => app\libs\StickyListHeaders-d7f6fc.jar
39 | * lint.xml => app\lint.xml
40 | * proguard-project.txt => app\proguard-project.txt
41 | * res\ => app\src\main\res\
42 | * src\ => app\src\main\java\
43 |
44 | Next Steps:
45 | -----------
46 | You can now build the project. The Gradle project needs network
47 | connectivity to download dependencies.
48 |
49 | Bugs:
50 | -----
51 | If for some reason your project does not build, and you determine that
52 | it is due to a bug or limitation of the Eclipse to Gradle importer,
53 | please file a bug at http://b.android.com with category
54 | Component-Tools.
55 |
56 | (This import summary is for your information only, and can be deleted
57 | after import once you are satisfied with the results.)
58 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | ext {
4 | VERSION_DATE = '19/10/18'
5 | APP_VERSION = '"1539962400000"'
6 | }
7 |
8 | android {
9 | compileSdkVersion 28
10 |
11 | lintOptions {
12 | abortOnError false
13 | }
14 |
15 | defaultConfig {
16 | applicationId "com.solohsu.android.edxp.manager"
17 | minSdkVersion 21
18 | //noinspection OldTargetApi
19 | targetSdkVersion 25
20 | versionCode 11
21 | versionName "2.2.5"
22 | project.ext.set("archivesBaseName", "EdXposedInstaller_v" + versionName)
23 |
24 | buildConfigField "String", "APP_VERSION", APP_VERSION
25 | }
26 |
27 | signingConfigs {
28 | release {
29 | storeFile file(STORE_FILE)
30 | storePassword STORE_PASSWORD
31 | keyAlias KEY_ALIAS
32 | keyPassword KEY_PASSWORD
33 | }
34 | }
35 |
36 | buildTypes {
37 | release {
38 | minifyEnabled false
39 | signingConfig signingConfigs.release
40 | }
41 | }
42 |
43 | compileOptions {
44 | sourceCompatibility = '1.8'
45 | targetCompatibility = '1.8'
46 | }
47 | }
48 |
49 | dependencies {
50 | implementation "androidx.cardview:cardview:1.0.0"
51 | implementation "com.google.android.material:material:1.0.0"
52 | implementation "androidx.browser:browser:1.0.0"
53 | implementation "androidx.preference:preference:1.1.0-alpha04"
54 | implementation "androidx.recyclerview:recyclerview:1.1.0-alpha03"
55 | implementation "androidx.fragment:fragment:1.1.0-alpha05"
56 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
57 | implementation 'com.afollestad.material-dialogs:commons:0.9.0.2'
58 | implementation 'com.github.mtotschnig:StickyListHeaders:2.7.1'
59 | implementation 'eu.chainfire:libsuperuser:1.0.0.201608240809'
60 | implementation "com.github.topjohnwu.libsu:core:2.2.0"
61 | implementation 'com.squareup.picasso:picasso:2.5.2'
62 | implementation 'de.psdev.licensesdialog:licensesdialog:1.8.3'
63 | implementation 'com.annimon:stream:1.2.0'
64 | implementation 'com.google.code.gson:gson:2.8.5'
65 | implementation fileTree(include: ['*.jar'], dir: 'libs')
66 | }
67 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/util/HashUtil.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util;
2 |
3 | import java.io.File;
4 | import java.io.FileInputStream;
5 | import java.io.IOException;
6 | import java.io.InputStream;
7 | import java.security.MessageDigest;
8 | import java.security.NoSuchAlgorithmException;
9 |
10 | public class HashUtil {
11 | public static final String hash(String input, String algorithm) {
12 | try {
13 | MessageDigest md = MessageDigest.getInstance(algorithm);
14 | byte[] messageDigest = md.digest(input.getBytes());
15 | return toHexString(messageDigest);
16 | } catch (NoSuchAlgorithmException e) {
17 | throw new IllegalArgumentException(e);
18 | }
19 | }
20 |
21 | public static final String md5(String input) {
22 | return hash(input, "MD5");
23 | }
24 |
25 | public static final String sha1(String input) {
26 | return hash(input, "SHA-1");
27 | }
28 |
29 | public static final String hash(File file, String algorithm) throws IOException {
30 | try {
31 | MessageDigest md = MessageDigest.getInstance(algorithm);
32 | InputStream is = new FileInputStream(file);
33 | byte[] buffer = new byte[8192];
34 | int read = 0;
35 | while ((read = is.read(buffer)) > 0) {
36 | md.update(buffer, 0, read);
37 | }
38 | is.close();
39 | byte[] messageDigest = md.digest();
40 | return toHexString(messageDigest);
41 | } catch (NoSuchAlgorithmException e) {
42 | throw new IllegalArgumentException(e);
43 | }
44 | }
45 |
46 | public static final String md5(File input) throws IOException {
47 | return hash(input, "MD5");
48 | }
49 |
50 | public static final String sha1(File input) throws IOException {
51 | return hash(input, "SHA-1");
52 | }
53 |
54 | private static String toHexString(byte[] bytes) {
55 | StringBuilder sb = new StringBuilder();
56 | for (byte b : bytes) {
57 | int unsignedB = b & 0xff;
58 | if (unsignedB < 0x10)
59 | sb.append("0");
60 | sb.append(Integer.toHexString(unsignedB));
61 | }
62 | return sb.toString();
63 | }
64 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_download_details.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
10 |
11 |
19 |
20 |
29 |
30 |
31 |
32 |
38 |
39 |
45 |
46 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/receivers/BootReceiver.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.receivers;
2 |
3 | import android.content.BroadcastReceiver;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.net.ConnectivityManager;
7 | import android.net.NetworkInfo;
8 | import android.os.AsyncTask;
9 | import android.util.Log;
10 |
11 | import org.json.JSONObject;
12 |
13 | import java.math.BigInteger;
14 |
15 | import com.solohsu.android.edxp.manager.BuildConfig;
16 | import de.robv.android.xposed.installer.XposedApp;
17 | import de.robv.android.xposed.installer.util.NotificationUtil;
18 | import de.robv.android.xposed.installer.util.json.JSONUtils;
19 |
20 | public class BootReceiver extends BroadcastReceiver {
21 |
22 | @Override
23 | public void onReceive(final Context context, Intent intent) {
24 | new android.os.Handler().postDelayed(new Runnable() {
25 | @Override
26 | public void run() {
27 | if (!isOnline(context)) return;
28 |
29 | // new CheckUpdates().execute();
30 | }
31 | }, 60 * 60 * 1000 /*60 min*/);
32 | }
33 |
34 | private boolean isOnline(Context context) {
35 | ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
36 | NetworkInfo netInfo = cm.getActiveNetworkInfo();
37 | return netInfo != null && netInfo.isConnectedOrConnecting();
38 | }
39 |
40 | private class CheckUpdates extends AsyncTask {
41 |
42 | @Override
43 | protected Void doInBackground(Void... params) {
44 | try {
45 | String jsonString = JSONUtils.getFileContent(JSONUtils.JSON_LINK).replace("%XPOSED_ZIP%", "");
46 |
47 | String newApkVersion = new JSONObject(jsonString).getJSONObject("apk").getString("version");
48 |
49 | BigInteger a = new BigInteger(BuildConfig.APP_VERSION);
50 | BigInteger b = new BigInteger(newApkVersion);
51 |
52 | if (a.compareTo(b) == -1) {
53 | NotificationUtil.showInstallerUpdateNotification();
54 | }
55 | } catch (Exception e) {
56 | Log.d(XposedApp.TAG, e.getMessage());
57 | }
58 | return null;
59 | }
60 |
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/download_view.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
7 |
8 |
15 |
16 |
23 |
24 |
31 |
32 |
41 |
42 |
50 |
51 |
52 |
53 |
58 |
59 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/DownloadDetailsSettingsFragment.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.content.SharedPreferences;
6 | import android.os.Bundle;
7 |
8 | import com.solohsu.android.edxp.manager.R;
9 | import com.solohsu.android.edxp.manager.fragment.BasePreferenceFragment;
10 |
11 | import java.util.Map;
12 |
13 | import androidx.preference.PreferenceManager;
14 | import de.robv.android.xposed.installer.repo.Module;
15 | import de.robv.android.xposed.installer.util.PrefixedSharedPreferences;
16 | import de.robv.android.xposed.installer.util.RepoLoader;
17 |
18 | public class DownloadDetailsSettingsFragment extends BasePreferenceFragment {
19 | private DownloadDetailsActivity mActivity;
20 |
21 | @Override
22 | public void onAttach(Activity activity) {
23 | super.onAttach(activity);
24 | mActivity = (DownloadDetailsActivity) activity;
25 | }
26 |
27 | @Override
28 | public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
29 | final Module module = mActivity.getModule();
30 | if (module == null)
31 | return;
32 |
33 | final String packageName = module.packageName;
34 |
35 | PreferenceManager prefManager = getPreferenceManager();
36 | prefManager.setSharedPreferencesName("module_settings");
37 | PrefixedSharedPreferences.injectToPreferenceManager(prefManager, module.packageName);
38 | addPreferencesFromResource(R.xml.module_prefs);
39 |
40 | SharedPreferences prefs = getActivity().getSharedPreferences("module_settings", Context.MODE_PRIVATE);
41 | SharedPreferences.Editor editor = prefs.edit();
42 |
43 | if (prefs.getBoolean("no_global", true)) {
44 | for (Map.Entry k : prefs.getAll().entrySet()) {
45 | if (prefs.getString(k.getKey(), "").equals("global")) {
46 | editor.putString(k.getKey(), "").apply();
47 | }
48 | }
49 |
50 | editor.putBoolean("no_global", false).apply();
51 | }
52 |
53 | findPreference("release_type").setOnPreferenceChangeListener(
54 | (preference, newValue) -> {
55 | RepoLoader.getInstance().setReleaseTypeLocal(packageName, (String) newValue);
56 | return true;
57 | });
58 | }
59 | }
--------------------------------------------------------------------------------
/app/src/main/res/menu/drawer.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
10 |
14 |
18 |
22 |
26 |
31 |
35 |
40 |
41 |
44 |
48 |
52 |
56 |
57 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v21/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
15 |
16 |
27 |
28 |
34 |
35 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/util/NavUtil.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.net.Uri;
7 | import android.provider.Browser;
8 | import androidx.annotation.AnyThread;
9 | import androidx.annotation.NonNull;
10 | import androidx.browser.customtabs.CustomTabsIntent;
11 | import android.text.Spannable;
12 | import android.text.SpannableString;
13 | import android.text.style.URLSpan;
14 | import android.text.util.Linkify;
15 |
16 | import com.afollestad.materialdialogs.MaterialDialog;
17 |
18 | import de.robv.android.xposed.installer.XposedApp;
19 |
20 | public final class NavUtil {
21 |
22 | public static Uri parseURL(String str) {
23 | if (str == null || str.isEmpty())
24 | return null;
25 |
26 | Spannable spannable = new SpannableString(str);
27 | Linkify.addLinks(spannable, Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES);
28 |
29 | URLSpan spans[] = spannable.getSpans(0, spannable.length(), URLSpan.class);
30 | return (spans.length > 0) ? Uri.parse(spans[0].getURL()) : null;
31 | }
32 |
33 | public static void startURL(Activity activity, Uri uri) {
34 | if (!XposedApp.getPreferences().getBoolean("chrome_tabs", true)) {
35 | Intent intent = new Intent(Intent.ACTION_VIEW, uri);
36 | intent.putExtra(Browser.EXTRA_APPLICATION_ID, activity.getPackageName());
37 | activity.startActivity(intent);
38 | return;
39 | }
40 |
41 | CustomTabsIntent.Builder customTabsIntent = new CustomTabsIntent.Builder();
42 | customTabsIntent.setShowTitle(true);
43 | customTabsIntent.setToolbarColor(XposedApp.getColor(activity));
44 | customTabsIntent.build().launchUrl(activity, uri);
45 | }
46 |
47 | public static void startURL(Activity activity, String url) {
48 | startURL(activity, parseURL(url));
49 | }
50 |
51 | @AnyThread
52 | public static void showMessage(final @NonNull Context context, final CharSequence message) {
53 | XposedApp.runOnUiThread(new Runnable() {
54 | @Override
55 | public void run() {
56 | new MaterialDialog.Builder(context)
57 | .content(message)
58 | .positiveText(android.R.string.ok)
59 | .show();
60 | }
61 | });
62 | }
63 | }
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/util/json/XposedTab.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util.json;
2 |
3 |
4 | import android.os.Build;
5 | import android.os.Parcel;
6 | import android.os.Parcelable;
7 |
8 | import java.util.ArrayList;
9 | import java.util.HashMap;
10 | import java.util.List;
11 |
12 | public class XposedTab implements Parcelable {
13 |
14 | public static final Creator CREATOR = new Creator() {
15 | @Override
16 | public XposedTab createFromParcel(Parcel in) {
17 | return new XposedTab(in);
18 | }
19 |
20 | @Override
21 | public XposedTab[] newArray(int size) {
22 | return new XposedTab[size];
23 | }
24 | };
25 |
26 | public String name = "";
27 | public List sdks = new ArrayList<>();
28 | public String author = "";
29 | public boolean stable = true;
30 |
31 | public HashMap compatibility = new HashMap<>();
32 | public HashMap incompatibility = new HashMap<>();
33 | public HashMap support = new HashMap<>();
34 | public HashMap> installers = new HashMap<>();
35 | public List uninstallers = new ArrayList<>();
36 |
37 | public XposedTab() { }
38 |
39 | protected XposedTab(Parcel in) {
40 | name = in.readString();
41 | author = in.readString();
42 | stable = in.readByte() != 0;
43 | }
44 |
45 | public String getCompatibility() {
46 | if (compatibility == null) return "";
47 | return compatibility.get(Integer.toString(Build.VERSION.SDK_INT));
48 | }
49 |
50 | public String getIncompatibility() {
51 | if (incompatibility == null) return "";
52 | return incompatibility.get(Integer.toString(Build.VERSION.SDK_INT));
53 | }
54 |
55 | public String getSupport() {
56 | if (support == null) return "";
57 | return support.get(Integer.toString(Build.VERSION.SDK_INT));
58 | }
59 |
60 | public List getInstallers() {
61 | if (support == null) return new ArrayList<>();
62 | return installers.get(Integer.toString(Build.VERSION.SDK_INT));
63 | }
64 |
65 | @Override
66 | public int describeContents() {
67 | return 0;
68 | }
69 |
70 | @Override
71 | public void writeToParcel(Parcel dest, int flags) {
72 | dest.writeString(name);
73 | dest.writeString(author);
74 | dest.writeByte((byte) (stable ? 1 : 0));
75 | }
76 | }
--------------------------------------------------------------------------------
/app/src/main/res/values/donottranslate.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | EdXposed Installer
5 | app_process
6 | XposedBridge.jar
7 | ---
8 | http://forum.xda-developers.com/xposed/material-design-xposed-installer-t3137758
9 | http://forum.xda-developers.com/xposed/xposed-faq-issues-t2735540
10 | http://repo.xposed.info/donate
11 | https://github.com/solohsu/XposedInstaller/
12 | http://forum.xda-developers.com/xposed
13 | StickyListHeaders\nlibsuperuser\nMaterialDialogs
14 |
15 | rovo89
16 | Tungstwenty
17 | dvdandroid
18 | -BioHaZard-
19 |
20 | Github
21 | XDA
22 |
23 | https://forum.xda-developers.com/member.php?u=4419114
24 | https://github.com/rovo89
25 | https://forum.xda-developers.com/member.php?u=4322181
26 | https://github.com/Tungstwenty
27 | https://forum.xda-developers.com/member.php?u=5345056
28 | https://github.com/dvdandroid
29 | https://forum.xda-developers.com/member.php?u=4756862
30 | https://github.com/BioHaZard1
31 |
32 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/installation/Flashable.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.installation;
2 |
3 | import android.content.Context;
4 | import android.os.Parcel;
5 | import android.os.Parcelable;
6 |
7 | import java.io.File;
8 | import java.io.IOException;
9 | import java.util.Set;
10 | import java.util.zip.ZipFile;
11 |
12 | import de.robv.android.xposed.installer.util.InstallZipUtil;
13 | import de.robv.android.xposed.installer.util.RootUtil;
14 |
15 | import static de.robv.android.xposed.installer.util.InstallZipUtil.closeSilently;
16 | import static de.robv.android.xposed.installer.util.InstallZipUtil.reportMissingFeatures;
17 | import static de.robv.android.xposed.installer.util.InstallZipUtil.triggerError;
18 |
19 | public abstract class Flashable implements Parcelable {
20 | public static final String KEY = "flash";
21 |
22 | protected final File mZipPath;
23 |
24 | public Flashable(File zipPath) {
25 | mZipPath = zipPath;
26 | }
27 |
28 | protected Flashable(Parcel in) {
29 | mZipPath = (File) in.readSerializable();
30 | }
31 |
32 | protected InstallZipUtil.ZipCheckResult openAndCheckZip(FlashCallback callback) {
33 | // Open the ZIP file.
34 | ZipFile zip;
35 | try {
36 | zip = new ZipFile(mZipPath);
37 | } catch (IOException e) {
38 | triggerError(callback, FlashCallback.ERROR_INVALID_ZIP, e.getLocalizedMessage());
39 | return null;
40 | }
41 |
42 | // Do some checks.
43 | InstallZipUtil.ZipCheckResult zipCheck = InstallZipUtil.checkZip(zip);
44 | if (!zipCheck.isValidZip()) {
45 | triggerError(callback, FlashCallback.ERROR_INVALID_ZIP);
46 | closeSilently(zip);
47 | return null;
48 | }
49 |
50 | if (zipCheck.hasXposedProp()) {
51 | Set missingFeatures = zipCheck.getXposedProp().getMissingInstallerFeatures();
52 | if (!missingFeatures.isEmpty()) {
53 | reportMissingFeatures(missingFeatures);
54 | triggerError(callback, FlashCallback.ERROR_INSTALLER_NEEDS_UPDATE);
55 | closeSilently(zip);
56 | return null;
57 | }
58 | }
59 |
60 | return zipCheck;
61 | }
62 |
63 | public abstract void flash(Context context, FlashCallback callback);
64 |
65 | public RootUtil.RebootMode getRebootMode() {
66 | return RootUtil.RebootMode.NORMAL;
67 | }
68 |
69 | @Override
70 | public int describeContents() {
71 | return 0;
72 | }
73 |
74 | @Override
75 | public void writeToParcel(Parcel dest, int flags) {
76 | dest.writeSerializable(mZipPath);
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/tab_downloader.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
14 |
15 |
19 |
20 |
28 |
29 |
36 |
37 |
42 |
43 |
52 |
53 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/receivers/PackageChangeReceiver.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.receivers;
2 |
3 | import android.content.BroadcastReceiver;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.net.Uri;
7 |
8 | import de.robv.android.xposed.installer.util.ModuleUtil;
9 | import de.robv.android.xposed.installer.util.ModuleUtil.InstalledModule;
10 | import de.robv.android.xposed.installer.util.NotificationUtil;
11 |
12 | public class PackageChangeReceiver extends BroadcastReceiver {
13 | private static ModuleUtil mModuleUtil = null;
14 |
15 | private static String getPackageName(Intent intent) {
16 | Uri uri = intent.getData();
17 | return (uri != null) ? uri.getSchemeSpecificPart() : null;
18 | }
19 |
20 | @Override
21 | public void onReceive(final Context context, final Intent intent) {
22 | if (intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED) && intent.getBooleanExtra(Intent.EXTRA_REPLACING, false))
23 | // Ignore existing packages being removed in order to be updated
24 | return;
25 |
26 | String packageName = getPackageName(intent);
27 | if (packageName == null)
28 | return;
29 |
30 | if (intent.getAction().equals(Intent.ACTION_PACKAGE_CHANGED)) {
31 | // make sure that the change is for the complete package, not only a
32 | // component
33 | String[] components = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST);
34 | if (components != null) {
35 | boolean isForPackage = false;
36 | for (String component : components) {
37 | if (packageName.equals(component)) {
38 | isForPackage = true;
39 | break;
40 | }
41 | }
42 | if (!isForPackage)
43 | return;
44 | }
45 | } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) {
46 | NotificationUtil.cancel(packageName, NotificationUtil.NOTIFICATION_MODULE_NOT_ACTIVATED_YET);
47 | return;
48 | }
49 |
50 | mModuleUtil = getModuleUtilInstance();
51 |
52 | InstalledModule module = ModuleUtil.getInstance().reloadSingleModule(packageName);
53 | if (module == null
54 | || intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) {
55 | // Package being removed, disable it if it was a previously active
56 | // Xposed mod
57 | if (mModuleUtil.isModuleEnabled(packageName)) {
58 | mModuleUtil.setModuleEnabled(packageName, false);
59 | mModuleUtil.updateModulesList(false);
60 | }
61 | return;
62 | }
63 |
64 | if (mModuleUtil.isModuleEnabled(packageName)) {
65 | mModuleUtil.updateModulesList(false);
66 | NotificationUtil.showModulesUpdatedNotification();
67 | } else {
68 | NotificationUtil.showNotActivatedNotification(packageName, module.getAppName());
69 | }
70 | }
71 |
72 | private ModuleUtil getModuleUtilInstance() {
73 | if (mModuleUtil == null) {
74 | mModuleUtil = ModuleUtil.getInstance();
75 | }
76 | return mModuleUtil;
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/util/AssetUtil.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util;
2 |
3 | import android.content.res.AssetManager;
4 | import android.os.Build;
5 | import android.os.FileUtils;
6 | import android.util.Log;
7 |
8 | import java.io.File;
9 | import java.io.FileOutputStream;
10 | import java.io.IOException;
11 | import java.io.InputStream;
12 |
13 | import de.robv.android.xposed.installer.XposedApp;
14 |
15 | public class AssetUtil {
16 | public static final File BUSYBOX_FILE = new File(XposedApp.getInstance().getCacheDir(), "busybox-xposed");
17 |
18 | @SuppressWarnings("deprecation")
19 | public static String getBinariesFolder() {
20 | if (Build.CPU_ABI.startsWith("arm")) {
21 | return "arm/";
22 | } else if (Build.CPU_ABI.startsWith("x86")) {
23 | return "x86/";
24 | } else {
25 | return null;
26 | }
27 | }
28 |
29 | public static File writeAssetToCacheFile(String name, int mode) {
30 | return writeAssetToCacheFile(name, name, mode);
31 | }
32 |
33 | public static File writeAssetToCacheFile(String assetName, String fileName, int mode) {
34 | return writeAssetToFile(assetName, new File(XposedApp.getInstance().getCacheDir(), fileName), mode);
35 | }
36 |
37 | public static File writeAssetToSdcardFile(String name, int mode) {
38 | return writeAssetToSdcardFile(name, name, mode);
39 | }
40 |
41 | public static File writeAssetToSdcardFile(String assetName, String fileName, int mode) {
42 | File dir = XposedApp.getInstance().getExternalFilesDir(null);
43 | return writeAssetToFile(assetName, new File(dir, fileName), mode);
44 | }
45 |
46 | public static File writeAssetToFile(String assetName, File targetFile, int mode) {
47 | return writeAssetToFile(null, assetName, targetFile, mode);
48 | }
49 |
50 | public static File writeAssetToFile(AssetManager assets, String assetName, File targetFile, int mode) {
51 | try {
52 | if (assets == null)
53 | assets = XposedApp.getInstance().getAssets();
54 | InputStream in = assets.open(assetName);
55 | writeStreamToFile(in, targetFile, mode);
56 | return targetFile;
57 | } catch (IOException e) {
58 | Log.e(XposedApp.TAG, "AssetUtil -> could not extract asset", e);
59 | if (targetFile != null)
60 | targetFile.delete();
61 |
62 | return null;
63 | }
64 | }
65 |
66 | public static void writeStreamToFile(InputStream in, File targetFile, int mode) throws IOException {
67 | FileOutputStream out = new FileOutputStream(targetFile);
68 |
69 | byte[] buffer = new byte[1024];
70 | int len;
71 | while ((len = in.read(buffer)) > 0) {
72 | out.write(buffer, 0, len);
73 | }
74 | in.close();
75 | out.close();
76 |
77 | FileUtils.setPermissions(targetFile.getAbsolutePath(), mode, -1, -1);
78 | }
79 |
80 | public synchronized static void extractBusybox() {
81 | if (BUSYBOX_FILE.exists())
82 | return;
83 |
84 | AssetManager assets = null;
85 | writeAssetToFile(assets, getBinariesFolder() + "busybox-xposed", BUSYBOX_FILE, 00700);
86 | }
87 |
88 | public synchronized static void removeBusybox() {
89 | BUSYBOX_FILE.delete();
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
11 |
12 |
13 |
18 |
19 |
29 |
30 |
40 |
41 |
47 |
48 |
54 |
55 |
57 |
58 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/SupportActivity.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import android.os.Build;
4 | import android.os.Bundle;
5 | import androidx.fragment.app.Fragment;
6 | import androidx.appcompat.app.ActionBar;
7 | import androidx.appcompat.widget.Toolbar;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 | import android.widget.TextView;
12 |
13 | import com.solohsu.android.edxp.manager.R;
14 |
15 | import de.robv.android.xposed.installer.util.NavUtil;
16 | import de.robv.android.xposed.installer.util.ThemeUtil;
17 |
18 | import static de.robv.android.xposed.installer.XposedApp.darkenColor;
19 |
20 | public class SupportActivity extends XposedBaseActivity {
21 | @Override
22 | protected void onCreate(Bundle savedInstanceState) {
23 | super.onCreate(savedInstanceState);
24 | ThemeUtil.setTheme(this);
25 | setContentView(R.layout.activity_container);
26 |
27 | Toolbar toolbar = findViewById(R.id.toolbar);
28 | setSupportActionBar(toolbar);
29 |
30 | toolbar.setNavigationOnClickListener(new View.OnClickListener() {
31 | @Override
32 | public void onClick(View view) {
33 | finish();
34 | }
35 | });
36 |
37 | ActionBar ab = getSupportActionBar();
38 | if (ab != null) {
39 | ab.setTitle(R.string.nav_item_support);
40 | ab.setDisplayHomeAsUpEnabled(true);
41 | }
42 |
43 | setFloating(toolbar, 0);
44 |
45 | if (savedInstanceState == null) {
46 | getSupportFragmentManager().beginTransaction().add(R.id.container, new SupportFragment()).commit();
47 | }
48 | }
49 |
50 | public static class SupportFragment extends Fragment {
51 | @Override
52 | public void onCreate(Bundle savedInstanceState) {
53 | super.onCreate(savedInstanceState);
54 | }
55 |
56 | @Override
57 | public void onResume() {
58 | super.onResume();
59 | if (Build.VERSION.SDK_INT >= 21)
60 | getActivity().getWindow().setStatusBarColor(darkenColor(XposedApp.getColor(getActivity()), 0.85f));
61 | }
62 |
63 | @Override
64 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
65 | Bundle savedInstanceState) {
66 | View v = inflater.inflate(R.layout.tab_support, container, false);
67 |
68 | View installerSupportView = v.findViewById(R.id.installerSupportView);
69 | View faqView = v.findViewById(R.id.faqView);
70 | View donateView = v.findViewById(R.id.donateView);
71 | TextView txtModuleSupport = v.findViewById(R.id.tab_support_module_description);
72 |
73 | txtModuleSupport.setText(getString(R.string.support_modules_description,
74 | getString(R.string.module_support)));
75 |
76 | setupView(installerSupportView, R.string.support_material_xda);
77 | setupView(faqView, R.string.support_faq_url);
78 | setupView(donateView, R.string.support_donate_url);
79 |
80 | return v;
81 | }
82 |
83 | public void setupView(View v, final int url) {
84 | v.setOnClickListener(new View.OnClickListener() {
85 | @Override
86 | public void onClick(View v) {
87 | NavUtil.startURL(getActivity(), getString(url));
88 | }
89 | });
90 | }
91 | }
92 | }
--------------------------------------------------------------------------------
/app/src/main/res/values/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | - @string/download_sorting_status
6 | - @string/download_sorting_updated
7 | - @string/download_sorting_created
8 |
9 |
10 |
11 | - @string/install_mode_normal
12 | - @string/install_mode_recovery_auto
13 | - @string/install_mode_recovery_manual
14 |
15 |
16 |
17 | - 0
18 | - 1
19 | - 2
20 |
21 |
22 |
23 | - @string/settings_theme_light
24 | - @string/settings_theme_dark
25 | - @string/settings_theme_black
26 |
27 |
28 |
29 | - @string/nav_item_install
30 | - @string/nav_item_modules
31 | - @string/nav_item_download
32 | - @string/nav_item_logs
33 |
34 |
35 |
36 | - 0
37 | - 1
38 | - 2
39 |
40 |
41 |
42 | - 0
43 | - 1
44 | - 2
45 | - 3
46 |
47 |
48 |
49 | - @string/reltype_stable_summary
50 | - @string/reltype_beta_summary
51 | - @string/reltype_experimental_summary
52 |
53 |
54 |
55 | - stable
56 | - beta
57 | - experimental
58 |
59 |
60 |
61 | - @string/reltype_use_global_summary
62 | - @string/reltype_stable_summary
63 | - @string/reltype_beta_summary
64 | - @string/reltype_experimental_summary
65 |
66 |
67 |
68 |
69 | - stable
70 | - beta
71 | - experimental
72 |
73 |
74 |
75 | - dvdandroid
76 | - hjmodi
77 | - rovo89
78 | - @string/rovo_89_old_icon
79 | - staol
80 |
81 |
82 |
83 | - 0
84 | - 1
85 | - 2
86 | - 3
87 | - 4
88 |
89 |
90 |
91 | - ic_launcher
92 | - ic_launcher_hjmodi
93 | - ic_launcher_rovo
94 | - ic_launcher_rovo_old
95 | - ic_launcher_staol
96 |
97 |
98 |
99 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_installation.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
15 |
16 |
21 |
22 |
31 |
32 |
41 |
42 |
43 |
44 |
45 |
46 |
51 |
52 |
62 |
63 |
74 |
75 |
87 |
88 |
89 |
90 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/util/json/JSONUtils.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util.json;
2 |
3 | import android.os.Build;
4 |
5 | import com.google.gson.Gson;
6 |
7 | import java.io.BufferedReader;
8 | import java.io.IOException;
9 | import java.io.InputStreamReader;
10 | import java.net.HttpURLConnection;
11 | import java.net.URL;
12 | import java.util.List;
13 | import java.util.regex.Matcher;
14 | import java.util.regex.Pattern;
15 |
16 | public class JSONUtils {
17 |
18 | public static final String JSON_LINK = "https://raw.githubusercontent.com/DVDAndroid/XposedInstaller/material/app/xposed_list_v2.json";
19 |
20 | public static String getFileContent(String url) throws IOException {
21 | HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection();
22 | c.setRequestMethod("GET");
23 | c.setInstanceFollowRedirects(false);
24 | c.setDoOutput(false);
25 | c.connect();
26 |
27 | BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
28 | StringBuilder sb = new StringBuilder();
29 | String line;
30 | while ((line = br.readLine()) != null) {
31 | sb.append(line);
32 | }
33 | br.close();
34 |
35 | return sb.toString();
36 | }
37 |
38 | private static String getLatestVersion() throws IOException {
39 | String site = getFileContent("http://dl-xda.xposed.info/framework/sdk" + Build.VERSION.SDK_INT + "/arm/");
40 |
41 | Pattern pattern = Pattern.compile("(href=\")([^\\?\"]*)\\.zip");
42 | Matcher matcher = pattern.matcher(site);
43 | String last = "";
44 | while (matcher.find()) {
45 | if (matcher.group().contains("test")) continue;
46 | last = matcher.group();
47 | }
48 | last = last.replace("href=\"", "");
49 | String[] file = last.split("-");
50 |
51 | return file[1].replace("v", "");
52 | }
53 |
54 | public static String listZip() {
55 | String latest;
56 | try {
57 | latest = getLatestVersion();
58 | } catch (IOException e) {
59 | // Got 404 response; no official Xposed zips available
60 | return "";
61 | }
62 |
63 | String newJson = ",\"" + Build.VERSION.SDK_INT + "\": [";
64 | String[] arch = new String[]{
65 | "arm",
66 | "arm64",
67 | "x86"
68 | };
69 |
70 | for (String a : arch) {
71 | newJson += installerToString(latest, a) + ",";
72 | }
73 |
74 | newJson = newJson.substring(0, newJson.length() - 1);
75 | newJson += "]";
76 |
77 | return newJson;
78 | }
79 |
80 | private static String installerToString(String latest, String architecture) {
81 | String filename = "xposed-v" + latest + "-sdk" + Build.VERSION.SDK_INT + "-" + architecture;
82 |
83 | XposedZip installer = new XposedZip();
84 | installer.name = filename;
85 | installer.version = latest;
86 | installer.architecture = architecture;
87 | installer.link = "http://dl-xda.xposed.info/framework/sdk" + Build.VERSION.SDK_INT + "/" + architecture + "/" + filename + ".zip";
88 |
89 | return new Gson().toJson(installer);
90 | }
91 |
92 | public class XposedJson {
93 | public List tabs;
94 | public ApkRelease apk;
95 | }
96 |
97 | public class ApkRelease {
98 | public String version;
99 | public String changelog;
100 | public String link;
101 | }
102 |
103 | }
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/installation/FlashRecoveryAuto.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.installation;
2 |
3 | import android.content.Context;
4 | import android.os.Parcel;
5 | import android.os.Parcelable;
6 |
7 | import java.io.File;
8 | import java.util.ArrayList;
9 |
10 | import com.solohsu.android.edxp.manager.R;
11 | import de.robv.android.xposed.installer.util.InstallZipUtil.ZipCheckResult;
12 | import de.robv.android.xposed.installer.util.RootUtil;
13 |
14 | import static de.robv.android.xposed.installer.util.InstallZipUtil.closeSilently;
15 |
16 | public class FlashRecoveryAuto extends Flashable {
17 |
18 | public static final Parcelable.Creator CREATOR
19 | = new Parcelable.Creator() {
20 | @Override
21 | public FlashRecoveryAuto createFromParcel(Parcel in) {
22 | return new FlashRecoveryAuto(in);
23 | }
24 |
25 | @Override
26 | public FlashRecoveryAuto[] newArray(int size) {
27 | return new FlashRecoveryAuto[size];
28 | }
29 | };
30 |
31 | public FlashRecoveryAuto(File zipPath) {
32 | super(zipPath);
33 | }
34 |
35 | protected FlashRecoveryAuto(Parcel in) {
36 | super(in);
37 | }
38 |
39 | @Override
40 | public void flash(Context context, FlashCallback callback) {
41 | ZipCheckResult zipCheck = openAndCheckZip(callback);
42 | if (zipCheck == null) {
43 | return;
44 | } else {
45 | closeSilently(zipCheck.getZip());
46 | }
47 |
48 | final String zipName = mZipPath.getName();
49 | String cmd;
50 |
51 | // Execute the flash commands.
52 | RootUtil rootUtil = new RootUtil();
53 | if (!rootUtil.startShell(callback)) {
54 | return;
55 | }
56 |
57 | callback.onStarted();
58 |
59 | // Make sure /cache/recovery/ exists.
60 | if (rootUtil.execute("ls /cache/recovery", new ArrayList()) != 0) {
61 | callback.onLine(context.getString(R.string.file_creating_directory, "/cache/recovery"));
62 | if (rootUtil.executeWithBusybox("mkdir /cache/recovery", callback) != 0) {
63 | callback.onError(FlashCallback.ERROR_GENERIC,
64 | context.getString(R.string.file_create_directory_failed, "/cache/recovery"));
65 | return;
66 | }
67 | }
68 |
69 | // Copy the ZIP to /cache/recovery/.
70 | callback.onLine(context.getString(R.string.file_copying, zipName));
71 | cmd = "cp -a " + RootUtil.getShellPath(mZipPath) + " /cache/recovery/" + zipName;
72 | if (rootUtil.executeWithBusybox(cmd, callback) != 0) {
73 | callback.onError(FlashCallback.ERROR_GENERIC,
74 | context.getString(R.string.file_copy_failed, zipName, "/cache/recovery"));
75 | return;
76 | }
77 |
78 | // Write the flashing command to /cache/recovery/command.
79 | callback.onLine(context.getString(R.string.file_writing_recovery_command));
80 | cmd = "echo --update_package=/cache/recovery/" + zipName + " > /cache/recovery/command";
81 | if (rootUtil.execute(cmd, callback) != 0) {
82 | callback.onError(FlashCallback.ERROR_GENERIC,
83 | context.getString(R.string.file_writing_recovery_command_failed));
84 | return;
85 | }
86 |
87 | callback.onLine(context.getString(R.string.auto_flash_note, zipName));
88 | callback.onDone();
89 | }
90 |
91 | @Override
92 | public RootUtil.RebootMode getRebootMode() {
93 | return RootUtil.RebootMode.RECOVERY;
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/app/src/main/java/de/robv/android/xposed/installer/DownloadDetailsFragment.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import android.app.Activity;
4 | import android.net.Uri;
5 | import android.os.Bundle;
6 | import androidx.fragment.app.Fragment;
7 | import android.text.method.LinkMovementMethod;
8 | import android.util.Pair;
9 | import android.view.LayoutInflater;
10 | import android.view.View;
11 | import android.view.ViewGroup;
12 | import android.widget.TextView;
13 |
14 | import com.solohsu.android.edxp.manager.R;
15 |
16 | import de.robv.android.xposed.installer.repo.Module;
17 | import de.robv.android.xposed.installer.repo.RepoParser;
18 | import de.robv.android.xposed.installer.util.NavUtil;
19 | import de.robv.android.xposed.installer.util.chrome.LinkTransformationMethod;
20 |
21 | public class DownloadDetailsFragment extends Fragment {
22 | private DownloadDetailsActivity mActivity;
23 |
24 | @Override
25 | public void onAttach(Activity activity) {
26 | super.onAttach(activity);
27 | mActivity = (DownloadDetailsActivity) activity;
28 | }
29 |
30 | @Override
31 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
32 | final Module module = mActivity.getModule();
33 | if (module == null)
34 | return null;
35 |
36 | final View view = inflater.inflate(R.layout.download_details, container, false);
37 |
38 | TextView title = view.findViewById(R.id.download_title);
39 | title.setText(module.name);
40 | title.setTextIsSelectable(true);
41 |
42 | TextView author = view.findViewById(R.id.download_author);
43 | if (module.author != null && !module.author.isEmpty())
44 | author.setText(getString(R.string.download_author, module.author));
45 | else
46 | author.setText(R.string.download_unknown_author);
47 |
48 | TextView description = view.findViewById(R.id.download_description);
49 | if (module.description != null) {
50 | if (module.descriptionIsHtml) {
51 | description.setText(RepoParser.parseSimpleHtml(getActivity(), module.description, description));
52 | description.setTransformationMethod(new LinkTransformationMethod(getActivity()));
53 | description.setMovementMethod(LinkMovementMethod.getInstance());
54 | } else {
55 | description.setText(module.description);
56 | }
57 | description.setTextIsSelectable(true);
58 | } else {
59 | description.setVisibility(View.GONE);
60 | }
61 |
62 | ViewGroup moreInfoContainer = view.findViewById(R.id.download_moreinfo_container);
63 | for (Pair moreInfoEntry : module.moreInfo) {
64 | View moreInfoView = inflater.inflate(R.layout.download_moreinfo, moreInfoContainer, false);
65 | TextView txtTitle = moreInfoView.findViewById(android.R.id.title);
66 | TextView txtValue = moreInfoView.findViewById(android.R.id.message);
67 |
68 | txtTitle.setText(moreInfoEntry.first + ":");
69 | txtValue.setText(moreInfoEntry.second);
70 |
71 | final Uri link = NavUtil.parseURL(moreInfoEntry.second);
72 | if (link != null) {
73 | txtValue.setTextColor(txtValue.getLinkTextColors());
74 | moreInfoView.setOnClickListener(new View.OnClickListener() {
75 | @Override
76 | public void onClick(View v) {
77 | NavUtil.startURL(getActivity(), link);
78 | }
79 | });
80 | }
81 |
82 | moreInfoContainer.addView(moreInfoView);
83 | }
84 |
85 | return view;
86 | }
87 | }
--------------------------------------------------------------------------------