From b452005ada15e3f734234e157f3bee2aad9a5104 Mon Sep 17 00:00:00 2001 From: BinTianqi Date: Tue, 13 Aug 2024 16:11:54 +0800 Subject: [PATCH] fix some problems of AppControlDialog use state to control SwitchItem --- .../com/bintianqi/owndroid/MainActivity.kt | 3 + .../java/com/bintianqi/owndroid/Receiver.kt | 3 + .../java/com/bintianqi/owndroid/Setting.kt | 3 +- .../owndroid/dpm/ApplicationManage.kt | 195 ++++++++++-------- .../java/com/bintianqi/owndroid/dpm/DPM.kt | 11 + .../bintianqi/owndroid/dpm/ManagedProfile.kt | 9 +- .../com/bintianqi/owndroid/dpm/Network.kt | 2 +- .../com/bintianqi/owndroid/dpm/Password.kt | 1 - .../com/bintianqi/owndroid/dpm/Permissions.kt | 5 +- .../com/bintianqi/owndroid/dpm/UserManager.kt | 1 - .../bintianqi/owndroid/dpm/UserRestriction.kt | 2 +- .../com/bintianqi/owndroid/ui/Components.kt | 19 +- app/src/main/res/values-tr/strings.xml | 7 - app/src/main/res/values-zh-rCN/strings.xml | 7 - app/src/main/res/values/strings.xml | 7 - 15 files changed, 149 insertions(+), 126 deletions(-) diff --git a/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt b/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt index 9c14f22..9d5b268 100644 --- a/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt +++ b/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt @@ -66,6 +66,7 @@ import com.bintianqi.owndroid.dpm.getReceiver import com.bintianqi.owndroid.dpm.isDeviceAdmin import com.bintianqi.owndroid.dpm.isDeviceOwner import com.bintianqi.owndroid.dpm.isProfileOwner +import com.bintianqi.owndroid.dpm.toggleInstallAppActivity import com.bintianqi.owndroid.ui.Animations import com.bintianqi.owndroid.ui.theme.OwnDroidTheme import com.rosan.dhizuku.api.Dhizuku @@ -91,6 +92,7 @@ class MainActivity : FragmentActivity() { } val locale = applicationContext.resources?.configuration?.locale zhCN = locale == Locale.SIMPLIFIED_CHINESE || locale == Locale.CHINESE || locale == Locale.CHINA + toggleInstallAppActivity() setContent { val materialYou = remember { mutableStateOf(sharedPref.getBoolean("material_you", true)) } val blackTheme = remember { mutableStateOf(sharedPref.getBoolean("black_theme", false)) } @@ -284,6 +286,7 @@ private fun DhizukuErrorDialog() { val context = LocalContext.current val sharedPref = context.getSharedPreferences("data", Context.MODE_PRIVATE) LaunchedEffect(Unit) { + context.toggleInstallAppActivity() delay(200) sharedPref.edit().putBoolean("dhizuku", false).apply() } diff --git a/app/src/main/java/com/bintianqi/owndroid/Receiver.kt b/app/src/main/java/com/bintianqi/owndroid/Receiver.kt index c73f408..f284141 100644 --- a/app/src/main/java/com/bintianqi/owndroid/Receiver.kt +++ b/app/src/main/java/com/bintianqi/owndroid/Receiver.kt @@ -25,11 +25,13 @@ import com.bintianqi.owndroid.dpm.getReceiver import com.bintianqi.owndroid.dpm.isDeviceAdmin import com.bintianqi.owndroid.dpm.isDeviceOwner import com.bintianqi.owndroid.dpm.isProfileOwner +import com.bintianqi.owndroid.dpm.toggleInstallAppActivity import kotlinx.coroutines.flow.MutableStateFlow class Receiver : DeviceAdminReceiver() { override fun onEnabled(context: Context, intent: Intent) { super.onEnabled(context, intent) + context.toggleInstallAppActivity() if(context.isDeviceAdmin || context.isProfileOwner || context.isDeviceOwner){ Toast.makeText(context, context.getString(R.string.onEnabled), Toast.LENGTH_SHORT).show() } @@ -37,6 +39,7 @@ class Receiver : DeviceAdminReceiver() { override fun onDisabled(context: Context, intent: Intent) { super.onDisabled(context, intent) + context.toggleInstallAppActivity() backToHomeStateFlow.value = true Toast.makeText(context, R.string.onDisabled, Toast.LENGTH_SHORT).show() } diff --git a/app/src/main/java/com/bintianqi/owndroid/Setting.kt b/app/src/main/java/com/bintianqi/owndroid/Setting.kt index 0998e3a..0d93298 100644 --- a/app/src/main/java/com/bintianqi/owndroid/Setting.kt +++ b/app/src/main/java/com/bintianqi/owndroid/Setting.kt @@ -109,8 +109,7 @@ private fun AuthSettings() { var auth by remember{ mutableStateOf(sharedPref.getBoolean("auth",false)) } Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) { SwitchItem( - R.string.lock_owndroid, "", null, - { auth }, + R.string.lock_owndroid, "", null, auth, { sharedPref.edit().putBoolean("auth", it).apply() auth = sharedPref.getBoolean("auth", false) diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/ApplicationManage.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/ApplicationManage.kt index 2805775..7301b76 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/ApplicationManage.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/ApplicationManage.kt @@ -94,10 +94,6 @@ import com.bintianqi.owndroid.ui.SubPageItem import com.bintianqi.owndroid.ui.SwitchItem import java.util.concurrent.Executors -private var dialogConfirmButtonAction = {} -private var dialogDismissButtonAction = {} -private var dialogGetStatus = { false } - @OptIn(ExperimentalMaterial3Api::class) @Composable fun ApplicationManage(navCtrl:NavHostController, dialogStatus: MutableIntState) { @@ -166,10 +162,9 @@ fun ApplicationManage(navCtrl:NavHostController, dialogStatus: MutableIntState) } when(dialogStatus.intValue) { 0 -> {} - 4 -> EnableSystemAppDialog(dialogStatus, pkgName) - 5 -> ClearAppDataDialog(dialogStatus, pkgName) - 6 -> DefaultDialerAppDialog(dialogStatus, pkgName) - else -> AppControlDialog(dialogStatus) + 1 -> EnableSystemAppDialog(dialogStatus, pkgName) + 2 -> ClearAppDataDialog(dialogStatus, pkgName) + 3 -> DefaultDialerAppDialog(dialogStatus, pkgName) } LaunchedEffect(dialogStatus.intValue) { focusMgr.clearFocus() @@ -185,9 +180,35 @@ private fun Home( val context = LocalContext.current val dpm = context.getDPM() val receiver = context.getReceiver() - val sharedPrefs = context.getSharedPreferences("data", Context.MODE_PRIVATE) val deviceOwner = context.isDeviceOwner val profileOwner = context.isProfileOwner + var suspend by remember { mutableStateOf(false) } + suspend = try{ if(VERSION.SDK_INT >= 24) dpm.isPackageSuspended(receiver, pkgName) else false } + catch(e:NameNotFoundException) { false } + catch(e:IllegalArgumentException) { false } + var hide by remember { mutableStateOf(false) } + hide = dpm.isApplicationHidden(receiver, pkgName) + var blockUninstall by remember { mutableStateOf(false) } + blockUninstall = dpm.isUninstallBlocked(receiver,pkgName) + var appControlDialog by remember { mutableStateOf(false) } + var appControlAction by remember { mutableIntStateOf(0) } + val focusMgr = LocalFocusManager.current + val appControl: (Boolean) -> Unit = { + when(appControlAction) { + 1 -> if(VERSION.SDK_INT >= 24) dpm.setPackagesSuspended(receiver, arrayOf(pkgName), it) + 2 -> dpm.setApplicationHidden(receiver, pkgName, it) + 3 -> dpm.setUninstallBlocked(receiver, pkgName, it) + } + when(appControlAction) { + 1 -> { + suspend = try{ if(VERSION.SDK_INT >= 24) dpm.isPackageSuspended(receiver, pkgName) else false } + catch(e:NameNotFoundException) { false } + catch(e:IllegalArgumentException) { false } + } + 2 -> hide = dpm.isApplicationHidden(receiver,pkgName) + 3 -> blockUninstall = dpm.isUninstallBlocked(receiver,pkgName) + } + } Column( modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()) ) { @@ -201,53 +222,33 @@ private fun Home( startActivity(context, intent, null) } if(VERSION.SDK_INT >= 24 && (deviceOwner || profileOwner)) { - val getSuspendStatus = { - try{ dpm.isPackageSuspended(receiver, pkgName) } - catch(e:NameNotFoundException) { false } - catch(e:IllegalArgumentException) { false } - } SwitchItem( title = R.string.suspend, desc = "", icon = R.drawable.block_fill0, - getState = getSuspendStatus, - onCheckedChange = { dpm.setPackagesSuspended(receiver, arrayOf(pkgName), it) }, - onClickBlank = { - dialogGetStatus = getSuspendStatus - dialogConfirmButtonAction = { dpm.setPackagesSuspended(receiver, arrayOf(pkgName), true) } - dialogDismissButtonAction = { dpm.setPackagesSuspended(receiver, arrayOf(pkgName), false) } - dialogStatus.intValue = 1 - } + state = suspend, + onCheckedChange = { appControlAction = 1; appControl(it) }, + onClickBlank = { appControlAction = 1; appControlDialog = true } ) } if(deviceOwner || profileOwner) { SwitchItem( title = R.string.hide, desc = stringResource(R.string.isapphidden_desc), icon = R.drawable.visibility_off_fill0, - getState = { dpm.isApplicationHidden(receiver,pkgName) }, - onCheckedChange = { dpm.setApplicationHidden(receiver, pkgName, it) }, - onClickBlank = { - dialogGetStatus = { dpm.isApplicationHidden(receiver,pkgName) } - dialogConfirmButtonAction = { dpm.setApplicationHidden(receiver, pkgName, true) } - dialogDismissButtonAction = { dpm.setApplicationHidden(receiver, pkgName, false) } - dialogStatus.intValue = 2 - } + state = hide, + onCheckedChange = { appControlAction = 2; appControl(it) }, + onClickBlank = { appControlAction = 2; appControlDialog = true } ) } if(deviceOwner || profileOwner) { SwitchItem( title = R.string.block_uninstall, desc = "", icon = R.drawable.delete_forever_fill0, - getState = { dpm.isUninstallBlocked(receiver,pkgName) }, - onCheckedChange = { dpm.setUninstallBlocked(receiver,pkgName,it) }, - onClickBlank = { - dialogGetStatus = { dpm.isUninstallBlocked(receiver,pkgName) } - dialogConfirmButtonAction = { dpm.setUninstallBlocked(receiver,pkgName,true) } - dialogDismissButtonAction = { dpm.setUninstallBlocked(receiver,pkgName,false) } - dialogStatus.intValue = 3 - } + state = blockUninstall, + onCheckedChange = { appControlAction = 3; appControl(it) }, + onClickBlank = { appControlAction = 3; appControlDialog = true } ) } - if(VERSION.SDK_INT>=24 && (deviceOwner || profileOwner)) { + if(VERSION.SDK_INT >= 24 && (deviceOwner || profileOwner)) { SubPageItem(R.string.always_on_vpn, "", R.drawable.vpn_key_fill0) { navCtrl.navigate("AlwaysOnVpn") } } - if((VERSION.SDK_INT>=33&&profileOwner)||(VERSION.SDK_INT>=30&&deviceOwner)) { + if((VERSION.SDK_INT >= 33 && profileOwner) || (VERSION.SDK_INT >= 30 && deviceOwner)) { SubPageItem(R.string.ucd, "", R.drawable.do_not_touch_fill0) { navCtrl.navigate("UserControlDisabled") } } if(VERSION.SDK_INT>=23&&(deviceOwner||profileOwner)) { @@ -270,7 +271,7 @@ private fun Home( } if(deviceOwner || profileOwner) { SubPageItem(R.string.enable_system_app, "", R.drawable.enable_fill0) { - if(pkgName != "") dialogStatus.intValue = 4 + if(pkgName != "") dialogStatus.intValue = 1 } } if(VERSION.SDK_INT >= 28 && deviceOwner) { @@ -278,21 +279,74 @@ private fun Home( } if(VERSION.SDK_INT >= 28 && (deviceOwner || profileOwner)) { SubPageItem(R.string.clear_app_storage, "", R.drawable.mop_fill0) { - if(pkgName != "") dialogStatus.intValue = 5 + if(pkgName != "") dialogStatus.intValue = 2 } } - if(!sharedPrefs.getBoolean("dhizuku", false)) { - SubPageItem(R.string.install_app, "", R.drawable.install_mobile_fill0) { navCtrl.navigate("InstallApp") } - } + SubPageItem(R.string.install_app, "", R.drawable.install_mobile_fill0) { navCtrl.navigate("InstallApp") } SubPageItem(R.string.uninstall_app, "", R.drawable.delete_fill0) { navCtrl.navigate("UninstallApp") } if(VERSION.SDK_INT >= 34 && (deviceOwner || dpm.isOrgProfile(receiver))) { SubPageItem(R.string.set_default_dialer, "", R.drawable.call_fill0) { - if(pkgName != "") dialogStatus.intValue = 6 + if(pkgName != "") dialogStatus.intValue = 3 } } Spacer(Modifier.padding(vertical = 30.dp)) LaunchedEffect(Unit) { fileUriFlow.value = Uri.parse("") } } + if(appControlDialog) { + LaunchedEffect(Unit) { + focusMgr.clearFocus() + } + AlertDialog( + onDismissRequest = { appControlDialog = false }, + title = { + Text( + text = stringResource( + when(appControlAction) { + 1 -> R.string.suspend + 2 -> R.string.hide + 3 -> R.string.block_uninstall + 4 -> R.string.always_on_vpn + else -> R.string.unknown + } + ), + style = typography.headlineMedium, + modifier = Modifier.padding(start = 5.dp) + ) + }, + text = { + val enabled = when(appControlAction){ + 1 -> suspend + 2 -> hide + 3 -> blockUninstall + else -> false + } + Text( + text = stringResource(R.string.current_state, stringResource(if(enabled) R.string.enabled else R.string.disabled)), + modifier = Modifier.padding(start = 5.dp, top = 5.dp, bottom = 5.dp) + ) + }, + confirmButton = { + TextButton( + onClick = { + appControl(true) + appControlDialog = false + } + ) { + Text(text = stringResource(R.string.enable)) + } + }, + dismissButton = { + TextButton( + onClick = { + appControl(false) + appControlDialog = false + } + ) { + Text(text = stringResource(R.string.disable)) + } + } + ) + } } @SuppressLint("NewApi") @@ -319,7 +373,7 @@ fun AlwaysOnVPNPackage(pkgName: String) { Spacer(Modifier.padding(vertical = 10.dp)) Text(text = stringResource(R.string.always_on_vpn), style = typography.headlineLarge, modifier = Modifier.padding(vertical = 8.dp)) Text(text = stringResource(R.string.current_app_is) + pkg, modifier = Modifier.padding(vertical = 8.dp)) - SwitchItem(R.string.enable_lockdown, "", null, { lockdown }, { lockdown = it }, padding = false) + SwitchItem(R.string.enable_lockdown, "", null, lockdown, { lockdown = it }, padding = false) Spacer(Modifier.padding(vertical = 5.dp)) Button( onClick = { setAlwaysOnVpn(pkgName, lockdown); refresh() }, @@ -809,7 +863,7 @@ private fun PermittedIME(pkgName: String) { Text(text = stringResource(R.string.permitted_ime), style = typography.headlineLarge) Spacer(Modifier.padding(vertical = 5.dp)) SwitchItem( - R.string.allow_all, "", null, { allowAll }, + R.string.allow_all, "", null, allowAll, { dpm.setPermittedInputMethods(receiver, if(it) null else listOf()) refresh() @@ -963,6 +1017,7 @@ private fun InstallApp() { val context = LocalContext.current val focusMgr = LocalFocusManager.current val selected = fileUriFlow.collectAsState().value != Uri.parse("") + val sharedPrefs = context.getSharedPreferences("data", Context.MODE_PRIVATE) Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) { Spacer(Modifier.padding(vertical = 10.dp)) Text(text = stringResource(R.string.install_app), style = typography.headlineLarge) @@ -988,6 +1043,7 @@ private fun InstallApp() { intent.data = fileUriFlow.value context.startActivity(intent) }, + enabled = !sharedPrefs.getBoolean("dhizuku", false) && context.isDeviceOwner, modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.silent_install)) @@ -1121,46 +1177,3 @@ private fun EnableSystemAppDialog(status: MutableIntState, pkgName: String) { modifier = Modifier.fillMaxWidth() ) } - -@Composable -private fun AppControlDialog(status: MutableIntState) { - val enabled = dialogGetStatus() - AlertDialog( - onDismissRequest = { status.intValue = 0 }, - title = { - Text( - text = stringResource( - when(status.intValue) { - 1 -> R.string.suspend - 2 -> R.string.hide - 3 -> R.string.block_uninstall - 4 -> R.string.always_on_vpn - else -> R.string.unknown - } - ), - style = typography.headlineMedium, - modifier = Modifier.padding(start = 5.dp) - ) - }, - text = { - Text( - text = stringResource(R.string.current_status_is) + stringResource(if(enabled) R.string.enabled else R.string.disabled), - modifier = Modifier.padding(start = 5.dp, top = 5.dp, bottom = 5.dp) - ) - }, - confirmButton = { - TextButton( - onClick = { dialogConfirmButtonAction(); status.intValue = 0 } - ) { - Text(text = stringResource(R.string.enable)) - } - }, - dismissButton = { - TextButton( - onClick = { dialogDismissButtonAction(); status.intValue = 0 } - ) { - Text(text = stringResource(R.string.disable)) - } - } - ) -} 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 9619737..af9b4c7 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt @@ -12,10 +12,12 @@ import android.content.Context import android.content.Intent import android.content.pm.IPackageInstaller import android.content.pm.PackageInstaller +import android.content.pm.PackageManager import android.os.Build.VERSION import androidx.activity.result.ActivityResultLauncher import androidx.annotation.DrawableRes import androidx.annotation.StringRes +import com.bintianqi.owndroid.InstallAppActivity import com.bintianqi.owndroid.PackageInstallerReceiver import com.bintianqi.owndroid.R import com.bintianqi.owndroid.Receiver @@ -230,6 +232,15 @@ fun Context.resetDevicePolicy() { dpm.setRecommendedGlobalProxy(receiver, null) } +fun Context.toggleInstallAppActivity() { + val sharedPrefs = getSharedPreferences("data", Context.MODE_PRIVATE) + val disable = sharedPrefs.getBoolean("dhizuku", false) || !isDeviceOwner + packageManager?.setComponentEnabledSetting( + ComponentName(this, InstallAppActivity::class.java), + if (disable) PackageManager.COMPONENT_ENABLED_STATE_DISABLED else PackageManager.COMPONENT_ENABLED_STATE_ENABLED, + PackageManager.DONT_KILL_APP + ) +} data class PermissionItem( val permission: String, diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/ManagedProfile.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/ManagedProfile.kt index 13f78c5..f730bdb 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/ManagedProfile.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/ManagedProfile.kt @@ -22,7 +22,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardActions @@ -190,12 +189,16 @@ private fun SuspendPersonalApp() { val dpm = context.getDPM() val receiver = context.getReceiver() val focusMgr = LocalFocusManager.current + var suspend by remember { mutableStateOf(dpm.getPersonalAppsSuspendedReasons(receiver) != PERSONAL_APPS_NOT_SUSPENDED) } Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) { Spacer(Modifier.padding(vertical = 10.dp)) SwitchItem( R.string.suspend_personal_app, "", null, - { dpm.getPersonalAppsSuspendedReasons(receiver)!=PERSONAL_APPS_NOT_SUSPENDED }, - { dpm.setPersonalAppsSuspended(receiver,it) }, padding = false + suspend, + { + dpm.setPersonalAppsSuspended(receiver,it) + suspend = dpm.getPersonalAppsSuspendedReasons(receiver) != PERSONAL_APPS_NOT_SUSPENDED + }, padding = false ) var time by remember { mutableStateOf("") } time = dpm.getManagedProfileMaximumTimeOff(receiver).toString() diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Network.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Network.kt index 3943df8..118183a 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Network.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Network.kt @@ -547,7 +547,7 @@ private fun NetworkLog() { Spacer(Modifier.padding(vertical = 5.dp)) Text(text = stringResource(R.string.developing)) Spacer(Modifier.padding(vertical = 5.dp)) - SwitchItem(R.string.enable,"",null, {dpm.isNetworkLoggingEnabled(receiver) }, {dpm.setNetworkLoggingEnabled(receiver,it) }, padding = false) + SwitchItem(R.string.enable,"",null, { dpm.isNetworkLoggingEnabled(receiver) }, {dpm.setNetworkLoggingEnabled(receiver,it) }, padding = false) Spacer(Modifier.padding(vertical = 5.dp)) Button( onClick = { diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Password.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Password.kt index 61dbbca..2e0af07 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Password.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Password.kt @@ -41,7 +41,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardActions 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 8670338..1df9cd5 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt @@ -90,7 +90,6 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) { val dpm = context.getDPM() val receiver = context.getReceiver() val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) - var dhizukuStatus by remember { mutableStateOf(sharedPref.getBoolean("dhizuku", false)) } val deviceAdmin = context.isDeviceAdmin val deviceOwner = context.isDeviceOwner val profileOwner = context.isProfileOwner @@ -103,10 +102,9 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) { if(!dpm.isDeviceOwnerApp(context.packageName)) { SwitchItem( R.string.dhizuku, "", null, - { dhizukuStatus }, + { sharedPref.getBoolean("dhizuku", false) }, { toggleDhizukuMode(it, context) - dhizukuStatus = sharedPref.getBoolean("dhizuku", false) } ) } @@ -171,6 +169,7 @@ private fun toggleDhizukuMode(status: Boolean, context: Context) { override fun onRequestPermission(grantResult: Int) { if(grantResult == PackageManager.PERMISSION_GRANTED) { sharedPref.edit().putBoolean("dhizuku", true).apply() + context.toggleInstallAppActivity() backToHomeStateFlow.value = true } else { dhizukuErrorStatus.value = 2 diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/UserManager.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/UserManager.kt index 543b6bf..20eb547 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/UserManager.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/UserManager.kt @@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardActions diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/UserRestriction.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/UserRestriction.kt index a0d8546..f0ec4f2 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/UserRestriction.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/UserRestriction.kt @@ -195,7 +195,7 @@ private fun UserRestrictionItem( val receiver = context.getReceiver() Box(modifier = Modifier.padding(start = 22.dp, end = 16.dp)) { SwitchItem( - itemName,restrictionDescription,leadIcon, + itemName, restrictionDescription, leadIcon, { dpm.getUserRestrictions(receiver).getBoolean(restriction) }, { try{ diff --git a/app/src/main/java/com/bintianqi/owndroid/ui/Components.kt b/app/src/main/java/com/bintianqi/owndroid/ui/Components.kt index 51db48d..c913cbb 100644 --- a/app/src/main/java/com/bintianqi/owndroid/ui/Components.kt +++ b/app/src/main/java/com/bintianqi/owndroid/ui/Components.kt @@ -124,6 +124,7 @@ fun CheckBoxItem( } } + @Composable fun SwitchItem( @StringRes title: Int, @@ -135,7 +136,21 @@ fun SwitchItem( onClickBlank: (() -> Unit)? = null, padding: Boolean = true ) { - var checked by remember { mutableStateOf(getState()) } + var state by remember { mutableStateOf(getState()) } + SwitchItem(title, desc, icon, state, { onCheckedChange(it); state = getState() }, enable, onClickBlank, padding) +} + +@Composable +fun SwitchItem( + @StringRes title: Int, + desc: String, + @DrawableRes icon: Int?, + state: Boolean, + onCheckedChange: (Boolean)->Unit, + enable: Boolean = true, + onClickBlank: (() -> Unit)? = null, + padding: Boolean = true +) { Box( modifier = Modifier .fillMaxWidth() @@ -159,7 +174,7 @@ fun SwitchItem( } } Switch( - checked = checked, onCheckedChange = { onCheckedChange(it); checked = getState() }, + checked = state, onCheckedChange = { onCheckedChange(it) }, modifier = Modifier.align(Alignment.CenterEnd), enabled = enable ) } diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 342c8e5..f0c285c 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -124,7 +124,6 @@ Kamerayı devre dışı bırak Ekran görüntüsünü devre dışı bırak Durum çubuğunu devre dışı bırak - AOSP\'de ekran kaydını da devre dışı bırak Otomatik saat Otomatik saat gerektir Otomatik saat dilimi @@ -132,7 +131,6 @@ Yedekleme servisi Bluetooth kişi paylaşımını devre dışı bırak Ortak kriter modu - Bilinmeyen etki USB sinyali Ekran kilidi Ekran kilidini devre dışı bırakmak için parola ayarlanmamış olmalıdır @@ -398,7 +396,6 @@ Bilinmeyen kaynakları global olarak yükle Bilinmeyen kaynakları yükle Uygulama kontrolü - Uygulama verilerini veya önbelleği temizle Varsayılan uygulamaları yapılandır Parlaklığı yapılandır @@ -422,11 +419,9 @@ İçerik yakalama İçerik önerileri Pencere oluştur - ör. tostlar, bildirim afişi Duvar kağıdı ayarla Cihaz yöneticisi yetkisi ver Eğlence - Oyunları devre dışı bırakabilir Hesapları değiştir Yerel ayarları yapılandır Tarihi veya saati yapılandır @@ -544,7 +539,6 @@ Material You rengi Android 12+ Hakkında - Cihazınızı tam kontrol altına almak için Cihaz yöneticisi, Profil sahibi ve Cihaz sahibi ayrıcalıklarını kullanın. Kullanıcı rehberi Kaynak kodu Tema @@ -555,7 +549,6 @@ OwnDroid\'u kilitle Biyometri ile doğrulama Doğrula - OwnDroid başlatıldığında ana ekran şifresi veya biyometri ile doğrulama Şifre kullan OwnDroid\'u şifre ile doğrula OwnDroid\'u biyometri ile doğrula diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9d9222c..a0a8520 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -119,7 +119,6 @@ 禁用相机 禁止屏幕捕获 禁用状态栏 - 对AOSP的录屏也起作用 自动设置时间 自动设置时区 要求自动时间 @@ -127,7 +126,6 @@ 备份服务 禁止蓝牙分享联系人 通用标准模式 - Common Criteria USB信号 锁屏 禁用需要无密码 @@ -390,7 +388,6 @@ 安装未知来源应用(全局) 安装未知来源应用 控制应用 - 清空缓存/清空内部存储 修改默认App 调整亮度 @@ -414,11 +411,9 @@ 内容捕获 内容建议 创建窗口 - 可能包括Toast和浮动通知 更换壁纸 启用设备管理器 娱乐 - 会影响谷歌商店的游戏 修改账号设置 修改语言 修改日期、时间 @@ -536,7 +531,6 @@ Material you 颜色 安卓12+ 关于 - 使用安卓的Device admin、Device owner、Profile owner,全方位掌控你的设备 使用教程 源代码 主题 @@ -547,7 +541,6 @@ 锁定OwnDroid 使用生物识别 验证 - 在OwnDroid启动时使用锁屏密码或生物识别进行验证 使用密码 使用密码进行验证 使用生物识别进行验证 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bff6f5a..cb6a54f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -128,7 +128,6 @@ Disable camera Disable screen capture Disable status bar - Also disable screen record in AOSP. Auto time Require auto time Auto timezone @@ -136,7 +135,6 @@ Backup service Disable bluetooth contact sharing Common criteria mode - Unknown effect USB signal Keyguard Disable keyguard require no password is set. @@ -403,7 +401,6 @@ Install unknown sources globally Install unknown sources Apps control - Clear app data or cache Configure default apps Configure brightness @@ -427,11 +424,9 @@ Content capture Content suggestions Create windows - e.g. toasts, notifications banner Set wallpaper Grant device admin Fun - May disable games Modify accounts Configure locale Configure date or time @@ -549,7 +544,6 @@ Material you color Android 12+ About - Use Device admin, Profile owner and Device owner privilege to take full control of your device. User guide Source code Theme @@ -560,7 +554,6 @@ Lock OwnDroid Auth with biometrics Authenticate - Authenticating with keyguard password or biometrics when OwnDroid launch Use password Authenticate OwnDroid with password Authenticate OwnDroid with biometrics