From 5e433fff0cb5886076551b65da31f659ad63843e Mon Sep 17 00:00:00 2001 From: BinTianqi <1220958406@qq.com> Date: Sat, 3 Feb 2024 11:47:47 +0800 Subject: [PATCH] set MTE policy --- app/build.gradle.kts | 4 +- .../binbin/androidowner/ApplicationManage.kt | 5 +- .../com/binbin/androidowner/DeviceControl.kt | 100 +++++++++++------- .../com/binbin/androidowner/MainActivity.kt | 2 +- .../java/com/binbin/androidowner/Password.kt | 54 ++++------ .../binbin/androidowner/SystemUpdatePolicy.kt | 2 +- .../main/java/com/binbin/androidowner/User.kt | 4 +- .../com/binbin/androidowner/UserRestrict.kt | 51 ++++----- 8 files changed, 113 insertions(+), 109 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 903b607..f8a1c7c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,8 +11,8 @@ android { applicationId = "com.binbin.androidowner" minSdk = 21 targetSdk = 34 - versionCode = 9 - versionName = "2.2" + versionCode = 10 + versionName = "2.3" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt b/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt index 2992cd8..7b4affd 100644 --- a/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt +++ b/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat.startActivity @@ -178,7 +179,7 @@ fun ApplicationManage(){ } }, enabled = isDeviceOwner(myDpm)||isProfileOwner(myDpm), - modifier = Modifier.fillMaxWidth().padding(horizontal = 8.dp) + modifier = Modifier.fillMaxWidth().padding(horizontal = 10.dp) ) { Text("设为默认拨号应用") } @@ -222,7 +223,7 @@ private fun AppManageItem( modifier = sections() ) { Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically) { - Text(text = stringResource(itemName)) + Text(text = stringResource(itemName), fontWeight = FontWeight.SemiBold, style = typography.titleMedium) Switch( checked = isEnabled, onCheckedChange = { diff --git a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt index 4860b95..60fa0f5 100644 --- a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt +++ b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt @@ -1,39 +1,28 @@ package com.binbin.androidowner import android.app.admin.DevicePolicyManager +import android.app.admin.DevicePolicyManager.MTE_DISABLED +import android.app.admin.DevicePolicyManager.MTE_ENABLED +import android.app.admin.DevicePolicyManager.MTE_NOT_CONTROLLED_BY_POLICY import android.content.ComponentName import android.content.Context import android.os.Build.VERSION import android.widget.Toast import androidx.activity.ComponentActivity import androidx.compose.foundation.isSystemInDarkTheme -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.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.* +import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.typography -import androidx.compose.material3.Switch -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -90,7 +79,7 @@ fun DeviceControl(){ } if(VERSION.SDK_INT>=28){ Column(modifier = sections()) { - Text(text = "锁屏方式", style = typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) + Text(text = "锁屏方式", style = typography.titleLarge,color = colorScheme.onPrimaryContainer) Text(text = "禁用需要无密码",style=bodyTextStyle) Row( modifier = Modifier.fillMaxWidth(), @@ -136,25 +125,57 @@ fun DeviceControl(){ ) { Text(text = "清除用户Ca证书") }} + + if(VERSION.SDK_INT>=34&&isDeviceOwner(myDpm)){ + Column(modifier = sections()){ + Text(text = "MTE策略", style = typography.titleLarge, color = colorScheme.onPrimaryContainer) + Text("MTE:内存标记拓展,安卓14和ARMv9的高端功能") + var selectedMtePolicy by remember{mutableIntStateOf(myDpm.mtePolicy)} + RadioButtonItem("由用户决定", {selectedMtePolicy==MTE_NOT_CONTROLLED_BY_POLICY}, {selectedMtePolicy= MTE_NOT_CONTROLLED_BY_POLICY}) + RadioButtonItem("开启", {selectedMtePolicy==MTE_ENABLED}, {selectedMtePolicy=MTE_ENABLED}) + RadioButtonItem("关闭", {selectedMtePolicy==MTE_DISABLED}, {selectedMtePolicy=MTE_DISABLED}) + Button( + onClick = { + try { + myDpm.mtePolicy = selectedMtePolicy + Toast.makeText(myContext, "成功", Toast.LENGTH_SHORT).show() + }catch(e:java.lang.UnsupportedOperationException){ + Toast.makeText(myContext, "不支持", Toast.LENGTH_SHORT).show() + } + selectedMtePolicy = myDpm.mtePolicy + }, + modifier = Modifier.fillMaxWidth() + ) { + Text("应用") + } + } + } + if(isDeviceOwner(myDpm)){ SysUpdatePolicy(myDpm,myComponent,myContext) } - Column(modifier = sections(if(isSystemInDarkTheme()){MaterialTheme.colorScheme.errorContainer}else{MaterialTheme.colorScheme.errorContainer.copy(alpha = 0.6F)})) { + Column(modifier = sections(if(isSystemInDarkTheme()){ + colorScheme.errorContainer}else{ + colorScheme.errorContainer.copy(alpha = 0.6F)})) { var flag by remember{ mutableIntStateOf(0) } var confirmed by remember{ mutableStateOf(false) } - Text(text = "清除数据",style = typography.titleLarge,modifier = Modifier.padding(6.dp),color = MaterialTheme.colorScheme.onErrorContainer) - RadioButtonItem("默认",{flag==0},{flag=0},MaterialTheme.colorScheme.onErrorContainer) - RadioButtonItem("WIPE_EXTERNAL_STORAGE",{flag==0x0001},{flag=0x0001},MaterialTheme.colorScheme.onErrorContainer) - RadioButtonItem("WIPE_RESET_PROTECTION_DATA",{flag==0x0002},{flag=0x0002},MaterialTheme.colorScheme.onErrorContainer) - RadioButtonItem("WIPE_EUICC",{flag==0x0004},{flag=0x0004},MaterialTheme.colorScheme.onErrorContainer) - RadioButtonItem("WIPE_SILENTLY",{flag==0x0008},{flag=0x0008},MaterialTheme.colorScheme.onErrorContainer) - Text(text = "清空数据的不能是系统用户",color = MaterialTheme.colorScheme.onErrorContainer, + Text(text = "清除数据",style = typography.titleLarge,modifier = Modifier.padding(6.dp),color = colorScheme.onErrorContainer) + RadioButtonItem("默认",{flag==0},{flag=0}, colorScheme.onErrorContainer) + RadioButtonItem("WIPE_EXTERNAL_STORAGE",{flag==0x0001},{flag=0x0001}, colorScheme.onErrorContainer) + RadioButtonItem("WIPE_RESET_PROTECTION_DATA",{flag==0x0002},{flag=0x0002}, colorScheme.onErrorContainer) + RadioButtonItem("WIPE_EUICC",{flag==0x0004},{flag=0x0004}, colorScheme.onErrorContainer) + RadioButtonItem("WIPE_SILENTLY",{flag==0x0008},{flag=0x0008}, colorScheme.onErrorContainer) + Text(text = "清空数据的不能是系统用户",color = colorScheme.onErrorContainer, style = if(!sharedPref.getBoolean("isWear",false)){typography.bodyLarge}else{typography.bodyMedium}) Button( onClick = {confirmed=!confirmed}, colors = ButtonDefaults.buttonColors( - containerColor = if(confirmed){MaterialTheme.colorScheme.primary}else{MaterialTheme.colorScheme.error}, - contentColor = if(confirmed){MaterialTheme.colorScheme.onPrimary}else{MaterialTheme.colorScheme.onError} + containerColor = if(confirmed){ + colorScheme.primary}else{ + colorScheme.error}, + contentColor = if(confirmed){ + colorScheme.onPrimary}else{ + colorScheme.onError} ), enabled = myDpm.isAdminActive(myComponent) ) { @@ -164,8 +185,8 @@ fun DeviceControl(){ Button( onClick = {myDpm.wipeData(flag)}, colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.error, - contentColor = MaterialTheme.colorScheme.onError + containerColor = colorScheme.error, + contentColor = colorScheme.onError ), enabled = confirmed ) { @@ -175,8 +196,8 @@ fun DeviceControl(){ Button( onClick = {myDpm.wipeDevice(flag)}, colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.error, - contentColor = MaterialTheme.colorScheme.onError + containerColor = colorScheme.error, + contentColor = colorScheme.onError ), enabled = confirmed ) { @@ -209,20 +230,21 @@ private fun DeviceCtrlItem( verticalAlignment = Alignment.CenterVertically, modifier = if(isWear){Modifier.fillMaxWidth(0.65F)}else{Modifier.fillMaxWidth(0.75F)} ){ - if(!sharedPref.getBoolean("isWear",false)){ + if(!isWear){ Icon( painter = painterResource(leadIcon), contentDescription = null, - tint = MaterialTheme.colorScheme.onPrimaryContainer, + tint = colorScheme.onPrimaryContainer, modifier = Modifier.padding(start = 5.dp, end = 9.dp) )} Column { Text( text = stringResource(itemName), - style = if(!sharedPref.getBoolean("isWear",false)){typography.titleLarge}else{typography.bodyLarge}, - color = MaterialTheme.colorScheme.onPrimaryContainer + style = if(!isWear){typography.titleLarge}else{typography.titleMedium}, + color = colorScheme.onPrimaryContainer, + fontWeight = if(isWear){ FontWeight.SemiBold }else{ FontWeight.Medium } ) - if(itemDesc!=R.string.place_holder&&!sharedPref.getBoolean("isWear",false)){ Text(stringResource(itemDesc)) } + if(itemDesc!=R.string.place_holder){ Text(stringResource(itemDesc)) } } } isEnabled = getMethod() diff --git a/app/src/main/java/com/binbin/androidowner/MainActivity.kt b/app/src/main/java/com/binbin/androidowner/MainActivity.kt index e6e4c77..1368ef8 100644 --- a/app/src/main/java/com/binbin/androidowner/MainActivity.kt +++ b/app/src/main/java/com/binbin/androidowner/MainActivity.kt @@ -266,7 +266,7 @@ fun CheckBoxItem( ) { Checkbox( checked = checked(), - onCheckedChange = {b:Boolean->operation()}, + onCheckedChange = {operation()}, modifier=if(sharedPref.getBoolean("isWear",false)){Modifier.size(28.dp)}else{Modifier} ) Text(text = text, style = if(!sharedPref.getBoolean("isWear",false)){typography.bodyLarge}else{typography.bodyMedium}, color = textColor, diff --git a/app/src/main/java/com/binbin/androidowner/Password.kt b/app/src/main/java/com/binbin/androidowner/Password.kt index fd47ea1..f6fb387 100644 --- a/app/src/main/java/com/binbin/androidowner/Password.kt +++ b/app/src/main/java/com/binbin/androidowner/Password.kt @@ -11,28 +11,16 @@ import android.widget.Toast import androidx.activity.ComponentActivity import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.horizontalScroll -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.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Check -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.IconButtonDefaults -import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.* +import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.typography -import androidx.compose.material3.Text -import androidx.compose.material3.TextField import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -55,7 +43,7 @@ fun Password(){ var newPwd by remember{ mutableStateOf("") } val focusMgr = LocalFocusManager.current val isWear = sharedPref.getBoolean("isWear",false) - val titleColor = MaterialTheme.colorScheme.onPrimaryContainer + val titleColor = colorScheme.onPrimaryContainer val bodyTextStyle = if(isWear){typography.bodyMedium}else{typography.bodyLarge} Column( horizontalAlignment = Alignment.CenterHorizontally, @@ -64,22 +52,20 @@ fun Password(){ val myByteArray by remember{ mutableStateOf(byteArrayOf(1,1,4,5,1,4,1,9,1,9,8,1,0,1,1,4,5,1,4,1,9,1,9,8,1,0,1,1,4,5,1,4,1,9,1,9,8,1,0)) } Text( text = "以下操作可能会造成不可挽回的损失,请先备份好数据。执行操作时一定要谨慎!!!", - color = MaterialTheme.colorScheme.onErrorContainer, - modifier = sections(MaterialTheme.colorScheme.errorContainer), + color = colorScheme.onErrorContainer, + modifier = sections(colorScheme.errorContainer), style=bodyTextStyle ) if(isWear){ Text( text = "警告!手表不支持带字母的密码,也不支持超过4位的PIN码!如果你设置了这样的密码(或密码复杂度要求),你将无法解锁你的手表!", - color = MaterialTheme.colorScheme.onErrorContainer, - modifier = sections(MaterialTheme.colorScheme.errorContainer), + color = colorScheme.onErrorContainer, + modifier = sections(colorScheme.errorContainer), style = typography.bodyMedium ) } if(myDpm.isDeviceOwnerApp("com.binbin.androidowner")){ - Column( - modifier = sections() - ) { + Column(modifier = sections()) { if(VERSION.SDK_INT>=29){ val passwordComplexity = mapOf( PASSWORD_COMPLEXITY_NONE to "无(允许不设密码)", @@ -186,7 +172,7 @@ fun Password(){ }else{ Toast.makeText(myContext, "设置失败", Toast.LENGTH_SHORT).show() } confirmed=false }, - colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.error, contentColor = MaterialTheme.colorScheme.onError), + colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError), enabled = confirmed&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm)), modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.42F)} ) { @@ -201,7 +187,7 @@ fun Password(){ confirmed=false }, enabled = confirmed, - colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.error, contentColor = MaterialTheme.colorScheme.onError), + colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError), modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.9F)} ) { Text("应用(旧)") @@ -234,7 +220,9 @@ fun Password(){ RadioButtonItem(passwordComplexity[1].second,{selectedItem==passwordComplexity[1].first},{selectedItem=passwordComplexity[1].first}) RadioButtonItem(passwordComplexity[2].second,{selectedItem==passwordComplexity[2].first},{selectedItem=passwordComplexity[2].first}) RadioButtonItem(passwordComplexity[3].second,{selectedItem==passwordComplexity[3].first},{selectedItem=passwordComplexity[3].first}, - if(isWear){MaterialTheme.colorScheme.error}else{MaterialTheme.colorScheme.onBackground}) + if(isWear){ + colorScheme.error}else{ + colorScheme.onBackground}) Text(text = "连续性:密码重复(6666)或密码递增递减(4321、2468)", modifier = Modifier.padding(vertical = 3.dp), style = bodyTextStyle) Row(modifier = Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.SpaceBetween){ Button( @@ -355,9 +343,7 @@ fun Password(){ } } - Column( - modifier = sections() - ) { + Column(modifier = sections()) { var expanded by remember{ mutableStateOf(VERSION.SDK_INT < 31) } val passwordQuality = mapOf( PASSWORD_QUALITY_UNSPECIFIED to "未指定", @@ -379,7 +365,7 @@ fun Password(){ Text(text = "设置密码复杂度将会取代密码质量", style = bodyTextStyle) } if(VERSION.SDK_INT>=31){ - Text(text = "已弃用,请使用上面的”密码复杂度要求“", color = MaterialTheme.colorScheme.error, style = bodyTextStyle) + Text(text = "已弃用,请使用上面的”密码复杂度要求“", color = colorScheme.error, style = bodyTextStyle) } if(expanded){ RadioButtonItem(passwordQuality[0].second,{selectedItem==passwordQuality[0].first},{selectedItem=passwordQuality[0].first}) @@ -416,7 +402,7 @@ fun Password(){ } @Composable -fun PasswordItem( +private fun PasswordItem( itemName:Int, itemDesc:Int, textFieldLabel:Int, @@ -431,7 +417,7 @@ fun PasswordItem( var inputContentEdited by remember{ mutableStateOf(false) } var ableToApply by remember{ mutableStateOf(true) } val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) - Text(text = stringResource(itemName), style = typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) + Text(text = stringResource(itemName), style = typography.titleLarge,color = colorScheme.onPrimaryContainer) Text(text= stringResource(itemDesc),modifier=Modifier.padding(vertical = 2.dp), style = if(!sharedPref.getBoolean("isWear",false)){typography.bodyLarge}else{typography.bodyMedium}) if(!sharedPref.getBoolean("isWear",false)){Spacer(Modifier.padding(vertical = 2.dp))} @@ -462,8 +448,8 @@ fun PasswordItem( onClick = { focusMgr.clearFocus() ; setMethod(inputContent) ; inputContentEdited=inputContent!=getMethod() }, enabled = isDeviceOwner(myDpm)&&ableToApply, colors = IconButtonDefaults.iconButtonColors( - contentColor = if(inputContentEdited){MaterialTheme.colorScheme.onError}else{MaterialTheme.colorScheme.onPrimary}, - containerColor = if(inputContentEdited){MaterialTheme.colorScheme.error}else{MaterialTheme.colorScheme.primary}, + contentColor = if(inputContentEdited){ colorScheme.onError}else{ colorScheme.onPrimary}, + containerColor = if(inputContentEdited){ colorScheme.error}else{ colorScheme.primary}, disabledContentColor = Color.Transparent, disabledContainerColor = Color.Transparent ) diff --git a/app/src/main/java/com/binbin/androidowner/SystemUpdatePolicy.kt b/app/src/main/java/com/binbin/androidowner/SystemUpdatePolicy.kt index 59b148e..8cabe75 100644 --- a/app/src/main/java/com/binbin/androidowner/SystemUpdatePolicy.kt +++ b/app/src/main/java/com/binbin/androidowner/SystemUpdatePolicy.kt @@ -56,7 +56,7 @@ fun SysUpdatePolicy(myDpm:DevicePolicyManager,myComponent:ComponentName,myContex if(VERSION.SDK_INT>=23){ Column(modifier = sections()) { var selectedPolicy by remember{ mutableStateOf(myDpm.systemUpdatePolicy?.policyType) } - Text(text = "系统更新策略", style = MaterialTheme.typography.titleLarge) + Text(text = "系统更新策略", style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onPrimaryContainer) RadioButtonItem("准备好后立即更新",{selectedPolicy==SystemUpdatePolicy.TYPE_INSTALL_AUTOMATIC},{selectedPolicy=SystemUpdatePolicy.TYPE_INSTALL_AUTOMATIC}) RadioButtonItem("在某段时间里更新",{selectedPolicy==SystemUpdatePolicy.TYPE_INSTALL_WINDOWED},{selectedPolicy=SystemUpdatePolicy.TYPE_INSTALL_WINDOWED}) RadioButtonItem("延迟30天",{selectedPolicy==SystemUpdatePolicy.TYPE_POSTPONE},{selectedPolicy=SystemUpdatePolicy.TYPE_POSTPONE}) diff --git a/app/src/main/java/com/binbin/androidowner/User.kt b/app/src/main/java/com/binbin/androidowner/User.kt index 5379b0a..4c1283a 100644 --- a/app/src/main/java/com/binbin/androidowner/User.kt +++ b/app/src/main/java/com/binbin/androidowner/User.kt @@ -307,7 +307,7 @@ fun UserManage(navCtrl:NavHostController){ } @Composable -fun UserSessionMessage( +private fun UserSessionMessage( text:String, textField:String, profileOwner:Boolean, @@ -362,7 +362,7 @@ fun UserSessionMessage( } } -fun userOperationResultCode(result:Int): String { +private fun userOperationResultCode(result:Int): String { return when(result){ UserManager.USER_OPERATION_SUCCESS->"成功" UserManager.USER_OPERATION_ERROR_UNKNOWN->"未知结果(失败)" diff --git a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt index 93aae9e..19ae2f6 100644 --- a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt +++ b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt @@ -11,31 +11,23 @@ import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.compose.foundation.background import androidx.compose.foundation.clickable -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.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.Switch import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -64,7 +56,7 @@ fun UserRestriction(){ items(1){ Text(text = "打开开关后会禁用对应的功能",modifier = Modifier.padding(3.dp), style = bodyTextStyle) if(VERSION.SDK_INT<24){ - Text(text = "所有的用户限制都需要API24,你的设备低于API24,无法使用。", style = bodyTextStyle, color = MaterialTheme.colorScheme.error) + Text(text = "所有的用户限制都需要API24,你的设备低于API24,无法使用。", style = bodyTextStyle, color = colorScheme.error) } if(isProfileOwner(myDpm)){ Text(text = "Profile owner无法使用部分功能", style = bodyTextStyle) @@ -75,42 +67,42 @@ fun UserRestriction(){ } items(1){ SectionTab("网络和互联网",{internetVisible}, { internetVisible=!internetVisible}) } - items(restrictionData().internet()){data-> + items(RestrictionData().internet()){data-> if(internetVisible){ UserRestrictionItem(data.restriction,data.name,data.desc,data.ico) } } items(1){ SectionTab("更多连接",{connectivityVisible}) { connectivityVisible=!connectivityVisible } } - items(restrictionData().connectivity()){data-> + items(RestrictionData().connectivity()){data-> if(connectivityVisible){ UserRestrictionItem(data.restriction,data.name,data.desc,data.ico) } } items(1){ SectionTab("应用",{applicationVisible}) { applicationVisible=!applicationVisible } } - items(restrictionData().application()){data-> + items(RestrictionData().application()){data-> if(applicationVisible){ UserRestrictionItem(data.restriction,data.name,data.desc,data.ico) } } items(1){ SectionTab("用户",{userVisible}) { userVisible=!userVisible } } - items(restrictionData().user()){data-> + items(RestrictionData().user()){data-> if(userVisible){ UserRestrictionItem(data.restriction,data.name,data.desc,data.ico) } } items(1){ SectionTab("媒体",{mediaVisible}) { mediaVisible=!mediaVisible } } - items(restrictionData().media()){data-> + items(RestrictionData().media()){data-> if(mediaVisible){ UserRestrictionItem(data.restriction,data.name,data.desc,data.ico) } } items(1){ SectionTab("其他",{otherVisible}) { otherVisible=!otherVisible } } - items(restrictionData().other()){data-> + items(RestrictionData().other()){data-> if(otherVisible){ UserRestrictionItem(data.restriction,data.name,data.desc,data.ico) } @@ -137,7 +129,9 @@ fun SectionTab(txt:String,getSection:()->Boolean,setSection:()->Unit){ val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) Text( text = txt, - color = if(getSection()){MaterialTheme.colorScheme.onTertiaryContainer}else{MaterialTheme.colorScheme.onPrimaryContainer}, + color = if(getSection()){ + colorScheme.onTertiaryContainer}else{ + colorScheme.onPrimaryContainer}, textAlign = TextAlign.Center, style = if(!sharedPref.getBoolean("isWear",false)){typography.headlineMedium}else{typography.titleLarge}, modifier = Modifier @@ -147,9 +141,9 @@ fun SectionTab(txt:String,getSection:()->Boolean,setSection:()->Unit){ .clip(RoundedCornerShape(15.dp)) .background( color = if (getSection()) { - MaterialTheme.colorScheme.tertiaryContainer.copy(alpha = 0.8F) + colorScheme.tertiaryContainer.copy(alpha = 0.8F) } else { - MaterialTheme.colorScheme.primaryContainer.copy(alpha = 0.8F) + colorScheme.primaryContainer.copy(alpha = 0.8F) } ) .clickable(onClick = setSection) @@ -170,7 +164,7 @@ private fun UserRestrictionItem( val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) val isWear = sharedPref.getBoolean("isWear",false) Row( - modifier = sections(MaterialTheme.colorScheme.secondaryContainer), + modifier = sections(colorScheme.secondaryContainer), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ){ @@ -178,21 +172,22 @@ private fun UserRestrictionItem( verticalAlignment = Alignment.CenterVertically, modifier = if(isWear){Modifier.fillMaxWidth(0.65F)}else{Modifier.fillMaxWidth(0.8F)} ) { - if(!sharedPref.getBoolean("isWear",false)){ + if(!isWear){ Icon( painter = painterResource(leadIcon), contentDescription = null, modifier = Modifier.padding(start = 4.dp, end = 8.dp), - tint = MaterialTheme.colorScheme.secondary + tint = colorScheme.secondary )} Column{ Text( text = stringResource(itemName), style = if(!isWear){typography.titleLarge}else{typography.titleMedium}, - color = MaterialTheme.colorScheme.onSecondaryContainer + color = colorScheme.onSecondaryContainer, + fontWeight = if(isWear){ FontWeight.SemiBold }else{ FontWeight.Medium } ) if(restrictionDescription!=""){ - Text(text = restrictionDescription, color = MaterialTheme.colorScheme.onSecondaryContainer, style = if(isWear){typography.bodyMedium}else{typography.bodyLarge}) + Text(text = restrictionDescription, color = colorScheme.onSecondaryContainer, style = if(isWear){typography.bodyMedium}else{typography.bodyLarge}) } } } @@ -224,7 +219,7 @@ private fun UserRestrictionItem( } } -private class restrictionData{ +private class RestrictionData{ fun internet():List{ val list:MutableList = mutableListOf() list += Restriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS,R.string.config_mobile_network,"",R.drawable.signal_cellular_alt_fill0)