From c7396eccf747c5f033fa216f35a5d938b2685987 Mon Sep 17 00:00:00 2001 From: BinTianqi Date: Sat, 16 Aug 2025 21:45:41 +0800 Subject: [PATCH] Handle Dhizuku errors better (#154) --- .../com/bintianqi/owndroid/MainActivity.kt | 38 +++++++++---------- .../java/com/bintianqi/owndroid/dpm/DPM.kt | 14 +++++++ .../com/bintianqi/owndroid/dpm/Permissions.kt | 9 +---- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt b/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt index a34e6cc..4a33159 100644 --- a/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt +++ b/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt @@ -49,6 +49,7 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.DialogProperties import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver @@ -235,14 +236,13 @@ import com.bintianqi.owndroid.dpm.WorkModes import com.bintianqi.owndroid.dpm.WorkModesScreen import com.bintianqi.owndroid.dpm.WorkProfile import com.bintianqi.owndroid.dpm.WorkProfileScreen +import com.bintianqi.owndroid.dpm.checkPrivilege import com.bintianqi.owndroid.dpm.dhizukuErrorStatus -import com.bintianqi.owndroid.dpm.dhizukuPermissionGranted import com.bintianqi.owndroid.dpm.getDPM import com.bintianqi.owndroid.dpm.getReceiver import com.bintianqi.owndroid.dpm.setDefaultAffiliationID import com.bintianqi.owndroid.ui.Animations import com.bintianqi.owndroid.ui.theme.OwnDroidTheme -import com.rosan.dhizuku.api.Dhizuku import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.serialization.Serializable @@ -259,6 +259,7 @@ class MainActivity : FragmentActivity() { val locale = context.resources?.configuration?.locale zhCN = locale == Locale.SIMPLIFIED_CHINESE || locale == Locale.CHINESE || locale == Locale.CHINA val vm by viewModels() + checkPrivilege(this) lifecycleScope.launch { delay(5000); setDefaultAffiliationID(context) } setContent { var appLockDialog by rememberSaveable { mutableStateOf(false) } @@ -274,16 +275,7 @@ class MainActivity : FragmentActivity() { override fun onResume() { super.onResume() - val sp = SharedPrefs(applicationContext) - if (sp.dhizuku) { - if (Dhizuku.init(applicationContext)) { - if (!dhizukuPermissionGranted()) { dhizukuErrorStatus.value = 2 } - } else { - sp.dhizuku = false - dhizukuErrorStatus.value = 1 - } - } - updatePrivilege(this) + checkPrivilege(this) } } @@ -324,10 +316,6 @@ fun Home(vm: MyViewModel, onLock: () -> Unit) { navController.navigate(Home) { popUpTo { inclusive = true } } - }, { - navController.navigate(WorkModes(false)) { - popUpTo { inclusive = true } - } }, ::navigate) } composable { DhizukuServerSettingsScreen(::navigateUp) } @@ -496,7 +484,14 @@ fun Home(vm: MyViewModel, onLock: () -> Unit) { Toast.makeText(context, R.string.work_profile_activated, Toast.LENGTH_SHORT).show() } } - DhizukuErrorDialog() + DhizukuErrorDialog { + dhizukuErrorStatus.value = 0 + updatePrivilege(context) + navController.navigate(WorkModes(false)) { + popUpTo { inclusive = true } + launchSingleTop = true + } + } } @Serializable private object Home @@ -570,7 +565,7 @@ fun HomePageItem(name: Int, imgVector: Int, onClick: () -> Unit) { } @Composable -private fun DhizukuErrorDialog() { +private fun DhizukuErrorDialog(onClose: () -> Unit) { val status by dhizukuErrorStatus.collectAsState() if (status != 0) { val sp = SharedPrefs(LocalContext.current) @@ -578,9 +573,9 @@ private fun DhizukuErrorDialog() { sp.dhizuku = false } AlertDialog( - onDismissRequest = { dhizukuErrorStatus.value = 0 }, + onDismissRequest = {}, confirmButton = { - TextButton(onClick = { dhizukuErrorStatus.value = 0 }) { + TextButton(onClose) { Text(stringResource(R.string.confirm)) } }, @@ -595,7 +590,8 @@ private fun DhizukuErrorDialog() { ) if(sp.dhizuku) text += "\n" + stringResource(R.string.dhizuku_mode_disabled) Text(text) - } + }, + properties = DialogProperties(dismissOnBackPress = false, dismissOnClickOutside = false) ) } } diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt index abda12e..914cbd0 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt @@ -23,6 +23,7 @@ import com.bintianqi.owndroid.R import com.bintianqi.owndroid.SharedPrefs import com.bintianqi.owndroid.createShortcuts import com.bintianqi.owndroid.myPrivilege +import com.bintianqi.owndroid.updatePrivilege import com.rosan.dhizuku.api.Dhizuku import com.rosan.dhizuku.api.DhizukuBinderWrapper import kotlinx.coroutines.flow.MutableStateFlow @@ -526,3 +527,16 @@ fun handlePrivilegeChange(context: Context) { sp.isApiEnabled = false } } + +fun checkPrivilege(context: Context) { + val sp = SharedPrefs(context) + if (sp.dhizuku) { + if (Dhizuku.init(context)) { + if (!dhizukuPermissionGranted()) { dhizukuErrorStatus.value = 2 } + } else { + sp.dhizuku = false + dhizukuErrorStatus.value = 1 + } + } + updatePrivilege(context) +} diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt index 8669c31..6f0202f 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt @@ -118,8 +118,7 @@ import kotlinx.serialization.json.Json @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @Composable fun WorkModesScreen( - params: WorkModes, onNavigateUp: () -> Unit, onActivate: () -> Unit, onDeactivate: () -> Unit, - onNavigate: (Any) -> Unit + params: WorkModes, onNavigateUp: () -> Unit, onActivate: () -> Unit, onNavigate: (Any) -> Unit ) { val context = LocalContext.current val coroutine = rememberCoroutineScope() @@ -129,10 +128,7 @@ fun WorkModesScreen( LaunchedEffect(privilege) { if (!params.canNavigateUp && privilege.device) { delay(1000) - if (dialog != 3) { - dialog = 0 - onActivate() // Activated by ADB command, return to home screen - } + if (dialog != 3) dialog = 3 // Activated by ADB command } } Scaffold( @@ -379,7 +375,6 @@ fun WorkModesScreen( dialog = 0 updatePrivilege(context) handlePrivilegeChange(context) - onDeactivate() }, enabled = time == 0, colors = ButtonDefaults.textButtonColors(contentColor = colorScheme.error)