system manager: use dialog to confirm reboot or bug report

This commit is contained in:
BinTianqi
2024-05-30 13:48:39 +08:00
parent 5027c22626
commit a3f6fb76bc
3 changed files with 63 additions and 33 deletions

View File

@@ -57,6 +57,7 @@ import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.colorScheme
@@ -64,8 +65,10 @@ import androidx.compose.material3.MaterialTheme.typography
import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableIntStateOf
@@ -105,6 +108,8 @@ fun SystemManage(navCtrl:NavHostController) {
val localNavCtrl = rememberNavController() val localNavCtrl = rememberNavController()
val backStackEntry by localNavCtrl.currentBackStackEntryAsState() val backStackEntry by localNavCtrl.currentBackStackEntryAsState()
val scrollState = rememberScrollState() val scrollState = rememberScrollState()
val rebootDialog = remember { mutableStateOf(false) }
val bugReportDialog = remember { mutableStateOf(false) }
Scaffold( Scaffold(
topBar = { topBar = {
TopBar(backStackEntry,navCtrl,localNavCtrl) { TopBar(backStackEntry,navCtrl,localNavCtrl) {
@@ -125,11 +130,9 @@ fun SystemManage(navCtrl:NavHostController) {
popExitTransition = Animations.navHostPopExitTransition, popExitTransition = Animations.navHostPopExitTransition,
modifier = Modifier.padding(top = it.calculateTopPadding()) modifier = Modifier.padding(top = it.calculateTopPadding())
) { ) {
composable(route = "Home") { Home(localNavCtrl,scrollState) } composable(route = "Home") { Home(localNavCtrl, scrollState, rebootDialog, bugReportDialog) }
composable(route = "Switches") { Switches() } composable(route = "Switches") { Switches() }
composable(route = "Keyguard") { Keyguard() } composable(route = "Keyguard") { Keyguard() }
composable(route = "BugReport") { BugReport() }
composable(route = "Reboot") { Reboot() }
composable(route = "EditTime") { EditTime() } composable(route = "EditTime") { EditTime() }
composable(route = "PermissionPolicy") { PermissionPolicy() } composable(route = "PermissionPolicy") { PermissionPolicy() }
composable(route = "MTEPolicy") { MTEPolicy() } composable(route = "MTEPolicy") { MTEPolicy() }
@@ -142,10 +145,16 @@ fun SystemManage(navCtrl:NavHostController) {
composable(route = "WipeData") { WipeData() } composable(route = "WipeData") { WipeData() }
} }
} }
if(rebootDialog.value) {
RebootDialog(rebootDialog)
}
if(bugReportDialog.value) {
BugReportDialog(bugReportDialog)
}
} }
@Composable @Composable
private fun Home(navCtrl: NavHostController, scrollState: ScrollState) { private fun Home(navCtrl: NavHostController, scrollState: ScrollState, rebootDialog: MutableState<Boolean>, bugReportDialog: MutableState<Boolean>) {
val context = LocalContext.current val context = LocalContext.current
val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val receiver = ComponentName(context, Receiver::class.java) val receiver = ComponentName(context, Receiver::class.java)
@@ -160,8 +169,8 @@ private fun Home(navCtrl: NavHostController, scrollState: ScrollState) {
} }
SubPageItem(R.string.keyguard, "", R.drawable.screen_lock_portrait_fill0) { navCtrl.navigate("Keyguard") } SubPageItem(R.string.keyguard, "", R.drawable.screen_lock_portrait_fill0) { navCtrl.navigate("Keyguard") }
if(VERSION.SDK_INT >= 24) { if(VERSION.SDK_INT >= 24) {
SubPageItem(R.string.request_bug_report, "", R.drawable.bug_report_fill0) { navCtrl.navigate("BugReport") } SubPageItem(R.string.bug_report, "", R.drawable.bug_report_fill0) { bugReportDialog.value = true }
SubPageItem(R.string.reboot, "", R.drawable.restart_alt_fill0) { navCtrl.navigate("Reboot") } SubPageItem(R.string.reboot, "", R.drawable.restart_alt_fill0) { rebootDialog.value = true }
} }
if(VERSION.SDK_INT >= 28) { if(VERSION.SDK_INT >= 28) {
SubPageItem(R.string.edit_time, "", R.drawable.schedule_fill0) { navCtrl.navigate("EditTime") } SubPageItem(R.string.edit_time, "", R.drawable.schedule_fill0) { navCtrl.navigate("EditTime") }
@@ -323,41 +332,58 @@ private fun Keyguard() {
@SuppressLint("NewApi") @SuppressLint("NewApi")
@Composable @Composable
private fun BugReport() { fun BugReportDialog(status: MutableState<Boolean>) {
val context = LocalContext.current val context = LocalContext.current
val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val receiver = ComponentName(context,Receiver::class.java) val receiver = ComponentName(context,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp)) { AlertDialog(
Spacer(Modifier.padding(vertical = 10.dp)) onDismissRequest = { status.value = false },
Button( title = { Text(stringResource(R.string.bug_report)) },
text = { Text(stringResource(R.string.confirm_bug_report)) },
dismissButton = {
TextButton(onClick = { status.value = false }) {
Text(stringResource(R.string.cancel))
}
},
confirmButton = {
TextButton(
onClick = { onClick = {
val result = dpm.requestBugreport(receiver) val result = dpm.requestBugreport(receiver)
Toast.makeText(context, if(result) R.string.success else R.string.fail, Toast.LENGTH_SHORT).show() Toast.makeText(context, if(result) R.string.success else R.string.fail, Toast.LENGTH_SHORT).show()
}, }
modifier = Modifier.fillMaxWidth(),
enabled = isDeviceOwner(dpm)
) { ) {
Text(stringResource(R.string.request_bug_report)) Text(stringResource(R.string.confirm))
}
} }
},
modifier = Modifier.fillMaxWidth()
)
} }
@SuppressLint("NewApi") @SuppressLint("NewApi")
@Composable @Composable
private fun Reboot() { fun RebootDialog(status: MutableState<Boolean>) {
val context = LocalContext.current val context = LocalContext.current
val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val receiver = ComponentName(context,Receiver::class.java) val receiver = ComponentName(context,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp)) { AlertDialog(
Spacer(Modifier.padding(vertical = 10.dp)) onDismissRequest = { status.value = false },
Button( title = { Text(stringResource(R.string.reboot)) },
text = { Text(stringResource(R.string.confirm_reboot)) },
dismissButton = {
TextButton(onClick = { status.value = false }) {
Text(stringResource(R.string.cancel))
}
},
confirmButton = {
TextButton(
onClick = { dpm.reboot(receiver) }, onClick = { dpm.reboot(receiver) },
enabled = isDeviceOwner(dpm), colors = ButtonDefaults.textButtonColors(contentColor = colorScheme.error)
modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.reboot)) Text(stringResource(R.string.reboot))
} }
} },
modifier = Modifier.fillMaxWidth()
)
} }
@SuppressLint("NewApi") @SuppressLint("NewApi")

View File

@@ -120,8 +120,10 @@
<string name="require_no_password_to_disable">禁用需要无密码</string> <string name="require_no_password_to_disable">禁用需要无密码</string>
<string name="lock_now">立即锁屏</string> <string name="lock_now">立即锁屏</string>
<string name="require_enter_password_again">需要重新输入密码</string> <string name="require_enter_password_again">需要重新输入密码</string>
<string name="request_bug_report">请求错误报告</string> <string name="bug_report">错误报告</string>
<string name="confirm_bug_report">请求错误报告?</string>
<string name="reboot">重启</string> <string name="reboot">重启</string>
<string name="confirm_reboot">确定重启?</string>
<string name="edit_time">修改时间</string> <string name="edit_time">修改时间</string>
<string name="from_epoch_to_target_time">从Epoch(1970/1/1 00:00:00 UTC)到你想设置的时间(毫秒)</string> <string name="from_epoch_to_target_time">从Epoch(1970/1/1 00:00:00 UTC)到你想设置的时间(毫秒)</string>
<string name="get_current_time">获取当前时间</string> <string name="get_current_time">获取当前时间</string>

View File

@@ -131,8 +131,10 @@
<string name="require_no_password_to_disable">Disable keyguard require no password is set. </string> <string name="require_no_password_to_disable">Disable keyguard require no password is set. </string>
<string name="lock_now">Lock screen now</string> <string name="lock_now">Lock screen now</string>
<string name="require_enter_password_again">Require re-enter password</string> <string name="require_enter_password_again">Require re-enter password</string>
<string name="request_bug_report">Request bug report</string> <string name="bug_report">Bug report</string>
<string name="confirm_bug_report">Request bug report?</string>
<string name="reboot">Reboot</string> <string name="reboot">Reboot</string>
<string name="confirm_reboot">Confirm reboot?</string>
<string name="edit_time">Edit time</string> <string name="edit_time">Edit time</string>
<string name="from_epoch_to_target_time">From Epoch(1970/1/1 00:00:00 UTC) to the time you want to set(ms)</string> <string name="from_epoch_to_target_time">From Epoch(1970/1/1 00:00:00 UTC) to the time you want to set(ms)</string>
<string name="get_current_time">Current time</string> <string name="get_current_time">Current time</string>