Optimize UI for Device info, User info and Password info

Change USB signal to Disable USB signal
Hide Master volume mute in work profile
This commit is contained in:
BinTianqi
2024-10-26 10:54:39 +08:00
parent 3a19b1acf9
commit 5e8ea061ca
11 changed files with 130 additions and 141 deletions

View File

@@ -14,6 +14,7 @@ import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.StringRes
import com.bintianqi.owndroid.dpm.addDeviceAdmin import com.bintianqi.owndroid.dpm.addDeviceAdmin
import com.bintianqi.owndroid.dpm.createManagedProfile import com.bintianqi.owndroid.dpm.createManagedProfile
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@@ -121,3 +122,8 @@ fun formatFileSize(bytes: Long): String {
else -> "$bytes bytes" else -> "$bytes bytes"
} }
} }
@StringRes
fun Boolean.yesOrNo(): Int {
return if(this) R.string.yes else R.string.no
}

View File

@@ -192,7 +192,7 @@ private fun CreateWorkProfile() {
if(VERSION.SDK_INT >= 24) { intent.putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, skipEncrypt) } if(VERSION.SDK_INT >= 24) { intent.putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, skipEncrypt) }
if(VERSION.SDK_INT >= 33) { intent.putExtra(EXTRA_PROVISIONING_ALLOW_OFFLINE, offlineProvisioning) } if(VERSION.SDK_INT >= 33) { intent.putExtra(EXTRA_PROVISIONING_ALLOW_OFFLINE, offlineProvisioning) }
createManagedProfile.launch(intent) createManagedProfile.launch(intent)
} catch(e:ActivityNotFoundException) { } catch(_:ActivityNotFoundException) {
Toast.makeText(context, R.string.unsupported, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.unsupported, Toast.LENGTH_SHORT).show()
} }
}, },

View File

@@ -162,7 +162,7 @@ fun Network(navCtrl: NavHostController) {
val mac = dpm.getWifiMacAddress(receiver) val mac = dpm.getWifiMacAddress(receiver)
OutlinedTextField( OutlinedTextField(
value = mac ?: stringResource(R.string.none), value = mac ?: stringResource(R.string.none),
onValueChange = {}, readOnly = true, modifier = Modifier.fillMaxWidth(), textStyle = typography.titleMedium, onValueChange = {}, readOnly = true, modifier = Modifier.fillMaxWidth(), textStyle = typography.bodyLarge,
trailingIcon = { trailingIcon = {
if(mac != null) IconButton(onClick = { writeClipBoard(context, mac) }) { if(mac != null) IconButton(onClick = { writeClipBoard(context, mac) }) {
Icon(painter = painterResource(R.drawable.content_copy_fill0), contentDescription = stringResource(R.string.copy)) Icon(painter = painterResource(R.drawable.content_copy_fill0), contentDescription = stringResource(R.string.copy))

View File

@@ -81,11 +81,13 @@ import androidx.navigation.compose.rememberNavController
import com.bintianqi.owndroid.R import com.bintianqi.owndroid.R
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.CardItem
import com.bintianqi.owndroid.ui.CheckBoxItem import com.bintianqi.owndroid.ui.CheckBoxItem
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
import com.bintianqi.owndroid.ui.TopBar import com.bintianqi.owndroid.ui.TopBar
import com.bintianqi.owndroid.yesOrNo
@Composable @Composable
fun Password(navCtrl: NavHostController) { fun Password(navCtrl: NavHostController) {
@@ -265,24 +267,18 @@ private fun PasswordInfo() {
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
if(VERSION.SDK_INT >= 29) { if(VERSION.SDK_INT >= 29) {
val passwordComplexity = mapOf( val passwordComplexity = mapOf(
PASSWORD_COMPLEXITY_NONE to stringResource(R.string.password_complexity_none), PASSWORD_COMPLEXITY_NONE to R.string.password_complexity_none,
PASSWORD_COMPLEXITY_LOW to stringResource(R.string.password_complexity_low), PASSWORD_COMPLEXITY_LOW to R.string.password_complexity_low,
PASSWORD_COMPLEXITY_MEDIUM to stringResource(R.string.password_complexity_medium), PASSWORD_COMPLEXITY_MEDIUM to R.string.password_complexity_medium,
PASSWORD_COMPLEXITY_HIGH to stringResource(R.string.password_complexity_high) PASSWORD_COMPLEXITY_HIGH to R.string.password_complexity_high
) )
val pwdComplex = passwordComplexity[dpm.passwordComplexity] CardItem(R.string.current_password_complexity, passwordComplexity[dpm.passwordComplexity] ?: R.string.unknown)
Text(text = stringResource(R.string.current_password_complexity_is, pwdComplex?:stringResource(R.string.unknown)))
} }
if(deviceOwner || profileOwner) { if(deviceOwner || profileOwner) {
Text(stringResource(R.string.is_password_sufficient, dpm.isActivePasswordSufficient)) CardItem(R.string.password_sufficient, dpm.isActivePasswordSufficient.yesOrNo())
}
if(context.isDeviceAdmin) {
val pwdFailedAttempts = dpm.currentFailedPasswordAttempts
Text(text = stringResource(R.string.password_failed_attempts_is, pwdFailedAttempts))
} }
if(VERSION.SDK_INT >= 28 && profileOwner && dpm.isManagedProfile(receiver)) { if(VERSION.SDK_INT >= 28 && profileOwner && dpm.isManagedProfile(receiver)) {
val unifiedPwd = dpm.isUsingUnifiedPassword(receiver) CardItem(R.string.unified_password, dpm.isUsingUnifiedPassword(receiver).yesOrNo())
Text(stringResource(R.string.is_using_unified_password, unifiedPwd))
} }
} }
} }

View File

@@ -29,7 +29,6 @@ import androidx.compose.ui.platform.LocalFocusManager
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.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
@@ -40,6 +39,7 @@ import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.backToHomeStateFlow import com.bintianqi.owndroid.backToHomeStateFlow
import com.bintianqi.owndroid.ui.* import com.bintianqi.owndroid.ui.*
import com.bintianqi.owndroid.writeClipBoard import com.bintianqi.owndroid.writeClipBoard
import com.bintianqi.owndroid.yesOrNo
import com.rosan.dhizuku.api.Dhizuku import com.rosan.dhizuku.api.Dhizuku
import com.rosan.dhizuku.api.DhizukuRequestPermissionListener import com.rosan.dhizuku.api.DhizukuRequestPermissionListener
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -480,50 +480,29 @@ fun DeviceInfo() {
Text(text = stringResource(R.string.device_info), style = typography.headlineLarge) Text(text = stringResource(R.string.device_info), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
if(VERSION.SDK_INT>=34 && (context.isDeviceOwner || dpm.isOrgProfile(receiver))) { if(VERSION.SDK_INT>=34 && (context.isDeviceOwner || dpm.isOrgProfile(receiver))) {
val financed = dpm.isDeviceFinanced CardItem(R.string.financed_device, dpm.isDeviceFinanced.yesOrNo())
Text(stringResource(R.string.is_device_financed, financed))
} }
Spacer(Modifier.padding(vertical = 2.dp))
if(VERSION.SDK_INT >= 33) { if(VERSION.SDK_INT >= 33) {
val dpmRole = dpm.devicePolicyManagementRoleHolderPackage val dpmRole = dpm.devicePolicyManagementRoleHolderPackage
Text(stringResource(R.string.dpmrh, if(dpmRole == null) stringResource(R.string.none) else "")) CardItem(R.string.dpmrh, if(dpmRole == null) stringResource(R.string.none) else dpmRole)
if(dpmRole!=null) {
SelectionContainer(modifier = Modifier.horizontalScroll(rememberScrollState())) {
Text(text = dpmRole)
} }
}
}
Spacer(Modifier.padding(vertical = 2.dp))
val encryptionStatus = mutableMapOf( val encryptionStatus = mutableMapOf(
DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE to stringResource(R.string.es_inactive), DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE to R.string.es_inactive,
DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE to stringResource(R.string.es_active), DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE to R.string.es_active,
DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED to stringResource(R.string.es_unsupported) DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED to R.string.es_unsupported
) )
if(VERSION.SDK_INT >= 23) { encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY] = stringResource(R.string.es_active_default_key) } if(VERSION.SDK_INT >= 23) { encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY] = R.string.es_active_default_key }
if(VERSION.SDK_INT >= 24) { encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER] = stringResource(R.string.es_active_per_user) } if(VERSION.SDK_INT >= 24) { encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER] = R.string.es_active_per_user }
Text(stringResource(R.string.encrypt_status_is, encryptionStatus[dpm.storageEncryptionStatus] ?: "")) CardItem(R.string.encryption_status, encryptionStatus[dpm.storageEncryptionStatus] ?: R.string.unknown)
Spacer(Modifier.padding(vertical = 2.dp))
if(VERSION.SDK_INT >= 28) { if(VERSION.SDK_INT >= 28) {
Text(stringResource(R.string.support_device_id_attestation, dpm.isDeviceIdAttestationSupported)) CardItem(R.string.support_device_id_attestation, dpm.isDeviceIdAttestationSupported.yesOrNo())
} }
Spacer(Modifier.padding(vertical = 2.dp))
if (VERSION.SDK_INT >= 30) { if (VERSION.SDK_INT >= 30) {
Text(stringResource(R.string.support_unique_device_attestation, dpm.isUniqueDeviceAttestationSupported)) CardItem(R.string.support_unique_device_attestation, dpm.isUniqueDeviceAttestationSupported.yesOrNo())
} }
Spacer(Modifier.padding(vertical = 2.dp))
val adminList = dpm.activeAdmins val adminList = dpm.activeAdmins
if(adminList != null) { if(adminList != null) {
var adminListText = "" CardItem(R.string.activated_device_admin, adminList.map { it.flattenToShortString() }.joinToString("\n"))
Text(text = stringResource(R.string.activated_device_admin, adminList.size))
var count = adminList.size
for(each in adminList) {
count -= 1
adminListText += "${each.packageName}/${each.className}"
if(count>0) {adminListText += "\n"}
}
SelectionContainer(modifier = Modifier.fillMaxWidth().padding(vertical = 2.dp).horizontalScroll(rememberScrollState())) {
Text(text = adminListText)
}
} }
} }
} }
@@ -694,7 +673,7 @@ private fun TransformOwnership() {
try { try {
dpm.transferOwnership(receiver, ComponentName(pkg, cls),null) dpm.transferOwnership(receiver, ComponentName(pkg, cls),null)
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()
}catch(e:IllegalArgumentException) { } catch(_:IllegalArgumentException) {
Toast.makeText(context, R.string.failed, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.failed, Toast.LENGTH_SHORT).show()
} }
}, },
@@ -712,7 +691,7 @@ private fun activateDeviceAdmin(inputContext:Context,inputComponent:ComponentNam
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, inputComponent) intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, inputComponent)
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, inputContext.getString(R.string.activate_device_admin_here)) intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, inputContext.getString(R.string.activate_device_admin_here))
addDeviceAdmin.launch(intent) addDeviceAdmin.launch(intent)
}catch(e:ActivityNotFoundException) { } catch(_:ActivityNotFoundException) {
Toast.makeText(inputContext, R.string.unsupported, Toast.LENGTH_SHORT).show() Toast.makeText(inputContext, R.string.unsupported, Toast.LENGTH_SHORT).show()
} }
} }

View File

@@ -282,7 +282,7 @@ private fun Switches() {
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)
} }
} }
if(deviceOwner || profileOwner) { 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) }, padding = false
) )
@@ -302,16 +302,10 @@ private fun Switches() {
{ dpm.isCommonCriteriaModeEnabled(receiver) }, { dpm.setCommonCriteriaModeEnabled(receiver,it) }, padding = false { dpm.isCommonCriteriaModeEnabled(receiver) }, { dpm.setCommonCriteriaModeEnabled(receiver,it) }, padding = false
) )
} }
if(VERSION.SDK_INT >= 31 && (deviceOwner || dpm.isOrgProfile(receiver))) { if(VERSION.SDK_INT >= 31 && (deviceOwner || dpm.isOrgProfile(receiver)) && dpm.canUsbDataSignalingBeDisabled()) {
SwitchItem( SwitchItem(
R.string.usb_signal, "", R.drawable.usb_fill0, { dpm.isUsbDataSignalingEnabled }, R.string.disable_usb_signal, "", R.drawable.usb_fill0, { !dpm.isUsbDataSignalingEnabled },
{ { dpm.isUsbDataSignalingEnabled = !it }, padding = false
if(dpm.canUsbDataSignalingBeDisabled()) {
dpm.isUsbDataSignalingEnabled = it
} else {
Toast.makeText(context, R.string.unsupported, Toast.LENGTH_SHORT).show()
}
}, padding = false
) )
} }
Spacer(Modifier.padding(vertical = 30.dp)) Spacer(Modifier.padding(vertical = 30.dp))

View File

@@ -56,7 +56,6 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.os.UserManagerCompat
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
@@ -67,11 +66,13 @@ import com.bintianqi.owndroid.fileUriFlow
import com.bintianqi.owndroid.getFile import com.bintianqi.owndroid.getFile
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.CardItem
import com.bintianqi.owndroid.ui.CheckBoxItem import com.bintianqi.owndroid.ui.CheckBoxItem
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
import com.bintianqi.owndroid.uriToStream import com.bintianqi.owndroid.uriToStream
import com.bintianqi.owndroid.yesOrNo
@Composable @Composable
fun UserManage(navCtrl: NavHostController) { fun UserManage(navCtrl: NavHostController) {
@@ -171,24 +172,20 @@ private fun CurrentUserInfo() {
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.user_info), style = typography.headlineLarge) Text(text = stringResource(R.string.user_info), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
Text(stringResource(R.string.is_user_unlocked, UserManagerCompat.isUserUnlocked(context))) if(VERSION.SDK_INT >= 24) CardItem(R.string.support_multiuser, UserManager.supportsMultipleUsers().yesOrNo())
if(VERSION.SDK_INT >= 24) { Text(stringResource(R.string.is_support_multi_user, UserManager.supportsMultipleUsers())) } if(VERSION.SDK_INT >= 23) CardItem(R.string.system_user, userManager.isSystemUser.yesOrNo())
if(VERSION.SDK_INT >= 23) { Text(text = stringResource(R.string.is_system_user, userManager.isSystemUser)) } if(VERSION.SDK_INT >= 34) CardItem(R.string.admin_user, userManager.isAdminUser.yesOrNo())
if(VERSION.SDK_INT >= 34) { Text(text = stringResource(R.string.is_admin_user, userManager.isAdminUser)) } if(VERSION.SDK_INT >= 31) CardItem(R.string.headless_system_user, UserManager.isHeadlessSystemUserMode().yesOrNo())
if(VERSION.SDK_INT >= 31) { Text(text = stringResource(R.string.is_headless_system_user, UserManager.isHeadlessSystemUserMode())) }
Spacer(Modifier.padding(vertical = 5.dp))
if (VERSION.SDK_INT >= 28) { if (VERSION.SDK_INT >= 28) {
val logoutable = dpm.isLogoutEnabled CardItem(R.string.logout_enabled, dpm.isLogoutEnabled.yesOrNo())
Text(text = stringResource(R.string.user_can_logout, logoutable))
if(context.isDeviceOwner || context.isProfileOwner) { if(context.isDeviceOwner || context.isProfileOwner) {
val ephemeralUser = dpm.isEphemeralUser(receiver) CardItem(R.string.ephemeral_user, dpm.isEphemeralUser(receiver).yesOrNo())
Text(text = stringResource(R.string.is_ephemeral_user, ephemeralUser))
} }
Text(text = stringResource(R.string.is_affiliated_user, dpm.isAffiliatedUser)) CardItem(R.string.affiliated_user, dpm.isAffiliatedUser.yesOrNo())
} }
Spacer(Modifier.padding(vertical = 5.dp)) CardItem(R.string.user_id, (Binder.getCallingUid() / 100000).toString())
Text(text = stringResource(R.string.user_id_is, Binder.getCallingUid() / 100000)) CardItem(R.string.user_serial_number, userManager.getSerialNumberForUser(Process.myUserHandle()).toString())
Text(text = stringResource(R.string.user_serial_number_is, userManager.getSerialNumberForUser(Process.myUserHandle()))) Spacer(Modifier.padding(vertical = 30.dp))
} }
} }
@@ -270,7 +267,7 @@ private fun UserOperation() {
try{ try{
val result = dpm.stopUser(receiver,userHandleById) val result = dpm.stopUser(receiver,userHandleById)
Toast.makeText(context, userOperationResultCode(result,context), Toast.LENGTH_SHORT).show() Toast.makeText(context, userOperationResultCode(result,context), Toast.LENGTH_SHORT).show()
}catch(e:IllegalArgumentException) { }catch(_: IllegalArgumentException) {
Toast.makeText(context, R.string.failed, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.failed, Toast.LENGTH_SHORT).show()
} }
}, },

View File

@@ -7,6 +7,7 @@ import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.selection.SelectionContainer
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
@@ -18,6 +19,7 @@ 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
@@ -223,3 +225,18 @@ fun CopyTextButton(@StringRes label: Int, content: String) {
} }
} }
} }
@Composable
fun CardItem(@StringRes title: Int, @StringRes text: Int) {
CardItem(title, stringResource(text))
}
@Composable
fun CardItem(@StringRes title: Int, text: String) {
Card(modifier = Modifier.fillMaxWidth().padding(vertical = 6.dp)) {
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))
}
}
}

View File

@@ -55,6 +55,8 @@
<string name="account">Hesap</string> <string name="account">Hesap</string>
<string name="warning">Warning</string> <!--TODO--> <string name="warning">Warning</string> <!--TODO-->
<string name="delete">Delete</string> <!--TODO--> <string name="delete">Delete</string> <!--TODO-->
<string name="yes">Yes</string> <!--TODO-->
<string name="no">No</string> <!--TODO-->
<!--Permissions--> <!--Permissions-->
<string name="click_to_activate">Etkinleştirmek İçin Tıklayın</string> <string name="click_to_activate">Etkinleştirmek İçin Tıklayın</string>
@@ -66,10 +68,10 @@
<string name="reset_device_policy">Reset device policy</string> <!--TODO--> <string name="reset_device_policy">Reset device policy</string> <!--TODO-->
<string name="activate_device_admin">Cihaz Yöneticisini Etkinleştir</string> <string name="activate_device_admin">Cihaz Yöneticisini Etkinleştir</string>
<string name="device_info">Cihaz Bilgisi</string> <string name="device_info">Cihaz Bilgisi</string>
<string name="support_device_id_attestation">Cihaz Kimliği Doğrulama Desteği: %1$s</string> <string name="support_device_id_attestation">Cihaz Kimliği Doğrulama Desteği</string>
<string name="support_unique_device_attestation">Benzersiz Cihaz Doğrulama Desteği: %1$s</string> <string name="support_unique_device_attestation">Benzersiz Cihaz Doğrulama Desteği</string>
<string name="is_device_financed">Finansmanlı Cihaz: %1$s</string> <string name="financed_device">Finansmanlı Cihaz</string>
<string name="dpmrh">Cihaz Politikası Yönetim Rolü: %1$s</string> <string name="dpmrh">Cihaz Politikası Yönetim Rolü</string>
<!--es: encryption status--> <!--es: encryption status-->
<string name="es_inactive">Devre Dışı</string> <string name="es_inactive">Devre Dışı</string>
@@ -77,7 +79,7 @@
<string name="es_unsupported">Desteklenmiyor</string> <string name="es_unsupported">Desteklenmiyor</string>
<string name="es_active_default_key">Aktif(Varsayılan Anahtar)</string> <string name="es_active_default_key">Aktif(Varsayılan Anahtar)</string>
<string name="es_active_per_user">Aktif(Kullanıcı Başına)</string> <string name="es_active_per_user">Aktif(Kullanıcı Başına)</string>
<string name="activated_device_admin">Aktif Cihaz Yöneticileri: %1$s</string> <string name="activated_device_admin">Aktif Cihaz Yöneticileri</string>
<string name="enrollment_specific_id">Kayıt Özel Kimliği</string> <string name="enrollment_specific_id">Kayıt Özel Kimliği</string>
<string name="org_name">Organizasyon Adı</string> <string name="org_name">Organizasyon Adı</string>
<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>
@@ -130,7 +132,7 @@
<string name="backup_service">Yedekleme servisi</string> <string name="backup_service">Yedekleme servisi</string>
<string name="disable_bt_contact_share">Bluetooth kişi paylaşımını devre dışı bırak</string> <string name="disable_bt_contact_share">Bluetooth kişi paylaşımını devre dışı bırak</string>
<string name="common_criteria_mode">Ortak kriter modu</string> <string name="common_criteria_mode">Ortak kriter modu</string>
<string name="usb_signal">USB sinyali</string> <string name="disable_usb_signal">USB sinyali</string> <!--TODO-->
<string name="keyguard">Ekran kilidi</string> <string name="keyguard">Ekran kilidi</string>
<string name="lock_now">Ekranı şimdi kilitle</string> <string name="lock_now">Ekranı şimdi kilitle</string>
<string name="evict_credential_encryptoon_key">Kimlik doğrulama şifreleme anahtarını çıkar</string> <string name="evict_credential_encryptoon_key">Kimlik doğrulama şifreleme anahtarını çıkar</string>
@@ -185,7 +187,7 @@
<string name="wipe_silently">Sessizce sil</string> <string name="wipe_silently">Sessizce sil</string>
<string name="wipe_data_warning">All data on your device will be ERASED</string> <!--TODO--> <string name="wipe_data_warning">All data on your device will be ERASED</string> <!--TODO-->
<string name="wipe_work_profile_warning">Your work profile will be DELETED</string> <!--TODO--> <string name="wipe_work_profile_warning">Your work profile will be DELETED</string> <!--TODO-->
<string name="encrypt_status_is">Şifreleme durumu: %1$s</string> <string name="encryption_status">Encryption status</string> <!--TODO-->
<string name="frp_policy">FRP politikası</string> <string name="frp_policy">FRP politikası</string>
<string name="factory_reset_protection_policy">Fabrika ayarlarına sıfırlama koruma politikası</string> <string name="factory_reset_protection_policy">Fabrika ayarlarına sıfırlama koruma politikası</string>
<string name="frp_policy_not_supported">FRP politikası bu cihazda desteklenmiyor</string> <string name="frp_policy_not_supported">FRP politikası bu cihazda desteklenmiyor</string>
@@ -440,16 +442,15 @@
<string name="start_user_session_msg">Kullanıcı oturumunu başlat mesajı</string> <string name="start_user_session_msg">Kullanıcı oturumunu başlat mesajı</string>
<string name="end_user_session_msg">Kullanıcı oturumunu sonlandır mesajı</string> <string name="end_user_session_msg">Kullanıcı oturumunu sonlandır mesajı</string>
<string name="user_info">Kullanıcı bilgisi</string> <string name="user_info">Kullanıcı bilgisi</string>
<string name="is_user_unlocked">Kullanıcı kilidi açıldı: %1$s</string> <string name="support_multiuser">Çoklu kullanıcı desteği</string>
<string name="is_support_multi_user">Çoklu kullanıcı desteği: %1$s</string> <string name="system_user">Sistem kullanıcısı</string>
<string name="is_system_user">Sistem kullanıcısı: %1$s</string> <string name="admin_user">Yönetici kullanıcısı</string>
<string name="is_admin_user">Yönetici kullanıcısı: %1$s</string> <string name="headless_system_user">Başsız sistem kullanıcısı</string>
<string name="is_headless_system_user">Başsız sistem kullanıcısı: %1$s</string> <string name="logout_enabled">Logout enabled</string> <!--TODO-->
<string name="user_can_logout">Kullanıcı çıkış yapabilir: %1$s</string> <string name="ephemeral_user">Geçici kullanıcı</string>
<string name="is_ephemeral_user">Geçici kullanıcı: %1$s</string> <string name="affiliated_user">Bağlı kullanıcı</string>
<string name="is_affiliated_user">Bağlı kullanıcı: %1$s</string> <string name="user_id">Kullanıcı ID</string>
<string name="user_id_is">Kullanıcı ID: %1$s</string> <string name="user_serial_number">Kullanıcı seri numarası</string>
<string name="user_serial_number_is">Kullanıcı seri numarası: %1$s</string>
<string name="user_operation">Kullanıcı işlemi</string> <string name="user_operation">Kullanıcı işlemi</string>
<string name="serial_number">Seri numarası</string> <string name="serial_number">Seri numarası</string>
<string name="use_uid">UID kullan</string> <string name="use_uid">UID kullan</string>
@@ -491,10 +492,9 @@
<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>
<string name="password_complexity_high">Yüksek (Tekrar yasak, en az 6 karakter)</string> <string name="password_complexity_high">Yüksek (Tekrar yasak, en az 6 karakter)</string>
<string name="current_password_complexity_is">Mevcut şifre karmaşıklığı: %1$s</string> <string name="current_password_complexity">Mevcut şifre karmaşıklığı</string>
<string name="is_password_sufficient">Şifre karmaşıklığı yeterli mi: %1$s</string> <string name="password_sufficient">Şifre karmaşıklığı yeterli mi</string>
<string name="password_failed_attempts_is">Başarısız şifre denemeleri: %1$s</string> <string name="unified_password">Birleşik şifre</string>
<string name="is_using_unified_password">Birleşik şifre: %1$s</string>
<string name="reset_password_token">Şifre sıfırlama jetonu</string> <string name="reset_password_token">Şifre sıfırlama jetonu</string>
<string name="token">Token</string> <!--TODO--> <string name="token">Token</string> <!--TODO-->
<string name="token_must_longer_than_32_byte">The token must be longer than 32-byte</string> <!--TODO--> <string name="token_must_longer_than_32_byte">The token must be longer than 32-byte</string> <!--TODO-->

View File

@@ -52,6 +52,8 @@
<string name="account">账户</string> <string name="account">账户</string>
<string name="warning">警告</string> <string name="warning">警告</string>
<string name="delete">删除</string> <string name="delete">删除</string>
<string name="yes"></string>
<string name="no"></string>
<!--Permissions--> <!--Permissions-->
<string name="click_to_activate">点击以激活</string> <string name="click_to_activate">点击以激活</string>
@@ -63,16 +65,16 @@
<string name="dhizuku_will_be_deactivated">Dhizuku将被停用</string> <string name="dhizuku_will_be_deactivated">Dhizuku将被停用</string>
<string name="activate_device_admin">激活Device admin</string> <string name="activate_device_admin">激活Device admin</string>
<string name="device_info">设备信息</string> <string name="device_info">设备信息</string>
<string name="support_device_id_attestation">支持设备ID认证%1$s</string> <string name="support_device_id_attestation">支持设备ID认证</string>
<string name="support_unique_device_attestation">支持唯一设备认证%1$s</string> <string name="support_unique_device_attestation">支持唯一设备认证</string>
<string name="is_device_financed">Financed device: %1$s</string> <string name="financed_device">Financed device</string>
<string name="dpmrh">设备策略管理器角色(DPMRH)%1$s</string> <string name="dpmrh">设备策略管理器角色</string>
<string name="es_inactive">未使用</string> <string name="es_inactive">未使用</string>
<string name="es_active">正在使用</string> <string name="es_active">正在使用</string>
<string name="es_unsupported">不支持</string> <string name="es_unsupported">不支持</string>
<string name="es_active_default_key">使用默认密钥</string> <string name="es_active_default_key">使用默认密钥</string>
<string name="es_active_per_user">每个用户分别加密</string> <string name="es_active_per_user">每个用户分别加密</string>
<string name="activated_device_admin">激活的Device admin: %1$s</string> <string name="activated_device_admin">激活的Device admin</string>
<string name="enrollment_specific_id">设备注册专用ID</string> <string name="enrollment_specific_id">设备注册专用ID</string>
<string name="org_name">组织名称</string> <string name="org_name">组织名称</string>
<string name="disable_account_management">禁用账号管理</string> <string name="disable_account_management">禁用账号管理</string>
@@ -125,7 +127,7 @@
<string name="backup_service">备份服务</string> <string name="backup_service">备份服务</string>
<string name="disable_bt_contact_share">禁止蓝牙分享联系人</string> <string name="disable_bt_contact_share">禁止蓝牙分享联系人</string>
<string name="common_criteria_mode">通用标准模式</string> <string name="common_criteria_mode">通用标准模式</string>
<string name="usb_signal">USB信号</string> <string name="disable_usb_signal">禁用USB信号</string>
<string name="keyguard">锁屏</string> <string name="keyguard">锁屏</string>
<string name="lock_now">立即锁屏</string> <string name="lock_now">立即锁屏</string>
<string name="evict_credential_encryptoon_key">移除凭证加密密钥</string> <string name="evict_credential_encryptoon_key">移除凭证加密密钥</string>
@@ -180,7 +182,7 @@
<string name="wipe_silently">静默清除</string> <string name="wipe_silently">静默清除</string>
<string name="wipe_data_warning">你的设备上的所有数据将会被清除</string> <string name="wipe_data_warning">你的设备上的所有数据将会被清除</string>
<string name="wipe_work_profile_warning">你的工作资料将会被删除</string> <string name="wipe_work_profile_warning">你的工作资料将会被删除</string>
<string name="encrypt_status_is">加密状态%1$s</string> <string name="encryption_status">加密状态</string>
<string name="frp_policy">FRP策略</string> <string name="frp_policy">FRP策略</string>
<string name="factory_reset_protection_policy">恢复出厂设置保护策略</string> <string name="factory_reset_protection_policy">恢复出厂设置保护策略</string>
<string name="frp_policy_not_supported">这个设备不支持恢复出厂设置保护策略</string> <string name="frp_policy_not_supported">这个设备不支持恢复出厂设置保护策略</string>
@@ -432,16 +434,15 @@
<string name="start_user_session_msg">用户会话开始消息</string> <string name="start_user_session_msg">用户会话开始消息</string>
<string name="end_user_session_msg">用户会话结束消息</string> <string name="end_user_session_msg">用户会话结束消息</string>
<string name="user_info">用户信息</string> <string name="user_info">用户信息</string>
<string name="is_user_unlocked">用户已解锁:%1$s</string> <string name="support_multiuser">支持多用户</string>
<string name="is_support_multi_user">支持多用户:%1$s</string> <string name="system_user">系统用户</string>
<string name="is_system_user">系统用户:%1$s</string> <string name="admin_user">管理员用户</string>
<string name="is_admin_user">管理员用户:%1$s</string> <string name="headless_system_user">无头系统用户</string>
<string name="is_headless_system_user">无头系统用户: %1$s</string> <string name="logout_enabled">用户可登出</string>
<string name="user_can_logout">用户可以退出 : %1$s</string> <string name="ephemeral_user">临时用户</string>
<string name="is_ephemeral_user">临时用户: %1$s</string> <string name="affiliated_user">附属用户</string>
<string name="is_affiliated_user">附属用户: %1$s</string> <string name="user_id">当前UserID</string>
<string name="user_id_is">当前UserID%1$s</string> <string name="user_serial_number">当前用户序列号</string>
<string name="user_serial_number_is">当前用户序列号:%1$s</string>
<string name="user_operation">用户操作</string> <string name="user_operation">用户操作</string>
<string name="serial_number">序列号</string> <string name="serial_number">序列号</string>
<string name="use_uid">使用UID</string> <string name="use_uid">使用UID</string>
@@ -483,10 +484,9 @@
<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>
<string name="password_complexity_high">无连续性至少6位</string> <string name="password_complexity_high">无连续性至少6位</string>
<string name="current_password_complexity_is">当前密码复杂度%1$s</string> <string name="current_password_complexity">当前密码复杂度</string>
<string name="is_password_sufficient">密码达到要求:%1$s</string> <string name="password_sufficient">密码符合复杂度要求</string>
<string name="password_failed_attempts_is">密码已错误次数:%1$s</string> <string name="unified_password">一致的密码</string>
<string name="is_using_unified_password">个人与工作应用密码一致:%1$s</string>
<string name="reset_password_token">密码重置令牌</string> <string name="reset_password_token">密码重置令牌</string>
<string name="token">令牌</string> <string name="token">令牌</string>
<string name="token_must_longer_than_32_byte">令牌必须大于32字节</string> <string name="token_must_longer_than_32_byte">令牌必须大于32字节</string>

View File

@@ -55,6 +55,8 @@
<string name="account">Account</string> <string name="account">Account</string>
<string name="warning">Warning</string> <string name="warning">Warning</string>
<string name="delete">Delete</string> <string name="delete">Delete</string>
<string name="yes">Yes</string>
<string name="no">No</string>
<!--Permissions--> <!--Permissions-->
<string name="click_to_activate">Click to activate</string> <string name="click_to_activate">Click to activate</string>
@@ -68,17 +70,17 @@
<string name="activate_device_admin_command" translatable="false">dpm set-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string> <string name="activate_device_admin_command" translatable="false">dpm set-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
<string name="activate_device_owner_command" translatable="false">dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string> <string name="activate_device_owner_command" translatable="false">dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
<string name="device_info">Device info</string> <string name="device_info">Device info</string>
<string name="support_device_id_attestation">Support Device ID attestation: %1$s</string> <string name="support_device_id_attestation">Support Device ID attestation</string>
<string name="support_unique_device_attestation">Support unique device attestation: %1$s</string> <string name="support_unique_device_attestation">Support unique device attestation</string>
<string name="is_device_financed">Financed device: %1$s</string> <string name="financed_device">Financed device</string>
<string name="dpmrh">Device policy management role holder: %1$s</string> <string name="dpmrh">Device policy management role holder</string>
<!--es: encryption status--> <!--es: encryption status-->
<string name="es_inactive">Inactive</string> <string name="es_inactive">Inactive</string>
<string name="es_active">Active</string> <string name="es_active">Active</string>
<string name="es_unsupported">Unsupported</string> <string name="es_unsupported">Unsupported</string>
<string name="es_active_default_key">Active(default key)</string> <string name="es_active_default_key">Active(default key)</string>
<string name="es_active_per_user">Active(per-user)</string> <string name="es_active_per_user">Active(per-user)</string>
<string name="activated_device_admin">Active device admins: %1$s</string> <string name="activated_device_admin">Active device admins</string>
<string name="enrollment_specific_id">Enrollment specific ID</string> <string name="enrollment_specific_id">Enrollment specific ID</string>
<string name="org_name">Organization name</string> <string name="org_name">Organization name</string>
<string name="disable_account_management">Disable account management</string> <string name="disable_account_management">Disable account management</string>
@@ -134,7 +136,7 @@
<string name="backup_service">Backup service</string> <string name="backup_service">Backup service</string>
<string name="disable_bt_contact_share">Disable bluetooth contact sharing</string> <string name="disable_bt_contact_share">Disable bluetooth contact sharing</string>
<string name="common_criteria_mode">Common criteria mode</string> <string name="common_criteria_mode">Common criteria mode</string>
<string name="usb_signal">USB signal</string> <string name="disable_usb_signal">Disable USB signal</string>
<string name="keyguard">Keyguard</string> <string name="keyguard">Keyguard</string>
<string name="lock_now">Lock screen now</string> <string name="lock_now">Lock screen now</string>
<string name="evict_credential_encryptoon_key">Evict credential encryption key</string> <string name="evict_credential_encryptoon_key">Evict credential encryption key</string>
@@ -188,7 +190,7 @@
<string name="wipe_silently">Wipe silently</string> <string name="wipe_silently">Wipe silently</string>
<string name="wipe_data_warning">All data on your device will be ERASED</string> <string name="wipe_data_warning">All data on your device will be ERASED</string>
<string name="wipe_work_profile_warning">Your work profile will be DELETED</string> <string name="wipe_work_profile_warning">Your work profile will be DELETED</string>
<string name="encrypt_status_is">Encrypt status: %1$s</string> <string name="encryption_status">Encryption status</string>
<string name="frp_policy">FRP policy</string> <string name="frp_policy">FRP policy</string>
<string name="factory_reset_protection_policy">Factory reset protection policy</string> <string name="factory_reset_protection_policy">Factory reset protection policy</string>
<string name="frp_policy_not_supported">FRP policy is not supported on this device</string> <string name="frp_policy_not_supported">FRP policy is not supported on this device</string>
@@ -445,16 +447,15 @@
<string name="start_user_session_msg">Start user session message</string> <string name="start_user_session_msg">Start user session message</string>
<string name="end_user_session_msg">End user session message</string> <string name="end_user_session_msg">End user session message</string>
<string name="user_info">User info</string> <string name="user_info">User info</string>
<string name="is_user_unlocked">User unlocked: %1$s</string> <string name="support_multiuser">Support multiuser</string>
<string name="is_support_multi_user">Support multiuser: %1$s</string> <string name="system_user">System user</string>
<string name="is_system_user">System user: %1$s</string> <string name="admin_user">Admin user</string>
<string name="is_admin_user">Admin user: %1$s</string> <string name="headless_system_user">Headless system user</string>
<string name="is_headless_system_user">Headless system user: %1$s</string> <string name="logout_enabled">Logout enabled</string>
<string name="user_can_logout">User can logout: %1$s</string> <string name="ephemeral_user">Ephemeral user</string>
<string name="is_ephemeral_user">Ephemeral user: %1$s</string> <string name="affiliated_user">Affiliated user</string>
<string name="is_affiliated_user">Affiliated user: %1$s</string> <string name="user_id">UserID</string>
<string name="user_id_is">UserID%1$s</string> <string name="user_serial_number">User serial number</string>
<string name="user_serial_number_is">User serial number: %1$s</string>
<string name="user_operation">User operation</string> <string name="user_operation">User operation</string>
<string name="serial_number">Serial number</string> <string name="serial_number">Serial number</string>
<string name="use_uid">Use UID</string> <string name="use_uid">Use UID</string>
@@ -496,10 +497,9 @@
<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>
<string name="password_complexity_high">High (Repetition disallowed, 6 characters at least)</string> <string name="password_complexity_high">High (Repetition disallowed, 6 characters at least)</string>
<string name="current_password_complexity_is">Current password complexity: %1$s</string> <string name="current_password_complexity">Current password complexity</string>
<string name="is_password_sufficient">Is password complexity sufficient: %1$s</string> <string name="password_sufficient">Password complexity sufficient</string>
<string name="password_failed_attempts_is">Password failed attempts: %1$s</string> <string name="unified_password">Unified password</string>
<string name="is_using_unified_password">Unified password: %1$s</string>
<string name="reset_password_token">Reset password token</string> <string name="reset_password_token">Reset password token</string>
<string name="token">Token</string> <string name="token">Token</string>
<string name="token_must_longer_than_32_byte">The token must be longer than 32-byte</string> <string name="token_must_longer_than_32_byte">The token must be longer than 32-byte</string>