Handle Dhizuku errors better (#154)

This commit is contained in:
BinTianqi
2025-08-16 21:45:41 +08:00
parent 9a7e427ddc
commit c7396eccf7
3 changed files with 33 additions and 28 deletions

View File

@@ -49,6 +49,7 @@ import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver 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.WorkModesScreen
import com.bintianqi.owndroid.dpm.WorkProfile import com.bintianqi.owndroid.dpm.WorkProfile
import com.bintianqi.owndroid.dpm.WorkProfileScreen import com.bintianqi.owndroid.dpm.WorkProfileScreen
import com.bintianqi.owndroid.dpm.checkPrivilege
import com.bintianqi.owndroid.dpm.dhizukuErrorStatus import com.bintianqi.owndroid.dpm.dhizukuErrorStatus
import com.bintianqi.owndroid.dpm.dhizukuPermissionGranted
import com.bintianqi.owndroid.dpm.getDPM import com.bintianqi.owndroid.dpm.getDPM
import com.bintianqi.owndroid.dpm.getReceiver import com.bintianqi.owndroid.dpm.getReceiver
import com.bintianqi.owndroid.dpm.setDefaultAffiliationID import com.bintianqi.owndroid.dpm.setDefaultAffiliationID
import com.bintianqi.owndroid.ui.Animations import com.bintianqi.owndroid.ui.Animations
import com.bintianqi.owndroid.ui.theme.OwnDroidTheme import com.bintianqi.owndroid.ui.theme.OwnDroidTheme
import com.rosan.dhizuku.api.Dhizuku
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@@ -259,6 +259,7 @@ class MainActivity : FragmentActivity() {
val locale = context.resources?.configuration?.locale val locale = context.resources?.configuration?.locale
zhCN = locale == Locale.SIMPLIFIED_CHINESE || locale == Locale.CHINESE || locale == Locale.CHINA zhCN = locale == Locale.SIMPLIFIED_CHINESE || locale == Locale.CHINESE || locale == Locale.CHINA
val vm by viewModels<MyViewModel>() val vm by viewModels<MyViewModel>()
checkPrivilege(this)
lifecycleScope.launch { delay(5000); setDefaultAffiliationID(context) } lifecycleScope.launch { delay(5000); setDefaultAffiliationID(context) }
setContent { setContent {
var appLockDialog by rememberSaveable { mutableStateOf(false) } var appLockDialog by rememberSaveable { mutableStateOf(false) }
@@ -274,16 +275,7 @@ class MainActivity : FragmentActivity() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
val sp = SharedPrefs(applicationContext) checkPrivilege(this)
if (sp.dhizuku) {
if (Dhizuku.init(applicationContext)) {
if (!dhizukuPermissionGranted()) { dhizukuErrorStatus.value = 2 }
} else {
sp.dhizuku = false
dhizukuErrorStatus.value = 1
}
}
updatePrivilege(this)
} }
} }
@@ -324,10 +316,6 @@ fun Home(vm: MyViewModel, onLock: () -> Unit) {
navController.navigate(Home) { navController.navigate(Home) {
popUpTo<WorkModes> { inclusive = true } popUpTo<WorkModes> { inclusive = true }
} }
}, {
navController.navigate(WorkModes(false)) {
popUpTo<Home> { inclusive = true }
}
}, ::navigate) }, ::navigate)
} }
composable<DhizukuServerSettings> { DhizukuServerSettingsScreen(::navigateUp) } composable<DhizukuServerSettings> { DhizukuServerSettingsScreen(::navigateUp) }
@@ -496,7 +484,14 @@ fun Home(vm: MyViewModel, onLock: () -> Unit) {
Toast.makeText(context, R.string.work_profile_activated, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.work_profile_activated, Toast.LENGTH_SHORT).show()
} }
} }
DhizukuErrorDialog() DhizukuErrorDialog {
dhizukuErrorStatus.value = 0
updatePrivilege(context)
navController.navigate(WorkModes(false)) {
popUpTo<Home> { inclusive = true }
launchSingleTop = true
}
}
} }
@Serializable private object Home @Serializable private object Home
@@ -570,7 +565,7 @@ fun HomePageItem(name: Int, imgVector: Int, onClick: () -> Unit) {
} }
@Composable @Composable
private fun DhizukuErrorDialog() { private fun DhizukuErrorDialog(onClose: () -> Unit) {
val status by dhizukuErrorStatus.collectAsState() val status by dhizukuErrorStatus.collectAsState()
if (status != 0) { if (status != 0) {
val sp = SharedPrefs(LocalContext.current) val sp = SharedPrefs(LocalContext.current)
@@ -578,9 +573,9 @@ private fun DhizukuErrorDialog() {
sp.dhizuku = false sp.dhizuku = false
} }
AlertDialog( AlertDialog(
onDismissRequest = { dhizukuErrorStatus.value = 0 }, onDismissRequest = {},
confirmButton = { confirmButton = {
TextButton(onClick = { dhizukuErrorStatus.value = 0 }) { TextButton(onClose) {
Text(stringResource(R.string.confirm)) Text(stringResource(R.string.confirm))
} }
}, },
@@ -595,7 +590,8 @@ private fun DhizukuErrorDialog() {
) )
if(sp.dhizuku) text += "\n" + stringResource(R.string.dhizuku_mode_disabled) if(sp.dhizuku) text += "\n" + stringResource(R.string.dhizuku_mode_disabled)
Text(text) Text(text)
} },
properties = DialogProperties(dismissOnBackPress = false, dismissOnClickOutside = false)
) )
} }
} }

View File

@@ -23,6 +23,7 @@ import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.SharedPrefs import com.bintianqi.owndroid.SharedPrefs
import com.bintianqi.owndroid.createShortcuts import com.bintianqi.owndroid.createShortcuts
import com.bintianqi.owndroid.myPrivilege import com.bintianqi.owndroid.myPrivilege
import com.bintianqi.owndroid.updatePrivilege
import com.rosan.dhizuku.api.Dhizuku import com.rosan.dhizuku.api.Dhizuku
import com.rosan.dhizuku.api.DhizukuBinderWrapper import com.rosan.dhizuku.api.DhizukuBinderWrapper
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@@ -526,3 +527,16 @@ fun handlePrivilegeChange(context: Context) {
sp.isApiEnabled = false 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)
}

View File

@@ -118,8 +118,7 @@ import kotlinx.serialization.json.Json
@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
@Composable @Composable
fun WorkModesScreen( fun WorkModesScreen(
params: WorkModes, onNavigateUp: () -> Unit, onActivate: () -> Unit, onDeactivate: () -> Unit, params: WorkModes, onNavigateUp: () -> Unit, onActivate: () -> Unit, onNavigate: (Any) -> Unit
onNavigate: (Any) -> Unit
) { ) {
val context = LocalContext.current val context = LocalContext.current
val coroutine = rememberCoroutineScope() val coroutine = rememberCoroutineScope()
@@ -129,10 +128,7 @@ fun WorkModesScreen(
LaunchedEffect(privilege) { LaunchedEffect(privilege) {
if (!params.canNavigateUp && privilege.device) { if (!params.canNavigateUp && privilege.device) {
delay(1000) delay(1000)
if (dialog != 3) { if (dialog != 3) dialog = 3 // Activated by ADB command
dialog = 0
onActivate() // Activated by ADB command, return to home screen
}
} }
} }
Scaffold( Scaffold(
@@ -379,7 +375,6 @@ fun WorkModesScreen(
dialog = 0 dialog = 0
updatePrivilege(context) updatePrivilege(context)
handlePrivilegeChange(context) handlePrivilegeChange(context)
onDeactivate()
}, },
enabled = time == 0, enabled = time == 0,
colors = ButtonDefaults.textButtonColors(contentColor = colorScheme.error) colors = ButtonDefaults.textButtonColors(contentColor = colorScheme.error)