hide some entries if permission is not enough

This commit is contained in:
BinTianqi
2024-06-04 13:47:35 +08:00
parent 45317e3975
commit c8e7b23cd8
9 changed files with 56 additions and 70 deletions

View File

@@ -268,7 +268,7 @@ private fun Home(
if(VERSION.SDK_INT>=28&&isDeviceOwner(dpm)) { if(VERSION.SDK_INT>=28&&isDeviceOwner(dpm)) {
SubPageItem(R.string.keep_uninstalled_packages, "", R.drawable.delete_fill0) { navCtrl.navigate("KeepUninstalled") } 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) { SubPageItem(R.string.clear_app_storage, "", R.drawable.mop_fill0) {
if(pkgName != "") { clearAppDataDialog.value = true } if(pkgName != "") { clearAppDataDialog.value = true }
} }

View File

@@ -1,7 +1,9 @@
package com.bintianqi.owndroid.dpm package com.bintianqi.owndroid.dpm
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
import android.content.ComponentName
import android.content.Intent import android.content.Intent
import android.os.Build.VERSION
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@@ -16,3 +18,7 @@ fun isDeviceOwner(dpm: DevicePolicyManager): Boolean {
fun isProfileOwner(dpm: DevicePolicyManager): Boolean { fun isProfileOwner(dpm: DevicePolicyManager): Boolean {
return dpm.isProfileOwnerApp("com.bintianqi.owndroid") return dpm.isProfileOwnerApp("com.bintianqi.owndroid")
} }
fun DevicePolicyManager.isOrgProfile(receiver: ComponentName):Boolean {
return VERSION.SDK_INT >= 30 && isProfileOwner(this) && isManagedProfile(receiver) && isOrganizationOwnedDeviceWithManagedProfile
}

View File

@@ -106,7 +106,7 @@ private fun Home(navCtrl: NavHostController) {
if(VERSION.SDK_INT<24 || (VERSION.SDK_INT>=24 && dpm.isProvisioningAllowed(ACTION_PROVISION_MANAGED_PROFILE))) { 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") } 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") } 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)))) { if(isProfileOwner(dpm) && (VERSION.SDK_INT<24 || (VERSION.SDK_INT>=24 && dpm.isManagedProfile(receiver)))) {

View File

@@ -158,16 +158,16 @@ private fun Home(navCtrl:NavHostController, scrollState: ScrollState, wifiMacDia
style = typography.headlineLarge, style = typography.headlineLarge,
modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp) 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 } SubPageItem(R.string.wifi_mac_addr, "", R.drawable.wifi_fill0) { wifiMacDialog.value = true }
} }
if(VERSION.SDK_INT >= 30) { if(VERSION.SDK_INT >= 30) {
SubPageItem(R.string.options, "", R.drawable.tune_fill0) { navCtrl.navigate("Switches") } 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") } 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") } SubPageItem(R.string.wifi_ssid_policy, "", R.drawable.wifi_fill0) { navCtrl.navigate("WifiSsidPolicy") }
} }
if(VERSION.SDK_INT >= 29 && isDeviceOwner(dpm)) { if(VERSION.SDK_INT >= 29 && isDeviceOwner(dpm)) {
@@ -199,7 +199,7 @@ private fun Switches() {
{ dpm.isPreferentialNetworkServiceEnabled }, { dpm.isPreferentialNetworkServiceEnabled = it } { 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, SwitchItem(R.string.wifi_lockdown, "", R.drawable.wifi_password_fill0,
{ dpm.hasLockdownAdminConfiguredNetworks(receiver) }, { dpm.setConfiguredNetworksLockdownState(receiver,it) } { dpm.hasLockdownAdminConfiguredNetworks(receiver) }, { dpm.setConfiguredNetworksLockdownState(receiver,it) }
) )
@@ -240,7 +240,6 @@ private fun WifiSecLevel() {
) )
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
Button( Button(
enabled = isDeviceOwner(dpm) || (isProfileOwner(dpm) && dpm.isOrganizationOwnedDeviceWithManagedProfile),
onClick = { onClick = {
dpm.minimumRequiredWifiSecurityLevel = selectedWifiSecLevel dpm.minimumRequiredWifiSecurityLevel = selectedWifiSecLevel
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()

View File

@@ -82,6 +82,7 @@ fun Password(navCtrl: NavHostController) {
private fun Home(navCtrl:NavHostController,scrollState: ScrollState) { private fun Home(navCtrl:NavHostController,scrollState: ScrollState) {
val context = LocalContext.current val context = LocalContext.current
val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val receiver = ComponentName(context, Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().verticalScroll(scrollState)) { Column(modifier = Modifier.fillMaxSize().verticalScroll(scrollState)) {
Text( Text(
text = stringResource(R.string.password_and_keyguard), 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) modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp)
) )
SubPageItem(R.string.password_info, "", R.drawable.info_fill0) { navCtrl.navigate("PasswordInfo") } 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_token, "", R.drawable.key_vertical_fill0) { navCtrl.navigate("ResetPasswordToken") }
} }
SubPageItem(R.string.reset_password, "", R.drawable.lock_reset_fill0) { navCtrl.navigate("ResetPassword") } if(dpm.isAdminActive(receiver) || isDeviceOwner(dpm) || isProfileOwner(dpm)) {
if(VERSION.SDK_INT >= 31) { 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.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)) { if(isDeviceOwner(dpm)) {
SubPageItem(R.string.max_time_to_lock, "", R.drawable.schedule_fill0) { navCtrl.navigate("MaxTimeToLock") } 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") } 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))) { 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_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)) Spacer(Modifier.padding(vertical = 30.dp))
} }
} }
@@ -163,8 +170,7 @@ private fun ResetPasswordToken() {
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show() ).show()
}, },
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth()
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm)
) { ) {
Text(stringResource(R.string.clear)) Text(stringResource(R.string.clear))
} }
@@ -180,7 +186,6 @@ private fun ResetPasswordToken() {
Toast.makeText(context, R.string.security_exception, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.security_exception, Toast.LENGTH_SHORT).show()
} }
}, },
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.set)) 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() } 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() } } else { Toast.makeText(context, R.string.token_already_activated, Toast.LENGTH_SHORT).show() }
}, },
enabled = isDeviceOwner(dpm)||isProfileOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.activate)) Text(stringResource(R.string.activate))
@@ -219,7 +223,7 @@ private fun ResetPassword() {
OutlinedTextField( OutlinedTextField(
value = newPwd, value = newPwd,
onValueChange = { newPwd=it }, onValueChange = { newPwd=it },
enabled = !confirmed && (isDeviceOwner(dpm) || isProfileOwner(dpm) || dpm.isAdminActive(receiver)), enabled = !confirmed,
label = { Text(stringResource(R.string.password)) }, label = { Text(stringResource(R.string.password)) },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password, imeAction = ImeAction.Done), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password, imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }), keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }),
@@ -247,7 +251,6 @@ private fun ResetPassword() {
if(newPwd.length>=4 || newPwd.isEmpty()) { confirmed=!confirmed } if(newPwd.length>=4 || newPwd.isEmpty()) { confirmed=!confirmed }
else { Toast.makeText(context, R.string.require_4_digit_password, Toast.LENGTH_SHORT).show() } 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(), modifier = Modifier.fillMaxWidth(),
colors = ButtonDefaults.buttonColors( colors = ButtonDefaults.buttonColors(
containerColor = if(confirmed) colorScheme.primary else colorScheme.error, 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) PASSWORD_COMPLEXITY_HIGH to stringResource(R.string.password_complexity_high)
).toList() ).toList()
var selectedItem by remember { mutableIntStateOf(passwordComplexity[0].first) } var selectedItem by remember { mutableIntStateOf(passwordComplexity[0].first) }
if(isDeviceOwner(dpm) || isProfileOwner(dpm)) { LaunchedEffect(Unit) { selectedItem = dpm.requiredPasswordComplexity }
selectedItem=dpm.requiredPasswordComplexity
}
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) { Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.required_password_complexity), style = typography.headlineLarge) Text(text = stringResource(R.string.required_password_complexity), style = typography.headlineLarge)
@@ -335,7 +336,6 @@ private fun PasswordComplexity() {
dpm.requiredPasswordComplexity = selectedItem dpm.requiredPasswordComplexity = selectedItem
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()
}, },
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(text = stringResource(R.string.apply)) Text(text = stringResource(R.string.apply))
@@ -607,7 +607,6 @@ private fun KeyguardDisabledFeatures() {
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()
calculateCustomFeature() calculateCustomFeature()
}, },
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(text = stringResource(R.string.apply)) 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) }", PASSWORD_QUALITY_COMPLEX to stringResource(R.string.custom) + "${stringResource(R.string.unsupported) }",
).toList() ).toList()
var selectedItem by remember { mutableIntStateOf(passwordQuality[0].first) } 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())) { Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.required_password_quality), style = typography.headlineLarge) Text(text = stringResource(R.string.required_password_quality), style = typography.headlineLarge)
@@ -654,7 +653,6 @@ private fun PasswordQuality() {
dpm.setPasswordQuality(receiver,selectedItem) dpm.setPasswordQuality(receiver,selectedItem)
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()
}, },
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.apply)) Text(stringResource(R.string.apply))

View File

@@ -283,11 +283,12 @@ private fun DeviceOwner() {
fun DeviceInfo() { fun DeviceInfo() {
val context = LocalContext.current val context = LocalContext.current
val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager 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)) { 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_info), style = typography.headlineLarge) Text(text = stringResource(R.string.device_info), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp)) 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 val financed = dpm.isDeviceFinanced
Text(stringResource(R.string.is_device_financed, financed)) Text(stringResource(R.string.is_device_financed, financed))
} }

View File

@@ -168,9 +168,7 @@ fun ShizukuActivate() {
} }
} }
if( if(VERSION.SDK_INT >= 30 && !dpm.isOrgProfile(receiver)) {
VERSION.SDK_INT >= 30 && isProfileOwner(dpm) && dpm.isManagedProfile(receiver) && !dpm.isOrganizationOwnedDeviceWithManagedProfile
) {
AnimatedVisibility(showOrgProfileOwnerButton) { AnimatedVisibility(showOrgProfileOwnerButton) {
Button( Button(
onClick = { onClick = {

View File

@@ -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.options, "", R.drawable.tune_fill0) { navCtrl.navigate("Switches") }
} }
SubPageItem(R.string.keyguard, "", R.drawable.screen_lock_portrait_fill0) { navCtrl.navigate("Keyguard") } SubPageItem(R.string.keyguard, "", R.drawable.screen_lock_portrait_fill0) { navCtrl.navigate("Keyguard") }
if(VERSION.SDK_INT >= 24) { if(VERSION.SDK_INT >= 24 && isDeviceOwner(dpm)) {
SubPageItem(R.string.bug_report, "", R.drawable.bug_report_fill0) { bugReportDialog.value = true }
SubPageItem(R.string.reboot, "", R.drawable.restart_alt_fill0) { rebootDialog.value = true } 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_time, "", R.drawable.schedule_fill0) { navCtrl.navigate("EditTime") }
SubPageItem(R.string.edit_timezone, "", R.drawable.schedule_fill0) { navCtrl.navigate("EditTimeZone") } 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)) { if(isDeviceOwner(dpm) || isProfileOwner(dpm)) {
SubPageItem(R.string.ca_cert, "", R.drawable.license_fill0) { navCtrl.navigate("CaCert") } 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") } 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") } SubPageItem(R.string.system_update_policy, "", R.drawable.system_update_fill0) { navCtrl.navigate("SystemUpdatePolicy") }
} }
if( if(VERSION.SDK_INT >= 29 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) {
VERSION.SDK_INT >= 29 &&
(isDeviceOwner(dpm) ||
(VERSION.SDK_INT >= 30 && isProfileOwner(dpm) && dpm.isManagedProfile(receiver) && dpm.isOrganizationOwnedDeviceWithManagedProfile))
) {
SubPageItem(R.string.install_system_update, "", R.drawable.system_update_fill0) { navCtrl.navigate("InstallSystemUpdate") } SubPageItem(R.string.install_system_update, "", R.drawable.system_update_fill0) { navCtrl.navigate("InstallSystemUpdate") }
} }
if( if(VERSION.SDK_INT >= 30 && (isDeviceOwner(dpm) || dpm.isOrgProfile(receiver))) {
VERSION.SDK_INT >= 30 &&
(isDeviceOwner(dpm) || (isProfileOwner(dpm) && dpm.isManagedProfile(receiver) && dpm.isOrganizationOwnedDeviceWithManagedProfile))
) {
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") }
} }
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)) Spacer(Modifier.padding(vertical = 30.dp))
LaunchedEffect(Unit) { fileUriFlow.value = Uri.parse("") } LaunchedEffect(Unit) { fileUriFlow.value = Uri.parse("") }
} }
@@ -246,7 +243,7 @@ private fun Switches() {
{ dpm.isStatusBarDisabled}, { dpm.setStatusBarDisabled(receiver,it) } { 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) { if(VERSION.SDK_INT >= 30) {
SwitchItem(R.string.auto_time, "", R.drawable.schedule_fill0, SwitchItem(R.string.auto_time, "", R.drawable.schedule_fill0,
{ dpm.getAutoTimeEnabled(receiver) }, { dpm.setAutoTimeEnabled(receiver,it) } { dpm.getAutoTimeEnabled(receiver) }, { dpm.setAutoTimeEnabled(receiver,it) }
@@ -278,7 +275,7 @@ private fun Switches() {
{ dpm.isCommonCriteriaModeEnabled(receiver) }, { dpm.setCommonCriteriaModeEnabled(receiver,it) } { 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( SwitchItem(
R.string.usb_signal, "", R.drawable.usb_fill0, { dpm.isUsbDataSignalingEnabled }, R.string.usb_signal, "", R.drawable.usb_fill0, { dpm.isUsbDataSignalingEnabled },
{ {
@@ -422,14 +419,13 @@ private fun EditTime() {
onValueChange = { inputTime = it}, onValueChange = { inputTime = it},
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus() }), keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus() }),
enabled = isDeviceOwner(dpm) || (VERSION.SDK_INT >= 30 && isProfileOwner(dpm) && dpm.isOrganizationOwnedDeviceWithManagedProfile),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
Button( Button(
onClick = { dpm.setTime(receiver,inputTime.toLong()) }, onClick = { dpm.setTime(receiver,inputTime.toLong()) },
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
enabled = inputTime!="" && (isDeviceOwner(dpm) || (VERSION.SDK_INT >= 30 && isProfileOwner(dpm) && dpm.isOrganizationOwnedDeviceWithManagedProfile)) enabled = inputTime != ""
) { ) {
Text(stringResource(R.string.apply)) Text(stringResource(R.string.apply))
} }
@@ -1065,7 +1061,6 @@ private fun WipeData() {
containerColor = if(confirmed) colorScheme.primary else colorScheme.error , containerColor = if(confirmed) colorScheme.primary else colorScheme.error ,
contentColor = if(confirmed) colorScheme.onPrimary else colorScheme.onError contentColor = if(confirmed) colorScheme.onPrimary else colorScheme.onError
), ),
enabled = dpm.isAdminActive(receiver),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(text = stringResource(if(confirmed) R.string.cancel else R.string.confirm)) Text(text = stringResource(if(confirmed) R.string.cancel else R.string.confirm))
@@ -1084,7 +1079,7 @@ private fun WipeData() {
) { ) {
Text("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( Button(
onClick = { dpm.wipeDevice(flag) }, onClick = { dpm.wipeDevice(flag) },
colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError), colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError),
@@ -1167,7 +1162,6 @@ private fun SysUpdatePolicy() {
dpm.setSystemUpdatePolicy(receiver,policy) dpm.setSystemUpdatePolicy(receiver,policy)
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()
}, },
enabled = isDeviceOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.apply)) Text(stringResource(R.string.apply))

View File

@@ -117,11 +117,15 @@ private fun Home(navCtrl: NavHostController,scrollState: ScrollState) {
modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp) 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_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)) { if(VERSION.SDK_INT >= 24 && isDeviceOwner(dpm)) {
SubPageItem(R.string.create_user, "", R.drawable.person_add_fill0) { navCtrl.navigate("CreateUser") } 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))) { if(VERSION.SDK_INT >= 23 && (isDeviceOwner(dpm) || isProfileOwner(dpm))) {
SubPageItem(R.string.change_user_icon, "", R.drawable.account_circle_fill0) { navCtrl.navigate("ChangeUserIcon") } 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)) }, label = { Text(if(useUid) "UID" else stringResource(R.string.serial_number)) },
enabled = isDeviceOwner(dpm),
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }) keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() })
@@ -212,7 +215,6 @@ private fun UserOperation() {
val result = dpm.logoutUser(receiver) val result = dpm.logoutUser(receiver)
Toast.makeText(context, userOperationResultCode(result, context), Toast.LENGTH_SHORT).show() Toast.makeText(context, userOperationResultCode(result, context), Toast.LENGTH_SHORT).show()
}, },
enabled = isProfileOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.logout_current_user)) Text(stringResource(R.string.logout_current_user))
@@ -226,7 +228,6 @@ private fun UserOperation() {
val result = dpm.startUserInBackground(receiver, userHandleById) val result = dpm.startUserInBackground(receiver, userHandleById)
Toast.makeText(context, userOperationResultCode(result, context), Toast.LENGTH_SHORT).show() Toast.makeText(context, userOperationResultCode(result, context), Toast.LENGTH_SHORT).show()
}, },
enabled = isDeviceOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.start_in_background)) Text(stringResource(R.string.start_in_background))
@@ -237,7 +238,6 @@ private fun UserOperation() {
focusMgr.clearFocus() focusMgr.clearFocus()
Toast.makeText(context, if(dpm.switchUser(receiver,userHandleById)) R.string.success else R.string.fail, Toast.LENGTH_SHORT).show() 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() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.user_operation_switch)) Text(stringResource(R.string.user_operation_switch))
@@ -253,7 +253,6 @@ private fun UserOperation() {
Toast.makeText(context, R.string.fail, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.fail, Toast.LENGTH_SHORT).show()
} }
}, },
enabled = isDeviceOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.user_operation_stop)) Text(stringResource(R.string.user_operation_stop))
@@ -269,7 +268,6 @@ private fun UserOperation() {
Toast.makeText(context, R.string.fail, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.fail, Toast.LENGTH_SHORT).show()
} }
}, },
enabled = isDeviceOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.user_operation_remove)) Text(stringResource(R.string.user_operation_remove))
@@ -327,7 +325,6 @@ private fun CreateUser() {
focusMgr.clearFocus() focusMgr.clearFocus()
Toast.makeText(context, if(newUserHandle!=null) R.string.success else R.string.fail, Toast.LENGTH_SHORT).show() Toast.makeText(context, if(newUserHandle!=null) R.string.success else R.string.fail, Toast.LENGTH_SHORT).show()
}, },
enabled = isDeviceOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.create)) Text(stringResource(R.string.create))
@@ -422,8 +419,7 @@ private fun Username() {
label = { Text(stringResource(R.string.username)) }, label = { Text(stringResource(R.string.username)) },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }), keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }),
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth()
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm)
) )
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
Button( Button(
@@ -431,14 +427,12 @@ private fun Username() {
dpm.setProfileName(receiver, inputUsername) dpm.setProfileName(receiver, inputUsername)
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()
}, },
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.apply)) Text(stringResource(R.string.apply))
} }
Button( Button(
onClick = { dpm.setProfileName(receiver,null) }, onClick = { dpm.setProfileName(receiver,null) },
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.reset)) Text(stringResource(R.string.reset))
@@ -467,8 +461,7 @@ private fun UserSessionMessage() {
label = { Text(stringResource(R.string.start_user_session_msg)) }, label = { Text(stringResource(R.string.start_user_session_msg)) },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus() }), keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus() }),
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth()
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm)
) )
Spacer(Modifier.padding(vertical = 2.dp)) Spacer(Modifier.padding(vertical = 2.dp))
OutlinedTextField( OutlinedTextField(
@@ -477,8 +470,7 @@ private fun UserSessionMessage() {
label = { Text(stringResource(R.string.end_user_session_msg)) }, label = { Text(stringResource(R.string.end_user_session_msg)) },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }), keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }),
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth()
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm)
) )
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
Button( Button(
@@ -487,7 +479,6 @@ private fun UserSessionMessage() {
dpm.setEndUserSessionMessage(receiver,end) dpm.setEndUserSessionMessage(receiver,end)
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()
}, },
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.apply)) Text(stringResource(R.string.apply))
@@ -498,7 +489,6 @@ private fun UserSessionMessage() {
dpm.setEndUserSessionMessage(receiver,null) dpm.setEndUserSessionMessage(receiver,null)
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()
}, },
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.reset)) Text(stringResource(R.string.reset))