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