From d82460d7d306a0b0425fffd4ed79cbb06be77a9f Mon Sep 17 00:00:00 2001 From: VegaBobo Date: Mon, 31 Jan 2022 18:56:44 -0300 Subject: [PATCH] Initial commit! DSU Sideloader 1.0 --- .gitignore | 10 + README.md | 87 +++++ app/.gitignore | 1 + app/build.gradle | 41 +++ app/proguard-rules.pro | 21 ++ app/src/main/AndroidManifest.xml | 38 ++ app/src/main/assets/install_script.sh | 41 +++ app/src/main/ic_launcher-playstore.png | Bin 0 -> 76907 bytes .../vegabobo/dsusideloader/AboutActivity.kt | 44 +++ .../vegabobo/dsusideloader/HomeFragment.kt | 335 ++++++++++++++++++ .../vegabobo/dsusideloader/LogsActivity.kt | 90 +++++ .../vegabobo/dsusideloader/MainActivity.kt | 58 +++ .../dsusideloader/PreferencesFragment.kt | 77 ++++ .../dsusideloader/RunOnAdbActivity.kt | 32 ++ .../vegabobo/dsusideloader/SplashActivity.kt | 30 ++ .../checks/CompatibilityCheck.kt | 39 ++ .../dsusideloader/checks/OperationMode.kt | 51 +++ .../dsuhelper/GenAdbDsuInstallationScript.kt | 44 +++ .../dsusideloader/dsuhelper/GsiDsuObject.kt | 47 +++ .../dsusideloader/dsuhelper/PrepareDsu.kt | 190 ++++++++++ .../dsuhelper/RootDSUDeployer.kt | 27 ++ .../dsusideloader/util/DeCompressionUtils.kt | 95 +++++ .../dsusideloader/util/FilenameUtils.kt | 43 +++ .../vegabobo/dsusideloader/util/SPUtils.kt | 87 +++++ .../dsusideloader/util/SetupStorageAccess.kt | 76 ++++ .../dsusideloader/util/WorkspaceFilesUtils.kt | 29 ++ .../drawable-v31/ic_launcher_foreground.xml | 24 ++ app/src/main/res/drawable/ic_bug_report.xml | 14 + app/src/main/res/drawable/ic_build.xml | 14 + app/src/main/res/drawable/ic_description.xml | 14 + app/src/main/res/drawable/ic_info.xml | 14 + .../res/drawable/ic_launcher_foreground.xml | 24 ++ app/src/main/res/drawable/ic_sd_card.xml | 14 + app/src/main/res/drawable/ic_settings.xml | 14 + .../drawable/ic_system_security_update.xml | 19 + app/src/main/res/layout/activity_about.xml | 141 ++++++++ app/src/main/res/layout/activity_logs.xml | 29 ++ app/src/main/res/layout/activity_main.xml | 46 +++ .../main/res/layout/activity_run_on_adb.xml | 48 +++ app/src/main/res/layout/fragment_home.xml | 263 ++++++++++++++ app/src/main/res/layout/progress.xml | 25 ++ .../main/res/menu/bottom_navigation_menu.xml | 13 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../res/mipmap-anydpi-v31/ic_launcher.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2905 bytes .../mipmap-hdpi/ic_launcher_background.png | Bin 0 -> 9421 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4593 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1974 bytes .../mipmap-mdpi/ic_launcher_background.png | Bin 0 -> 3800 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2699 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4509 bytes .../mipmap-xhdpi/ic_launcher_background.png | Bin 0 -> 18771 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6872 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7993 bytes .../mipmap-xxhdpi/ic_launcher_background.png | Bin 0 -> 42532 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 12266 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 12895 bytes .../mipmap-xxxhdpi/ic_launcher_background.png | Bin 0 -> 67601 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 19268 bytes app/src/main/res/values-night-v31/colors.xml | 15 + app/src/main/res/values-night/colors.xml | 14 + app/src/main/res/values-night/themes.xml | 22 ++ app/src/main/res/values-pt-rBR/strings.xml | 75 ++++ app/src/main/res/values-v31/colors.xml | 16 + app/src/main/res/values/colors.xml | 14 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings.xml | 76 ++++ app/src/main/res/values/themes.xml | 23 ++ app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + app/src/main/res/xml/main_preferences.xml | 38 ++ build.gradle | 10 + gradle.properties | 23 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++++ gradlew.bat | 89 +++++ settings.gradle | 17 + 79 files changed, 3023 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/install_script.sh create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/vegabobo/dsusideloader/AboutActivity.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/HomeFragment.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/LogsActivity.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/MainActivity.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/PreferencesFragment.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/RunOnAdbActivity.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/SplashActivity.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/checks/CompatibilityCheck.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/checks/OperationMode.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/dsuhelper/GenAdbDsuInstallationScript.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/dsuhelper/GsiDsuObject.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/dsuhelper/PrepareDsu.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/dsuhelper/RootDSUDeployer.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/util/DeCompressionUtils.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/util/FilenameUtils.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/util/SPUtils.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/util/SetupStorageAccess.kt create mode 100644 app/src/main/java/vegabobo/dsusideloader/util/WorkspaceFilesUtils.kt create mode 100644 app/src/main/res/drawable-v31/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_bug_report.xml create mode 100644 app/src/main/res/drawable/ic_build.xml create mode 100644 app/src/main/res/drawable/ic_description.xml create mode 100644 app/src/main/res/drawable/ic_info.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_sd_card.xml create mode 100644 app/src/main/res/drawable/ic_settings.xml create mode 100644 app/src/main/res/drawable/ic_system_security_update.xml create mode 100644 app/src/main/res/layout/activity_about.xml create mode 100644 app/src/main/res/layout/activity_logs.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_run_on_adb.xml create mode 100644 app/src/main/res/layout/fragment_home.xml create mode 100644 app/src/main/res/layout/progress.xml create mode 100644 app/src/main/res/menu/bottom_navigation_menu.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-anydpi-v31/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_background.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_background.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_background.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values-night-v31/colors.xml create mode 100644 app/src/main/res/values-night/colors.xml create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values-pt-rBR/strings.xml create mode 100644 app/src/main/res/values-v31/colors.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/main/res/xml/main_preferences.xml create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..10cfdbf --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.iml +.gradle +/local.properties +/.idea +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/README.md b/README.md new file mode 100644 index 0000000..236f7d7 --- /dev/null +++ b/README.md @@ -0,0 +1,87 @@ + +# DSU Sideloader + +A simple app made to help users easily install GSIs via DSU's Android feature. + +## Requirements +- Android 10 or higher +- Unlocked Bootloader +- Device with Dynamic Partitions +- A GSI you want to use! + +Community GSIs: https://github.com/phhusson/treble_experimentations/wiki/Generic-System-Image-%28GSI%29-list + +Google GSIs: https://developer.android.com/topic/generic-system-image/releases + +**Remember to use GSIs compatible with your architeture, vndk implementation..* + +You don't need root to use this app, however, running on non-rooted devices, requires adb (you will be prompted to run a shell script to invoke DSU installation activity) + +Rooted devices via Magisk, should be running Magisk v24 or higher, older versions may break DSU feature. + +We highly recommend using this app with Stock ROM, Custom ROMs aren't supported. + +## How to use? +1. Install app +2. When opening for the first time, you need to give read/write permission to a folder, create a new folder and allow access + + **this folder will be used to store temporary files, like extracted GSIs from compressed files)* + +3. Select a GSI to install + + **accepted formats are: gz, xz and img* + +4. You can customize installation as you want + + **like changing userdata size for dynamic system* + + **changing gsi file size is not recommended (let app do it automatically)* + +5. Tap on "Install GSI via DSU" +6. Wait until finishes! (it may take a some time) +7. Once it finishes, next step may vary: + - On rooted devices, DSU screen will appear, prompting you to confirm installation, after that, check your notifications, DSU should start installing GSI + - On non-rooted devices, you will be prompted to run a command in adb, once you run, DSU screen will appear asking you to confirm installation, after that, DSU should start installing GSI +8. Once dynamic system is ready, you can boot it through notifications + +## Other information +- DSU feature may be broken in some ROMs. +- gsid does not let you install GSIs via DSU when you have less than 40% of free storage. +- gsid checks if selected GSI size is multiple of 512 (preventing corrupted system images). +- If you have disabled/debloated system apps, make sure "Dynamic System Updates" app is not disabled. +- To use "ADB mode" on rooted device, deny root permission. + +## About DSU +DSU (Dynamic System Updates), is a feature introduced on Android 10, that let developers boot GSIs without touching current system partition, this is done by creating new partitions to hold a GSI and a separated userdata, to boot on them when desired. + +Unfortunelly, DSU depends on Dynamic Partitions (your device need to support, otherwise, won't work), and most GSIs requires unlocked bootloader to get them booting properly (since only OEM-Signed GSIs are allowed to boot on locked bootloader). + +GSIs can be installed via DSU without root access, using ADB, running some commands, you can read more about installation process here: https://developer.android.com/topic/dsu + +Once installation finishes, Android creates a persistent notification allowing you to boot into "Dynamic System" (GSI installed via DSU), and you can boot into installed GSI, without touching your system partition, or breaking the "real userdata" partition. + +After booting Dynamic System, you can try and test whatever you want, when you need to switch back to device's original system image, everything you need to do, is just, a simple reboot! + +When doing a long test, that may requires lots of reboots, this can be a pain, however, is possible to enable "sticky mode", that enforces dynamic system, instead of device's original system image, once tests are done, you can disable sticky mode and return to original system image. + +That is basically a quickly explanation about DSU, a amazing feature, like a "dual-boot" solution, limited, however, very safe (since no read-only partition will be modified, and if GSI does not boot, just a simple reboot will return you to the original device's system image). + +You can read more about DSU here: https://source.android.com/devices/tech/ota/dynamic-system-updates + +## How to enable Sticky Mode? + +Reboot to Dynamic System, and: +- use this command on adb: `adb shell gsi_tool enable` + - or from local adb shell: `gsi_tool enable` + - or from local rooted shell (eg. Termux on rooted GSI): `su -c 'gsi_tool enable'` + +When sticky mode is enabled, device will always boot into dynamic system, instead of device's original system image. + +To disable, use the same command, instead of `enable` , use `disable` + + +## Why creating this app? + +Since this process can be done without any app, using adb, why creating a app to do that? + +Well, to be honest, i think the same, however, having a app that can automate the "installation" process, and making DSUs more easier for end-user, would be a nice thing, also, i want to learn some kotlin, so, i've made this app! diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..82debf3 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +android { + compileSdk 31 + + defaultConfig { + applicationId "vegabobo.dsusideloader" + minSdk 29 + targetSdk 31 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} +dependencies { + implementation 'org.tukaani:xz:1.9' + implementation 'com.github.topjohnwu.libsu:core:3.2.1' + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'androidx.fragment:fragment-ktx:1.4.1' + implementation 'androidx.preference:preference-ktx:1.2.0' + implementation 'com.google.android.material:material:1.5.0' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..bfa5424 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/install_script.sh b/app/src/main/assets/install_script.sh new file mode 100644 index 0000000..5b11b2f --- /dev/null +++ b/app/src/main/assets/install_script.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +# Script made to launch DSU installation activity. +# Unrooted users can run this script using ADB to start +# installation of GSI via DSU. +# Values are populared by String.format + +# Prevent users running Magisk +# equal or older than 23016 +# since this version may break DSU boot +# this script was made for users running without root +# but some users may, just, well, refuse root permission +magisk_version=$(su -V) &>/dev/null + +if [ ! -z "$magisk_version" ]; then + if [ $magisk_version -lt 23016 ]; then + echo "Detected older Magisk version, please update to the latest Magisk build" + exit 1 + fi +fi + +# required prop +setprop persist.sys.fflag.override.settings_dynamic_system true + +# invoke DSU activity +am start-activity -n com.android.dynsystem/com.android.dynsystem.VerificationActivity \ + -a android.os.image.action.START_INSTALL \ + -d %s \ + --el KEY_SYSTEM_SIZE %s \ + --el KEY_USERDATA_SIZE %s + +# if debug mode == log it (greping for gsid and dynsys) +# else delete installation file +debug_mode=%s +if [ $debug_mode == true ]; then + logcat -c + echo "" > /sdcard/dsu_sideloader_logs.txt + (logcat | grep -e gsid -e dynsys) | tee /sdcard/dsu_sideloader_logs.txt +else + rm '%s' +fi diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2ed676510cde55e46b870f1394f739bb4fdf19 GIT binary patch literal 76907 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.id.tv_version).text = + getString(R.string.version, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE) + } + + private fun launchUrlIntent(url: String) { + val i = Intent(Intent.ACTION_VIEW) + i.data = Uri.parse(url) + startActivity(i) + } + + fun btnGitHubSource(view: View) { + launchUrlIntent("https://github.com/VegaBobo/DSU-Sideloader") + } + + fun btnAuthorLink(view: View) { + launchUrlIntent("https://github.com/VegaBobo/") + } + + fun btnXzUtils(view: View) { + launchUrlIntent("https://tukaani.org/xz/") + } + + fun btnLibsu(view: View) { + launchUrlIntent("https://github.com/topjohnwu/libsu") + } + + fun btnGoogle(view: View) { + launchUrlIntent("https://developer.android.com/") + } + +} \ No newline at end of file diff --git a/app/src/main/java/vegabobo/dsusideloader/HomeFragment.kt b/app/src/main/java/vegabobo/dsusideloader/HomeFragment.kt new file mode 100644 index 0000000..7993149 --- /dev/null +++ b/app/src/main/java/vegabobo/dsusideloader/HomeFragment.kt @@ -0,0 +1,335 @@ +package vegabobo.dsusideloader + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.os.Environment +import android.os.StatFs +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.LinearLayout +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment +import com.google.android.material.button.MaterialButton +import com.google.android.material.checkbox.MaterialCheckBox +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.textfield.TextInputEditText +import com.google.android.material.textview.MaterialTextView +import vegabobo.dsusideloader.checks.CompatibilityCheck +import vegabobo.dsusideloader.checks.OperationMode +import vegabobo.dsusideloader.dsuhelper.GsiDsuObject +import vegabobo.dsusideloader.dsuhelper.PrepareDsu +import vegabobo.dsusideloader.util.SPUtils +import vegabobo.dsusideloader.util.SetupStorageAccess +import vegabobo.dsusideloader.util.WorkspaceFilesUtils +import kotlin.math.roundToInt + +class HomeFragment : Fragment() { + + private val gsiDsuObject = GsiDsuObject() + var selectedGsi: Uri = Uri.EMPTY + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + if (isEnvCompatible(true)) + SetupStorageAccess(requireContext()) + + // gsid refuses to start installation when < 40% free storage + // prevent user from using app on this circumstances + if (!hasAvailableStorage()) + showNoAvaiableStorageDialog() + + gsiDsuObject.userdataSize = SPUtils.getUserdataSize(requireActivity()) + + val edGsiPath = requireView().findViewById(R.id.ed_gsi_path) + val btnInstall = requireView().findViewById(R.id.btn_install) + val btnIncrease = requireView().findViewById(R.id.bt_increase) + val btnDecrease = requireView().findViewById(R.id.btn_decrease) + val cbDSsize = requireView().findViewById(R.id.cb_ds_size) + val edDSsize = requireView().findViewById(R.id.ed_ds_size) + val cbGSIsize = requireView().findViewById(R.id.cb_gsi_size) + val edGSIsize = requireView().findViewById(R.id.ed_gsi_size) + val tc = requireView().findViewById(R.id.tv_defaultuserdata) + val txDebugBuildInfo = requireView().findViewById(R.id.text_debugbuild) + + if(BuildConfig.DEBUG) { + txDebugBuildInfo.visibility = View.VISIBLE + txDebugBuildInfo.text = getString(R.string.debug_build_info, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE) + } + + tc.text = getString(R.string.default_userdata_help, gsiDsuObject.userdataSize) + + edDSsize.setText(getString(R.string.gigabyte_holder, gsiDsuObject.userdataSize)) + + val fileSelection = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + val uri = result.data!!.data + selectedGsi = uri!! + btnInstall.isEnabled = true + edGsiPath.setText(uri.lastPathSegment.toString()) + btnInstall.setTextColor( + ContextCompat.getColor( + requireActivity(), + R.color.white_alpha + ) + ) + btnInstall.setIconTintResource(R.color.white_alpha) + } + } + + edGsiPath.setOnClickListener { + var chooseFile = Intent(Intent.ACTION_GET_CONTENT) + chooseFile.type = "*/*" + chooseFile = Intent.createChooser(chooseFile, getString(R.string.saf_choose_file)) + fileSelection.launch(chooseFile) + } + + btnIncrease.setOnClickListener { + gsiDsuObject.userdataSize++ + edDSsize.setText(getString(R.string.gigabyte_holder, gsiDsuObject.userdataSize)) + + } + + btnDecrease.setOnClickListener { + if (gsiDsuObject.userdataSize >= 2) + gsiDsuObject.userdataSize-- + edDSsize.setText(getString(R.string.gigabyte_holder, gsiDsuObject.userdataSize)) + } + + cbDSsize.setOnClickListener { + if (cbDSsize.isChecked) { + gsiDsuObject.userdataSize = SPUtils.getUserdataSize(requireContext()) + edDSsize.setText(getString(R.string.gigabyte_holder, gsiDsuObject.userdataSize)) + edDSsize.isEnabled = false + btnIncrease.visibility = View.GONE + btnDecrease.visibility = View.GONE + val params = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) + edDSsize.layoutParams = params + } else { + edDSsize.isEnabled = true + edDSsize.keyListener = null + btnIncrease.visibility = View.VISIBLE + btnDecrease.visibility = View.VISIBLE + val params = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) + edDSsize.layoutParams = params + } + } + + cbGSIsize.setOnClickListener { + if (cbGSIsize.isChecked) { + edGSIsize.setText(getString(R.string.auto)) + edGSIsize.isEnabled = false + } else { + edGSIsize.setText("") + edGSIsize.isEnabled = true + edGSIsize.requestFocus() + edGSIsize.hint = getString(R.string.type_bytes) + } + } + + btnInstall.setOnClickListener { + + if (!cbGSIsize.isChecked) { + gsiDsuObject.fileSize = if (edGSIsize.toString().isNotEmpty()) { + edGSIsize.text.toString().toLong() + } else { + Toast.makeText( + activity, + getString(R.string.invalid_gsi_size, getString(R.string.auto)), + Toast.LENGTH_SHORT + ).show() + -1 + } + } + + if (!cbDSsize.isChecked) { + gsiDsuObject.userdataSize = edDSsize.text.toString().split("GB")[0].toInt() + } + + beginInstall(selectedGsi, gsiDsuObject) + } + + val cb = requireView().findViewById(R.id.cb_keepawake) + cb.setOnClickListener { + if (cb.isChecked) requireActivity().window.addFlags( + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + ) + else requireActivity().window.clearFlags( + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + ) + } + + if (selectedGsi != Uri.EMPTY) + btnInstall.isEnabled = true + + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_home, container, false) + } + + + private fun checkDialog(title: String, text: String, finish: Boolean) { + MaterialAlertDialogBuilder(requireActivity()) + .setTitle(title) + .setMessage(text) + .setPositiveButton(if (finish) getString(R.string.close_app) else getString(R.string.got_it)) { _, _ -> if (finish) requireActivity().finish() } + .setCancelable(false) + .show() + } + + private fun hasAvailableStorage(): Boolean { + val statFs = StatFs(Environment.getDataDirectory().absolutePath) + val blockSize = statFs.blockSizeLong + val totalSize = statFs.blockCountLong * blockSize + val availableSize = statFs.availableBlocksLong * blockSize + return ((availableSize.toFloat() / totalSize.toFloat()) * 100).roundToInt() > 40 + } + + private fun isEnvCompatible(showDialogs: Boolean): Boolean { + return (isMagiskVersionCompatible(showDialogs) && isPropsValid(showDialogs)) + } + + private fun isPropsValid(showDialogs: Boolean): Boolean { + if (!CompatibilityCheck.checkDynamicPartitions()) { + if (showDialogs) { + checkDialog( + getString(R.string.unsupported), + getString(R.string.device_unsupported), + true + ) + } + return false + } else if (CompatibilityCheck.isBootloaderLocked() && CompatibilityCheck.signOfCustomOS()) { + if (showDialogs && !SPUtils.hasUserSeenDialogsBefore(requireContext())) { + checkDialog( + getString(R.string.notice), + getString(R.string.notice_lockedbl_custom), + false + ) + } + } else if (CompatibilityCheck.isBootloaderLocked()) { + if (showDialogs && !SPUtils.hasUserSeenDialogsBefore(requireContext())) { + checkDialog( + getString(R.string.notice), + getString(R.string.notice_lockedbl), + false + ) + } + } else if (CompatibilityCheck.signOfCustomOS()) { + if (showDialogs && !SPUtils.hasUserSeenDialogsBefore(requireContext())) { + checkDialog( + getString(R.string.notice), + getString(R.string.notice_custom), + false + ) + } + } + SPUtils.setUserHasSeenDialogsBefore(requireActivity()) + return true + } + + private fun isMagiskVersionCompatible(showDialogs: Boolean): Boolean { + if (CompatibilityCheck.isUsingIncompatibleMagisk()) { + if (showDialogs) { + MaterialAlertDialogBuilder(requireActivity()) + .setTitle(getString(R.string.unsupported)) + .setMessage( + getString( + R.string.outdated_magisk, + OperationMode.obtainMagiskVersion() + ) + ) + .setPositiveButton(getString(R.string.close_app)) { _, _ -> + requireActivity().finish() + } + .setCancelable(false) + .show() + } + return false + } + return true + } + + private fun beginInstall(selectedGsi: Uri, gsiDsuObject: GsiDsuObject) { + var selectedFile = selectedGsi.lastPathSegment.toString().split(":")[1] + + if (selectedFile.contains("/")) + selectedFile = selectedFile.substring(selectedFile.lastIndexOf('/') + 1) + + when (selectedFile.substring(selectedFile.lastIndexOf("."))) { + ".xz", ".gz", ".img" -> { + + MaterialAlertDialogBuilder(requireActivity()) + .setTitle(R.string.info) + .setMessage(getString(R.string.warning)) + .setPositiveButton(getString(R.string.proceed)) { _, _ -> + + MaterialAlertDialogBuilder(requireActivity()) + .setTitle(getString(R.string.installation)) + .setMessage( + getString( + R.string.installation_details, + selectedFile, + gsiDsuObject.userdataSize.toString(), + if (gsiDsuObject.fileSize == -1L) getString(R.string.auto) else gsiDsuObject.fileSize + ) + ) + .setPositiveButton(getString(R.string.proceed)) { _, _ -> + WorkspaceFilesUtils.cleanWorkspaceFolder(requireActivity(), true) + Thread( + PrepareDsu( + requireActivity(), + selectedGsi, + gsiDsuObject + ) + ).start() + } + .setNegativeButton(getString(R.string.cancel), null) + .setCancelable(true) + .show() + + } + .setNegativeButton(getString(R.string.cancel), null) + .show() + + + } + + else -> { + MaterialAlertDialogBuilder(requireActivity()) + .setTitle(R.string.unsupported) + .setMessage(getString(R.string.file_unsupported)) + .setPositiveButton(getString(R.string.got_it), null) + .setCancelable(true) + .show() + } + } + } + + private fun showNoAvaiableStorageDialog() { + MaterialAlertDialogBuilder(requireActivity()) + .setTitle(R.string.error) + .setMessage(getString(R.string.storage_warning)) + .setPositiveButton(getString(R.string.close_app)) { _, _ -> requireActivity().finish() } + .setCancelable(false) + .show() + } + +} \ No newline at end of file diff --git a/app/src/main/java/vegabobo/dsusideloader/LogsActivity.kt b/app/src/main/java/vegabobo/dsusideloader/LogsActivity.kt new file mode 100644 index 0000000..06eed41 --- /dev/null +++ b/app/src/main/java/vegabobo/dsusideloader/LogsActivity.kt @@ -0,0 +1,90 @@ +package vegabobo.dsusideloader + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.widget.Button +import android.widget.TextView +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.topjohnwu.superuser.CallbackList +import com.topjohnwu.superuser.Shell +import vegabobo.dsusideloader.dsuhelper.GsiDsuObject +import vegabobo.dsusideloader.dsuhelper.RootDSUDeployer +import java.io.IOException +import java.io.OutputStream + + +class LogsActivity : AppCompatActivity() { + + var logsRaw = "" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_logs) + + RootDSUDeployer(intent.extras!!.get("dsu") as GsiDsuObject) + + val tvLog = findViewById(R.id.tv_logs) + val btnSaveLogs = findViewById