diff --git a/.gitignore b/.gitignore
index 966ec8b..b1a6202 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,5 @@
*.iml
/.gradle
-/gradle
/local.properties
/.idea
.DS_Store
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 34c175c..2dd96ac 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,6 +14,7 @@
+
=23&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm))){
+ val grantState = mapOf(
+ PERMISSION_GRANT_STATE_DEFAULT to "由用户决定",
+ PERMISSION_GRANT_STATE_GRANTED to "允许",
+ PERMISSION_GRANT_STATE_DENIED to "拒绝"
+ )
+ Column(modifier = sections()){
+ var inputPermission by remember{mutableStateOf("android.permission.")}
+ var currentState by remember{mutableStateOf(grantState[myDpm.getPermissionGrantState(myComponent,pkgName,inputPermission)])}
+ Text(text = "权限管理", style = typography.titleLarge)
+ Text(text = "查看系统支持的权限:adb shell pm list permissions", style = bodyTextStyle)
+ OutlinedTextField(
+ value = inputPermission,
+ label = { Text("权限")},
+ onValueChange = {inputPermission = it},
+ keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Done),
+ keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus()}),
+ enabled = isDeviceOwner(myDpm),
+ modifier = Modifier.fillMaxWidth().padding(vertical = 2.dp)
+ )
+ Text("当前状态:$currentState", style = bodyTextStyle)
+ Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween){
+ Button(
+ onClick = {
+ myDpm.setPermissionGrantState(myComponent,pkgName,inputPermission, PERMISSION_GRANT_STATE_GRANTED)
+ currentState = grantState[myDpm.getPermissionGrantState(myComponent,pkgName,inputPermission)]
+ },
+ modifier = Modifier.fillMaxWidth(0.49F)
+ ) {
+ Text("允许")
+ }
+ Button(
+ onClick = {
+ myDpm.setPermissionGrantState(myComponent,pkgName,inputPermission, PERMISSION_GRANT_STATE_DENIED)
+ currentState = grantState[myDpm.getPermissionGrantState(myComponent,pkgName,inputPermission)]
+ },
+ Modifier.fillMaxWidth(0.96F)
+ ) {
+ Text("拒绝")
+ }
+ }
+ Button(
+ onClick = {
+ myDpm.setPermissionGrantState(myComponent,pkgName,inputPermission, PERMISSION_GRANT_STATE_DEFAULT)
+ currentState = grantState[myDpm.getPermissionGrantState(myComponent,pkgName,inputPermission)]
+ },
+ modifier = Modifier.fillMaxWidth()
+ ) {
+ Text("由用户决定")
+ }
+ Text(text ="设为允许或拒绝后,用户不能改变状态", style = bodyTextStyle)
+ }
+ }
+
Column(modifier = sections()) {
Text(text = "许可的输入法", style = typography.titleLarge,color = colorScheme.onPrimaryContainer)
var imeList = mutableListOf()
diff --git a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt
index bf492aa..72fc591 100644
--- a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt
+++ b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt
@@ -194,6 +194,26 @@ fun DeviceControl(){
}
}
+ if(VERSION.SDK_INT>=23&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm))){
+ Column(modifier = sections()){
+ var selectedPolicy by remember{mutableIntStateOf(myDpm.getPermissionPolicy(myComponent))}
+ Text(text = "权限策略", style = typography.titleLarge)
+ RadioButtonItem("默认", {selectedPolicy==PERMISSION_POLICY_PROMPT}, {selectedPolicy= PERMISSION_POLICY_PROMPT})
+ RadioButtonItem("自动允许", {selectedPolicy==PERMISSION_POLICY_AUTO_GRANT}, {selectedPolicy= PERMISSION_POLICY_AUTO_GRANT})
+ RadioButtonItem("自动拒绝", {selectedPolicy==PERMISSION_POLICY_AUTO_DENY}, {selectedPolicy= PERMISSION_POLICY_AUTO_DENY})
+ Button(
+ onClick = {
+ myDpm.setPermissionPolicy(myComponent,selectedPolicy)
+ Toast.makeText(myContext, "成功", Toast.LENGTH_SHORT).show()
+ },
+ modifier = Modifier.fillMaxWidth()
+ ) {
+ Text("应用")
+ }
+
+ }
+ }
+
if(VERSION.SDK_INT>=34&&isDeviceOwner(myDpm)){
Column(modifier = sections()){
Text(text = "MTE策略", style = typography.titleLarge, color = colorScheme.onPrimaryContainer)
@@ -352,9 +372,7 @@ fun DeviceControl(){
SysUpdatePolicy()
}
- Column(modifier = sections(if(isSystemInDarkTheme()){
- colorScheme.errorContainer}else{
- 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 = colorScheme.onErrorContainer)
@@ -368,12 +386,8 @@ fun DeviceControl(){
Button(
onClick = {confirmed=!confirmed},
colors = ButtonDefaults.buttonColors(
- containerColor = if(confirmed){
- colorScheme.primary}else{
- colorScheme.error},
- contentColor = if(confirmed){
- colorScheme.onPrimary}else{
- colorScheme.onError}
+ containerColor = if(confirmed){ colorScheme.primary }else{ colorScheme.error },
+ contentColor = if(confirmed){ colorScheme.onPrimary }else{ colorScheme.onError }
),
enabled = myDpm.isAdminActive(myComponent)
) {
diff --git a/app/src/main/java/com/binbin/androidowner/Network.kt b/app/src/main/java/com/binbin/androidowner/Network.kt
index d2ac1fe..154aaa4 100644
--- a/app/src/main/java/com/binbin/androidowner/Network.kt
+++ b/app/src/main/java/com/binbin/androidowner/Network.kt
@@ -2,6 +2,8 @@ package com.binbin.androidowner
import android.app.admin.DevicePolicyManager
import android.app.admin.WifiSsidPolicy
+import android.app.admin.WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_ALLOWLIST
+import android.app.admin.WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_DENYLIST
import android.content.ComponentName
import android.content.Context
import android.net.wifi.WifiSsid
@@ -103,8 +105,8 @@ fun Network(){
var inited by remember{mutableStateOf(false)}
if(!inited){refreshList(); inited=true}
Text(text = "WiFi SSID策略", style = typography.titleLarge)
- RadioButtonItem("白名单",{selectedPolicyType==WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_ALLOWLIST},{selectedPolicyType= WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_ALLOWLIST})
- RadioButtonItem("黑名单",{selectedPolicyType==WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_DENYLIST},{selectedPolicyType= WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_DENYLIST})
+ RadioButtonItem("白名单",{selectedPolicyType==WIFI_SSID_POLICY_TYPE_ALLOWLIST},{selectedPolicyType=WIFI_SSID_POLICY_TYPE_ALLOWLIST})
+ RadioButtonItem("黑名单",{selectedPolicyType==WIFI_SSID_POLICY_TYPE_DENYLIST},{selectedPolicyType=WIFI_SSID_POLICY_TYPE_DENYLIST})
Text("SSID列表:")
Text(text = if(ssidList!=""){ssidList}else{"无"}, style = bodyTextStyle)
TextField(
diff --git a/app/src/main/java/com/binbin/androidowner/Password.kt b/app/src/main/java/com/binbin/androidowner/Password.kt
index 4b4ab70..106a468 100644
--- a/app/src/main/java/com/binbin/androidowner/Password.kt
+++ b/app/src/main/java/com/binbin/androidowner/Password.kt
@@ -106,8 +106,15 @@ fun Password(){
if(isWear){Spacer(Modifier.padding(horizontal = 2.dp))}
Button(
onClick = {
- if(myDpm.setResetPasswordToken(myComponent, myByteArray)){ Toast.makeText(myContext, "设置成功", Toast.LENGTH_SHORT).show()
- }else{ Toast.makeText(myContext, "设置失败", Toast.LENGTH_SHORT).show() }
+ try {
+ if(myDpm.setResetPasswordToken(myComponent, myByteArray)){
+ Toast.makeText(myContext, "成功", Toast.LENGTH_SHORT).show()
+ }else{
+ Toast.makeText(myContext, "失败", Toast.LENGTH_SHORT).show()
+ }
+ }catch(e:SecurityException){
+ Toast.makeText(myContext, "失败(安全异常)", Toast.LENGTH_SHORT).show()
+ }
},
enabled = isDeviceOwner(myDpm),
modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.47F)}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..e708b1c
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..9bbf5ef
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri Jan 12 20:22:20 CST 2024
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists