reset all settings after deactivating device owner

close #56
This commit is contained in:
BinTianqi
2024-07-22 16:51:02 +08:00
parent e004fb0dbd
commit cacd9438e1
6 changed files with 102 additions and 9 deletions

View File

@@ -3,7 +3,10 @@ package com.bintianqi.owndroid.dpm
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.PendingIntent import android.app.PendingIntent
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
import android.app.admin.FactoryResetProtectionPolicy
import android.app.admin.IDevicePolicyManager import android.app.admin.IDevicePolicyManager
import android.app.admin.SystemUpdatePolicy
import android.app.admin.WifiSsidPolicy
import android.content.ComponentName import android.content.ComponentName
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@@ -126,3 +129,68 @@ fun Context.getReceiver(): ComponentName {
} }
val dhizukuErrorStatus = MutableStateFlow(0) val dhizukuErrorStatus = MutableStateFlow(0)
fun Context.resetDevicePolicy() {
val dpm = getDPM()
val receiver = getReceiver()
RestrictionData.getAllRestrictions(this).forEach {
dpm.clearUserRestriction(receiver, it)
}
dpm.accountTypesWithManagementDisabled?.forEach {
dpm.setAccountManagementDisabled(receiver, it, false)
}
if (VERSION.SDK_INT >= 30) {
dpm.setConfiguredNetworksLockdownState(receiver, false)
dpm.setAutoTimeZoneEnabled(receiver, true)
dpm.setAutoTimeEnabled(receiver, true)
dpm.setCommonCriteriaModeEnabled(receiver, false)
try {
val frp = FactoryResetProtectionPolicy.Builder().setFactoryResetProtectionEnabled(false).setFactoryResetProtectionAccounts(listOf())
dpm.setFactoryResetProtectionPolicy(receiver, frp.build())
} catch(_: Exception) {}
dpm.setUserControlDisabledPackages(receiver, listOf())
}
if (VERSION.SDK_INT >= 33) {
dpm.minimumRequiredWifiSecurityLevel = DevicePolicyManager.WIFI_SECURITY_OPEN
dpm.wifiSsidPolicy = null
}
if (VERSION.SDK_INT >= 28) {
dpm.getOverrideApns(receiver).forEach { dpm.removeOverrideApn(receiver, it.id) }
dpm.setKeepUninstalledPackages(receiver, listOf())
}
dpm.setCameraDisabled(receiver, false)
dpm.setScreenCaptureDisabled(receiver, false)
dpm.setMasterVolumeMuted(receiver, false)
try {
if(VERSION.SDK_INT >= 31) dpm.isUsbDataSignalingEnabled = true
} catch (_: Exception) { }
if (VERSION.SDK_INT >= 23) {
dpm.setPermissionPolicy(receiver, DevicePolicyManager.PERMISSION_POLICY_PROMPT)
dpm.setSystemUpdatePolicy(receiver, SystemUpdatePolicy.createAutomaticInstallPolicy())
}
if (VERSION.SDK_INT >= 24) {
dpm.setAlwaysOnVpnPackage(receiver, null, false)
dpm.setPackagesSuspended(receiver, arrayOf(), false)
}
dpm.setPermittedInputMethods(receiver, null)
dpm.setPermittedAccessibilityServices(receiver, null)
packageManager.getInstalledApplications(0).forEach {
if (dpm.isUninstallBlocked(receiver, it.packageName)) dpm.setUninstallBlocked(receiver, it.packageName, false)
}
if (VERSION.SDK_INT >= 26) {
dpm.setRequiredStrongAuthTimeout(receiver, 0)
dpm.clearResetPasswordToken(receiver)
}
if (VERSION.SDK_INT >= 31) {
dpm.requiredPasswordComplexity = DevicePolicyManager.PASSWORD_COMPLEXITY_NONE
}
dpm.setKeyguardDisabledFeatures(receiver, 0)
dpm.setMaximumTimeToLock(receiver, 0)
dpm.setPasswordExpirationTimeout(receiver, 0)
dpm.setMaximumFailedPasswordsForWipe(receiver, 0)
dpm.setPasswordHistoryLength(receiver, 0)
if (VERSION.SDK_INT < 31) {
dpm.setPasswordQuality(receiver, DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED)
}
dpm.setRecommendedGlobalProxy(receiver, null)
}

View File

@@ -40,6 +40,9 @@ import com.bintianqi.owndroid.backToHomeStateFlow
import com.bintianqi.owndroid.ui.* import com.bintianqi.owndroid.ui.*
import com.rosan.dhizuku.api.Dhizuku import com.rosan.dhizuku.api.Dhizuku
import com.rosan.dhizuku.api.DhizukuRequestPermissionListener import com.rosan.dhizuku.api.DhizukuRequestPermissionListener
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@Composable @Composable
fun DpmPermissions(navCtrl:NavHostController) { fun DpmPermissions(navCtrl:NavHostController) {
@@ -350,9 +353,15 @@ private fun DeviceOwner() {
} }
if(deactivateDialog) { if(deactivateDialog) {
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
val coroutine = rememberCoroutineScope()
AlertDialog( AlertDialog(
title = { Text(stringResource(R.string.deactivate)) }, title = { Text(stringResource(R.string.deactivate)) },
text = { if(sharedPref.getBoolean("dhizuku", false)) Text(stringResource(R.string.dhizuku_will_be_deactivated)) }, text = {
Column {
if(sharedPref.getBoolean("dhizuku", false)) Text(stringResource(R.string.dhizuku_will_be_deactivated))
Text(stringResource(R.string.will_reset_policy))
}
},
onDismissRequest = { deactivateDialog = false }, onDismissRequest = { deactivateDialog = false },
dismissButton = { dismissButton = {
TextButton( TextButton(
@@ -364,14 +373,17 @@ private fun DeviceOwner() {
confirmButton = { confirmButton = {
TextButton( TextButton(
onClick = { onClick = {
dpm.clearDeviceOwnerApp(context.dpcPackageName) coroutine.launch {
if(sharedPref.getBoolean("dhizuku", false)) { context.resetDevicePolicy()
if (!Dhizuku.init(context)) { dpm.clearDeviceOwnerApp(context.dpcPackageName)
sharedPref.edit().putBoolean("dhizuku", false).apply() if(sharedPref.getBoolean("dhizuku", false)) {
backToHomeStateFlow.value = true if (!Dhizuku.init(context)) {
sharedPref.edit().putBoolean("dhizuku", false).apply()
backToHomeStateFlow.value = true
}
} }
deactivateDialog = false
} }
deactivateDialog = false
} }
) { ) {
Text(stringResource(R.string.confirm)) Text(stringResource(R.string.confirm))

View File

@@ -35,7 +35,7 @@ import com.bintianqi.owndroid.ui.SubPageItem
import com.bintianqi.owndroid.ui.SwitchItem import com.bintianqi.owndroid.ui.SwitchItem
import com.bintianqi.owndroid.ui.TopBar import com.bintianqi.owndroid.ui.TopBar
private data class Restriction( data class Restriction(
val restriction:String, val restriction:String,
@StringRes val name:Int, @StringRes val name:Int,
val desc:String, val desc:String,
@@ -211,7 +211,7 @@ private fun UserRestrictionItem(
) )
} }
private object RestrictionData{ object RestrictionData {
fun internet(): List<Restriction>{ fun internet(): List<Restriction>{
val list:MutableList<Restriction> = mutableListOf() val list:MutableList<Restriction> = mutableListOf()
list += Restriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, R.string.config_mobile_network, "", R.drawable.signal_cellular_alt_fill0) list += Restriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, R.string.config_mobile_network, "", R.drawable.signal_cellular_alt_fill0)
@@ -313,4 +313,14 @@ private object RestrictionData{
list += Restriction(UserManager.DISALLOW_DEBUGGING_FEATURES, R.string.debug_features, "", R.drawable.adb_fill0) list += Restriction(UserManager.DISALLOW_DEBUGGING_FEATURES, R.string.debug_features, "", R.drawable.adb_fill0)
return list return list
} }
fun getAllRestrictions(context: Context): List<String> {
val result = mutableListOf<String>()
internet().forEach { result.add(it.restriction) }
connectivity().forEach { result.add(it.restriction) }
media().forEach { result.add(it.restriction) }
application(context).forEach { result.add(it.restriction) }
user().forEach { result.add(it.restriction) }
other(context).forEach { result.add(it.restriction) }
return result
}
} }

View File

@@ -64,6 +64,7 @@
<string name="profile_owner">Profil Sahibi</string> <string name="profile_owner">Profil Sahibi</string>
<string name="device_owner">Cihaz Sahibi</string> <string name="device_owner">Cihaz Sahibi</string>
<string name="dhizuku_will_be_deactivated">Dhizuku will be deactivated</string> <!--TODO--> <string name="dhizuku_will_be_deactivated">Dhizuku will be deactivated</string> <!--TODO-->
<string name="will_reset_policy">All device policies set by OwnDroid will be cleared</string> <!--TODO-->
<string name="activate_device_admin">Cihaz Yöneticisini Etkinleştir</string> <string name="activate_device_admin">Cihaz Yöneticisini Etkinleştir</string>
<string name="device_info">Cihaz Bilgisi</string> <string name="device_info">Cihaz Bilgisi</string>
<string name="support_device_id_attestation">Cihaz Kimliği Doğrulama Desteği: </string> <string name="support_device_id_attestation">Cihaz Kimliği Doğrulama Desteği: </string>

View File

@@ -60,6 +60,7 @@
<string name="activate_jump" tools:ignore="TypographyEllipsis">激活...</string> <string name="activate_jump" tools:ignore="TypographyEllipsis">激活...</string>
<string name="profile_owner">Profile owner</string> <string name="profile_owner">Profile owner</string>
<string name="device_owner">Device owner</string> <string name="device_owner">Device owner</string>
<string name="will_reset_policy">所有由OwnDroid设置的设备策略将被清除</string>
<string name="dhizuku_will_be_deactivated">Dhizuku将被停用</string> <string name="dhizuku_will_be_deactivated">Dhizuku将被停用</string>
<string name="activate_device_admin">激活Device admin</string> <string name="activate_device_admin">激活Device admin</string>
<string name="device_info">设备信息</string> <string name="device_info">设备信息</string>

View File

@@ -64,6 +64,7 @@
<string name="profile_owner">Profile owner</string> <string name="profile_owner">Profile owner</string>
<string name="device_owner">Device owner</string> <string name="device_owner">Device owner</string>
<string name="dhizuku_will_be_deactivated">Dhizuku will be deactivated</string> <string name="dhizuku_will_be_deactivated">Dhizuku will be deactivated</string>
<string name="will_reset_policy">All device policies set by OwnDroid will be cleared</string>
<string name="activate_device_admin">Activate Device admin</string> <string name="activate_device_admin">Activate Device admin</string>
<string name="activate_device_admin_command" translatable="false">dpm set-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string> <string name="activate_device_admin_command" translatable="false">dpm set-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
<string name="activate_device_owner_command" translatable="false">dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string> <string name="activate_device_owner_command" translatable="false">dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>