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