├── 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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_app_item_update.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_app_setting.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
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 |
--------------------------------------------------------------------------------
/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 |
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 |
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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
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 | }
--------------------------------------------------------------------------------