mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-23 19:15:58 +00:00
edit proguard rules, keep IDevicePolicyManager
support getting device admin permission from Dhizuku
This commit is contained in:
@@ -4,7 +4,11 @@ import android.os.Binder;
|
|||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.os.IInterface;
|
import android.os.IInterface;
|
||||||
|
|
||||||
|
import androidx.annotation.Keep;
|
||||||
|
|
||||||
|
@Keep
|
||||||
public interface IDevicePolicyManager extends IInterface {
|
public interface IDevicePolicyManager extends IInterface {
|
||||||
|
@Keep
|
||||||
abstract class Stub extends Binder implements IDevicePolicyManager {
|
abstract class Stub extends Binder implements IDevicePolicyManager {
|
||||||
public static IDevicePolicyManager asInterface(IBinder obj) {
|
public static IDevicePolicyManager asInterface(IBinder obj) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ import com.bintianqi.owndroid.dpm.UserRestriction
|
|||||||
import com.bintianqi.owndroid.dpm.dhizukuErrorStatus
|
import com.bintianqi.owndroid.dpm.dhizukuErrorStatus
|
||||||
import com.bintianqi.owndroid.dpm.getDPM
|
import com.bintianqi.owndroid.dpm.getDPM
|
||||||
import com.bintianqi.owndroid.dpm.getReceiver
|
import com.bintianqi.owndroid.dpm.getReceiver
|
||||||
|
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.ui.Animations
|
import com.bintianqi.owndroid.ui.Animations
|
||||||
@@ -183,7 +184,7 @@ private fun HomePage(navCtrl:NavHostController, pkgName: MutableState<String>) {
|
|||||||
else if(context.isProfileOwner) {
|
else if(context.isProfileOwner) {
|
||||||
if(VERSION.SDK_INT >= 24 && dpm.isManagedProfile(receiver)) R.string.work_profile_owner else R.string.profile_owner
|
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 = "" }
|
LaunchedEffect(Unit) { pkgName.value = "" }
|
||||||
Column(modifier = Modifier.background(colorScheme.background).statusBarsPadding().verticalScroll(rememberScrollState())) {
|
Column(modifier = Modifier.background(colorScheme.background).statusBarsPadding().verticalScroll(rememberScrollState())) {
|
||||||
@@ -205,14 +206,14 @@ private fun HomePage(navCtrl:NavHostController, pkgName: MutableState<String>) {
|
|||||||
) {
|
) {
|
||||||
Spacer(modifier = Modifier.padding(start = 22.dp))
|
Spacer(modifier = Modifier.padding(start = 22.dp))
|
||||||
Icon(
|
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,
|
contentDescription = null,
|
||||||
tint = colorScheme.onPrimary
|
tint = colorScheme.onPrimary
|
||||||
)
|
)
|
||||||
Spacer(modifier = Modifier.padding(start = 10.dp))
|
Spacer(modifier = Modifier.padding(start = 10.dp))
|
||||||
Column {
|
Column {
|
||||||
Text(
|
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,
|
style = typography.headlineSmall,
|
||||||
color = colorScheme.onPrimary,
|
color = colorScheme.onPrimary,
|
||||||
modifier = Modifier.padding(bottom = 2.dp)
|
modifier = Modifier.padding(bottom = 2.dp)
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import android.annotation.SuppressLint
|
|||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
import android.app.admin.DeviceAdminReceiver
|
import android.app.admin.DeviceAdminReceiver
|
||||||
import android.content.BroadcastReceiver
|
import android.content.BroadcastReceiver
|
||||||
import android.content.ComponentName
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.PackageInstaller.EXTRA_STATUS
|
import android.content.pm.PackageInstaller.EXTRA_STATUS
|
||||||
@@ -23,6 +22,7 @@ import android.widget.Toast
|
|||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import com.bintianqi.owndroid.dpm.getDPM
|
import com.bintianqi.owndroid.dpm.getDPM
|
||||||
import com.bintianqi.owndroid.dpm.getReceiver
|
import com.bintianqi.owndroid.dpm.getReceiver
|
||||||
|
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 kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
@@ -30,9 +30,7 @@ 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)
|
||||||
val dpm = context.getDPM()
|
if(context.isDeviceAdmin || context.isProfileOwner || context.isDeviceOwner){
|
||||||
val receiver = ComponentName(context, this::class.java)
|
|
||||||
if(dpm.isAdminActive(receiver) || 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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,11 @@ val Context.isProfileOwner: Boolean
|
|||||||
return dpm.isProfileOwnerApp("com.bintianqi.owndroid")
|
return dpm.isProfileOwnerApp("com.bintianqi.owndroid")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val Context.isDeviceAdmin: Boolean
|
||||||
|
get() {
|
||||||
|
return getDPM().isAdminActive(getReceiver())
|
||||||
|
}
|
||||||
|
|
||||||
val Context.dpcPackageName: String
|
val Context.dpcPackageName: String
|
||||||
get() {
|
get() {
|
||||||
val sharedPref = getSharedPreferences("data", Context.MODE_PRIVATE)
|
val sharedPref = getSharedPreferences("data", Context.MODE_PRIVATE)
|
||||||
|
|||||||
@@ -139,13 +139,13 @@ private fun Home(navCtrl:NavHostController,scrollState: ScrollState) {
|
|||||||
if(VERSION.SDK_INT >= 26 && (context.isDeviceOwner || context.isProfileOwner)) {
|
if(VERSION.SDK_INT >= 26 && (context.isDeviceOwner || context.isProfileOwner)) {
|
||||||
SubPageItem(R.string.reset_password_token, "", R.drawable.key_vertical_fill0) { navCtrl.navigate("ResetPasswordToken") }
|
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") }
|
SubPageItem(R.string.reset_password, "", R.drawable.lock_reset_fill0) { navCtrl.navigate("ResetPassword") }
|
||||||
}
|
}
|
||||||
if(VERSION.SDK_INT >= 31 && (context.isDeviceOwner || context.isProfileOwner)) {
|
if(VERSION.SDK_INT >= 31 && (context.isDeviceOwner || context.isProfileOwner)) {
|
||||||
SubPageItem(R.string.required_password_complexity, "", R.drawable.password_fill0) { navCtrl.navigate("RequirePasswordComplexity") }
|
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") }
|
SubPageItem(R.string.disable_keyguard_features, "", R.drawable.screen_lock_portrait_fill0) { navCtrl.navigate("DisableKeyguardFeatures") }
|
||||||
}
|
}
|
||||||
if(context.isDeviceOwner) {
|
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.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") }
|
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") }
|
SubPageItem(R.string.pwd_history, "", R.drawable.history_fill0) { navCtrl.navigate("PasswordHistoryLength") }
|
||||||
}
|
}
|
||||||
if(VERSION.SDK_INT >= 26 && (context.isDeviceOwner || context.isProfileOwner)) {
|
if(VERSION.SDK_INT >= 26 && (context.isDeviceOwner || context.isProfileOwner)) {
|
||||||
@@ -188,7 +188,7 @@ private fun PasswordInfo() {
|
|||||||
if(context.isDeviceOwner || context.isProfileOwner) {
|
if(context.isDeviceOwner || context.isProfileOwner) {
|
||||||
Text(stringResource(R.string.is_password_sufficient, dpm.isActivePasswordSufficient))
|
Text(stringResource(R.string.is_password_sufficient, dpm.isActivePasswordSufficient))
|
||||||
}
|
}
|
||||||
if(dpm.isAdminActive(receiver)) {
|
if(context.isDeviceAdmin) {
|
||||||
val pwdFailedAttempts = dpm.currentFailedPasswordAttempts
|
val pwdFailedAttempts = dpm.currentFailedPasswordAttempts
|
||||||
Text(text = stringResource(R.string.password_failed_attempts_is, pwdFailedAttempts))
|
Text(text = stringResource(R.string.password_failed_attempts_is, pwdFailedAttempts))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import androidx.navigation.compose.composable
|
|||||||
import androidx.navigation.compose.currentBackStackEntryAsState
|
import androidx.navigation.compose.currentBackStackEntryAsState
|
||||||
import androidx.navigation.compose.rememberNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
import com.bintianqi.owndroid.R
|
import com.bintianqi.owndroid.R
|
||||||
|
import com.bintianqi.owndroid.Receiver
|
||||||
import com.bintianqi.owndroid.backToHomeStateFlow
|
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
|
||||||
@@ -109,7 +110,7 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
SubPageItem(
|
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") }
|
operation = { localNavCtrl.navigate("DeviceAdmin") }
|
||||||
)
|
)
|
||||||
if(!context.isDeviceOwner) {
|
if(!context.isDeviceOwner) {
|
||||||
@@ -139,7 +140,7 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) {
|
|||||||
if(VERSION.SDK_INT >= 24 && (context.isDeviceOwner || dpm.isOrgProfile(receiver))) {
|
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") }
|
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") }
|
SubPageItem(R.string.support_msg, "", R.drawable.chat_fill0) { localNavCtrl.navigate("SupportMsg") }
|
||||||
}
|
}
|
||||||
if(VERSION.SDK_INT >= 28 && (context.isDeviceOwner || context.isProfileOwner)) {
|
if(VERSION.SDK_INT >= 28 && (context.isDeviceOwner || context.isProfileOwner)) {
|
||||||
@@ -222,12 +223,12 @@ private fun DeviceAdmin() {
|
|||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val dpm = context.getDPM()
|
val dpm = context.getDPM()
|
||||||
val receiver = context.getReceiver()
|
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) }
|
var deactivateDialog by remember { mutableStateOf(false) }
|
||||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)) {
|
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)) {
|
||||||
Spacer(Modifier.padding(vertical = 10.dp))
|
Spacer(Modifier.padding(vertical = 10.dp))
|
||||||
Text(text = stringResource(R.string.device_admin), style = typography.headlineLarge)
|
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))
|
Spacer(Modifier.padding(vertical = 5.dp))
|
||||||
AnimatedVisibility(showDeactivateButton) {
|
AnimatedVisibility(showDeactivateButton) {
|
||||||
Button(
|
Button(
|
||||||
@@ -270,8 +271,8 @@ private fun DeviceAdmin() {
|
|||||||
co.launch{
|
co.launch{
|
||||||
delay(300)
|
delay(300)
|
||||||
deactivateDialog = false
|
deactivateDialog = false
|
||||||
showDeactivateButton = dpm.isAdminActive(receiver)
|
showDeactivateButton = context.isDeviceAdmin
|
||||||
backToHomeStateFlow.value = !dpm.isAdminActive(receiver)
|
backToHomeStateFlow.value = !context.isDeviceAdmin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ fun ShizukuActivate() {
|
|||||||
var enabled by remember { mutableStateOf(false) }
|
var enabled by remember { mutableStateOf(false) }
|
||||||
var bindShizuku by remember { mutableStateOf(false) }
|
var bindShizuku by remember { mutableStateOf(false) }
|
||||||
var outputText by remember { mutableStateOf("") }
|
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 showProfileOwnerButton by remember { mutableStateOf(!context.isProfileOwner) }
|
||||||
var showDeviceOwnerButton by remember { mutableStateOf(!context.isDeviceOwner) }
|
var showDeviceOwnerButton by remember { mutableStateOf(!context.isDeviceOwner) }
|
||||||
var showOrgProfileOwnerButton by remember { mutableStateOf(true) }
|
var showOrgProfileOwnerButton by remember { mutableStateOf(true) }
|
||||||
@@ -124,7 +124,7 @@ fun ShizukuActivate() {
|
|||||||
outputText = service!!.execute(context.getString(R.string.dpm_activate_da_command))
|
outputText = service!!.execute(context.getString(R.string.dpm_activate_da_command))
|
||||||
outputTextScrollState.animateScrollTo(0)
|
outputTextScrollState.animateScrollTo(0)
|
||||||
delay(500)
|
delay(500)
|
||||||
showDeviceAdminButton = !dpm.isAdminActive(receiver)
|
showDeviceAdminButton = !context.isDeviceAdmin
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
enabled = enabled
|
enabled = enabled
|
||||||
|
|||||||
@@ -224,7 +224,7 @@ private fun Home(navCtrl: NavHostController, scrollState: ScrollState, rebootDia
|
|||||||
if(VERSION.SDK_INT >= 30 && (context.isDeviceOwner || dpm.isOrgProfile(receiver))) {
|
if(VERSION.SDK_INT >= 30 && (context.isDeviceOwner || dpm.isOrgProfile(receiver))) {
|
||||||
SubPageItem(R.string.frp_policy, "", R.drawable.device_reset_fill0) { navCtrl.navigate("FRP") }
|
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") }
|
SubPageItem(R.string.wipe_data, "", R.drawable.device_reset_fill0) { navCtrl.navigate("WipeData") }
|
||||||
}
|
}
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
@@ -337,7 +337,7 @@ private fun Keyguard() {
|
|||||||
var flag by remember { mutableIntStateOf(0) }
|
var flag by remember { mutableIntStateOf(0) }
|
||||||
Button(
|
Button(
|
||||||
onClick = { dpm.lockNow() },
|
onClick = { dpm.lockNow() },
|
||||||
enabled = dpm.isAdminActive(receiver),
|
enabled = context.isDeviceAdmin,
|
||||||
modifier = Modifier.fillMaxWidth()
|
modifier = Modifier.fillMaxWidth()
|
||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.lock_now))
|
Text(stringResource(R.string.lock_now))
|
||||||
|
|||||||
Reference in New Issue
Block a user