diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Install.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Install.kt
index be24c21e..fdab4ce8 100644
--- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Install.kt
+++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Install.kt
@@ -1,5 +1,6 @@
package me.weishu.kernelsu.ui.screen
+import android.content.Intent
import android.net.Uri
import android.os.Environment
import android.util.Log
@@ -9,7 +10,9 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.ArrowBack
+import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material.icons.filled.Save
import androidx.compose.material3.*
import androidx.compose.runtime.*
@@ -26,6 +29,7 @@ import me.weishu.kernelsu.R
import me.weishu.kernelsu.ksuApp
import me.weishu.kernelsu.ui.util.LocalSnackbarHost
import me.weishu.kernelsu.ui.util.installModule
+import me.weishu.kernelsu.ui.util.rebootUserSpace
import java.io.File
import java.text.SimpleDateFormat
import java.util.*
@@ -40,13 +44,20 @@ import java.util.*
fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
var text by remember { mutableStateOf("") }
+ var showFloatAction by remember {
+ mutableStateOf(false)
+ }
val snackBarHost = LocalSnackbarHost.current
val scope = rememberCoroutineScope()
LaunchedEffect(Unit) {
withContext(Dispatchers.IO) {
- installModule(uri) {
+ installModule(uri, onFinish = { success ->
+ if (success) {
+ showFloatAction = true
+ }
+ }) {
text += "$it\n"
}
}
@@ -62,13 +73,33 @@ fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
scope.launch {
val format = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault())
val date = format.format(Date())
- val file = File(ksuApp.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "KernelSU_install_log_${date}.log")
+ val file = File(
+ ksuApp.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS),
+ "KernelSU_install_log_${date}.log"
+ )
file.writeText(text)
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")
}
}
)
},
+ floatingActionButton = {
+ if (showFloatAction) {
+ val reboot = stringResource(id = R.string.reboot)
+ ExtendedFloatingActionButton(
+ onClick = {
+ scope.launch {
+ withContext(Dispatchers.IO) {
+ rebootUserSpace()
+ }
+ }
+ },
+ icon = { Icon(Icons.Filled.Refresh, reboot) },
+ text = { Text(text = reboot) },
+ )
+ }
+
+ }
) { innerPadding ->
Column(
modifier = Modifier
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt
index 7911a94b..9c039216 100644
--- a/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt
+++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt
@@ -1,6 +1,9 @@
package me.weishu.kernelsu.ui.util
+import android.content.Context
import android.net.Uri
+import android.os.Build
+import android.os.PowerManager
import android.util.Log
import com.topjohnwu.superuser.CallbackList
import com.topjohnwu.superuser.ShellUtils
@@ -38,7 +41,7 @@ fun uninstallModule(id: String) : Boolean {
return result
}
-fun installModule(uri: Uri, onOutput: (String) -> Unit) : Boolean {
+fun installModule(uri: Uri, onFinish: (Boolean)->Unit, onOutput: (String) -> Unit) : Boolean {
val resolver = ksuApp.contentResolver
with(resolver.openInputStream(uri)) {
val file = File(ksuApp.cacheDir, "module.zip")
@@ -61,6 +64,17 @@ fun installModule(uri: Uri, onOutput: (String) -> Unit) : Boolean {
file.delete()
+ onFinish(result.isSuccess)
return result.isSuccess
}
+}
+
+fun rebootUserSpace() {
+ val pm = ksuApp.getSystemService(Context.POWER_SERVICE) as PowerManager
+ val shell = ksuApp.createRootShell()
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && pm.isRebootingUserspaceSupported) {
+ ShellUtils.fastCmdResult(shell, "svc power reboot userspace")
+ } else {
+ ShellUtils.fastCmdResult(shell, "reboot")
+ }
}
\ No newline at end of file
diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml
index 7ec26684..c6e7dfd2 100644
--- a/manager/app/src/main/res/values/strings.xml
+++ b/manager/app/src/main/res/values/strings.xml
@@ -21,4 +21,5 @@
Uninstall
Install
Install
+ Reboot