From 21d39248011e5718f3aa799aca8bd94c53e67f52 Mon Sep 17 00:00:00 2001 From: BinTianqi Date: Sun, 21 Jul 2024 18:14:56 +0800 Subject: [PATCH] edit proguard rules, keep IDevicePolicyManager support getting device admin permission from Dhizuku --- .../android/app/admin/IDevicePolicyManager.java | 4 ++++ .../java/com/bintianqi/owndroid/MainActivity.kt | 7 ++++--- .../main/java/com/bintianqi/owndroid/Receiver.kt | 6 ++---- app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt | 5 +++++ .../java/com/bintianqi/owndroid/dpm/Password.kt | 8 ++++---- .../java/com/bintianqi/owndroid/dpm/Permissions.kt | 13 +++++++------ .../com/bintianqi/owndroid/dpm/ShizukuActivate.kt | 4 ++-- .../com/bintianqi/owndroid/dpm/SystemManager.kt | 4 ++-- 8 files changed, 30 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/android/app/admin/IDevicePolicyManager.java b/app/src/main/java/android/app/admin/IDevicePolicyManager.java index 87c8c59..dd9b3b9 100644 --- a/app/src/main/java/android/app/admin/IDevicePolicyManager.java +++ b/app/src/main/java/android/app/admin/IDevicePolicyManager.java @@ -4,7 +4,11 @@ import android.os.Binder; import android.os.IBinder; import android.os.IInterface; +import androidx.annotation.Keep; + +@Keep public interface IDevicePolicyManager extends IInterface { + @Keep abstract class Stub extends Binder implements IDevicePolicyManager { public static IDevicePolicyManager asInterface(IBinder obj) { throw new UnsupportedOperationException(); diff --git a/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt b/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt index fff179f..6c7f210 100644 --- a/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt +++ b/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt @@ -62,6 +62,7 @@ import com.bintianqi.owndroid.dpm.UserRestriction import com.bintianqi.owndroid.dpm.dhizukuErrorStatus import com.bintianqi.owndroid.dpm.getDPM 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.ui.Animations @@ -183,7 +184,7 @@ private fun HomePage(navCtrl:NavHostController, pkgName: MutableState) { else if(context.isProfileOwner) { if(VERSION.SDK_INT >= 24 && dpm.isManagedProfile(receiver)) R.string.work_profile_owner else R.string.profile_owner } - else if(dpm.isAdminActive(receiver)) R.string.device_admin else R.string.click_to_activate + else if(context.isDeviceAdmin) R.string.device_admin else R.string.click_to_activate ) LaunchedEffect(Unit) { pkgName.value = "" } Column(modifier = Modifier.background(colorScheme.background).statusBarsPadding().verticalScroll(rememberScrollState())) { @@ -205,14 +206,14 @@ private fun HomePage(navCtrl:NavHostController, pkgName: MutableState) { ) { Spacer(modifier = Modifier.padding(start = 22.dp)) Icon( - painter = painterResource(if(dpm.isAdminActive(receiver)) R.drawable.check_circle_fill1 else R.drawable.block_fill0), + painter = painterResource(if(context.isDeviceAdmin) R.drawable.check_circle_fill1 else R.drawable.block_fill0), contentDescription = null, tint = colorScheme.onPrimary ) Spacer(modifier = Modifier.padding(start = 10.dp)) Column { Text( - text = stringResource(if(dpm.isAdminActive(receiver)) R.string.activated else R.string.deactivated), + text = stringResource(if(context.isDeviceAdmin) R.string.activated else R.string.deactivated), style = typography.headlineSmall, color = colorScheme.onPrimary, modifier = Modifier.padding(bottom = 2.dp) diff --git a/app/src/main/java/com/bintianqi/owndroid/Receiver.kt b/app/src/main/java/com/bintianqi/owndroid/Receiver.kt index 80295ed..c33f8b8 100644 --- a/app/src/main/java/com/bintianqi/owndroid/Receiver.kt +++ b/app/src/main/java/com/bintianqi/owndroid/Receiver.kt @@ -4,7 +4,6 @@ import android.annotation.SuppressLint import android.app.NotificationManager import android.app.admin.DeviceAdminReceiver import android.content.BroadcastReceiver -import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.pm.PackageInstaller.EXTRA_STATUS @@ -23,6 +22,7 @@ import android.widget.Toast import androidx.activity.ComponentActivity import com.bintianqi.owndroid.dpm.getDPM 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 kotlinx.coroutines.flow.MutableStateFlow @@ -30,9 +30,7 @@ import kotlinx.coroutines.flow.MutableStateFlow class Receiver : DeviceAdminReceiver() { override fun onEnabled(context: Context, intent: Intent) { super.onEnabled(context, intent) - val dpm = context.getDPM() - val receiver = ComponentName(context, this::class.java) - if(dpm.isAdminActive(receiver) || context.isProfileOwner || context.isDeviceOwner){ + if(context.isDeviceAdmin || context.isProfileOwner || context.isDeviceOwner){ Toast.makeText(context, context.getString(R.string.onEnabled), Toast.LENGTH_SHORT).show() } } 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 6658b0f..16e52d3 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt @@ -45,6 +45,11 @@ val Context.isProfileOwner: Boolean return dpm.isProfileOwnerApp("com.bintianqi.owndroid") } +val Context.isDeviceAdmin: Boolean + get() { + return getDPM().isAdminActive(getReceiver()) + } + val Context.dpcPackageName: String get() { val sharedPref = getSharedPreferences("data", Context.MODE_PRIVATE) 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 1ac3117..d754389 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Password.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Password.kt @@ -139,13 +139,13 @@ private fun Home(navCtrl:NavHostController,scrollState: ScrollState) { if(VERSION.SDK_INT >= 26 && (context.isDeviceOwner || context.isProfileOwner)) { SubPageItem(R.string.reset_password_token, "", R.drawable.key_vertical_fill0) { navCtrl.navigate("ResetPasswordToken") } } - if(dpm.isAdminActive(receiver) || context.isDeviceOwner || context.isProfileOwner) { + if(context.isDeviceAdmin || context.isDeviceOwner || context.isProfileOwner) { SubPageItem(R.string.reset_password, "", R.drawable.lock_reset_fill0) { navCtrl.navigate("ResetPassword") } } if(VERSION.SDK_INT >= 31 && (context.isDeviceOwner || context.isProfileOwner)) { SubPageItem(R.string.required_password_complexity, "", R.drawable.password_fill0) { navCtrl.navigate("RequirePasswordComplexity") } } - if(dpm.isAdminActive(receiver)) { + if(context.isDeviceAdmin) { SubPageItem(R.string.disable_keyguard_features, "", R.drawable.screen_lock_portrait_fill0) { navCtrl.navigate("DisableKeyguardFeatures") } } if(context.isDeviceOwner) { @@ -153,7 +153,7 @@ private fun Home(navCtrl:NavHostController,scrollState: ScrollState) { SubPageItem(R.string.pwd_expiration_timeout, "", R.drawable.lock_clock_fill0) { navCtrl.navigate("PasswordTimeout") } SubPageItem(R.string.max_pwd_fail, "", R.drawable.no_encryption_fill0) { navCtrl.navigate("MaxPasswordFail") } } - if(dpm.isAdminActive(receiver)){ + if(context.isDeviceAdmin){ SubPageItem(R.string.pwd_history, "", R.drawable.history_fill0) { navCtrl.navigate("PasswordHistoryLength") } } if(VERSION.SDK_INT >= 26 && (context.isDeviceOwner || context.isProfileOwner)) { @@ -188,7 +188,7 @@ private fun PasswordInfo() { if(context.isDeviceOwner || context.isProfileOwner) { Text(stringResource(R.string.is_password_sufficient, dpm.isActivePasswordSufficient)) } - if(dpm.isAdminActive(receiver)) { + if(context.isDeviceAdmin) { val pwdFailedAttempts = dpm.currentFailedPasswordAttempts Text(text = stringResource(R.string.password_failed_attempts_is, pwdFailedAttempts)) } 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 46b5727..119d4d1 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt @@ -36,6 +36,7 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.bintianqi.owndroid.R +import com.bintianqi.owndroid.Receiver import com.bintianqi.owndroid.backToHomeStateFlow import com.bintianqi.owndroid.ui.* import com.rosan.dhizuku.api.Dhizuku @@ -109,7 +110,7 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) { ) } SubPageItem( - R.string.device_admin, stringResource(if(dpm.isAdminActive(receiver)) R.string.activated else R.string.deactivated), + R.string.device_admin, stringResource(if(context.isDeviceAdmin) R.string.activated else R.string.deactivated), operation = { localNavCtrl.navigate("DeviceAdmin") } ) if(!context.isDeviceOwner) { @@ -139,7 +140,7 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) { if(VERSION.SDK_INT >= 24 && (context.isDeviceOwner || dpm.isOrgProfile(receiver))) { SubPageItem(R.string.device_owner_lock_screen_info, "", R.drawable.screen_lock_portrait_fill0) { localNavCtrl.navigate("LockScreenInfo") } } - if(VERSION.SDK_INT >= 24 && dpm.isAdminActive(receiver)) { + if(VERSION.SDK_INT >= 24 && context.isDeviceAdmin) { SubPageItem(R.string.support_msg, "", R.drawable.chat_fill0) { localNavCtrl.navigate("SupportMsg") } } if(VERSION.SDK_INT >= 28 && (context.isDeviceOwner || context.isProfileOwner)) { @@ -222,12 +223,12 @@ private fun DeviceAdmin() { val context = LocalContext.current val dpm = context.getDPM() val receiver = context.getReceiver() - var showDeactivateButton by remember { mutableStateOf(dpm.isAdminActive(receiver)) } + var showDeactivateButton by remember { mutableStateOf(context.isDeviceAdmin) } var deactivateDialog by remember { mutableStateOf(false) } Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)) { Spacer(Modifier.padding(vertical = 10.dp)) Text(text = stringResource(R.string.device_admin), style = typography.headlineLarge) - Text(text = stringResource(if(dpm.isAdminActive(receiver)) R.string.activated else R.string.deactivated), style = typography.titleLarge) + Text(text = stringResource(if(context.isDeviceAdmin) R.string.activated else R.string.deactivated), style = typography.titleLarge) Spacer(Modifier.padding(vertical = 5.dp)) AnimatedVisibility(showDeactivateButton) { Button( @@ -270,8 +271,8 @@ private fun DeviceAdmin() { co.launch{ delay(300) deactivateDialog = false - showDeactivateButton = dpm.isAdminActive(receiver) - backToHomeStateFlow.value = !dpm.isAdminActive(receiver) + showDeactivateButton = context.isDeviceAdmin + backToHomeStateFlow.value = !context.isDeviceAdmin } } ) { diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt index ac4fd60..81d97a0 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt @@ -50,7 +50,7 @@ fun ShizukuActivate() { var enabled by remember { mutableStateOf(false) } var bindShizuku by remember { mutableStateOf(false) } var outputText by remember { mutableStateOf("") } - var showDeviceAdminButton by remember { mutableStateOf(!dpm.isAdminActive(receiver)) } + var showDeviceAdminButton by remember { mutableStateOf(!context.isDeviceAdmin) } var showProfileOwnerButton by remember { mutableStateOf(!context.isProfileOwner) } var showDeviceOwnerButton by remember { mutableStateOf(!context.isDeviceOwner) } var showOrgProfileOwnerButton by remember { mutableStateOf(true) } @@ -124,7 +124,7 @@ fun ShizukuActivate() { outputText = service!!.execute(context.getString(R.string.dpm_activate_da_command)) outputTextScrollState.animateScrollTo(0) delay(500) - showDeviceAdminButton = !dpm.isAdminActive(receiver) + showDeviceAdminButton = !context.isDeviceAdmin } }, enabled = enabled diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/SystemManager.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/SystemManager.kt index be7f550..7424a9f 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/SystemManager.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/SystemManager.kt @@ -224,7 +224,7 @@ private fun Home(navCtrl: NavHostController, scrollState: ScrollState, rebootDia if(VERSION.SDK_INT >= 30 && (context.isDeviceOwner || dpm.isOrgProfile(receiver))) { SubPageItem(R.string.frp_policy, "", R.drawable.device_reset_fill0) { navCtrl.navigate("FRP") } } - if(dangerousFeatures && dpm.isAdminActive(receiver) && !(VERSION.SDK_INT >= 24 && context.isProfileOwner && dpm.isManagedProfile(receiver))) { + if(dangerousFeatures && context.isDeviceAdmin && !(VERSION.SDK_INT >= 24 && context.isProfileOwner && dpm.isManagedProfile(receiver))) { SubPageItem(R.string.wipe_data, "", R.drawable.device_reset_fill0) { navCtrl.navigate("WipeData") } } Spacer(Modifier.padding(vertical = 30.dp)) @@ -337,7 +337,7 @@ private fun Keyguard() { var flag by remember { mutableIntStateOf(0) } Button( onClick = { dpm.lockNow() }, - enabled = dpm.isAdminActive(receiver), + enabled = context.isDeviceAdmin, modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.lock_now))