In-app docs for some feature

This commit is contained in:
BinTianqi
2024-11-17 00:01:13 +08:00
parent 2546a9c3c8
commit 017ed57f64
12 changed files with 298 additions and 126 deletions

View File

@@ -85,6 +85,7 @@ import com.bintianqi.owndroid.fileUriFlow
import com.bintianqi.owndroid.getFile
import com.bintianqi.owndroid.selectedPackage
import com.bintianqi.owndroid.ui.Animations
import com.bintianqi.owndroid.ui.InfoCard
import com.bintianqi.owndroid.ui.Information
import com.bintianqi.owndroid.ui.ListItem
import com.bintianqi.owndroid.ui.NavIcon
@@ -295,8 +296,7 @@ private fun Home(
else -> R.string.unknown
}
),
style = typography.headlineMedium,
modifier = Modifier.padding(start = 5.dp)
style = typography.headlineMedium
)
},
text = {
@@ -306,10 +306,11 @@ private fun Home(
3 -> blockUninstall
else -> false
}
Text(
text = stringResource(R.string.current_state, stringResource(if(enabled) R.string.enabled else R.string.disabled)),
modifier = Modifier.padding(start = 5.dp, top = 5.dp, bottom = 5.dp)
)
Column {
Text(stringResource(R.string.current_state, stringResource(if(enabled) R.string.enabled else R.string.disabled)))
Spacer(Modifier.padding(vertical = 4.dp))
if(appControlAction == 1) Text(stringResource(R.string.info_suspend_app))
}
},
confirmButton = {
TextButton(
@@ -374,6 +375,7 @@ private fun UserCtrlDisabledPkg(pkgName:String) {
) {
Text(stringResource(R.string.apply))
}
InfoCard(R.string.info_disable_user_control)
Spacer(Modifier.padding(vertical = 30.dp))
}
}
@@ -799,6 +801,7 @@ private fun KeepUninstalledApp(pkgName: String) {
) {
Text(stringResource(R.string.apply))
}
InfoCard(R.string.info_keep_uninstalled_apps)
Spacer(Modifier.padding(vertical = 30.dp))
}
}

View File

@@ -63,6 +63,7 @@ import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.ui.Animations
import com.bintianqi.owndroid.ui.CheckBoxItem
import com.bintianqi.owndroid.ui.CopyTextButton
import com.bintianqi.owndroid.ui.InfoCard
import com.bintianqi.owndroid.ui.SubPageItem
import com.bintianqi.owndroid.ui.SwitchItem
import com.bintianqi.owndroid.ui.TopBar
@@ -271,6 +272,7 @@ private fun SuspendPersonalApp() {
) {
Text(stringResource(R.string.apply))
}
InfoCard(R.string.info_profile_maximum_time_off)
}
}
@@ -321,6 +323,7 @@ private fun IntentFilter() {
) {
Text(stringResource(R.string.clear_cross_profile_filters))
}
InfoCard(R.string.info_cross_profile_intent_filter)
}
}

View File

@@ -111,6 +111,7 @@ import com.bintianqi.owndroid.formatFileSize
import com.bintianqi.owndroid.selectedPackage
import com.bintianqi.owndroid.ui.Animations
import com.bintianqi.owndroid.ui.CheckBoxItem
import com.bintianqi.owndroid.ui.InfoCard
import com.bintianqi.owndroid.ui.ListItem
import com.bintianqi.owndroid.ui.RadioButtonItem
import com.bintianqi.owndroid.ui.SubPageItem
@@ -241,14 +242,23 @@ private fun Switches() {
val dpm = context.getDPM()
val receiver = context.getReceiver()
val deviceOwner = context.isDeviceOwner
Column(modifier = Modifier.fillMaxSize().padding(start = 20.dp, end = 16.dp)) {
var dialog by remember { mutableIntStateOf(0) }
Column(modifier = Modifier.fillMaxSize()) {
Spacer(Modifier.padding(vertical = 5.dp))
if(VERSION.SDK_INT>=30 && (deviceOwner || dpm.isOrgProfile(receiver))) {
SwitchItem(R.string.lockdown_admin_configured_network, "", R.drawable.wifi_password_fill0,
{ dpm.hasLockdownAdminConfiguredNetworks(receiver) }, { dpm.setConfiguredNetworksLockdownState(receiver,it) }, padding = false
{ dpm.hasLockdownAdminConfiguredNetworks(receiver) }, { dpm.setConfiguredNetworksLockdownState(receiver,it) },
onClickBlank = { dialog = 1 }
)
}
}
if(dialog != 0) AlertDialog(
text = { Text(stringResource(R.string.info_lockdown_admin_configured_network)) },
confirmButton = {
TextButton(onClick = { dialog = 0 }) { Text(stringResource(R.string.confirm)) }
},
onDismissRequest = { dialog = 0 }
)
}
@SuppressLint("NewApi")
@@ -292,6 +302,7 @@ private fun WifiSecLevel() {
) {
Text(stringResource(R.string.apply))
}
InfoCard(R.string.info_minimum_wifi_security_level)
}
}
@@ -418,6 +429,7 @@ private fun PrivateDNS() {
Text(stringResource(R.string.set_to_opportunistic))
}
}
InfoCard(R.string.info_private_dns_mode_oppertunistic)
Spacer(Modifier.padding(vertical = 10.dp))
var inputHost by remember { mutableStateOf(dpm.getGlobalPrivateDnsHost(receiver) ?: "") }
OutlinedTextField(
@@ -450,6 +462,8 @@ private fun PrivateDNS() {
) {
Text(stringResource(R.string.set_dns_host))
}
InfoCard(R.string.info_set_private_dns_host)
Spacer(Modifier.padding(vertical = 30.dp))
}
}
@@ -522,6 +536,7 @@ fun AlwaysOnVPNPackage(navCtrl: NavHostController) {
) {
Text(stringResource(R.string.clear_current_config))
}
InfoCard(R.string.info_always_on_vpn)
Spacer(Modifier.padding(vertical = 30.dp))
}
}
@@ -621,6 +636,7 @@ private fun RecommendedGlobalProxy() {
) {
Text(stringResource(R.string.apply))
}
InfoCard(R.string.info_recommended_global_proxy)
}
}
@@ -667,6 +683,7 @@ private fun NetworkLog() {
Text(stringResource(R.string.delete_logs))
}
}
InfoCard(R.string.info_network_log)
}
}

View File

@@ -32,6 +32,7 @@ import android.app.admin.DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY
import android.content.Context
import android.content.Intent
import android.os.Build.VERSION
import android.os.UserManager
import android.widget.Toast
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.ScrollState
@@ -83,6 +84,7 @@ import com.bintianqi.owndroid.toggle
import com.bintianqi.owndroid.ui.Animations
import com.bintianqi.owndroid.ui.CardItem
import com.bintianqi.owndroid.ui.CheckBoxItem
import com.bintianqi.owndroid.ui.InfoCard
import com.bintianqi.owndroid.ui.Information
import com.bintianqi.owndroid.ui.RadioButtonItem
import com.bintianqi.owndroid.ui.SubPageItem
@@ -200,6 +202,7 @@ private fun Home(navCtrl:NavHostController, scrollState: ScrollState) {
},
text = {
val focusMgr = LocalFocusManager.current
val um = context.getSystemService(Context.USER_SERVICE) as UserManager
Column {
OutlinedTextField(
value = input,
@@ -217,13 +220,18 @@ private fun Home(navCtrl:NavHostController, scrollState: ScrollState) {
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }),
textStyle = typography.bodyLarge,
modifier = Modifier.fillMaxWidth().padding(bottom = 5.dp)
modifier = Modifier.fillMaxWidth().padding(bottom = 8.dp)
)
when(dialog) {
4 -> Text(stringResource(R.string.max_pwd_fail_desc))
5 -> Text(stringResource(R.string.pwd_history_desc))
}
Text(stringResource(R.string.zero_means_no_restriction))
Text(stringResource(
when(dialog) {
1 -> R.string.info_screen_timeout
2 -> R.string.info_required_strong_auth_timeout
3 -> R.string.info_password_expiration_timeout
4 -> if(um.isSystemUser) R.string.info_max_failed_password_system_user else R.string.info_max_failed_password_other_user
5 -> R.string.info_password_history_length
else -> R.string.password
}
))
}
},
confirmButton = {
@@ -435,6 +443,7 @@ private fun ResetPassword() {
Text(stringResource(R.string.reset_password))
}
}
InfoCard(R.string.info_reset_password)
Spacer(Modifier.padding(vertical = 30.dp))
}
if(confirmDialog) {

View File

@@ -102,9 +102,8 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) {
SwitchItem(
R.string.dhizuku, "", null,
{ sharedPref.getBoolean("dhizuku", false) },
{
toggleDhizukuMode(it, context)
}
{ toggleDhizukuMode(it, context) },
onClickBlank = { dialog = 4 }
)
}
SubPageItem(
@@ -154,6 +153,7 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) {
1 -> R.string.enrollment_specific_id
2 -> R.string.org_name
3 -> R.string.org_id
4 -> R.string.dhizuku
else -> R.string.permission
}
))
@@ -163,35 +163,41 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) {
LaunchedEffect(Unit) {
if(dialog == 1) input = dpm.enrollmentSpecificId
}
OutlinedTextField(
value = input,
onValueChange = { input = it }, readOnly = dialog == 1, modifier = Modifier.fillMaxWidth(),
label = {
Text(stringResource(
when(dialog){
1 -> R.string.enrollment_specific_id
2 -> R.string.org_name
3 -> R.string.org_id
else -> R.string.permission
Column {
if(dialog != 4) OutlinedTextField(
value = input,
onValueChange = { input = it }, readOnly = dialog == 1,
label = {
Text(stringResource(
when(dialog){
1 -> R.string.enrollment_specific_id
2 -> R.string.org_name
3 -> R.string.org_id
else -> R.string.permission
}
))
},
trailingIcon = {
if(dialog == 1) IconButton(onClick = { writeClipBoard(context, input) }) {
Icon(painter = painterResource(R.drawable.content_copy_fill0), contentDescription = stringResource(R.string.copy))
}
))
},
trailingIcon = {
if(dialog == 1) IconButton(onClick = { writeClipBoard(context, input) }) {
Icon(painter = painterResource(R.drawable.content_copy_fill0), contentDescription = stringResource(R.string.copy))
}
},
supportingText = {
if(dialog == 3) Text(stringResource(R.string.length_6_to_64))
},
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions { focusMgr.clearFocus() },
textStyle = typography.bodyLarge
)
},
supportingText = {
if(dialog == 3) Text(stringResource(R.string.length_6_to_64))
},
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions { focusMgr.clearFocus() },
textStyle = typography.bodyLarge,
modifier = Modifier.fillMaxWidth().padding(bottom = if(dialog == 2) 0.dp else 10.dp)
)
if(dialog == 1) Text(stringResource(R.string.info_enrollment_specific_id))
if(dialog == 3) Text(stringResource(R.string.info_org_id))
if(dialog == 4) Text(stringResource(R.string.info_dhizuku))
}
},
onDismissRequest = { dialog = 0 },
dismissButton = {
TextButton(
if(dialog != 4) TextButton(
onClick = { dialog = 0 }
) {
Text(stringResource(R.string.cancel))
@@ -261,6 +267,8 @@ private fun LockScreenInfo() {
value = infoText,
label = { Text(stringResource(R.string.device_owner_lock_screen_info)) },
onValueChange = { infoText = it },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions { focusMgr.clearFocus() },
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp)
)
Button(
@@ -283,6 +291,8 @@ private fun LockScreenInfo() {
) {
Text(text = stringResource(R.string.reset))
}
Spacer(Modifier.padding(vertical = 10.dp))
InfoCard(R.string.info_lock_screen_info)
}
}
@@ -366,6 +376,7 @@ private fun ProfileOwner() {
Text(stringResource(R.string.deactivate))
}
}
InfoCard(R.string.profile_owner)
}
if(deactivateDialog && VERSION.SDK_INT >= 24) {
AlertDialog(
@@ -469,6 +480,7 @@ fun DeviceInfo() {
val context = LocalContext.current
val dpm = context.getDPM()
val receiver = context.getReceiver()
var dialog by remember { mutableIntStateOf(0) }
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)
@@ -489,16 +501,21 @@ fun DeviceInfo() {
if(VERSION.SDK_INT >= 24) { encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER] = R.string.es_active_per_user }
CardItem(R.string.encryption_status, encryptionStatus[dpm.storageEncryptionStatus] ?: R.string.unknown)
if(VERSION.SDK_INT >= 28) {
CardItem(R.string.support_device_id_attestation, dpm.isDeviceIdAttestationSupported.yesOrNo())
CardItem(R.string.support_device_id_attestation, dpm.isDeviceIdAttestationSupported.yesOrNo()) { dialog = 1 }
}
if (VERSION.SDK_INT >= 30) {
CardItem(R.string.support_unique_device_attestation, dpm.isUniqueDeviceAttestationSupported.yesOrNo())
CardItem(R.string.support_unique_device_attestation, dpm.isUniqueDeviceAttestationSupported.yesOrNo()) { dialog = 2 }
}
val adminList = dpm.activeAdmins
if(adminList != null) {
CardItem(R.string.activated_device_admin, adminList.map { it.flattenToShortString() }.joinToString("\n"))
}
}
if(dialog != 0) AlertDialog(
text = { Text(stringResource(if(dialog == 1) R.string.info_device_id_attestation else R.string.info_unique_device_attestation)) },
confirmButton = { TextButton(onClick = { dialog = 0 }) { Text(stringResource(R.string.confirm)) } },
onDismissRequest = { dialog = 0 }
)
}
@SuppressLint("NewApi")
@@ -547,6 +564,7 @@ private fun SupportMsg() {
Text(text = stringResource(R.string.reset))
}
}
InfoCard(R.string.info_short_support_message)
Spacer(Modifier.padding(vertical = 8.dp))
OutlinedTextField(
value = longMsg,
@@ -577,6 +595,7 @@ private fun SupportMsg() {
Text(text = stringResource(R.string.reset))
}
}
InfoCard(R.string.info_long_support_message)
Spacer(Modifier.padding(vertical = 30.dp))
}
}
@@ -591,8 +610,6 @@ private fun TransferOwnership() {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.transfer_ownership), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp))
Text(text = stringResource(R.string.transfer_ownership_desc))
Spacer(Modifier.padding(vertical = 5.dp))
OutlinedTextField(
value = component, onValueChange = { component = it }, label = { Text(stringResource(R.string.target_component_name)) },
modifier = Modifier.fillMaxWidth(),
@@ -616,7 +633,8 @@ private fun TransferOwnership() {
) {
Text(stringResource(R.string.transfer))
}
Spacer(Modifier.padding(vertical = 30.dp))
Spacer(Modifier.padding(vertical = 10.dp))
InfoCard(R.string.info_transfer_ownership)
}
}

View File

@@ -38,6 +38,7 @@ import android.app.admin.SystemUpdatePolicy.TYPE_POSTPONE
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.icu.text.IDNA
import android.net.Uri
import android.os.Build.VERSION
import android.os.UserManager
@@ -116,6 +117,7 @@ import com.bintianqi.owndroid.selectedPackage
import com.bintianqi.owndroid.toggle
import com.bintianqi.owndroid.ui.Animations
import com.bintianqi.owndroid.ui.CheckBoxItem
import com.bintianqi.owndroid.ui.InfoCard
import com.bintianqi.owndroid.ui.Information
import com.bintianqi.owndroid.ui.ListItem
import com.bintianqi.owndroid.ui.RadioButtonItem
@@ -261,30 +263,31 @@ private fun Switches() {
val deviceOwner = context.isDeviceOwner
val profileOwner = context.isProfileOwner
val um = context.getSystemService(Context.USER_SERVICE) as UserManager
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(start = 20.dp, end = 16.dp)) {
Spacer(Modifier.padding(vertical = 10.dp))
var dialog by remember { mutableIntStateOf(0) }
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 5.dp))
if(deviceOwner || profileOwner) {
SwitchItem(R.string.disable_cam,"", R.drawable.photo_camera_fill0,
{ dpm.getCameraDisabled(null) }, { dpm.setCameraDisabled(receiver,it) }, padding = false
{ dpm.getCameraDisabled(null) }, { dpm.setCameraDisabled(receiver,it) }
)
}
if(deviceOwner || profileOwner) {
SwitchItem(R.string.disable_screen_capture, "", R.drawable.screenshot_fill0,
{ dpm.getScreenCaptureDisabled(null) }, { dpm.setScreenCaptureDisabled(receiver,it) }, padding = false
{ dpm.getScreenCaptureDisabled(null) }, { dpm.setScreenCaptureDisabled(receiver,it) }
)
}
if(VERSION.SDK_INT >= 34 && (deviceOwner || (profileOwner && dpm.isAffiliatedUser))) {
SwitchItem(R.string.disable_status_bar, "", R.drawable.notifications_fill0,
{ dpm.isStatusBarDisabled}, { dpm.setStatusBarDisabled(receiver,it) }, padding = false
{ dpm.isStatusBarDisabled}, { dpm.setStatusBarDisabled(receiver,it) }
)
}
if(deviceOwner || (VERSION.SDK_INT >= 23 && profileOwner && um.isSystemUser) || dpm.isOrgProfile(receiver)) {
if(VERSION.SDK_INT >= 30) {
SwitchItem(R.string.auto_time, "", R.drawable.schedule_fill0,
{ dpm.getAutoTimeEnabled(receiver) }, { dpm.setAutoTimeEnabled(receiver,it) }, padding = false
{ dpm.getAutoTimeEnabled(receiver) }, { dpm.setAutoTimeEnabled(receiver,it) }
)
SwitchItem(R.string.auto_timezone, "", R.drawable.globe_fill0,
{ dpm.getAutoTimeZoneEnabled(receiver) }, { dpm.setAutoTimeZoneEnabled(receiver,it) }, padding = false
{ dpm.getAutoTimeZoneEnabled(receiver) }, { dpm.setAutoTimeZoneEnabled(receiver,it) }
)
}else{
SwitchItem(R.string.require_auto_time, "", R.drawable.schedule_fill0, { dpm.autoTimeRequired}, { dpm.setAutoTimeRequired(receiver,it) }, padding = false)
@@ -292,32 +295,49 @@ private fun Switches() {
}
if(deviceOwner || (profileOwner && (VERSION.SDK_INT < 24 || (VERSION.SDK_INT >= 24 && !dpm.isManagedProfile(receiver))))) {
SwitchItem(R.string.master_mute, "", R.drawable.volume_up_fill0,
{ dpm.isMasterVolumeMuted(receiver) }, { dpm.setMasterVolumeMuted(receiver,it) }, padding = false
{ dpm.isMasterVolumeMuted(receiver) }, { dpm.setMasterVolumeMuted(receiver,it) }
)
}
if(VERSION.SDK_INT >= 26 && (deviceOwner || profileOwner)) {
SwitchItem(R.string.backup_service, "", R.drawable.backup_fill0,
{ dpm.isBackupServiceEnabled(receiver) }, { dpm.setBackupServiceEnabled(receiver,it) }, padding = false
{ dpm.isBackupServiceEnabled(receiver) }, { dpm.setBackupServiceEnabled(receiver,it) },
onClickBlank = { dialog = 1 }
)
}
if(VERSION.SDK_INT >= 24 && profileOwner && dpm.isManagedProfile(receiver)) {
SwitchItem(R.string.disable_bt_contact_share, "", R.drawable.account_circle_fill0,
{ dpm.getBluetoothContactSharingDisabled(receiver) }, { dpm.setBluetoothContactSharingDisabled(receiver,it) }, padding = false
{ dpm.getBluetoothContactSharingDisabled(receiver) }, { dpm.setBluetoothContactSharingDisabled(receiver,it) },
)
}
if(VERSION.SDK_INT >= 30 && deviceOwner) {
SwitchItem(R.string.common_criteria_mode , "",R.drawable.security_fill0,
{ dpm.isCommonCriteriaModeEnabled(receiver) }, { dpm.setCommonCriteriaModeEnabled(receiver,it) }, padding = false
{ dpm.isCommonCriteriaModeEnabled(receiver) }, { dpm.setCommonCriteriaModeEnabled(receiver,it) },
onClickBlank = { dialog = 2 }
)
}
if(VERSION.SDK_INT >= 31 && (deviceOwner || dpm.isOrgProfile(receiver)) && dpm.canUsbDataSignalingBeDisabled()) {
SwitchItem(
R.string.disable_usb_signal, "", R.drawable.usb_fill0, { !dpm.isUsbDataSignalingEnabled },
{ dpm.isUsbDataSignalingEnabled = !it }, padding = false
{ dpm.isUsbDataSignalingEnabled = !it },
)
}
Spacer(Modifier.padding(vertical = 30.dp))
}
if(dialog != 0) AlertDialog(
text = {
Text(stringResource(
when(dialog) {
1 -> R.string.info_backup_service
2 -> R.string.info_common_criteria_mode
else -> R.string.options
}
))
},
confirmButton = {
TextButton(onClick = { dialog = 0 }) { Text(stringResource(R.string.confirm)) }
},
onDismissRequest = { dialog = 0 }
)
}
@Composable
@@ -329,9 +349,9 @@ private fun Keyguard() {
val profileOwner = context.isProfileOwner
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.keyguard), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp))
if(VERSION.SDK_INT >= 23) {
Text(text = stringResource(R.string.keyguard), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp))
Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.fillMaxWidth()
@@ -355,7 +375,8 @@ private fun Keyguard() {
Text(stringResource(R.string.enable))
}
}
Spacer(Modifier.padding(vertical = 15.dp))
InfoCard(R.string.info_disable_keyguard)
Spacer(Modifier.padding(vertical = 12.dp))
}
Text(text = stringResource(R.string.lock_now), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 2.dp))
@@ -377,6 +398,9 @@ private fun Keyguard() {
) {
Text(stringResource(R.string.lock_now))
}
if(VERSION.SDK_INT >= 26 && profileOwner && dpm.isManagedProfile(receiver)) {
InfoCard(R.string.info_evict_credential_encryption_key)
}
Spacer(Modifier.padding(vertical = 30.dp))
}
}
@@ -420,7 +444,7 @@ private fun RebootDialog(status: MutableState<Boolean>) {
AlertDialog(
onDismissRequest = { status.value = false },
title = { Text(stringResource(R.string.reboot)) },
text = { Text(stringResource(R.string.confirm_reboot)) },
text = { Text(stringResource(R.string.info_reboot)) },
dismissButton = {
TextButton(onClick = { status.value = false }) {
Text(stringResource(R.string.cancel))
@@ -431,7 +455,7 @@ private fun RebootDialog(status: MutableState<Boolean>) {
onClick = { dpm.reboot(receiver) },
colors = ButtonDefaults.textButtonColors(contentColor = colorScheme.error)
) {
Text(stringResource(R.string.reboot))
Text(stringResource(R.string.confirm))
}
},
modifier = Modifier.fillMaxWidth()
@@ -445,35 +469,28 @@ private fun EditTime() {
val dpm = context.getDPM()
val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current
var inputTime by remember { mutableStateOf("") }
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.edit_time), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp))
var inputTime by remember { mutableStateOf("") }
Text(text = stringResource(R.string.from_epoch_to_target_time))
Spacer(Modifier.padding(vertical = 5.dp))
OutlinedTextField(
value = inputTime,
label = { Text(stringResource(R.string.time_unit_ms)) },
onValueChange = { inputTime = it},
onValueChange = { inputTime = it },
supportingText = { Text(stringResource(R.string.info_edit_time)) },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus() }),
modifier = Modifier.fillMaxWidth()
)
Spacer(Modifier.padding(vertical = 5.dp))
Button(
onClick = { dpm.setTime(receiver,inputTime.toLong()) },
onClick = { dpm.setTime(receiver, inputTime.toLong()) },
modifier = Modifier.fillMaxWidth(),
enabled = inputTime != ""
) {
Text(stringResource(R.string.apply))
}
Button(
onClick = { inputTime = System.currentTimeMillis().toString() },
modifier = Modifier.fillMaxWidth()
) {
Text(stringResource(R.string.get_current_time))
}
}
}
@SuppressLint("NewApi")
@@ -553,6 +570,7 @@ private fun PermissionPolicy() {
) {
Text(stringResource(R.string.apply))
}
InfoCard(R.string.info_permission_policy)
}
}
@@ -595,8 +613,7 @@ private fun MTEPolicy() {
) {
Text(stringResource(R.string.apply))
}
Spacer(Modifier.padding(vertical = 5.dp))
Information { Text(stringResource(R.string.mte_policy_desc)) }
InfoCard(R.string.info_mte_policy)
Spacer(Modifier.padding(vertical = 30.dp))
}
}
@@ -641,6 +658,7 @@ private fun NearbyStreamingPolicy() {
) {
Text(stringResource(R.string.apply))
}
InfoCard(R.string.info_nearby_app_streaming_policy)
var notificationPolicy by remember { mutableIntStateOf(dpm.nearbyNotificationStreamingPolicy) }
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.nearby_notification_streaming), style = typography.titleLarge)
@@ -675,6 +693,7 @@ private fun NearbyStreamingPolicy() {
) {
Text(stringResource(R.string.apply))
}
InfoCard(R.string.info_nearby_notification_streaming_policy)
Spacer(Modifier.padding(vertical = 30.dp))
}
}
@@ -840,6 +859,7 @@ private fun LockTaskMode(navCtrl: NavHostController) {
) {
Text(stringResource(R.string.apply))
}
InfoCard(R.string.info_lock_task_packages)
var startLockTaskApp by rememberSaveable { mutableStateOf("") }
var startLockTaskActivity by rememberSaveable { mutableStateOf("") }
var specifyActivity by rememberSaveable { mutableStateOf(false) }
@@ -909,6 +929,7 @@ private fun LockTaskMode(navCtrl: NavHostController) {
) {
Text(stringResource(R.string.start))
}
InfoCard(R.string.info_start_lock_task_mode)
Spacer(Modifier.padding(vertical = 30.dp))
}
}
@@ -1040,6 +1061,7 @@ private fun SecurityLogs() {
Text(stringResource(R.string.delete_logs))
}
}
InfoCard(R.string.info_security_log)
Spacer(Modifier.padding(vertical = 5.dp))
Button(
onClick = {
@@ -1074,6 +1096,7 @@ private fun SecurityLogs() {
) {
Text(stringResource(R.string.pre_reboot_security_logs))
}
InfoCard(R.string.info_pre_reboot_security_log)
}
}
@@ -1113,7 +1136,8 @@ private fun DisableAccountManagement() {
dpm.setAccountManagementDisabled(receiver, inputText, true)
inputText = ""
refreshList()
}
},
enabled = inputText != ""
) {
Icon(imageVector = Icons.Default.Add, contentDescription = stringResource(R.string.add))
}
@@ -1122,6 +1146,8 @@ private fun DisableAccountManagement() {
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() })
)
Spacer(Modifier.padding(vertical = 10.dp))
InfoCard(R.string.info_disable_account_management)
}
}
@@ -1216,11 +1242,9 @@ fun FactoryResetProtection() {
Text(stringResource(R.string.apply))
}
Spacer(Modifier.padding(vertical = 10.dp))
if(unsupported) {
Information {
Text(stringResource(R.string.frp_policy_not_supported))
}
}
if(unsupported) Text(stringResource(R.string.frp_policy_not_supported))
Spacer(Modifier.padding(vertical = 6.dp))
InfoCard(R.string.info_frp_policy)
Spacer(Modifier.padding(vertical = 30.dp))
}
}
@@ -1280,7 +1304,7 @@ private fun WipeData() {
Text("WipeData")
}
}
if (VERSION.SDK_INT >= 34 && (context.isDeviceOwner || dpm.isOrgProfile(receiver))) {
if (VERSION.SDK_INT >= 34 && context.isDeviceOwner) {
Button(
onClick = {
focusMgr.clearFocus()
@@ -1302,7 +1326,10 @@ private fun WipeData() {
Text(text = stringResource(R.string.warning), color = colorScheme.error)
},
text = {
Text(text = stringResource(R.string.wipe_data_warning), color = colorScheme.error)
Text(
text = stringResource(if(userManager.isSystemUser) R.string.wipe_data_warning else R.string.info_wipe_data_in_managed_user),
color = colorScheme.error
)
},
onDismissRequest = { warning = false },
confirmButton = {

View File

@@ -72,6 +72,7 @@ import com.bintianqi.owndroid.toggle
import com.bintianqi.owndroid.ui.Animations
import com.bintianqi.owndroid.ui.CardItem
import com.bintianqi.owndroid.ui.CheckBoxItem
import com.bintianqi.owndroid.ui.InfoCard
import com.bintianqi.owndroid.ui.ListItem
import com.bintianqi.owndroid.ui.SubPageItem
import com.bintianqi.owndroid.ui.SwitchItem
@@ -295,6 +296,7 @@ private fun UserOperation() {
) {
Text(stringResource(R.string.delete))
}
InfoCard(R.string.info_user_operation)
Spacer(Modifier.padding(vertical = 30.dp))
}
}
@@ -412,6 +414,7 @@ private fun AffiliationID() {
) {
Text(stringResource(R.string.apply))
}
InfoCard(R.string.info_affiliated_id)
Spacer(Modifier.padding(vertical = 30.dp))
}
}