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. Use Device admin and Device owner privilege to take full control of your device.
This app is renamed to "OwnDroid" from "Android Owner".
### Docs ### Docs
A renewed OwnDroid docs are available on [owndroid.pages.dev](https://owndroid.pages.dev) A renewed OwnDroid docs are available on [owndroid.pages.dev](https://owndroid.pages.dev)

View File

@@ -6,8 +6,6 @@
使用安卓的Device Admin和Device Owner特权完全掌控你的设备。 使用安卓的Device Admin和Device Owner特权完全掌控你的设备。
这个APP已经改名为"OwnDroid",原名"Android Owner"
### 文档 ### 文档
全新的OwnDroid文档[owndroid.pages.dev](https://owndroid.pages.dev/zh_CN) 全新的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.TextButton
import androidx.compose.material3.TextField import androidx.compose.material3.TextField
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableIntState import androidx.compose.runtime.MutableIntState
@@ -131,7 +132,8 @@ fun ApplicationManage(navCtrl:NavHostController, dialogStatus: MutableIntState)
singleLine = true singleLine = true
) )
}, },
navigationIcon = { NavIcon { navCtrl.navigateUp() } } navigationIcon = { NavIcon { navCtrl.navigateUp() } },
colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.background)
) )
} }
) { paddingValues-> ) { paddingValues->

View File

@@ -1,10 +1,13 @@
package com.bintianqi.owndroid.dpm package com.bintianqi.owndroid.dpm
import android.accounts.Account
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE 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_ALLOW_OFFLINE
import android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME 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_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.EXTRA_PROVISIONING_SKIP_ENCRYPTION
import android.app.admin.DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT import android.app.admin.DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT
import android.app.admin.DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED 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.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier 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.LocalContext
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@@ -126,14 +131,48 @@ private fun Home(navCtrl: NavHostController) {
private fun CreateWorkProfile() { private fun CreateWorkProfile() {
val context = LocalContext.current val context = LocalContext.current
val receiver = context.getReceiver() val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) { Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.create_work_profile), style = typography.headlineLarge) Text(text = stringResource(R.string.create_work_profile), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
var skipEncrypt by remember { mutableStateOf(false) } var skipEncrypt by remember { mutableStateOf(false) }
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) { if(VERSION.SDK_INT >= 24) {
CheckBoxItem(R.string.skip_encryption, skipEncrypt, { skipEncrypt = it }) 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)) Spacer(Modifier.padding(vertical = 5.dp))
Button( Button(
onClick = { onClick = {
@@ -144,8 +183,14 @@ private fun CreateWorkProfile() {
} else { } else {
intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, context.packageName) intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, context.packageName)
} }
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 >= 24) { intent.putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, skipEncrypt) }
if(VERSION.SDK_INT>=33) { intent.putExtra(EXTRA_PROVISIONING_ALLOW_OFFLINE,true) } if(VERSION.SDK_INT >= 33) { intent.putExtra(EXTRA_PROVISIONING_ALLOW_OFFLINE, offlineProvisioning) }
createManagedProfile.launch(intent) createManagedProfile.launch(intent)
} catch(e:ActivityNotFoundException) { } catch(e:ActivityNotFoundException) {
Toast.makeText(context, R.string.unsupported, Toast.LENGTH_SHORT).show() 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)) Spacer(Modifier.padding(vertical = 5.dp))
Button( 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(), modifier = Modifier.fillMaxWidth(),
enabled = inputContent != "" 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 >= 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) } 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)) 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) Text(stringResource(R.string.support_device_id_attestation, dpm.isDeviceIdAttestationSupported))
} }
Spacer(Modifier.padding(vertical = 2.dp)) 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) Text(stringResource(R.string.support_unique_device_attestation, dpm.isUniqueDeviceAttestationSupported))
} }
Spacer(Modifier.padding(vertical = 2.dp)) Spacer(Modifier.padding(vertical = 2.dp))
val adminList = dpm.activeAdmins val adminList = dpm.activeAdmins
@@ -658,7 +658,7 @@ private fun DisableAccountManagement() {
OutlinedTextField( OutlinedTextField(
value = inputText, value = inputText,
onValueChange = { inputText = it }, 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), modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp),
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() }) keyboardActions = KeyboardActions(onDone = { focusMgr.clearFocus() })

View File

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

View File

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

View File

@@ -66,8 +66,8 @@
<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: </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: </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="is_device_financed">Finansmanlı Cihaz: %1$s</string>
<string name="dpmrh">Cihaz Politikası Yönetim Rolü: %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="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>
<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">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="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> <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="device_owner_lock_screen_info">Ekran Kilidi Bilgisi</string>
<string name="support_msg">Destek Mesajı</string> <string name="support_msg">Destek Mesajı</string>
<string name="short_support_msg">Kısa 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="long_support_msg">Uzun Mesaj</string>
<string name="transfer">Transfer</string> <string name="transfer">Transfer</string>
<string name="activate_device_admin_here">Cihaz Yöneticisini Burada Etkinleştir.</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_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: </string> <string name="encrypt_status_is">Şifreleme durumu: %1$s</string>
<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>
<string name="enable_frp">FRP\'yi etkinleştir</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--> <!--SystemUpdatePolicy-->
<string name="is_security_patch">Güvenlik yaması: %1$s</string> <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="install_system_update">Sistem güncellemesini yükle</string>
<string name="select_ota_package" tools:ignore="TypographyEllipsis">OTA paketini seç...</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="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="battery_low">Pil zayıf</string>
<string name="update_file_invalid">Güncelleme dosyası geçersiz</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> <string name="incorrect_os_ver">Yanlış işletim sistemi sürümü</string>
@@ -273,6 +272,10 @@
<string name="work_profile_owner">Profil sahibi (İş profili)</string> <string name="work_profile_owner">Profil sahibi (İş profili)</string>
<string name="work_profile_activated">İş profili etkinleştirildi</string> <string name="work_profile_activated">İş profili etkinleştirildi</string>
<string name="create_work_profile">İş profili oluştur</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="is_org_owned_profile">Kuruluşa ait iş profili: %1$s</string>
<string name="org_owned_work_profile">Kuruluş iş profili</string> <string name="org_owned_work_profile">Kuruluş iş profili</string>
<string name="skip_encryption">Şifrelemeyi atla</string> <string name="skip_encryption">Şifrelemeyi atla</string>
@@ -463,7 +466,6 @@
<string name="affiliation_id">Bağlılık ID</string> <string name="affiliation_id">Bağlılık ID</string>
<string name="include_empty_string">Boş string dahil et</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="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="file_picker_instead_gallery">Galeri yerine dosya seçici kullan</string>
<string name="select_picture" tools:ignore="TypographyEllipsis">Resim seç...</string> <string name="select_picture" tools:ignore="TypographyEllipsis">Resim seç...</string>
<string name="unknown_result">Bilinmeyen sonuç (başarısız olabilir)</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="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认证</string> <string name="support_device_id_attestation">支持设备ID认证%1$s</string>
<string name="support_unique_device_attestation">支持唯一设备认证:</string> <string name="support_unique_device_attestation">支持唯一设备认证:%1$s</string>
<string name="is_device_financed">Financed device: %1$s</string> <string name="is_device_financed">Financed device: %1$s</string>
<string name="dpmrh">设备策略管理器角色(DPMRH)%1$s</string> <string name="dpmrh">设备策略管理器角色(DPMRH)%1$s</string>
<string name="es_inactive">未使用</string> <string name="es_inactive">未使用</string>
@@ -76,7 +76,7 @@
<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>
<string name="account_types_are">账号类型</string> <string name="account_type">账号类型</string>
<string name="transfer_ownership">转移所有权</string> <string name="transfer_ownership">转移所有权</string>
<string name="transfer_ownership_desc">把Device owner或Profile owner权限转移到另一个应用</string> <string name="transfer_ownership_desc">把Device owner或Profile owner权限转移到另一个应用</string>
<string name="target_package_name">目标包名</string> <string name="target_package_name">目标包名</string>
@@ -84,7 +84,6 @@
<string name="device_owner_lock_screen_info">锁屏提示信息</string> <string name="device_owner_lock_screen_info">锁屏提示信息</string>
<string name="support_msg">提供支持的消息</string> <string name="support_msg">提供支持的消息</string>
<string name="short_support_msg">提供支持的短消息</string> <string name="short_support_msg">提供支持的短消息</string>
<string name="support_msg_desc">如果你禁用了某个功能,用户尝试使用这个功能时会看见这个消息(可多行)</string>
<string name="long_support_msg">提供支持的长消息</string> <string name="long_support_msg">提供支持的长消息</string>
<string name="transfer">转移</string> <string name="transfer">转移</string>
<string name="activate_device_admin_here">在这里激活Device admin</string> <string name="activate_device_admin_here">在这里激活Device admin</string>
@@ -181,7 +180,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">加密状态:</string> <string name="encrypt_status_is">加密状态:%1$s</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>
@@ -268,6 +267,10 @@
<string name="work_profile_owner">Profile owner工作资料</string> <string name="work_profile_owner">Profile owner工作资料</string>
<string name="work_profile_activated">工作资料已激活</string> <string name="work_profile_activated">工作资料已激活</string>
<string name="create_work_profile">创建工作资料</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="is_org_owned_profile">由组织拥有的工作资料:%1$s</string>
<string name="org_owned_work_profile">组织拥有的工作资料</string> <string name="org_owned_work_profile">组织拥有的工作资料</string>
<string name="skip_encryption">跳过加密</string> <string name="skip_encryption">跳过加密</string>
@@ -455,7 +458,6 @@
<string name="affiliation_id">附属用户ID</string> <string name="affiliation_id">附属用户ID</string>
<string name="include_empty_string">有空字符串</string> <string name="include_empty_string">有空字符串</string>
<string name="change_user_icon">更换用户头像</string> <string name="change_user_icon">更换用户头像</string>
<string name="pick_a_square_image">尽量选择正方形的图片,以免产生问题</string>
<string name="file_picker_instead_gallery">使用文件选择器而不是相册</string> <string name="file_picker_instead_gallery">使用文件选择器而不是相册</string>
<string name="select_picture" tools:ignore="TypographyEllipsis">选择图片...</string> <string name="select_picture" tools:ignore="TypographyEllipsis">选择图片...</string>
<string name="unknown_result">未知结果(失败)</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_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: </string> <string name="support_device_id_attestation">Support Device ID attestation: %1$s</string>
<string name="support_unique_device_attestation">Support unique device attestation: </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="is_device_financed">Financed device: %1$s</string>
<string name="dpmrh">Device policy management role holder: %1$s</string> <string name="dpmrh">Device policy management role holder: %1$s</string>
<!--es: encryption status--> <!--es: encryption status-->
@@ -82,7 +82,7 @@
<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>
<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">Transfer Ownership</string>
<string name="transfer_ownership_desc">Transfer device owner or profile owner privilege to another app.</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> <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="device_owner_lock_screen_info">Lockscreen info</string>
<string name="support_msg">Support Message</string> <string name="support_msg">Support Message</string>
<string name="short_support_msg">Short 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="long_support_msg">Long message</string>
<string name="transfer">Transfer</string> <string name="transfer">Transfer</string>
<string name="activate_device_admin_here">Activate Device admin here.</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_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: </string> <string name="encrypt_status_is">Encrypt status: %1$s</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>
<string name="enable_frp">Enable FRP</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--> <!--SystemUpdatePolicy-->
<string name="is_security_patch">Security patch: %1$s</string> <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="install_system_update">Install system update</string>
<string name="select_ota_package" tools:ignore="TypographyEllipsis">Select OTA package...</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="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="battery_low">Battery is low</string>
<string name="update_file_invalid">Update file is invalid</string> <string name="update_file_invalid">Update file is invalid</string>
<string name="incorrect_os_ver">Incorrect OS version</string> <string name="incorrect_os_ver">Incorrect OS version</string>
@@ -277,6 +276,10 @@
<string name="work_profile_owner">Profile owner (Work profile)</string> <string name="work_profile_owner">Profile owner (Work profile)</string>
<string name="work_profile_activated">Work profile activated</string> <string name="work_profile_activated">Work profile activated</string>
<string name="create_work_profile">Create work profile</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="is_org_owned_profile">Organization owned work profile: %1$s</string>
<string name="org_owned_work_profile">Organization work profile</string> <string name="org_owned_work_profile">Organization work profile</string>
<string name="activate_org_profile_command" tools:ignore="TypographyDashes" translatable="false"> <string name="activate_org_profile_command" tools:ignore="TypographyDashes" translatable="false">
@@ -468,7 +471,6 @@
<string name="affiliation_id">Affiliation ID</string> <string name="affiliation_id">Affiliation ID</string>
<string name="include_empty_string">Include empty string</string> <string name="include_empty_string">Include empty string</string>
<string name="change_user_icon">Change user icon</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="file_picker_instead_gallery">Use file picker instead of gallery</string>
<string name="select_picture" tools:ignore="TypographyEllipsis">Select image...</string> <string name="select_picture" tools:ignore="TypographyEllipsis">Select image...</string>
<string name="unknown_result">Unknown result(may failed)</string> <string name="unknown_result">Unknown result(may failed)</string>