manager: Add tips for select boot image
This commit is contained in:
@@ -6,6 +6,7 @@ import android.net.Uri
|
|||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
import androidx.annotation.StringRes
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
@@ -46,6 +47,7 @@ import me.weishu.kernelsu.ui.util.DownloadListener
|
|||||||
import me.weishu.kernelsu.ui.util.download
|
import me.weishu.kernelsu.ui.util.download
|
||||||
import me.weishu.kernelsu.ui.util.getLKMUrl
|
import me.weishu.kernelsu.ui.util.getLKMUrl
|
||||||
import me.weishu.kernelsu.ui.util.isAbDevice
|
import me.weishu.kernelsu.ui.util.isAbDevice
|
||||||
|
import me.weishu.kernelsu.ui.util.isInitBoot
|
||||||
import me.weishu.kernelsu.ui.util.rootAvailable
|
import me.weishu.kernelsu.ui.util.rootAvailable
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -173,8 +175,11 @@ fun InstallScreen(navigator: DestinationsNavigator) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sealed class InstallMethod {
|
sealed class InstallMethod {
|
||||||
data class SelectFile(val uri: Uri? = null, override val label: Int = R.string.select_file) :
|
data class SelectFile(
|
||||||
InstallMethod()
|
val uri: Uri? = null,
|
||||||
|
@StringRes override val label: Int = R.string.select_file,
|
||||||
|
override val summary: String?
|
||||||
|
) : InstallMethod()
|
||||||
|
|
||||||
object DirectInstall : InstallMethod() {
|
object DirectInstall : InstallMethod() {
|
||||||
override val label: Int
|
override val label: Int
|
||||||
@@ -187,13 +192,19 @@ sealed class InstallMethod {
|
|||||||
}
|
}
|
||||||
|
|
||||||
abstract val label: Int
|
abstract val label: Int
|
||||||
|
open val summary: String? = null
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun SelectInstallMethod(onSelected: (InstallMethod) -> Unit = {}) {
|
private fun SelectInstallMethod(onSelected: (InstallMethod) -> Unit = {}) {
|
||||||
val rootAvailable = rootAvailable()
|
val rootAvailable = rootAvailable()
|
||||||
val isAbDevice = isAbDevice()
|
val isAbDevice = isAbDevice()
|
||||||
val radioOptions = mutableListOf<InstallMethod>(InstallMethod.SelectFile())
|
val selectFileTip = stringResource(
|
||||||
|
id = R.string.select_file_tip,
|
||||||
|
if (isInitBoot()) "init_boot" else "boot"
|
||||||
|
)
|
||||||
|
val radioOptions =
|
||||||
|
mutableListOf<InstallMethod>(InstallMethod.SelectFile(summary = selectFileTip))
|
||||||
if (rootAvailable) {
|
if (rootAvailable) {
|
||||||
radioOptions.add(InstallMethod.DirectInstall)
|
radioOptions.add(InstallMethod.DirectInstall)
|
||||||
|
|
||||||
@@ -208,7 +219,7 @@ private fun SelectInstallMethod(onSelected: (InstallMethod) -> Unit = {}) {
|
|||||||
) {
|
) {
|
||||||
if (it.resultCode == Activity.RESULT_OK) {
|
if (it.resultCode == Activity.RESULT_OK) {
|
||||||
it.data?.data?.let { uri ->
|
it.data?.data?.let { uri ->
|
||||||
val option = InstallMethod.SelectFile(uri)
|
val option = InstallMethod.SelectFile(uri, summary = selectFileTip)
|
||||||
selectedOption = option
|
selectedOption = option
|
||||||
onSelected(option)
|
onSelected(option)
|
||||||
}
|
}
|
||||||
@@ -255,7 +266,22 @@ private fun SelectInstallMethod(onSelected: (InstallMethod) -> Unit = {}) {
|
|||||||
RadioButton(selected = option.javaClass == selectedOption?.javaClass, onClick = {
|
RadioButton(selected = option.javaClass == selectedOption?.javaClass, onClick = {
|
||||||
onClick(option)
|
onClick(option)
|
||||||
})
|
})
|
||||||
Text(text = stringResource(id = option.label))
|
Column {
|
||||||
|
Text(
|
||||||
|
text = stringResource(id = option.label),
|
||||||
|
fontSize = MaterialTheme.typography.titleMedium.fontSize,
|
||||||
|
fontFamily = MaterialTheme.typography.titleMedium.fontFamily,
|
||||||
|
fontStyle = MaterialTheme.typography.titleMedium.fontStyle
|
||||||
|
)
|
||||||
|
option.summary?.let {
|
||||||
|
Text(
|
||||||
|
text = it,
|
||||||
|
fontSize = MaterialTheme.typography.bodySmall.fontSize,
|
||||||
|
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
|
||||||
|
fontStyle = MaterialTheme.typography.bodySmall.fontStyle
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package me.weishu.kernelsu.ui.util
|
package me.weishu.kernelsu.ui.util
|
||||||
|
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
@@ -237,6 +238,12 @@ fun isAbDevice(): Boolean {
|
|||||||
return ShellUtils.fastCmd(shell, "getprop ro.build.ab_update").trim().toBoolean()
|
return ShellUtils.fastCmd(shell, "getprop ro.build.ab_update").trim().toBoolean()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun isInitBoot(): Boolean {
|
||||||
|
val shell = getRootShell()
|
||||||
|
// https://source.android.com/docs/core/architecture/partitions/generic-boot
|
||||||
|
return ShellUtils.fastCmd(shell, "getprop ro.product.first_api_level").trim().toInt() >= Build.VERSION_CODES.TIRAMISU
|
||||||
|
}
|
||||||
|
|
||||||
fun overlayFsAvailable(): Boolean {
|
fun overlayFsAvailable(): Boolean {
|
||||||
val shell = getRootShell()
|
val shell = getRootShell()
|
||||||
// check /proc/filesystems
|
// check /proc/filesystems
|
||||||
|
|||||||
@@ -115,4 +115,5 @@
|
|||||||
<string name="install_next">下一步</string>
|
<string name="install_next">下一步</string>
|
||||||
<string name="failed_to_fetch_lkm_url">获取 LKM 链接失败:%1$s</string>
|
<string name="failed_to_fetch_lkm_url">获取 LKM 链接失败:%1$s</string>
|
||||||
<string name="downloading">正在下载:%1$s</string>
|
<string name="downloading">正在下载:%1$s</string>
|
||||||
|
<string name="select_file_tip">建议选择 %1$s 分区镜像</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -117,4 +117,5 @@
|
|||||||
<string name="install_next">Next</string>
|
<string name="install_next">Next</string>
|
||||||
<string name="failed_to_fetch_lkm_url">Failed to fetch LKM url: %1$s</string>
|
<string name="failed_to_fetch_lkm_url">Failed to fetch LKM url: %1$s</string>
|
||||||
<string name="downloading">Downloading %1$s</string>
|
<string name="downloading">Downloading %1$s</string>
|
||||||
|
<string name="select_file_tip">%1$s partition image is recommended</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user