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 5918174..9580301 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/ApplicationManage.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/ApplicationManage.kt @@ -268,7 +268,7 @@ private fun Home( if(VERSION.SDK_INT>=28&&isDeviceOwner(dpm)) { SubPageItem(R.string.keep_uninstalled_packages, "", R.drawable.delete_fill0) { navCtrl.navigate("KeepUninstalled") } } - if(VERSION.SDK_INT>=28) { + if(VERSION.SDK_INT>=28 && (isDeviceOwner(dpm) || isProfileOwner(dpm))) { SubPageItem(R.string.clear_app_storage, "", R.drawable.mop_fill0) { if(pkgName != "") { clearAppDataDialog.value = true } } 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 d94c660..efb5151 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt @@ -1,7 +1,9 @@ package com.bintianqi.owndroid.dpm import android.app.admin.DevicePolicyManager +import android.content.ComponentName import android.content.Intent +import android.os.Build.VERSION import androidx.activity.result.ActivityResultLauncher import kotlinx.coroutines.flow.MutableStateFlow @@ -16,3 +18,7 @@ fun isDeviceOwner(dpm: DevicePolicyManager): Boolean { fun isProfileOwner(dpm: DevicePolicyManager): Boolean { return dpm.isProfileOwnerApp("com.bintianqi.owndroid") } + +fun DevicePolicyManager.isOrgProfile(receiver: ComponentName):Boolean { + return VERSION.SDK_INT >= 30 && isProfileOwner(this) && isManagedProfile(receiver) && isOrganizationOwnedDeviceWithManagedProfile +} 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 3786cb7..61e1b95 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/ManagedProfile.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/ManagedProfile.kt @@ -106,7 +106,7 @@ private fun Home(navCtrl: NavHostController) { if(VERSION.SDK_INT<24 || (VERSION.SDK_INT>=24 && dpm.isProvisioningAllowed(ACTION_PROVISION_MANAGED_PROFILE))) { SubPageItem(R.string.create_work_profile, "", R.drawable.work_fill0) { navCtrl.navigate("CreateWorkProfile") } } - if(VERSION.SDK_INT >= 30&&isProfileOwner(dpm) && dpm.isManagedProfile(receiver) && dpm.isOrganizationOwnedDeviceWithManagedProfile) { + if(dpm.isOrgProfile(receiver)) { SubPageItem(R.string.suspend_personal_app, "", R.drawable.block_fill0) { navCtrl.navigate("SuspendPersonalApp") } } if(isProfileOwner(dpm) && (VERSION.SDK_INT<24 || (VERSION.SDK_INT>=24 && dpm.isManagedProfile(receiver)))) { 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 9988563..3edf72b 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Network.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Network.kt @@ -158,16 +158,16 @@ private fun Home(navCtrl:NavHostController, scrollState: ScrollState, wifiMacDia style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp) ) - if(VERSION.SDK_INT >= 24 && (isDeviceOwner(dpm) || (VERSION.SDK_INT >= 30 && isProfileOwner(dpm) && dpm.isManagedProfile(receiver) && dpm.isOrganizationOwnedDeviceWithManagedProfile))) { + if(VERSION.SDK_INT >= 24 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) { SubPageItem(R.string.wifi_mac_addr, "", R.drawable.wifi_fill0) { wifiMacDialog.value = true } } if(VERSION.SDK_INT >= 30) { SubPageItem(R.string.options, "", R.drawable.tune_fill0) { navCtrl.navigate("Switches") } } - if(VERSION.SDK_INT >= 33) { + if(VERSION.SDK_INT >= 33 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) { SubPageItem(R.string.min_wifi_security_level, "", R.drawable.wifi_password_fill0) { navCtrl.navigate("MinWifiSecurityLevel") } } - if(VERSION.SDK_INT >= 33 && (isDeviceOwner(dpm) || (isProfileOwner(dpm) && dpm.isOrganizationOwnedDeviceWithManagedProfile))) { + if(VERSION.SDK_INT >= 33 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) { SubPageItem(R.string.wifi_ssid_policy, "", R.drawable.wifi_fill0) { navCtrl.navigate("WifiSsidPolicy") } } if(VERSION.SDK_INT >= 29 && isDeviceOwner(dpm)) { @@ -199,7 +199,7 @@ private fun Switches() { { dpm.isPreferentialNetworkServiceEnabled }, { dpm.isPreferentialNetworkServiceEnabled = it } ) } - if(VERSION.SDK_INT>=30&&(isDeviceOwner(dpm)||(isProfileOwner(dpm)&&dpm.isOrganizationOwnedDeviceWithManagedProfile))) { + if(VERSION.SDK_INT>=30 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) { SwitchItem(R.string.wifi_lockdown, "", R.drawable.wifi_password_fill0, { dpm.hasLockdownAdminConfiguredNetworks(receiver) }, { dpm.setConfiguredNetworksLockdownState(receiver,it) } ) @@ -240,7 +240,6 @@ private fun WifiSecLevel() { ) Spacer(Modifier.padding(vertical = 5.dp)) Button( - enabled = isDeviceOwner(dpm) || (isProfileOwner(dpm) && dpm.isOrganizationOwnedDeviceWithManagedProfile), onClick = { dpm.minimumRequiredWifiSecurityLevel = selectedWifiSecLevel Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() 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 b723b73..7e29191 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Password.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Password.kt @@ -82,6 +82,7 @@ fun Password(navCtrl: NavHostController) { private fun Home(navCtrl:NavHostController,scrollState: ScrollState) { val context = LocalContext.current val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager + val receiver = ComponentName(context, Receiver::class.java) Column(modifier = Modifier.fillMaxSize().verticalScroll(scrollState)) { Text( text = stringResource(R.string.password_and_keyguard), @@ -89,14 +90,18 @@ private fun Home(navCtrl:NavHostController,scrollState: ScrollState) { modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp) ) SubPageItem(R.string.password_info, "", R.drawable.info_fill0) { navCtrl.navigate("PasswordInfo") } - if(VERSION.SDK_INT >= 26) { + if(VERSION.SDK_INT >= 26 && (isDeviceOwner(dpm) || isProfileOwner(dpm))) { SubPageItem(R.string.reset_password_token, "", R.drawable.key_vertical_fill0) { navCtrl.navigate("ResetPasswordToken") } } - SubPageItem(R.string.reset_password, "", R.drawable.lock_reset_fill0) { navCtrl.navigate("ResetPassword") } - if(VERSION.SDK_INT >= 31) { + if(dpm.isAdminActive(receiver) || isDeviceOwner(dpm) || isProfileOwner(dpm)) { + SubPageItem(R.string.reset_password, "", R.drawable.lock_reset_fill0) { navCtrl.navigate("ResetPassword") } + } + if(VERSION.SDK_INT >= 31 && (isDeviceOwner(dpm) || isProfileOwner(dpm))) { SubPageItem(R.string.required_password_complexity, "", R.drawable.password_fill0) { navCtrl.navigate("RequirePasswordComplexity") } } - SubPageItem(R.string.keyguard_disabled_features, "", R.drawable.screen_lock_portrait_fill0) { navCtrl.navigate("KeyguardDisabledFeatures") } + if(isDeviceOwner(dpm)) { + SubPageItem(R.string.keyguard_disabled_features, "", R.drawable.screen_lock_portrait_fill0) { navCtrl.navigate("KeyguardDisabledFeatures") } + } if(isDeviceOwner(dpm)) { SubPageItem(R.string.max_time_to_lock, "", R.drawable.schedule_fill0) { navCtrl.navigate("MaxTimeToLock") } SubPageItem(R.string.pwd_timeout, "", R.drawable.lock_clock_fill0) { navCtrl.navigate("PasswordTimeout") } @@ -106,7 +111,9 @@ private fun Home(navCtrl:NavHostController,scrollState: ScrollState) { if(VERSION.SDK_INT >= 26 && (isDeviceOwner(dpm) || isProfileOwner(dpm))) { SubPageItem(R.string.required_strong_auth_timeout, "", R.drawable.fingerprint_off_fill0) { navCtrl.navigate("RequiredStrongAuthTimeout") } } - SubPageItem(R.string.required_password_quality, "", R.drawable.password_fill0) { navCtrl.navigate("RequirePasswordQuality") } + if(isDeviceOwner(dpm) || isProfileOwner(dpm)) { + SubPageItem(R.string.required_password_quality, "", R.drawable.password_fill0) { navCtrl.navigate("RequirePasswordQuality") } + } Spacer(Modifier.padding(vertical = 30.dp)) } } @@ -163,8 +170,7 @@ private fun ResetPasswordToken() { Toast.LENGTH_SHORT ).show() }, - modifier = Modifier.fillMaxWidth(), - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm) + modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.clear)) } @@ -180,7 +186,6 @@ private fun ResetPasswordToken() { Toast.makeText(context, R.string.security_exception, Toast.LENGTH_SHORT).show() } }, - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.set)) @@ -192,7 +197,6 @@ private fun ResetPasswordToken() { catch(e:NullPointerException) { Toast.makeText(context, R.string.please_set_a_token, Toast.LENGTH_SHORT).show() } } else { Toast.makeText(context, R.string.token_already_activated, Toast.LENGTH_SHORT).show() } }, - enabled = isDeviceOwner(dpm)||isProfileOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.activate)) @@ -219,7 +223,7 @@ private fun ResetPassword() { OutlinedTextField( value = newPwd, onValueChange = { newPwd=it }, - enabled = !confirmed && (isDeviceOwner(dpm) || isProfileOwner(dpm) || dpm.isAdminActive(receiver)), + enabled = !confirmed, label = { Text(stringResource(R.string.password)) }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password, imeAction = ImeAction.Done), keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }), @@ -247,7 +251,6 @@ private fun ResetPassword() { if(newPwd.length>=4 || newPwd.isEmpty()) { confirmed=!confirmed } else { Toast.makeText(context, R.string.require_4_digit_password, Toast.LENGTH_SHORT).show() } }, - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm) || dpm.isAdminActive(receiver), modifier = Modifier.fillMaxWidth(), colors = ButtonDefaults.buttonColors( containerColor = if(confirmed) colorScheme.primary else colorScheme.error, @@ -301,9 +304,7 @@ private fun PasswordComplexity() { PASSWORD_COMPLEXITY_HIGH to stringResource(R.string.password_complexity_high) ).toList() var selectedItem by remember { mutableIntStateOf(passwordComplexity[0].first) } - if(isDeviceOwner(dpm) || isProfileOwner(dpm)) { - selectedItem=dpm.requiredPasswordComplexity - } + LaunchedEffect(Unit) { selectedItem = dpm.requiredPasswordComplexity } Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) { Spacer(Modifier.padding(vertical = 10.dp)) Text(text = stringResource(R.string.required_password_complexity), style = typography.headlineLarge) @@ -335,7 +336,6 @@ private fun PasswordComplexity() { dpm.requiredPasswordComplexity = selectedItem Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() }, - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(text = stringResource(R.string.apply)) @@ -607,7 +607,6 @@ private fun KeyguardDisabledFeatures() { Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() calculateCustomFeature() }, - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(text = stringResource(R.string.apply)) @@ -632,7 +631,7 @@ private fun PasswordQuality() { PASSWORD_QUALITY_COMPLEX to stringResource(R.string.custom) + "(${stringResource(R.string.unsupported) })", ).toList() var selectedItem by remember { mutableIntStateOf(passwordQuality[0].first) } - if(isDeviceOwner(dpm) || isProfileOwner(dpm)) { selectedItem=dpm.getPasswordQuality(receiver) } + LaunchedEffect(Unit) { selectedItem=dpm.getPasswordQuality(receiver) } Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) { Spacer(Modifier.padding(vertical = 10.dp)) Text(text = stringResource(R.string.required_password_quality), style = typography.headlineLarge) @@ -654,7 +653,6 @@ private fun PasswordQuality() { dpm.setPasswordQuality(receiver,selectedItem) Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() }, - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.apply)) 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 fd8597a..c223453 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt @@ -283,11 +283,12 @@ private fun DeviceOwner() { fun DeviceInfo() { val context = LocalContext.current val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager + val receiver = ComponentName(context,Receiver::class.java) Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)) { Spacer(Modifier.padding(vertical = 10.dp)) Text(text = stringResource(R.string.device_info), style = typography.headlineLarge) Spacer(Modifier.padding(vertical = 5.dp)) - if(VERSION.SDK_INT>=34 && (isDeviceOwner(dpm) || (isProfileOwner(dpm) && dpm.isOrganizationOwnedDeviceWithManagedProfile))) { + if(VERSION.SDK_INT>=34 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) { val financed = dpm.isDeviceFinanced Text(stringResource(R.string.is_device_financed, financed)) } 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 b7d0272..ad38508 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt @@ -168,9 +168,7 @@ fun ShizukuActivate() { } } - if( - VERSION.SDK_INT >= 30 && isProfileOwner(dpm) && dpm.isManagedProfile(receiver) && !dpm.isOrganizationOwnedDeviceWithManagedProfile - ) { + if(VERSION.SDK_INT >= 30 && !dpm.isOrgProfile(receiver)) { AnimatedVisibility(showOrgProfileOwnerButton) { Button( onClick = { 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 a458fac..c73462a 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/SystemManager.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/SystemManager.kt @@ -176,11 +176,13 @@ private fun Home(navCtrl: NavHostController, scrollState: ScrollState, rebootDia SubPageItem(R.string.options, "", R.drawable.tune_fill0) { navCtrl.navigate("Switches") } } SubPageItem(R.string.keyguard, "", R.drawable.screen_lock_portrait_fill0) { navCtrl.navigate("Keyguard") } - if(VERSION.SDK_INT >= 24) { - SubPageItem(R.string.bug_report, "", R.drawable.bug_report_fill0) { bugReportDialog.value = true } + if(VERSION.SDK_INT >= 24 && isDeviceOwner(dpm)) { SubPageItem(R.string.reboot, "", R.drawable.restart_alt_fill0) { rebootDialog.value = true } } - if(VERSION.SDK_INT >= 28) { + if(isDeviceOwner(dpm) && ((VERSION.SDK_INT >= 28 && dpm.isAffiliatedUser) || VERSION.SDK_INT >= 24)) { + SubPageItem(R.string.bug_report, "", R.drawable.bug_report_fill0) { bugReportDialog.value = true } + } + if(VERSION.SDK_INT >= 28 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) { SubPageItem(R.string.edit_time, "", R.drawable.schedule_fill0) { navCtrl.navigate("EditTime") } SubPageItem(R.string.edit_timezone, "", R.drawable.schedule_fill0) { navCtrl.navigate("EditTimeZone") } } @@ -199,26 +201,21 @@ private fun Home(navCtrl: NavHostController, scrollState: ScrollState, rebootDia if(isDeviceOwner(dpm) || isProfileOwner(dpm)) { SubPageItem(R.string.ca_cert, "", R.drawable.license_fill0) { navCtrl.navigate("CaCert") } } - if(VERSION.SDK_INT >= 26 && (isDeviceOwner(dpm) || (VERSION.SDK_INT >= 30 && isProfileOwner(dpm) && dpm.isOrganizationOwnedDeviceWithManagedProfile))) { + if(VERSION.SDK_INT >= 26 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) { SubPageItem(R.string.security_logs, "", R.drawable.description_fill0) { navCtrl.navigate("SecurityLogs") } } - if(VERSION.SDK_INT >= 23 && isDeviceOwner(dpm)) { + if(VERSION.SDK_INT >= 23 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) { SubPageItem(R.string.system_update_policy, "", R.drawable.system_update_fill0) { navCtrl.navigate("SystemUpdatePolicy") } } - if( - VERSION.SDK_INT >= 29 && - (isDeviceOwner(dpm) || - (VERSION.SDK_INT >= 30 && isProfileOwner(dpm) && dpm.isManagedProfile(receiver) && dpm.isOrganizationOwnedDeviceWithManagedProfile)) - ) { + if(VERSION.SDK_INT >= 29 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) { SubPageItem(R.string.install_system_update, "", R.drawable.system_update_fill0) { navCtrl.navigate("InstallSystemUpdate") } } - if( - VERSION.SDK_INT >= 30 && - (isDeviceOwner(dpm) || (isProfileOwner(dpm) && dpm.isManagedProfile(receiver) && dpm.isOrganizationOwnedDeviceWithManagedProfile)) - ) { + if(VERSION.SDK_INT >= 30 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) { SubPageItem(R.string.frp_policy, "", R.drawable.device_reset_fill0) { navCtrl.navigate("FRP") } } - SubPageItem(R.string.wipe_data, "", R.drawable.warning_fill0) { navCtrl.navigate("WipeData") } + if(dpm.isAdminActive(receiver)) { + SubPageItem(R.string.wipe_data, "", R.drawable.warning_fill0) { navCtrl.navigate("WipeData") } + } Spacer(Modifier.padding(vertical = 30.dp)) LaunchedEffect(Unit) { fileUriFlow.value = Uri.parse("") } } @@ -246,7 +243,7 @@ private fun Switches() { { dpm.isStatusBarDisabled}, { dpm.setStatusBarDisabled(receiver,it) } ) } - if(isDeviceOwner(dpm) || (VERSION.SDK_INT >= 30 && isProfileOwner(dpm) && dpm.isOrganizationOwnedDeviceWithManagedProfile)) { + if(isDeviceOwner(dpm) || dpm.isOrgProfile(receiver)) { if(VERSION.SDK_INT >= 30) { SwitchItem(R.string.auto_time, "", R.drawable.schedule_fill0, { dpm.getAutoTimeEnabled(receiver) }, { dpm.setAutoTimeEnabled(receiver,it) } @@ -278,7 +275,7 @@ private fun Switches() { { dpm.isCommonCriteriaModeEnabled(receiver) }, { dpm.setCommonCriteriaModeEnabled(receiver,it) } ) } - if(VERSION.SDK_INT >= 31 && (isDeviceOwner(dpm) || (VERSION.SDK_INT >= 30 && isProfileOwner(dpm) && dpm.isOrganizationOwnedDeviceWithManagedProfile))) { + if(VERSION.SDK_INT >= 31 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) { SwitchItem( R.string.usb_signal, "", R.drawable.usb_fill0, { dpm.isUsbDataSignalingEnabled }, { @@ -422,14 +419,13 @@ private fun EditTime() { onValueChange = { inputTime = it}, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done), keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus() }), - enabled = isDeviceOwner(dpm) || (VERSION.SDK_INT >= 30 && isProfileOwner(dpm) && dpm.isOrganizationOwnedDeviceWithManagedProfile), modifier = Modifier.fillMaxWidth() ) Spacer(Modifier.padding(vertical = 5.dp)) Button( onClick = { dpm.setTime(receiver,inputTime.toLong()) }, modifier = Modifier.fillMaxWidth(), - enabled = inputTime!="" && (isDeviceOwner(dpm) || (VERSION.SDK_INT >= 30 && isProfileOwner(dpm) && dpm.isOrganizationOwnedDeviceWithManagedProfile)) + enabled = inputTime != "" ) { Text(stringResource(R.string.apply)) } @@ -1065,7 +1061,6 @@ private fun WipeData() { containerColor = if(confirmed) colorScheme.primary else colorScheme.error , contentColor = if(confirmed) colorScheme.onPrimary else colorScheme.onError ), - enabled = dpm.isAdminActive(receiver), modifier = Modifier.fillMaxWidth() ) { Text(text = stringResource(if(confirmed) R.string.cancel else R.string.confirm)) @@ -1084,7 +1079,7 @@ private fun WipeData() { ) { Text("WipeData") } - if (VERSION.SDK_INT >= 34 && (isDeviceOwner(dpm) || (isProfileOwner(dpm) && dpm.isOrganizationOwnedDeviceWithManagedProfile))) { + if (VERSION.SDK_INT >= 34 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) { Button( onClick = { dpm.wipeDevice(flag) }, colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError), @@ -1167,7 +1162,6 @@ private fun SysUpdatePolicy() { dpm.setSystemUpdatePolicy(receiver,policy) Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() }, - enabled = isDeviceOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.apply)) 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 780f2f7..f84fa8b 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/UserManager.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/UserManager.kt @@ -117,11 +117,15 @@ private fun Home(navCtrl: NavHostController,scrollState: ScrollState) { modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp) ) SubPageItem(R.string.user_info, "", R.drawable.person_fill0) { navCtrl.navigate("UserInfo") } - SubPageItem(R.string.user_operation, "", R.drawable.sync_alt_fill0) { navCtrl.navigate("UserOperation") } + if(isDeviceOwner(dpm)) { + SubPageItem(R.string.user_operation, "", R.drawable.sync_alt_fill0) { navCtrl.navigate("UserOperation") } + } if(VERSION.SDK_INT >= 24 && isDeviceOwner(dpm)) { SubPageItem(R.string.create_user, "", R.drawable.person_add_fill0) { navCtrl.navigate("CreateUser") } } - SubPageItem(R.string.edit_username, "", R.drawable.edit_fill0) { navCtrl.navigate("EditUsername") } + if(isDeviceOwner(dpm) || isProfileOwner(dpm)) { + SubPageItem(R.string.edit_username, "", R.drawable.edit_fill0) { navCtrl.navigate("EditUsername") } + } if(VERSION.SDK_INT >= 23 && (isDeviceOwner(dpm) || isProfileOwner(dpm))) { SubPageItem(R.string.change_user_icon, "", R.drawable.account_circle_fill0) { navCtrl.navigate("ChangeUserIcon") } } @@ -195,7 +199,6 @@ private fun UserOperation() { } }, label = { Text(if(useUid) "UID" else stringResource(R.string.serial_number)) }, - enabled = isDeviceOwner(dpm), modifier = Modifier.fillMaxWidth(), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done), keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }) @@ -212,7 +215,6 @@ private fun UserOperation() { val result = dpm.logoutUser(receiver) Toast.makeText(context, userOperationResultCode(result, context), Toast.LENGTH_SHORT).show() }, - enabled = isProfileOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.logout_current_user)) @@ -226,7 +228,6 @@ private fun UserOperation() { val result = dpm.startUserInBackground(receiver, userHandleById) Toast.makeText(context, userOperationResultCode(result, context), Toast.LENGTH_SHORT).show() }, - enabled = isDeviceOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.start_in_background)) @@ -237,7 +238,6 @@ private fun UserOperation() { focusMgr.clearFocus() Toast.makeText(context, if(dpm.switchUser(receiver,userHandleById)) R.string.success else R.string.fail, Toast.LENGTH_SHORT).show() }, - enabled = isDeviceOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.user_operation_switch)) @@ -253,7 +253,6 @@ private fun UserOperation() { Toast.makeText(context, R.string.fail, Toast.LENGTH_SHORT).show() } }, - enabled = isDeviceOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.user_operation_stop)) @@ -269,7 +268,6 @@ private fun UserOperation() { Toast.makeText(context, R.string.fail, Toast.LENGTH_SHORT).show() } }, - enabled = isDeviceOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.user_operation_remove)) @@ -327,7 +325,6 @@ private fun CreateUser() { focusMgr.clearFocus() Toast.makeText(context, if(newUserHandle!=null) R.string.success else R.string.fail, Toast.LENGTH_SHORT).show() }, - enabled = isDeviceOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.create)) @@ -422,8 +419,7 @@ private fun Username() { label = { Text(stringResource(R.string.username)) }, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }), - modifier = Modifier.fillMaxWidth(), - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm) + modifier = Modifier.fillMaxWidth() ) Spacer(Modifier.padding(vertical = 5.dp)) Button( @@ -431,14 +427,12 @@ private fun Username() { dpm.setProfileName(receiver, inputUsername) Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() }, - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.apply)) } Button( onClick = { dpm.setProfileName(receiver,null) }, - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.reset)) @@ -467,8 +461,7 @@ private fun UserSessionMessage() { label = { Text(stringResource(R.string.start_user_session_msg)) }, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus() }), - modifier = Modifier.fillMaxWidth(), - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm) + modifier = Modifier.fillMaxWidth() ) Spacer(Modifier.padding(vertical = 2.dp)) OutlinedTextField( @@ -477,8 +470,7 @@ private fun UserSessionMessage() { label = { Text(stringResource(R.string.end_user_session_msg)) }, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }), - modifier = Modifier.fillMaxWidth(), - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm) + modifier = Modifier.fillMaxWidth() ) Spacer(Modifier.padding(vertical = 5.dp)) Button( @@ -487,7 +479,6 @@ private fun UserSessionMessage() { dpm.setEndUserSessionMessage(receiver,end) Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() }, - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.apply)) @@ -498,7 +489,6 @@ private fun UserSessionMessage() { dpm.setEndUserSessionMessage(receiver,null) Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() }, - enabled = isDeviceOwner(dpm) || isProfileOwner(dpm), modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.reset))