mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-23 19:15:58 +00:00
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:
@@ -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->
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
},
|
||||
|
||||
@@ -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 != ""
|
||||
) {
|
||||
|
||||
@@ -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() })
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user