├── core ├── .gitignore ├── consumer-rules.pro ├── src │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── core │ │ │ ├── database │ │ │ ├── migration │ │ │ │ ├── Migration_8_10.kt │ │ │ │ ├── Migration_9_10.kt │ │ │ │ ├── Migration_11_12.kt │ │ │ │ ├── Migration_10_11.kt │ │ │ │ ├── Migration_16_17.kt │ │ │ │ ├── Migration_14_15.kt │ │ │ │ ├── Migration_12_13.kt │ │ │ │ ├── Migration_7_8.kt │ │ │ │ ├── Migration_13_14.kt │ │ │ │ └── Migration_15_16.kt │ │ │ ├── dao │ │ │ │ ├── ExtraAppDao.kt │ │ │ │ ├── ExtraHubDao.kt │ │ │ │ ├── AppDao.kt │ │ │ │ ├── BaseDao.kt │ │ │ │ └── HubDao.kt │ │ │ └── table │ │ │ │ ├── extra_app │ │ │ │ └── ExtraAppEntity.kt │ │ │ │ └── extra_hub │ │ │ │ ├── ExtraHubEntity.kt │ │ │ │ └── utils │ │ │ │ └── URLReplace.kt │ │ │ ├── data │ │ │ ├── Constant.kt │ │ │ └── CoreConfig.kt │ │ │ ├── module │ │ │ ├── AppStatus.kt │ │ │ └── app │ │ │ │ └── version │ │ │ │ └── Version.kt │ │ │ └── utils │ │ │ └── AppBuilder.kt │ ├── test │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── core │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── net │ │ └── xzos │ │ └── upgradeall │ │ └── core │ │ └── ExampleInstrumentedTest.kt └── proguard-rules.pro ├── app-backup ├── .gitignore ├── consumer-rules.pro ├── src │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── app │ │ │ └── backup │ │ │ ├── manager │ │ │ ├── data │ │ │ │ └── WebDavConfig.kt │ │ │ └── status │ │ │ │ └── RestoreStatus.kt │ │ │ ├── Init.kt │ │ │ └── utils │ │ │ ├── Context.kt │ │ │ └── FileUtils.kt │ ├── test │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── app │ │ │ └── backup │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── net │ │ └── xzos │ │ └── upgradeall │ │ └── app │ │ └── backup │ │ └── ExampleInstrumentedTest.kt └── proguard-rules.pro ├── app ├── .gitignore └── src │ ├── main │ ├── res │ │ ├── values-th │ │ │ └── strings.xml │ │ ├── drawable │ │ │ ├── backdrop_png.png │ │ │ ├── bg_update_btn.xml │ │ │ ├── fg_update_btn.xml │ │ │ ├── bg_app_detail_changelog.xml │ │ │ ├── bg_circle.xml │ │ │ ├── ic_list_header_background.xml │ │ │ ├── ic_textview_background_fillet.xml │ │ │ ├── ic_menu_download.xml │ │ │ ├── ic_priority.xml │ │ │ ├── dotted_line.xml │ │ │ ├── ic_up.xml │ │ │ ├── ic_dot.xml │ │ │ ├── ic_menu_update.xml │ │ │ ├── ic_system_update.xml │ │ │ ├── ic_delete.xml │ │ │ ├── primary_rounded_corners.xml │ │ │ ├── ic_load.xml │ │ │ ├── secondary_rounded_corners.xml │ │ │ ├── ic_baseline_more_vert.xml │ │ │ ├── ic_ok.xml │ │ │ ├── ic_arrow.xml │ │ │ ├── ic_type_shell.xml │ │ │ ├── ic_language.xml │ │ │ ├── ic_search.xml │ │ │ ├── ic_help.xml │ │ │ ├── ic_home_apps.xml │ │ │ ├── ic_installation.xml │ │ │ ├── ic_arrow_small.xml │ │ │ ├── ic_cloud_list.xml │ │ │ ├── ic_done.xml │ │ │ ├── ic_home_rss.xml │ │ │ ├── ic_outline_cloud.xml │ │ │ ├── ic_check_needupdate.xml │ │ │ ├── baseline_drag_indicator.xml │ │ │ ├── ic_edit_small.xml │ │ │ ├── ic_share.xml │ │ │ ├── ic_loading.xml │ │ │ ├── ic_download.xml │ │ │ ├── ic_local_hub_list.xml │ │ │ ├── ic_local.xml │ │ │ ├── ic_plus.xml │ │ │ ├── ic_check_mark.xml │ │ │ ├── ic_hub_gitlab.xml │ │ │ ├── ic_home_about.xml │ │ │ ├── ic_edit.xml │ │ │ ├── ic_version_cloud.xml │ │ │ ├── ic_local_error.xml │ │ │ ├── ic_del_or_error.xml │ │ │ ├── ic_latest_or_right.xml │ │ │ ├── ic_write_item.xml │ │ │ └── ic_add.xml │ │ ├── values │ │ │ ├── ic_launcher_background.xml │ │ │ ├── config.xml │ │ │ ├── constant.xml │ │ │ └── attrs.xml │ │ ├── xml │ │ │ ├── backup_descriptor.xml │ │ │ ├── data_extraction_rules.xml │ │ │ ├── preferences_ui.xml │ │ │ ├── preferences_language.xml │ │ │ └── preferences_installation.xml │ │ ├── menu │ │ │ ├── menu_app_list.xml │ │ │ ├── menu_app_item_apps.xml │ │ │ ├── menu_app_item_update.xml │ │ │ ├── menu_app_setting.xml │ │ │ ├── menu_long_click_cardview_item_cloud_hub.xml │ │ │ ├── menu_app_item.xml │ │ │ ├── menu_del_button.xml │ │ │ ├── menu_share_button.xml │ │ │ ├── menu_app_detail.xml │ │ │ ├── menu_cloud_app_list.xml │ │ │ └── menu_actionbar_log.xml │ │ ├── anim │ │ │ ├── anim_text_switcher_in.xml │ │ │ └── anim_text_switcher_out.xml │ │ ├── values-night │ │ │ └── colors.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── layout │ │ │ ├── single_chip_layout.xml │ │ │ ├── item_more_version.xml │ │ │ ├── fragment_hub_list.xml │ │ │ ├── logview_item.xml │ │ │ ├── activity_rss.xml │ │ │ ├── activity_others.xml │ │ │ ├── app_bar.xml │ │ │ ├── simple_textview.xml │ │ │ ├── settings_activity.xml │ │ │ ├── fragment_log.xml │ │ │ ├── list_content.xml │ │ │ ├── content_list.xml │ │ │ └── activity_discover.xml │ │ └── values-cs │ │ │ └── strings.xml │ ├── ic_launcher-web.png │ ├── ic_launcher-playstore.png │ └── java │ │ └── net │ │ └── xzos │ │ └── upgradeall │ │ ├── ui │ │ ├── base │ │ │ ├── list │ │ │ │ ├── ListItemView.kt │ │ │ │ ├── ActivityListItemView.kt │ │ │ │ └── HubListFragment.kt │ │ │ ├── recycleview │ │ │ │ ├── RecyclerViewHandler.kt │ │ │ │ └── RecyclerViewHolder.kt │ │ │ ├── selectlistdialog │ │ │ │ ├── SelectItemHandler.kt │ │ │ │ ├── SelectItem.kt │ │ │ │ └── SelectItemHolder.kt │ │ │ ├── databinding │ │ │ │ └── EnableObservable.kt │ │ │ ├── listdialog │ │ │ │ └── ListDialogPart.kt │ │ │ ├── AppBarActivity.kt │ │ │ └── view │ │ │ │ └── AlwaysMarqueeTextView.kt │ │ ├── log │ │ │ ├── LogItemView.kt │ │ │ ├── LogRecyclerViewHolder.kt │ │ │ └── LogPageViewModel.kt │ │ ├── home │ │ │ └── adapter │ │ │ │ ├── HomeSimpleCardBean.kt │ │ │ │ ├── HomeModuleCardBean.kt │ │ │ │ ├── HomeModuleNonCardBean.kt │ │ │ │ └── HomeModuleBean.kt │ │ ├── applist │ │ │ ├── base │ │ │ │ ├── star │ │ │ │ │ └── StarAppHubListFragment.kt │ │ │ │ ├── update │ │ │ │ │ ├── UpdateAppListItemView.kt │ │ │ │ │ ├── UpdateAppHubListViewHolder.kt │ │ │ │ │ └── UpdateAppHubListAdapter.kt │ │ │ │ ├── AppHubListItemHandler.kt │ │ │ │ ├── applications │ │ │ │ │ ├── ApplicationsAppHubListFragment.kt │ │ │ │ │ └── ApplicationsAppHubListItemView.kt │ │ │ │ ├── normal │ │ │ │ │ ├── NormalAppHubListViewHolder.kt │ │ │ │ │ ├── NormalAppHubListAdapter.kt │ │ │ │ │ └── NormalAppHubListFragment.kt │ │ │ │ └── AppHubListViewHolder.kt │ │ │ ├── apps │ │ │ │ └── AppsActivity.kt │ │ │ └── magisk │ │ │ │ └── MagiskModuleActivity.kt │ │ ├── filemanagement │ │ │ ├── tasker_dialog │ │ │ │ ├── list │ │ │ │ │ ├── TaskerItemHandler.kt │ │ │ │ │ ├── TaskerItemHolder.kt │ │ │ │ │ ├── TaskerItem.kt │ │ │ │ │ └── TaskerListAdapter.kt │ │ │ │ └── TaskerDialogItem.kt │ │ │ ├── FileManagementActivity.kt │ │ │ ├── FileHubListItemHandler.kt │ │ │ ├── FileHubViewModel.kt │ │ │ └── FileHubListAdapter.kt │ │ ├── detail │ │ │ ├── setting │ │ │ │ └── attrlist │ │ │ │ │ ├── AttrListHandler.kt │ │ │ │ │ ├── AttrListItemView.kt │ │ │ │ │ └── AttrListHolder.kt │ │ │ └── download │ │ │ │ ├── DownloadItem.kt │ │ │ │ ├── DownloadStatusData.kt │ │ │ │ ├── DownloadHolder.kt │ │ │ │ ├── DownloadListAdapter.kt │ │ │ │ └── DownloadItemHandler.kt │ │ ├── hubmanager │ │ │ ├── HubManagerListItemHandler.kt │ │ │ ├── setting │ │ │ │ └── HubSettingView.kt │ │ │ ├── HubManagerListViewHolder.kt │ │ │ ├── HubManagerAdapter.kt │ │ │ └── HubManagerViewModel.kt │ │ ├── discover │ │ │ ├── DiscoverViewModel.kt │ │ │ ├── DiscoverActivity.kt │ │ │ └── DiscoverListItemHandler.kt │ │ ├── preference │ │ │ └── fragment │ │ │ │ ├── PrefFragments.kt │ │ │ │ └── LanguageFragment.kt │ │ ├── rss │ │ │ └── RssActivity.kt │ │ └── others │ │ │ └── OthersActivity.kt │ │ ├── utils │ │ ├── egg │ │ │ └── Day.kt │ │ ├── DownloadUtils.kt │ │ ├── ViewModel.kt │ │ ├── file │ │ │ └── FileUtils.kt │ │ ├── NotificationUtils.kt │ │ ├── ActivityExtension.kt │ │ ├── AppUtils.kt │ │ ├── LocaleUtils.kt │ │ └── DimensionKtx.kt │ │ ├── data │ │ └── constants │ │ │ ├── Repo.kt │ │ │ └── OnceTag.kt │ │ └── wrapper │ │ ├── core │ │ ├── AppUtils.kt │ │ └── VersionUtils.kt │ │ └── download │ │ └── Init.kt │ ├── test │ └── java │ │ └── net │ │ └── xzos │ │ └── upgradeall │ │ └── ExampleUnitTest.java │ └── androidTest │ └── java │ └── net │ └── xzos │ └── upgradeall │ └── ExampleInstrumentedTest.kt ├── core-getter ├── .gitignore ├── consumer-rules.pro ├── rpc │ ├── .gitignore │ └── build.gradle.kts ├── provider │ ├── .gitignore │ ├── consumer-rules.pro │ ├── src │ │ ├── main │ │ │ └── AndroidManifest.xml │ │ ├── test │ │ │ └── java │ │ │ │ └── net │ │ │ │ └── xzos │ │ │ │ └── upgradeall │ │ │ │ └── getter │ │ │ │ └── provider │ │ │ │ └── ExampleUnitTest.kt │ │ └── androidTest │ │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── getter │ │ │ └── provider │ │ │ └── ExampleInstrumentedTest.kt │ └── proguard-rules.pro ├── src │ ├── main │ │ ├── rust │ │ │ └── api_proxy │ │ │ │ ├── .rustfmt.toml │ │ │ │ ├── .cargo │ │ │ │ └── config.toml │ │ │ │ └── Cargo.toml │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── getter │ │ │ ├── RustConfig.kt │ │ │ ├── GetterWorker.kt │ │ │ └── NativeLib.kt │ ├── test │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── getter │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── net │ │ └── xzos │ │ └── upgradeall │ │ └── getter │ │ └── ExampleInstrumentedTest.kt └── proguard-rules.pro ├── core-shell ├── .gitignore ├── consumer-rules.pro ├── src │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── core │ │ │ └── shell │ │ │ ├── ShellResult.kt │ │ │ ├── CoreShell.kt │ │ │ └── ShellUtils.kt │ ├── test │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── core │ │ │ └── shell │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── net │ │ └── xzos │ │ └── upgradeall │ │ └── core │ │ └── shell │ │ └── ExampleInstrumentedTest.kt └── proguard-rules.pro ├── core-utils ├── .gitignore ├── consumer-rules.pro ├── src │ ├── main │ │ ├── java │ │ │ └── net │ │ │ │ └── xzos │ │ │ │ └── upgradeall │ │ │ │ └── core │ │ │ │ └── utils │ │ │ │ ├── None.kt │ │ │ │ ├── oberver │ │ │ │ ├── Tag.kt │ │ │ │ └── Observer.kt │ │ │ │ ├── constant │ │ │ │ ├── VersionType.kt │ │ │ │ └── AppType.kt │ │ │ │ ├── data_cache │ │ │ │ ├── cache_object │ │ │ │ │ ├── CacheGsonWrapper.kt │ │ │ │ │ ├── SaveMode.kt │ │ │ │ │ ├── Encoder.kt │ │ │ │ │ └── BaseCache.kt │ │ │ │ └── CacheConfig.kt │ │ │ │ ├── LongUtils.kt │ │ │ │ ├── versioning │ │ │ │ └── Constant.kt │ │ │ │ ├── LocaleUtils.kt │ │ │ │ ├── log │ │ │ │ ├── ObjectTag.kt │ │ │ │ └── LogUtilProxy.kt │ │ │ │ ├── StringUtils.kt │ │ │ │ └── JSONObject.kt │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── core │ │ │ └── utils │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── net │ │ └── xzos │ │ └── upgradeall │ │ └── core │ │ └── utils │ │ └── ExampleInstrumentedTest.kt └── proguard-rules.pro ├── core-websdk ├── .gitignore ├── data │ ├── .gitignore │ ├── build.gradle.kts │ └── src │ │ └── main │ │ └── java │ │ └── net │ │ └── xzos │ │ └── upgradeall │ │ └── websdk │ │ └── data │ │ └── json │ │ ├── DownloadInfo.kt │ │ └── CloudConfigList.kt ├── src │ ├── main │ │ ├── java │ │ │ └── net │ │ │ │ └── xzos │ │ │ │ └── upgradeall │ │ │ │ └── core │ │ │ │ └── websdk │ │ │ │ ├── api │ │ │ │ ├── client_proxy │ │ │ │ │ ├── Constants.kt │ │ │ │ │ └── Encoder.kt │ │ │ │ ├── web │ │ │ │ │ ├── proxy │ │ │ │ │ │ ├── WebTimeoutError.kt │ │ │ │ │ │ ├── OkhttpCancelProxy.kt │ │ │ │ │ │ └── OkhttpProxy.kt │ │ │ │ │ ├── http │ │ │ │ │ │ ├── HttpResponse.kt │ │ │ │ │ │ ├── HttpRequestData.kt │ │ │ │ │ │ └── DnsApi.kt │ │ │ │ │ └── HttpError.kt │ │ │ │ └── BaseApi.kt │ │ │ │ └── base_model │ │ │ │ ├── BaseServerApi.kt │ │ │ │ └── ApiRequestData.kt │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── core │ │ │ └── websdk │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── net │ │ └── xzos │ │ └── upgradeall │ │ └── core │ │ └── websdk │ │ └── ExampleInstrumentedTest.kt ├── consumer-rules.pro └── proguard-rules.pro ├── core-downloader ├── .gitignore ├── consumer-rules.pro ├── src │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── core │ │ │ └── downloader │ │ │ ├── Init.kt │ │ │ ├── DownloadConfig.kt │ │ │ └── filedownloader │ │ │ ├── item │ │ │ └── data │ │ │ │ └── TaskData.kt │ │ │ └── Error.kt │ ├── test │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── core │ │ │ └── downloader │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── net │ │ └── xzos │ │ └── upgradeall │ │ └── core │ │ └── downloader │ │ └── ExampleInstrumentedTest.kt └── proguard-rules.pro ├── core-installer ├── .gitignore ├── consumer-rules.pro ├── src │ ├── main │ │ ├── java │ │ │ ├── android │ │ │ │ ├── content │ │ │ │ │ ├── IIntentReceiver.java │ │ │ │ │ └── pm │ │ │ │ │ │ ├── IPackageInstallerCallback.java │ │ │ │ │ │ ├── UserInfo.java │ │ │ │ │ │ ├── IPackageManager.java │ │ │ │ │ │ └── ParceledListSlice.java │ │ │ │ └── os │ │ │ │ │ └── IUserManager.java │ │ │ └── net │ │ │ │ └── xzos │ │ │ │ └── upgradeall │ │ │ │ └── core │ │ │ │ └── installer │ │ │ │ ├── FileType.kt │ │ │ │ ├── Init.kt │ │ │ │ └── installerapi │ │ │ │ └── shizuku │ │ │ │ ├── IntentSenderUtils.java │ │ │ │ └── IIntentSenderAdaptor.java │ │ └── res │ │ │ └── xml │ │ │ └── file_paths.xml │ ├── test │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── core │ │ │ └── installer │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── net │ │ └── xzos │ │ └── upgradeall │ │ └── core │ │ └── installer │ │ └── ExampleInstrumentedTest.kt └── proguard-rules.pro ├── core-android-utils ├── .gitignore ├── consumer-rules.pro ├── src │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── core │ │ │ └── androidutils │ │ │ ├── Init.kt │ │ │ ├── app_info │ │ │ ├── AppVersionInfo.kt │ │ │ └── AppReceiver.kt │ │ │ ├── String.kt │ │ │ ├── FlagDelegate.kt │ │ │ └── ToastUtil.kt │ ├── test │ │ └── java │ │ │ └── net │ │ │ └── xzos │ │ │ └── upgradeall │ │ │ └── core │ │ │ └── androidutils │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── net │ │ └── xzos │ │ └── upgradeall │ │ └── core │ │ └── androidutils │ │ └── ExampleInstrumentedTest.kt └── proguard-rules.pro ├── fastlane └── metadata │ └── android │ ├── zh-CN │ ├── short_description.txt │ ├── images │ │ └── phoneScreenshots │ │ │ ├── 1.png │ │ │ └── 2.png │ └── full_description.txt │ └── en-US │ ├── images │ └── phoneScreenshots │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ └── 5.png │ └── short_description.txt ├── source └── screenshot │ ├── 1.png │ ├── 2.png │ ├── 1_en.png │ ├── 2_en.png │ ├── 3_en.png │ ├── 4_en.png │ └── 5_en.png ├── .github ├── labeler.yml ├── renovate.json └── workflows │ ├── issue-labeler.yml │ └── issue-closed-labeler.yml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitmodules ├── gradle.properties └── settings.gradle /core/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app-backup/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /core-getter/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core-shell/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core-utils/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core-websdk/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app-backup/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core-downloader/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core-getter/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core-getter/rpc/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core-installer/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core-installer/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core-shell/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core-utils/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core-websdk/data/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core-android-utils/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core-android-utils/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core-downloader/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core-getter/provider/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core-getter/provider/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core-getter/src/main/rust/api_proxy/.rustfmt.toml: -------------------------------------------------------------------------------- 1 | edition = "2021" 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/short_description.txt: -------------------------------------------------------------------------------- 1 | 检查 Android 应用,Magisk 模块以及其他更新! 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- 1 | ../../../../../../source/screenshot/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- 1 | ../../../../../../source/screenshot/2.png -------------------------------------------------------------------------------- /app/src/main/res/values-th/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /core/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- 1 | ../../../../../../source/screenshot/1_en.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- 1 | ../../../../../../source/screenshot/2_en.png -------------------------------------------------------------------------------- /source/screenshot/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/source/screenshot/1.png -------------------------------------------------------------------------------- /source/screenshot/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/source/screenshot/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | Check updates for Android apps, Magisk modules and more! -------------------------------------------------------------------------------- /source/screenshot/1_en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/source/screenshot/1_en.png -------------------------------------------------------------------------------- /source/screenshot/2_en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/source/screenshot/2_en.png -------------------------------------------------------------------------------- /source/screenshot/3_en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/source/screenshot/3_en.png -------------------------------------------------------------------------------- /source/screenshot/4_en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/source/screenshot/4_en.png -------------------------------------------------------------------------------- /source/screenshot/5_en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/source/screenshot/5_en.png -------------------------------------------------------------------------------- /.github/labeler.yml: -------------------------------------------------------------------------------- 1 | high: '\*\*优先级\*\*\r\n高' 2 | 3 | Medium: '\*\*优先级\*\*\r\n中' 4 | 5 | Low: '\*\*优先级\*\*\r\n低' 6 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/base/list/ListItemView.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.base.list 2 | 3 | interface ListItemView -------------------------------------------------------------------------------- /core-installer/src/main/java/android/content/IIntentReceiver.java: -------------------------------------------------------------------------------- 1 | package android.content; 2 | 3 | public class IIntentReceiver { 4 | } -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/None.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils 2 | 3 | class None 4 | val none = None() -------------------------------------------------------------------------------- /app/src/main/res/drawable/backdrop_png.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/app/src/main/res/drawable/backdrop_png.png -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/log/LogItemView.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.log 2 | 3 | class LogItemView(val logMessage: String) 4 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "core-getter/src/main/rust/getter"] 2 | path = core-getter/src/main/rust/getter 3 | url = https://github.com/DUpdateSystem/getter.git 4 | -------------------------------------------------------------------------------- /core-installer/src/main/java/android/content/pm/IPackageInstallerCallback.java: -------------------------------------------------------------------------------- 1 | package android.content.pm; 2 | 3 | public interface IPackageInstallerCallback { 4 | } -------------------------------------------------------------------------------- /app-backup/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/base/recycleview/RecyclerViewHandler.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.base.recycleview 2 | 3 | abstract class RecyclerViewHandler -------------------------------------------------------------------------------- /core-shell/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /core-utils/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /core-android-utils/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /core-getter/provider/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DUpdateSystem/UpgradeAll/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/oberver/Tag.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils.oberver 2 | 3 | interface Tag 4 | 5 | internal val doTag = object : Tag {} -------------------------------------------------------------------------------- /core-installer/src/main/res/xml/file_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/migration/Migration_8_10.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.migration 2 | 3 | 4 | val MIGRATION_8_10 = Migration_8_9_10_Share(8, 10) -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/home/adapter/HomeSimpleCardBean.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.home.adapter 2 | 3 | class HomeSimpleCardBean : HomeModuleBean(0, 0, null, STYLE_SIMPLE_CARD) -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/constant/VersionType.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils.constant 2 | 3 | // Android version code 4 | const val VERSION_CODE = "version_code" -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/base/list/ActivityListItemView.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.base.list 2 | 3 | interface ActivityListItemView : ListItemView { 4 | fun getItemIdName(): String 5 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/utils/egg/Day.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.utils.egg 2 | 3 | enum class Day { 4 | HALLOWEEN, // 万圣节 5 | CHINESE_NEW_YEAR, // 新年 6 | DRAGON_BOAT_FESTIVAL, // 端午节 7 | } -------------------------------------------------------------------------------- /app/src/main/res/values/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | update-server.xzos.net:5255 4 | 5 | -------------------------------------------------------------------------------- /core-websdk/src/main/java/net/xzos/upgradeall/core/websdk/api/client_proxy/Constants.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk.api.client_proxy 2 | 3 | const val APK_CONTENT_TYPE = "application/vnd.android.package-archive" -------------------------------------------------------------------------------- /core-websdk/src/main/java/net/xzos/upgradeall/core/websdk/api/web/proxy/WebTimeoutError.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk.api.web.proxy 2 | 3 | class WebTimeoutError( 4 | val msg:String 5 | ):RuntimeException() -------------------------------------------------------------------------------- /app/src/main/res/xml/backup_descriptor.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/data/Constant.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.data 2 | 3 | const val DEF_UPDATE_SERVER_URL = "update-server.xzos.net:5255" 4 | internal val URL_ARG_REGEX = "(%.*?)\\w*".toRegex() 5 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/data/constants/Repo.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.data.constants 2 | 3 | const val DEFAULT_REPO_URL = 4 | "https://fastly.jsdelivr.net/gh/DUpdateSystem/UpgradeAll-rules@dev/rules/rules.json" 5 | -------------------------------------------------------------------------------- /core-websdk/src/main/java/net/xzos/upgradeall/core/websdk/api/web/http/HttpResponse.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk.api.web.http 2 | 3 | data class HttpResponse( 4 | val code: Int, 5 | val bodyStr: String? = null 6 | ) -------------------------------------------------------------------------------- /core-getter/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/data_cache/cache_object/CacheGsonWrapper.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils.data_cache.cache_object 2 | 3 | interface CacheGsonWrapper { 4 | fun getBytes(): ByteArray 5 | } -------------------------------------------------------------------------------- /core-websdk/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /core-websdk/src/main/java/net/xzos/upgradeall/core/websdk/api/web/HttpError.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk.api.web 2 | 3 | import okhttp3.Call 4 | 5 | data class HttpError( 6 | val error: Throwable, 7 | val call: Call? = null, 8 | ) -------------------------------------------------------------------------------- /core-android-utils/src/main/java/net/xzos/upgradeall/core/androidutils/Init.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.androidutils 2 | 3 | import android.content.Context 4 | 5 | 6 | fun initCoreContext(context: Context) { 7 | androidContext = context 8 | } -------------------------------------------------------------------------------- /core-installer/src/main/java/net/xzos/upgradeall/core/installer/FileType.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.installer 2 | 3 | enum class FileType(val desc:String){ 4 | APK("APK"), 5 | MAGISK_MODULE("Magisk Module"), 6 | UNKNOWN("Unknown"), 7 | } -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/data_cache/cache_object/SaveMode.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils.data_cache.cache_object 2 | 3 | enum class SaveMode { 4 | MEMORY_AND_DISK, 5 | MEMORY_ONLY, 6 | DISK_ONLY, 7 | } -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_app_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/utils/DownloadUtils.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.utils 2 | 3 | import net.xzos.upgradeall.core.downloader.filedownloader.item.TaskSnap 4 | 5 | fun TaskSnap?.progress() = this?.let { downloadSize / totalSize * 100 } ?: -1L 6 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/data/constants/OnceTag.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.data.constants 2 | 3 | object OnceTag { 4 | const val APP_INFO_TOOLBAR_MENU_TIP = "APP_INFO_TOOLBAR_MENU_TIP" 5 | const val DB_NAME_MIGRATION = "DB_NAME_MIGRATION" 6 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/base/selectlistdialog/SelectItemHandler.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.base.selectlistdialog 2 | 3 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHandler 4 | 5 | 6 | class SelectItemHandler : RecyclerViewHandler() -------------------------------------------------------------------------------- /core-android-utils/src/main/java/net/xzos/upgradeall/core/androidutils/app_info/AppVersionInfo.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.androidutils.app_info 2 | 3 | data class AppVersionInfo( 4 | val name: String, 5 | val extra: Map = mapOf(), 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_app_item_apps.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_app_item_update.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_app_setting.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /core-getter/src/main/java/net/xzos/upgradeall/getter/RustConfig.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.getter 2 | 3 | import java.io.File 4 | 5 | class RustConfig( 6 | internal val cacheDir: File, 7 | internal val dataDir: File, 8 | internal val globalExpireTime: Long, 9 | ) -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/base/star/StarAppHubListFragment.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.base.star 2 | 3 | import net.xzos.upgradeall.ui.applist.base.normal.NormalAppHubListFragment 4 | 5 | 6 | class StarAppHubListFragment : NormalAppHubListFragment() -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/LongUtils.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils 2 | 3 | fun Double.fmt(): String { 4 | return if (this == this.toLong().toDouble()) 5 | String.format("%d", this.toLong()) 6 | else String.format("%s", this) 7 | } -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/data_cache/CacheConfig.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils.data_cache 2 | 3 | import java.io.File 4 | 5 | class CacheConfig( 6 | val defExpires: Int, 7 | val dir: File?, 8 | val autoRemove: Boolean = true, 9 | ) -------------------------------------------------------------------------------- /core-websdk/src/main/java/net/xzos/upgradeall/core/websdk/api/web/http/HttpRequestData.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk.api.web.http 2 | 3 | class HttpRequestData( 4 | val url: String, val headers: Map = mapOf(), 5 | val markId: String? = null 6 | ) 7 | -------------------------------------------------------------------------------- /app-backup/src/main/java/net/xzos/upgradeall/app/backup/manager/data/WebDavConfig.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.app.backup.manager.data 2 | 3 | class WebDavConfig( 4 | val url: String?, 5 | val path: String? = "\\", 6 | val username: String?, 7 | val password: String?, 8 | ) -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/filemanagement/tasker_dialog/list/TaskerItemHandler.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.filemanagement.tasker_dialog.list 2 | 3 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHandler 4 | 5 | class TaskerItemHandler : RecyclerViewHandler() -------------------------------------------------------------------------------- /app/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app-backup/src/main/java/net/xzos/upgradeall/app/backup/Init.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.app.backup 2 | 3 | import android.content.Context 4 | import net.xzos.upgradeall.app.backup.utils.androidContext 5 | 6 | fun initBackupContext(context: Context) { 7 | androidContext = context 8 | } -------------------------------------------------------------------------------- /app-backup/src/main/java/net/xzos/upgradeall/app/backup/utils/Context.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.app.backup.utils 2 | 3 | import android.annotation.SuppressLint 4 | import android.content.Context 5 | 6 | @SuppressLint("StaticFieldLeak") 7 | internal lateinit var androidContext: Context 8 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/utils/ViewModel.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.utils 2 | 3 | import androidx.lifecycle.MutableLiveData 4 | 5 | fun MutableLiveData>.setList(list: List) { 6 | value!!.clear() 7 | value!!.addAll(list) 8 | notifyObserver() 9 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_text_switcher_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_text_switcher_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_long_click_cardview_item_cloud_hub.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /core-downloader/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/module/AppStatus.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.module 2 | 3 | enum class AppStatus { 4 | APP_INACTIVE, 5 | APP_PENDING, 6 | 7 | NETWORK_ERROR, 8 | APP_LATEST, 9 | APP_OUTDATED, 10 | APP_NO_LOCAL, 11 | } 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_update_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/fg_update_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 8 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/apps/AppsActivity.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.apps 2 | 3 | import net.xzos.upgradeall.core.utils.constant.ANDROID_APP_TYPE 4 | import net.xzos.upgradeall.ui.applist.base.AppHubActivity 5 | 6 | class AppsActivity : AppHubActivity(ANDROID_APP_TYPE) -------------------------------------------------------------------------------- /app/src/main/res/values/constant.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1 4 | 2 5 | 3 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_app_detail_changelog.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FF121212 4 | #FF464646 5 | #FF121212 6 | #FFFFFF 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_app_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/versioning/Constant.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils.versioning 2 | 3 | internal val VERSION_NUMBER_STRICT_MATCH_REGEX = "\\d+(\\.\\d+)+([.|\\-|+|_| ]*[A-Za-z0-9]+)*".toRegex() 4 | internal val VERSION_NUMBER_MATCH_REGEX = "\\d+(\\.\\d+)*([.|\\-|+|_| ]*[A-Za-z0-9]+)*".toRegex() 5 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/magisk/MagiskModuleActivity.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.magisk 2 | 3 | import net.xzos.upgradeall.core.utils.constant.ANDROID_MAGISK_MODULE_TYPE 4 | import net.xzos.upgradeall.ui.applist.base.AppHubActivity 5 | 6 | class MagiskModuleActivity : AppHubActivity(ANDROID_MAGISK_MODULE_TYPE) -------------------------------------------------------------------------------- /core-android-utils/src/main/java/net/xzos/upgradeall/core/androidutils/String.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.androidutils 2 | 3 | import java.io.StringReader 4 | import java.util.* 5 | 6 | fun String.parseProperties(): Properties { 7 | return Properties().apply { 8 | this.load(StringReader(this@parseProperties)) 9 | } 10 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Nov 13 23:26:51 CST 2025 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip 5 | networkTimeout=10000 6 | validateDistributionUrl=true 7 | zipStoreBase=GRADLE_USER_HOME 8 | zipStorePath=wrapper/dists 9 | -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/LocaleUtils.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils 2 | 3 | import java.util.* 4 | 5 | /** 6 | * 提供 Android properties 格式的 Locale 7 | * 例如:* toString(): zh_CN 8 | */ 9 | fun getLocale(): Locale { 10 | val locale = Locale.getDefault() 11 | return Locale(locale.language, locale.country) 12 | } -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/oberver/Observer.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils.oberver 2 | 3 | typealias Func = (E) -> Unit 4 | typealias FuncNoArg = () -> Unit 5 | 6 | class Observer( 7 | val func: Func, 8 | val runCheck: () -> Boolean, 9 | val removeCheck: () -> Boolean, 10 | val id: Any = func, 11 | ) -------------------------------------------------------------------------------- /core-installer/src/main/java/net/xzos/upgradeall/core/installer/Init.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.installer 2 | 3 | import android.content.Context 4 | import net.xzos.upgradeall.core.installer.status.appInstallReceiver 5 | 6 | fun initConfig(context: Context, installMode: String) { 7 | ApkInstaller.installMode = installMode 8 | appInstallReceiver.register(context) 9 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_list_header_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/single_chip_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /core-downloader/src/main/java/net/xzos/upgradeall/core/downloader/Init.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.downloader 2 | 3 | import android.annotation.SuppressLint 4 | 5 | @SuppressLint("StaticFieldLeak") 6 | lateinit var downloadConfig: DownloadConfig 7 | 8 | fun initDownload( 9 | _downloadConfig: DownloadConfig, 10 | ) { 11 | downloadConfig = _downloadConfig 12 | } 13 | -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/constant/AppType.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils.constant 2 | 3 | // 可用的 APP 跟踪类型 4 | const val ANDROID_APP_TYPE = "android_app_package" 5 | const val ANDROID_MAGISK_MODULE_TYPE = "android_magisk_module" 6 | const val ANDROID_CUSTOM_SHELL = "android_custom_shell" 7 | const val ANDROID_CUSTOM_SHELL_ROOT = "android_custom_shell_root" -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/utils/file/FileUtils.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.utils.file 2 | 3 | import java.io.File 4 | 5 | val String.fileName: String 6 | get() = this.substringAfterLast('/', "") 7 | 8 | fun File.deleteChildRecursive() { 9 | if (this.isDirectory) { 10 | listFiles().forEach { 11 | it.deleteRecursively() 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/detail/setting/attrlist/AttrListHandler.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.detail.setting.attrlist 2 | 3 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHandler 4 | 5 | class AttrListHandler(private val viewModel: AttrListViewModel) : RecyclerViewHandler() { 6 | fun deleteItem(view: AttrListItemView) { 7 | viewModel.delItem(view) 8 | } 9 | } -------------------------------------------------------------------------------- /core-shell/src/main/java/net/xzos/upgradeall/core/shell/ShellResult.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.shell 2 | 3 | data class ShellResult( 4 | val stdout: MutableList = mutableListOf(), 5 | val stderr: MutableList = mutableListOf(), 6 | var exitCode: Int = -1, 7 | ) { 8 | fun stdout() = stdout.joinToString("\n") 9 | fun stderr() = stderr.joinToString("\n") 10 | } -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/log/ObjectTag.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils.log 2 | 3 | class ObjectTag( 4 | // 分类 5 | var sort: String, 6 | // 对象名称(日志需要,即时更新) 7 | var name: String 8 | ){ 9 | companion object{ 10 | const val core = "Core" 11 | const val app = "App" 12 | const val downloader = "Downloader" 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_del_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /core-websdk/src/main/java/net/xzos/upgradeall/core/websdk/api/client_proxy/Encoder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk.api.client_proxy 2 | 3 | import net.xzos.upgradeall.core.utils.data_cache.cache_object.BytesEncoder 4 | 5 | object StringEncoder : BytesEncoder { 6 | override fun encode(obj: String?) = obj?.toByteArray()!! 7 | override fun decode(data: ByteArray) = data.toString() 8 | } -------------------------------------------------------------------------------- /core-getter/rpc/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("java-library") 3 | id("org.jetbrains.kotlin.jvm") 4 | } 5 | 6 | java { 7 | sourceCompatibility = JavaVersion.VERSION_21 8 | targetCompatibility = JavaVersion.VERSION_21 9 | } 10 | 11 | dependencies { 12 | // JSON RPC 13 | implementation("com.github.briandilley.jsonrpc4j:jsonrpc4j:1.7") 14 | api(project(":core-websdk:data")) 15 | } 16 | -------------------------------------------------------------------------------- /core-websdk/data/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("java-library") 3 | id("org.jetbrains.kotlin.jvm") 4 | } 5 | 6 | java { 7 | sourceCompatibility = JavaVersion.VERSION_21 8 | targetCompatibility = JavaVersion.VERSION_21 9 | } 10 | 11 | dependencies { 12 | implementation("com.google.code.gson:gson:2.13.2") 13 | implementation("com.fasterxml.jackson.core:jackson-databind:2.20.1") 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_textview_background_fillet.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_more_version.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_share_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/dao/ExtraAppDao.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Query 5 | import net.xzos.upgradeall.core.database.table.extra_app.ExtraAppEntity 6 | 7 | @Dao 8 | interface ExtraAppDao : BaseDao { 9 | @Query("SELECT * FROM extra_app") 10 | suspend fun loadAll(): List 11 | } -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/migration/Migration_9_10.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.migration 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | 7 | val MIGRATION_9_10 = object : Migration(9, 10) { 8 | override fun migrate(database: SupportSQLiteDatabase) { 9 | database.execSQL("DROP INDEX app_key_value") 10 | } 11 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_download.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/utils/NotificationUtils.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.utils 2 | 3 | import android.app.NotificationManager 4 | import android.content.Context 5 | 6 | fun getNotificationManager(context: Context) = context.getSystemService( 7 | Context.NOTIFICATION_SERVICE 8 | ) as NotificationManager 9 | 10 | fun cleaNotification(context: Context) { 11 | getNotificationManager(context).cancelAll() 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/base/update/UpdateAppListItemView.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.base.update 2 | 3 | import android.content.Context 4 | import net.xzos.upgradeall.core.module.app.App 5 | import net.xzos.upgradeall.ui.applist.base.BaseAppListItemView 6 | 7 | class UpdateAppListItemView(app: App) : BaseAppListItemView(app) { 8 | fun renew(context: Context) { 9 | renewData(context) 10 | } 11 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_priority.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/data_cache/cache_object/Encoder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils.data_cache.cache_object 2 | 3 | interface Encoder { 4 | fun encode(obj: I?): O 5 | fun decode(data: O): I? 6 | } 7 | 8 | interface BytesEncoder : Encoder 9 | 10 | class PassEncoder : Encoder { 11 | override fun encode(obj: T?) = obj!! 12 | override fun decode(data: T) = data 13 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_hub_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/filemanagement/FileManagementActivity.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.filemanagement 2 | 3 | import androidx.activity.viewModels 4 | import net.xzos.upgradeall.ui.base.list.HubListActivity 5 | 6 | class FileManagementActivity : HubListActivity() { 7 | override val viewModel by viewModels() 8 | override val adapter by lazy { FileHubListAdapter(this) } 9 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/home/adapter/HomeModuleCardBean.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.home.adapter 2 | 3 | import android.view.View 4 | import androidx.annotation.DrawableRes 5 | import androidx.annotation.StringRes 6 | 7 | 8 | class HomeModuleCardBean( 9 | @DrawableRes iconRes: Int, 10 | @StringRes titleRes: Int, 11 | clickListener: View.OnClickListener 12 | ) : HomeModuleBean(iconRes, titleRes, clickListener, STYLE_CARD) -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/log/LogRecyclerViewHolder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.log 2 | 3 | import android.util.TypedValue 4 | import android.widget.TextView 5 | import androidx.recyclerview.widget.RecyclerView 6 | 7 | 8 | class LogRecyclerViewHolder(view: LogItemAdapter.LogItemView) : RecyclerView.ViewHolder(view) { 9 | var logTextView: TextView = view.also { 10 | it.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /core-downloader/src/main/java/net/xzos/upgradeall/core/downloader/DownloadConfig.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.downloader 2 | 3 | import android.content.Context 4 | import androidx.documentfile.provider.DocumentFile 5 | 6 | class DownloadConfig( 7 | @JvmField internal val ANDROID_CONTEXT: Context, 8 | internal val DOWNLOAD_MAX_TASK_NUM: Int, 9 | internal val DOWNLOAD_THREAD_NUM: Int, 10 | internal val DOWNLOAD_AUTO_RETRY_MAX_ATTEMPTS: Int, 11 | ) -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/detail/download/DownloadItem.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.detail.download 2 | 3 | import android.content.res.ColorStateList 4 | import net.xzos.upgradeall.core.module.app.version.AssetWrapper 5 | import net.xzos.upgradeall.ui.base.list.ListItemView 6 | 7 | class DownloadItem( 8 | val name: String, 9 | val hubName: String, 10 | val hubColor: ColorStateList, 11 | val fileAsset: AssetWrapper, 12 | ) : ListItemView -------------------------------------------------------------------------------- /app/src/main/res/layout/logview_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/base/selectlistdialog/SelectItem.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.base.selectlistdialog 2 | 3 | import net.xzos.upgradeall.ui.base.databinding.EnableObservable 4 | import net.xzos.upgradeall.ui.base.list.ListItemView 5 | 6 | class SelectItem( 7 | val name: String, 8 | val id: String, 9 | enable: Boolean 10 | ) : ListItemView { 11 | val enableObservable: EnableObservable = EnableObservable(enable) {} 12 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/home/adapter/HomeModuleNonCardBean.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.home.adapter 2 | 3 | import android.view.View 4 | import androidx.annotation.DrawableRes 5 | import androidx.annotation.StringRes 6 | 7 | 8 | class HomeModuleNonCardBean( 9 | @DrawableRes iconRes: Int, 10 | @StringRes titleRes: Int, 11 | clickListener: View.OnClickListener 12 | ) : HomeModuleBean(iconRes, titleRes, clickListener, STYLE_NON_CARD) -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/migration/Migration_11_12.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.migration 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | 7 | val MIGRATION_11_12 = object : Migration(11, 12) { 8 | override fun migrate(database: SupportSQLiteDatabase) { 9 | database.execSQL("ALTER TABLE hub ADD COLUMN applications_mode INT NOT NULL DEFAULT 0") 10 | } 11 | } -------------------------------------------------------------------------------- /core/src/test/java/net/xzos/upgradeall/core/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/dotted_line.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /core-getter/src/test/java/net/xzos/upgradeall/getter/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.getter 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/migration/Migration_10_11.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.migration 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | 7 | val MIGRATION_10_11 = object : Migration(10, 11) { 8 | override fun migrate(database: SupportSQLiteDatabase) { 9 | database.execSQL("ALTER TABLE app ADD COLUMN invalid_version_number_field_regex TEXT DEFAULT null") 10 | } 11 | } -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/migration/Migration_16_17.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.migration 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | 7 | val MIGRATION_16_17 = object : Migration(16, 17) { 8 | override fun migrate(database: SupportSQLiteDatabase) { 9 | database.execSQL("ALTER TABLE app ADD COLUMN include_version_number_field_regex TEXT DEFAULT NULL") 10 | } 11 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/detail/setting/attrlist/AttrListItemView.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.detail.setting.attrlist 2 | 3 | import androidx.databinding.ObservableField 4 | import net.xzos.upgradeall.ui.base.list.ListItemView 5 | 6 | class AttrListItemView( 7 | key: String, value: String 8 | ) : ListItemView { 9 | val key: ObservableField = ObservableField(key) 10 | val value: ObservableField = ObservableField(value) 11 | } -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/full_description.txt: -------------------------------------------------------------------------------- 1 | UpgradeAll 是一款自由开源软件,帮助你轻松检查 Android 应用(即使没有安装),Magisk 模块以及其他更新。 2 |

FAQ

3 |
    4 |
  • Q: 如何使用?
  • 5 |
  • A: 下载 apk 文件,安装并运行。
  • 6 |
  • Q: 哪里有帮助文档?
  • 7 |
  • A: 你可以在这里查看。
  • 8 |
9 |

功能

10 |
    11 |
  • 从多个来源获取更新。
  • 12 |
  • 通过外部应用下载文件。
  • 13 |
  • 高度可自定义规则。
  • 14 |
  • 现代且简洁的设计。
  • 15 |
  • 支持 Android 5.0 到 12L
  • 16 |
17 | -------------------------------------------------------------------------------- /app-backup/src/test/java/net/xzos/upgradeall/app/backup/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.app.backup 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/hubmanager/HubManagerListItemHandler.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.hubmanager 2 | 3 | import android.content.Context 4 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHandler 5 | import net.xzos.upgradeall.ui.hubmanager.setting.HubSettingDialog 6 | 7 | class HubManagerListItemHandler : RecyclerViewHandler() { 8 | fun onCardViewClick(context: Context, hubUuid: String) { 9 | HubSettingDialog(hubUuid).show(context) 10 | } 11 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/utils/ActivityExtension.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.utils 2 | 3 | import android.util.TypedValue 4 | import androidx.appcompat.app.AppCompatActivity 5 | 6 | fun AppCompatActivity.actionBarSize(): Int { 7 | val tv = TypedValue() 8 | return if (this.theme.resolveAttribute(android.R.attr.actionBarSize, tv, true)) { 9 | TypedValue.complexToDimensionPixelSize(tv.data, resources.displayMetrics) 10 | } else { 11 | 0 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_up.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /core-shell/src/test/java/net/xzos/upgradeall/core/shell/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.shell 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /core-utils/src/test/java/net/xzos/upgradeall/core/utils/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /core-websdk/src/test/java/net/xzos/upgradeall/core/websdk/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/migration/Migration_14_15.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.migration 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | 7 | val MIGRATION_14_15 = object : Migration(14, 15) { 8 | override fun migrate(database: SupportSQLiteDatabase) { 9 | database.execSQL("ALTER TABLE app ADD COLUMN star INTEGER DEFAULT NULL") 10 | UI_CONFIG_FILE.delete() 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/test/java/net/xzos/upgradeall/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /core-installer/src/test/java/net/xzos/upgradeall/core/installer/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.installer 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "labels": [ 3 | "dependencies" 4 | ], 5 | "extends": [ 6 | "config:base", 7 | ":gitSignOff" 8 | ], 9 | "groupName": "all", 10 | "packageRules": [ 11 | { 12 | "matchPackageNames": ["jni"], 13 | "enabled": false 14 | }, 15 | { 16 | "matchPackageNames": ["com.github.briandilley.jsonrpc4j:jsonrpc4j"], 17 | "matchNewValue": "1.6.0", 18 | "enabled": false 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_app_detail.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /core-downloader/src/test/java/net/xzos/upgradeall/core/downloader/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.downloader 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /core-android-utils/src/test/java/net/xzos/upgradeall/core/androidutils/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.androidutils 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /core-getter/provider/src/test/java/net/xzos/upgradeall/getter/provider/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.getter.provider 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /core-getter/src/main/java/net/xzos/upgradeall/getter/GetterWorker.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.getter 2 | 3 | import android.content.Context 4 | import kotlinx.coroutines.delay 5 | 6 | lateinit var GETTER_PORT: GetterPort 7 | 8 | suspend fun runGetterServer(context: Context, getterPort: GetterPort) { 9 | GETTER_PORT = getterPort 10 | GETTER_PORT.runService(context) 11 | } 12 | 13 | suspend fun waitGetterServer() { 14 | while (!GETTER_PORT.waitService()) { 15 | delay(1000L) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/wrapper/core/AppUtils.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.wrapper.core 2 | 3 | import android.content.Context 4 | import net.xzos.upgradeall.core.module.app.App 5 | import net.xzos.upgradeall.wrapper.download.startDownload 6 | 7 | suspend fun App.upgrade(context: Context) { 8 | val fileAsset = versionList.firstOrNull() 9 | ?.versionList?.firstOrNull() 10 | ?.assetList?.firstOrNull() 11 | ?: return 12 | startDownload(context, false, this, fileAsset) 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dot.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx4g -XX:+UseParallelGC -Dfile.encoding=UTF-8 2 | org.gradle.parallel=true 3 | org.gradle.caching=true 4 | org.gradle.configureondemand=true 5 | 6 | android.useAndroidX=true 7 | android.enableJetifier=true 8 | android.injected.testOnly=false 9 | 10 | kotlin.code.style=official 11 | 12 | kapt.verbose=true 13 | kapt.incremental.apt=true 14 | kapt.use.worker.api=true 15 | android.defaults.buildfeatures.buildconfig=true 16 | android.nonTransitiveRClass=false 17 | android.nonFinalResIds=false 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_update.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/table/extra_app/ExtraAppEntity.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.table.extra_app 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | 7 | @Entity(tableName = "extra_app") 8 | data class ExtraAppEntity( 9 | @PrimaryKey(autoGenerate = true) val id: Long, 10 | @ColumnInfo(name = "app_id") var appId: Map, 11 | @ColumnInfo(name = "mark_version_number") var __mark_version_number: String? = null, 12 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_system_update.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_rss.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/dao/ExtraHubDao.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Query 5 | import net.xzos.upgradeall.core.database.table.extra_hub.ExtraHubEntity 6 | 7 | 8 | @Dao 9 | interface ExtraHubDao : BaseDao { 10 | @Query("SELECT * FROM extra_hub WHERE id= :id") 11 | suspend fun loadByUuid(id: String): ExtraHubEntity? 12 | 13 | @Query("DELETE FROM extra_hub WHERE id= :id") 14 | suspend fun deleteByUuid(id: String) 15 | } -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/migration/Migration_12_13.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.migration 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | 7 | val MIGRATION_12_13 = object : Migration(12, 13) { 8 | override fun migrate(database: SupportSQLiteDatabase) { 9 | database.execSQL("ALTER TABLE hub ADD COLUMN sort_point INT NOT NULL DEFAULT 0") 10 | database.execSQL("ALTER TABLE app ADD COLUMN enable_hub_list TEXT DEFAULT NULL") 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_others.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/StringUtils.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils 2 | 3 | import android.util.Base64 4 | import java.math.BigInteger 5 | import java.security.MessageDigest 6 | 7 | fun String.md5(): String { 8 | val md = MessageDigest.getInstance("MD5") 9 | return BigInteger(1, md.digest(this.toByteArray())).toString(16).padStart(32, '0') 10 | } 11 | 12 | fun String.base64(): String = this.toByteArray().base64() 13 | fun ByteArray.base64(): String = Base64.encodeToString(this, Base64.NO_PADDING).replace("\n", "") 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/primary_rounded_corners.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 11 | 12 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_cloud_app_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_load.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/secondary_rounded_corners.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 11 | 12 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /core-getter/src/main/rust/api_proxy/.cargo/config.toml: -------------------------------------------------------------------------------- 1 | # 16KB page size support for Android 15+ 2 | # Required for NDK < 28 to ensure compatibility with 16KB page size devices 3 | 4 | [target.aarch64-linux-android] 5 | rustflags = ["-C", "link-arg=-Wl,-z,max-page-size=16384"] 6 | 7 | [target.armv7-linux-androideabi] 8 | rustflags = ["-C", "link-arg=-Wl,-z,max-page-size=16384"] 9 | 10 | [target.x86_64-linux-android] 11 | rustflags = ["-C", "link-arg=-Wl,-z,max-page-size=16384"] 12 | 13 | [target.i686-linux-android] 14 | rustflags = ["-C", "link-arg=-Wl,-z,max-page-size=16384"] 15 | -------------------------------------------------------------------------------- /core-installer/src/main/java/android/content/pm/UserInfo.java: -------------------------------------------------------------------------------- 1 | package android.content.pm; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | public class UserInfo { 7 | 8 | public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 9 | 10 | public UserInfo createFromParcel(Parcel var1) { 11 | throw new UnsupportedOperationException(); 12 | } 13 | 14 | public UserInfo[] newArray(int var1) { 15 | throw new UnsupportedOperationException(); 16 | } 17 | }; 18 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_more_vert.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/base/AppHubListItemHandler.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.base 2 | 3 | import android.view.View 4 | import net.xzos.upgradeall.core.module.app.App 5 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHandler 6 | import net.xzos.upgradeall.ui.detail.AppDetailActivity 7 | 8 | abstract class AppHubListItemHandler : RecyclerViewHandler() { 9 | fun onClickApp(app: App, view: View) { 10 | AppDetailActivity.startActivity(view.context, app) 11 | } 12 | 13 | abstract fun showPopup(app: App, v: View): Boolean 14 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_ok.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/dao/AppDao.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Query 5 | import net.xzos.upgradeall.core.database.table.AppEntity 6 | 7 | @Dao 8 | interface AppDao : BaseDao { 9 | @Query("SELECT id FROM app WHERE rowid = :rowId") 10 | suspend fun loadIdByRowId(rowId: Long): Long 11 | 12 | @Query("SELECT * FROM app") 13 | suspend fun loadAll(): List 14 | 15 | @Query("DELETE FROM app WHERE id = :id") 16 | suspend fun deleteById(id: Long) 17 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/hubmanager/setting/HubSettingView.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.hubmanager.setting 2 | 3 | import androidx.databinding.ObservableBoolean 4 | import androidx.databinding.ObservableField 5 | 6 | class HubSettingView( 7 | useGlobalSetting: Boolean?, 8 | match: String?, 9 | replace: String? 10 | ) { 11 | val useGlobalSetting = ObservableBoolean(useGlobalSetting ?: false) 12 | val useGlobalSettingVisibility = useGlobalSetting != null 13 | val matchRule = ObservableField(match) 14 | val replaceString = ObservableField(replace) 15 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/base/databinding/EnableObservable.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.base.databinding 2 | 3 | import androidx.databinding.BaseObservable 4 | import androidx.databinding.Bindable 5 | import net.xzos.upgradeall.BR 6 | 7 | class EnableObservable(enable: Boolean, private val changedFun: (enable: Boolean) -> Unit) : 8 | BaseObservable() { 9 | 10 | @get:Bindable 11 | var enable: Boolean = enable 12 | set(value) { 13 | field = value 14 | changedFun(value) 15 | notifyPropertyChanged(BR.enable) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_type_shell.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/base/applications/ApplicationsAppHubListFragment.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.base.applications 2 | 3 | import net.xzos.upgradeall.ui.applist.base.normal.NormalAppHubListAdapter 4 | import net.xzos.upgradeall.ui.applist.base.normal.NormalAppHubListFragment 5 | 6 | 7 | class ApplicationsAppHubListFragment : NormalAppHubListFragment() { 8 | override val adapter = NormalAppHubListAdapter( 9 | listContainerViewConvertFun = { 10 | ApplicationsAppHubListItemView(it).apply { renew(requireContext()) } 11 | }) 12 | } -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/dao/BaseDao.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.dao 2 | 3 | import androidx.room.Delete 4 | import androidx.room.Insert 5 | import androidx.room.RawQuery 6 | import androidx.room.Update 7 | import androidx.sqlite.db.SupportSQLiteQuery 8 | 9 | 10 | interface BaseDao { 11 | @Insert 12 | suspend fun insert(item: E): Long 13 | 14 | @Update 15 | suspend fun update(item: E) 16 | 17 | @Delete 18 | suspend fun delete(item: E) 19 | 20 | @RawQuery 21 | suspend fun checkpoint(supportSQLiteQuery: SupportSQLiteQuery): Int 22 | } -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/dao/HubDao.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Query 5 | import net.xzos.upgradeall.core.database.table.HubEntity 6 | 7 | 8 | @Dao 9 | interface HubDao : BaseDao { 10 | @Query("SELECT * FROM hub") 11 | suspend fun loadAll(): List 12 | 13 | @Query("SELECT * FROM hub WHERE uuid = :uuid") 14 | suspend fun loadByUuid(uuid: String): HubEntity? 15 | 16 | @Query("DELETE FROM hub WHERE uuid = :uuid") 17 | suspend fun deleteByUuid(uuid: String) 18 | } -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/migration/Migration_7_8.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.migration 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | 7 | val MIGRATION_7_8 = object : Migration(7, 8) { 8 | override fun migrate(database: SupportSQLiteDatabase) { 9 | database.execSQL("DROP INDEX applications_key_value") 10 | database.execSQL(""" 11 | CREATE UNIQUE INDEX applications_key_value 12 | on applications (hub_uuid, extra_id, auth); 13 | """ 14 | ) 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/base/normal/NormalAppHubListViewHolder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.base.normal 2 | 3 | import net.xzos.upgradeall.databinding.ItemHubAppNormalBinding 4 | import net.xzos.upgradeall.ui.applist.base.AppHubListViewHolder 5 | 6 | class NormalAppHubListViewHolder(private val binding: ItemHubAppNormalBinding) 7 | : AppHubListViewHolder(binding.mainInfo, binding) { 8 | 9 | override fun doBind(itemView: NormalAppListItemView) { 10 | super.doBind(itemView) 11 | binding.item = itemView 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/filemanagement/FileHubListItemHandler.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.filemanagement 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHandler 5 | import net.xzos.upgradeall.ui.filemanagement.tasker_dialog.TaskerListDialog 6 | import net.xzos.upgradeall.wrapper.download.DownloadTasker 7 | 8 | class FileHubListItemHandler(private val activity: AppCompatActivity) : RecyclerViewHandler() { 9 | fun showDialog(fileTasker: DownloadTasker) { 10 | TaskerListDialog.newInstance(activity, fileTasker) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_language.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/data/CoreConfig.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.data 2 | 3 | import java.io.File 4 | 5 | class CoreConfig( 6 | // 缓存过期时间 7 | internal val data_expiration_time: Int, 8 | // SDK 本地文件缓存地址 9 | internal val cache_dir: File, 10 | // 更新服务器地址 11 | internal val update_server_url: String, 12 | // 特别的云配置地址 13 | internal val cloud_rules_hub_url: String?, 14 | // 应用市场模式下是否忽略系统应用 15 | internal val applications_ignore_system_app: Boolean, 16 | 17 | // Rust SDK 本地文件地址 18 | internal val rust_cache_dir: File, 19 | internal val rust_data_dir: File, 20 | ) -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/home/adapter/HomeModuleBean.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.home.adapter 2 | 3 | import android.view.View 4 | import androidx.annotation.DrawableRes 5 | import androidx.annotation.StringRes 6 | import com.chad.library.adapter.base.entity.MultiItemEntity 7 | 8 | const val STYLE_CARD = 0 9 | const val STYLE_NON_CARD = 1 10 | const val STYLE_SIMPLE_CARD = 2 11 | 12 | abstract class HomeModuleBean( 13 | @DrawableRes val iconRes: Int, 14 | @StringRes val titleRes: Int, 15 | val clickListener: View.OnClickListener?, 16 | override val itemType: Int 17 | ) : MultiItemEntity -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | mavenCentral() 4 | maven { url "https://plugins.gradle.org/m2/" } 5 | } 6 | } 7 | 8 | plugins { 9 | id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' 10 | } 11 | 12 | include ':app' 13 | include ':core' 14 | include ':core-websdk' 15 | include ':core-utils' 16 | include ':core-shell' 17 | include ':core-downloader' 18 | include ':core-installer' 19 | include ':core-android-utils' 20 | include ':app-backup' 21 | include ':core-getter' 22 | include ':core-websdk:data' 23 | include ':core-getter:provider' 24 | include ':core-getter:rpc' -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/detail/download/DownloadStatusData.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.detail.download 2 | 3 | import androidx.databinding.ObservableField 4 | import net.xzos.upgradeall.R 5 | import net.xzos.upgradeall.application.MyApplication.Companion.context 6 | 7 | class DownloadStatusData { 8 | val downloadStatusData = ObservableField().apply { 9 | set(context.getString(R.string.download)) 10 | } 11 | val downloadProgressData = ObservableField() 12 | 13 | fun setDownloadProgress(downloadProgress: Int) { 14 | downloadProgressData.set(downloadProgress) 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/res/xml/preferences_ui.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/discover/DiscoverViewModel.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.discover 2 | 3 | import android.app.Application 4 | import net.xzos.upgradeall.core.manager.CloudConfigGetter 5 | import net.xzos.upgradeall.ui.base.recycleview.ListContainerViewModel 6 | import net.xzos.upgradeall.websdk.data.json.AppConfigGson 7 | 8 | class DiscoverViewModel(application: Application) : 9 | ListContainerViewModel(application) { 10 | 11 | override suspend fun doLoadData(): List { 12 | CloudConfigGetter.renew() 13 | return CloudConfigGetter.appConfigList ?: emptyList() 14 | } 15 | } -------------------------------------------------------------------------------- /app-backup/src/main/java/net/xzos/upgradeall/app/backup/manager/status/RestoreStatus.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.app.backup.manager.status 2 | 3 | data class RestoreStatus( 4 | val stage: RestoreStage, 5 | val progress: Progress, // percent 6 | val stepNote: String 7 | ) 8 | 9 | enum class RestoreStage(val msg: String) { 10 | //DOWNLOAD_RESTORE_FILE("getting restore file"), 11 | RESTORE_DATABASE("Restore Database"), 12 | RESTORE_PREFS("Restore Pref"), 13 | RESTORE_INVALID("Invalid Restore File"), 14 | FINISH("Restore Finish"), 15 | } 16 | 17 | data class Progress( 18 | val total: Int, 19 | val currentIndex: Int, 20 | ) -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/base/selectlistdialog/SelectItemHolder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.base.selectlistdialog 2 | 3 | import net.xzos.upgradeall.databinding.ItemEnableListBinding 4 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHolder 5 | 6 | class SelectItemHolder(val binding: ItemEnableListBinding) 7 | : RecyclerViewHolder(binding, binding) { 8 | override fun doBind(itemView: SelectItem) { 9 | binding.item = itemView 10 | } 11 | 12 | override fun setHandler(handler: SelectItemHandler) { 13 | binding.handler = handler 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_help.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/table/extra_hub/ExtraHubEntity.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.table.extra_hub 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | 7 | @Entity(tableName = "extra_hub") 8 | data class ExtraHubEntity( 9 | @PrimaryKey val id: String, 10 | @ColumnInfo(name = "enable_global") var global: Boolean = false, 11 | @ColumnInfo(name = "url_replace_search") var urlReplaceSearch: String? = null, 12 | @ColumnInfo(name = "url_replace_string") var urlReplaceString: String? = null, 13 | ) 14 | 15 | internal const val GLOBAL = "GLOBAL" 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_apps.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /.github/workflows/issue-labeler.yml: -------------------------------------------------------------------------------- 1 | name: 'Issue labeler' 2 | 3 | on: 4 | issues: 5 | types: [opened] 6 | 7 | jobs: 8 | triage: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: github/issue-labeler@v3.4 12 | with: 13 | repo-token: '${{ secrets.BOT_TOKEN }}' 14 | configuration-path: .github/labeler.yml 15 | enable-versioned-regex: 0 16 | 17 | - name: Delete workflow runs 18 | uses: Mattraks/delete-workflow-runs@main 19 | with: 20 | token: ${{ secrets.GITHUB_TOKEN }} 21 | repository: ${{ github.repository }} 22 | retain_days: 0 23 | keep_minimum_runs: 2 -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/detail/download/DownloadHolder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.detail.download 2 | 3 | import net.xzos.upgradeall.databinding.ItemDownloadDialogBinding 4 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHolder 5 | 6 | class DownloadHolder(private val binding: ItemDownloadDialogBinding) 7 | : RecyclerViewHolder(binding, binding) { 8 | override fun doBind(itemView: DownloadItem) { 9 | binding.item = itemView 10 | } 11 | 12 | override fun setHandler(handler: DownloadItemHandler) { 13 | binding.handler = handler 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/preference/fragment/PrefFragments.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.preference.fragment 2 | 3 | import android.os.Bundle 4 | import androidx.annotation.XmlRes 5 | import androidx.preference.PreferenceFragmentCompat 6 | import net.xzos.upgradeall.R 7 | 8 | 9 | open class PrefFragment internal constructor(@XmlRes private val preferencesResId: Int) : PreferenceFragmentCompat() { 10 | override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { 11 | setPreferencesFromResource(preferencesResId, rootKey) 12 | } 13 | } 14 | 15 | class InstallationFragment : PrefFragment(R.xml.preferences_installation) 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/app_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /core-websdk/data/src/main/java/net/xzos/upgradeall/websdk/data/json/DownloadInfo.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.websdk.data.json 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty 4 | import com.google.gson.annotations.SerializedName 5 | 6 | data class DownloadItem( 7 | @SerializedName("name") 8 | @JsonProperty("name") 9 | val name: String?, 10 | @SerializedName("url") 11 | @JsonProperty("url") 12 | val url: String, 13 | @SerializedName("headers") 14 | @JsonProperty("headers") 15 | val headers: Map?, 16 | @SerializedName("cookies") 17 | @JsonProperty("cookies") 18 | val cookies: Map?, 19 | ) -------------------------------------------------------------------------------- /core-installer/src/main/java/android/os/IUserManager.java: -------------------------------------------------------------------------------- 1 | package android.os; 2 | 3 | import android.content.pm.UserInfo; 4 | 5 | import java.util.List; 6 | 7 | public interface IUserManager extends IInterface { 8 | 9 | List getUsers(boolean excludeDying) 10 | throws RemoteException; 11 | 12 | List getUsers(boolean excludePartial, boolean excludeDying, boolean excludePreCreated) 13 | throws RemoteException; 14 | 15 | abstract class Stub implements IUserManager { 16 | 17 | public static IUserManager asInterface(IBinder obj) { 18 | throw new UnsupportedOperationException(); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/detail/setting/attrlist/AttrListHolder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.detail.setting.attrlist 2 | 3 | import net.xzos.upgradeall.databinding.ItemAppAttrSettingBinding 4 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHolder 5 | 6 | class AttrListHolder(private val binding: ItemAppAttrSettingBinding) 7 | : RecyclerViewHolder(binding, binding) { 8 | override fun doBind(itemView: AttrListItemView) { 9 | binding.item = itemView 10 | } 11 | 12 | override fun setHandler(handler: AttrListHandler) { 13 | binding.handler = handler 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/hubmanager/HubManagerListViewHolder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.hubmanager 2 | 3 | import net.xzos.upgradeall.databinding.ItemHubBinding 4 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHolder 5 | 6 | class HubManagerListViewHolder(private val binding: ItemHubBinding) 7 | : RecyclerViewHolder(binding, binding) { 8 | 9 | override fun setHandler(handler: HubManagerListItemHandler) { 10 | binding.handler = handler 11 | } 12 | 13 | override fun doBind(itemView: HubManagerListItemView) { 14 | binding.item = itemView 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/rss/RssActivity.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.rss 2 | 3 | import android.view.View 4 | import androidx.appcompat.widget.Toolbar 5 | import net.xzos.upgradeall.databinding.ActivityRssBinding 6 | import net.xzos.upgradeall.ui.base.AppBarActivity 7 | 8 | class RssActivity : AppBarActivity() { 9 | 10 | private lateinit var binding: ActivityRssBinding 11 | 12 | override fun initBinding(): View { 13 | binding = ActivityRssBinding.inflate(layoutInflater) 14 | return binding.root 15 | } 16 | 17 | override fun getAppBar(): Toolbar = binding.appbar.toolbar 18 | 19 | override fun initView() { 20 | 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/simple_textview.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/migration/Migration_13_14.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.migration 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | 7 | val MIGRATION_13_14 = object : Migration(13, 14) { 8 | override fun migrate(database: SupportSQLiteDatabase) { 9 | database.execSQL( 10 | """ 11 | CREATE TABLE extra_app 12 | ( 13 | id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 14 | app_id TEXT NOT NULL, 15 | mark_version_number TEXT DEFAULT null 16 | ); 17 | """ 18 | ) 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/filemanagement/tasker_dialog/list/TaskerItemHolder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.filemanagement.tasker_dialog.list 2 | 3 | import net.xzos.upgradeall.databinding.ItemFileTaskerBinding 4 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHolder 5 | 6 | class TaskerItemHolder(private val binding: ItemFileTaskerBinding) 7 | : RecyclerViewHolder(binding, binding) { 8 | override fun doBind(itemView: TaskerItem) { 9 | binding.fileItem = itemView 10 | } 11 | 12 | override fun setHandler(handler: TaskerItemHandler) { 13 | binding.handler = handler 14 | } 15 | } -------------------------------------------------------------------------------- /core-getter/src/main/rust/api_proxy/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "api_proxy" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | jni = "0.21" # from rustls-platform-verifier-android, sync version 10 | getter = { path = "../getter", features = ["rustls-platform-verifier-android"] } 11 | serde = { version = "1.0", features = ["derive"] } 12 | serde_json = "1.0.145" 13 | tokio = "1.48.0" 14 | 15 | [lib] 16 | crate-type = ["cdylib"] 17 | 18 | [profile.release] 19 | crate-type = ["rlib", "cdylib"] 20 | strip = true 21 | opt-level = 3 22 | lto = true 23 | codegen-units = 1 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_installation.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /core-installer/src/main/java/net/xzos/upgradeall/core/installer/installerapi/shizuku/IntentSenderUtils.java: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.installer.installerapi.shizuku; 2 | 3 | import android.content.IIntentSender; 4 | import android.content.IntentSender; 5 | 6 | import java.lang.reflect.InvocationTargetException; 7 | 8 | public class IntentSenderUtils { 9 | 10 | public static IntentSender newInstance(IIntentSender binder) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { 11 | //noinspection JavaReflectionMemberAccess 12 | return IntentSender.class.getConstructor(IIntentSender.class).newInstance(binder); 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/others/OthersActivity.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.others 2 | 3 | import android.view.View 4 | import androidx.appcompat.widget.Toolbar 5 | import net.xzos.upgradeall.databinding.ActivityOthersBinding 6 | import net.xzos.upgradeall.ui.base.AppBarActivity 7 | 8 | class OthersActivity : AppBarActivity() { 9 | 10 | private lateinit var binding: ActivityOthersBinding 11 | 12 | override fun initBinding(): View { 13 | binding = ActivityOthersBinding.inflate(layoutInflater) 14 | return binding.root 15 | } 16 | 17 | override fun getAppBar(): Toolbar = binding.appbar.toolbar 18 | 19 | override fun initView() { 20 | 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_small.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /core-websdk/src/main/java/net/xzos/upgradeall/core/websdk/base_model/BaseServerApi.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk.base_model 2 | 3 | import net.xzos.upgradeall.websdk.data.json.CloudConfigList 4 | import net.xzos.upgradeall.websdk.data.json.DownloadItem 5 | import net.xzos.upgradeall.websdk.data.json.ReleaseGson 6 | 7 | internal interface BaseServerApi { 8 | suspend fun getCloudConfig(host: String): CloudConfigList? 9 | 10 | fun getAppRelease(data: E, callback: (List?) -> Unit) 11 | 12 | fun getAppReleaseList(data: E, callback: (List?) -> Unit) 13 | 14 | 15 | suspend fun getDownloadInfo(data: E, assetIndex: Pair): List 16 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/utils/AppUtils.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.utils 2 | 3 | import android.content.pm.PackageManager 4 | import android.text.TextUtils 5 | import net.xzos.upgradeall.application.MyApplication 6 | 7 | object AppUtils { 8 | fun isAppInstalled(pkgName: String): Boolean { 9 | return if (TextUtils.isEmpty(pkgName)) { 10 | false 11 | } else { 12 | val pm: PackageManager = MyApplication.context.packageManager 13 | try { 14 | pm.getApplicationInfo(pkgName, 0).enabled 15 | } catch (e: PackageManager.NameNotFoundException) { 16 | false 17 | } 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cloud_list.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/base/update/UpdateAppHubListViewHolder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.base.update 2 | 3 | import net.xzos.upgradeall.databinding.ItemHubAppUpdateBinding 4 | import net.xzos.upgradeall.ui.applist.base.AppHubListViewHolder 5 | 6 | class UpdateAppHubListViewHolder(private val binding: ItemHubAppUpdateBinding, private val handler: UpdateAppHubListItemHandler) 7 | : AppHubListViewHolder(binding.mainInfo, binding) { 8 | 9 | override fun doBind(itemView: UpdateAppListItemView) { 10 | super.doBind(itemView) 11 | binding.item = itemView 12 | binding.handler = handler 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/log/LogPageViewModel.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.log 2 | 3 | import androidx.lifecycle.MutableLiveData 4 | import androidx.lifecycle.ViewModel 5 | import androidx.lifecycle.map 6 | import net.xzos.upgradeall.core.utils.log.LogDataProxy 7 | import net.xzos.upgradeall.core.utils.log.ObjectTag 8 | 9 | class LogPageViewModel : ViewModel() { 10 | 11 | private val mLogObjectTag = MutableLiveData() 12 | internal val logList = mLogObjectTag.map { objectTag -> 13 | LogDataProxy.getLogMessageList(objectTag) 14 | } 15 | 16 | internal fun setLogObjectTag(logObjectTag: ObjectTag) { 17 | mLogObjectTag.value = logObjectTag 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_done.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /core-websdk/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | ##---------------Begin: proguard configuration for GPlay API ---------- 2 | -keep public class com.aurora.gplayapi.** { *; } 3 | ##---------------End: proguard configuration for GPlay API ---------- 4 | 5 | ##---------------Begin: proguard configuration for dom4j ---------- 6 | -keep class org.dom4j.** { *; } 7 | -keep interface org.dom4j.** { *; } 8 | -keep class javax.xml.** { *; } 9 | -keep class org.w3c.** { *; } 10 | -keep class org.xml.** { *; } 11 | -keep class org.xmlpull.** { *; } 12 | -keep class org.jaxen.** { *; } 13 | # GPlay Internal Exceptions 14 | -keep class com.aurora.gplayapi.exceptions.** { *; } 15 | ##---------------End: proguard configuration for dom4j ---------- 16 | -------------------------------------------------------------------------------- /core-websdk/data/src/main/java/net/xzos/upgradeall/websdk/data/json/CloudConfigList.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.websdk.data.json 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty 4 | import com.google.gson.annotations.SerializedName 5 | 6 | /** 7 | * app_list: [] 8 | * hub_list: [] 9 | */ 10 | data class CloudConfigList( 11 | @SerializedName("app_config_list") 12 | @JsonProperty("app_config_list") 13 | val appList: List = listOf(), 14 | @SerializedName("hub_config_list") 15 | @JsonProperty("hub_config_list") 16 | val hubList: List = listOf() 17 | ) 18 | 19 | fun CloudConfigList.isEmpty() = appList.isEmpty() && hubList.isEmpty() -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/detail/download/DownloadListAdapter.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.detail.download 2 | 3 | import net.xzos.upgradeall.databinding.ItemDownloadDialogBinding 4 | import net.xzos.upgradeall.ui.base.listdialog.DialogListAdapter 5 | import net.xzos.upgradeall.ui.detail.AppDetailViewModel 6 | 7 | class DownloadListAdapter(dataList: List, appDetailViewModel: AppDetailViewModel) : 8 | DialogListAdapter( 9 | dataList.toMutableList(), DownloadItemHandler(appDetailViewModel), 10 | fun(layoutInflater, viewGroup) = 11 | DownloadHolder(ItemDownloadDialogBinding.inflate(layoutInflater, viewGroup, false)) 12 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_rss.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/migration/Migration_15_16.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.migration 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | 7 | val MIGRATION_15_16 = object : Migration(15, 16) { 8 | override fun migrate(database: SupportSQLiteDatabase) { 9 | database.execSQL( 10 | """ 11 | CREATE TABLE extra_hub 12 | ( 13 | id TEXT PRIMARY KEY NOT NULL, 14 | enable_global INTEGER NOT NULL, 15 | url_replace_search TEXT DEFAULT null, 16 | url_replace_string TEXT DEFAULT null 17 | ); 18 | """ 19 | ) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/wrapper/core/VersionUtils.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.wrapper.core 2 | 3 | import kotlinx.coroutines.Dispatchers 4 | import kotlinx.coroutines.runBlocking 5 | import net.xzos.upgradeall.core.module.app.App 6 | import net.xzos.upgradeall.core.module.app.version.Version 7 | import net.xzos.upgradeall.core.module.app.version.VersionEntityUtils 8 | import net.xzos.upgradeall.core.module.app.version.VersionInfo 9 | 10 | fun VersionInfo.switchIgnoreStatus(app: App) = runBlocking(Dispatchers.Default) { 11 | VersionEntityUtils(app).switchIgnoreStatus(name) 12 | } 13 | 14 | fun VersionInfo.isIgnored(app: App) = runBlocking(Dispatchers.Default) { 15 | VersionEntityUtils(app).isIgnored(name) 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/base/AppHubListViewHolder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.base 2 | 3 | import androidx.databinding.ViewDataBinding 4 | import net.xzos.upgradeall.databinding.ItemHubAppBinding 5 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHolder 6 | 7 | abstract class AppHubListViewHolder(listBinding: ItemHubAppBinding, binding: ViewDataBinding) 8 | : RecyclerViewHolder(listBinding, binding) { 9 | 10 | override fun doBind(itemView: L) { 11 | listBinding.appItem = itemView 12 | } 13 | 14 | override fun setHandler(handler: H) { 15 | listBinding.handler = handler 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_outline_cloud.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /core-websdk/src/main/java/net/xzos/upgradeall/core/websdk/api/web/http/DnsApi.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk.api.web.http 2 | 3 | import java.net.InetAddress 4 | import java.net.URI 5 | 6 | class DnsApi { 7 | companion object { 8 | fun resolve(host: String): String? { 9 | val url = getURL(host) 10 | val address = InetAddress.getByName(url.host) 11 | return host.replace(url.host, address.hostAddress ?: return null, ignoreCase = true) 12 | } 13 | 14 | private fun getURL(rawUrl: String): URI { 15 | val url = if ("://" !in rawUrl) 16 | "null://$rawUrl" 17 | else rawUrl 18 | return URI(url) 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/discover/DiscoverActivity.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.discover 2 | 3 | import androidx.activity.viewModels 4 | import net.xzos.upgradeall.ui.base.list.HubListActivity 5 | import net.xzos.upgradeall.websdk.data.json.AppConfigGson 6 | 7 | 8 | class DiscoverActivity : 9 | HubListActivity({ it.info.name }) { 10 | 11 | override val viewModel by viewModels() 12 | override val adapter by lazy { 13 | DiscoveryAdapter( 14 | DiscoverListItemHandler( 15 | viewModel, 16 | supportFragmentManager 17 | ) 18 | ).apply { setHasStableIds(true) } 19 | } 20 | } -------------------------------------------------------------------------------- /core-websdk/src/main/java/net/xzos/upgradeall/core/websdk/api/web/proxy/OkhttpCancelProxy.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk.api.web.proxy 2 | 3 | import net.xzos.upgradeall.core.utils.coroutines.coroutinesMutableMapOf 4 | import net.xzos.upgradeall.core.websdk.api.web.http.HttpRequestData 5 | import okhttp3.Call 6 | 7 | open class OkhttpCancelProxy { 8 | private val callMap = coroutinesMutableMapOf() 9 | 10 | fun register(data: HttpRequestData, call: Call) { 11 | callMap[data] = call 12 | } 13 | 14 | fun unregister(data: HttpRequestData) { 15 | callMap.remove(data) 16 | } 17 | 18 | fun cancelCall(data: HttpRequestData) { 19 | callMap.remove(data)?.cancel() 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/filemanagement/tasker_dialog/list/TaskerItem.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.filemanagement.tasker_dialog.list 2 | 3 | import net.xzos.upgradeall.core.downloader.filedownloader.item.TaskWrapper 4 | import net.xzos.upgradeall.core.downloader.filedownloader.item.progress 5 | import net.xzos.upgradeall.ui.base.list.ListItemView 6 | 7 | class TaskerItem( 8 | val name: String, 9 | val path: String, 10 | var progress: Int, 11 | ) : ListItemView 12 | 13 | fun TaskWrapper.getTaskerItem(): TaskerItem { 14 | return TaskerItem(file.name, file.path, snap.progress().toInt()).also { item -> 15 | this@getTaskerItem.observe { 16 | item.progress = it.progress().toInt() 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_needupdate.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /core-installer/src/main/java/android/content/pm/IPackageManager.java: -------------------------------------------------------------------------------- 1 | package android.content.pm; 2 | 3 | import android.os.Binder; 4 | import android.os.IBinder; 5 | import android.os.IInterface; 6 | import android.os.RemoteException; 7 | 8 | public interface IPackageManager extends IInterface { 9 | 10 | IPackageInstaller getPackageInstaller() 11 | throws RemoteException; 12 | 13 | ParceledListSlice getInstalledPackages(int flags, int userId) 14 | throws RemoteException; 15 | 16 | abstract class Stub extends Binder implements IPackageManager { 17 | 18 | public static IPackageManager asInterface(IBinder obj) { 19 | throw new UnsupportedOperationException(); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /.github/workflows/issue-closed-labeler.yml: -------------------------------------------------------------------------------- 1 | name: 'Closed issue labeler' 2 | 3 | on: 4 | issues: 5 | types: [closed] 6 | 7 | jobs: 8 | triage: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions-ecosystem/action-add-labels@v1 12 | if: ${{ contains(github.event.issue.labels.*.name, 'bug') || contains(github.event.issue.labels.*.name, 'enhancement') }} 13 | with: 14 | github_token: ${{ secrets.BOT_TOKEN }} 15 | labels: Solved 16 | 17 | - name: Delete workflow runs 18 | uses: Mattraks/delete-workflow-runs@main 19 | with: 20 | token: ${{ secrets.GITHUB_TOKEN }} 21 | repository: ${{ github.repository }} 22 | retain_days: 0 23 | keep_minimum_runs: 2 -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_drag_indicator.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit_small.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/filemanagement/FileHubViewModel.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.filemanagement 2 | 3 | import android.app.Application 4 | import net.xzos.upgradeall.ui.base.recycleview.ListContainerViewModel 5 | import net.xzos.upgradeall.wrapper.download.DownloadTaskerManager 6 | import net.xzos.upgradeall.wrapper.download.defName 7 | 8 | 9 | class FileHubViewModel(application: Application) : 10 | ListContainerViewModel(application) { 11 | 12 | override suspend fun doLoadData(): List { 13 | return DownloadTaskerManager.getFileTaskerList().map { 14 | FileItemView(it.defName(), it).apply { 15 | renewAppIcon(null, getApplication()) 16 | } 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/wrapper/download/Init.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.wrapper.download 2 | 3 | import android.content.Context 4 | import net.xzos.upgradeall.core.module.app.App 5 | import net.xzos.upgradeall.core.module.app.version.AssetWrapper 6 | import net.xzos.upgradeall.server.downloader.DownloadNotification 7 | 8 | suspend fun startDownload( 9 | context: Context, externalDownload: Boolean, 10 | app: App, wrapper: AssetWrapper 11 | ): DownloadTasker { 12 | val downloadTasker = DownloadTasker(app, wrapper) 13 | // register 14 | DownloadNotification(downloadTasker) 15 | DownloadTaskerManager.register(downloadTasker) 16 | //start 17 | downloadTasker.start(context, externalDownload) 18 | return downloadTasker 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/base/recycleview/RecyclerViewHolder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.base.recycleview 2 | 3 | import androidx.databinding.ViewDataBinding 4 | import androidx.recyclerview.widget.RecyclerView 5 | import net.xzos.upgradeall.ui.base.list.ListItemView 6 | 7 | abstract class RecyclerViewHolder(protected val listBinding: VB, binding: ViewDataBinding) 8 | : RecyclerView.ViewHolder(binding.root) { 9 | 10 | fun bind(itemView: L) { 11 | doBind(itemView) 12 | listBinding.executePendingBindings() 13 | } 14 | 15 | abstract fun doBind(itemView: L) 16 | 17 | abstract fun setHandler(handler: H) 18 | 19 | open suspend fun loadExtraUi(itemView: L) {} 20 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/settings_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 10 | 11 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_actionbar_log.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | 18 | 19 | -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/log/LogUtilProxy.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils.log 2 | 3 | class LogUtilProxy(private val objectTag: ObjectTag, private val tag: String) { 4 | 5 | fun v(msg: String) { 6 | Log.v(objectTag, tag, msg) 7 | } 8 | 9 | fun d(msg: String) { 10 | Log.d(objectTag, tag, msg) 11 | } 12 | 13 | fun i(msg: String) { 14 | Log.i(objectTag, tag, msg) 15 | } 16 | 17 | fun w(msg: String) { 18 | Log.w(objectTag, tag, msg) 19 | } 20 | 21 | fun e(msg: String) { 22 | Log.e(objectTag, tag, msg) 23 | } 24 | 25 | companion object { 26 | const val JS_TAG = "JavaScriptRunning" 27 | val objectTag = ObjectTag("DeBug", JS_TAG) // 测试环境标签 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/module/app/version/Version.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.module.app.version 2 | 3 | import net.xzos.upgradeall.core.module.Hub 4 | import net.xzos.upgradeall.websdk.data.json.AssetGson 5 | import net.xzos.upgradeall.websdk.data.json.ReleaseGson 6 | 7 | /** 8 | * 版本号数据的快照 9 | */ 10 | data class Version( 11 | val versionInfo: VersionInfo, 12 | val versionList: List, 13 | ) { 14 | fun getAssetList() = versionList.flatMap { it.assetList } 15 | } 16 | 17 | data class VersionWrapper( 18 | val hub: Hub, 19 | val release: ReleaseGson, 20 | val assetList: List, 21 | ) 22 | 23 | data class AssetWrapper( 24 | val hub: Hub, 25 | val assetIndex: List, 26 | val asset: AssetGson, 27 | ) 28 | -------------------------------------------------------------------------------- /app/src/androidTest/java/net/xzos/upgradeall/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall 2 | 3 | import androidx.test.InstrumentationRegistry 4 | import androidx.test.runner.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * @see [Testing documentation](http://d.android.com/tools/testing) 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getTargetContext() 22 | 23 | assertEquals("net.xzos.upgraderall", appContext.packageName) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_loading.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/xml/preferences_language.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/hubmanager/HubManagerAdapter.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.hubmanager 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import net.xzos.upgradeall.databinding.ItemHubBinding 6 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewAdapter 7 | 8 | class HubManagerAdapter( 9 | override val handler: HubManagerListItemHandler 10 | ) : RecyclerViewAdapter() { 11 | 12 | 13 | override fun getViewHolder(layoutInflater: LayoutInflater, viewGroup: ViewGroup): HubManagerListViewHolder { 14 | val binding = ItemHubBinding.inflate(layoutInflater, viewGroup, false) 15 | return HubManagerListViewHolder(binding) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_log.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | 17 | -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/JSONObject.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils 2 | 3 | import org.json.JSONArray 4 | import org.json.JSONObject 5 | 6 | fun JSONObject.getOrNull(key: String): String? { 7 | return getOrNull(key, this::getString) 8 | } 9 | 10 | fun JSONObject.getOrNull(key: String, getFun: (String) -> T): T? { 11 | return if (this.has(key)) 12 | with(getFun(key)) { 13 | if (this != "null") 14 | this 15 | else null 16 | } else null 17 | } 18 | 19 | operator fun JSONArray.iterator(): Iterator = 20 | (0 until length()).asSequence().map { 21 | @Suppress("UNCHECKED_CAST") 22 | get(it) as T 23 | }.iterator() 24 | 25 | fun JSONArray.asSequence(): Sequence = this.iterator().asSequence() -------------------------------------------------------------------------------- /app/src/main/res/values-cs/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | App Hub 4 | Hvězda 5 | Upravit 6 | Obnova 7 | Aktualizace 8 | Jméno 9 | Pomoc 10 | Základní Info 11 | Vymazat 12 | App 13 | Záloha 14 | Nastavení Kontroly Verze 15 | Frekvence Synch. Na Pozadí (h) 16 | Magisk Moduly 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_download.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_local_hub_list.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /core/src/androidTest/java/net/xzos/upgradeall/core/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("net.xzos.upgradeall.core.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /core-websdk/src/main/java/net/xzos/upgradeall/core/websdk/api/web/proxy/OkhttpProxy.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk.api.web.proxy 2 | 3 | import net.xzos.upgradeall.core.websdk.api.web.HttpError 4 | import net.xzos.upgradeall.core.websdk.api.web.http.HttpRequestData 5 | import net.xzos.upgradeall.core.websdk.api.web.http.HttpResponse 6 | 7 | open class OkhttpProxy : OkhttpProxyCallNoErrorApi() { 8 | fun okhttpExecute( 9 | requestData: HttpRequestData, retryNum: Int = 3 10 | ) = okhttpExecuteNoError(requestData, retryNum) 11 | 12 | fun okhttpAsync( 13 | requestData: HttpRequestData, 14 | callback: (HttpResponse?) -> Unit, 15 | errorCallback: (HttpError) -> Unit = { callback(null) }, 16 | retryNum: Int = 3 17 | ) = okhttpAsyncNoError(requestData, callback, errorCallback, retryNum) 18 | } -------------------------------------------------------------------------------- /core/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app-backup/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_local.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_plus.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /core-getter/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /core-shell/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /core-shell/src/main/java/net/xzos/upgradeall/core/shell/CoreShell.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.shell 2 | 3 | 4 | object CoreShell { 5 | 6 | fun runShellCommand(commands: String): ShellResult { 7 | return try { 8 | Shell().run("sh", commands) 9 | } catch (e: Throwable) { 10 | ShellResult() 11 | } 12 | } 13 | 14 | fun runSuShellCommand(commands: String): ShellResult { 15 | return try { 16 | Shell().run("su", commands) 17 | } catch (e: Throwable) { 18 | ShellResult() 19 | } 20 | } 21 | } 22 | 23 | /** 24 | * 本用于简化 Shell 操作 25 | * 后切换 Shell 库后为已有的功能 26 | * 目前用作调用统计 27 | */ 28 | fun ShellResult.getOutputString(): String { 29 | return stdout() 30 | } 31 | 32 | fun ShellResult.getErrorsString(): String { 33 | return stderr() 34 | } -------------------------------------------------------------------------------- /core-utils/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /core-websdk/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /core-android-utils/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /core-downloader/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /core-getter/src/androidTest/java/net/xzos/upgradeall/getter/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.getter 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("net.xzos.upgradeall.getter.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /core-installer/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_mark.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /core-getter/provider/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app-backup/src/androidTest/java/net/xzos/upgradeall/app/backup/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.app.backup 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("net.xzos.upgradeall.app.backup.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_hub_gitlab.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /core-shell/src/androidTest/java/net/xzos/upgradeall/core/shell/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.shell 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("net.xzos.upgradeall.core.shell.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /core-utils/src/androidTest/java/net/xzos/upgradeall/core/utils/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("net.xzos.upgradeall.core.utils.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_about.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /core-websdk/src/androidTest/java/net/xzos/upgradeall/core/websdk/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("net.xzos.upgradeall.core.web_sdk.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /core-installer/src/androidTest/java/net/xzos/upgradeall/core/installer/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.installer 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("net.xzos.upgradeall.core.installer.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /core-downloader/src/androidTest/java/net/xzos/upgradeall/core/downloader/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.downloader 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("net.xzos.upgradeall.core.downlaoder.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /core-getter/provider/src/androidTest/java/net/xzos/upgradeall/getter/provider/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.getter.provider 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("net.xzos.upgradeall.getter.provider.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/list_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /core-android-utils/src/androidTest/java/net/xzos/upgradeall/core/androidutils/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.androidutils 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("net.xzos.upgradeall.core.androidutils.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/discover/DiscoverListItemHandler.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.discover 2 | 3 | import android.view.View 4 | import androidx.fragment.app.FragmentManager 5 | import net.xzos.upgradeall.core.androidutils.ToastUtil 6 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHandler 7 | 8 | class DiscoverListItemHandler( 9 | private val viewModel: DiscoverViewModel, 10 | private val supportFragmentManager: FragmentManager, 11 | ) : RecyclerViewHandler() { 12 | fun onClickDiscover(view: View, uuid: String) { 13 | try { 14 | ConfigDownloadDialog(uuid) { 15 | viewModel.loadData() 16 | }.show(supportFragmentManager) 17 | } catch (e: IllegalStateException) { 18 | ToastUtil.showText(view.context, e.message.toString()) 19 | viewModel.loadData() 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/filemanagement/tasker_dialog/TaskerDialogItem.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.filemanagement.tasker_dialog 2 | 3 | import android.content.Context 4 | import net.xzos.upgradeall.core.installer.FileType 5 | import net.xzos.upgradeall.ui.base.list.ListItemView 6 | import net.xzos.upgradeall.ui.filemanagement.DownloadTaskerNumUtil 7 | import net.xzos.upgradeall.wrapper.download.DownloadTasker 8 | 9 | class TaskerDialogItem(val fileTasker: DownloadTasker) : ListItemView { 10 | private val numUtil = DownloadTaskerNumUtil(fileTasker.downloader) 11 | val suspendable: Boolean = numUtil.getDownloadingNum() > 0 12 | val continuable: Boolean = numUtil.getPauseNum() > 0 13 | val retryable: Boolean = numUtil.getFailedNum() > 0 14 | var fileType: FileType? = null 15 | 16 | fun init(context: Context) { 17 | fileType = fileTasker.fileType 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/filemanagement/tasker_dialog/list/TaskerListAdapter.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.filemanagement.tasker_dialog.list 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import net.xzos.upgradeall.core.downloader.filedownloader.item.TaskWrapper 6 | import net.xzos.upgradeall.databinding.ItemFileTaskerBinding 7 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewAdapter 8 | 9 | class TaskerListAdapter : 10 | RecyclerViewAdapter({ it.getTaskerItem() }) { 11 | override val handler = TaskerItemHandler() 12 | 13 | override fun getViewHolder( 14 | layoutInflater: LayoutInflater, 15 | viewGroup: ViewGroup 16 | ): TaskerItemHolder { 17 | return TaskerItemHolder(ItemFileTaskerBinding.inflate(layoutInflater, viewGroup, false)) 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/base/listdialog/ListDialogPart.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.base.listdialog 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import net.xzos.upgradeall.databinding.RecyclerlistContentBinding 5 | 6 | interface ListDialogPart { 7 | val sAdapter: DialogListAdapter<*, *, *> 8 | 9 | fun initListView(contentBinding: RecyclerlistContentBinding) { 10 | contentBinding.apply { 11 | rvList.adapter = sAdapter 12 | rvList.overScrollMode = RecyclerView.OVER_SCROLL_NEVER 13 | } 14 | } 15 | 16 | fun renewListView(contentBinding: RecyclerlistContentBinding) { 17 | contentBinding.apply { 18 | if (sAdapter.itemCount > 0) { 19 | vfContainer.displayedChild = 0 20 | } else { 21 | vfContainer.displayedChild = 1 22 | } 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/detail/download/DownloadItemHandler.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.detail.download 2 | 3 | import kotlinx.coroutines.GlobalScope 4 | import kotlinx.coroutines.launch 5 | import net.xzos.upgradeall.core.module.app.version.AssetWrapper 6 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHandler 7 | import net.xzos.upgradeall.ui.detail.AppDetailViewModel 8 | 9 | class DownloadItemHandler(private val appDetailViewModel: AppDetailViewModel) : 10 | RecyclerViewHandler() { 11 | fun clickDownload(fileAsset: AssetWrapper) { 12 | GlobalScope.launch { 13 | appDetailViewModel.download(fileAsset, false) 14 | } 15 | } 16 | 17 | fun longClickDownload(fileAsset: AssetWrapper): Boolean { 18 | GlobalScope.launch { 19 | appDetailViewModel.download(fileAsset, true) 20 | } 21 | return true 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/hubmanager/HubManagerViewModel.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.hubmanager 2 | 3 | import android.app.Application 4 | import net.xzos.upgradeall.core.manager.CloudConfigGetter 5 | import net.xzos.upgradeall.core.manager.HubManager 6 | import net.xzos.upgradeall.ui.base.recycleview.ListContainerViewModel 7 | import net.xzos.upgradeall.ui.hubmanager.HubManagerListItemView.Companion.getCloudHubItemCardView 8 | 9 | class HubManagerViewModel(application: Application) : ListContainerViewModel(application) { 10 | 11 | override suspend fun doLoadData(): List { 12 | CloudConfigGetter.renew() 13 | val hubConfigList = CloudConfigGetter.hubConfigList 14 | ?: HubManager.getHubList().map { it.hubConfig } 15 | return hubConfigList.map { getCloudHubItemCardView(it, getApplication()) } 16 | } 17 | } -------------------------------------------------------------------------------- /core-android-utils/src/main/java/net/xzos/upgradeall/core/androidutils/FlagDelegate.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.androidutils 2 | 3 | import android.app.PendingIntent 4 | import android.os.Build 5 | 6 | object FlagDelegate { 7 | @Deprecated("Use Int.withImmutableFlag() extension function instead", ReplaceWith("this.withImmutableFlag()")) 8 | val PENDING_INTENT_FLAG_IMMUTABLE = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 9 | PendingIntent.FLAG_IMMUTABLE 10 | } else { 11 | 0 12 | } 13 | } 14 | 15 | /** 16 | * Adds PendingIntent.FLAG_IMMUTABLE to the flags if API level >= 23 17 | * This is a Kotlin-native way to avoid Java version compatibility issues 18 | */ 19 | fun Int.withImmutableFlag(): Int { 20 | return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 21 | this or PendingIntent.FLAG_IMMUTABLE 22 | } else { 23 | this 24 | } 25 | } -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/database/table/extra_hub/utils/URLReplace.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.database.table.extra_hub.utils 2 | 3 | import net.xzos.upgradeall.core.database.table.extra_hub.ExtraHubEntity 4 | import net.xzos.upgradeall.core.utils.URLReplaceData 5 | 6 | fun ExtraHubEntity?.toURLReplace() = 7 | this?.let { if (it.global) null else URLReplaceData(it.urlReplaceSearch, it.urlReplaceString) } 8 | ?: URLReplaceData(null, null) 9 | 10 | fun setExtraHubEntity( 11 | extraHubEntity: ExtraHubEntity, 12 | enableGlobal: Boolean, 13 | urlReplaceData: URLReplaceData 14 | ) = 15 | extraHubEntity.apply { 16 | global = enableGlobal 17 | urlReplaceSearch = urlReplaceData.search?.clean() 18 | urlReplaceString = urlReplaceData.replace?.clean() 19 | } 20 | 21 | fun String.clean(): String? = if (this.isBlank()) 22 | null 23 | else this 24 | -------------------------------------------------------------------------------- /core/src/main/java/net/xzos/upgradeall/core/utils/AppBuilder.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils 2 | 3 | import android.content.Context 4 | import net.xzos.upgradeall.core.androidutils.app_info.AppInfo 5 | import net.xzos.upgradeall.core.androidutils.app_info.getAndroidAppInfoList 6 | import net.xzos.upgradeall.core.androidutils.app_info.getAndroidModuleInfoList 7 | import net.xzos.upgradeall.core.database.table.AppEntity 8 | import net.xzos.upgradeall.core.manager.HubManager 9 | 10 | fun getInstalledAppList(context: Context, ignoreSystemApp:Boolean): List { 11 | return if (HubManager.isEnableApplicationsMode()) { 12 | val appInfoLIst = getAndroidAppInfoList(context, ignoreSystemApp) + getAndroidModuleInfoList() 13 | return appInfoLIst.map { it.toAppEntity() } 14 | } else emptyList() 15 | } 16 | 17 | fun AppInfo.toAppEntity(): AppEntity { 18 | return AppEntity(name, idMap) 19 | } -------------------------------------------------------------------------------- /app-backup/src/main/java/net/xzos/upgradeall/app/backup/utils/FileUtils.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.app.backup.utils 2 | 3 | import net.xzos.upgradeall.core.database.MetaDatabase 4 | import net.xzos.upgradeall.core.database.getDatabase 5 | import java.io.File 6 | 7 | private val rootDataDir = androidContext.filesDir.parentFile 8 | val tmpDBFile = File(rootDataDir, "databases/app_metadata_database.db.bak") 9 | 10 | val dbFile = File(rootDataDir, "databases/app_metadata_database.db") 11 | val prefsFile = File(rootDataDir, "shared_prefs/${androidContext.packageName}_preferences.xml") 12 | 13 | fun getBackupMetaDatabase(dbFileBytes: ByteArray): MetaDatabase { 14 | tmpDBFile.writeBytes(dbFileBytes) 15 | return getDatabase(androidContext, MetaDatabase::class.java, tmpDBFile.name) 16 | } 17 | 18 | private fun deleteTmpDB() { 19 | tmpDBFile.delete() 20 | } 21 | 22 | fun delBackupTmp() { 23 | deleteTmpDB() 24 | } -------------------------------------------------------------------------------- /core-shell/src/main/java/net/xzos/upgradeall/core/shell/ShellUtils.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.shell 2 | 3 | fun getFileNameList(folderPath: String): List { 4 | val folderPathString = folderPath.apply { 5 | val separator = '/' 6 | if (this.last() != separator) 7 | this.plus(separator) 8 | } 9 | val command = """ for entry in "${'$'}search_dir"${folderPathString}* 10 | do 11 | echo "${'$'}entry" 12 | done """.trimIndent() 13 | 14 | val result = CoreShell.runSuShellCommand(command) 15 | return result.getOutputString() 16 | .split("\n".toRegex()) 17 | .dropLastWhile { it.isEmpty() } 18 | .map { it.removePrefix(folderPathString) } 19 | } 20 | 21 | fun getFileText(filePath: String): String { 22 | val command = "cat $filePath" 23 | return CoreShell.runSuShellCommand(command).getOutputString() 24 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/base/list/HubListFragment.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.base.list 2 | 3 | import androidx.fragment.app.Fragment 4 | import androidx.recyclerview.widget.RecyclerView 5 | import androidx.swiperefreshlayout.widget.SwipeRefreshLayout 6 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewHolder 7 | 8 | abstract class HubListFragment> : 9 | HubListPart, Fragment() { 10 | override lateinit var rvList: RecyclerView 11 | override var srlContainer: SwipeRefreshLayout? = null 12 | 13 | override fun onResume() { 14 | super.onResume() 15 | refreshList() 16 | } 17 | 18 | fun initView(rvList: RecyclerView, srlContainer: SwipeRefreshLayout? = null) { 19 | this.rvList = rvList 20 | this.srlContainer = srlContainer 21 | initViewData(viewLifecycleOwner) 22 | } 23 | } -------------------------------------------------------------------------------- /core-getter/src/main/java/net/xzos/upgradeall/getter/NativeLib.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.getter 2 | 3 | import android.content.Context 4 | 5 | class RunServerCallback(private val _callback: (String) -> Unit) { 6 | fun callback(url: String) { 7 | _callback(url) 8 | } 9 | } 10 | 11 | class NativeLib { 12 | 13 | /** 14 | * A native method that is implemented by the 'getter' native library, 15 | * which is packaged with this application. 16 | */ 17 | external fun runServer(context:Context, callback: RunServerCallback): String 18 | fun runServerLambda(context: Context, callback: (String) -> Unit): String { 19 | return runServer(context, RunServerCallback(callback)) 20 | } 21 | 22 | companion object { 23 | // Used to load the 'getter' library on application startup. 24 | init { 25 | System.loadLibrary("api_proxy") 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/filemanagement/FileHubListAdapter.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.filemanagement 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.appcompat.app.AppCompatActivity 6 | import net.xzos.upgradeall.databinding.ItemHubFileTaskerBinding 7 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewAdapter 8 | 9 | class FileHubListAdapter(activity: AppCompatActivity) : 10 | RecyclerViewAdapter() { 11 | 12 | override val handler = FileHubListItemHandler(activity) 13 | 14 | override fun getViewHolder( 15 | layoutInflater: LayoutInflater, 16 | viewGroup: ViewGroup 17 | ): FileHubListViewHolder { 18 | val binding = ItemHubFileTaskerBinding.inflate(layoutInflater, viewGroup, false) 19 | return FileHubListViewHolder(binding) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/base/AppBarActivity.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.base 2 | 3 | import android.os.Bundle 4 | import android.view.MenuItem 5 | import android.view.View 6 | import androidx.appcompat.widget.Toolbar 7 | 8 | abstract class AppBarActivity : BaseActivity() { 9 | 10 | abstract fun initBinding(): View 11 | abstract fun getAppBar(): Toolbar 12 | abstract fun initView() 13 | 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | setContentView(initBinding()) 17 | setSupportActionBar(getAppBar()) 18 | supportActionBar?.setDisplayHomeAsUpEnabled(true) 19 | initView() 20 | } 21 | 22 | override fun onOptionsItemSelected(item: MenuItem): Boolean { 23 | if (item.itemId == android.R.id.home) { 24 | finish() 25 | } 26 | return super.onOptionsItemSelected(item) 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/preference/fragment/LanguageFragment.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.preference.fragment 2 | 3 | import android.content.SharedPreferences 4 | import net.xzos.upgradeall.R 5 | import net.xzos.upgradeall.core.androidutils.ToastUtil 6 | 7 | 8 | class LanguageFragment : PrefFragment(R.xml.preferences_language), 9 | SharedPreferences.OnSharedPreferenceChangeListener { 10 | override fun onResume() { 11 | super.onResume() 12 | preferenceScreen.sharedPreferences!!.registerOnSharedPreferenceChangeListener(this) 13 | } 14 | 15 | override fun onPause() { 16 | super.onPause() 17 | preferenceScreen.sharedPreferences!!.unregisterOnSharedPreferenceChangeListener(this) 18 | } 19 | 20 | override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { 21 | ToastUtil.showText(requireContext(), R.string.plz_restart) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_version_cloud.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /core-websdk/src/main/java/net/xzos/upgradeall/core/websdk/api/BaseApi.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk.api 2 | 3 | import net.xzos.upgradeall.core.websdk.base_model.AppData 4 | import net.xzos.upgradeall.core.websdk.base_model.MultiRequestData 5 | import net.xzos.upgradeall.core.websdk.base_model.SingleRequestData 6 | import net.xzos.upgradeall.websdk.data.json.CloudConfigList 7 | import net.xzos.upgradeall.websdk.data.json.DownloadItem 8 | import net.xzos.upgradeall.websdk.data.json.ReleaseGson 9 | 10 | interface BaseApi { 11 | fun getCloudConfig(url: String): CloudConfigList? 12 | 13 | fun checkAppAvailable(data: SingleRequestData): Boolean? 14 | 15 | fun getAppUpdate(data: MultiRequestData): Map? 16 | 17 | fun getAppReleaseList(data: SingleRequestData): List? 18 | 19 | fun getDownloadInfo( 20 | data: SingleRequestData, assetIndex: Pair 21 | ): List? 22 | } -------------------------------------------------------------------------------- /core-installer/src/main/java/net/xzos/upgradeall/core/installer/installerapi/shizuku/IIntentSenderAdaptor.java: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.installer.installerapi.shizuku; 2 | 3 | import android.content.IIntentReceiver; 4 | import android.content.IIntentSender; 5 | import android.content.Intent; 6 | import android.os.Bundle; 7 | import android.os.IBinder; 8 | 9 | public abstract class IIntentSenderAdaptor extends IIntentSender.Stub { 10 | 11 | public abstract void send(Intent intent); 12 | 13 | @Override 14 | public int send(int code, Intent intent, String resolvedType, IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) { 15 | send(intent); 16 | return 0; 17 | } 18 | 19 | @Override 20 | public void send(int code, Intent intent, String resolvedType, IBinder whitelistToken, IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) { 21 | send(intent); 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/utils/LocaleUtils.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.utils 2 | 3 | import android.content.Context 4 | import android.content.ContextWrapper 5 | import android.content.res.Configuration 6 | import android.os.Build 7 | import java.util.* 8 | 9 | fun wrapContextWrapper(context: Context, locale: Locale): ContextWrapper { 10 | val config = context.resources.configuration 11 | Locale.setDefault(locale) 12 | setSystemLocale(config, locale) 13 | val newContext = context.createConfigurationContext(config) 14 | return ContextWrapper(newContext) 15 | } 16 | 17 | fun getSystemLocale(config: Configuration): Locale { 18 | return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 19 | config.locales.get(0) 20 | } else { 21 | @Suppress("DEPRECATION") 22 | config.locale 23 | } 24 | } 25 | 26 | fun setSystemLocale(config: Configuration, locale: Locale?) { 27 | config.setLocale(locale) 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/base/applications/ApplicationsAppHubListItemView.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.base.applications 2 | 3 | import android.content.Context 4 | import net.xzos.upgradeall.core.module.AppStatus 5 | import net.xzos.upgradeall.core.module.app.App 6 | import net.xzos.upgradeall.ui.applist.base.normal.NormalAppListItemView 7 | 8 | class ApplicationsAppHubListItemView(app: App) : NormalAppListItemView(app) { 9 | override fun renew(context: Context) { 10 | renewData(context) 11 | val releaseStatus = app.releaseStatus 12 | if (app.isRenewing) { 13 | if (releaseStatus != AppStatus.NETWORK_ERROR) { 14 | setAppStatusIcon(releaseStatus) 15 | } else { 16 | ivStatusVisibility.set(false) 17 | pbStatusVisibility.set(true) 18 | } 19 | } else { 20 | setAppStatusIcon(releaseStatus) 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /core-android-utils/src/main/java/net/xzos/upgradeall/core/androidutils/app_info/AppReceiver.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.androidutils.app_info 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import android.content.IntentFilter 7 | 8 | 9 | class AppReceiver( 10 | private val context: Context, 11 | private val onReceiveFun:(Context, Intent) -> Unit 12 | ) : BroadcastReceiver() { 13 | override fun onReceive(context: Context, intent: Intent) { 14 | onReceiveFun(context, intent) 15 | } 16 | 17 | fun register() { 18 | val intentFilter = IntentFilter() 19 | intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED) 20 | intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED) 21 | intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED) 22 | intentFilter.addDataScheme("package") 23 | context.registerReceiver(this, intentFilter) 24 | } 25 | } -------------------------------------------------------------------------------- /core-installer/src/main/java/android/content/pm/ParceledListSlice.java: -------------------------------------------------------------------------------- 1 | package android.content.pm; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | import java.util.List; 7 | 8 | public class ParceledListSlice { 9 | 10 | public static final Parcelable.ClassLoaderCreator CREATOR = new Parcelable.ClassLoaderCreator() { 11 | public ParceledListSlice createFromParcel(Parcel var1) { 12 | throw new UnsupportedOperationException(); 13 | } 14 | 15 | public ParceledListSlice createFromParcel(Parcel var1, ClassLoader var2) { 16 | throw new UnsupportedOperationException(); 17 | } 18 | 19 | public ParceledListSlice[] newArray(int var1) { 20 | throw new UnsupportedOperationException(); 21 | } 22 | }; 23 | 24 | public List getList() { 25 | throw new UnsupportedOperationException(); 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_local_error.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_del_or_error.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_latest_or_right.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /core-android-utils/src/main/java/net/xzos/upgradeall/core/androidutils/ToastUtil.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.androidutils 2 | 3 | import android.content.Context 4 | import android.widget.Toast 5 | import androidx.annotation.StringRes 6 | import me.drakeet.support.toast.ToastCompat 7 | 8 | object ToastUtil { 9 | /** 10 | * show a toast via a string 11 | * 12 | * @param text a string text 13 | */ 14 | fun showText(context: Context, text: String, duration: Int = Toast.LENGTH_SHORT) { 15 | runUiFun { 16 | ToastCompat.makeText(context, text, duration).show() 17 | } 18 | } 19 | 20 | /** 21 | * show a toast via a resource id 22 | * 23 | * @param resId a string resource id 24 | */ 25 | fun showText(context: Context, @StringRes resId: Int, duration: Int = Toast.LENGTH_SHORT) { 26 | runUiFun { 27 | ToastCompat.makeText(context, context.getText(resId), duration).show() 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_discover.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 15 | 16 | 20 | 21 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /core-websdk/src/main/java/net/xzos/upgradeall/core/websdk/base_model/ApiRequestData.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.websdk.base_model 2 | 3 | 4 | data class HubData( 5 | val hubUuid: String, 6 | val auth: Map, 7 | val other: Map = mapOf(), 8 | ) { 9 | fun getStringId(): String = "$hubUuid|${auth.getString()}|${other.getString()}" 10 | } 11 | 12 | data class AppData( 13 | val appId: Map, 14 | val other: Map, 15 | ) { 16 | fun getStringId(): String = "${appId.getString()}|${other.getString()}" 17 | } 18 | 19 | interface ApiRequestData { 20 | val hub: HubData 21 | } 22 | 23 | data class SingleRequestData( 24 | override val hub: HubData, 25 | val app: AppData, 26 | ) : ApiRequestData 27 | 28 | data class MultiRequestData( 29 | override val hub: HubData, 30 | val appList: Collection, 31 | ) : ApiRequestData 32 | 33 | fun Map.getString() = entries.joinToString { "${it.key}:${it.value}" } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/base/update/UpdateAppHubListAdapter.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.base.update 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import net.xzos.upgradeall.core.module.app.App 6 | import net.xzos.upgradeall.databinding.ItemHubAppUpdateBinding 7 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewAdapter 8 | 9 | class UpdateAppHubListAdapter(listContainerViewConvertFun: (App) -> UpdateAppListItemView) 10 | : RecyclerViewAdapter(listContainerViewConvertFun) { 11 | 12 | override val handler: UpdateAppHubListItemHandler = UpdateAppHubListItemHandler() 13 | 14 | override fun getViewHolder(layoutInflater: LayoutInflater, viewGroup: ViewGroup): UpdateAppHubListViewHolder { 15 | val binding = ItemHubAppUpdateBinding.inflate(layoutInflater, viewGroup, false) 16 | return UpdateAppHubListViewHolder(binding, handler) 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/base/view/AlwaysMarqueeTextView.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.base.view 2 | 3 | import android.content.Context 4 | import android.text.TextUtils 5 | import android.util.AttributeSet 6 | import androidx.appcompat.widget.AppCompatTextView 7 | 8 | class AlwaysMarqueeTextView : AppCompatTextView { 9 | 10 | constructor(context: Context?) : super(context!!) { 11 | init() 12 | } 13 | constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) { 14 | init() 15 | } 16 | constructor(context: Context?, attrs: AttributeSet?, defStyle: Int) : super(context!!, attrs, defStyle) { 17 | init() 18 | } 19 | 20 | override fun isFocused(): Boolean { 21 | return true 22 | } 23 | 24 | private fun init() { 25 | ellipsize = TextUtils.TruncateAt.MARQUEE 26 | isFocusable = true 27 | isFocusableInTouchMode = true 28 | marqueeRepeatLimit = -1 /*Infinity*/ 29 | setSingleLine() 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/res/xml/preferences_installation.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | 19 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /core-downloader/src/main/java/net/xzos/upgradeall/core/downloader/filedownloader/item/data/TaskData.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.downloader.filedownloader.item.data 2 | 3 | import net.xzos.upgradeall.core.downloader.filedownloader.item.DownloadWorker 4 | import java.io.File 5 | 6 | internal data class TaskData( 7 | val name: String, 8 | val filePath: String, 9 | val url: String, 10 | val headers: MutableMap = mutableMapOf(), 11 | var autoRetryMaxAttempts: Int = 0, 12 | ) { 13 | fun header(key: String, value: String) = this.apply { 14 | this.headers[key] = value 15 | } 16 | 17 | fun headers(headers: Map) = this.apply { 18 | this.headers.putAll(headers) 19 | } 20 | 21 | fun autoRetryMaxAttempts(value: Int) = this.apply { 22 | this.autoRetryMaxAttempts = value 23 | } 24 | } 25 | 26 | internal fun TaskData.file() = File(filePath) 27 | 28 | internal fun TaskData.manager(): DownloadWorker { 29 | return DownloadWorker(this) 30 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_write_item.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/base/normal/NormalAppHubListAdapter.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.base.normal 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import net.xzos.upgradeall.core.module.app.App 6 | import net.xzos.upgradeall.databinding.ItemHubAppNormalBinding 7 | import net.xzos.upgradeall.ui.base.recycleview.RecyclerViewAdapter 8 | 9 | class NormalAppHubListAdapter( 10 | listContainerViewConvertFun: (App) -> NormalAppListItemView, 11 | override val handler: NormalAppHubListItemHandler = NormalAppHubListItemHandler() 12 | ) : RecyclerViewAdapter( 13 | listContainerViewConvertFun 14 | ) { 15 | 16 | override fun getViewHolder( 17 | layoutInflater: LayoutInflater, viewGroup: ViewGroup 18 | ): NormalAppHubListViewHolder { 19 | val binding = ItemHubAppNormalBinding.inflate(layoutInflater, viewGroup, false) 20 | return NormalAppHubListViewHolder(binding) 21 | } 22 | } -------------------------------------------------------------------------------- /core-downloader/src/main/java/net/xzos/upgradeall/core/downloader/filedownloader/Error.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.downloader.filedownloader 2 | 3 | import androidx.documentfile.provider.DocumentFile 4 | import net.xzos.upgradeall.core.downloader.filedownloader.item.Downloader 5 | import java.io.IOException 6 | 7 | private const val DOWNLOAD_CANCELLED = "DOWNLOAD_CANCELLED" 8 | 9 | internal class MultipleSameIdDownloaderException(private val downloader: Downloader) : 10 | IOException() { 11 | override fun toString(): String { 12 | return "DownloaderList exist same id downloader(${downloader.id}) in DownloaderManager." 13 | } 14 | } 15 | 16 | class DownloadFileError internal constructor( 17 | val parent: DocumentFile, val fileName: String 18 | ) : RuntimeException() 19 | 20 | class DownloadCanceledError internal constructor( 21 | val msg: String? = null 22 | ) : RuntimeException(DOWNLOAD_CANCELLED) 23 | 24 | class DownloadFetchError internal constructor( 25 | val error: Error 26 | ) : RuntimeException(DOWNLOAD_CANCELLED) -------------------------------------------------------------------------------- /core-utils/src/main/java/net/xzos/upgradeall/core/utils/data_cache/cache_object/BaseCache.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.core.utils.data_cache.cache_object 2 | 3 | import java.time.Instant 4 | 5 | abstract class BaseCache( 6 | val key: String 7 | ) { 8 | abstract val store: BaseStore 9 | 10 | fun checkValid(dataCacheTimeSec: Int): Boolean { 11 | return (Instant.now().epochSecond - store.getTime() <= dataCacheTimeSec) 12 | } 13 | 14 | private fun renewTime() { 15 | store.setTime(Instant.now().epochSecond) 16 | } 17 | 18 | fun write(any: T?, encoder: Encoder) { 19 | store.write(encoder.encode(any)) 20 | renewTime() 21 | } 22 | 23 | fun read(encoder: Encoder): T? { 24 | return encoder.decode(store.read()) 25 | } 26 | 27 | fun delete() { 28 | store.delete() 29 | } 30 | } 31 | 32 | interface BaseStore { 33 | fun setTime(time: Long) 34 | fun getTime(): Long 35 | fun write(data: T) 36 | fun read(): T 37 | fun delete() 38 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 4 | 6 | 8 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/ui/applist/base/normal/NormalAppHubListFragment.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.ui.applist.base.normal 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import net.xzos.upgradeall.databinding.FragmentHubListBinding 8 | import net.xzos.upgradeall.ui.applist.base.AppHubListFragment 9 | 10 | 11 | open class NormalAppHubListFragment 12 | : AppHubListFragment() { 13 | override val adapter = NormalAppHubListAdapter( 14 | listContainerViewConvertFun = { 15 | NormalAppListItemView(it).apply { renew(requireContext()) } 16 | }) 17 | 18 | override fun onCreateView( 19 | inflater: LayoutInflater, 20 | container: ViewGroup?, 21 | savedInstanceState: Bundle? 22 | ): View { 23 | return FragmentHubListBinding.inflate(inflater).also { 24 | initView(it.listLayout.rvList, it.listLayout.srlContainer) 25 | }.root 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/net/xzos/upgradeall/utils/DimensionKtx.kt: -------------------------------------------------------------------------------- 1 | package net.xzos.upgradeall.utils 2 | 3 | import android.content.res.Resources 4 | 5 | object DimensionKtx { 6 | val Float.dp: Float // [xxhdpi](360 -> 1080) 7 | get() = android.util.TypedValue.applyDimension( 8 | android.util.TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics) 9 | 10 | val Int.dp: Int 11 | get() = android.util.TypedValue.applyDimension( 12 | android.util.TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics).toInt() 13 | 14 | 15 | val Float.sp: Float // [xxhdpi](360 -> 1080) 16 | get() = android.util.TypedValue.applyDimension( 17 | android.util.TypedValue.COMPLEX_UNIT_SP, this, Resources.getSystem().displayMetrics) 18 | 19 | 20 | val Int.sp: Int 21 | get() = android.util.TypedValue.applyDimension( 22 | android.util.TypedValue.COMPLEX_UNIT_SP, this.toFloat(), Resources.getSystem().displayMetrics).toInt() 23 | } --------------------------------------------------------------------------------