simplify code of modifiers

This commit is contained in:
BinTianqi
2024-01-23 14:19:41 +08:00
parent 587f3d5b1c
commit c11c93f70c
8 changed files with 89 additions and 266 deletions

View File

@@ -12,14 +12,15 @@ import android.net.Uri
import android.os.Build.VERSION import android.os.Build.VERSION
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Switch import androidx.compose.material3.Switch
@@ -32,7 +33,6 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat.startActivity import androidx.core.content.ContextCompat.startActivity
@@ -46,7 +46,8 @@ fun ApplicationManage(myDpm:DevicePolicyManager, myComponent:ComponentName,myCon
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(8.dp), .navigationBarsPadding()
.verticalScroll(rememberScrollState()),
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
) { ) {
TextField( TextField(
@@ -80,12 +81,7 @@ fun ApplicationManage(myDpm:DevicePolicyManager, myComponent:ComponentName,myCon
/*AppManageItem(R.string.block_unins,R.string.sometimes_not_available,myDpm, {myDpm.isUninstallBlocked(myComponent,pkgName)}, /*AppManageItem(R.string.block_unins,R.string.sometimes_not_available,myDpm, {myDpm.isUninstallBlocked(myComponent,pkgName)},
{b -> myDpm.setUninstallBlocked(myComponent,pkgName,b)})*/ {b -> myDpm.setUninstallBlocked(myComponent,pkgName,b)})*/
Row( Row(
modifier = Modifier modifier = sections(),
.fillMaxWidth()
.padding(5.dp)
.clip(RoundedCornerShape(15))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(8.dp),
horizontalArrangement = Arrangement.SpaceAround horizontalArrangement = Arrangement.SpaceAround
) { ) {
Button(onClick = {myDpm.setUninstallBlocked(myComponent,pkgName,false)}, enabled = isDeviceOwner(myDpm)|| isProfileOwner(myDpm)) { Button(onClick = {myDpm.setUninstallBlocked(myComponent,pkgName,false)}, enabled = isDeviceOwner(myDpm)|| isProfileOwner(myDpm)) {
@@ -95,36 +91,38 @@ fun ApplicationManage(myDpm:DevicePolicyManager, myComponent:ComponentName,myCon
Text("防卸载") Text("防卸载")
} }
} }
Column( Column(modifier = sections()) {
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 5.dp, vertical = 4.dp)
.clip(RoundedCornerShape(14.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp)
) {
Text(text = "许可的输入法", style = MaterialTheme.typography.titleLarge) Text(text = "许可的输入法", style = MaterialTheme.typography.titleLarge)
val imeList = myDpm.getPermittedInputMethods(myComponent) var imeList = mutableListOf<String>()
var imeListText = "" var imeListText by remember{ mutableStateOf("") }
if (imeList != null) { val refreshList = {
if(isProfileOwner(myDpm) || isDeviceOwner(myDpm)){
if(myDpm.getPermittedInputMethods(myComponent)!=null){
imeList = myDpm.getPermittedInputMethods(myComponent)!!
}
}
imeListText = ""
for(eachIme in imeList){ for(eachIme in imeList){
imeListText += "$eachIme \n" imeListText += "$eachIme \n"
//Log.e("",eachIme) Log.e("",eachIme)
} }
} }
refreshList()
Text(imeListText) Text(imeListText)
Button( Button(
onClick = { onClick = {
imeList?.plus(pkgName) imeList.plus(pkgName)
myDpm.setPermittedInputMethods(myComponent, imeList) myDpm.setPermittedInputMethods(myComponent, imeList)
refreshList()
} }
) { ) {
Text("设为许可的输入法") Text("设为许可的输入法")
} }
Button( Button(
onClick = { onClick = {
imeList?.remove(pkgName) imeList.remove(pkgName)
myDpm.setPermittedInputMethods(myComponent,imeList) myDpm.setPermittedInputMethods(myComponent,imeList)
refreshList()
} }
) { ) {
Text("从列表中移除") Text("从列表中移除")
@@ -153,12 +151,7 @@ private fun AppManageItem(
isEnabled = getMethod() isEnabled = getMethod()
} }
Row( Row(
modifier = Modifier modifier = sections(),
.fillMaxWidth()
.padding(5.dp)
.clip(RoundedCornerShape(15))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(8.dp),
horizontalArrangement = Arrangement.SpaceBetween, horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {

View File

@@ -4,9 +4,7 @@ import android.app.admin.DevicePolicyManager
import android.content.ComponentName import android.content.ComponentName
import android.content.Context import android.content.Context
import android.os.Build.VERSION import android.os.Build.VERSION
import android.os.UserManager
import android.widget.Toast import android.widget.Toast
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@@ -15,7 +13,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
@@ -31,7 +28,6 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
@@ -42,7 +38,6 @@ fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName,myConte
Column( Column(
modifier = Modifier modifier = Modifier
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
.padding(bottom = 20.dp)
.navigationBarsPadding() .navigationBarsPadding()
) { ) {
if(isDeviceOwner(myDpm)){ if(isDeviceOwner(myDpm)){
@@ -76,12 +71,7 @@ fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName,myConte
} }
if(VERSION.SDK_INT>=28){ if(VERSION.SDK_INT>=28){
Row( Row(
modifier = Modifier modifier = sections(),
.fillMaxWidth()
.padding(horizontal = 6.dp, vertical = 4.dp)
.clip(RoundedCornerShape(15))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(vertical = 5.dp),
horizontalArrangement = Arrangement.SpaceEvenly horizontalArrangement = Arrangement.SpaceEvenly
) { ) {
Button( Button(
@@ -114,12 +104,7 @@ fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName,myConte
Row( Row(
horizontalArrangement = Arrangement.SpaceAround, horizontalArrangement = Arrangement.SpaceAround,
modifier = Modifier modifier = sections(),
.fillMaxWidth()
.padding(vertical = 4.dp, horizontal = 6.dp)
.clip(RoundedCornerShape(15))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(vertical = 4.dp),
) { ) {
if(VERSION.SDK_INT>=24){ if(VERSION.SDK_INT>=24){
Button(onClick = {myDpm.reboot(myComponent)}, enabled = isDeviceOwner(myDpm)) { Button(onClick = {myDpm.reboot(myComponent)}, enabled = isDeviceOwner(myDpm)) {
@@ -161,14 +146,7 @@ fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName,myConte
if(isDeviceOwner(myDpm)){ if(isDeviceOwner(myDpm)){
SysUpdatePolicy(myDpm,myComponent,myContext) SysUpdatePolicy(myDpm,myComponent,myContext)
} }
Column( Column(modifier = sections(MaterialTheme.colorScheme.errorContainer)) {
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 6.dp)
.clip(RoundedCornerShape(16.dp))
.background(color = MaterialTheme.colorScheme.errorContainer)
.padding(8.dp)
) {
var flag by remember{ mutableIntStateOf(0) } var flag by remember{ mutableIntStateOf(0) }
var confirmed by remember{ mutableStateOf(false) } var confirmed by remember{ mutableStateOf(false) }
Text(text = "清除数据",style = MaterialTheme.typography.titleLarge,modifier = Modifier.padding(6.dp)) Text(text = "清除数据",style = MaterialTheme.typography.titleLarge,modifier = Modifier.padding(6.dp))
@@ -214,7 +192,7 @@ fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName,myConte
} }
} }
} }
Spacer(Modifier.padding(vertical = 20.dp)) Spacer(Modifier.padding(vertical = 30.dp))
} }
} }
@@ -229,12 +207,7 @@ private fun DeviceCtrlItem(
){ ){
var isEnabled by remember{ mutableStateOf(false) } var isEnabled by remember{ mutableStateOf(false) }
Row( Row(
modifier = Modifier modifier = sections(),
.fillMaxWidth()
.padding(horizontal = 6.dp, vertical = 4.dp)
.clip(RoundedCornerShape(15))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(8.dp),
horizontalArrangement = Arrangement.SpaceBetween, horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
@@ -263,7 +236,8 @@ private fun DeviceCtrlItem(
onCheckedChange = { onCheckedChange = {
setMethod(!isEnabled) setMethod(!isEnabled)
isEnabled=getMethod() isEnabled=getMethod()
} },
modifier = Modifier.padding(end = 5.dp)
) )
} }
} }

View File

@@ -33,6 +33,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@@ -72,6 +73,7 @@ class MainActivity : ComponentActivity() {
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable @Composable
fun MyScaffold(mainDpm:DevicePolicyManager, mainComponent:ComponentName, mainContext:Context){ fun MyScaffold(mainDpm:DevicePolicyManager, mainComponent:ComponentName, mainContext:Context){
val focusMgr = LocalFocusManager.current
val navCtrl = rememberNavController() val navCtrl = rememberNavController()
val backStackEntry by navCtrl.currentBackStackEntryAsState() val backStackEntry by navCtrl.currentBackStackEntryAsState()
val topBarNameMap = mapOf( val topBarNameMap = mapOf(
@@ -110,6 +112,7 @@ fun MyScaffold(mainDpm:DevicePolicyManager, mainComponent:ComponentName, mainCon
navCtrl.graph.findStartDestination().id navCtrl.graph.findStartDestination().id
) { saveState = true } ) { saveState = true }
} }
focusMgr.clearFocus()
}) })
.padding(5.dp) .padding(5.dp)
) )
@@ -240,3 +243,14 @@ fun isDeviceOwner(dpm:DevicePolicyManager): Boolean {
fun isProfileOwner(dpm:DevicePolicyManager): Boolean { fun isProfileOwner(dpm:DevicePolicyManager): Boolean {
return dpm.isProfileOwnerApp("com.binbin.androidowner") return dpm.isProfileOwnerApp("com.binbin.androidowner")
} }
@SuppressLint("ModifierFactoryExtensionFunction")
@Composable
fun sections(bgColor:Color=MaterialTheme.colorScheme.primaryContainer):Modifier{
return Modifier
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(RoundedCornerShape(14.dp))
.background(color = bgColor)
.padding(vertical = 6.dp, horizontal = 10.dp)
}

View File

@@ -7,7 +7,6 @@ import android.content.Context
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import android.os.Build.VERSION import android.os.Build.VERSION
import android.widget.Toast import android.widget.Toast
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@@ -16,7 +15,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
@@ -38,7 +36,6 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.focus.FocusManager import androidx.compose.ui.focus.FocusManager
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
@@ -64,21 +61,11 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte
Text( Text(
text = "以下操作可能会造成不可挽回的损失,请先备份好数据。执行操作时一定要谨慎!!!", text = "以下操作可能会造成不可挽回的损失,请先备份好数据。执行操作时一定要谨慎!!!",
color = MaterialTheme.colorScheme.onErrorContainer, color = MaterialTheme.colorScheme.onErrorContainer,
modifier = Modifier modifier = sections(MaterialTheme.colorScheme.errorContainer)
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(RoundedCornerShape(15))
.background(color = MaterialTheme.colorScheme.errorContainer)
.padding(8.dp)
) )
if(myDpm.isDeviceOwnerApp("com.binbin.androidowner")){ if(myDpm.isDeviceOwnerApp("com.binbin.androidowner")){
Column( Column(
modifier = Modifier modifier = sections()
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(RoundedCornerShape(15))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(8.dp)
) { ) {
if(VERSION.SDK_INT>=29){ if(VERSION.SDK_INT>=29){
val pwdComplex = myDpm.passwordComplexity val pwdComplex = myDpm.passwordComplexity
@@ -98,12 +85,7 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte
if(VERSION.SDK_INT>=26){ if(VERSION.SDK_INT>=26){
Column( Column(
horizontalAlignment = Alignment.Start, horizontalAlignment = Alignment.Start,
modifier = Modifier modifier = sections()
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(RoundedCornerShape(10))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(8.dp)
) { ) {
Text(text = "密码重置令牌", style = MaterialTheme.typography.titleLarge) Text(text = "密码重置令牌", style = MaterialTheme.typography.titleLarge)
Row { Row {
@@ -144,12 +126,7 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte
} }
} }
Column( Column(
modifier = Modifier modifier = sections()
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(RoundedCornerShape(16.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp)
) { ) {
TextField( TextField(
value = newPwd, value = newPwd,
@@ -215,14 +192,7 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte
{myDpm.getPasswordHistoryLength(null).toString()},{ic -> myDpm.setPasswordHistoryLength(myComponent, ic.toInt()) }) {myDpm.getPasswordHistoryLength(null).toString()},{ic -> myDpm.setPasswordHistoryLength(myComponent, ic.toInt()) })
if(VERSION.SDK_INT>=31){ if(VERSION.SDK_INT>=31){
Column( Column(modifier = sections()) {
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(RoundedCornerShape(16.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp)
) {
val passwordComplexity = mapOf( val passwordComplexity = mapOf(
DevicePolicyManager.PASSWORD_COMPLEXITY_NONE to "无复杂度(允许不设密码)", DevicePolicyManager.PASSWORD_COMPLEXITY_NONE to "无复杂度(允许不设密码)",
DevicePolicyManager.PASSWORD_COMPLEXITY_LOW to "低复杂度(允许图案和连续性)", DevicePolicyManager.PASSWORD_COMPLEXITY_LOW to "低复杂度(允许图案和连续性)",
@@ -254,12 +224,7 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte
} }
Column( Column(
modifier = Modifier modifier = sections()
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(RoundedCornerShape(16.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp)
) { ) {
val passwordQuality = mapOf( val passwordQuality = mapOf(
DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED to "未指定", DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED to "未指定",
@@ -300,7 +265,7 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte
} }
} }
Spacer(Modifier.padding(vertical = 20.dp)) Spacer(Modifier.padding(vertical = 30.dp))
} }
} }
@@ -315,14 +280,7 @@ fun PasswordItem(
getMethod:()->String, getMethod:()->String,
setMethod:(ic:String)->Unit setMethod:(ic:String)->Unit
){ ){
Column( Column(modifier = sections()) {
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(RoundedCornerShape(10))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp)
) {
var inputContent by remember{ mutableStateOf(if(isDeviceOwner(myDpm)){getMethod()}else{""}) } var inputContent by remember{ mutableStateOf(if(isDeviceOwner(myDpm)){getMethod()}else{""}) }
var inputContentEdited by remember{ mutableStateOf(false) } var inputContentEdited by remember{ mutableStateOf(false) }
var ableToApply by remember{ mutableStateOf(true) } var ableToApply by remember{ mutableStateOf(true) }

View File

@@ -7,7 +7,6 @@ import android.content.Intent
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import android.os.Build.VERSION import android.os.Build.VERSION
import android.widget.Toast import android.widget.Toast
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@@ -15,7 +14,6 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.text.selection.SelectionContainer
@@ -31,12 +29,10 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.focus.FocusManager import androidx.compose.ui.focus.FocusManager
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat.startActivity import androidx.core.content.ContextCompat.startActivity
import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavGraph.Companion.findStartDestination
@@ -50,18 +46,11 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
val isdo = myDpm.isDeviceOwnerApp("com.binbin.androidowner") val isdo = myDpm.isDeviceOwnerApp("com.binbin.androidowner")
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current
Column( Column(
modifier = Modifier modifier = Modifier.verticalScroll(rememberScrollState()),
.padding(horizontal = 8.dp)
.verticalScroll(rememberScrollState()),
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
) { ) {
Row( Row(
modifier = Modifier modifier = sections(),
.fillMaxWidth()
.padding(vertical = 5.dp)
.clip(RoundedCornerShape(15))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp),
horizontalArrangement = Arrangement.SpaceBetween, horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
@@ -90,12 +79,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
} }
if(!isda){ if(!isda){
Column( Column(
modifier = Modifier modifier = sections(MaterialTheme.colorScheme.tertiaryContainer),
.fillMaxWidth()
.padding(vertical = 5.dp)
.clip(RoundedCornerShape(15.dp))
.background(color = MaterialTheme.colorScheme.tertiaryContainer)
.padding(10.dp),
horizontalAlignment = Alignment.Start horizontalAlignment = Alignment.Start
) { ) {
Text("你可以在adb shell中使用以下命令激活Device Admin") Text("你可以在adb shell中使用以下命令激活Device Admin")
@@ -107,12 +91,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
} }
} }
Row( Row(
modifier = Modifier modifier = sections(),
.fillMaxWidth()
.padding(vertical = 5.dp)
.clip(RoundedCornerShape(15))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp),
horizontalArrangement = Arrangement.SpaceBetween, horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
@@ -137,12 +116,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
} }
if(!isProfileOwner(myDpm)){ if(!isProfileOwner(myDpm)){
Column( Column(
modifier = Modifier modifier = sections(MaterialTheme.colorScheme.tertiaryContainer),
.fillMaxWidth()
.padding(vertical = 5.dp)
.clip(RoundedCornerShape(15.dp))
.background(color = MaterialTheme.colorScheme.tertiaryContainer)
.padding(10.dp),
horizontalAlignment = Alignment.Start horizontalAlignment = Alignment.Start
) { ) {
if(!isDeviceOwner(myDpm)){ if(!isDeviceOwner(myDpm)){
@@ -159,12 +133,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
} }
} }
Row( Row(
modifier = Modifier modifier = sections(),
.fillMaxWidth()
.padding(vertical = 5.dp)
.clip(RoundedCornerShape(15))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp),
horizontalArrangement = Arrangement.SpaceBetween, horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
@@ -191,22 +160,12 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
Text( Text(
text = "注意!在这里撤销权限不会清除配置。比如:被停用的应用会保持停用状态", text = "注意!在这里撤销权限不会清除配置。比如:被停用的应用会保持停用状态",
color = MaterialTheme.colorScheme.onErrorContainer, color = MaterialTheme.colorScheme.onErrorContainer,
modifier = Modifier modifier = sections(MaterialTheme.colorScheme.errorContainer)
.fillMaxWidth()
.padding(vertical = 5.dp)
.clip(RoundedCornerShape(15))
.background(color = MaterialTheme.colorScheme.errorContainer)
.padding(6.dp)
) )
} }
if(!isdo&&!isProfileOwner(myDpm)){ if(!isdo&&!isProfileOwner(myDpm)){
Column( Column(
modifier = Modifier modifier = sections(MaterialTheme.colorScheme.tertiaryContainer),
.fillMaxWidth()
.padding(vertical = 5.dp)
.clip(RoundedCornerShape(15.dp))
.background(color = MaterialTheme.colorScheme.tertiaryContainer)
.padding(10.dp),
horizontalAlignment = Alignment.Start horizontalAlignment = Alignment.Start
) { ) {
Text("你可以在adb shell中使用以下命令激活Device Owner") Text("你可以在adb shell中使用以下命令激活Device Owner")
@@ -221,12 +180,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
} }
if(VERSION.SDK_INT>=30){ if(VERSION.SDK_INT>=30){
Column( Column(
modifier = Modifier modifier = sections()
.fillMaxWidth()
.padding(vertical = 5.dp)
.clip(RoundedCornerShape(15.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(8.dp)
) { ) {
Text(text = "设备信息", style = MaterialTheme.typography.titleLarge) Text(text = "设备信息", style = MaterialTheme.typography.titleLarge)
val orgDevice = myDpm.isOrganizationOwnedDeviceWithManagedProfile val orgDevice = myDpm.isOrganizationOwnedDeviceWithManagedProfile
@@ -245,33 +199,22 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
} }
} }
if(VERSION.SDK_INT>=31&&(isProfileOwner(myDpm)|| isDeviceOwner(myDpm))){ if(VERSION.SDK_INT>=31&&(isProfileOwner(myDpm)|| isDeviceOwner(myDpm))){
Column( Column(modifier = sections()) {
modifier = Modifier val specificId:String = myDpm.enrollmentSpecificId
.fillMaxWidth()
.padding(vertical = 5.dp)
.clip(RoundedCornerShape(15.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(8.dp)
) {
val specificId = myDpm.enrollmentSpecificId
Text(text = "设备唯一标识码", style = MaterialTheme.typography.titleLarge) Text(text = "设备唯一标识码", style = MaterialTheme.typography.titleLarge)
Text("(恢复出厂设置不变)") Text("(恢复出厂设置不变)")
Text("(如果下面没有一长串数字字母组合,说明你的设备不支持)") if(specificId!=""){
Text(specificId) Text(specificId)
Button(onClick = {myDpm.setOrganizationId(specificId)}, enabled = specificId!="") { Button(onClick = {myDpm.setOrganizationId(specificId)}, enabled = specificId!="") {
Text("设置为组织ID") Text("设置为组织ID")
} }
}else{
Text("你的设备不支持")
}
} }
} }
if(isDeviceOwner(myDpm) || isProfileOwner(myDpm)){ if(isDeviceOwner(myDpm) || isProfileOwner(myDpm)){
Column( Column(modifier = sections()) {
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 5.dp)
.clip(RoundedCornerShape(15.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(8.dp)
) {
Text(text = "不受控制的账号类型", style = MaterialTheme.typography.titleLarge) Text(text = "不受控制的账号类型", style = MaterialTheme.typography.titleLarge)
Text("作用未知") Text("作用未知")
var noManageAccount = myDpm.accountTypesWithManagementDisabled?.toMutableList() var noManageAccount = myDpm.accountTypesWithManagementDisabled?.toMutableList()
@@ -283,7 +226,6 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
accountlist+="$eachAccount \n" accountlist+="$eachAccount \n"
} }
} }
} }
refreshList() refreshList()
if(accountlist!=""){ if(accountlist!=""){
@@ -339,14 +281,7 @@ fun DeviceOwnerInfo(
input:()->CharSequence?, input:()->CharSequence?,
output:(content:String?)->Unit output:(content:String?)->Unit
){ ){
Column( Column(modifier = sections()) {
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 5.dp)
.clip(RoundedCornerShape(12.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp)
) {
Text(text = stringResource(name), style = MaterialTheme.typography.titleLarge) Text(text = stringResource(name), style = MaterialTheme.typography.titleLarge)
if(desc!=R.string.place_holder){Text(text = stringResource(desc),modifier = Modifier.padding(top = 6.dp))} if(desc!=R.string.place_holder){Text(text = stringResource(desc),modifier = Modifier.padding(top = 6.dp))}
var inputContent by remember{ mutableStateOf(input()) } var inputContent by remember{ mutableStateOf(input()) }

View File

@@ -7,14 +7,12 @@ import android.content.ComponentName
import android.content.Context import android.content.Context
import android.os.Build.VERSION import android.os.Build.VERSION
import android.widget.Toast import android.widget.Toast
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Button import androidx.compose.material3.Button
@@ -28,7 +26,6 @@ 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.draw.clip
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
@@ -40,16 +37,8 @@ import java.util.Date
fun SysUpdatePolicy(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext: Context){ fun SysUpdatePolicy(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext: Context){
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column { Column {
Spacer(Modifier.padding(vertical = 5.dp))
if(VERSION.SDK_INT>=26){ if(VERSION.SDK_INT>=26){
Column( Column(modifier = sections()) {
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 6.dp)
.clip(RoundedCornerShape(10.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(8.dp)
) {
val sysUpdateInfo = if(isDeviceOwner(myDpm)){myDpm.getPendingSystemUpdate(myComponent)}else{null} val sysUpdateInfo = if(isDeviceOwner(myDpm)){myDpm.getPendingSystemUpdate(myComponent)}else{null}
if(sysUpdateInfo!=null){ if(sysUpdateInfo!=null){
Text("Update first available: ${Date(sysUpdateInfo.receivedTime)}") Text("Update first available: ${Date(sysUpdateInfo.receivedTime)}")
@@ -65,15 +54,7 @@ fun SysUpdatePolicy(myDpm:DevicePolicyManager,myComponent:ComponentName,myContex
} }
} }
} }
Spacer(Modifier.padding(vertical = 5.dp)) Column(modifier = sections()) {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 6.dp)
.clip(RoundedCornerShape(16.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(8.dp)
) {
var selectedPolicy by remember{ mutableStateOf(myDpm.systemUpdatePolicy?.policyType) } var selectedPolicy by remember{ mutableStateOf(myDpm.systemUpdatePolicy?.policyType) }
Text(text = "系统更新策略", style = MaterialTheme.typography.titleLarge) Text(text = "系统更新策略", style = MaterialTheme.typography.titleLarge)
RadioButtonItem("准备好后立即更新",{selectedPolicy==SystemUpdatePolicy.TYPE_INSTALL_AUTOMATIC},{selectedPolicy=SystemUpdatePolicy.TYPE_INSTALL_AUTOMATIC}) RadioButtonItem("准备好后立即更新",{selectedPolicy==SystemUpdatePolicy.TYPE_INSTALL_AUTOMATIC},{selectedPolicy=SystemUpdatePolicy.TYPE_INSTALL_AUTOMATIC})
@@ -143,6 +124,5 @@ fun SysUpdatePolicy(myDpm:DevicePolicyManager,myComponent:ComponentName,myContex
} }
}*/ }*/
Spacer(Modifier.padding(vertical = 5.dp))
} }
} }

View File

@@ -1,6 +1,5 @@
package com.binbin.androidowner package com.binbin.androidowner
import android.app.Activity
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
import android.content.ComponentName import android.content.ComponentName
import android.content.Context import android.content.Context
@@ -11,14 +10,11 @@ import android.os.Build.VERSION_CODES
import android.os.UserHandle import android.os.UserHandle
import android.os.UserManager import android.os.UserManager
import android.widget.Toast import android.widget.Toast
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
@@ -33,11 +29,9 @@ 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.draw.clip
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.app.ActivityCompat.startActivityForResult
import androidx.core.content.ContextCompat.startActivity import androidx.core.content.ContextCompat.startActivity
import androidx.core.os.UserManagerCompat import androidx.core.os.UserManagerCompat
@@ -50,14 +44,7 @@ fun UserManage(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext: Co
//val myUM = myContext.getSystemService(Context.USER_SERVICE) //val myUM = myContext.getSystemService(Context.USER_SERVICE)
val currentUser = android.os.Process.myUserHandle() val currentUser = android.os.Process.myUserHandle()
val userList = Test.returnUsers(myContext) val userList = Test.returnUsers(myContext)
Column( Column(modifier = sections()) {
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(RoundedCornerShape(16.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp)
) {
Text(text = "用户信息", style = MaterialTheme.typography.titleLarge) Text(text = "用户信息", style = MaterialTheme.typography.titleLarge)
Text("用户个数:${userList.size}") Text("用户个数:${userList.size}")
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
@@ -83,14 +70,7 @@ fun UserManage(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext: Co
Text("切换用户后或设备重启后会删除临时用户") Text("切换用户后或设备重启后会删除临时用户")
} }
Column( Column(modifier = sections()) {
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(RoundedCornerShape(14.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp)
) {
Text(text = "用户操作", style = MaterialTheme.typography.titleLarge) Text(text = "用户操作", style = MaterialTheme.typography.titleLarge)
if(VERSION.SDK_INT>28){ if(VERSION.SDK_INT>28){
var resultForLogout by remember{ mutableIntStateOf(-1) } var resultForLogout by remember{ mutableIntStateOf(-1) }
@@ -135,14 +115,7 @@ fun UserManage(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext: Co
} }
if(VERSION.SDK_INT>=24){ if(VERSION.SDK_INT>=24){
Column( Column(modifier = sections()) {
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(RoundedCornerShape(14.dp))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp)
) {
var userName by remember{ mutableStateOf("") } var userName by remember{ mutableStateOf("") }
Text(text = "创建用户", style = MaterialTheme.typography.titleLarge) Text(text = "创建用户", style = MaterialTheme.typography.titleLarge)
TextField( TextField(
@@ -207,12 +180,7 @@ fun UserSessionMessage(
setMsg:(msg:CharSequence?)->Unit setMsg:(msg:CharSequence?)->Unit
){ ){
Column( Column(
modifier = Modifier modifier = sections()
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(RoundedCornerShape(10))
.background(color = MaterialTheme.colorScheme.primaryContainer)
.padding(10.dp)
) { ) {
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var msg by remember{ mutableStateOf(if(isDeviceOwner(myDpm)||(isProfileOwner(myDpm)&&profileOwner)){ if(get()==null){""}else{get().toString()} }else{""}) } var msg by remember{ mutableStateOf(if(isDeviceOwner(myDpm)||(isProfileOwner(myDpm)&&profileOwner)){ if(get()==null){""}else{get().toString()} }else{""}) }

View File

@@ -44,7 +44,6 @@ fun UserRestriction(myDpm: DevicePolicyManager, myComponent: ComponentName,myCon
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier modifier = Modifier
.verticalScroll(verticalScrolling) .verticalScroll(verticalScrolling)
.padding(bottom = 20.dp)
.navigationBarsPadding() .navigationBarsPadding()
) { ) {
Text("打开开关后会禁用对应的功能") Text("打开开关后会禁用对应的功能")
@@ -178,7 +177,7 @@ fun UserRestriction(myDpm: DevicePolicyManager, myComponent: ComponentName,myCon
if(VERSION.SDK_INT<34){ if(VERSION.SDK_INT<34){
Text("以下功能需要安卓14或以上2G信号、启用设备管理器、超宽频段无线电") Text("以下功能需要安卓14或以上2G信号、启用设备管理器、超宽频段无线电")
} }
Spacer(Modifier.padding(vertical = 20.dp)) Spacer(Modifier.padding(vertical = 30.dp))
} }
} }
@@ -193,7 +192,13 @@ fun SectionTab(txt:String,getSection:()->Boolean,setSection:()->Unit){
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 6.dp) .padding(horizontal = 8.dp, vertical = 6.dp)
.clip(RoundedCornerShape(15)) .clip(RoundedCornerShape(15))
.background(color = if(getSection()){MaterialTheme.colorScheme.tertiaryContainer}else{MaterialTheme.colorScheme.primaryContainer}) .background(
color = if (getSection()) {
MaterialTheme.colorScheme.tertiaryContainer
} else {
MaterialTheme.colorScheme.primaryContainer
}
)
.clickable(onClick = setSection) .clickable(onClick = setSection)
.padding(vertical = 8.dp) .padding(vertical = 8.dp)
) )
@@ -210,12 +215,7 @@ private fun UserRestrictionItem(
){ ){
var strictState by remember{ mutableStateOf(false) } var strictState by remember{ mutableStateOf(false) }
Row( Row(
modifier = Modifier modifier = sections(MaterialTheme.colorScheme.secondaryContainer),
.fillMaxWidth()
.padding(vertical = 4.dp, horizontal = 8.dp)
.clip(RoundedCornerShape(20))
.background(color = MaterialTheme.colorScheme.secondaryContainer)
.padding(5.dp),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween horizontalArrangement = Arrangement.SpaceBetween
){ ){
@@ -260,7 +260,8 @@ private fun UserRestrictionItem(
} }
strictState = myDpm.getUserRestrictions(myComponent).getBoolean(restriction) strictState = myDpm.getUserRestrictions(myComponent).getBoolean(restriction)
}, },
enabled = isDeviceOwner(myDpm)|| isProfileOwner(myDpm) enabled = isDeviceOwner(myDpm)|| isProfileOwner(myDpm),
modifier = Modifier.padding(end = 5.dp)
) )
} }
} }