add animations to UserRestriction page

This commit is contained in:
BinTianqi
2024-02-07 21:33:26 +08:00
parent 3d74867fee
commit 62a4376851
8 changed files with 143 additions and 179 deletions

View File

@@ -330,8 +330,9 @@ fun ApplicationManage(){
if(count>0) { listText += "\n" }
}
}
refreshList()
Text(text = listText, style = bodyTextStyle)
var inited by remember{mutableStateOf(false)}
if(!inited){refreshList(); inited=true}
Text(text = if(listText!=""){listText}else{""}, style = bodyTextStyle)
Row(modifier = Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.SpaceBetween){
Button(
onClick = {
@@ -372,8 +373,9 @@ fun ApplicationManage(){
imeListText = ""
for(eachIme in imeList){ imeListText += "$eachIme \n" }
}
refreshList()
Text(text = imeListText, style = bodyTextStyle)
var inited by remember{mutableStateOf(false)}
if(!inited){refreshList();inited=true}
Text(text = if(imeListText!=""){imeListText}else{""}, style = bodyTextStyle)
Row(modifier = Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.SpaceBetween){
Button(
onClick = {

View File

@@ -121,29 +121,50 @@ fun DeviceControl(){
Button(
onClick = { Toast.makeText(myContext, if(myDpm.setKeyguardDisabled(myComponent,true)){"成功"}else{"失败"}, Toast.LENGTH_SHORT).show() },
enabled = isDeviceOwner(myDpm)|| (isProfileOwner(myDpm)&&myDpm.isAffiliatedUser),
modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.48F)}
modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.49F)}
) {
Text("禁用")
}
Button(
onClick = { Toast.makeText(myContext, if(myDpm.setKeyguardDisabled(myComponent,false)){"成功"}else{"失败"}, Toast.LENGTH_SHORT).show() },
enabled = isDeviceOwner(myDpm)|| (isProfileOwner(myDpm)&&myDpm.isAffiliatedUser),
modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.92F)}
modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.96F)}
) {
Text("启用")
}
}}
}
Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = sections()) {
if(VERSION.SDK_INT>=24){
Button(onClick = {myDpm.reboot(myComponent)}, enabled = isDeviceOwner(myDpm),
modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.48F)}) {
Text("重启")
Column(modifier = sections()){
Text(text = "锁屏", style = typography.titleLarge)
var flag by remember{mutableIntStateOf(0)}
if(VERSION.SDK_INT>=26){ CheckBoxItem("需要重新输入密码",{flag==FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY},{flag = if(flag==0){1}else{0} }) }
Button(
onClick = {myDpm.lockNow()},
enabled = myDpm.isAdminActive(myComponent),
modifier = Modifier.fillMaxWidth()
) {
Text("立即锁屏")
}
Button(onClick = {myDpm.lockNow()}, enabled = myDpm.isAdminActive(myComponent),
modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.92F)}) {
Text("锁屏")
}
if(VERSION.SDK_INT>=24){
Column(modifier = sections()){
Button(
onClick = {
val result = myDpm.requestBugreport(myComponent)
Toast.makeText(myContext, if(result){"成功"}else{"失败"}, Toast.LENGTH_SHORT).show()
},
modifier = Modifier.fillMaxWidth()
) {
Text("请求错误报告")
}
Button(
onClick = {myDpm.reboot(myComponent)},
enabled = isDeviceOwner(myDpm),
modifier = Modifier.fillMaxWidth()
) {
Text("重启")
}
}
}

View File

@@ -7,6 +7,7 @@ import android.content.Context
import android.content.Intent
import android.os.Build.VERSION
import android.os.Bundle
import android.os.UserManager
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
@@ -43,6 +44,7 @@ import java.io.FileNotFoundException
import java.io.IOException
lateinit var getCaCert: ActivityResultLauncher<Intent>
lateinit var createUser:ActivityResultLauncher<Intent>
var caCert = byteArrayOf()
@ExperimentalMaterial3Api
@@ -65,6 +67,13 @@ class MainActivity : ComponentActivity() {
catch(e:IOException){ Toast.makeText(applicationContext, "IO异常", Toast.LENGTH_SHORT).show() }
}else{ Toast.makeText(applicationContext, "空URI", Toast.LENGTH_SHORT).show() }
}
createUser = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
when(it.resultCode){
UserManager.USER_CREATION_FAILED_NO_MORE_USERS->Toast.makeText(applicationContext, "用户太多了", Toast.LENGTH_SHORT).show();
UserManager.USER_CREATION_FAILED_NOT_PERMITTED->Toast.makeText(applicationContext, "不是管理员用户", Toast.LENGTH_SHORT).show();
else->Toast.makeText(applicationContext, "成功", Toast.LENGTH_SHORT).show()
}
}
setContent {
AndroidOwnerTheme {
MyScaffold()

View File

@@ -10,7 +10,6 @@ import android.net.wifi.WifiSsid
import android.os.Build.VERSION
import android.telephony.TelephonyManager
import android.telephony.TelephonyManager.UNKNOWN_CARRIER_ID
import android.telephony.data.ApnSetting
import android.telephony.data.ApnSetting.*
import android.widget.Toast
import androidx.activity.ComponentActivity
@@ -316,7 +315,7 @@ fun Network(){
var persistent by remember{mutableStateOf(false)}
var protocol by remember{mutableIntStateOf(-1)}
var roamingProtocol by remember{mutableIntStateOf(-1)}
var id by remember{mutableStateOf(0)}
var id by remember{mutableIntStateOf(0)}
if(inputNum!="0"){
val current = setting[inputNum.toInt()-1]

View File

@@ -269,40 +269,27 @@ fun DpmPermissions(navCtrl:NavHostController){
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = {focusManager.clearFocus()})
)
if(isWear){
Button(onClick={focusManager.clearFocus()
myDpm.setAccountManagementDisabled(myComponent,inputText,true)
noManageAccount=myDpm.accountTypesWithManagementDisabled
refreshList()
},modifier = Modifier.fillMaxWidth()){
Text("添加至列表")
}
Button(onClick={focusManager.clearFocus()
myDpm.setAccountManagementDisabled(myComponent,inputText,false)
noManageAccount=myDpm.accountTypesWithManagementDisabled
refreshList()
},modifier = Modifier.fillMaxWidth()){
Text("从列表中移除")
}}else{
Row(modifier = Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.SpaceBetween){
Button(onClick={focusManager.clearFocus()
myDpm.setAccountManagementDisabled(myComponent,inputText,true)
noManageAccount=myDpm.accountTypesWithManagementDisabled
refreshList()
},modifier = Modifier.fillMaxWidth(0.48f)){
Text("添加至列表")
},modifier = Modifier.fillMaxWidth(0.49f)){
Text("列表")
}
Button(onClick={focusManager.clearFocus()
Button(
onClick={focusManager.clearFocus()
myDpm.setAccountManagementDisabled(myComponent,inputText,false)
noManageAccount=myDpm.accountTypesWithManagementDisabled
refreshList()
},modifier = Modifier.fillMaxWidth(0.92F)){
},
modifier = Modifier.fillMaxWidth(0.96F)
){
Text("从列表中移除")
}
}
}
}
}
if(isDeviceOwner(myDpm)&&VERSION.SDK_INT>=24){
DeviceOwnerInfo(R.string.owner_lockscr_info,R.string.place_holder,R.string.owner_lockscr_info,focusManager,myContext,

View File

@@ -1,12 +1,10 @@
package com.binbin.androidowner
import android.app.admin.DevicePolicyManager
import android.app.admin.DevicePolicyManager.InstallSystemUpdateCallback
import android.app.admin.SystemUpdateInfo
import android.app.admin.SystemUpdatePolicy
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.os.Build.VERSION
import android.widget.Toast
import androidx.activity.ComponentActivity
@@ -26,7 +24,6 @@ import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import java.util.Date
import java.util.concurrent.Executors
@Composable
fun SysUpdatePolicy(){

View File

@@ -10,13 +10,7 @@ import android.os.UserManager
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.compose.foundation.clickable
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.padding
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
@@ -28,12 +22,7 @@ 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.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.draw.clip
@@ -144,7 +133,7 @@ fun UserManage(navCtrl:NavHostController){
}
},
enabled = isDeviceOwner(myDpm)&&VERSION.SDK_INT>=28,
modifier = Modifier.fillMaxWidth(0.48F)
modifier = Modifier.fillMaxWidth(0.49F)
){
Text(if(isWear){"启动"}else{"在后台启动"})
}
@@ -159,7 +148,7 @@ fun UserManage(navCtrl:NavHostController){
}
},
enabled = isDeviceOwner(myDpm),
modifier = Modifier.fillMaxWidth(0.92F)
modifier = Modifier.fillMaxWidth(0.96F)
) {
Text("切换")
}
@@ -178,7 +167,7 @@ fun UserManage(navCtrl:NavHostController){
}
},
enabled = isDeviceOwner(myDpm)&&VERSION.SDK_INT>=28,
modifier = Modifier.fillMaxWidth(0.48F)
modifier = Modifier.fillMaxWidth(0.49F)
) {
Text("停止")
}
@@ -193,7 +182,7 @@ fun UserManage(navCtrl:NavHostController){
}
},
enabled = isDeviceOwner(myDpm),
modifier = Modifier.fillMaxWidth(0.92F)
modifier = Modifier.fillMaxWidth(0.96F)
) {
Text("移除")
}
@@ -205,13 +194,10 @@ fun UserManage(navCtrl:NavHostController){
Column(modifier = sections()) {
Text(text = "工作资料", style = typography.titleLarge)
Row(
modifier = if(isWear){ Modifier.fillMaxWidth().horizontalScroll(rememberScrollState())}else{Modifier.fillMaxWidth()},
horizontalArrangement = Arrangement.SpaceBetween
){
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween){
Button(
onClick = { createWorkProfile(myContext)},
modifier = Modifier.fillMaxWidth(0.48F)
modifier = Modifier.fillMaxWidth(0.49F)
) {
Text("创建")
}
@@ -224,7 +210,7 @@ fun UserManage(navCtrl:NavHostController){
}
},
enabled = isProfileOwner(myDpm)||isDeviceOwner(myDpm),
modifier = Modifier.fillMaxWidth(0.95F)
modifier = Modifier.fillMaxWidth(0.96F)
) {
Text(text = "启用")
}
@@ -253,13 +239,6 @@ fun UserManage(navCtrl:NavHostController){
RadioButtonItem("启用所有系统应用",{selectedFlag==DevicePolicyManager.LEAVE_ALL_SYSTEM_APPS_ENABLED},{selectedFlag=DevicePolicyManager.LEAVE_ALL_SYSTEM_APPS_ENABLED})
}
var newUserHandle: UserHandle? by remember{ mutableStateOf(null) }
Row(
modifier = if(isWear){ if(newUserHandle==null){Modifier.fillMaxWidth()}else{
Modifier
.fillMaxWidth()
.horizontalScroll(rememberScrollState())} }else{Modifier.fillMaxWidth()},
horizontalArrangement = Arrangement.SpaceBetween
) {
Button(
onClick = {
newUserHandle=myDpm.createAndManageUser(myComponent,userName,myComponent,null,selectedFlag)
@@ -267,35 +246,22 @@ fun UserManage(navCtrl:NavHostController){
Toast.makeText(myContext, if(newUserHandle!=null){"成功"}else{"失败"}, Toast.LENGTH_SHORT).show()
},
enabled = isDeviceOwner(myDpm),
modifier = if(isWear){
if(newUserHandle==null){Modifier.fillMaxWidth()}else{Modifier}
}else{
if(newUserHandle==null){Modifier.fillMaxWidth()}else{Modifier.fillMaxWidth(0.4F)}
}
modifier = Modifier.fillMaxWidth()
) {
Text("创建")
Text("创建(Owner)")
}
if(newUserHandle!=null){
Spacer(Modifier.padding(horizontal = 4.dp))
Button(
onClick = {
if(myDpm.switchUser(myComponent,newUserHandle)){
Toast.makeText(myContext, "成功", Toast.LENGTH_SHORT).show()
navCtrl.navigate("HomePage")
} else{
Toast.makeText(myContext, "失败", Toast.LENGTH_SHORT).show()
}
val intent = UserManager.createUserCreationIntent(userName,null,null,null)
createUser.launch(intent)
},
modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.97F)}
modifier = Modifier.fillMaxWidth()
) {
Text("切换至新用户")
}
}
Text("创建(Intent)")
}
Text(text = "尽量用Device owner模式创建Intent模式可能没有效果", style = bodyTextStyle)
if(newUserHandle!=null){ Text(text = "新用户的序列号:${userManager.getSerialNumberForUser(newUserHandle)}", style = bodyTextStyle) }
}
}else{
Text(text = "创建用户需安卓7", style = bodyTextStyle)
}
UserSessionMessage("用户名","用户名",true,myDpm,myContext,{null},{msg -> myDpm.setProfileName(myComponent, msg.toString())})
if(VERSION.SDK_INT>=28){

View File

@@ -9,12 +9,13 @@ import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography
@@ -38,7 +39,6 @@ private data class Restriction(
@DrawableRes val ico:Int
)
@Composable
fun UserRestriction(){
val myContext = LocalContext.current
@@ -52,8 +52,7 @@ fun UserRestriction(){
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
val isWear = sharedPref.getBoolean("isWear",false)
val bodyTextStyle = if(isWear){typography.bodyMedium}else{typography.bodyLarge}
LazyColumn(horizontalAlignment = Alignment.CenterHorizontally){
items(1){
Column(modifier = Modifier.verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally){
Text(text = "打开开关后会禁用对应的功能",modifier = Modifier.padding(3.dp), style = bodyTextStyle)
if(VERSION.SDK_INT<24){
Text(text = "所有的用户限制都需要API24你的设备低于API24无法使用。", style = bodyTextStyle, color = colorScheme.error)
@@ -64,64 +63,56 @@ fun UserRestriction(){
if(isWear){
Text(text = "部分功能在手表上无效", style = typography.bodyMedium)
}
}
items(1){ SectionTab("网络和互联网",{internetVisible}, { internetVisible=!internetVisible}) }
items(RestrictionData().internet()){data->
if(internetVisible){
UserRestrictionItem(data.restriction,data.name,data.desc,data.ico)
SectionTab("网络和互联网",{internetVisible}, { internetVisible=!internetVisible})
AnimatedVisibility(internetVisible) {
Column {
for(internetItem in RestrictionData().internet()){
UserRestrictionItem(internetItem.restriction,internetItem.name,internetItem.desc,internetItem.ico)
}
}
items(1){ SectionTab("更多连接",{connectivityVisible}) { connectivityVisible=!connectivityVisible } }
items(RestrictionData().connectivity()){data->
if(connectivityVisible){
UserRestrictionItem(data.restriction,data.name,data.desc,data.ico)
}
SectionTab("更多连接",{connectivityVisible}) { connectivityVisible=!connectivityVisible }
AnimatedVisibility(connectivityVisible) {
Column {
for(connectivityItem in RestrictionData().connectivity()){
UserRestrictionItem(connectivityItem.restriction,connectivityItem.name,connectivityItem.desc,connectivityItem.ico)
}
}
items(1){ SectionTab("应用",{applicationVisible}) { applicationVisible=!applicationVisible } }
items(RestrictionData().application()){data->
if(applicationVisible){
UserRestrictionItem(data.restriction,data.name,data.desc,data.ico)
}
SectionTab("应用",{applicationVisible}) { applicationVisible=!applicationVisible }
AnimatedVisibility(applicationVisible) {
Column {
for(applicationItem in RestrictionData().application()){
UserRestrictionItem(applicationItem.restriction,applicationItem.name,applicationItem.desc,applicationItem.ico)
}
}
items(1){ SectionTab("用户",{userVisible}) { userVisible=!userVisible } }
items(RestrictionData().user()){data->
if(userVisible){
UserRestrictionItem(data.restriction,data.name,data.desc,data.ico)
}
SectionTab("用户",{userVisible}) { userVisible=!userVisible }
AnimatedVisibility(userVisible) {
Column {
for(userItem in RestrictionData().user()){
UserRestrictionItem(userItem.restriction,userItem.name,userItem.desc,userItem.ico)
}
}
items(1){ SectionTab("媒体",{mediaVisible}) { mediaVisible=!mediaVisible } }
items(RestrictionData().media()){data->
if(mediaVisible){
UserRestrictionItem(data.restriction,data.name,data.desc,data.ico)
}
SectionTab("媒体",{mediaVisible}) { mediaVisible=!mediaVisible }
AnimatedVisibility(mediaVisible) {
Column {
for(mediaItem in RestrictionData().media()){
UserRestrictionItem(mediaItem.restriction,mediaItem.name,mediaItem.desc,mediaItem.ico)
}
}
items(1){ SectionTab("其他",{otherVisible}) { otherVisible=!otherVisible } }
items(RestrictionData().other()){data->
if(otherVisible){
UserRestrictionItem(data.restriction,data.name,data.desc,data.ico)
}
SectionTab("其他",{otherVisible}) { otherVisible=!otherVisible }
AnimatedVisibility(otherVisible) {
Column {
for(otherItem in RestrictionData().other()){
UserRestrictionItem(otherItem.restriction,otherItem.name,otherItem.desc,otherItem.ico)
}
}
items(1){
Spacer(Modifier.padding(vertical = 5.dp))
Column(modifier = Modifier.padding(horizontal = if(!isWear){10.dp}else{3.dp})) {
if(VERSION.SDK_INT<24){ Text(text = "以下功能需要安卓7或以上数据漫游、修改用户头像、更换壁纸", style = bodyTextStyle) }
if(VERSION.SDK_INT<26){ Text(text = "以下功能需要安卓8或以上蓝牙、自动填充服务、添加/移除工作资料", style = bodyTextStyle) }
if(VERSION.SDK_INT<28){ Text(text = "以下功能需要安卓9或以上飞行模式、位置信息、调整亮度、修改语言、修改日期时间、修改屏幕超时、打印、分享至工作应用、切换用户", style = bodyTextStyle) }
if(VERSION.SDK_INT<29){ Text(text = "以下功能需要安卓10或以上配置私人DNS、内容捕获、内容建议", style = bodyTextStyle) }
if(VERSION.SDK_INT<31){ Text(text = "以下功能需要安卓12或以上切换摄像头使用权限、切换麦克风使用权限", style = bodyTextStyle) }
if(VERSION.SDK_INT<33){ Text(text = "以下功能需要安卓13或以上添加WiFi配置、分享设备管理器配置的WiFi、WiFi共享", style = bodyTextStyle) }
if(VERSION.SDK_INT<34){ Text(text = "以下功能需要安卓14或以上2G信号、启用设备管理器、超宽频段无线电", style = bodyTextStyle) }
}
Spacer(Modifier.padding(vertical = 30.dp))
}
}
}
@Composable
@@ -129,9 +120,7 @@ fun SectionTab(txt:String,getSection:()->Boolean,setSection:()->Unit){
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
Text(
text = txt,
color = if(getSection()){
colorScheme.onTertiaryContainer}else{
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
@@ -139,13 +128,7 @@ fun SectionTab(txt:String,getSection:()->Boolean,setSection:()->Unit){
.padding(horizontal = if(!sharedPref.getBoolean("isWear",false)){8.dp}else{4.dp},
vertical = if(!sharedPref.getBoolean("isWear",false)){5.dp}else{2.dp})
.clip(RoundedCornerShape(15.dp))
.background(
color = if (getSection()) {
colorScheme.tertiaryContainer.copy(alpha = 0.8F)
} else {
colorScheme.primaryContainer.copy(alpha = 0.8F)
}
)
.background(color = if (getSection()){ colorScheme.tertiaryContainer }else{ colorScheme.primaryContainer }.copy(0.8F))
.clickable(onClick = setSection)
.padding(vertical = if(!sharedPref.getBoolean("isWear",false)){8.dp}else{3.dp})
)