You've already forked KernelSU-Next
mirror of
https://github.com/KernelSU-Next/KernelSU-Next.git
synced 2025-08-27 23:46:34 +00:00
manager: disabled back button and added action close button
This commit is contained in:
@@ -1,15 +1,22 @@
|
|||||||
package com.rifsxd.ksunext.ui.screen
|
package com.rifsxd.ksunext.ui.screen
|
||||||
|
|
||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
|
import androidx.activity.compose.BackHandler
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.padding
|
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.foundation.layout.WindowInsets
|
||||||
|
import androidx.compose.foundation.layout.WindowInsetsSides
|
||||||
|
import androidx.compose.foundation.layout.defaultMinSize
|
||||||
|
import androidx.compose.foundation.layout.safeDrawing
|
||||||
|
import androidx.compose.foundation.layout.only
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
import androidx.compose.material.icons.filled.Close
|
||||||
import androidx.compose.material.icons.filled.Save
|
import androidx.compose.material.icons.filled.Save
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.ExtendedFloatingActionButton
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.IconButton
|
import androidx.compose.material3.IconButton
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
@@ -49,12 +56,18 @@ import java.util.Locale
|
|||||||
@Destination<RootGraph>
|
@Destination<RootGraph>
|
||||||
fun ExecuteModuleActionScreen(navigator: DestinationsNavigator, moduleId: String) {
|
fun ExecuteModuleActionScreen(navigator: DestinationsNavigator, moduleId: String) {
|
||||||
var text by rememberSaveable { mutableStateOf("") }
|
var text by rememberSaveable { mutableStateOf("") }
|
||||||
var tempText : String
|
var tempText: String
|
||||||
val logContent = rememberSaveable { StringBuilder() }
|
val logContent = rememberSaveable { StringBuilder() }
|
||||||
val snackBarHost = LocalSnackbarHost.current
|
val snackBarHost = LocalSnackbarHost.current
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val scrollState = rememberScrollState()
|
val scrollState = rememberScrollState()
|
||||||
var actionResult: Boolean
|
var actionResult: Boolean
|
||||||
|
var isActionRunning by rememberSaveable { mutableStateOf(true) }
|
||||||
|
|
||||||
|
BackHandler(enabled = isActionRunning) {
|
||||||
|
// Disable back button if action is running
|
||||||
|
// TODO: Disable Destination Navbar to evade hang on destonation change caused by runModuleAction() in ui.util.KsuCli, users shoudln't get out of actionScreen if action is running
|
||||||
|
}
|
||||||
|
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
if (text.isNotEmpty()) {
|
if (text.isNotEmpty()) {
|
||||||
@@ -79,16 +92,15 @@ fun ExecuteModuleActionScreen(navigator: DestinationsNavigator, moduleId: String
|
|||||||
actionResult = it
|
actionResult = it
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (actionResult) navigator.popBackStack()
|
isActionRunning = false
|
||||||
}
|
}
|
||||||
|
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = {
|
topBar = {
|
||||||
TopBar(
|
TopBar(
|
||||||
onBack = {
|
isActionRunning = isActionRunning,
|
||||||
navigator.popBackStack()
|
|
||||||
},
|
|
||||||
onSave = {
|
onSave = {
|
||||||
|
if (!isActionRunning) {
|
||||||
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())
|
||||||
@@ -100,8 +112,21 @@ fun ExecuteModuleActionScreen(navigator: DestinationsNavigator, moduleId: String
|
|||||||
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")
|
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
floatingActionButton = {
|
||||||
|
if (!isActionRunning) {
|
||||||
|
ExtendedFloatingActionButton(
|
||||||
|
text = { Text("Go Back") },
|
||||||
|
icon = { Icon(Icons.Filled.Close, contentDescription = "Back") },
|
||||||
|
onClick = {
|
||||||
|
navigator.popBackStack()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal),
|
||||||
snackbarHost = { SnackbarHost(snackBarHost) }
|
snackbarHost = { SnackbarHost(snackBarHost) }
|
||||||
) { innerPadding ->
|
) { innerPadding ->
|
||||||
KeyEventBlocker {
|
KeyEventBlocker {
|
||||||
@@ -129,16 +154,14 @@ fun ExecuteModuleActionScreen(navigator: DestinationsNavigator, moduleId: String
|
|||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
private fun TopBar(onBack: () -> Unit = {}, onSave: () -> Unit = {}) {
|
private fun TopBar(isActionRunning: Boolean, onSave: () -> Unit = {}) {
|
||||||
TopAppBar(
|
TopAppBar(
|
||||||
title = { Text(stringResource(R.string.action)) },
|
title = { Text(stringResource(R.string.action)) },
|
||||||
navigationIcon = {
|
|
||||||
IconButton(
|
|
||||||
onClick = onBack
|
|
||||||
) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) }
|
|
||||||
},
|
|
||||||
actions = {
|
actions = {
|
||||||
IconButton(onClick = onSave) {
|
IconButton(
|
||||||
|
onClick = onSave,
|
||||||
|
enabled = !isActionRunning
|
||||||
|
) {
|
||||||
Icon(
|
Icon(
|
||||||
imageVector = Icons.Filled.Save,
|
imageVector = Icons.Filled.Save,
|
||||||
contentDescription = stringResource(id = R.string.save_log),
|
contentDescription = stringResource(id = R.string.save_log),
|
||||||
|
|||||||
@@ -100,6 +100,7 @@
|
|||||||
<string name="module_start_downloading">Mulai mengunduh: %s</string>
|
<string name="module_start_downloading">Mulai mengunduh: %s</string>
|
||||||
<string name="new_version_available">Tersedia versi terbaru %s, Klik untuk membarui.</string>
|
<string name="new_version_available">Tersedia versi terbaru %s, Klik untuk membarui.</string>
|
||||||
<string name="launch_app">Jalankan</string>
|
<string name="launch_app">Jalankan</string>
|
||||||
|
<string name="close">Menutup</string>
|
||||||
<string name="force_stop_app">Paksa berhenti</string>
|
<string name="force_stop_app">Paksa berhenti</string>
|
||||||
<string name="restart_app">Mulai ulang</string>
|
<string name="restart_app">Mulai ulang</string>
|
||||||
<string name="failed_to_update_sepolicy">Gagal membarui aturan SELinux pada: %s</string>
|
<string name="failed_to_update_sepolicy">Gagal membarui aturan SELinux pada: %s</string>
|
||||||
|
|||||||
@@ -100,6 +100,7 @@
|
|||||||
<string name="module_start_downloading">开始下载: %s</string>
|
<string name="module_start_downloading">开始下载: %s</string>
|
||||||
<string name="new_version_available">发现新版本:%s,点击升级。</string>
|
<string name="new_version_available">发现新版本:%s,点击升级。</string>
|
||||||
<string name="launch_app">启动</string>
|
<string name="launch_app">启动</string>
|
||||||
|
<string name="close">关闭</string>
|
||||||
<string name="force_stop_app">强制停止</string>
|
<string name="force_stop_app">强制停止</string>
|
||||||
<string name="restart_app">重新启动</string>
|
<string name="restart_app">重新启动</string>
|
||||||
<string name="failed_to_update_sepolicy">为:%s 更新SELinux规则失败</string>
|
<string name="failed_to_update_sepolicy">为:%s 更新SELinux规则失败</string>
|
||||||
|
|||||||
@@ -101,6 +101,7 @@
|
|||||||
<string name="module_start_downloading">Start downloading: %s</string>
|
<string name="module_start_downloading">Start downloading: %s</string>
|
||||||
<string name="new_version_available">New version %s is available, click to upgrade.</string>
|
<string name="new_version_available">New version %s is available, click to upgrade.</string>
|
||||||
<string name="launch_app">Launch</string>
|
<string name="launch_app">Launch</string>
|
||||||
|
<string name="close">Close</string>
|
||||||
<string name="force_stop_app">Force stop</string>
|
<string name="force_stop_app">Force stop</string>
|
||||||
<string name="restart_app">Restart</string>
|
<string name="restart_app">Restart</string>
|
||||||
<string name="failed_to_update_sepolicy">Failed to update SELinux rules for: %s</string>
|
<string name="failed_to_update_sepolicy">Failed to update SELinux rules for: %s</string>
|
||||||
|
|||||||
0
manager/gradlew
vendored
Normal file → Executable file
0
manager/gradlew
vendored
Normal file → Executable file
Reference in New Issue
Block a user