From c90e9fcc9526adc94c772971d17c0bd22bf4ba9e Mon Sep 17 00:00:00 2001 From: tiann Date: Sat, 10 Dec 2022 21:54:34 +0800 Subject: [PATCH] [manager]: show status of kernel --- .../main/java/me/weishu/kernelsu/Kernels.kt | 44 ++++++++++++++++ .../java/me/weishu/kernelsu/ui/screen/Home.kt | 51 +++++++++++++++---- .../main/res/drawable/ic_status_supported.xml | 7 +++ .../res/drawable/ic_status_unsupported.xml | 7 +++ .../main/res/drawable/ic_status_working.xml | 7 +++ 5 files changed, 107 insertions(+), 9 deletions(-) create mode 100644 manager/app/src/main/java/me/weishu/kernelsu/Kernels.kt create mode 100644 manager/app/src/main/res/drawable/ic_status_supported.xml create mode 100644 manager/app/src/main/res/drawable/ic_status_unsupported.xml create mode 100644 manager/app/src/main/res/drawable/ic_status_working.xml diff --git a/manager/app/src/main/java/me/weishu/kernelsu/Kernels.kt b/manager/app/src/main/java/me/weishu/kernelsu/Kernels.kt new file mode 100644 index 00000000..860e46fc --- /dev/null +++ b/manager/app/src/main/java/me/weishu/kernelsu/Kernels.kt @@ -0,0 +1,44 @@ +package me.weishu.kernelsu + +import android.system.Os + +/** + * @author weishu + * @date 2022/12/10. + */ + +data class KernelVersion(val major: Int, val patchLevel: Int, val subLevel: Int) { + override fun toString(): String { + return "$major.$patchLevel.$subLevel" + } + + fun isGKI(): Boolean { + + // kernel 6.x + if (major > 5) { + return true + } + + // kernel 5.10.x + if (major == 5) { + return patchLevel >= 10 + } + + return false + } +} + +fun parseKernelVersion(version: String): KernelVersion { + val find = "(\\d+)\\.(\\d+)\\.(\\d+)".toRegex().find(version) + return if (find != null) { + KernelVersion(find.groupValues[1].toInt(), find.groupValues[2].toInt(), find.groupValues[3].toInt()) + } else { + KernelVersion(-1, -1, -1) + } +} + +fun getKernelVersion(): KernelVersion { + Os.uname().release.let { + return parseKernelVersion(it) + } +} \ No newline at end of file diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Home.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Home.kt index b207769e..15f8a7cb 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Home.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Home.kt @@ -1,15 +1,16 @@ import android.os.Build import android.system.Os +import android.widget.Toast import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Done -import androidx.compose.material.icons.filled.Warning import androidx.compose.material3.Card +import androidx.compose.material3.Snackbar import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight @@ -17,6 +18,8 @@ import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import me.weishu.kernelsu.Natives +import me.weishu.kernelsu.R +import me.weishu.kernelsu.getKernelVersion @Composable fun Info(label: String, value: String) { @@ -37,15 +40,46 @@ fun Info(label: String, value: String) { @Composable fun Home() { + val statusIcon: Int + val statusText: String + val secondaryText: String + + val kernelVersion = getKernelVersion() val isManager = Natives.becomeManager() - Column(modifier = Modifier.fillMaxWidth()) { + if (kernelVersion.isGKI()) { + // GKI kernel + if (isManager) { + statusIcon = R.drawable.ic_status_working + statusText = "Working" + secondaryText = "Version: ${Natives.getVersion()}" + } else { + statusIcon = R.drawable.ic_status_supported + statusText = "Not installed" + secondaryText = "Click to install" + } + } else { + statusIcon = R.drawable.ic_status_unsupported + statusText = "Unsupported kernel" + secondaryText = "KernelSU only supports GKI kernels now" + } + val context = LocalContext.current + + Column(modifier = Modifier.fillMaxWidth()) { Card( modifier = Modifier .fillMaxWidth() .padding(6.dp) - .clickable { }, + .clickable { + if (kernelVersion.isGKI() && !isManager) { + Toast.makeText( + context, + "Unimplemented", + Toast.LENGTH_SHORT + ).show() + } + }, ) { Row( modifier = Modifier @@ -53,7 +87,7 @@ fun Home() { .padding(10.dp) ) { Image( - if (isManager) Icons.Filled.Done else Icons.Filled.Warning, + painter = painterResource(id = statusIcon), null, modifier = Modifier .size(64.dp) @@ -64,13 +98,13 @@ fun Home() { .padding(start = 10.dp), ) { Text( - text = if (isManager) "Installed" else "Not Installed", + text = statusText, fontSize = 20.sp, fontWeight = FontWeight.Bold ) Text( - text = if (isManager) "Version: ${Natives.getVersion()}" else "Click to Install", + text = secondaryText, fontSize = 15.sp, fontWeight = FontWeight.Normal ) @@ -104,7 +138,6 @@ fun Home() { } } - } } \ No newline at end of file diff --git a/manager/app/src/main/res/drawable/ic_status_supported.xml b/manager/app/src/main/res/drawable/ic_status_supported.xml new file mode 100644 index 00000000..77e8f060 --- /dev/null +++ b/manager/app/src/main/res/drawable/ic_status_supported.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/manager/app/src/main/res/drawable/ic_status_unsupported.xml b/manager/app/src/main/res/drawable/ic_status_unsupported.xml new file mode 100644 index 00000000..ca259820 --- /dev/null +++ b/manager/app/src/main/res/drawable/ic_status_unsupported.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/manager/app/src/main/res/drawable/ic_status_working.xml b/manager/app/src/main/res/drawable/ic_status_working.xml new file mode 100644 index 00000000..09b0ecec --- /dev/null +++ b/manager/app/src/main/res/drawable/ic_status_working.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file