[manager]: show status of kernel
This commit is contained in:
44
manager/app/src/main/java/me/weishu/kernelsu/Kernels.kt
Normal file
44
manager/app/src/main/java/me/weishu/kernelsu/Kernels.kt
Normal file
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,15 +1,16 @@
|
|||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.system.Os
|
import android.system.Os
|
||||||
|
import android.widget.Toast
|
||||||
import androidx.compose.foundation.Image
|
import androidx.compose.foundation.Image
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.*
|
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.Card
|
||||||
|
import androidx.compose.material3.Snackbar
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
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.SpanStyle
|
||||||
import androidx.compose.ui.text.buildAnnotatedString
|
import androidx.compose.ui.text.buildAnnotatedString
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
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.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import me.weishu.kernelsu.Natives
|
import me.weishu.kernelsu.Natives
|
||||||
|
import me.weishu.kernelsu.R
|
||||||
|
import me.weishu.kernelsu.getKernelVersion
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun Info(label: String, value: String) {
|
fun Info(label: String, value: String) {
|
||||||
@@ -37,15 +40,46 @@ fun Info(label: String, value: String) {
|
|||||||
@Composable
|
@Composable
|
||||||
fun Home() {
|
fun Home() {
|
||||||
|
|
||||||
|
val statusIcon: Int
|
||||||
|
val statusText: String
|
||||||
|
val secondaryText: String
|
||||||
|
|
||||||
|
val kernelVersion = getKernelVersion()
|
||||||
val isManager = Natives.becomeManager()
|
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(
|
Card(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.padding(6.dp)
|
.padding(6.dp)
|
||||||
.clickable { },
|
.clickable {
|
||||||
|
if (kernelVersion.isGKI() && !isManager) {
|
||||||
|
Toast.makeText(
|
||||||
|
context,
|
||||||
|
"Unimplemented",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
},
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
@@ -53,7 +87,7 @@ fun Home() {
|
|||||||
.padding(10.dp)
|
.padding(10.dp)
|
||||||
) {
|
) {
|
||||||
Image(
|
Image(
|
||||||
if (isManager) Icons.Filled.Done else Icons.Filled.Warning,
|
painter = painterResource(id = statusIcon),
|
||||||
null,
|
null,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.size(64.dp)
|
.size(64.dp)
|
||||||
@@ -64,13 +98,13 @@ fun Home() {
|
|||||||
.padding(start = 10.dp),
|
.padding(start = 10.dp),
|
||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
text = if (isManager) "Installed" else "Not Installed",
|
text = statusText,
|
||||||
fontSize = 20.sp,
|
fontSize = 20.sp,
|
||||||
fontWeight = FontWeight.Bold
|
fontWeight = FontWeight.Bold
|
||||||
)
|
)
|
||||||
|
|
||||||
Text(
|
Text(
|
||||||
text = if (isManager) "Version: ${Natives.getVersion()}" else "Click to Install",
|
text = secondaryText,
|
||||||
fontSize = 15.sp,
|
fontSize = 15.sp,
|
||||||
fontWeight = FontWeight.Normal
|
fontWeight = FontWeight.Normal
|
||||||
)
|
)
|
||||||
@@ -104,7 +138,6 @@ fun Home() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:height="24dp"
|
||||||
|
android:width="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path android:fillColor="#000" android:pathData="M13,13H11V7H13M13,17H11V15H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:height="24dp"
|
||||||
|
android:width="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path android:fillColor="#000" android:pathData="M12 2C17.5 2 22 6.5 22 12S17.5 22 12 22 2 17.5 2 12 6.5 2 12 2M12 4C10.1 4 8.4 4.6 7.1 5.7L18.3 16.9C19.3 15.5 20 13.8 20 12C20 7.6 16.4 4 12 4M16.9 18.3L5.7 7.1C4.6 8.4 4 10.1 4 12C4 16.4 7.6 20 12 20C13.9 20 15.6 19.4 16.9 18.3Z" />
|
||||||
|
</vector>
|
||||||
7
manager/app/src/main/res/drawable/ic_status_working.xml
Normal file
7
manager/app/src/main/res/drawable/ic_status_working.xml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:height="24dp"
|
||||||
|
android:width="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path android:fillColor="#000" android:pathData="M10,17L5,12L6.41,10.58L10,14.17L17.59,6.58L19,8M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
|
||||||
|
</vector>
|
||||||
Reference in New Issue
Block a user