mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-23 11:05:59 +00:00
257 lines
11 KiB
Kotlin
257 lines
11 KiB
Kotlin
package com.binbin.androidowner
|
|
|
|
import android.app.admin.DevicePolicyManager
|
|
import android.content.ComponentName
|
|
import android.content.Context
|
|
import android.os.Build.VERSION
|
|
import android.widget.Toast
|
|
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.navigationBarsPadding
|
|
import androidx.compose.foundation.layout.padding
|
|
import androidx.compose.foundation.rememberScrollState
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
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.RadioButton
|
|
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.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.draw.clip
|
|
import androidx.compose.ui.res.painterResource
|
|
import androidx.compose.ui.res.stringResource
|
|
import androidx.compose.ui.text.style.TextAlign
|
|
import androidx.compose.ui.unit.dp
|
|
|
|
@Composable
|
|
fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName,myContext: Context){
|
|
Column(
|
|
modifier = Modifier
|
|
.verticalScroll(rememberScrollState())
|
|
.padding(bottom = 20.dp)
|
|
.navigationBarsPadding()
|
|
) {
|
|
DeviceCtrlItem(R.string.disable_cam,R.string.place_holder, R.drawable.photo_camera_fill0,myDpm,{myDpm.getCameraDisabled(null)},{b -> myDpm.setCameraDisabled(myComponent,b)})
|
|
DeviceCtrlItem(R.string.disable_scrcap,R.string.aosp_scrrec_also_work,R.drawable.screenshot_fill0,myDpm,{myDpm.getScreenCaptureDisabled(null)},{b -> myDpm.setScreenCaptureDisabled(myComponent,b) })
|
|
if(VERSION.SDK_INT>=34){
|
|
DeviceCtrlItem(R.string.hide_status_bar,R.string.may_hide_notifi_icon_only,R.drawable.notifications_fill0,myDpm,{myDpm.isStatusBarDisabled},{b -> myDpm.setStatusBarDisabled(myComponent,b) })
|
|
}
|
|
if(VERSION.SDK_INT>=30){
|
|
DeviceCtrlItem(R.string.auto_time,R.string.place_holder,R.drawable.schedule_fill0,myDpm,{myDpm.getAutoTimeEnabled(myComponent)},{b -> myDpm.setAutoTimeEnabled(myComponent,b) })
|
|
DeviceCtrlItem(R.string.auto_timezone,R.string.place_holder,R.drawable.globe_fill0,myDpm,{myDpm.getAutoTimeZoneEnabled(myComponent)},{b -> myDpm.setAutoTimeZoneEnabled(myComponent,b) })
|
|
}
|
|
DeviceCtrlItem(R.string.master_mute,R.string.place_holder,R.drawable.volume_up_fill0,myDpm,{myDpm.isMasterVolumeMuted(myComponent)},{b -> myDpm.setMasterVolumeMuted(myComponent,b) })
|
|
if(VERSION.SDK_INT>=26){
|
|
DeviceCtrlItem(R.string.backup_service,R.string.place_holder,R.drawable.backup_fill0,myDpm,{myDpm.isBackupServiceEnabled(myComponent)},{b -> myDpm.setBackupServiceEnabled(myComponent,b) })
|
|
}
|
|
DeviceCtrlItem(R.string.disable_bt_contact_share,R.string.place_holder,R.drawable.account_circle_fill0,myDpm,{myDpm.getBluetoothContactSharingDisabled(myComponent)},{b -> myDpm.setBluetoothContactSharingDisabled(myComponent,b)})
|
|
if(VERSION.SDK_INT>=31){
|
|
if(myDpm.canUsbDataSignalingBeDisabled()){
|
|
DeviceCtrlItem(R.string.usb_signal,R.string.place_holder,R.drawable.usb_fill0,myDpm,{myDpm.isUsbDataSignalingEnabled},{b -> myDpm.isUsbDataSignalingEnabled = b })
|
|
}else{
|
|
Text("你的设备不支持关闭USB信号")
|
|
}
|
|
}
|
|
Row(
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.padding(horizontal = 6.dp, vertical = 4.dp)
|
|
.clip(RoundedCornerShape(15))
|
|
.background(color = MaterialTheme.colorScheme.primaryContainer)
|
|
.padding(vertical = 5.dp),
|
|
horizontalArrangement = Arrangement.SpaceEvenly
|
|
) {
|
|
Button(
|
|
onClick = {
|
|
if(myDpm.setKeyguardDisabled(myComponent,true)){
|
|
Toast.makeText(myContext, "成功", Toast.LENGTH_SHORT).show()
|
|
}else{
|
|
Toast.makeText(myContext, "失败", Toast.LENGTH_SHORT).show()
|
|
}
|
|
},
|
|
enabled = isDeviceOwner(myDpm)
|
|
) {
|
|
Text("禁用锁屏(需无密码)")
|
|
}
|
|
Spacer(Modifier.padding(horizontal = 5.dp))
|
|
Button(
|
|
onClick = {
|
|
if(myDpm.setKeyguardDisabled(myComponent,false)){
|
|
Toast.makeText(myContext, "成功", Toast.LENGTH_SHORT).show()
|
|
}else{
|
|
Toast.makeText(myContext, "失败", Toast.LENGTH_SHORT).show()
|
|
}
|
|
},
|
|
enabled = isDeviceOwner(myDpm)
|
|
) {
|
|
Text("启用锁屏")
|
|
}
|
|
}
|
|
Row(
|
|
horizontalArrangement = Arrangement.SpaceAround,
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.padding(vertical = 4.dp, horizontal = 6.dp)
|
|
.clip(RoundedCornerShape(15))
|
|
.background(color = MaterialTheme.colorScheme.primaryContainer)
|
|
.padding(vertical = 4.dp),
|
|
) {
|
|
if(VERSION.SDK_INT>=24){
|
|
Button(onClick = {myDpm.reboot(myComponent)}, enabled = isDeviceOwner(myDpm)) {
|
|
Text("重启")
|
|
}
|
|
Button(onClick = {myDpm.lockNow()}, enabled = myDpm.isAdminActive(myComponent)) {
|
|
Text("锁屏")
|
|
}
|
|
}
|
|
}
|
|
if(VERSION.SDK_INT>=24){
|
|
val wifimac = try {
|
|
myDpm.getWifiMacAddress(myComponent).toString()
|
|
}catch(e:SecurityException){
|
|
"没有权限"
|
|
}
|
|
Text(text = "WiFi MAC: $wifimac",modifier=Modifier.fillMaxWidth(), textAlign = TextAlign.Center)
|
|
}
|
|
if(VERSION.SDK_INT<24){
|
|
Text("重启和WiFi Mac需要API24")
|
|
}
|
|
if(VERSION.SDK_INT<26){
|
|
Text("备份服务需要API26")
|
|
}
|
|
if(VERSION.SDK_INT<30){
|
|
Text("自动设置时间和自动设置时区需要API30")
|
|
}
|
|
if(VERSION.SDK_INT<31){Text("关闭USB信号需API31")}
|
|
if(VERSION.SDK_INT<34){
|
|
Text("隐藏状态栏需要API34")
|
|
}
|
|
Button(onClick = {myDpm.uninstallAllUserCaCerts(myComponent)},modifier = Modifier.align(Alignment.CenterHorizontally), enabled = isDeviceOwner(myDpm)) {
|
|
Text(text = "清除用户Ca证书")
|
|
}
|
|
SysUpdatePolicy(myDpm,myComponent,myContext)
|
|
Column(
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.padding(horizontal = 6.dp)
|
|
.clip(RoundedCornerShape(16.dp))
|
|
.background(color = MaterialTheme.colorScheme.errorContainer)
|
|
.padding(8.dp)
|
|
) {
|
|
var flag by remember{ mutableIntStateOf(0) }
|
|
var confirmed by remember{ mutableStateOf(false) }
|
|
Text(text = "清除数据",style = MaterialTheme.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("清空数据的不能是系统用户")
|
|
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}
|
|
),
|
|
enabled = isDeviceOwner(myDpm)
|
|
) {
|
|
Text(text = if(confirmed){"取消"}else{"确定"})
|
|
}
|
|
Row {
|
|
Button(
|
|
onClick = {myDpm.wipeData(flag)},
|
|
colors = ButtonDefaults.buttonColors(
|
|
containerColor = MaterialTheme.colorScheme.error,
|
|
contentColor = MaterialTheme.colorScheme.onError
|
|
),
|
|
enabled = confirmed
|
|
) {
|
|
Text("WipeData")
|
|
}
|
|
Spacer(Modifier.padding(horizontal = 5.dp))
|
|
if (VERSION.SDK_INT >= 34) {
|
|
Button(
|
|
onClick = {myDpm.wipeDevice(flag)},
|
|
colors = ButtonDefaults.buttonColors(
|
|
containerColor = MaterialTheme.colorScheme.error,
|
|
contentColor = MaterialTheme.colorScheme.onError
|
|
),
|
|
enabled = confirmed
|
|
) {
|
|
Text("WipeDevice(API34)")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Spacer(Modifier.padding(vertical = 20.dp))
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
private fun DeviceCtrlItem(
|
|
itemName:Int,
|
|
itemDesc:Int,
|
|
leadIcon:Int,
|
|
myDpm: DevicePolicyManager,
|
|
getMethod:()->Boolean,
|
|
setMethod:(b:Boolean)->Unit
|
|
){
|
|
var isEnabled by remember{ mutableStateOf(false) }
|
|
Row(
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.padding(horizontal = 6.dp, vertical = 4.dp)
|
|
.clip(RoundedCornerShape(15))
|
|
.background(color = MaterialTheme.colorScheme.primaryContainer)
|
|
.padding(8.dp),
|
|
horizontalArrangement = Arrangement.SpaceBetween,
|
|
verticalAlignment = Alignment.CenterVertically
|
|
) {
|
|
Row(
|
|
verticalAlignment = Alignment.CenterVertically
|
|
){
|
|
Icon(
|
|
painter = painterResource(leadIcon),
|
|
contentDescription = null,
|
|
tint = MaterialTheme.colorScheme.onPrimaryContainer,
|
|
modifier = Modifier.padding(start = 5.dp, end = 9.dp)
|
|
)
|
|
Column {
|
|
Text(
|
|
text = stringResource(itemName),
|
|
style = MaterialTheme.typography.titleLarge
|
|
)
|
|
if(itemDesc!=R.string.place_holder){
|
|
Text(stringResource(itemDesc))
|
|
}
|
|
}
|
|
}
|
|
if(isDeviceOwner(myDpm)){
|
|
isEnabled = getMethod()
|
|
}
|
|
Switch(
|
|
checked = isEnabled,
|
|
onCheckedChange = {
|
|
setMethod(!isEnabled)
|
|
isEnabled=getMethod()
|
|
},
|
|
enabled = isDeviceOwner(myDpm)
|
|
)
|
|
}
|
|
}
|