fix some problems of AppControlDialog

use state to control SwitchItem
This commit is contained in:
BinTianqi
2024-08-13 16:11:54 +08:00
parent 3d000358c4
commit b452005ada
15 changed files with 149 additions and 126 deletions

View File

@@ -66,6 +66,7 @@ import com.bintianqi.owndroid.dpm.getReceiver
import com.bintianqi.owndroid.dpm.isDeviceAdmin import com.bintianqi.owndroid.dpm.isDeviceAdmin
import com.bintianqi.owndroid.dpm.isDeviceOwner import com.bintianqi.owndroid.dpm.isDeviceOwner
import com.bintianqi.owndroid.dpm.isProfileOwner import com.bintianqi.owndroid.dpm.isProfileOwner
import com.bintianqi.owndroid.dpm.toggleInstallAppActivity
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 com.rosan.dhizuku.api.Dhizuku
@@ -91,6 +92,7 @@ class MainActivity : FragmentActivity() {
} }
val locale = applicationContext.resources?.configuration?.locale val locale = applicationContext.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
toggleInstallAppActivity()
setContent { setContent {
val materialYou = remember { mutableStateOf(sharedPref.getBoolean("material_you", true)) } val materialYou = remember { mutableStateOf(sharedPref.getBoolean("material_you", true)) }
val blackTheme = remember { mutableStateOf(sharedPref.getBoolean("black_theme", false)) } val blackTheme = remember { mutableStateOf(sharedPref.getBoolean("black_theme", false)) }
@@ -284,6 +286,7 @@ private fun DhizukuErrorDialog() {
val context = LocalContext.current val context = LocalContext.current
val sharedPref = context.getSharedPreferences("data", Context.MODE_PRIVATE) val sharedPref = context.getSharedPreferences("data", Context.MODE_PRIVATE)
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
context.toggleInstallAppActivity()
delay(200) delay(200)
sharedPref.edit().putBoolean("dhizuku", false).apply() sharedPref.edit().putBoolean("dhizuku", false).apply()
} }

View File

@@ -25,11 +25,13 @@ import com.bintianqi.owndroid.dpm.getReceiver
import com.bintianqi.owndroid.dpm.isDeviceAdmin import com.bintianqi.owndroid.dpm.isDeviceAdmin
import com.bintianqi.owndroid.dpm.isDeviceOwner import com.bintianqi.owndroid.dpm.isDeviceOwner
import com.bintianqi.owndroid.dpm.isProfileOwner import com.bintianqi.owndroid.dpm.isProfileOwner
import com.bintianqi.owndroid.dpm.toggleInstallAppActivity
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
class Receiver : DeviceAdminReceiver() { class Receiver : DeviceAdminReceiver() {
override fun onEnabled(context: Context, intent: Intent) { override fun onEnabled(context: Context, intent: Intent) {
super.onEnabled(context, intent) super.onEnabled(context, intent)
context.toggleInstallAppActivity()
if(context.isDeviceAdmin || context.isProfileOwner || context.isDeviceOwner){ if(context.isDeviceAdmin || context.isProfileOwner || context.isDeviceOwner){
Toast.makeText(context, context.getString(R.string.onEnabled), Toast.LENGTH_SHORT).show() 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) { override fun onDisabled(context: Context, intent: Intent) {
super.onDisabled(context, intent) super.onDisabled(context, intent)
context.toggleInstallAppActivity()
backToHomeStateFlow.value = true backToHomeStateFlow.value = true
Toast.makeText(context, R.string.onDisabled, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.onDisabled, Toast.LENGTH_SHORT).show()
} }

View File

@@ -109,8 +109,7 @@ private fun AuthSettings() {
var auth by remember{ mutableStateOf(sharedPref.getBoolean("auth",false)) } var auth by remember{ mutableStateOf(sharedPref.getBoolean("auth",false)) }
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) { Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
SwitchItem( SwitchItem(
R.string.lock_owndroid, "", null, R.string.lock_owndroid, "", null, auth,
{ auth },
{ {
sharedPref.edit().putBoolean("auth", it).apply() sharedPref.edit().putBoolean("auth", it).apply()
auth = sharedPref.getBoolean("auth", false) auth = sharedPref.getBoolean("auth", false)

View File

@@ -94,10 +94,6 @@ import com.bintianqi.owndroid.ui.SubPageItem
import com.bintianqi.owndroid.ui.SwitchItem import com.bintianqi.owndroid.ui.SwitchItem
import java.util.concurrent.Executors import java.util.concurrent.Executors
private var dialogConfirmButtonAction = {}
private var dialogDismissButtonAction = {}
private var dialogGetStatus = { false }
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun ApplicationManage(navCtrl:NavHostController, dialogStatus: MutableIntState) { fun ApplicationManage(navCtrl:NavHostController, dialogStatus: MutableIntState) {
@@ -166,10 +162,9 @@ fun ApplicationManage(navCtrl:NavHostController, dialogStatus: MutableIntState)
} }
when(dialogStatus.intValue) { when(dialogStatus.intValue) {
0 -> {} 0 -> {}
4 -> EnableSystemAppDialog(dialogStatus, pkgName) 1 -> EnableSystemAppDialog(dialogStatus, pkgName)
5 -> ClearAppDataDialog(dialogStatus, pkgName) 2 -> ClearAppDataDialog(dialogStatus, pkgName)
6 -> DefaultDialerAppDialog(dialogStatus, pkgName) 3 -> DefaultDialerAppDialog(dialogStatus, pkgName)
else -> AppControlDialog(dialogStatus)
} }
LaunchedEffect(dialogStatus.intValue) { LaunchedEffect(dialogStatus.intValue) {
focusMgr.clearFocus() focusMgr.clearFocus()
@@ -185,9 +180,35 @@ private fun Home(
val context = LocalContext.current val context = LocalContext.current
val dpm = context.getDPM() val dpm = context.getDPM()
val receiver = context.getReceiver() val receiver = context.getReceiver()
val sharedPrefs = context.getSharedPreferences("data", Context.MODE_PRIVATE)
val deviceOwner = context.isDeviceOwner val deviceOwner = context.isDeviceOwner
val profileOwner = context.isProfileOwner 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( Column(
modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()) modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())
) { ) {
@@ -201,53 +222,33 @@ private fun Home(
startActivity(context, intent, null) startActivity(context, intent, null)
} }
if(VERSION.SDK_INT >= 24 && (deviceOwner || profileOwner)) { if(VERSION.SDK_INT >= 24 && (deviceOwner || profileOwner)) {
val getSuspendStatus = {
try{ dpm.isPackageSuspended(receiver, pkgName) }
catch(e:NameNotFoundException) { false }
catch(e:IllegalArgumentException) { false }
}
SwitchItem( SwitchItem(
title = R.string.suspend, desc = "", icon = R.drawable.block_fill0, title = R.string.suspend, desc = "", icon = R.drawable.block_fill0,
getState = getSuspendStatus, state = suspend,
onCheckedChange = { dpm.setPackagesSuspended(receiver, arrayOf(pkgName), it) }, onCheckedChange = { appControlAction = 1; appControl(it) },
onClickBlank = { onClickBlank = { appControlAction = 1; appControlDialog = true }
dialogGetStatus = getSuspendStatus
dialogConfirmButtonAction = { dpm.setPackagesSuspended(receiver, arrayOf(pkgName), true) }
dialogDismissButtonAction = { dpm.setPackagesSuspended(receiver, arrayOf(pkgName), false) }
dialogStatus.intValue = 1
}
) )
} }
if(deviceOwner || profileOwner) { if(deviceOwner || profileOwner) {
SwitchItem( SwitchItem(
title = R.string.hide, desc = stringResource(R.string.isapphidden_desc), icon = R.drawable.visibility_off_fill0, title = R.string.hide, desc = stringResource(R.string.isapphidden_desc), icon = R.drawable.visibility_off_fill0,
getState = { dpm.isApplicationHidden(receiver,pkgName) }, state = hide,
onCheckedChange = { dpm.setApplicationHidden(receiver, pkgName, it) }, onCheckedChange = { appControlAction = 2; appControl(it) },
onClickBlank = { onClickBlank = { appControlAction = 2; appControlDialog = true }
dialogGetStatus = { dpm.isApplicationHidden(receiver,pkgName) }
dialogConfirmButtonAction = { dpm.setApplicationHidden(receiver, pkgName, true) }
dialogDismissButtonAction = { dpm.setApplicationHidden(receiver, pkgName, false) }
dialogStatus.intValue = 2
}
) )
} }
if(deviceOwner || profileOwner) { if(deviceOwner || profileOwner) {
SwitchItem( SwitchItem(
title = R.string.block_uninstall, desc = "", icon = R.drawable.delete_forever_fill0, title = R.string.block_uninstall, desc = "", icon = R.drawable.delete_forever_fill0,
getState = { dpm.isUninstallBlocked(receiver,pkgName) }, state = blockUninstall,
onCheckedChange = { dpm.setUninstallBlocked(receiver,pkgName,it) }, onCheckedChange = { appControlAction = 3; appControl(it) },
onClickBlank = { onClickBlank = { appControlAction = 3; appControlDialog = true }
dialogGetStatus = { dpm.isUninstallBlocked(receiver,pkgName) }
dialogConfirmButtonAction = { dpm.setUninstallBlocked(receiver,pkgName,true) }
dialogDismissButtonAction = { dpm.setUninstallBlocked(receiver,pkgName,false) }
dialogStatus.intValue = 3
}
) )
} }
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") } 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") } SubPageItem(R.string.ucd, "", R.drawable.do_not_touch_fill0) { navCtrl.navigate("UserControlDisabled") }
} }
if(VERSION.SDK_INT>=23&&(deviceOwner||profileOwner)) { if(VERSION.SDK_INT>=23&&(deviceOwner||profileOwner)) {
@@ -270,7 +271,7 @@ private fun Home(
} }
if(deviceOwner || profileOwner) { if(deviceOwner || profileOwner) {
SubPageItem(R.string.enable_system_app, "", R.drawable.enable_fill0) { 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) { if(VERSION.SDK_INT >= 28 && deviceOwner) {
@@ -278,21 +279,74 @@ private fun Home(
} }
if(VERSION.SDK_INT >= 28 && (deviceOwner || profileOwner)) { if(VERSION.SDK_INT >= 28 && (deviceOwner || profileOwner)) {
SubPageItem(R.string.clear_app_storage, "", R.drawable.mop_fill0) { 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") } SubPageItem(R.string.uninstall_app, "", R.drawable.delete_fill0) { navCtrl.navigate("UninstallApp") }
if(VERSION.SDK_INT >= 34 && (deviceOwner || dpm.isOrgProfile(receiver))) { if(VERSION.SDK_INT >= 34 && (deviceOwner || dpm.isOrgProfile(receiver))) {
SubPageItem(R.string.set_default_dialer, "", R.drawable.call_fill0) { 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)) Spacer(Modifier.padding(vertical = 30.dp))
LaunchedEffect(Unit) { fileUriFlow.value = Uri.parse("") } 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") @SuppressLint("NewApi")
@@ -319,7 +373,7 @@ fun AlwaysOnVPNPackage(pkgName: String) {
Spacer(Modifier.padding(vertical = 10.dp)) 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.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)) 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)) Spacer(Modifier.padding(vertical = 5.dp))
Button( Button(
onClick = { setAlwaysOnVpn(pkgName, lockdown); refresh() }, onClick = { setAlwaysOnVpn(pkgName, lockdown); refresh() },
@@ -809,7 +863,7 @@ private fun PermittedIME(pkgName: String) {
Text(text = stringResource(R.string.permitted_ime), style = typography.headlineLarge) Text(text = stringResource(R.string.permitted_ime), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
SwitchItem( SwitchItem(
R.string.allow_all, "", null, { allowAll }, R.string.allow_all, "", null, allowAll,
{ {
dpm.setPermittedInputMethods(receiver, if(it) null else listOf()) dpm.setPermittedInputMethods(receiver, if(it) null else listOf())
refresh() refresh()
@@ -963,6 +1017,7 @@ private fun InstallApp() {
val context = LocalContext.current val context = LocalContext.current
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
val selected = fileUriFlow.collectAsState().value != Uri.parse("") 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())) { Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.install_app), style = typography.headlineLarge) Text(text = stringResource(R.string.install_app), style = typography.headlineLarge)
@@ -988,6 +1043,7 @@ private fun InstallApp() {
intent.data = fileUriFlow.value intent.data = fileUriFlow.value
context.startActivity(intent) context.startActivity(intent)
}, },
enabled = !sharedPrefs.getBoolean("dhizuku", false) && context.isDeviceOwner,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.silent_install)) Text(stringResource(R.string.silent_install))
@@ -1121,46 +1177,3 @@ private fun EnableSystemAppDialog(status: MutableIntState, pkgName: String) {
modifier = Modifier.fillMaxWidth() 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))
}
}
)
}

View File

@@ -12,10 +12,12 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.IPackageInstaller import android.content.pm.IPackageInstaller
import android.content.pm.PackageInstaller import android.content.pm.PackageInstaller
import android.content.pm.PackageManager
import android.os.Build.VERSION import android.os.Build.VERSION
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.annotation.StringRes import androidx.annotation.StringRes
import com.bintianqi.owndroid.InstallAppActivity
import com.bintianqi.owndroid.PackageInstallerReceiver import com.bintianqi.owndroid.PackageInstallerReceiver
import com.bintianqi.owndroid.R import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.Receiver import com.bintianqi.owndroid.Receiver
@@ -230,6 +232,15 @@ fun Context.resetDevicePolicy() {
dpm.setRecommendedGlobalProxy(receiver, null) 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( data class PermissionItem(
val permission: String, val permission: String,

View File

@@ -22,7 +22,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
@@ -190,12 +189,16 @@ private fun SuspendPersonalApp() {
val dpm = context.getDPM() val dpm = context.getDPM()
val receiver = context.getReceiver() val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current 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())) { Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
SwitchItem( SwitchItem(
R.string.suspend_personal_app, "", null, R.string.suspend_personal_app, "", null,
{ dpm.getPersonalAppsSuspendedReasons(receiver)!=PERSONAL_APPS_NOT_SUSPENDED }, suspend,
{ dpm.setPersonalAppsSuspended(receiver,it) }, padding = false {
dpm.setPersonalAppsSuspended(receiver,it)
suspend = dpm.getPersonalAppsSuspendedReasons(receiver) != PERSONAL_APPS_NOT_SUSPENDED
}, padding = false
) )
var time by remember { mutableStateOf("") } var time by remember { mutableStateOf("") }
time = dpm.getManagedProfileMaximumTimeOff(receiver).toString() time = dpm.getManagedProfileMaximumTimeOff(receiver).toString()

View File

@@ -547,7 +547,7 @@ private fun NetworkLog() {
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
Text(text = stringResource(R.string.developing)) Text(text = stringResource(R.string.developing))
Spacer(Modifier.padding(vertical = 5.dp)) 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)) Spacer(Modifier.padding(vertical = 5.dp))
Button( Button(
onClick = { onClick = {

View File

@@ -41,7 +41,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions

View File

@@ -90,7 +90,6 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) {
val dpm = context.getDPM() val dpm = context.getDPM()
val receiver = context.getReceiver() val receiver = context.getReceiver()
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
var dhizukuStatus by remember { mutableStateOf(sharedPref.getBoolean("dhizuku", false)) }
val deviceAdmin = context.isDeviceAdmin val deviceAdmin = context.isDeviceAdmin
val deviceOwner = context.isDeviceOwner val deviceOwner = context.isDeviceOwner
val profileOwner = context.isProfileOwner val profileOwner = context.isProfileOwner
@@ -103,10 +102,9 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) {
if(!dpm.isDeviceOwnerApp(context.packageName)) { if(!dpm.isDeviceOwnerApp(context.packageName)) {
SwitchItem( SwitchItem(
R.string.dhizuku, "", null, R.string.dhizuku, "", null,
{ dhizukuStatus }, { sharedPref.getBoolean("dhizuku", false) },
{ {
toggleDhizukuMode(it, context) toggleDhizukuMode(it, context)
dhizukuStatus = sharedPref.getBoolean("dhizuku", false)
} }
) )
} }
@@ -171,6 +169,7 @@ private fun toggleDhizukuMode(status: Boolean, context: Context) {
override fun onRequestPermission(grantResult: Int) { override fun onRequestPermission(grantResult: Int) {
if(grantResult == PackageManager.PERMISSION_GRANTED) { if(grantResult == PackageManager.PERMISSION_GRANTED) {
sharedPref.edit().putBoolean("dhizuku", true).apply() sharedPref.edit().putBoolean("dhizuku", true).apply()
context.toggleInstallAppActivity()
backToHomeStateFlow.value = true backToHomeStateFlow.value = true
} else { } else {
dhizukuErrorStatus.value = 2 dhizukuErrorStatus.value = 2

View File

@@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions

View File

@@ -195,7 +195,7 @@ private fun UserRestrictionItem(
val receiver = context.getReceiver() val receiver = context.getReceiver()
Box(modifier = Modifier.padding(start = 22.dp, end = 16.dp)) { Box(modifier = Modifier.padding(start = 22.dp, end = 16.dp)) {
SwitchItem( SwitchItem(
itemName,restrictionDescription,leadIcon, itemName, restrictionDescription, leadIcon,
{ dpm.getUserRestrictions(receiver).getBoolean(restriction) }, { dpm.getUserRestrictions(receiver).getBoolean(restriction) },
{ {
try{ try{

View File

@@ -124,6 +124,7 @@ fun CheckBoxItem(
} }
} }
@Composable @Composable
fun SwitchItem( fun SwitchItem(
@StringRes title: Int, @StringRes title: Int,
@@ -135,7 +136,21 @@ fun SwitchItem(
onClickBlank: (() -> Unit)? = null, onClickBlank: (() -> Unit)? = null,
padding: Boolean = true 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( Box(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -159,7 +174,7 @@ fun SwitchItem(
} }
} }
Switch( Switch(
checked = checked, onCheckedChange = { onCheckedChange(it); checked = getState() }, checked = state, onCheckedChange = { onCheckedChange(it) },
modifier = Modifier.align(Alignment.CenterEnd), enabled = enable modifier = Modifier.align(Alignment.CenterEnd), enabled = enable
) )
} }

View File

@@ -124,7 +124,6 @@
<string name="disable_cam">Kamerayı devre dışı bırak</string> <string name="disable_cam">Kamerayı devre dışı bırak</string>
<string name="disable_screen_capture">Ekran görüntüsünü devre dışı bırak</string> <string name="disable_screen_capture">Ekran görüntüsünü devre dışı bırak</string>
<string name="disable_status_bar">Durum çubuğunu devre dışı bırak</string> <string name="disable_status_bar">Durum çubuğunu devre dışı bırak</string>
<string name="also_disable_aosp_screen_record">AOSP\'de ekran kaydını da devre dışı bırak</string>
<string name="auto_time">Otomatik saat</string> <string name="auto_time">Otomatik saat</string>
<string name="require_auto_time">Otomatik saat gerektir</string> <string name="require_auto_time">Otomatik saat gerektir</string>
<string name="auto_timezone">Otomatik saat dilimi</string> <string name="auto_timezone">Otomatik saat dilimi</string>
@@ -132,7 +131,6 @@
<string name="backup_service">Yedekleme servisi</string> <string name="backup_service">Yedekleme servisi</string>
<string name="disable_bt_contact_share">Bluetooth kişi paylaşımını devre dışı bırak</string> <string name="disable_bt_contact_share">Bluetooth kişi paylaşımını devre dışı bırak</string>
<string name="common_criteria_mode">Ortak kriter modu</string> <string name="common_criteria_mode">Ortak kriter modu</string>
<string name="common_criteria_mode_desc">Bilinmeyen etki</string>
<string name="usb_signal">USB sinyali</string> <string name="usb_signal">USB sinyali</string>
<string name="keyguard">Ekran kilidi</string> <string name="keyguard">Ekran kilidi</string>
<string name="require_no_password_to_disable">Ekran kilidini devre dışı bırakmak için parola ayarlanmamış olmalıdır</string> <string name="require_no_password_to_disable">Ekran kilidini devre dışı bırakmak için parola ayarlanmamış olmalıdır</string>
@@ -398,7 +396,6 @@
<string name="install_unknown_src_globally">Bilinmeyen kaynakları global olarak yükle</string> <string name="install_unknown_src_globally">Bilinmeyen kaynakları global olarak yükle</string>
<string name="inst_unknown_src">Bilinmeyen kaynakları yükle</string> <string name="inst_unknown_src">Bilinmeyen kaynakları yükle</string>
<string name="apps_ctrl">Uygulama kontrolü</string> <string name="apps_ctrl">Uygulama kontrolü</string>
<string name="apps_control_desc">Uygulama verilerini veya önbelleği temizle</string>
<string name="config_default_apps">Varsayılan uygulamaları yapılandır</string> <string name="config_default_apps">Varsayılan uygulamaları yapılandır</string>
<string name="config_brightness">Parlaklığı yapılandır</string> <string name="config_brightness">Parlaklığı yapılandır</string>
@@ -422,11 +419,9 @@
<string name="content_capture">İçerik yakalama</string> <string name="content_capture">İçerik yakalama</string>
<string name="content_suggestions">İçerik önerileri</string> <string name="content_suggestions">İçerik önerileri</string>
<string name="create_windows">Pencere oluştur</string> <string name="create_windows">Pencere oluştur</string>
<string name="create_windows_desc">ör. tostlar, bildirim afişi</string>
<string name="set_wallpaper">Duvar kağıdı ayarla</string> <string name="set_wallpaper">Duvar kağıdı ayarla</string>
<string name="grant_admin">Cihaz yöneticisi yetkisi ver</string> <string name="grant_admin">Cihaz yöneticisi yetkisi ver</string>
<string name="fun">Eğlence</string> <string name="fun">Eğlence</string>
<string name="fun_desc">Oyunları devre dışı bırakabilir</string>
<string name="modify_accounts">Hesapları değiştir</string> <string name="modify_accounts">Hesapları değiştir</string>
<string name="config_locale">Yerel ayarları yapılandır</string> <string name="config_locale">Yerel ayarları yapılandır</string>
<string name="config_date_time">Tarihi veya saati yapılandır</string> <string name="config_date_time">Tarihi veya saati yapılandır</string>
@@ -544,7 +539,6 @@
<string name="material_you_color">Material You rengi</string> <string name="material_you_color">Material You rengi</string>
<string name="dynamic_color_desc">Android 12+</string> <string name="dynamic_color_desc">Android 12+</string>
<string name="about">Hakkında</string> <string name="about">Hakkında</string>
<string name="about_desc">Cihazınızı tam kontrol altına almak için Cihaz yöneticisi, Profil sahibi ve Cihaz sahibi ayrıcalıklarını kullanın.</string>
<string name="user_guide">Kullanıcı rehberi</string> <string name="user_guide">Kullanıcı rehberi</string>
<string name="source_code">Kaynak kodu</string> <string name="source_code">Kaynak kodu</string>
<string name="theme">Tema</string> <string name="theme">Tema</string>
@@ -555,7 +549,6 @@
<string name="lock_owndroid">OwnDroid\'u kilitle</string> <string name="lock_owndroid">OwnDroid\'u kilitle</string>
<string name="enable_bio_auth">Biyometri ile doğrulama</string> <string name="enable_bio_auth">Biyometri ile doğrulama</string>
<string name="authenticate">Doğrula</string> <string name="authenticate">Doğrula</string>
<string name="auth_on_start">OwnDroid başlatıldığında ana ekran şifresi veya biyometri ile doğrulama</string>
<string name="use_password">Şifre kullan</string> <string name="use_password">Şifre kullan</string>
<string name="auth_with_password">OwnDroid\'u şifre ile doğrula</string> <string name="auth_with_password">OwnDroid\'u şifre ile doğrula</string>
<string name="auth_with_bio">OwnDroid\'u biyometri ile doğrula</string> <string name="auth_with_bio">OwnDroid\'u biyometri ile doğrula</string>

View File

@@ -119,7 +119,6 @@
<string name="disable_cam">禁用相机</string> <string name="disable_cam">禁用相机</string>
<string name="disable_screen_capture">禁止屏幕捕获</string> <string name="disable_screen_capture">禁止屏幕捕获</string>
<string name="disable_status_bar">禁用状态栏</string> <string name="disable_status_bar">禁用状态栏</string>
<string name="also_disable_aosp_screen_record">对AOSP的录屏也起作用</string>
<string name="auto_time">自动设置时间</string> <string name="auto_time">自动设置时间</string>
<string name="auto_timezone">自动设置时区</string> <string name="auto_timezone">自动设置时区</string>
<string name="require_auto_time">要求自动时间</string> <string name="require_auto_time">要求自动时间</string>
@@ -127,7 +126,6 @@
<string name="backup_service">备份服务</string> <string name="backup_service">备份服务</string>
<string name="disable_bt_contact_share">禁止蓝牙分享联系人</string> <string name="disable_bt_contact_share">禁止蓝牙分享联系人</string>
<string name="common_criteria_mode">通用标准模式</string> <string name="common_criteria_mode">通用标准模式</string>
<string name="common_criteria_mode_desc">Common Criteria</string>
<string name="usb_signal">USB信号</string> <string name="usb_signal">USB信号</string>
<string name="keyguard">锁屏</string> <string name="keyguard">锁屏</string>
<string name="require_no_password_to_disable">禁用需要无密码</string> <string name="require_no_password_to_disable">禁用需要无密码</string>
@@ -390,7 +388,6 @@
<string name="install_unknown_src_globally">安装未知来源应用(全局)</string> <string name="install_unknown_src_globally">安装未知来源应用(全局)</string>
<string name="inst_unknown_src">安装未知来源应用</string> <string name="inst_unknown_src">安装未知来源应用</string>
<string name="apps_ctrl">控制应用</string> <string name="apps_ctrl">控制应用</string>
<string name="apps_control_desc">清空缓存/清空内部存储</string>
<string name="config_default_apps">修改默认App</string> <string name="config_default_apps">修改默认App</string>
<string name="config_brightness">调整亮度</string> <string name="config_brightness">调整亮度</string>
@@ -414,11 +411,9 @@
<string name="content_capture">内容捕获</string> <string name="content_capture">内容捕获</string>
<string name="content_suggestions">内容建议</string> <string name="content_suggestions">内容建议</string>
<string name="create_windows">创建窗口</string> <string name="create_windows">创建窗口</string>
<string name="create_windows_desc">可能包括Toast和浮动通知</string>
<string name="set_wallpaper">更换壁纸</string> <string name="set_wallpaper">更换壁纸</string>
<string name="grant_admin">启用设备管理器</string> <string name="grant_admin">启用设备管理器</string>
<string name="fun">娱乐</string> <string name="fun">娱乐</string>
<string name="fun_desc">会影响谷歌商店的游戏</string>
<string name="modify_accounts">修改账号设置</string> <string name="modify_accounts">修改账号设置</string>
<string name="config_locale">修改语言</string> <string name="config_locale">修改语言</string>
<string name="config_date_time">修改日期、时间</string> <string name="config_date_time">修改日期、时间</string>
@@ -536,7 +531,6 @@
<string name="material_you_color">Material you 颜色</string> <string name="material_you_color">Material you 颜色</string>
<string name="dynamic_color_desc">安卓12+</string> <string name="dynamic_color_desc">安卓12+</string>
<string name="about">关于</string> <string name="about">关于</string>
<string name="about_desc">使用安卓的Device admin、Device owner、Profile owner全方位掌控你的设备</string>
<string name="user_guide">使用教程</string> <string name="user_guide">使用教程</string>
<string name="source_code">源代码</string> <string name="source_code">源代码</string>
<string name="theme">主题</string> <string name="theme">主题</string>
@@ -547,7 +541,6 @@
<string name="lock_owndroid">锁定OwnDroid</string> <string name="lock_owndroid">锁定OwnDroid</string>
<string name="enable_bio_auth">使用生物识别</string> <string name="enable_bio_auth">使用生物识别</string>
<string name="authenticate">验证</string> <string name="authenticate">验证</string>
<string name="auth_on_start">在OwnDroid启动时使用锁屏密码或生物识别进行验证</string>
<string name="use_password">使用密码</string> <string name="use_password">使用密码</string>
<string name="auth_with_password">使用密码进行验证</string> <string name="auth_with_password">使用密码进行验证</string>
<string name="auth_with_bio">使用生物识别进行验证</string> <string name="auth_with_bio">使用生物识别进行验证</string>

View File

@@ -128,7 +128,6 @@
<string name="disable_cam">Disable camera</string> <string name="disable_cam">Disable camera</string>
<string name="disable_screen_capture">Disable screen capture</string> <string name="disable_screen_capture">Disable screen capture</string>
<string name="disable_status_bar">Disable status bar</string> <string name="disable_status_bar">Disable status bar</string>
<string name="also_disable_aosp_screen_record">Also disable screen record in AOSP. </string>
<string name="auto_time">Auto time</string> <string name="auto_time">Auto time</string>
<string name="require_auto_time">Require auto time</string> <string name="require_auto_time">Require auto time</string>
<string name="auto_timezone">Auto timezone</string> <string name="auto_timezone">Auto timezone</string>
@@ -136,7 +135,6 @@
<string name="backup_service">Backup service</string> <string name="backup_service">Backup service</string>
<string name="disable_bt_contact_share">Disable bluetooth contact sharing</string> <string name="disable_bt_contact_share">Disable bluetooth contact sharing</string>
<string name="common_criteria_mode">Common criteria mode</string> <string name="common_criteria_mode">Common criteria mode</string>
<string name="common_criteria_mode_desc">Unknown effect</string>
<string name="usb_signal">USB signal</string> <string name="usb_signal">USB signal</string>
<string name="keyguard">Keyguard</string> <string name="keyguard">Keyguard</string>
<string name="require_no_password_to_disable">Disable keyguard require no password is set. </string> <string name="require_no_password_to_disable">Disable keyguard require no password is set. </string>
@@ -403,7 +401,6 @@
<string name="install_unknown_src_globally">Install unknown sources globally</string> <string name="install_unknown_src_globally">Install unknown sources globally</string>
<string name="inst_unknown_src">Install unknown sources</string> <string name="inst_unknown_src">Install unknown sources</string>
<string name="apps_ctrl">Apps control</string> <string name="apps_ctrl">Apps control</string>
<string name="apps_control_desc">Clear app data or cache</string>
<string name="config_default_apps">Configure default apps</string> <string name="config_default_apps">Configure default apps</string>
<string name="config_brightness">Configure brightness</string> <string name="config_brightness">Configure brightness</string>
@@ -427,11 +424,9 @@
<string name="content_capture">Content capture</string> <string name="content_capture">Content capture</string>
<string name="content_suggestions">Content suggestions</string> <string name="content_suggestions">Content suggestions</string>
<string name="create_windows">Create windows</string> <string name="create_windows">Create windows</string>
<string name="create_windows_desc">e.g. toasts, notifications banner</string>
<string name="set_wallpaper">Set wallpaper</string> <string name="set_wallpaper">Set wallpaper</string>
<string name="grant_admin">Grant device admin</string> <string name="grant_admin">Grant device admin</string>
<string name="fun">Fun</string> <string name="fun">Fun</string>
<string name="fun_desc">May disable games</string>
<string name="modify_accounts">Modify accounts</string> <string name="modify_accounts">Modify accounts</string>
<string name="config_locale">Configure locale</string> <string name="config_locale">Configure locale</string>
<string name="config_date_time">Configure date or time</string> <string name="config_date_time">Configure date or time</string>
@@ -549,7 +544,6 @@
<string name="material_you_color">Material you color</string> <string name="material_you_color">Material you color</string>
<string name="dynamic_color_desc">Android 12+</string> <string name="dynamic_color_desc">Android 12+</string>
<string name="about">About</string> <string name="about">About</string>
<string name="about_desc">Use Device admin, Profile owner and Device owner privilege to take full control of your device. </string>
<string name="user_guide">User guide</string> <string name="user_guide">User guide</string>
<string name="source_code">Source code</string> <string name="source_code">Source code</string>
<string name="theme">Theme</string> <string name="theme">Theme</string>
@@ -560,7 +554,6 @@
<string name="lock_owndroid">Lock OwnDroid</string> <string name="lock_owndroid">Lock OwnDroid</string>
<string name="enable_bio_auth">Auth with biometrics</string> <string name="enable_bio_auth">Auth with biometrics</string>
<string name="authenticate">Authenticate</string> <string name="authenticate">Authenticate</string>
<string name="auth_on_start">Authenticating with keyguard password or biometrics when OwnDroid launch</string>
<string name="use_password">Use password</string> <string name="use_password">Use password</string>
<string name="auth_with_password">Authenticate OwnDroid with password</string> <string name="auth_with_password">Authenticate OwnDroid with password</string>
<string name="auth_with_bio">Authenticate OwnDroid with biometrics</string> <string name="auth_with_bio">Authenticate OwnDroid with biometrics</string>