From d5df4facde0b6d0f160649e600c1306b01391ded Mon Sep 17 00:00:00 2001 From: BinTianqi <1220958406@qq.com> Date: Fri, 26 Jan 2024 13:23:26 +0800 Subject: [PATCH] Jan26 noon --- .gitignore | 3 +- Readme.md | 5 +- .../binbin/androidowner/ApplicationManage.kt | 21 ++-- .../com/binbin/androidowner/DeviceControl.kt | 35 +++---- .../com/binbin/androidowner/MainActivity.kt | 8 +- .../java/com/binbin/androidowner/Password.kt | 99 ++++++++++++------- .../com/binbin/androidowner/Permissions.kt | 14 +-- .../java/com/binbin/androidowner/Setting.kt | 4 +- .../main/java/com/binbin/androidowner/User.kt | 32 +++--- .../com/binbin/androidowner/UserRestrict.kt | 14 ++- .../res/values/ic_launcher_background.xml | 2 +- 11 files changed, 140 insertions(+), 97 deletions(-) diff --git a/.gitignore b/.gitignore index 40c363b..966ec8b 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ .cxx local.properties /app/build -/app/release \ No newline at end of file +/app/release +.androidide diff --git a/Readme.md b/Readme.md index 530b83c..d130a48 100644 --- a/Readme.md +++ b/Readme.md @@ -10,6 +10,7 @@ ### 功能 已经适配手表,请在应用的设置里打开“Wear” +适配了一些预见式返回动画(需安卓13或14),可能不太稳定,如果有问题请向我反馈 - 设备控制 - 禁用相机 @@ -22,6 +23,7 @@ - 隐藏应用 - 停用应用 - 禁止卸载应用 + - 设置许可的输入法 - 用户限制 - 网络和互联网:禁止使用流量、WiFi、VPN、私人DNS - 其他连接:禁止使用蓝牙、位置信息、NFC、USB(MTP) @@ -33,6 +35,7 @@ - 修改密码 - 最大密码错误次数 - 密码失效超时时间 + - 设置密码复杂度要求 ### 这个应用十分危险!!! @@ -42,5 +45,5 @@ ### 即将加入的功能 - Managed Profile,工作资料和多用户相关 -- 安装/卸载应用,清除应用的缓存和存储空间 +- 安装/卸载应用,清除应用的存储空间 - 应用管理的包选择器(目前只能手动输入包名) diff --git a/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt b/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt index 6d23cdf..89bcfce 100644 --- a/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt +++ b/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt @@ -67,7 +67,7 @@ fun ApplicationManage(){ enabled = isDeviceOwner(myDpm)|| isProfileOwner(myDpm), modifier = Modifier .fillMaxWidth() - .padding(horizontal = 8.dp) + .padding(horizontal = if(isWear){2.dp}else{12.dp},vertical = if(isWear){2.dp}else{6.dp}) ) if(VERSION.SDK_INT>=24){ val isSuspended = { @@ -103,7 +103,7 @@ fun ApplicationManage(){ } } Column(modifier = sections()) { - Text(text = "许可的输入法", style = MaterialTheme.typography.titleLarge) + Text(text = "许可的输入法", style = MaterialTheme.typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) var imeList = mutableListOf() var imeListText by remember{ mutableStateOf("") } val refreshList = { @@ -120,24 +120,30 @@ fun ApplicationManage(){ } refreshList() Text(imeListText) + Row(modifier = if(!isWear){Modifier.fillMaxWidth()}else{Modifier.fillMaxWidth().horizontalScroll(rememberScrollState())} + ,horizontalArrangement = Arrangement.SpaceBetween){ Button( onClick = { imeList.plus(pkgName) myDpm.setPermittedInputMethods(myComponent, imeList) refreshList() - } + }, + modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.48F)}, + enabled = isDeviceOwner(myDpm)||isProfileOwner(myDpm) ) { - Text("设为许可的输入法") + Text("加入列表") } Button( onClick = { imeList.remove(pkgName) myDpm.setPermittedInputMethods(myComponent,imeList) refreshList() - } + }, + modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.92F)}, + enabled = isDeviceOwner(myDpm)||isProfileOwner(myDpm) ) { Text("从列表中移除") - } + }} } /*Button( onClick = { @@ -171,7 +177,8 @@ private fun AppManageItem( Column { Text( text = stringResource(itemName), - style = MaterialTheme.typography.titleLarge + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onPrimaryContainer ) if(itemDesc!=R.string.place_holder){ Text(stringResource(itemDesc)) diff --git a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt index 6b48a07..3d23771 100644 --- a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt +++ b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt @@ -78,27 +78,27 @@ fun DeviceControl(){ style = if(!isWear){typography.bodyLarge}else{typography.bodyMedium}, textAlign = TextAlign.Center) } } - if(VERSION.SDK_INT<24){ + if(VERSION.SDK_INT<24&&isDeviceOwner(myDpm)){ Text(text = "重启和WiFi Mac需要API24",modifier=Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) } - if(VERSION.SDK_INT<26){ + if(VERSION.SDK_INT<26&&isDeviceOwner(myDpm)){ Text(text = "备份服务需要API26",modifier=Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) } - if(VERSION.SDK_INT<30){ + if(VERSION.SDK_INT<30&&isDeviceOwner(myDpm)){ Text(text = "自动设置时间和自动设置时区需要API30",modifier=Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) } - if(VERSION.SDK_INT<31){Text(text = "关闭USB信号需API31",modifier=Modifier.fillMaxWidth(), textAlign = TextAlign.Center, + if(VERSION.SDK_INT<31&&isDeviceOwner(myDpm)){Text(text = "关闭USB信号需API31",modifier=Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = if(!isWear){typography.bodyLarge}else{typography.bodyMedium})} - if(VERSION.SDK_INT<34){ + if(VERSION.SDK_INT<34&&isDeviceOwner(myDpm)){ Text(text = "隐藏状态栏需要API34",modifier=Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) } if(VERSION.SDK_INT>=28){ Column(modifier = sections()) { - Text(text = "锁屏方式", style = typography.titleLarge) + Text(text = "锁屏方式", style = typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) Text(text = "禁用需要无密码",style=if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) Row( modifier = Modifier.fillMaxWidth(), @@ -156,26 +156,26 @@ fun DeviceControl(){ } Text(text = "WiFi MAC: $wifimac",modifier=Modifier.fillMaxWidth(), textAlign = TextAlign.Center,style=if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) } + if(isDeviceOwner(myDpm)||isProfileOwner(myDpm)){ Button( onClick = {myDpm.uninstallAllUserCaCerts(myComponent);Toast.makeText(myContext, "成功", Toast.LENGTH_SHORT).show()}, - modifier = Modifier.align(Alignment.CenterHorizontally), - enabled = isDeviceOwner(myDpm)|| isProfileOwner(myDpm) + modifier = Modifier.align(Alignment.CenterHorizontally) ) { Text(text = "清除用户Ca证书") - } + }} if(isDeviceOwner(myDpm)){ SysUpdatePolicy(myDpm,myComponent,myContext) } Column(modifier = sections(MaterialTheme.colorScheme.errorContainer)) { var flag by remember{ mutableIntStateOf(0) } var confirmed by remember{ mutableStateOf(false) } - Text(text = "清除数据",style = typography.titleLarge,modifier = Modifier.padding(6.dp)) - RadioButtonItem("默认",{flag==0},{flag=0}) - RadioButtonItem("WIPE_EXTERNAL_STORAGE",{flag==0x0001},{flag=0x0001}) - RadioButtonItem("WIPE_RESET_PROTECTION_DATA",{flag==0x0002},{flag=0x0002}) - RadioButtonItem("WIPE_EUICC",{flag==0x0004},{flag=0x0004}) - RadioButtonItem("WIPE_SILENTLY",{flag==0x0008},{flag=0x0008}) - Text(text = "清空数据的不能是系统用户", + 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, style = if(!sharedPref.getBoolean("isWear",false)){typography.bodyLarge}else{typography.bodyMedium}) Button( onClick = {confirmed=!confirmed}, @@ -247,7 +247,8 @@ private fun DeviceCtrlItem( Column { Text( text = stringResource(itemName), - style = if(!sharedPref.getBoolean("isWear",false)){typography.titleLarge}else{typography.bodyLarge} + style = if(!sharedPref.getBoolean("isWear",false)){typography.titleLarge}else{typography.bodyLarge}, + color = MaterialTheme.colorScheme.onPrimaryContainer ) if(itemDesc!=R.string.place_holder&&!sharedPref.getBoolean("isWear",false)){ Text(stringResource(itemDesc)) diff --git a/app/src/main/java/com/binbin/androidowner/MainActivity.kt b/app/src/main/java/com/binbin/androidowner/MainActivity.kt index 0643c82..66a9d3d 100644 --- a/app/src/main/java/com/binbin/androidowner/MainActivity.kt +++ b/app/src/main/java/com/binbin/androidowner/MainActivity.kt @@ -268,7 +268,8 @@ fun HomePageItem(name:Int, imgVector:Int, description:Int, navTo:String, myNav:N fun RadioButtonItem( text:String, selected:()->Boolean, - operation:()->Unit + operation:()->Unit, + textColor:Color = MaterialTheme.colorScheme.onBackground ){ val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) Row(verticalAlignment = Alignment.CenterVertically,modifier = Modifier @@ -278,7 +279,8 @@ fun RadioButtonItem( .clickable(onClick = operation) ) { RadioButton(selected = selected(), onClick = operation,modifier=if(sharedPref.getBoolean("isWear",false)){Modifier.size(28.dp)}else{Modifier}) - Text(text = text, style = if(!sharedPref.getBoolean("isWear",false)){MaterialTheme.typography.bodyLarge}else{MaterialTheme.typography.bodyMedium}) + Text(text = text, style = if(!sharedPref.getBoolean("isWear",false)){MaterialTheme.typography.bodyLarge}else{MaterialTheme.typography.bodyMedium}, + color = textColor) } } @@ -299,7 +301,7 @@ fun sections(bgColor:Color=MaterialTheme.colorScheme.primaryContainer):Modifier{ .padding(horizontal = 8.dp, vertical = 4.dp) .clip(RoundedCornerShape(14.dp)) .background(color = bgColor) - .padding(vertical = 6.dp, horizontal = 10.dp) + .padding(vertical = 10.dp, horizontal = 10.dp) }else{ Modifier .fillMaxWidth() diff --git a/app/src/main/java/com/binbin/androidowner/Password.kt b/app/src/main/java/com/binbin/androidowner/Password.kt index 98f7172..d92524f 100644 --- a/app/src/main/java/com/binbin/androidowner/Password.kt +++ b/app/src/main/java/com/binbin/androidowner/Password.kt @@ -110,14 +110,17 @@ fun Password(){ horizontalAlignment = Alignment.Start, modifier = sections() ) { - Text(text = "密码重置令牌", style = typography.titleLarge) - Row(modifier = if(!isWear){Modifier}else{Modifier.horizontalScroll(rememberScrollState())}) { + Text(text = "密码重置令牌", style = typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) + Row( + modifier = if(!isWear){Modifier.fillMaxWidth()}else{Modifier.horizontalScroll(rememberScrollState())}, + horizontalArrangement = Arrangement.SpaceBetween + ){ Button( onClick = { if(myDpm.clearResetPasswordToken(myComponent)){ Toast.makeText(myContext, "清除成功", Toast.LENGTH_SHORT).show() }else{ Toast.makeText(myContext, "清除失败", Toast.LENGTH_SHORT).show() } }, - modifier = Modifier.padding(end = 8.dp), + modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.32F)}, enabled = isDeviceOwner(myDpm) ) { Text("清除") @@ -127,8 +130,8 @@ fun Password(){ if(myDpm.setResetPasswordToken(myComponent, myByteArray)){ Toast.makeText(myContext, "设置成功", Toast.LENGTH_SHORT).show() }else{ Toast.makeText(myContext, "设置失败", Toast.LENGTH_SHORT).show() } }, - modifier = Modifier.padding(end = 8.dp), - enabled = isDeviceOwner(myDpm) + enabled = isDeviceOwner(myDpm), + modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.47F)} ) { Text("设置") } @@ -139,7 +142,8 @@ fun Password(){ }catch(e:NullPointerException){ Toast.makeText(myContext, "请先设置令牌", Toast.LENGTH_SHORT).show() } }else{ Toast.makeText(myContext, "已经激活", Toast.LENGTH_SHORT).show() } }, - enabled = isDeviceOwner(myDpm) + enabled = isDeviceOwner(myDpm), + modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.88F)} ) { Text("激活") } @@ -155,16 +159,17 @@ fun Password(){ modifier = sections() ) { var confirmed by remember{ mutableStateOf(false) } + Text(text = "修改密码",style = MaterialTheme.typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) TextField( value = newPwd, onValueChange = {newPwd=it}, - enabled = !confirmed&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm)), + enabled = !confirmed&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm)||myDpm.isAdminActive(myComponent)), label = { Text("密码")}, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password, imeAction = ImeAction.Done), keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus()}), - modifier = Modifier.fillMaxWidth() + modifier = Modifier.padding(vertical = if(isWear){0.dp}else{5.dp}).fillMaxWidth() ) - Text(text = stringResource(R.string.reset_pwd_desc), modifier = Modifier.padding(vertical = 5.dp),style=if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) + Text(text = stringResource(R.string.reset_pwd_desc), modifier = Modifier.padding(vertical = 3.dp),style=if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) var resetPwdFlag by remember{ mutableIntStateOf(0) } RadioButtonItem("开机时不要求密码(如果有指纹等其他解锁方式)", {resetPwdFlag==DevicePolicyManager.RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}, @@ -172,14 +177,14 @@ fun Password(){ RadioButtonItem("要求立即输入新密码",{resetPwdFlag==DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY}, {resetPwdFlag=DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY}) RadioButtonItem("无",{resetPwdFlag==0},{resetPwdFlag=0}) - Row(modifier = if(!isWear){Modifier}else{Modifier.horizontalScroll(rememberScrollState())}) { + Row(modifier = if(!isWear){Modifier.fillMaxWidth()}else{Modifier.horizontalScroll(rememberScrollState())},horizontalArrangement = Arrangement.SpaceBetween) { Button( onClick = { if(newPwd.length>=4||newPwd.isEmpty()){ confirmed=!confirmed }else{ Toast.makeText(myContext, "需要4位密码", Toast.LENGTH_SHORT).show() } }, - modifier = Modifier.padding(end = 5.dp), - enabled = isDeviceOwner(myDpm) || isProfileOwner(myDpm) || myDpm.isAdminActive(myComponent) + enabled = isDeviceOwner(myDpm) || isProfileOwner(myDpm) || myDpm.isAdminActive(myComponent), + modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.3F)} ) { Text(text = if(confirmed){"取消"}else{"确定"}) } @@ -192,12 +197,12 @@ fun Password(){ confirmed=false }, colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.error, contentColor = MaterialTheme.colorScheme.onError), - enabled = confirmed&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm)) + enabled = confirmed&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm)), + modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.42F)} ) { Text("应用") } } - Spacer(Modifier.padding(horizontal = 2.dp)) Button( onClick = { val resetSuccess = myDpm.resetPassword(newPwd,resetPwdFlag) @@ -206,9 +211,10 @@ fun Password(){ confirmed=false }, enabled = confirmed, - colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.error, contentColor = MaterialTheme.colorScheme.onError) + colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.error, contentColor = MaterialTheme.colorScheme.onError), + modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.9F)} ) { - Text("应用(旧)") + Text("应用(旧)") } } } @@ -232,7 +238,7 @@ fun Password(){ if(isDeviceOwner(myDpm) || isProfileOwner(myDpm)){ selectedItem=myDpm.requiredPasswordComplexity } - Text(text = "密码复杂度要求", style = typography.titleLarge) + Text(text = "密码复杂度要求", style = typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) Text(text = "不是实际密码复杂度", style = if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) Text(text = "设置密码复杂度将会取代密码质量", @@ -240,20 +246,37 @@ fun Password(){ RadioButtonItem(passwordComplexity[0].second,{selectedItem==passwordComplexity[0].first},{selectedItem=passwordComplexity[0].first}) 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}) + RadioButtonItem(passwordComplexity[3].second,{selectedItem==passwordComplexity[3].first},{selectedItem=passwordComplexity[3].first}, + if(isWear){MaterialTheme.colorScheme.error}else{MaterialTheme.colorScheme.onBackground}) Text(text = "连续性:密码重复(6666)或密码递增递减(4321、2468)", modifier = Modifier.padding(vertical = 3.dp), style = if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) - Button( - onClick = { - myDpm.requiredPasswordComplexity = selectedItem - Toast.makeText(myContext, "成功", Toast.LENGTH_SHORT).show() - }, - enabled = isDeviceOwner(myDpm)|| isProfileOwner(myDpm) - ) { - Text("应用") + Row(modifier = Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.SpaceBetween){ + Button( + onClick = { + myDpm.requiredPasswordComplexity = selectedItem + Toast.makeText(myContext, "成功", Toast.LENGTH_SHORT).show() + }, + enabled = isDeviceOwner(myDpm)|| isProfileOwner(myDpm), + modifier = if(isWear){Modifier.fillMaxWidth()}else{Modifier.fillMaxWidth(0.4F)} + ) { + Text(text = "应用") + } + if(!isWear){ + Button( + onClick = {myContext.startActivity(Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD))}, + modifier = Modifier.fillMaxWidth(0.95F) + ){ + Text("要求设置新密码") + } + } } - Button(onClick = {myContext.startActivity(Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD))}) { - Text("要求设置新密码") + if(isWear){ + Button( + onClick = {myContext.startActivity(Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD))}, + modifier = Modifier.fillMaxWidth() + ){ + Text("要求设置新密码") + } } } } @@ -276,7 +299,7 @@ fun Password(){ if(isDeviceOwner(myDpm) || isProfileOwner(myDpm)){ selectedItem=myDpm.getPasswordQuality(myComponent) } - Text(text = "密码质量要求", style = typography.titleLarge) + Text(text = "密码质量要求", style = typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) if(expanded){ Text(text = "不是实际密码质量", style = if(!isWear){typography.bodyLarge}else{typography.bodyMedium})} @@ -300,7 +323,8 @@ fun Password(){ myDpm.setPasswordQuality(myComponent,selectedItem) Toast.makeText(myContext, "成功", Toast.LENGTH_SHORT).show() }, - enabled = isDeviceOwner(myDpm) || isProfileOwner(myDpm) + enabled = isDeviceOwner(myDpm) || isProfileOwner(myDpm), + modifier = Modifier.fillMaxWidth() ) { Text("应用") } @@ -334,15 +358,14 @@ 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) + Text(text = stringResource(itemName), style = typography.titleLarge,color = MaterialTheme.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))} Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier - .fillMaxWidth() - .padding(end = if (!sharedPref.getBoolean("isWear", false)) { 8.dp } else { 0.dp }) + modifier = Modifier.fillMaxWidth() ){ TextField( value = inputContent, @@ -359,7 +382,7 @@ fun PasswordItem( keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done), keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus()}), enabled = isDeviceOwner(myDpm), - modifier = if(sharedPref.getBoolean("isWear",false)){Modifier}else{Modifier.fillMaxWidth(0.8F)} + modifier = if(sharedPref.getBoolean("isWear",false)){Modifier.fillMaxWidth()}else{Modifier.fillMaxWidth(0.8F)} ) if(!sharedPref.getBoolean("isWear",false)){ IconButton( @@ -375,9 +398,11 @@ fun PasswordItem( Icon(imageVector = Icons.Outlined.Check, contentDescription = null) }} } - if(sharedPref.getBoolean("isWear",false)&&isDeviceOwner(myDpm)&&ableToApply){ + if(sharedPref.getBoolean("isWear",false)){ Button( - onClick = {focusMgr.clearFocus() ; setMethod(inputContent) ; inputContentEdited=inputContent!=getMethod()} + onClick = {focusMgr.clearFocus() ; setMethod(inputContent) ; inputContentEdited=inputContent!=getMethod()}, + enabled = isDeviceOwner(myDpm)&&ableToApply, + modifier = Modifier.fillMaxWidth() ) { Text("应用") } diff --git a/app/src/main/java/com/binbin/androidowner/Permissions.kt b/app/src/main/java/com/binbin/androidowner/Permissions.kt index 0aea415..2e2c1b9 100644 --- a/app/src/main/java/com/binbin/androidowner/Permissions.kt +++ b/app/src/main/java/com/binbin/androidowner/Permissions.kt @@ -69,8 +69,8 @@ fun DpmPermissions(navCtrl:NavHostController){ verticalAlignment = Alignment.CenterVertically ) { Column { - Text(text = "Device Admin", fontSize = if(!isWear){22.sp}else{20.sp}) - Text(if(isda){"已激活"}else{"未激活"}) + Text(text = "Device Admin", fontSize = if(!isWear){22.sp}else{20.sp},color = MaterialTheme.colorScheme.onPrimaryContainer) + Text(text = if(isda){"已激活"}else{"未激活"}) } if(!isWear) if(isda){ @@ -112,7 +112,7 @@ fun DpmPermissions(navCtrl:NavHostController){ verticalAlignment = Alignment.CenterVertically ) { Column { - Text(text = "Profile Owner", fontSize = if(!isWear){22.sp}else{20.sp}) + Text(text = "Profile Owner", fontSize = if(!isWear){22.sp}else{20.sp},color = MaterialTheme.colorScheme.onPrimaryContainer) Text(if(isProfileOwner(myDpm)){"已激活"}else{"未激活"}) } if(isProfileOwner(myDpm)&&VERSION.SDK_INT>=24&&!isWear){ @@ -156,7 +156,7 @@ fun DpmPermissions(navCtrl:NavHostController){ verticalAlignment = Alignment.CenterVertically ) { Column { - Text(text = "Device Owner", fontSize = if(!isWear){22.sp}else{20.sp}) + Text(text = "Device Owner", fontSize = if(!isWear){22.sp}else{20.sp},color = MaterialTheme.colorScheme.onPrimaryContainer) Text(if(isDeviceOwner(myDpm)){"已激活"}else{"未激活"}) } if(isDeviceOwner(myDpm)&&!isWear){ @@ -202,7 +202,7 @@ fun DpmPermissions(navCtrl:NavHostController){ Column( modifier = sections() ) { - Text(text = "设备信息", style = typography.titleLarge) + Text(text = "设备信息", style = typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) val orgDevice = myDpm.isOrganizationOwnedDeviceWithManagedProfile Text("由组织拥有的受管理资料设备:$orgDevice",style=if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) if(isDeviceOwner(myDpm)|| isProfileOwner(myDpm)){ @@ -233,7 +233,7 @@ fun DpmPermissions(navCtrl:NavHostController){ if(VERSION.SDK_INT>=31&&(isProfileOwner(myDpm)|| isDeviceOwner(myDpm))){ Column(modifier = sections()) { val specificId:String = myDpm.enrollmentSpecificId - Text(text = "设备唯一标识码", style = typography.titleLarge) + Text(text = "设备唯一标识码", style = typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) Text("(恢复出厂设置不变)",style=if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) if(specificId!=""){ Text(specificId) @@ -247,7 +247,7 @@ fun DpmPermissions(navCtrl:NavHostController){ } if(isDeviceOwner(myDpm) || isProfileOwner(myDpm)){ Column(modifier = sections()) { - Text(text = "不受控制的账号类型", style = typography.titleLarge) + Text(text = "不受控制的账号类型", style = typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) Text("作用未知",style=if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) var noManageAccount = myDpm.accountTypesWithManagementDisabled?.toMutableList() var accountlist by remember{ mutableStateOf("") } diff --git a/app/src/main/java/com/binbin/androidowner/Setting.kt b/app/src/main/java/com/binbin/androidowner/Setting.kt index afd0010..6fdde3b 100644 --- a/app/src/main/java/com/binbin/androidowner/Setting.kt +++ b/app/src/main/java/com/binbin/androidowner/Setting.kt @@ -52,7 +52,7 @@ fun AppSetting(navCtrl:NavHostController){ Column( modifier = Modifier.padding(start = 8.dp, end = 8.dp, bottom = 12.dp) ) { - Text(text = "Android owner", style = MaterialTheme.typography.headlineMedium, color = MaterialTheme.colorScheme.onPrimaryContainer) + Text(text = "Android owner", style = MaterialTheme.typography.headlineSmall, color = MaterialTheme.colorScheme.onPrimaryContainer) Text(text = "使用安卓的Device admin、Device owner 、Profile owner,全方位掌控你的设备", style = if(!sharedPref.getBoolean("isWear",false)){MaterialTheme.typography.bodyLarge}else{MaterialTheme.typography.bodyMedium}) Spacer(Modifier.padding(vertical = 4.dp)) @@ -69,7 +69,7 @@ fun AppSetting(navCtrl:NavHostController){ Icon( painter = painterResource(id = R.drawable.open_in_new), contentDescription = null, - modifier = Modifier.padding(start = 6.dp, end = 8.dp), + modifier = Modifier.padding(start = 6.dp, end = 10.dp), tint = MaterialTheme.colorScheme.primary ) Column { diff --git a/app/src/main/java/com/binbin/androidowner/User.kt b/app/src/main/java/com/binbin/androidowner/User.kt index 323ac27..f52476d 100644 --- a/app/src/main/java/com/binbin/androidowner/User.kt +++ b/app/src/main/java/com/binbin/androidowner/User.kt @@ -53,37 +53,37 @@ fun UserManage(){ val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) val isWear = sharedPref.getBoolean("isWear",false) Column(modifier = sections()) { - Text(text = "用户信息", style = MaterialTheme.typography.titleLarge) - Text("用户个数:${userList.size}") - Spacer(Modifier.padding(vertical = 5.dp)) - Text("用户已解锁:${UserManagerCompat.isUserUnlocked(myContext)}") + Text(text = "用户信息", style = MaterialTheme.typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) + Text("用户个数:${userList.size}",style = if(isWear){MaterialTheme.typography.bodyMedium}else{MaterialTheme.typography.bodyLarge}) + Spacer(Modifier.padding(vertical = if(isWear){2.dp}else{5.dp})) + Text("用户已解锁:${UserManagerCompat.isUserUnlocked(myContext)}",style = if(isWear){MaterialTheme.typography.bodyMedium}else{MaterialTheme.typography.bodyLarge}) if(VERSION.SDK_INT>=24){ - Text("支持多用户:${UserManager.supportsMultipleUsers()}") + Text("支持多用户:${UserManager.supportsMultipleUsers()}",style = if(isWear){MaterialTheme.typography.bodyMedium}else{MaterialTheme.typography.bodyLarge}) } if(VERSION.SDK_INT>=31){ - Text("系统用户: ${UserManager.isHeadlessSystemUserMode()}") + Text("系统用户: ${UserManager.isHeadlessSystemUserMode()}",style = if(isWear){MaterialTheme.typography.bodyMedium}else{MaterialTheme.typography.bodyLarge}) } - Spacer(Modifier.padding(vertical = 5.dp)) + Spacer(Modifier.padding(vertical = if(isWear){2.dp}else{5.dp})) if (VERSION.SDK_INT >= 28) { val logoutable = myDpm.isLogoutEnabled - Text(text = "用户可以退出 : $logoutable") + Text(text = "用户可以退出 : $logoutable",style = if(isWear){MaterialTheme.typography.bodyMedium}else{MaterialTheme.typography.bodyLarge}) if(isDeviceOwner(myDpm)|| isProfileOwner(myDpm)){ val ephemeralUser = myDpm.isEphemeralUser(myComponent) - Text(text = "临时用户: $ephemeralUser") + Text(text = "临时用户: $ephemeralUser",style = if(isWear){MaterialTheme.typography.bodyMedium}else{MaterialTheme.typography.bodyLarge}) } val affiliatedUser = myDpm.isAffiliatedUser - Text(text = "次级用户: $affiliatedUser") + Text(text = "次级用户: $affiliatedUser",style = if(isWear){MaterialTheme.typography.bodyMedium}else{MaterialTheme.typography.bodyLarge}) } - Spacer(Modifier.padding(5.dp)) - Text("切换用户后或设备重启后会删除临时用户") + Spacer(Modifier.padding(vertical = if(isWear){2.dp}else{5.dp})) + Text("切换用户后或设备重启后会删除临时用户",style = if(isWear){MaterialTheme.typography.bodyMedium}else{MaterialTheme.typography.bodyLarge}) } Column(modifier = sections()) { - Text(text = "用户操作", style = MaterialTheme.typography.titleLarge) + Text(text = "用户操作", style = MaterialTheme.typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) if(VERSION.SDK_INT>28){ var resultForLogout by remember{ mutableIntStateOf(-1) } var resultForStop by remember{ mutableIntStateOf(-1) } - Text("登出用户需要成为次级用户的Profile Owner") + Text("登出用户需要成为次级用户的Profile Owner",style = if(isWear){MaterialTheme.typography.bodyMedium}else{MaterialTheme.typography.bodyLarge}) Button(onClick = {resultForLogout = myDpm.logoutUser(myComponent)}, enabled = isProfileOwner(myDpm)) { Text("登出用户") } @@ -119,13 +119,13 @@ fun UserManage(){ Button(onClick = { createWorkProfile(myContext)}) { Text("创建工作资料") } - Text("可能无法创建工作资料") + Text("可能无法创建工作资料",style = if(isWear){MaterialTheme.typography.bodyMedium}else{MaterialTheme.typography.bodyLarge}) } if(VERSION.SDK_INT>=24){ Column(modifier = sections()) { var userName by remember{ mutableStateOf("") } - Text(text = "创建用户", style = MaterialTheme.typography.titleLarge) + Text(text = "创建用户", style = MaterialTheme.typography.titleLarge,color = MaterialTheme.colorScheme.onPrimaryContainer) TextField( value = userName, onValueChange = {userName=it}, diff --git a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt index c8b796a..dc4770d 100644 --- a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt +++ b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt @@ -66,6 +66,11 @@ fun UserRestriction(){ items(1){ Text(text = "打开开关后会禁用对应的功能",modifier = Modifier.padding(3.dp), style = if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) + if(VERSION.SDK_INT<24){ + Text(text = "所有的用户限制都需要API24,你的设备低于API24,无法使用。", + style = if(!isWear){typography.bodyLarge}else{typography.bodyMedium}, + color = MaterialTheme.colorScheme.error) + } if(isProfileOwner(myDpm)){ Text(text = "Profile owner无法更改部分功能", style = if(!isWear){typography.bodyLarge}else{typography.bodyMedium}) @@ -183,7 +188,8 @@ private fun UserRestrictionItem( horizontalArrangement = Arrangement.SpaceBetween ){ Row( - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, + modifier = if(sharedPref.getBoolean("isWear",false)){Modifier.fillMaxWidth(0.65F)}else{Modifier.fillMaxWidth(0.8F)} ) { if(!sharedPref.getBoolean("isWear",false)){ Icon( @@ -192,13 +198,11 @@ private fun UserRestrictionItem( modifier = Modifier.padding(start = 4.dp, end = 8.dp), tint = MaterialTheme.colorScheme.secondary )} - Column( - modifier = Modifier.align(Alignment.CenterVertically) - ) { + Column{ Text( text = stringResource(itemName), style = if(!sharedPref.getBoolean("isWear",false)){typography.titleLarge}else{typography.bodyLarge}, - color = MaterialTheme.colorScheme.onTertiaryContainer + color = MaterialTheme.colorScheme.onSecondaryContainer ) if(restrictionDescription!=""){Text(text = restrictionDescription, color = MaterialTheme.colorScheme.onSecondaryContainer)} } diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml index 606b9bd..f9ba40b 100644 --- a/app/src/main/res/values/ic_launcher_background.xml +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ - #383838 + #191919 \ No newline at end of file