manager: install screen add log and reboot
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package me.weishu.kernelsu.ui.screen
|
package me.weishu.kernelsu.ui.screen
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
@@ -9,7 +10,9 @@ import androidx.compose.foundation.layout.padding
|
|||||||
import androidx.compose.foundation.rememberScrollState
|
import androidx.compose.foundation.rememberScrollState
|
||||||
import androidx.compose.foundation.verticalScroll
|
import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.icons.Icons
|
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.ArrowBack
|
||||||
|
import androidx.compose.material.icons.filled.Refresh
|
||||||
import androidx.compose.material.icons.filled.Save
|
import androidx.compose.material.icons.filled.Save
|
||||||
import androidx.compose.material3.*
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.runtime.*
|
import androidx.compose.runtime.*
|
||||||
@@ -26,6 +29,7 @@ import me.weishu.kernelsu.R
|
|||||||
import me.weishu.kernelsu.ksuApp
|
import me.weishu.kernelsu.ksuApp
|
||||||
import me.weishu.kernelsu.ui.util.LocalSnackbarHost
|
import me.weishu.kernelsu.ui.util.LocalSnackbarHost
|
||||||
import me.weishu.kernelsu.ui.util.installModule
|
import me.weishu.kernelsu.ui.util.installModule
|
||||||
|
import me.weishu.kernelsu.ui.util.rebootUserSpace
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -40,13 +44,20 @@ import java.util.*
|
|||||||
fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
|
fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
|
||||||
|
|
||||||
var text by remember { mutableStateOf("") }
|
var text by remember { mutableStateOf("") }
|
||||||
|
var showFloatAction by remember {
|
||||||
|
mutableStateOf(false)
|
||||||
|
}
|
||||||
|
|
||||||
val snackBarHost = LocalSnackbarHost.current
|
val snackBarHost = LocalSnackbarHost.current
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
|
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
installModule(uri) {
|
installModule(uri, onFinish = { success ->
|
||||||
|
if (success) {
|
||||||
|
showFloatAction = true
|
||||||
|
}
|
||||||
|
}) {
|
||||||
text += "$it\n"
|
text += "$it\n"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -62,13 +73,33 @@ fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
|
|||||||
scope.launch {
|
scope.launch {
|
||||||
val format = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault())
|
val format = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault())
|
||||||
val date = format.format(Date())
|
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)
|
file.writeText(text)
|
||||||
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")
|
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 ->
|
) { innerPadding ->
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
package me.weishu.kernelsu.ui.util
|
package me.weishu.kernelsu.ui.util
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.PowerManager
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.topjohnwu.superuser.CallbackList
|
import com.topjohnwu.superuser.CallbackList
|
||||||
import com.topjohnwu.superuser.ShellUtils
|
import com.topjohnwu.superuser.ShellUtils
|
||||||
@@ -38,7 +41,7 @@ fun uninstallModule(id: String) : Boolean {
|
|||||||
return result
|
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
|
val resolver = ksuApp.contentResolver
|
||||||
with(resolver.openInputStream(uri)) {
|
with(resolver.openInputStream(uri)) {
|
||||||
val file = File(ksuApp.cacheDir, "module.zip")
|
val file = File(ksuApp.cacheDir, "module.zip")
|
||||||
@@ -61,6 +64,17 @@ fun installModule(uri: Uri, onOutput: (String) -> Unit) : Boolean {
|
|||||||
|
|
||||||
file.delete()
|
file.delete()
|
||||||
|
|
||||||
|
onFinish(result.isSuccess)
|
||||||
return 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")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -21,4 +21,5 @@
|
|||||||
<string name="uninstall">Uninstall</string>
|
<string name="uninstall">Uninstall</string>
|
||||||
<string name="module_install">Install</string>
|
<string name="module_install">Install</string>
|
||||||
<string name="install">Install</string>
|
<string name="install">Install</string>
|
||||||
|
<string name="reboot">Reboot</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user