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

@@ -6,8 +6,6 @@
Use Device admin and Device owner privilege to take full control of your device.
This app is renamed to "OwnDroid" from "Android Owner".
### Docs
A renewed OwnDroid docs are available on [owndroid.pages.dev](https://owndroid.pages.dev)

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>