Create managed user: select mutiple flags

Fix App manager TopAppBar color
Optimize some strings
Create managed profile: Offline provisioning and Migrate account
This commit is contained in:
BinTianqi
2024-10-02 10:48:12 +08:00
parent 0788634049
commit 36609d68ef
11 changed files with 108 additions and 57 deletions

View File

@@ -4,9 +4,7 @@
### Description
Use Device admin and Device owner privilege to take full control of your device.
This app is renamed to "OwnDroid" from "Android Owner".
Use Device admin and Device owner privilege to take full control of your device.
### Docs

View File

@@ -6,8 +6,6 @@
使用安卓的Device Admin和Device Owner特权完全掌控你的设备。
这个APP已经改名为"OwnDroid",原名"Android Owner"
### 文档
全新的OwnDroid文档[owndroid.pages.dev](https://owndroid.pages.dev/zh_CN)

View File

@@ -49,6 +49,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TextField
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableIntState
@@ -131,7 +132,8 @@ fun ApplicationManage(navCtrl:NavHostController, dialogStatus: MutableIntState)
singleLine = true
)
},
navigationIcon = { NavIcon { navCtrl.navigateUp() } }
navigationIcon = { NavIcon { navCtrl.navigateUp() } },
colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.background)
)
}
) { paddingValues->

View File

@@ -1,10 +1,13 @@
package com.bintianqi.owndroid.dpm
import android.accounts.Account
import android.annotation.SuppressLint
import android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE
import android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE
import android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ALLOW_OFFLINE
import android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME
import android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME
import android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION
import android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION
import android.app.admin.DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT
import android.app.admin.DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED
@@ -43,6 +46,8 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
@@ -126,14 +131,48 @@ private fun Home(navCtrl: NavHostController) {
private fun CreateWorkProfile() {
val context = LocalContext.current
val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.create_work_profile), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp))
var skipEncrypt by remember { mutableStateOf(false) }
if(VERSION.SDK_INT>=24) {
var offlineProvisioning by remember { mutableStateOf(true) }
var migrateAccount by remember { mutableStateOf(false) }
var migrateAccountName by remember { mutableStateOf("") }
var migrateAccountType by remember { mutableStateOf("") }
var keepAccount by remember { mutableStateOf(true) }
if(VERSION.SDK_INT >= 22) {
CheckBoxItem(R.string.migrate_account, migrateAccount, { migrateAccount = it })
AnimatedVisibility(migrateAccount) {
val fr = FocusRequester()
Column(modifier = Modifier.padding(start = 10.dp)) {
OutlinedTextField(
value = migrateAccountName, onValueChange = { migrateAccountName = it },
label = { Text(stringResource(R.string.account_name)) },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
keyboardActions = KeyboardActions { fr.requestFocus() },
modifier = Modifier.fillMaxWidth()
)
OutlinedTextField(
value = migrateAccountType, onValueChange = { migrateAccountType = it },
label = { Text(stringResource(R.string.account_type)) },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions { focusMgr.clearFocus() },
modifier = Modifier.fillMaxWidth().focusRequester(fr)
)
if(VERSION.SDK_INT >= 26) {
CheckBoxItem(R.string.keep_account, keepAccount, { keepAccount = it })
}
}
}
}
if(VERSION.SDK_INT >= 24) {
CheckBoxItem(R.string.skip_encryption, skipEncrypt, { skipEncrypt = it })
}
if(VERSION.SDK_INT >= 33) {
CheckBoxItem(R.string.offline_provisioning, offlineProvisioning, { offlineProvisioning = it })
}
Spacer(Modifier.padding(vertical = 5.dp))
Button(
onClick = {
@@ -141,13 +180,19 @@ private fun CreateWorkProfile() {
val intent = Intent(ACTION_PROVISION_MANAGED_PROFILE)
if(VERSION.SDK_INT>=23) {
intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME,receiver)
}else{
} else {
intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, context.packageName)
}
if(VERSION.SDK_INT>=24) { intent.putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION,skipEncrypt) }
if(VERSION.SDK_INT>=33) { intent.putExtra(EXTRA_PROVISIONING_ALLOW_OFFLINE,true) }
if(migrateAccount && VERSION.SDK_INT >= 22) {
intent.putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, Account(migrateAccountName, migrateAccountType))
if(VERSION.SDK_INT >= 26) {
intent.putExtra(EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION, keepAccount)
}
}
if(VERSION.SDK_INT >= 24) { intent.putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, skipEncrypt) }
if(VERSION.SDK_INT >= 33) { intent.putExtra(EXTRA_PROVISIONING_ALLOW_OFFLINE, offlineProvisioning) }
createManagedProfile.launch(intent)
}catch(e:ActivityNotFoundException) {
} catch(e:ActivityNotFoundException) {
Toast.makeText(context, R.string.unsupported, Toast.LENGTH_SHORT).show()
}
},

View File

@@ -546,7 +546,11 @@ private fun MaxFailedPasswordForWipe() {
)
Spacer(Modifier.padding(vertical = 5.dp))
Button(
onClick = { focusMgr.clearFocus(); dpm.setMaximumFailedPasswordsForWipe(receiver,inputContent.toInt()) },
onClick = {
focusMgr.clearFocus()
dpm.setMaximumFailedPasswordsForWipe(receiver, inputContent.toInt())
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()
},
modifier = Modifier.fillMaxWidth(),
enabled = inputContent != ""
) {

View File

@@ -454,14 +454,14 @@ fun DeviceInfo() {
)
if(VERSION.SDK_INT >= 23) { encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY] = stringResource(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) }
Text(stringResource(R.string.encrypt_status_is)+encryptionStatus[dpm.storageEncryptionStatus])
Text(stringResource(R.string.encrypt_status_is, encryptionStatus[dpm.storageEncryptionStatus] ?: ""))
Spacer(Modifier.padding(vertical = 2.dp))
if(VERSION.SDK_INT >= 28) {
Text(stringResource(R.string.support_device_id_attestation) + dpm.isDeviceIdAttestationSupported)
Text(stringResource(R.string.support_device_id_attestation, dpm.isDeviceIdAttestationSupported))
}
Spacer(Modifier.padding(vertical = 2.dp))
if (VERSION.SDK_INT >= 30) {
Text(stringResource(R.string.support_unique_device_attestation) + dpm.isUniqueDeviceAttestationSupported)
Text(stringResource(R.string.support_unique_device_attestation, dpm.isUniqueDeviceAttestationSupported))
}
Spacer(Modifier.padding(vertical = 2.dp))
val adminList = dpm.activeAdmins
@@ -658,7 +658,7 @@ private fun DisableAccountManagement() {
OutlinedTextField(
value = inputText,
onValueChange = { inputText = it },
label = { Text(stringResource(R.string.account_types_are)) },
label = { Text(stringResource(R.string.account_type)) },
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp),
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() })

View File

@@ -1112,7 +1112,7 @@ fun FactoryResetProtection() {
AnimatedVisibility(usePolicy) {
Column {
CheckBoxItem(R.string.enable_frp, enabled, { enabled = it })
Text(stringResource(R.string.account_list_is))
Text(stringResource(R.string.account_list_is) + "\n")
Text(
text = if(accountList.isEmpty()) stringResource(R.string.none) else accountList.joinToString(separator = "\n"),
modifier = Modifier.animateContentSize()

View File

@@ -41,7 +41,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -66,9 +65,9 @@ import androidx.navigation.compose.rememberNavController
import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.fileUriFlow
import com.bintianqi.owndroid.getFile
import com.bintianqi.owndroid.toggle
import com.bintianqi.owndroid.ui.Animations
import com.bintianqi.owndroid.ui.CheckBoxItem
import com.bintianqi.owndroid.ui.RadioButtonItem
import com.bintianqi.owndroid.ui.SubPageItem
import com.bintianqi.owndroid.ui.TopBar
import com.bintianqi.owndroid.uriToStream
@@ -290,6 +289,7 @@ private fun CreateUser() {
val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current
var userName by remember { mutableStateOf("") }
val flags = remember { mutableStateListOf<Int>() }
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.create_user), style = typography.headlineLarge)
@@ -303,31 +303,29 @@ private fun CreateUser() {
keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() })
)
Spacer(Modifier.padding(vertical = 5.dp))
var selectedFlag by remember { mutableIntStateOf(0) }
RadioButtonItem(R.string.none, selectedFlag == 0, { selectedFlag = 0 })
RadioButtonItem(
CheckBoxItem(
R.string.create_user_skip_wizard,
selectedFlag == DevicePolicyManager.SKIP_SETUP_WIZARD,
{ selectedFlag = DevicePolicyManager.SKIP_SETUP_WIZARD }
DevicePolicyManager.SKIP_SETUP_WIZARD in flags,
{ flags.toggle(it, DevicePolicyManager.SKIP_SETUP_WIZARD) }
)
if(VERSION.SDK_INT >= 28) {
RadioButtonItem(
CheckBoxItem(
R.string.create_user_ephemeral_user,
selectedFlag == DevicePolicyManager.MAKE_USER_EPHEMERAL,
{ selectedFlag = DevicePolicyManager.MAKE_USER_EPHEMERAL }
DevicePolicyManager.MAKE_USER_EPHEMERAL in flags,
{ flags.toggle(it, DevicePolicyManager.MAKE_USER_EPHEMERAL) }
)
RadioButtonItem(
CheckBoxItem(
R.string.create_user_enable_all_system_app,
selectedFlag == DevicePolicyManager.LEAVE_ALL_SYSTEM_APPS_ENABLED,
{ selectedFlag = DevicePolicyManager.LEAVE_ALL_SYSTEM_APPS_ENABLED }
DevicePolicyManager.LEAVE_ALL_SYSTEM_APPS_ENABLED in flags,
{ flags.toggle(it, DevicePolicyManager.LEAVE_ALL_SYSTEM_APPS_ENABLED) }
)
}
var newUserHandle: UserHandle? by remember { mutableStateOf(null) }
Spacer(Modifier.padding(vertical = 5.dp))
Button(
onClick = {
newUserHandle = dpm.createAndManageUser(receiver, userName, receiver, null, selectedFlag)
focusMgr.clearFocus()
newUserHandle = dpm.createAndManageUser(receiver, userName, receiver, null, flags.sum())
Toast.makeText(context, if(newUserHandle!=null) R.string.success else R.string.failed, Toast.LENGTH_SHORT).show()
},
modifier = Modifier.fillMaxWidth()

View File

@@ -66,8 +66,8 @@
<string name="reset_device_policy">Reset device policy</string> <!--TODO-->
<string name="activate_device_admin">Cihaz Yöneticisini Etkinleştir</string>
<string name="device_info">Cihaz Bilgisi</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: </string>
<string name="support_device_id_attestation">Cihaz Kimliği Doğrulama Desteği: %1$s</string>
<string name="support_unique_device_attestation">Benzersiz Cihaz Doğrulama Desteği: %1$s</string>
<string name="is_device_financed">Finansmanlı Cihaz: %1$s</string>
<string name="dpmrh">Cihaz Politikası Yönetim Rolü: %1$s</string>
@@ -81,7 +81,7 @@
<string name="enrollment_specific_id">Kayıt Özel Kimliği</string>
<string name="org_name">Organizasyon Adı</string>
<string name="disable_account_management">Hesap Yönetimini Devre Dışı Bırak</string>
<string name="account_types_are">Hesap Türleri: </string>
<string name="account_type">Hesap Türleri</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_package_name">Hedef Paket Adı</string>
@@ -89,7 +89,6 @@
<string name="device_owner_lock_screen_info">Ekran Kilidi Bilgisi</string>
<string name="support_msg">Destek Mesajı</string>
<string name="short_support_msg">Kısa Mesaj</string>
<string name="support_msg_desc">Bu uygulama tarafından devre dışı bırakılan işlevleri kullanmaya çalışan kullanıcılara destek mesajı gösterilir. (Çok satırlı izin verilir) </string>
<string name="long_support_msg">Uzun Mesaj</string>
<string name="transfer">Transfer</string>
<string name="activate_device_admin_here">Cihaz Yöneticisini Burada Etkinleştir.</string>
@@ -186,12 +185,12 @@
<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_work_profile_warning">Your work profile will be DELETED</string> <!--TODO-->
<string name="encrypt_status_is">Şifreleme durumu: </string>
<string name="encrypt_status_is">Şifreleme durumu: %1$s</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="frp_policy_not_supported">FRP politikası bu cihazda desteklenmiyor</string>
<string name="enable_frp">FRP\'yi etkinleştir</string>
<string name="account_list_is">Hesap listesi: </string>
<string name="account_list_is">"Hesap listesi: "</string>
<!--SystemUpdatePolicy-->
<string name="is_security_patch">Güvenlik yaması: %1$s</string>
@@ -207,7 +206,7 @@
<string name="install_system_update">Sistem güncellemesini yükle</string>
<string name="select_ota_package" tools:ignore="TypographyEllipsis">OTA paketini seç...</string>
<string name="start_install_system_update">Sistem güncellemesi yüklemeye başla</string>
<string name="install_system_update_failed">Sistem güncellemesi yükleme başarısız: </string>
<string name="install_system_update_failed">"Sistem güncellemesi yükleme başarısız: "</string>
<string name="battery_low">Pil zayıf</string>
<string name="update_file_invalid">Güncelleme dosyası geçersiz</string>
<string name="incorrect_os_ver">Yanlış işletim sistemi sürümü</string>
@@ -221,7 +220,7 @@
<string name="preferential_network_service">Tercihli ağ hizmeti</string>
<string name="lockdown_admin_configured_network">Yönetici tarafından yapılandırılmış ağı kilitle</string>
<string name="wifi_ssid_policy">WiFi SSID politikası</string>
<string name="ssid_list_is">SSID listesi: </string>
<string name="ssid_list_is">SSID listesi:</string>
<string name="cannot_be_empty">Boş olamaz</string>
<string name="already_exist">Zaten mevcut</string>
<string name="private_dns">Özel DNS</string>
@@ -273,6 +272,10 @@
<string name="work_profile_owner">Profil sahibi (İş profili)</string>
<string name="work_profile_activated">İş profili etkinleştirildi</string>
<string name="create_work_profile">İş profili oluştur</string>
<string name="offline_provisioning">Offline mode</string> <!--TODO-->
<string name="migrate_account">Migrate account</string> <!--TODO-->
<string name="account_name">Account name</string> <!--TODO-->
<string name="keep_account">Keep account</string> <!--TODO-->
<string name="is_org_owned_profile">Kuruluşa ait iş profili: %1$s</string>
<string name="org_owned_work_profile">Kuruluş iş profili</string>
<string name="skip_encryption">Şifrelemeyi atla</string>
@@ -313,7 +316,7 @@
<!--ucd: user control disabled-->
<string name="ucd">Kullanıcı kontrolünü devre dışı bırak</string>
<string name="ucd_desc">Bunu ayarlarsanız, bu uygulamaların depolama alanını temizleyemez veya zorla durduramazsınız. </string>
<string name="app_list_is">Uygulama listesi: </string>
<string name="app_list_is">Uygulama listesi:</string>
<string name="clear_list">Listeyi temizle</string>
<string name="permission_manage">İzin yönetimi</string>
<string name="cross_profile_package">Profil geçişli paket</string>
@@ -463,7 +466,6 @@
<string name="affiliation_id">Bağlılık ID</string>
<string name="include_empty_string">Boş string dahil et</string>
<string name="change_user_icon">Kullanıcı simgesini değiştir</string>
<string name="pick_a_square_image">Kare bir resim seçmelisiniz</string>
<string name="file_picker_instead_gallery">Galeri yerine dosya seçici kullan</string>
<string name="select_picture" tools:ignore="TypographyEllipsis">Resim seç...</string>
<string name="unknown_result">Bilinmeyen sonuç (başarısız olabilir)</string>

View File

@@ -63,8 +63,8 @@
<string name="dhizuku_will_be_deactivated">Dhizuku将被停用</string>
<string name="activate_device_admin">激活Device admin</string>
<string name="device_info">设备信息</string>
<string name="support_device_id_attestation">支持设备ID认证</string>
<string name="support_unique_device_attestation">支持唯一设备认证:</string>
<string name="support_device_id_attestation">支持设备ID认证%1$s</string>
<string name="support_unique_device_attestation">支持唯一设备认证:%1$s</string>
<string name="is_device_financed">Financed device: %1$s</string>
<string name="dpmrh">设备策略管理器角色(DPMRH)%1$s</string>
<string name="es_inactive">未使用</string>
@@ -76,7 +76,7 @@
<string name="enrollment_specific_id">设备注册专用ID</string>
<string name="org_name">组织名称</string>
<string name="disable_account_management">禁用账号管理</string>
<string name="account_types_are">账号类型</string>
<string name="account_type">账号类型</string>
<string name="transfer_ownership">转移所有权</string>
<string name="transfer_ownership_desc">把Device owner或Profile owner权限转移到另一个应用</string>
<string name="target_package_name">目标包名</string>
@@ -84,7 +84,6 @@
<string name="device_owner_lock_screen_info">锁屏提示信息</string>
<string name="support_msg">提供支持的消息</string>
<string name="short_support_msg">提供支持的短消息</string>
<string name="support_msg_desc">如果你禁用了某个功能,用户尝试使用这个功能时会看见这个消息(可多行)</string>
<string name="long_support_msg">提供支持的长消息</string>
<string name="transfer">转移</string>
<string name="activate_device_admin_here">在这里激活Device admin</string>
@@ -181,7 +180,7 @@
<string name="wipe_silently">静默清除</string>
<string name="wipe_data_warning">你的设备上的所有数据将会被清除</string>
<string name="wipe_work_profile_warning">你的工作资料将会被删除</string>
<string name="encrypt_status_is">加密状态:</string>
<string name="encrypt_status_is">加密状态:%1$s</string>
<string name="frp_policy">FRP策略</string>
<string name="factory_reset_protection_policy">恢复出厂设置保护策略</string>
<string name="frp_policy_not_supported">这个设备不支持恢复出厂设置保护策略</string>
@@ -268,6 +267,10 @@
<string name="work_profile_owner">Profile owner工作资料</string>
<string name="work_profile_activated">工作资料已激活</string>
<string name="create_work_profile">创建工作资料</string>
<string name="offline_provisioning">离线模式</string>
<string name="migrate_account">迁移账号</string>
<string name="account_name">账号名</string>
<string name="keep_account">保留账号</string>
<string name="is_org_owned_profile">由组织拥有的工作资料:%1$s</string>
<string name="org_owned_work_profile">组织拥有的工作资料</string>
<string name="skip_encryption">跳过加密</string>
@@ -455,7 +458,6 @@
<string name="affiliation_id">附属用户ID</string>
<string name="include_empty_string">有空字符串</string>
<string name="change_user_icon">更换用户头像</string>
<string name="pick_a_square_image">尽量选择正方形的图片,以免产生问题</string>
<string name="file_picker_instead_gallery">使用文件选择器而不是相册</string>
<string name="select_picture" tools:ignore="TypographyEllipsis">选择图片...</string>
<string name="unknown_result">未知结果(失败)</string>

View File

@@ -68,8 +68,8 @@
<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="device_info">Device info</string>
<string name="support_device_id_attestation">Support Device ID attestation: </string>
<string name="support_unique_device_attestation">Support unique device attestation: </string>
<string name="support_device_id_attestation">Support Device ID attestation: %1$s</string>
<string name="support_unique_device_attestation">Support unique device attestation: %1$s</string>
<string name="is_device_financed">Financed device: %1$s</string>
<string name="dpmrh">Device policy management role holder: %1$s</string>
<!--es: encryption status-->
@@ -82,7 +82,7 @@
<string name="enrollment_specific_id">Enrollment specific ID</string>
<string name="org_name">Organization name</string>
<string name="disable_account_management">Disable account management</string>
<string name="account_types_are">Account types: </string>
<string name="account_type">Account type</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_package_name">Target package name</string>
@@ -90,7 +90,6 @@
<string name="device_owner_lock_screen_info">Lockscreen info</string>
<string name="support_msg">Support Message</string>
<string name="short_support_msg">Short message</string>
<string name="support_msg_desc">When users try to use functions disabled by this app, the support message will show. (Multi-line allowed) </string>
<string name="long_support_msg">Long message</string>
<string name="transfer">Transfer</string>
<string name="activate_device_admin_here">Activate Device admin here.</string>
@@ -189,12 +188,12 @@
<string name="wipe_silently">Wipe silently</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="encrypt_status_is">Encrypt status: </string>
<string name="encrypt_status_is">Encrypt status: %1$s</string>
<string name="frp_policy">FRP 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="enable_frp">Enable FRP</string>
<string name="account_list_is">Account list: </string>
<string name="account_list_is">"Account list: "</string>
<!--SystemUpdatePolicy-->
<string name="is_security_patch">Security patch: %1$s</string>
@@ -211,7 +210,7 @@
<string name="install_system_update">Install system update</string>
<string name="select_ota_package" tools:ignore="TypographyEllipsis">Select OTA package...</string>
<string name="start_install_system_update">Start installing system update</string>
<string name="install_system_update_failed">Install system update failed: </string>
<string name="install_system_update_failed">"Install system update failed: "</string>
<string name="battery_low">Battery is low</string>
<string name="update_file_invalid">Update file is invalid</string>
<string name="incorrect_os_ver">Incorrect OS version</string>
@@ -225,7 +224,7 @@
<string name="preferential_network_service">Preferential network service</string>
<string name="lockdown_admin_configured_network">Lockdown admin configured network</string>
<string name="wifi_ssid_policy">WiFi SSID policy</string>
<string name="ssid_list_is">SSID list: </string>
<string name="ssid_list_is">SSID list:</string>
<string name="cannot_be_empty">Cannot be empty</string>
<string name="already_exist">Already exist</string>
<string name="private_dns">Private DNS</string>
@@ -277,6 +276,10 @@
<string name="work_profile_owner">Profile owner (Work profile)</string>
<string name="work_profile_activated">Work profile activated</string>
<string name="create_work_profile">Create work profile</string>
<string name="offline_provisioning">Offline mode</string>
<string name="migrate_account">Migrate account</string>
<string name="account_name">Account name</string>
<string name="keep_account">Keep account</string>
<string name="is_org_owned_profile">Organization owned work profile: %1$s</string>
<string name="org_owned_work_profile">Organization work profile</string>
<string name="activate_org_profile_command" tools:ignore="TypographyDashes" translatable="false">
@@ -319,7 +322,7 @@
<!--ucd: user control disabled-->
<string name="ucd">Disable user control</string>
<string name="ucd_desc">If you set this, you cannot clear these apps\' storage or force stop them. </string>
<string name="app_list_is">App list: </string>
<string name="app_list_is">App list:</string>
<string name="clear_list">Clear list</string>
<string name="permission_manage">Permission manage</string>
<string name="cross_profile_package">Cross profile package</string>
@@ -468,7 +471,6 @@
<string name="affiliation_id">Affiliation ID</string>
<string name="include_empty_string">Include empty string</string>
<string name="change_user_icon">Change user icon</string>
<string name="pick_a_square_image">You should pick a square image</string>
<string name="file_picker_instead_gallery">Use file picker instead of gallery</string>
<string name="select_picture" tools:ignore="TypographyEllipsis">Select image...</string>
<string name="unknown_result">Unknown result(may failed)</string>