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.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<MyViewModel>()
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<WorkModes> { inclusive = true }
}
}, {
navController.navigate(WorkModes(false)) {
popUpTo<Home> { inclusive = true }
}
}, ::navigate)
}
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()
}
}
DhizukuErrorDialog()
DhizukuErrorDialog {
dhizukuErrorStatus.value = 0
updatePrivilege(context)
navController.navigate(WorkModes(false)) {
popUpTo<Home> { 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)
)
}
}

View File

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

View File

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