mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-23 19:15:58 +00:00
In-app docs for some feature
This commit is contained in:
@@ -85,6 +85,7 @@ import com.bintianqi.owndroid.fileUriFlow
|
|||||||
import com.bintianqi.owndroid.getFile
|
import com.bintianqi.owndroid.getFile
|
||||||
import com.bintianqi.owndroid.selectedPackage
|
import com.bintianqi.owndroid.selectedPackage
|
||||||
import com.bintianqi.owndroid.ui.Animations
|
import com.bintianqi.owndroid.ui.Animations
|
||||||
|
import com.bintianqi.owndroid.ui.InfoCard
|
||||||
import com.bintianqi.owndroid.ui.Information
|
import com.bintianqi.owndroid.ui.Information
|
||||||
import com.bintianqi.owndroid.ui.ListItem
|
import com.bintianqi.owndroid.ui.ListItem
|
||||||
import com.bintianqi.owndroid.ui.NavIcon
|
import com.bintianqi.owndroid.ui.NavIcon
|
||||||
@@ -295,8 +296,7 @@ private fun Home(
|
|||||||
else -> R.string.unknown
|
else -> R.string.unknown
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
style = typography.headlineMedium,
|
style = typography.headlineMedium
|
||||||
modifier = Modifier.padding(start = 5.dp)
|
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
text = {
|
text = {
|
||||||
@@ -306,10 +306,11 @@ private fun Home(
|
|||||||
3 -> blockUninstall
|
3 -> blockUninstall
|
||||||
else -> false
|
else -> false
|
||||||
}
|
}
|
||||||
Text(
|
Column {
|
||||||
text = stringResource(R.string.current_state, stringResource(if(enabled) R.string.enabled else R.string.disabled)),
|
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)
|
Spacer(Modifier.padding(vertical = 4.dp))
|
||||||
)
|
if(appControlAction == 1) Text(stringResource(R.string.info_suspend_app))
|
||||||
|
}
|
||||||
},
|
},
|
||||||
confirmButton = {
|
confirmButton = {
|
||||||
TextButton(
|
TextButton(
|
||||||
@@ -374,6 +375,7 @@ private fun UserCtrlDisabledPkg(pkgName:String) {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.apply))
|
Text(stringResource(R.string.apply))
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_disable_user_control)
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -799,6 +801,7 @@ private fun KeepUninstalledApp(pkgName: String) {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.apply))
|
Text(stringResource(R.string.apply))
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_keep_uninstalled_apps)
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ import com.bintianqi.owndroid.R
|
|||||||
import com.bintianqi.owndroid.ui.Animations
|
import com.bintianqi.owndroid.ui.Animations
|
||||||
import com.bintianqi.owndroid.ui.CheckBoxItem
|
import com.bintianqi.owndroid.ui.CheckBoxItem
|
||||||
import com.bintianqi.owndroid.ui.CopyTextButton
|
import com.bintianqi.owndroid.ui.CopyTextButton
|
||||||
|
import com.bintianqi.owndroid.ui.InfoCard
|
||||||
import com.bintianqi.owndroid.ui.SubPageItem
|
import com.bintianqi.owndroid.ui.SubPageItem
|
||||||
import com.bintianqi.owndroid.ui.SwitchItem
|
import com.bintianqi.owndroid.ui.SwitchItem
|
||||||
import com.bintianqi.owndroid.ui.TopBar
|
import com.bintianqi.owndroid.ui.TopBar
|
||||||
@@ -271,6 +272,7 @@ private fun SuspendPersonalApp() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.apply))
|
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))
|
Text(stringResource(R.string.clear_cross_profile_filters))
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_cross_profile_intent_filter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ import com.bintianqi.owndroid.formatFileSize
|
|||||||
import com.bintianqi.owndroid.selectedPackage
|
import com.bintianqi.owndroid.selectedPackage
|
||||||
import com.bintianqi.owndroid.ui.Animations
|
import com.bintianqi.owndroid.ui.Animations
|
||||||
import com.bintianqi.owndroid.ui.CheckBoxItem
|
import com.bintianqi.owndroid.ui.CheckBoxItem
|
||||||
|
import com.bintianqi.owndroid.ui.InfoCard
|
||||||
import com.bintianqi.owndroid.ui.ListItem
|
import com.bintianqi.owndroid.ui.ListItem
|
||||||
import com.bintianqi.owndroid.ui.RadioButtonItem
|
import com.bintianqi.owndroid.ui.RadioButtonItem
|
||||||
import com.bintianqi.owndroid.ui.SubPageItem
|
import com.bintianqi.owndroid.ui.SubPageItem
|
||||||
@@ -241,14 +242,23 @@ private fun Switches() {
|
|||||||
val dpm = context.getDPM()
|
val dpm = context.getDPM()
|
||||||
val receiver = context.getReceiver()
|
val receiver = context.getReceiver()
|
||||||
val deviceOwner = context.isDeviceOwner
|
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))
|
Spacer(Modifier.padding(vertical = 5.dp))
|
||||||
if(VERSION.SDK_INT>=30 && (deviceOwner || dpm.isOrgProfile(receiver))) {
|
if(VERSION.SDK_INT>=30 && (deviceOwner || dpm.isOrgProfile(receiver))) {
|
||||||
SwitchItem(R.string.lockdown_admin_configured_network, "", R.drawable.wifi_password_fill0,
|
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")
|
@SuppressLint("NewApi")
|
||||||
@@ -292,6 +302,7 @@ private fun WifiSecLevel() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.apply))
|
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))
|
Text(stringResource(R.string.set_to_opportunistic))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_private_dns_mode_oppertunistic)
|
||||||
Spacer(Modifier.padding(vertical = 10.dp))
|
Spacer(Modifier.padding(vertical = 10.dp))
|
||||||
var inputHost by remember { mutableStateOf(dpm.getGlobalPrivateDnsHost(receiver) ?: "") }
|
var inputHost by remember { mutableStateOf(dpm.getGlobalPrivateDnsHost(receiver) ?: "") }
|
||||||
OutlinedTextField(
|
OutlinedTextField(
|
||||||
@@ -450,6 +462,8 @@ private fun PrivateDNS() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.set_dns_host))
|
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))
|
Text(stringResource(R.string.clear_current_config))
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_always_on_vpn)
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -621,6 +636,7 @@ private fun RecommendedGlobalProxy() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.apply))
|
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))
|
Text(stringResource(R.string.delete_logs))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_network_log)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import android.app.admin.DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Build.VERSION
|
import android.os.Build.VERSION
|
||||||
|
import android.os.UserManager
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.foundation.ScrollState
|
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.Animations
|
||||||
import com.bintianqi.owndroid.ui.CardItem
|
import com.bintianqi.owndroid.ui.CardItem
|
||||||
import com.bintianqi.owndroid.ui.CheckBoxItem
|
import com.bintianqi.owndroid.ui.CheckBoxItem
|
||||||
|
import com.bintianqi.owndroid.ui.InfoCard
|
||||||
import com.bintianqi.owndroid.ui.Information
|
import com.bintianqi.owndroid.ui.Information
|
||||||
import com.bintianqi.owndroid.ui.RadioButtonItem
|
import com.bintianqi.owndroid.ui.RadioButtonItem
|
||||||
import com.bintianqi.owndroid.ui.SubPageItem
|
import com.bintianqi.owndroid.ui.SubPageItem
|
||||||
@@ -200,6 +202,7 @@ private fun Home(navCtrl:NavHostController, scrollState: ScrollState) {
|
|||||||
},
|
},
|
||||||
text = {
|
text = {
|
||||||
val focusMgr = LocalFocusManager.current
|
val focusMgr = LocalFocusManager.current
|
||||||
|
val um = context.getSystemService(Context.USER_SERVICE) as UserManager
|
||||||
Column {
|
Column {
|
||||||
OutlinedTextField(
|
OutlinedTextField(
|
||||||
value = input,
|
value = input,
|
||||||
@@ -217,13 +220,18 @@ private fun Home(navCtrl:NavHostController, scrollState: ScrollState) {
|
|||||||
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() }),
|
||||||
textStyle = typography.bodyLarge,
|
textStyle = typography.bodyLarge,
|
||||||
modifier = Modifier.fillMaxWidth().padding(bottom = 5.dp)
|
modifier = Modifier.fillMaxWidth().padding(bottom = 8.dp)
|
||||||
)
|
)
|
||||||
when(dialog) {
|
Text(stringResource(
|
||||||
4 -> Text(stringResource(R.string.max_pwd_fail_desc))
|
when(dialog) {
|
||||||
5 -> Text(stringResource(R.string.pwd_history_desc))
|
1 -> R.string.info_screen_timeout
|
||||||
}
|
2 -> R.string.info_required_strong_auth_timeout
|
||||||
Text(stringResource(R.string.zero_means_no_restriction))
|
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 = {
|
confirmButton = {
|
||||||
@@ -435,6 +443,7 @@ private fun ResetPassword() {
|
|||||||
Text(stringResource(R.string.reset_password))
|
Text(stringResource(R.string.reset_password))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_reset_password)
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
}
|
}
|
||||||
if(confirmDialog) {
|
if(confirmDialog) {
|
||||||
|
|||||||
@@ -102,9 +102,8 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) {
|
|||||||
SwitchItem(
|
SwitchItem(
|
||||||
R.string.dhizuku, "", null,
|
R.string.dhizuku, "", null,
|
||||||
{ sharedPref.getBoolean("dhizuku", false) },
|
{ sharedPref.getBoolean("dhizuku", false) },
|
||||||
{
|
{ toggleDhizukuMode(it, context) },
|
||||||
toggleDhizukuMode(it, context)
|
onClickBlank = { dialog = 4 }
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
SubPageItem(
|
SubPageItem(
|
||||||
@@ -154,6 +153,7 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) {
|
|||||||
1 -> R.string.enrollment_specific_id
|
1 -> R.string.enrollment_specific_id
|
||||||
2 -> R.string.org_name
|
2 -> R.string.org_name
|
||||||
3 -> R.string.org_id
|
3 -> R.string.org_id
|
||||||
|
4 -> R.string.dhizuku
|
||||||
else -> R.string.permission
|
else -> R.string.permission
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
@@ -163,35 +163,41 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) {
|
|||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
if(dialog == 1) input = dpm.enrollmentSpecificId
|
if(dialog == 1) input = dpm.enrollmentSpecificId
|
||||||
}
|
}
|
||||||
OutlinedTextField(
|
Column {
|
||||||
value = input,
|
if(dialog != 4) OutlinedTextField(
|
||||||
onValueChange = { input = it }, readOnly = dialog == 1, modifier = Modifier.fillMaxWidth(),
|
value = input,
|
||||||
label = {
|
onValueChange = { input = it }, readOnly = dialog == 1,
|
||||||
Text(stringResource(
|
label = {
|
||||||
when(dialog){
|
Text(stringResource(
|
||||||
1 -> R.string.enrollment_specific_id
|
when(dialog){
|
||||||
2 -> R.string.org_name
|
1 -> R.string.enrollment_specific_id
|
||||||
3 -> R.string.org_id
|
2 -> R.string.org_name
|
||||||
else -> R.string.permission
|
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))
|
||||||
}
|
}
|
||||||
))
|
},
|
||||||
},
|
supportingText = {
|
||||||
trailingIcon = {
|
if(dialog == 3) Text(stringResource(R.string.length_6_to_64))
|
||||||
if(dialog == 1) IconButton(onClick = { writeClipBoard(context, input) }) {
|
},
|
||||||
Icon(painter = painterResource(R.drawable.content_copy_fill0), contentDescription = stringResource(R.string.copy))
|
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
|
||||||
}
|
keyboardActions = KeyboardActions { focusMgr.clearFocus() },
|
||||||
},
|
textStyle = typography.bodyLarge,
|
||||||
supportingText = {
|
modifier = Modifier.fillMaxWidth().padding(bottom = if(dialog == 2) 0.dp else 10.dp)
|
||||||
if(dialog == 3) Text(stringResource(R.string.length_6_to_64))
|
)
|
||||||
},
|
if(dialog == 1) Text(stringResource(R.string.info_enrollment_specific_id))
|
||||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
|
if(dialog == 3) Text(stringResource(R.string.info_org_id))
|
||||||
keyboardActions = KeyboardActions { focusMgr.clearFocus() },
|
if(dialog == 4) Text(stringResource(R.string.info_dhizuku))
|
||||||
textStyle = typography.bodyLarge
|
}
|
||||||
)
|
|
||||||
},
|
},
|
||||||
onDismissRequest = { dialog = 0 },
|
onDismissRequest = { dialog = 0 },
|
||||||
dismissButton = {
|
dismissButton = {
|
||||||
TextButton(
|
if(dialog != 4) TextButton(
|
||||||
onClick = { dialog = 0 }
|
onClick = { dialog = 0 }
|
||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.cancel))
|
Text(stringResource(R.string.cancel))
|
||||||
@@ -261,6 +267,8 @@ private fun LockScreenInfo() {
|
|||||||
value = infoText,
|
value = infoText,
|
||||||
label = { Text(stringResource(R.string.device_owner_lock_screen_info)) },
|
label = { Text(stringResource(R.string.device_owner_lock_screen_info)) },
|
||||||
onValueChange = { infoText = it },
|
onValueChange = { infoText = it },
|
||||||
|
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
|
||||||
|
keyboardActions = KeyboardActions { focusMgr.clearFocus() },
|
||||||
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp)
|
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp)
|
||||||
)
|
)
|
||||||
Button(
|
Button(
|
||||||
@@ -283,6 +291,8 @@ private fun LockScreenInfo() {
|
|||||||
) {
|
) {
|
||||||
Text(text = stringResource(R.string.reset))
|
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))
|
Text(stringResource(R.string.deactivate))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.profile_owner)
|
||||||
}
|
}
|
||||||
if(deactivateDialog && VERSION.SDK_INT >= 24) {
|
if(deactivateDialog && VERSION.SDK_INT >= 24) {
|
||||||
AlertDialog(
|
AlertDialog(
|
||||||
@@ -469,6 +480,7 @@ fun DeviceInfo() {
|
|||||||
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 dialog by remember { mutableIntStateOf(0) }
|
||||||
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)
|
||||||
@@ -489,16 +501,21 @@ fun DeviceInfo() {
|
|||||||
if(VERSION.SDK_INT >= 24) { encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER] = R.string.es_active_per_user }
|
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)
|
CardItem(R.string.encryption_status, encryptionStatus[dpm.storageEncryptionStatus] ?: R.string.unknown)
|
||||||
if(VERSION.SDK_INT >= 28) {
|
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) {
|
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
|
val adminList = dpm.activeAdmins
|
||||||
if(adminList != null) {
|
if(adminList != null) {
|
||||||
CardItem(R.string.activated_device_admin, adminList.map { it.flattenToShortString() }.joinToString("\n"))
|
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")
|
@SuppressLint("NewApi")
|
||||||
@@ -547,6 +564,7 @@ private fun SupportMsg() {
|
|||||||
Text(text = stringResource(R.string.reset))
|
Text(text = stringResource(R.string.reset))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_short_support_message)
|
||||||
Spacer(Modifier.padding(vertical = 8.dp))
|
Spacer(Modifier.padding(vertical = 8.dp))
|
||||||
OutlinedTextField(
|
OutlinedTextField(
|
||||||
value = longMsg,
|
value = longMsg,
|
||||||
@@ -577,6 +595,7 @@ private fun SupportMsg() {
|
|||||||
Text(text = stringResource(R.string.reset))
|
Text(text = stringResource(R.string.reset))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_long_support_message)
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -591,8 +610,6 @@ private fun TransferOwnership() {
|
|||||||
Spacer(Modifier.padding(vertical = 10.dp))
|
Spacer(Modifier.padding(vertical = 10.dp))
|
||||||
Text(text = stringResource(R.string.transfer_ownership), style = typography.headlineLarge)
|
Text(text = stringResource(R.string.transfer_ownership), style = typography.headlineLarge)
|
||||||
Spacer(Modifier.padding(vertical = 5.dp))
|
Spacer(Modifier.padding(vertical = 5.dp))
|
||||||
Text(text = stringResource(R.string.transfer_ownership_desc))
|
|
||||||
Spacer(Modifier.padding(vertical = 5.dp))
|
|
||||||
OutlinedTextField(
|
OutlinedTextField(
|
||||||
value = component, onValueChange = { component = it }, label = { Text(stringResource(R.string.target_component_name)) },
|
value = component, onValueChange = { component = it }, label = { Text(stringResource(R.string.target_component_name)) },
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
@@ -616,7 +633,8 @@ private fun TransferOwnership() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.transfer))
|
Text(stringResource(R.string.transfer))
|
||||||
}
|
}
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 10.dp))
|
||||||
|
InfoCard(R.string.info_transfer_ownership)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import android.app.admin.SystemUpdatePolicy.TYPE_POSTPONE
|
|||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.icu.text.IDNA
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build.VERSION
|
import android.os.Build.VERSION
|
||||||
import android.os.UserManager
|
import android.os.UserManager
|
||||||
@@ -116,6 +117,7 @@ import com.bintianqi.owndroid.selectedPackage
|
|||||||
import com.bintianqi.owndroid.toggle
|
import com.bintianqi.owndroid.toggle
|
||||||
import com.bintianqi.owndroid.ui.Animations
|
import com.bintianqi.owndroid.ui.Animations
|
||||||
import com.bintianqi.owndroid.ui.CheckBoxItem
|
import com.bintianqi.owndroid.ui.CheckBoxItem
|
||||||
|
import com.bintianqi.owndroid.ui.InfoCard
|
||||||
import com.bintianqi.owndroid.ui.Information
|
import com.bintianqi.owndroid.ui.Information
|
||||||
import com.bintianqi.owndroid.ui.ListItem
|
import com.bintianqi.owndroid.ui.ListItem
|
||||||
import com.bintianqi.owndroid.ui.RadioButtonItem
|
import com.bintianqi.owndroid.ui.RadioButtonItem
|
||||||
@@ -261,30 +263,31 @@ private fun Switches() {
|
|||||||
val deviceOwner = context.isDeviceOwner
|
val deviceOwner = context.isDeviceOwner
|
||||||
val profileOwner = context.isProfileOwner
|
val profileOwner = context.isProfileOwner
|
||||||
val um = context.getSystemService(Context.USER_SERVICE) as UserManager
|
val um = context.getSystemService(Context.USER_SERVICE) as UserManager
|
||||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(start = 20.dp, end = 16.dp)) {
|
var dialog by remember { mutableIntStateOf(0) }
|
||||||
Spacer(Modifier.padding(vertical = 10.dp))
|
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
|
||||||
|
Spacer(Modifier.padding(vertical = 5.dp))
|
||||||
if(deviceOwner || profileOwner) {
|
if(deviceOwner || profileOwner) {
|
||||||
SwitchItem(R.string.disable_cam,"", R.drawable.photo_camera_fill0,
|
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) {
|
if(deviceOwner || profileOwner) {
|
||||||
SwitchItem(R.string.disable_screen_capture, "", R.drawable.screenshot_fill0,
|
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))) {
|
if(VERSION.SDK_INT >= 34 && (deviceOwner || (profileOwner && dpm.isAffiliatedUser))) {
|
||||||
SwitchItem(R.string.disable_status_bar, "", R.drawable.notifications_fill0,
|
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(deviceOwner || (VERSION.SDK_INT >= 23 && profileOwner && um.isSystemUser) || 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) }, padding = false
|
{ dpm.getAutoTimeEnabled(receiver) }, { dpm.setAutoTimeEnabled(receiver,it) }
|
||||||
)
|
)
|
||||||
SwitchItem(R.string.auto_timezone, "", R.drawable.globe_fill0,
|
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{
|
}else{
|
||||||
SwitchItem(R.string.require_auto_time, "", R.drawable.schedule_fill0, { dpm.autoTimeRequired}, { dpm.setAutoTimeRequired(receiver,it) }, padding = false)
|
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))))) {
|
if(deviceOwner || (profileOwner && (VERSION.SDK_INT < 24 || (VERSION.SDK_INT >= 24 && !dpm.isManagedProfile(receiver))))) {
|
||||||
SwitchItem(R.string.master_mute, "", R.drawable.volume_up_fill0,
|
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)) {
|
if(VERSION.SDK_INT >= 26 && (deviceOwner || profileOwner)) {
|
||||||
SwitchItem(R.string.backup_service, "", R.drawable.backup_fill0,
|
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)) {
|
if(VERSION.SDK_INT >= 24 && profileOwner && dpm.isManagedProfile(receiver)) {
|
||||||
SwitchItem(R.string.disable_bt_contact_share, "", R.drawable.account_circle_fill0,
|
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) {
|
if(VERSION.SDK_INT >= 30 && deviceOwner) {
|
||||||
SwitchItem(R.string.common_criteria_mode , "",R.drawable.security_fill0,
|
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()) {
|
if(VERSION.SDK_INT >= 31 && (deviceOwner || dpm.isOrgProfile(receiver)) && dpm.canUsbDataSignalingBeDisabled()) {
|
||||||
SwitchItem(
|
SwitchItem(
|
||||||
R.string.disable_usb_signal, "", R.drawable.usb_fill0, { !dpm.isUsbDataSignalingEnabled },
|
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))
|
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
|
@Composable
|
||||||
@@ -329,9 +349,9 @@ private fun Keyguard() {
|
|||||||
val profileOwner = context.isProfileOwner
|
val profileOwner = context.isProfileOwner
|
||||||
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.keyguard), style = typography.headlineLarge)
|
|
||||||
Spacer(Modifier.padding(vertical = 5.dp))
|
|
||||||
if(VERSION.SDK_INT >= 23) {
|
if(VERSION.SDK_INT >= 23) {
|
||||||
|
Text(text = stringResource(R.string.keyguard), style = typography.headlineLarge)
|
||||||
|
Spacer(Modifier.padding(vertical = 5.dp))
|
||||||
Row(
|
Row(
|
||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
modifier = Modifier.fillMaxWidth()
|
modifier = Modifier.fillMaxWidth()
|
||||||
@@ -355,7 +375,8 @@ private fun Keyguard() {
|
|||||||
Text(stringResource(R.string.enable))
|
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)
|
Text(text = stringResource(R.string.lock_now), style = typography.headlineLarge)
|
||||||
Spacer(Modifier.padding(vertical = 2.dp))
|
Spacer(Modifier.padding(vertical = 2.dp))
|
||||||
@@ -377,6 +398,9 @@ private fun Keyguard() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.lock_now))
|
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))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -420,7 +444,7 @@ private fun RebootDialog(status: MutableState<Boolean>) {
|
|||||||
AlertDialog(
|
AlertDialog(
|
||||||
onDismissRequest = { status.value = false },
|
onDismissRequest = { status.value = false },
|
||||||
title = { Text(stringResource(R.string.reboot)) },
|
title = { Text(stringResource(R.string.reboot)) },
|
||||||
text = { Text(stringResource(R.string.confirm_reboot)) },
|
text = { Text(stringResource(R.string.info_reboot)) },
|
||||||
dismissButton = {
|
dismissButton = {
|
||||||
TextButton(onClick = { status.value = false }) {
|
TextButton(onClick = { status.value = false }) {
|
||||||
Text(stringResource(R.string.cancel))
|
Text(stringResource(R.string.cancel))
|
||||||
@@ -431,7 +455,7 @@ private fun RebootDialog(status: MutableState<Boolean>) {
|
|||||||
onClick = { dpm.reboot(receiver) },
|
onClick = { dpm.reboot(receiver) },
|
||||||
colors = ButtonDefaults.textButtonColors(contentColor = colorScheme.error)
|
colors = ButtonDefaults.textButtonColors(contentColor = colorScheme.error)
|
||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.reboot))
|
Text(stringResource(R.string.confirm))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
modifier = Modifier.fillMaxWidth()
|
modifier = Modifier.fillMaxWidth()
|
||||||
@@ -445,35 +469,28 @@ private fun EditTime() {
|
|||||||
val dpm = context.getDPM()
|
val dpm = context.getDPM()
|
||||||
val receiver = context.getReceiver()
|
val receiver = context.getReceiver()
|
||||||
val focusMgr = LocalFocusManager.current
|
val focusMgr = LocalFocusManager.current
|
||||||
|
var inputTime by remember { mutableStateOf("") }
|
||||||
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.edit_time), style = typography.headlineLarge)
|
Text(text = stringResource(R.string.edit_time), style = typography.headlineLarge)
|
||||||
Spacer(Modifier.padding(vertical = 5.dp))
|
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(
|
OutlinedTextField(
|
||||||
value = inputTime,
|
value = inputTime,
|
||||||
label = { Text(stringResource(R.string.time_unit_ms)) },
|
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),
|
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done),
|
||||||
keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus() }),
|
keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus() }),
|
||||||
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 != ""
|
enabled = inputTime != ""
|
||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.apply))
|
Text(stringResource(R.string.apply))
|
||||||
}
|
}
|
||||||
Button(
|
|
||||||
onClick = { inputTime = System.currentTimeMillis().toString() },
|
|
||||||
modifier = Modifier.fillMaxWidth()
|
|
||||||
) {
|
|
||||||
Text(stringResource(R.string.get_current_time))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
@@ -553,6 +570,7 @@ private fun PermissionPolicy() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.apply))
|
Text(stringResource(R.string.apply))
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_permission_policy)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -595,8 +613,7 @@ private fun MTEPolicy() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.apply))
|
Text(stringResource(R.string.apply))
|
||||||
}
|
}
|
||||||
Spacer(Modifier.padding(vertical = 5.dp))
|
InfoCard(R.string.info_mte_policy)
|
||||||
Information { Text(stringResource(R.string.mte_policy_desc)) }
|
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -641,6 +658,7 @@ private fun NearbyStreamingPolicy() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.apply))
|
Text(stringResource(R.string.apply))
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_nearby_app_streaming_policy)
|
||||||
var notificationPolicy by remember { mutableIntStateOf(dpm.nearbyNotificationStreamingPolicy) }
|
var notificationPolicy by remember { mutableIntStateOf(dpm.nearbyNotificationStreamingPolicy) }
|
||||||
Spacer(Modifier.padding(vertical = 10.dp))
|
Spacer(Modifier.padding(vertical = 10.dp))
|
||||||
Text(text = stringResource(R.string.nearby_notification_streaming), style = typography.titleLarge)
|
Text(text = stringResource(R.string.nearby_notification_streaming), style = typography.titleLarge)
|
||||||
@@ -675,6 +693,7 @@ private fun NearbyStreamingPolicy() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.apply))
|
Text(stringResource(R.string.apply))
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_nearby_notification_streaming_policy)
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -840,6 +859,7 @@ private fun LockTaskMode(navCtrl: NavHostController) {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.apply))
|
Text(stringResource(R.string.apply))
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_lock_task_packages)
|
||||||
var startLockTaskApp by rememberSaveable { mutableStateOf("") }
|
var startLockTaskApp by rememberSaveable { mutableStateOf("") }
|
||||||
var startLockTaskActivity by rememberSaveable { mutableStateOf("") }
|
var startLockTaskActivity by rememberSaveable { mutableStateOf("") }
|
||||||
var specifyActivity by rememberSaveable { mutableStateOf(false) }
|
var specifyActivity by rememberSaveable { mutableStateOf(false) }
|
||||||
@@ -909,6 +929,7 @@ private fun LockTaskMode(navCtrl: NavHostController) {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.start))
|
Text(stringResource(R.string.start))
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_start_lock_task_mode)
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1040,6 +1061,7 @@ private fun SecurityLogs() {
|
|||||||
Text(stringResource(R.string.delete_logs))
|
Text(stringResource(R.string.delete_logs))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_security_log)
|
||||||
Spacer(Modifier.padding(vertical = 5.dp))
|
Spacer(Modifier.padding(vertical = 5.dp))
|
||||||
Button(
|
Button(
|
||||||
onClick = {
|
onClick = {
|
||||||
@@ -1074,6 +1096,7 @@ private fun SecurityLogs() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.pre_reboot_security_logs))
|
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)
|
dpm.setAccountManagementDisabled(receiver, inputText, true)
|
||||||
inputText = ""
|
inputText = ""
|
||||||
refreshList()
|
refreshList()
|
||||||
}
|
},
|
||||||
|
enabled = inputText != ""
|
||||||
) {
|
) {
|
||||||
Icon(imageVector = Icons.Default.Add, contentDescription = stringResource(R.string.add))
|
Icon(imageVector = Icons.Default.Add, contentDescription = stringResource(R.string.add))
|
||||||
}
|
}
|
||||||
@@ -1122,6 +1146,8 @@ private fun DisableAccountManagement() {
|
|||||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
|
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
|
||||||
keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() })
|
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))
|
Text(stringResource(R.string.apply))
|
||||||
}
|
}
|
||||||
Spacer(Modifier.padding(vertical = 10.dp))
|
Spacer(Modifier.padding(vertical = 10.dp))
|
||||||
if(unsupported) {
|
if(unsupported) Text(stringResource(R.string.frp_policy_not_supported))
|
||||||
Information {
|
Spacer(Modifier.padding(vertical = 6.dp))
|
||||||
Text(stringResource(R.string.frp_policy_not_supported))
|
InfoCard(R.string.info_frp_policy)
|
||||||
}
|
|
||||||
}
|
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1280,7 +1304,7 @@ private fun WipeData() {
|
|||||||
Text("WipeData")
|
Text("WipeData")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (VERSION.SDK_INT >= 34 && (context.isDeviceOwner || dpm.isOrgProfile(receiver))) {
|
if (VERSION.SDK_INT >= 34 && context.isDeviceOwner) {
|
||||||
Button(
|
Button(
|
||||||
onClick = {
|
onClick = {
|
||||||
focusMgr.clearFocus()
|
focusMgr.clearFocus()
|
||||||
@@ -1302,7 +1326,10 @@ private fun WipeData() {
|
|||||||
Text(text = stringResource(R.string.warning), color = colorScheme.error)
|
Text(text = stringResource(R.string.warning), color = colorScheme.error)
|
||||||
},
|
},
|
||||||
text = {
|
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 },
|
onDismissRequest = { warning = false },
|
||||||
confirmButton = {
|
confirmButton = {
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ import com.bintianqi.owndroid.toggle
|
|||||||
import com.bintianqi.owndroid.ui.Animations
|
import com.bintianqi.owndroid.ui.Animations
|
||||||
import com.bintianqi.owndroid.ui.CardItem
|
import com.bintianqi.owndroid.ui.CardItem
|
||||||
import com.bintianqi.owndroid.ui.CheckBoxItem
|
import com.bintianqi.owndroid.ui.CheckBoxItem
|
||||||
|
import com.bintianqi.owndroid.ui.InfoCard
|
||||||
import com.bintianqi.owndroid.ui.ListItem
|
import com.bintianqi.owndroid.ui.ListItem
|
||||||
import com.bintianqi.owndroid.ui.SubPageItem
|
import com.bintianqi.owndroid.ui.SubPageItem
|
||||||
import com.bintianqi.owndroid.ui.SwitchItem
|
import com.bintianqi.owndroid.ui.SwitchItem
|
||||||
@@ -295,6 +296,7 @@ private fun UserOperation() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.delete))
|
Text(stringResource(R.string.delete))
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_user_operation)
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -412,6 +414,7 @@ private fun AffiliationID() {
|
|||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.apply))
|
Text(stringResource(R.string.apply))
|
||||||
}
|
}
|
||||||
|
InfoCard(R.string.info_affiliated_id)
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package com.bintianqi.owndroid.ui
|
|||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.annotation.DrawableRes
|
import androidx.annotation.DrawableRes
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
|
||||||
import androidx.compose.animation.animateContentSize
|
import androidx.compose.animation.animateContentSize
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
@@ -12,6 +11,7 @@ import androidx.compose.foundation.layout.Arrangement
|
|||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
import androidx.compose.foundation.text.selection.SelectionContainer
|
import androidx.compose.foundation.text.selection.SelectionContainer
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.outlined.Info
|
||||||
import androidx.compose.material3.*
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.material3.MaterialTheme.colorScheme
|
import androidx.compose.material3.MaterialTheme.colorScheme
|
||||||
import androidx.compose.material3.MaterialTheme.typography
|
import androidx.compose.material3.MaterialTheme.typography
|
||||||
@@ -23,7 +23,6 @@ import androidx.compose.ui.graphics.Color
|
|||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.style.TextOverflow
|
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.navigation.NavBackStackEntry
|
import androidx.navigation.NavBackStackEntry
|
||||||
import androidx.navigation.NavHostController
|
import androidx.navigation.NavHostController
|
||||||
@@ -161,7 +160,7 @@ fun SwitchItem(
|
|||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.clickable(enabled = onClickBlank != null, onClick = onClickBlank?:{})
|
.clickable(enabled = onClickBlank != null, onClick = onClickBlank?:{})
|
||||||
.padding(top = 5.dp, bottom = 5.dp, start = if(padding) 30.dp else 0.dp, end = if(padding) 12.dp else 0.dp)
|
.padding(top = 5.dp, bottom = 5.dp, start = if(padding) 25.dp else 0.dp, end = if(padding) 15.dp else 0.dp)
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
@@ -231,16 +230,27 @@ fun CopyTextButton(@StringRes label: Int, content: String) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun CardItem(@StringRes title: Int, @StringRes text: Int) {
|
fun CardItem(@StringRes title: Int, @StringRes text: Int, onClickInfo: (() -> Unit)? = null) {
|
||||||
CardItem(title, stringResource(text))
|
CardItem(title, stringResource(text), onClickInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun CardItem(@StringRes title: Int, text: String) {
|
fun CardItem(@StringRes title: Int, text: String, onClickInfo: (() -> Unit)? = null) {
|
||||||
Card(modifier = Modifier.fillMaxWidth().padding(vertical = 6.dp)) {
|
Card(modifier = Modifier.fillMaxWidth().padding(vertical = 6.dp)) {
|
||||||
Text(text = stringResource(title), style = typography.titleLarge, modifier = Modifier.padding(start = 8.dp, top = 6.dp))
|
Row(
|
||||||
SelectionContainer {
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
Text(text = text, modifier = Modifier.padding(start = 8.dp, bottom = 6.dp))
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
modifier = Modifier.fillMaxWidth()
|
||||||
|
) {
|
||||||
|
Column(modifier = Modifier.fillMaxWidth(0.85F)) {
|
||||||
|
Text(text = stringResource(title), style = typography.titleLarge, modifier = Modifier.padding(start = 8.dp, top = 6.dp))
|
||||||
|
SelectionContainer {
|
||||||
|
Text(text = text, modifier = Modifier.padding(start = 8.dp, bottom = 6.dp))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(onClickInfo != null) IconButton(onClick = onClickInfo) {
|
||||||
|
Icon(imageVector = Icons.Outlined.Info, contentDescription = null)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -263,3 +273,17 @@ fun ListItem(text: String, onDelete: () -> Unit) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun InfoCard(@StringRes strID: Int) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(vertical = 8.dp)
|
||||||
|
.clip(RoundedCornerShape(10))
|
||||||
|
.background(color = colorScheme.tertiaryContainer)
|
||||||
|
.padding(8.dp)
|
||||||
|
) {
|
||||||
|
Icon(imageVector = Icons.Outlined.Info, contentDescription = null, modifier = Modifier.padding(vertical = 4.dp))
|
||||||
|
Text(stringResource(strID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -87,7 +87,6 @@
|
|||||||
<string name="disable_account_management">Отключить управление аккаунтами</string>
|
<string name="disable_account_management">Отключить управление аккаунтами</string>
|
||||||
<string name="account_type">Тип аккаунта</string>
|
<string name="account_type">Тип аккаунта</string>
|
||||||
<string name="transfer_ownership">Передача прав владения</string>
|
<string name="transfer_ownership">Передача прав владения</string>
|
||||||
<string name="transfer_ownership_desc">Передать привилегии владельца устройства или профиля другому приложению.</string>
|
|
||||||
<string name="target_component_name">Имя целевого компонента</string>
|
<string name="target_component_name">Имя целевого компонента</string>
|
||||||
<string name="device_owner_lock_screen_info">Информация на экране блокировки</string>
|
<string name="device_owner_lock_screen_info">Информация на экране блокировки</string>
|
||||||
<string name="support_msg">Сообщение поддержки</string>
|
<string name="support_msg">Сообщение поддержки</string>
|
||||||
@@ -140,20 +139,16 @@
|
|||||||
<string name="bug_report">Отчет об ошибке</string>
|
<string name="bug_report">Отчет об ошибке</string>
|
||||||
<string name="confirm_bug_report">Запросить отчет об ошибке?</string>
|
<string name="confirm_bug_report">Запросить отчет об ошибке?</string>
|
||||||
<string name="reboot">Перезагрузить</string>
|
<string name="reboot">Перезагрузить</string>
|
||||||
<string name="confirm_reboot">Подтвердить перезагрузку?</string>
|
|
||||||
<string name="edit_time">Изменить время</string>
|
<string name="edit_time">Изменить время</string>
|
||||||
<string name="edit_timezone">Изменить часовой пояс</string>
|
<string name="edit_timezone">Изменить часовой пояс</string>
|
||||||
<string name="view_all_timezones">Посмотреть все идентификаторы часовых поясов</string>
|
<string name="view_all_timezones">Посмотреть все идентификаторы часовых поясов</string>
|
||||||
<string name="hide_all_timezones">Скрыть все идентификаторы часовых поясов</string>
|
<string name="hide_all_timezones">Скрыть все идентификаторы часовых поясов</string>
|
||||||
<string name="timezone_id">Идентификатор часового пояса</string>
|
<string name="timezone_id">Идентификатор часового пояса</string>
|
||||||
<string name="disable_auto_time_zone_before_set">Автоматический часовой пояс должен быть отключен перед установкой пользовательского часового пояса.</string>
|
<string name="disable_auto_time_zone_before_set">Автоматический часовой пояс должен быть отключен перед установкой пользовательского часового пояса.</string>
|
||||||
<string name="from_epoch_to_target_time">От Эпохи (01.01.1970 00:00:00 UTC) до желаемого времени (мс)</string>
|
|
||||||
<string name="get_current_time">Текущее время</string>
|
|
||||||
<string name="permission_policy">Политика разрешений</string>
|
<string name="permission_policy">Политика разрешений</string>
|
||||||
<string name="auto_grant">Автоматически разрешать</string>
|
<string name="auto_grant">Автоматически разрешать</string>
|
||||||
<string name="auto_deny">Автоматически запрещать</string>
|
<string name="auto_deny">Автоматически запрещать</string>
|
||||||
<string name="mte_policy">Политика MTE</string>
|
<string name="mte_policy">Политика MTE</string>
|
||||||
<string name="mte_policy_desc">MTE: Memory Tagging Extension, требуется Android 14 и ARMv9</string>
|
|
||||||
<string name="nearby_app_streaming">Политика потоковой передачи Nearby App</string>
|
<string name="nearby_app_streaming">Политика потоковой передачи Nearby App</string>
|
||||||
<string name="nearby_streaming_policy">Политика потоковой передачи Nearby</string>
|
<string name="nearby_streaming_policy">Политика потоковой передачи Nearby</string>
|
||||||
<string name="nearby_notification_streaming">Политика потоковой передачи уведомлений Nearby</string>
|
<string name="nearby_notification_streaming">Политика потоковой передачи уведомлений Nearby</string>
|
||||||
@@ -490,14 +485,11 @@
|
|||||||
<string name="password_info">Информация о пароле</string>
|
<string name="password_info">Информация о пароле</string>
|
||||||
<string name="reset_pwd_desc">Оставьте пустым, чтобы удалить пароль</string>
|
<string name="reset_pwd_desc">Оставьте пустым, чтобы удалить пароль</string>
|
||||||
<string name="max_pwd_fail">Максимальное количество неудачных попыток ввода пароля</string>
|
<string name="max_pwd_fail">Максимальное количество неудачных попыток ввода пароля</string>
|
||||||
<string name="max_pwd_fail_desc">При достижении этого предела устройство будет сброшено к заводским настройкам</string>
|
|
||||||
<string name="max_pwd_fail_textfield">Максимальное количество неудачных попыток</string>
|
<string name="max_pwd_fail_textfield">Максимальное количество неудачных попыток</string>
|
||||||
<string name="pwd_expiration_timeout">Время истечения срока действия пароля</string>
|
<string name="pwd_expiration_timeout">Время истечения срока действия пароля</string>
|
||||||
<string name="max_time_to_lock">Время ожидания экрана</string>
|
<string name="max_time_to_lock">Время ожидания экрана</string>
|
||||||
<string name="required_strong_auth_timeout">Время ожидания строгой аутентификации</string>
|
<string name="required_strong_auth_timeout">Время ожидания строгой аутентификации</string>
|
||||||
<string name="zero_means_no_restriction">0 означает отсутствие ограничений</string>
|
|
||||||
<string name="pwd_history">Длина истории паролей</string>
|
<string name="pwd_history">Длина истории паролей</string>
|
||||||
<string name="pwd_history_desc">Пользователь не может установить пароли из указанного диапазона истории</string>
|
|
||||||
<string name="password_complexity_none">Нет (разрешено отсутствие пароля)</string>
|
<string name="password_complexity_none">Нет (разрешено отсутствие пароля)</string>
|
||||||
<string name="password_complexity_low">Низкая (графический ключ и повторение символов разрешены)</string>
|
<string name="password_complexity_low">Низкая (графический ключ и повторение символов разрешены)</string>
|
||||||
<string name="password_complexity_medium">Средняя (повторение запрещено, минимум 4 символа)</string>
|
<string name="password_complexity_medium">Средняя (повторение запрещено, минимум 4 символа)</string>
|
||||||
@@ -609,4 +601,6 @@
|
|||||||
<string name="version_name">Версия</string>
|
<string name="version_name">Версия</string>
|
||||||
<string name="version_code">Код версии</string>
|
<string name="version_code">Код версии</string>
|
||||||
<string name="parsing_apk_info" tools:ignore="TypographyEllipsis">Анализ информации APK...</string>
|
<string name="parsing_apk_info" tools:ignore="TypographyEllipsis">Анализ информации APK...</string>
|
||||||
|
|
||||||
|
<!--TODO: Translate strings start with "info_"-->
|
||||||
</resources>
|
</resources>
|
||||||
@@ -88,7 +88,6 @@
|
|||||||
<string name="disable_account_management">Hesap Yönetimini Devre Dışı Bırak</string>
|
<string name="disable_account_management">Hesap Yönetimini Devre Dışı Bırak</string>
|
||||||
<string name="account_type">Hesap Türleri</string>
|
<string name="account_type">Hesap Türleri</string>
|
||||||
<string name="transfer_ownership">Sahipliği Devret</string>
|
<string name="transfer_ownership">Sahipliği Devret</string>
|
||||||
<string name="transfer_ownership_desc">Cihaz sahibi veya profil sahibi ayrıcalığını başka bir uygulamaya devredin.</string>
|
|
||||||
<string name="target_component_name">Target component name</string> <!--TODO-->
|
<string name="target_component_name">Target component name</string> <!--TODO-->
|
||||||
<string name="device_owner_lock_screen_info">Ekran Kilidi Bilgisi</string>
|
<string name="device_owner_lock_screen_info">Ekran Kilidi Bilgisi</string>
|
||||||
<string name="support_msg">Destek Mesajı</string>
|
<string name="support_msg">Destek Mesajı</string>
|
||||||
@@ -141,20 +140,16 @@
|
|||||||
<string name="bug_report">Hata raporu</string>
|
<string name="bug_report">Hata raporu</string>
|
||||||
<string name="confirm_bug_report">Hata raporu iste?</string>
|
<string name="confirm_bug_report">Hata raporu iste?</string>
|
||||||
<string name="reboot">Yeniden başlat</string>
|
<string name="reboot">Yeniden başlat</string>
|
||||||
<string name="confirm_reboot">Yeniden başlatmayı onayla?</string>
|
|
||||||
<string name="edit_time">Zamanı düzenle</string>
|
<string name="edit_time">Zamanı düzenle</string>
|
||||||
<string name="edit_timezone">Saat dilimini düzenle</string>
|
<string name="edit_timezone">Saat dilimini düzenle</string>
|
||||||
<string name="view_all_timezones">Tüm saat dilimi kimliklerini görüntüle</string>
|
<string name="view_all_timezones">Tüm saat dilimi kimliklerini görüntüle</string>
|
||||||
<string name="hide_all_timezones">Tüm saat dilimi kimliklerini gizle</string>
|
<string name="hide_all_timezones">Tüm saat dilimi kimliklerini gizle</string>
|
||||||
<string name="timezone_id">Saat dilimi kimliği</string>
|
<string name="timezone_id">Saat dilimi kimliği</string>
|
||||||
<string name="disable_auto_time_zone_before_set">Özel bir saat dilimi ayarlamadan önce otomatik saat dilimi devre dışı bırakılmalıdır</string>
|
<string name="disable_auto_time_zone_before_set">Özel bir saat dilimi ayarlamadan önce otomatik saat dilimi devre dışı bırakılmalıdır</string>
|
||||||
<string name="from_epoch_to_target_time">Epoch\'tan (1970/1/1 00:00:00 UTC) ayarlanmak istenen zamana kadar (ms)</string>
|
|
||||||
<string name="get_current_time">Geçerli saat</string>
|
|
||||||
<string name="permission_policy">İzin politikası</string>
|
<string name="permission_policy">İzin politikası</string>
|
||||||
<string name="auto_grant">Otomatik ver</string>
|
<string name="auto_grant">Otomatik ver</string>
|
||||||
<string name="auto_deny">Otomatik reddet</string>
|
<string name="auto_deny">Otomatik reddet</string>
|
||||||
<string name="mte_policy">MTE politikası</string>
|
<string name="mte_policy">MTE politikası</string>
|
||||||
<string name="mte_policy_desc">MTE: Bellek Etiketleme Uzantısı, Android 14 ve ARMv9 gerektirir</string>
|
|
||||||
<string name="nearby_app_streaming">Yakındaki uygulama akış politikası</string>
|
<string name="nearby_app_streaming">Yakındaki uygulama akış politikası</string>
|
||||||
<string name="nearby_streaming_policy">Yakındaki akış politikası</string>
|
<string name="nearby_streaming_policy">Yakındaki akış politikası</string>
|
||||||
<string name="nearby_notification_streaming">Yakındaki bildirim akış politikası</string>
|
<string name="nearby_notification_streaming">Yakındaki bildirim akış politikası</string>
|
||||||
@@ -486,14 +481,11 @@
|
|||||||
<string name="password_info">Şifre Bilgisi</string>
|
<string name="password_info">Şifre Bilgisi</string>
|
||||||
<string name="reset_pwd_desc">Şifreyi kaldırmak için boş bırakın</string>
|
<string name="reset_pwd_desc">Şifreyi kaldırmak için boş bırakın</string>
|
||||||
<string name="max_pwd_fail">Maksimum hatalı şifre</string>
|
<string name="max_pwd_fail">Maksimum hatalı şifre</string>
|
||||||
<string name="max_pwd_fail_desc">Bu sınıra ulaşıldığında, cihaz fabrika ayarlarına sıfırlanacaktır</string>
|
|
||||||
<string name="max_pwd_fail_textfield">Maksimum hatalı deneme</string>
|
<string name="max_pwd_fail_textfield">Maksimum hatalı deneme</string>
|
||||||
<string name="pwd_expiration_timeout">Şifre geçerlilik süresi</string>
|
<string name="pwd_expiration_timeout">Şifre geçerlilik süresi</string>
|
||||||
<string name="max_time_to_lock">Ekran zaman aşımı</string>
|
<string name="max_time_to_lock">Ekran zaman aşımı</string>
|
||||||
<string name="required_strong_auth_timeout">Gereken güçlü doğrulama zaman aşımı</string>
|
<string name="required_strong_auth_timeout">Gereken güçlü doğrulama zaman aşımı</string>
|
||||||
<string name="zero_means_no_restriction">0 means no restriction</string> <!--TODO-->
|
|
||||||
<string name="pwd_history">Şifre geçmişi uzunluğu</string>
|
<string name="pwd_history">Şifre geçmişi uzunluğu</string>
|
||||||
<string name="pwd_history_desc">Belirtilen aralıktaki geçmiş şifreler kullanıcı tarafından ayarlanamaz</string>
|
|
||||||
<string name="password_complexity_none">Yok (Şifreye izin verilmez)</string>
|
<string name="password_complexity_none">Yok (Şifreye izin verilmez)</string>
|
||||||
<string name="password_complexity_low">Düşük (Hareket şifresi ve karakter tekrarı izinli)</string>
|
<string name="password_complexity_low">Düşük (Hareket şifresi ve karakter tekrarı izinli)</string>
|
||||||
<string name="password_complexity_medium">Orta (Tekrar yasak, en az 4 karakter)</string>
|
<string name="password_complexity_medium">Orta (Tekrar yasak, en az 4 karakter)</string>
|
||||||
@@ -604,4 +596,6 @@
|
|||||||
<string name="version_name">Version name</string> <!--TODO-->
|
<string name="version_name">Version name</string> <!--TODO-->
|
||||||
<string name="version_code">Version code</string> <!--TODO-->
|
<string name="version_code">Version code</string> <!--TODO-->
|
||||||
<string name="parsing_apk_info" tools:ignore="TypographyEllipsis">Parsing APK info...</string>
|
<string name="parsing_apk_info" tools:ignore="TypographyEllipsis">Parsing APK info...</string>
|
||||||
|
|
||||||
|
<!--TODO: Translate strings start with "info_"-->
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -83,7 +83,6 @@
|
|||||||
<string name="disable_account_management">禁用账号管理</string>
|
<string name="disable_account_management">禁用账号管理</string>
|
||||||
<string name="account_type">账号类型</string>
|
<string name="account_type">账号类型</string>
|
||||||
<string name="transfer_ownership">转移所有权</string>
|
<string name="transfer_ownership">转移所有权</string>
|
||||||
<string name="transfer_ownership_desc">把Device owner或Profile owner权限转移到另一个应用</string>
|
|
||||||
<string name="target_component_name">目标组件名</string>
|
<string name="target_component_name">目标组件名</string>
|
||||||
<string name="device_owner_lock_screen_info">锁屏提示信息</string>
|
<string name="device_owner_lock_screen_info">锁屏提示信息</string>
|
||||||
<string name="support_msg">提供支持的消息</string>
|
<string name="support_msg">提供支持的消息</string>
|
||||||
@@ -136,20 +135,16 @@
|
|||||||
<string name="bug_report">错误报告</string>
|
<string name="bug_report">错误报告</string>
|
||||||
<string name="confirm_bug_report">请求错误报告?</string>
|
<string name="confirm_bug_report">请求错误报告?</string>
|
||||||
<string name="reboot">重启</string>
|
<string name="reboot">重启</string>
|
||||||
<string name="confirm_reboot">确定重启?</string>
|
|
||||||
<string name="edit_time">修改时间</string>
|
<string name="edit_time">修改时间</string>
|
||||||
<string name="edit_timezone">修改时区</string>
|
<string name="edit_timezone">修改时区</string>
|
||||||
<string name="view_all_timezones">显示所有时区ID</string>
|
<string name="view_all_timezones">显示所有时区ID</string>
|
||||||
<string name="hide_all_timezones">隐藏所有时区ID</string>
|
<string name="hide_all_timezones">隐藏所有时区ID</string>
|
||||||
<string name="timezone_id">时区ID</string>
|
<string name="timezone_id">时区ID</string>
|
||||||
<string name="disable_auto_time_zone_before_set">在设置时区前需要关闭自动时区</string>
|
<string name="disable_auto_time_zone_before_set">在设置时区前需要关闭自动时区</string>
|
||||||
<string name="from_epoch_to_target_time">从Epoch(1970/1/1 00:00:00 UTC)到你想设置的时间(毫秒)</string>
|
|
||||||
<string name="get_current_time">获取当前时间</string>
|
|
||||||
<string name="permission_policy">权限策略</string>
|
<string name="permission_policy">权限策略</string>
|
||||||
<string name="auto_grant">自动允许</string>
|
<string name="auto_grant">自动允许</string>
|
||||||
<string name="auto_deny">自动拒绝</string>
|
<string name="auto_deny">自动拒绝</string>
|
||||||
<string name="mte_policy">MTE策略</string>
|
<string name="mte_policy">MTE策略</string>
|
||||||
<string name="mte_policy_desc">MTE:内存标记拓展,安卓14和ARMv9的高端功能</string>
|
|
||||||
<string name="nearby_app_streaming">附近应用传输</string>
|
<string name="nearby_app_streaming">附近应用传输</string>
|
||||||
<string name="nearby_streaming_policy">附近流式传输策略</string>
|
<string name="nearby_streaming_policy">附近流式传输策略</string>
|
||||||
<string name="nearby_notification_streaming">附近通知传输</string>
|
<string name="nearby_notification_streaming">附近通知传输</string>
|
||||||
@@ -478,14 +473,11 @@
|
|||||||
<string name="password_info">密码信息</string>
|
<string name="password_info">密码信息</string>
|
||||||
<string name="reset_pwd_desc">留空以清除密码</string>
|
<string name="reset_pwd_desc">留空以清除密码</string>
|
||||||
<string name="max_pwd_fail">最大密码错误次数</string>
|
<string name="max_pwd_fail">最大密码错误次数</string>
|
||||||
<string name="max_pwd_fail_desc">达到该限制会恢复出厂设置</string>
|
|
||||||
<string name="max_pwd_fail_textfield">错误次数</string>
|
<string name="max_pwd_fail_textfield">错误次数</string>
|
||||||
<string name="pwd_expiration_timeout">密码失效超时</string>
|
<string name="pwd_expiration_timeout">密码失效超时</string>
|
||||||
<string name="max_time_to_lock">屏幕超时</string>
|
<string name="max_time_to_lock">屏幕超时</string>
|
||||||
<string name="required_strong_auth_timeout">要求强验证超时</string>
|
<string name="required_strong_auth_timeout">要求强验证超时</string>
|
||||||
<string name="zero_means_no_restriction">0表示不做限制</string>
|
|
||||||
<string name="pwd_history">密码历史长度</string>
|
<string name="pwd_history">密码历史长度</string>
|
||||||
<string name="pwd_history_desc">用户无法设置指定历史范围内之前曾设置过的密码</string>
|
|
||||||
<string name="password_complexity_none">无(允许不设密码)</string>
|
<string name="password_complexity_none">无(允许不设密码)</string>
|
||||||
<string name="password_complexity_low">低(允许图案和连续性)</string>
|
<string name="password_complexity_low">低(允许图案和连续性)</string>
|
||||||
<string name="password_complexity_medium">中(无连续性,至少4位)</string>
|
<string name="password_complexity_medium">中(无连续性,至少4位)</string>
|
||||||
@@ -596,4 +588,52 @@
|
|||||||
<string name="version_name">版本名</string>
|
<string name="version_name">版本名</string>
|
||||||
<string name="version_code">版本号</string>
|
<string name="version_code">版本号</string>
|
||||||
<string name="parsing_apk_info" tools:ignore="TypographyEllipsis">解析APK信息中...</string>
|
<string name="parsing_apk_info" tools:ignore="TypographyEllipsis">解析APK信息中...</string>
|
||||||
|
|
||||||
|
<string name="info_dhizuku">Dhizuku可以分享Device owner权限给其余应用</string>
|
||||||
|
<string name="info_device_id_attestation">指示设备是否除了密钥证明之外还支持设备标识符证明</string>
|
||||||
|
<string name="info_unique_device_attestation">如果设备上的StrongBox Keymaster可以配置单独的证明证书并且可以使用该证书签署证明记录,则返回true(只有StrongBox安全级别的Keymaster才能使用单独的证明证书进行证明)</string>
|
||||||
|
<string name="info_org_id">设置组织ID后才能获取设备注册专用ID</string>
|
||||||
|
<string name="info_enrollment_specific_id">不同组织ID的设备注册专用ID不同,恢复出厂设置或删除工作资料后不变</string>
|
||||||
|
<string name="info_lock_screen_info">在锁屏界面上显示的一段简短的消息。将会覆盖用户当前设置的锁屏信息,并且防止用户在系统设置中设置新的锁屏信息</string>
|
||||||
|
<string name="info_short_support_message">用户试图使用被管理员禁用的功能时会显示此消息。不应多于200字</string>
|
||||||
|
<string name="info_long_support_message">在设备管理员设置中会显示此消息,不应多于20000字</string>
|
||||||
|
<string name="info_transfer_ownership">转移Device owner或Profile owner权限到另一个app,当前的设备策略会迁移到新的设备管理员</string>
|
||||||
|
<string name="info_backup_service">禁用后用户不能使用备份服务备份或恢复数据。在受管理用户中,需要Device owner和Profile owner同时启用此功能才能使用备份服务</string>
|
||||||
|
<string name="info_common_criteria_mode">当设备处于通用标准模式时,某些设备功能会进行调整以满足通用标准模式所要求的安全级别。</string>
|
||||||
|
<string name="info_disable_keyguard">禁用锁屏相当于把锁屏方式设置为“无”。在已设置密码或图案时使用这个功能无效。如果在锁屏禁用时设置密码或图案,锁屏将启用</string>
|
||||||
|
<string name="info_evict_credential_encryption_key">从密钥环中移除用户的凭证加密密钥。用户需要再次输入凭证才能将密钥存储回密钥环中。为了保护用户数据,用户将重新启动</string>
|
||||||
|
<string name="info_reboot">打电话时不能使用此功能</string>
|
||||||
|
<string name="info_edit_time">输入以毫秒为单位的UNIX时间</string>
|
||||||
|
<string name="info_permission_policy">设置应用申请运行时权限时的默认选择</string>
|
||||||
|
<string name="info_mte_policy">设置内存标记扩展(Memory Tagging Extension)策略。重启设备以应用更改。</string>
|
||||||
|
<string name="info_nearby_app_streaming_policy">应用流式传输:当app在虚拟显示器上启动,传输这个app的视频流到附近的设备。</string>
|
||||||
|
<string name="info_nearby_notification_streaming_policy">通知流式传输:预安装的应用把通知数据传输到附近的设备。</string>
|
||||||
|
<string name="info_lock_task_packages">只有在列表中的应用才能开启锁定任务模式。</string>
|
||||||
|
<string name="info_start_lock_task_mode">如果你在锁定任务功能中允许了通知,成功启动锁定任务模式后,OwnDroid会发送一条通知,你可以点击那条通知以退出锁定任务模式。</string>
|
||||||
|
<string name="info_security_log">设备上不能有非附属用户</string>
|
||||||
|
<string name="info_pre_reboot_security_log">并非所有设备都支持重启前安全日志</string>
|
||||||
|
<string name="info_disable_account_management">当某个帐户类型的帐户管理被禁用时,将无法添加或删除该类型的帐户。</string>
|
||||||
|
<string name="info_frp_policy">恢复出厂设置保护(Factory reset protection)策略用于防止不受信任的重置(Fastboot或Recovery)。需要设备支持持久数据块服务(Persistent data block service)</string>
|
||||||
|
<string name="info_wipe_data_in_managed_user">此用户的所有数据将会被清除,但是用户不会被删除。</string>
|
||||||
|
<string name="info_lockdown_admin_configured_network">控制用户是否可以更改管理员配置的网络。启用此锁定后,用户仍然可以配置和连接到其他Wi-Fi,或使用其他Wi-Fi功能(如网络共享)。</string>
|
||||||
|
<string name="info_minimum_wifi_security_level">指定Wi-Fi网络所需的最低安全等级。设备将无法连接到低于最低安全等级的网络。如果当前网络不满足要求,则会断开连接。</string>
|
||||||
|
<string name="info_private_dns_mode_oppertunistic">在此模式下,DNS子系统将在尝试以明文形式进行域名解析之前,尝试与网络提供的DNS服务器进行TLS握手。</string>
|
||||||
|
<string name="info_set_private_dns_host">将对DNS服务器执行连接检查,以确保其有效。\n如果将VPN与私人DNS结合使用,则私人DNS必须可从VPN内部和外部访问。否则设备可能会失去解析域名的能力,因为到DNS服务器的系统流量可能不会通过VPN。</string>
|
||||||
|
<string name="info_always_on_vpn">通过一个指定的app,为当前用户设置一个保持打开的VPN连接。自动授权连接并在重启后保留。\n启用锁定:如果VPN未连接,则禁止使用网络。</string>
|
||||||
|
<string name="info_recommended_global_proxy">这个代理只是一个建议,一些app有可能忽略它。</string>
|
||||||
|
<string name="info_network_log">网络日志包含DNS查询和connect()库调用记录</string>
|
||||||
|
<string name="info_profile_maximum_time_off">用户可以关闭工作资料,如果关闭工作资料的时间超过了在这里设置的时间,会挂起个人应用。设置的时间不能小于72小时,如果小于72小时,按72小时算。</string>
|
||||||
|
<string name="info_cross_profile_intent_filter">添加跨资料Intent过滤器,使工作资料中可以发送的指定Intent到主用户,反之亦然。仅支持Activity Intent</string>
|
||||||
|
<string name="info_suspend_app">挂起的应用无法被打开,通知会被隐藏,不会在最近任务中显示,不能弹窗,不能发送Toast。\n有些应用无法被挂起,比如Device admin、启动器和默认拨号应用。</string>
|
||||||
|
<string name="info_disable_user_control">用户无法清除这些应用的存储空间,也无法强制停止应用</string>
|
||||||
|
<string name="info_keep_uninstalled_apps">这个列表中的应用的APK将会一直保留,即使没有任何用户安装这个应用</string>
|
||||||
|
<string name="info_user_operation">推荐使用用户序列号来标识用户,如果要使用UID,UID可以是运行在目标用户中任意应用的UID</string>
|
||||||
|
<string name="info_affiliated_id">当Device owner创建并管理用户时,新的用户不是附属用户。Device owner设置和受管理用户完全相同的附属用户ID后,受管理用户成为附属于Device owner的用户</string>
|
||||||
|
<string name="info_reset_password">设置一个新的密码,密码的长度需要4位或以上,不输入密码将会清除现有的密码。长度在6位或以下的纯数字密码将会设置为PIN码。</string>
|
||||||
|
<string name="info_screen_timeout">设置设备锁定前用户活动的最大时间。这限制了用户可以设置的时间长度。\n值为0表示不做限制。</string>
|
||||||
|
<string name="info_password_expiration_timeout">重新启动密码过期倒计时。值为0表示不做限制。</string>
|
||||||
|
<string name="info_max_failed_password_system_user">如果设置为大于零的值,将会在输入一定次数的错误的锁屏密码后将设备恢复出厂设置</string>
|
||||||
|
<string name="info_max_failed_password_other_user">如果设置为大于零的值,将会在输入一定次数的错误的锁屏密码后清除当前用户的所有数据</string>
|
||||||
|
<string name="info_password_history_length">设置后,用户将无法输入与历史记录中任何密码相同的新密码。当前密码将保留,直到用户设置新密码为止,因此更改不会立即生效。值为0表示不做限制。</string>
|
||||||
|
<string name="info_required_strong_auth_timeout">如果用户在这段时间内没有使用强认证(密码、PIN或图案)解锁设备,则要求使用强认证解锁设备。值为0表示OwnDroid不参与控制超时。一般来说,最少1小时,最多72小时。</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -89,7 +89,6 @@
|
|||||||
<string name="disable_account_management">Disable account management</string>
|
<string name="disable_account_management">Disable account management</string>
|
||||||
<string name="account_type">Account type</string>
|
<string name="account_type">Account type</string>
|
||||||
<string name="transfer_ownership">Transfer Ownership</string>
|
<string name="transfer_ownership">Transfer Ownership</string>
|
||||||
<string name="transfer_ownership_desc">Transfer device owner or profile owner privilege to another app.</string>
|
|
||||||
<string name="target_component_name">Target component name</string>
|
<string name="target_component_name">Target component name</string>
|
||||||
<string name="device_owner_lock_screen_info">Lockscreen info</string>
|
<string name="device_owner_lock_screen_info">Lockscreen info</string>
|
||||||
<string name="support_msg">Support Message</string>
|
<string name="support_msg">Support Message</string>
|
||||||
@@ -145,20 +144,16 @@
|
|||||||
<string name="bug_report">Bug report</string>
|
<string name="bug_report">Bug report</string>
|
||||||
<string name="confirm_bug_report">Request bug report?</string>
|
<string name="confirm_bug_report">Request bug report?</string>
|
||||||
<string name="reboot">Reboot</string>
|
<string name="reboot">Reboot</string>
|
||||||
<string name="confirm_reboot">Confirm reboot?</string>
|
|
||||||
<string name="edit_time">Edit time</string>
|
<string name="edit_time">Edit time</string>
|
||||||
<string name="edit_timezone">Edit timezone</string>
|
<string name="edit_timezone">Edit timezone</string>
|
||||||
<string name="view_all_timezones">View all timezones IDs</string>
|
<string name="view_all_timezones">View all timezones IDs</string>
|
||||||
<string name="hide_all_timezones">Hide all timezones IDs</string>
|
<string name="hide_all_timezones">Hide all timezones IDs</string>
|
||||||
<string name="timezone_id">Timezone ID</string>
|
<string name="timezone_id">Timezone ID</string>
|
||||||
<string name="disable_auto_time_zone_before_set">Auto timezone should be disabled before set a custom timezone. </string>
|
<string name="disable_auto_time_zone_before_set">Auto timezone should be disabled before set a custom timezone. </string>
|
||||||
<string name="from_epoch_to_target_time">From Epoch(1970/1/1 00:00:00 UTC) to the time you want to set(ms)</string>
|
|
||||||
<string name="get_current_time">Current time</string>
|
|
||||||
<string name="permission_policy">Permission policy</string>
|
<string name="permission_policy">Permission policy</string>
|
||||||
<string name="auto_grant">Auto grant</string>
|
<string name="auto_grant">Auto grant</string>
|
||||||
<string name="auto_deny">Auto deny</string>
|
<string name="auto_deny">Auto deny</string>
|
||||||
<string name="mte_policy">MTE policy</string>
|
<string name="mte_policy">MTE policy</string>
|
||||||
<string name="mte_policy_desc">MTE: Memory Tagging Extension, require Android 14 and ARMv9</string>
|
|
||||||
<string name="nearby_app_streaming">Nearby App streaming policy</string>
|
<string name="nearby_app_streaming">Nearby App streaming policy</string>
|
||||||
<string name="nearby_streaming_policy">Nearby streaming policy</string>
|
<string name="nearby_streaming_policy">Nearby streaming policy</string>
|
||||||
<string name="nearby_notification_streaming">Nearby notification streaming policy</string>
|
<string name="nearby_notification_streaming">Nearby notification streaming policy</string>
|
||||||
@@ -491,14 +486,11 @@
|
|||||||
<string name="password_info">Password Info</string>
|
<string name="password_info">Password Info</string>
|
||||||
<string name="reset_pwd_desc">Keep empty to remove password</string>
|
<string name="reset_pwd_desc">Keep empty to remove password</string>
|
||||||
<string name="max_pwd_fail">Max failed passwords</string>
|
<string name="max_pwd_fail">Max failed passwords</string>
|
||||||
<string name="max_pwd_fail_desc">When reach this limit, the device will be factory reset</string>
|
|
||||||
<string name="max_pwd_fail_textfield">Maximum failed attempts</string>
|
<string name="max_pwd_fail_textfield">Maximum failed attempts</string>
|
||||||
<string name="pwd_expiration_timeout">Password expiration timeout</string>
|
<string name="pwd_expiration_timeout">Password expiration timeout</string>
|
||||||
<string name="max_time_to_lock">Screen timeout</string>
|
<string name="max_time_to_lock">Screen timeout</string>
|
||||||
<string name="required_strong_auth_timeout">Required strong auth timeout</string>
|
<string name="required_strong_auth_timeout">Required strong auth timeout</string>
|
||||||
<string name="zero_means_no_restriction">0 means no restriction</string>
|
|
||||||
<string name="pwd_history">Password history length</string>
|
<string name="pwd_history">Password history length</string>
|
||||||
<string name="pwd_history_desc">Historical passwords within the specified range cannot be set by user</string>
|
|
||||||
<string name="password_complexity_none">None (No password allowed)</string>
|
<string name="password_complexity_none">None (No password allowed)</string>
|
||||||
<string name="password_complexity_low">Low (Gesture password and characters repetition allowed)</string>
|
<string name="password_complexity_low">Low (Gesture password and characters repetition allowed)</string>
|
||||||
<string name="password_complexity_medium">Medium (Repetition disallowed, 4 characters at least)</string>
|
<string name="password_complexity_medium">Medium (Repetition disallowed, 4 characters at least)</string>
|
||||||
@@ -609,4 +601,52 @@
|
|||||||
<string name="version_name">Version name</string>
|
<string name="version_name">Version name</string>
|
||||||
<string name="version_code">Version code</string>
|
<string name="version_code">Version code</string>
|
||||||
<string name="parsing_apk_info" tools:ignore="TypographyEllipsis">Parsing APK info...</string>
|
<string name="parsing_apk_info" tools:ignore="TypographyEllipsis">Parsing APK info...</string>
|
||||||
|
|
||||||
|
<string name="info_dhizuku">Dhizuku is a tool that can share Device owner permissions to other application.</string>
|
||||||
|
<string name="info_device_id_attestation">Indicates if the device supports attestation of device identifiers in addition to key attestation.</string>
|
||||||
|
<string name="info_unique_device_attestation">Yes if the StrongBox Keymaster implementation on the device was provisioned with an individual attestation certificate and can sign attestation records using it (only Keymaster with StrongBox security level can use an individual attestation certificate).</string>
|
||||||
|
<string name="info_org_id">Sets the Enterprise ID. This is a requirement for generating an enrollment-specific ID for the device.</string>
|
||||||
|
<string name="info_enrollment_specific_id">The identifier would be consistent even if the work profile is removed and create again (to the same Organization ID), or the device is factory reset and re-enrolled.</string>
|
||||||
|
<string name="info_lock_screen_info">Show a brief message on your lock screen.\nOverrides any owner information manually set by the user and prevents the user from further changing it.</string>
|
||||||
|
<string name="info_short_support_message">This will be displayed to the user in settings screens where functionality has been disabled by the admin. If the message is longer than 200 characters it may be truncated</string>
|
||||||
|
<string name="info_long_support_message">This will be displayed to the user in the device administrators settings screen. If the message is longer than 20000 characters it may be truncated.</string>
|
||||||
|
<string name="info_transfer_ownership">Changes the current administrator to another one. All policies from the current administrator are migrated to the new administrator.</string>
|
||||||
|
<string name="info_backup_service">Each user has its own backup service which manages the backup and restore mechanisms in that user. Disabling the backup service will prevent data from being backed up or restored.\nFor a managed user its backup functionality is only enabled if both the device owner and the profile owner have enabled the backup service.</string>
|
||||||
|
<string name="info_common_criteria_mode">When the device is in Common Criteria mode, certain device functionalities are tuned to meet the higher security level required by Common Criteria certification.</string>
|
||||||
|
<string name="info_disable_keyguard">Setting the keyguard to disabled has the same effect as choosing "None" as the screen lock type. However, this call has no effect if a password, pin or pattern is currently set.\nIf a password, pin or pattern is set after the keyguard was disabled, the keyguard stops being disabled.</string>
|
||||||
|
<string name="info_evict_credential_encryption_key">Evict the user\'s credential encryption key from the keyring. The user\'s credential will need to be entered again in order to derive the credential encryption key that will be stored back in the keyring for future use. In order to secure user data, the user will be stopped and restarted.</string>
|
||||||
|
<string name="info_reboot">You can\'t use this function if there is an ongoing call on the device.</string>
|
||||||
|
<string name="info_edit_time">Input UNIX time in milliseconds</string>
|
||||||
|
<string name="info_permission_policy">Set the default response for future runtime permission requests by applications.</string>
|
||||||
|
<string name="info_mte_policy">Set the Memory Tagging Extension policy. Reboot the device to apply changes.</string>
|
||||||
|
<string name="info_nearby_app_streaming_policy">App streaming is when the device starts an app on a virtual display and sends a video stream of the app to nearby devices.</string>
|
||||||
|
<string name="info_nearby_notification_streaming_policy">Notification streaming is sending notification data from pre-installed apps to nearby devices.</string>
|
||||||
|
<string name="info_lock_task_packages">Only packages in lock task packages list can be launched in lock task mode.</string>
|
||||||
|
<string name="info_start_lock_task_mode">If you allow notifications in Lock task features, OwnDroid will pop a notification when lock task mode start successfully. You can exit lock task mode by click that notification.</string>
|
||||||
|
<string name="info_security_log">If a Device owner use this function, all users should be affiliated.</string>
|
||||||
|
<string name="info_pre_reboot_security_log">Not all devices support pre-reboot security logs.</string>
|
||||||
|
<string name="info_disable_account_management">When account management is disabled for an account type, adding or removing an account of that type will not be possible.</string>
|
||||||
|
<string name="info_frp_policy">FRP can protect the device after untrusted factory reset (in Recovery or Fastboot).\nTo enable this feature, the device must support persistent data block service.</string>
|
||||||
|
<string name="info_wipe_data_in_managed_user">All data of this user will be wiped, but that user won\'t be removed.</string>
|
||||||
|
<string name="info_lockdown_admin_configured_network">Control whether the user can change networks configured by the admin.\nWhen this lockdown is enabled, the user can still configure and connect to other Wi-Fi networks, or use other Wi-Fi capabilities such as tethering.</string>
|
||||||
|
<string name="info_minimum_wifi_security_level">Specify the minimum security level required for Wi-Fi networks. The device may not connect to networks that do not meet the minimum security level. If the current network does not meet the minimum security level set, it will be disconnected.</string>
|
||||||
|
<string name="info_private_dns_mode_oppertunistic">In this mode, the DNS subsystem will attempt a TLS handshake to the network-supplied resolver prior to attempting name resolution in cleartext.</string>
|
||||||
|
<string name="info_set_private_dns_host">It will perform a connectivity check to the resolver, to ensure it is valid.\nIn case a VPN is used in conjunction with Private DNS resolver, the Private DNS resolver must be reachable both from within and outside the VPN. Otherwise, the device may lose the ability to resolve hostnames as system traffic to the resolver may not go through the VPN.</string>
|
||||||
|
<string name="info_always_on_vpn">Configure an always-on VPN connection through a specific application for the current user. This connection is automatically granted and persisted after a reboot.\nEnable lockdown: Disallow networking when the VPN is not connected.</string>
|
||||||
|
<string name="info_recommended_global_proxy">This proxy is only a recommendation and it is possible that some apps will ignore it.</string>
|
||||||
|
<string name="info_network_log">Network logs contain DNS lookup and connect() library call events.\nUse this function in work profile will only retrieve network logs in work profile.\nThere shouldn\'t be unaffiliated user on this device if used by Device owner.</string>
|
||||||
|
<string name="info_profile_maximum_time_off">Set maximum time the profile is allowed to be turned off. If the profile is turned off for longer, personal apps are suspended on the device.\nThe minimum non-zero value corresponds to 72 hours. If an admin sets a smaller non-zero vaulue, 72 hours will be set instead.</string>
|
||||||
|
<string name="info_cross_profile_intent_filter">Add cross profile intent filters so that some intents sent in the managed profile can also be resolved in the parent, or vice versa. Only activity intents are supported.</string>
|
||||||
|
<string name="info_suspend_app">A suspended package will not be able to start activities. Its notifications will be hidden, it will not show up in recent activities, will not be able to show toasts or dialogs or ring the device.\nSome apps cannot be suspended, such as device admins, the active launcher and the default dialer.</string>
|
||||||
|
<string name="info_disable_user_control">User will not be able to clear app data or force-stop packages.</string>
|
||||||
|
<string name="info_keep_uninstalled_apps">Set a list of apps to keep around as APKs even if no user has currently installed it. </string>
|
||||||
|
<string name="info_user_operation">It is recommended to specify a user with serial number, you can also use UID, the UID should be any of the apps in the target user.</string>
|
||||||
|
<string name="info_affiliated_id">When Device owner create a managed user, the managed user isn\'t affiliated. In order to make the managed user affiliated with the Device owner, you should set same affiliated IDs in main user and managed user</string>
|
||||||
|
<string name="info_reset_password">Set a new lockscreen password. The length of this password must be at least 4 digits. Keep it empty to remove password.\nIf you set a numeric password that length is 6 or lower, it will set as PIN</string>
|
||||||
|
<string name="info_screen_timeout">Set the maximum time for user activity until the device will lock. This limits the length that the user can set.\nA value of 0 means there is no restriction.</string>
|
||||||
|
<string name="info_password_expiration_timeout">Restart the countdown for password expiration.\nA value of 0 means there is no restriction.</string>
|
||||||
|
<string name="info_max_failed_password_system_user">Setting this to a value greater than zero enables a policy that the device will be factory reset after too many incorrect device-unlock passwords have been entered.</string>
|
||||||
|
<string name="info_max_failed_password_other_user">Setting this to a value greater than zero enables a policy that will wipe this user after too many incorrect unlock password have been entered.</string>
|
||||||
|
<string name="info_password_history_length">After setting this, the user will not be able to enter a new password that is the same as any password in the history. Note that the current password will remain until the user has set a new one, so the change does not take place immediately.\nA value of 0 means there is no restriction.</string>
|
||||||
|
<string name="info_required_strong_auth_timeout">Determine for how long the user will be able to use secondary, non strong auth for authentication, since last strong method authentication (password, pin or pattern) was used. After the returned timeout the user is required to use strong authentication method.\nA value of 0 means the admin is not participating in controlling the timeout. The minimum and maximum timeouts are platform-defined and are typically 1 hour and 72 hours, respectively.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user