diff --git a/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt b/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt index 455fa6f..7c853ab 100644 --- a/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt +++ b/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt @@ -12,14 +12,15 @@ import android.net.Uri import android.os.Build.VERSION import android.util.Log import android.widget.Toast -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding 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.MaterialTheme import androidx.compose.material3.Switch @@ -32,7 +33,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat.startActivity @@ -46,7 +46,8 @@ fun ApplicationManage(myDpm:DevicePolicyManager, myComponent:ComponentName,myCon Column( modifier = Modifier .fillMaxWidth() - .padding(8.dp), + .navigationBarsPadding() + .verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally ) { 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)}, {b -> myDpm.setUninstallBlocked(myComponent,pkgName,b)})*/ Row( - modifier = Modifier - .fillMaxWidth() - .padding(5.dp) - .clip(RoundedCornerShape(15)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(8.dp), + modifier = sections(), horizontalArrangement = Arrangement.SpaceAround ) { Button(onClick = {myDpm.setUninstallBlocked(myComponent,pkgName,false)}, enabled = isDeviceOwner(myDpm)|| isProfileOwner(myDpm)) { @@ -95,36 +91,38 @@ fun ApplicationManage(myDpm:DevicePolicyManager, myComponent:ComponentName,myCon Text("防卸载") } } - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 5.dp, vertical = 4.dp) - .clip(RoundedCornerShape(14.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp) - ) { + Column(modifier = sections()) { Text(text = "许可的输入法", style = MaterialTheme.typography.titleLarge) - val imeList = myDpm.getPermittedInputMethods(myComponent) - var imeListText = "" - if (imeList != null) { + var imeList = mutableListOf() + var imeListText by remember{ mutableStateOf("") } + val refreshList = { + if(isProfileOwner(myDpm) || isDeviceOwner(myDpm)){ + if(myDpm.getPermittedInputMethods(myComponent)!=null){ + imeList = myDpm.getPermittedInputMethods(myComponent)!! + } + } + imeListText = "" for(eachIme in imeList){ imeListText += "$eachIme \n" - //Log.e("",eachIme) + Log.e("",eachIme) } } + refreshList() Text(imeListText) Button( onClick = { - imeList?.plus(pkgName) + imeList.plus(pkgName) myDpm.setPermittedInputMethods(myComponent, imeList) + refreshList() } ) { Text("设为许可的输入法") } Button( onClick = { - imeList?.remove(pkgName) + imeList.remove(pkgName) myDpm.setPermittedInputMethods(myComponent,imeList) + refreshList() } ) { Text("从列表中移除") @@ -153,12 +151,7 @@ private fun AppManageItem( isEnabled = getMethod() } Row( - modifier = Modifier - .fillMaxWidth() - .padding(5.dp) - .clip(RoundedCornerShape(15)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(8.dp), + modifier = sections(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { diff --git a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt index ecd55c0..15d2d35 100644 --- a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt +++ b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt @@ -4,9 +4,7 @@ import android.app.admin.DevicePolicyManager import android.content.ComponentName import android.content.Context import android.os.Build.VERSION -import android.os.UserManager import android.widget.Toast -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column 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.padding import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults @@ -31,7 +28,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -42,7 +38,6 @@ fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName,myConte Column( modifier = Modifier .verticalScroll(rememberScrollState()) - .padding(bottom = 20.dp) .navigationBarsPadding() ) { if(isDeviceOwner(myDpm)){ @@ -76,12 +71,7 @@ fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName,myConte } if(VERSION.SDK_INT>=28){ Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 6.dp, vertical = 4.dp) - .clip(RoundedCornerShape(15)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(vertical = 5.dp), + modifier = sections(), horizontalArrangement = Arrangement.SpaceEvenly ) { Button( @@ -114,12 +104,7 @@ fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName,myConte Row( horizontalArrangement = Arrangement.SpaceAround, - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 4.dp, horizontal = 6.dp) - .clip(RoundedCornerShape(15)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(vertical = 4.dp), + modifier = sections(), ) { if(VERSION.SDK_INT>=24){ Button(onClick = {myDpm.reboot(myComponent)}, enabled = isDeviceOwner(myDpm)) { @@ -161,14 +146,7 @@ fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName,myConte if(isDeviceOwner(myDpm)){ SysUpdatePolicy(myDpm,myComponent,myContext) } - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 6.dp) - .clip(RoundedCornerShape(16.dp)) - .background(color = MaterialTheme.colorScheme.errorContainer) - .padding(8.dp) - ) { + Column(modifier = sections(MaterialTheme.colorScheme.errorContainer)) { var flag by remember{ mutableIntStateOf(0) } var confirmed by remember{ mutableStateOf(false) } 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) } Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 6.dp, vertical = 4.dp) - .clip(RoundedCornerShape(15)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(8.dp), + modifier = sections(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -263,7 +236,8 @@ private fun DeviceCtrlItem( onCheckedChange = { setMethod(!isEnabled) isEnabled=getMethod() - } + }, + modifier = Modifier.padding(end = 5.dp) ) } } diff --git a/app/src/main/java/com/binbin/androidowner/MainActivity.kt b/app/src/main/java/com/binbin/androidowner/MainActivity.kt index 005855e..0757fa7 100644 --- a/app/src/main/java/com/binbin/androidowner/MainActivity.kt +++ b/app/src/main/java/com/binbin/androidowner/MainActivity.kt @@ -33,6 +33,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp @@ -72,6 +73,7 @@ class MainActivity : ComponentActivity() { @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable fun MyScaffold(mainDpm:DevicePolicyManager, mainComponent:ComponentName, mainContext:Context){ + val focusMgr = LocalFocusManager.current val navCtrl = rememberNavController() val backStackEntry by navCtrl.currentBackStackEntryAsState() val topBarNameMap = mapOf( @@ -110,6 +112,7 @@ fun MyScaffold(mainDpm:DevicePolicyManager, mainComponent:ComponentName, mainCon navCtrl.graph.findStartDestination().id ) { saveState = true } } + focusMgr.clearFocus() }) .padding(5.dp) ) @@ -240,3 +243,14 @@ fun isDeviceOwner(dpm:DevicePolicyManager): Boolean { fun isProfileOwner(dpm:DevicePolicyManager): Boolean { 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) +} diff --git a/app/src/main/java/com/binbin/androidowner/Password.kt b/app/src/main/java/com/binbin/androidowner/Password.kt index 9d8d550..a3ad27d 100644 --- a/app/src/main/java/com/binbin/androidowner/Password.kt +++ b/app/src/main/java/com/binbin/androidowner/Password.kt @@ -7,7 +7,6 @@ import android.content.Context import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.os.Build.VERSION import android.widget.Toast -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column 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.padding import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll @@ -38,7 +36,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusManager import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalFocusManager @@ -64,21 +61,11 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte Text( text = "以下操作可能会造成不可挽回的损失,请先备份好数据。执行操作时一定要谨慎!!!", color = MaterialTheme.colorScheme.onErrorContainer, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp, vertical = 4.dp) - .clip(RoundedCornerShape(15)) - .background(color = MaterialTheme.colorScheme.errorContainer) - .padding(8.dp) + modifier = sections(MaterialTheme.colorScheme.errorContainer) ) if(myDpm.isDeviceOwnerApp("com.binbin.androidowner")){ Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp, vertical = 4.dp) - .clip(RoundedCornerShape(15)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(8.dp) + modifier = sections() ) { if(VERSION.SDK_INT>=29){ val pwdComplex = myDpm.passwordComplexity @@ -98,12 +85,7 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte if(VERSION.SDK_INT>=26){ Column( horizontalAlignment = Alignment.Start, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp, vertical = 4.dp) - .clip(RoundedCornerShape(10)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(8.dp) + modifier = sections() ) { Text(text = "密码重置令牌", style = MaterialTheme.typography.titleLarge) Row { @@ -144,12 +126,7 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte } } Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp, vertical = 4.dp) - .clip(RoundedCornerShape(16.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp) + modifier = sections() ) { TextField( value = newPwd, @@ -215,14 +192,7 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte {myDpm.getPasswordHistoryLength(null).toString()},{ic -> myDpm.setPasswordHistoryLength(myComponent, ic.toInt()) }) if(VERSION.SDK_INT>=31){ - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp, vertical = 4.dp) - .clip(RoundedCornerShape(16.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp) - ) { + Column(modifier = sections()) { val passwordComplexity = mapOf( DevicePolicyManager.PASSWORD_COMPLEXITY_NONE to "无复杂度(允许不设密码)", DevicePolicyManager.PASSWORD_COMPLEXITY_LOW to "低复杂度(允许图案和连续性)", @@ -254,12 +224,7 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte } Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp, vertical = 4.dp) - .clip(RoundedCornerShape(16.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp) + modifier = sections() ) { val passwordQuality = mapOf( 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, setMethod:(ic:String)->Unit ){ - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp, vertical = 4.dp) - .clip(RoundedCornerShape(10)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp) - ) { + Column(modifier = sections()) { var inputContent by remember{ mutableStateOf(if(isDeviceOwner(myDpm)){getMethod()}else{""}) } var inputContentEdited by remember{ mutableStateOf(false) } var ableToApply by remember{ mutableStateOf(true) } diff --git a/app/src/main/java/com/binbin/androidowner/Permissions.kt b/app/src/main/java/com/binbin/androidowner/Permissions.kt index d805fff..260113f 100644 --- a/app/src/main/java/com/binbin/androidowner/Permissions.kt +++ b/app/src/main/java/com/binbin/androidowner/Permissions.kt @@ -7,7 +7,6 @@ import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.os.Build.VERSION import android.widget.Toast -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column 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.padding import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.selection.SelectionContainer @@ -31,12 +29,10 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusManager import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction -import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat.startActivity 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 focusManager = LocalFocusManager.current Column( - modifier = Modifier - .padding(horizontal = 8.dp) - .verticalScroll(rememberScrollState()), + modifier = Modifier.verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally ) { Row( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 5.dp) - .clip(RoundedCornerShape(15)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp), + modifier = sections(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -90,12 +79,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon } if(!isda){ Column( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 5.dp) - .clip(RoundedCornerShape(15.dp)) - .background(color = MaterialTheme.colorScheme.tertiaryContainer) - .padding(10.dp), + modifier = sections(MaterialTheme.colorScheme.tertiaryContainer), horizontalAlignment = Alignment.Start ) { Text("你可以在adb shell中使用以下命令激活Device Admin") @@ -107,12 +91,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon } } Row( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 5.dp) - .clip(RoundedCornerShape(15)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp), + modifier = sections(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -137,12 +116,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon } if(!isProfileOwner(myDpm)){ Column( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 5.dp) - .clip(RoundedCornerShape(15.dp)) - .background(color = MaterialTheme.colorScheme.tertiaryContainer) - .padding(10.dp), + modifier = sections(MaterialTheme.colorScheme.tertiaryContainer), horizontalAlignment = Alignment.Start ) { if(!isDeviceOwner(myDpm)){ @@ -159,12 +133,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon } } Row( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 5.dp) - .clip(RoundedCornerShape(15)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp), + modifier = sections(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -191,22 +160,12 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon Text( text = "注意!在这里撤销权限不会清除配置。比如:被停用的应用会保持停用状态", color = MaterialTheme.colorScheme.onErrorContainer, - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 5.dp) - .clip(RoundedCornerShape(15)) - .background(color = MaterialTheme.colorScheme.errorContainer) - .padding(6.dp) + modifier = sections(MaterialTheme.colorScheme.errorContainer) ) } if(!isdo&&!isProfileOwner(myDpm)){ Column( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 5.dp) - .clip(RoundedCornerShape(15.dp)) - .background(color = MaterialTheme.colorScheme.tertiaryContainer) - .padding(10.dp), + modifier = sections(MaterialTheme.colorScheme.tertiaryContainer), horizontalAlignment = Alignment.Start ) { Text("你可以在adb shell中使用以下命令激活Device Owner") @@ -221,12 +180,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon } if(VERSION.SDK_INT>=30){ Column( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 5.dp) - .clip(RoundedCornerShape(15.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(8.dp) + modifier = sections() ) { Text(text = "设备信息", style = MaterialTheme.typography.titleLarge) val orgDevice = myDpm.isOrganizationOwnedDeviceWithManagedProfile @@ -245,33 +199,22 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon } } if(VERSION.SDK_INT>=31&&(isProfileOwner(myDpm)|| isDeviceOwner(myDpm))){ - Column( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 5.dp) - .clip(RoundedCornerShape(15.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(8.dp) - ) { - val specificId = myDpm.enrollmentSpecificId + Column(modifier = sections()) { + val specificId:String = myDpm.enrollmentSpecificId Text(text = "设备唯一标识码", style = MaterialTheme.typography.titleLarge) Text("(恢复出厂设置不变)") - Text("(如果下面没有一长串数字字母组合,说明你的设备不支持)") - Text(specificId) - Button(onClick = {myDpm.setOrganizationId(specificId)}, enabled = specificId!="") { - Text("设置为组织ID") + if(specificId!=""){ + Text(specificId) + Button(onClick = {myDpm.setOrganizationId(specificId)}, enabled = specificId!="") { + Text("设置为组织ID") + } + }else{ + Text("你的设备不支持") } } } if(isDeviceOwner(myDpm) || isProfileOwner(myDpm)){ - Column( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 5.dp) - .clip(RoundedCornerShape(15.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(8.dp) - ) { + Column(modifier = sections()) { Text(text = "不受控制的账号类型", style = MaterialTheme.typography.titleLarge) Text("作用未知") var noManageAccount = myDpm.accountTypesWithManagementDisabled?.toMutableList() @@ -283,7 +226,6 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon accountlist+="$eachAccount \n" } } - } refreshList() if(accountlist!=""){ @@ -339,14 +281,7 @@ fun DeviceOwnerInfo( input:()->CharSequence?, output:(content:String?)->Unit ){ - Column( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 5.dp) - .clip(RoundedCornerShape(12.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp) - ) { + Column(modifier = sections()) { Text(text = stringResource(name), style = MaterialTheme.typography.titleLarge) if(desc!=R.string.place_holder){Text(text = stringResource(desc),modifier = Modifier.padding(top = 6.dp))} var inputContent by remember{ mutableStateOf(input()) } diff --git a/app/src/main/java/com/binbin/androidowner/SystemUpdatePolicy.kt b/app/src/main/java/com/binbin/androidowner/SystemUpdatePolicy.kt index 2d3ed2c..280b61f 100644 --- a/app/src/main/java/com/binbin/androidowner/SystemUpdatePolicy.kt +++ b/app/src/main/java/com/binbin/androidowner/SystemUpdatePolicy.kt @@ -7,14 +7,12 @@ import android.content.ComponentName import android.content.Context import android.os.Build.VERSION import android.widget.Toast -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Button @@ -28,7 +26,6 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType @@ -40,16 +37,8 @@ import java.util.Date fun SysUpdatePolicy(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext: Context){ val focusMgr = LocalFocusManager.current Column { - Spacer(Modifier.padding(vertical = 5.dp)) if(VERSION.SDK_INT>=26){ - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 6.dp) - .clip(RoundedCornerShape(10.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(8.dp) - ) { + Column(modifier = sections()) { val sysUpdateInfo = if(isDeviceOwner(myDpm)){myDpm.getPendingSystemUpdate(myComponent)}else{null} if(sysUpdateInfo!=null){ 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 = Modifier - .fillMaxWidth() - .padding(horizontal = 6.dp) - .clip(RoundedCornerShape(16.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(8.dp) - ) { + Column(modifier = sections()) { var selectedPolicy by remember{ mutableStateOf(myDpm.systemUpdatePolicy?.policyType) } Text(text = "系统更新策略", style = MaterialTheme.typography.titleLarge) 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)) } } diff --git a/app/src/main/java/com/binbin/androidowner/User.kt b/app/src/main/java/com/binbin/androidowner/User.kt index 027b246..b795453 100644 --- a/app/src/main/java/com/binbin/androidowner/User.kt +++ b/app/src/main/java/com/binbin/androidowner/User.kt @@ -1,6 +1,5 @@ package com.binbin.androidowner -import android.app.Activity import android.app.admin.DevicePolicyManager import android.content.ComponentName import android.content.Context @@ -11,14 +10,11 @@ import android.os.Build.VERSION_CODES import android.os.UserHandle import android.os.UserManager import android.widget.Toast -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll @@ -33,11 +29,9 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.dp -import androidx.core.app.ActivityCompat.startActivityForResult import androidx.core.content.ContextCompat.startActivity 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 currentUser = android.os.Process.myUserHandle() val userList = Test.returnUsers(myContext) - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp, vertical = 4.dp) - .clip(RoundedCornerShape(16.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp) - ) { + Column(modifier = sections()) { Text(text = "用户信息", style = MaterialTheme.typography.titleLarge) Text("用户个数:${userList.size}") Spacer(Modifier.padding(vertical = 5.dp)) @@ -83,14 +70,7 @@ fun UserManage(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext: Co Text("切换用户后或设备重启后会删除临时用户") } - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp, vertical = 4.dp) - .clip(RoundedCornerShape(14.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp) - ) { + Column(modifier = sections()) { Text(text = "用户操作", style = MaterialTheme.typography.titleLarge) if(VERSION.SDK_INT>28){ var resultForLogout by remember{ mutableIntStateOf(-1) } @@ -135,14 +115,7 @@ fun UserManage(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext: Co } if(VERSION.SDK_INT>=24){ - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp, vertical = 4.dp) - .clip(RoundedCornerShape(14.dp)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp) - ) { + Column(modifier = sections()) { var userName by remember{ mutableStateOf("") } Text(text = "创建用户", style = MaterialTheme.typography.titleLarge) TextField( @@ -207,12 +180,7 @@ fun UserSessionMessage( setMsg:(msg:CharSequence?)->Unit ){ Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp, vertical = 4.dp) - .clip(RoundedCornerShape(10)) - .background(color = MaterialTheme.colorScheme.primaryContainer) - .padding(10.dp) + modifier = sections() ) { val focusMgr = LocalFocusManager.current var msg by remember{ mutableStateOf(if(isDeviceOwner(myDpm)||(isProfileOwner(myDpm)&&profileOwner)){ if(get()==null){""}else{get().toString()} }else{""}) } diff --git a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt index 5678867..4b36a5b 100644 --- a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt +++ b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt @@ -44,7 +44,6 @@ fun UserRestriction(myDpm: DevicePolicyManager, myComponent: ComponentName,myCon horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier .verticalScroll(verticalScrolling) - .padding(bottom = 20.dp) .navigationBarsPadding() ) { Text("打开开关后会禁用对应的功能") @@ -178,7 +177,7 @@ fun UserRestriction(myDpm: DevicePolicyManager, myComponent: ComponentName,myCon if(VERSION.SDK_INT<34){ 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() .padding(horizontal = 8.dp, vertical = 6.dp) .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) .padding(vertical = 8.dp) ) @@ -210,12 +215,7 @@ private fun UserRestrictionItem( ){ var strictState by remember{ mutableStateOf(false) } Row( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 4.dp, horizontal = 8.dp) - .clip(RoundedCornerShape(20)) - .background(color = MaterialTheme.colorScheme.secondaryContainer) - .padding(5.dp), + modifier = sections(MaterialTheme.colorScheme.secondaryContainer), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ){ @@ -260,7 +260,8 @@ private fun UserRestrictionItem( } strictState = myDpm.getUserRestrictions(myComponent).getBoolean(restriction) }, - enabled = isDeviceOwner(myDpm)|| isProfileOwner(myDpm) + enabled = isDeviceOwner(myDpm)|| isProfileOwner(myDpm), + modifier = Modifier.padding(end = 5.dp) ) } }