feat: add clear task (start fresh) option for lock task mode

This commit is contained in:
Tam Nguyen
2025-12-19 10:12:13 +11:00
parent dad57a8846
commit 68cb5395c0
3 changed files with 36 additions and 6 deletions

View File

@@ -874,7 +874,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
getLockTaskPackages() getLockTaskPackages()
} }
@RequiresApi(28) @RequiresApi(28)
fun startLockTaskMode(packageName: String, activity: String): Boolean { fun startLockTaskMode(packageName: String, activity: String, clearTask: Boolean): Boolean {
if (!DPM.isLockTaskPermitted(packageName)) { if (!DPM.isLockTaskPermitted(packageName)) {
val list = lockTaskPackages.value.map { it.name } + packageName val list = lockTaskPackages.value.map { it.name } + packageName
DPM.setLockTaskPackages(DAR, list.toTypedArray()) DPM.setLockTaskPackages(DAR, list.toTypedArray())
@@ -885,7 +885,10 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
Intent().setComponent(ComponentName(packageName, activity)) Intent().setComponent(ComponentName(packageName, activity))
} else PM.getLaunchIntentForPackage(packageName) } else PM.getLaunchIntentForPackage(packageName)
if (intent != null) { if (intent != null) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
or (if (clearTask) Intent.FLAG_ACTIVITY_CLEAR_TASK else 0)
)
application.startActivity(intent, options.toBundle()) application.startActivity(intent, options.toBundle())
application.startForegroundService(Intent(application, LockTaskService::class.java)) application.startForegroundService(Intent(application, LockTaskService::class.java))
return true return true

View File

@@ -31,6 +31,7 @@ import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.animateContentSize import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@@ -1150,7 +1151,7 @@ fun NearbyStreamingPolicyScreen(
fun LockTaskModeScreen( fun LockTaskModeScreen(
chosenPackage: Channel<String>, onChoosePackage: () -> Unit, chosenPackage: Channel<String>, onChoosePackage: () -> Unit,
lockTaskPackages: StateFlow<List<AppInfo>>, getLockTaskPackages: () -> Unit, lockTaskPackages: StateFlow<List<AppInfo>>, getLockTaskPackages: () -> Unit,
setLockTaskPackage: (String, Boolean) -> Unit, startLockTaskMode: (String, String) -> Boolean, setLockTaskPackage: (String, Boolean) -> Unit, startLockTaskMode: (String, String, Boolean) -> Boolean,
getLockTaskFeatures: () -> Int, setLockTaskFeature: (Int) -> String?, onNavigateUp: () -> Unit getLockTaskFeatures: () -> Int, setLockTaskFeature: (Int) -> String?, onNavigateUp: () -> Unit
) { ) {
val coroutine = rememberCoroutineScope() val coroutine = rememberCoroutineScope()
@@ -1205,7 +1206,7 @@ fun LockTaskModeScreen(
@RequiresApi(28) @RequiresApi(28)
@Composable @Composable
private fun StartLockTaskMode( private fun StartLockTaskMode(
startLockTaskMode: (String, String) -> Boolean, startLockTaskMode: (String, String, Boolean) -> Boolean,
chosenPackage: Channel<String>, onChoosePackage: () -> Unit chosenPackage: Channel<String>, onChoosePackage: () -> Unit
) { ) {
val context = LocalContext.current val context = LocalContext.current
@@ -1214,6 +1215,8 @@ private fun StartLockTaskMode(
var packageName by rememberSaveable { mutableStateOf("") } var packageName by rememberSaveable { mutableStateOf("") }
var activity by rememberSaveable { mutableStateOf("") } var activity by rememberSaveable { mutableStateOf("") }
var specifyActivity by rememberSaveable { mutableStateOf(false) } var specifyActivity by rememberSaveable { mutableStateOf(false) }
var clearTask by rememberSaveable { mutableStateOf(true) }
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
packageName = chosenPackage.receive() packageName = chosenPackage.receive()
} }
@@ -1228,7 +1231,30 @@ private fun StartLockTaskMode(
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = 4.dp), verticalAlignment = Alignment.CenterVertically .padding(top = 8.dp),
verticalAlignment = Alignment.CenterVertically
) {
Checkbox(
checked = clearTask,
onCheckedChange = { clearTask = it }
)
Text(
text = stringResource(R.string.lock_task_mode_start_clear_task),
modifier = Modifier
.padding(start = 8.dp)
.clickable(
indication = null,
interactionSource = remember { MutableInteractionSource() }
) {
clearTask = !clearTask
}
)
}
Row(
Modifier
.fillMaxWidth()
.padding(bottom = 4.dp),
verticalAlignment = Alignment.CenterVertically
) { ) {
Checkbox(specifyActivity, { Checkbox(specifyActivity, {
specifyActivity = it specifyActivity = it
@@ -1249,7 +1275,7 @@ private fun StartLockTaskMode(
.fillMaxWidth() .fillMaxWidth()
.padding(bottom = 5.dp), .padding(bottom = 5.dp),
onClick = { onClick = {
val result = startLockTaskMode(packageName, activity) val result = startLockTaskMode(packageName, activity, clearTask)
if (!result) context.showOperationResultToast(false) if (!result) context.showOperationResultToast(false)
}, },
enabled = packageName.isNotBlank() && (!specifyActivity || activity.isNotBlank()) enabled = packageName.isNotBlank() && (!specifyActivity || activity.isNotBlank())

View File

@@ -732,4 +732,5 @@
<string name="activate_method">Activate method</string> <string name="activate_method">Activate method</string>
<string name="adb_command">ADB command</string> <string name="adb_command">ADB command</string>
<string name="owndroid_warning">This app uses Device owner or Profile owner privileges. These privileges are extremely dangerous, please use them with caution. If used improperly, they may result in severe losses. The developers will not be responsible for this.</string> <string name="owndroid_warning">This app uses Device owner or Profile owner privileges. These privileges are extremely dangerous, please use them with caution. If used improperly, they may result in severe losses. The developers will not be responsible for this.</string>
<string name="lock_task_mode_start_clear_task">Clear task (start fresh)</string>
</resources> </resources>