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