manager: disabled back button and added action close button

This commit is contained in:
Rifat Azad
2024-12-26 20:49:42 +06:00
parent 090ae7fb2d
commit f356ece503
5 changed files with 49 additions and 23 deletions

View File

@@ -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,29 +92,41 @@ 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 = {
scope.launch { if (!isActionRunning) {
val format = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault()) scope.launch {
val date = format.format(Date()) val format = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault())
val file = File( val date = format.format(Date())
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), val file = File(
"KernelSU_Next_module_action_log_${date}.log" Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
) "KernelSU_Next_module_action_log_${date}.log"
file.writeText(logContent.toString()) )
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}") file.writeText(logContent.toString())
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),
@@ -146,4 +169,4 @@ private fun TopBar(onBack: () -> Unit = {}, onSave: () -> Unit = {}) {
} }
} }
) )
} }

View File

@@ -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>

View File

@@ -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>

View File

@@ -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
View File