From 97dde5a43b82045f868ce2764118fd258e36c23d Mon Sep 17 00:00:00 2001 From: BinTianqi <1220958406@qq.com> Date: Sun, 14 Jan 2024 21:46:16 +0800 Subject: [PATCH] Use material themes --- app/build.gradle.kts | 5 +- app/src/main/AndroidManifest.xml | 10 +-- .../binbin/androidowner/ApplicationManage.kt | 51 +++++++++--- .../com/binbin/androidowner/DeviceControl.kt | 24 +++--- .../com/binbin/androidowner/MainActivity.kt | 77 +++++++++++++----- .../com/binbin/androidowner/Permissions.kt | 20 ++++- .../java/com/binbin/androidowner/UIControl.kt | 18 +++-- .../com/binbin/androidowner/UserRestrict.kt | 78 ++++++++++++++----- app/src/main/res/drawable/info_fill0.xml | 9 +++ app/src/main/res/values/strings.xml | 18 +++++ 10 files changed, 236 insertions(+), 74 deletions(-) create mode 100644 app/src/main/res/drawable/info_fill0.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 616ebf7..5713611 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -9,7 +9,7 @@ android { defaultConfig { applicationId = "com.binbin.androidowner" - minSdk = 27 + minSdk = 26 targetSdk = 34 versionCode = 1 versionName = "1.0" @@ -22,7 +22,8 @@ android { buildTypes { release { - isMinifyEnabled = false + isMinifyEnabled = true + isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e1c9ef8..9501555 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ - + + android:enableOnBackInvokedCallback="true" + android:testOnly="true" + tools:targetApi="34"> - - - \ No newline at end of file diff --git a/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt b/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt index e0b86fc..bc0c86e 100644 --- a/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt +++ b/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt @@ -2,7 +2,9 @@ package com.binbin.androidowner import android.app.admin.DevicePolicyManager import android.content.ComponentName +import android.content.pm.PackageManager.NameNotFoundException import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.material3.TextField @@ -11,32 +13,59 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp @Composable fun ApplicationManage(myDpm:DevicePolicyManager, myComponent:ComponentName){ - var pkgName by remember { mutableStateOf("com.mihoyo.yuanshen") } - Column { + var pkgName by remember { mutableStateOf("") } + Column(modifier = Modifier.padding(8.dp)) { + var isAppHidden by remember{ mutableStateOf(false) } + var isAppSuspended by remember{ mutableStateOf(false) } + var isAppUninstallBlock by remember{ mutableStateOf(false) } + var suspendedReply = "" + isAppHidden = try { + myDpm.isApplicationHidden(myComponent,pkgName) + }catch (e:SecurityException){ + false + } + isAppUninstallBlock = try { + myDpm.isUninstallBlocked(myComponent,pkgName) + }catch (e:SecurityException){ + false + } + try{ + isAppSuspended = myDpm.isPackageSuspended(myComponent,pkgName) + }catch(e:NameNotFoundException){ + suspendedReply = "应用不存在!" + isAppSuspended = false + }catch (e:SecurityException){ + suspendedReply = "无权限" + isAppSuspended = false + } Text("以下功能都需要DeviceOwner权限") TextField(value = pkgName, onValueChange = {pkgName = it}, label = { Text("包名") }) - Button(onClick = { myDpm.setApplicationHidden(myComponent,pkgName,true) }) { + Button(onClick = { myDpm.setApplicationHidden(myComponent,pkgName,true); isAppHidden = myDpm.isApplicationHidden(myComponent,pkgName) }) { Text("隐藏") } - Button(onClick = { myDpm.setApplicationHidden(myComponent,pkgName,false) }) { + Button(onClick = { myDpm.setApplicationHidden(myComponent,pkgName,false); isAppHidden = myDpm.isApplicationHidden(myComponent,pkgName) }) { Text("显示") } - val isAppHidden = myDpm.isApplicationHidden(myComponent,pkgName) - Text("应用隐藏:$isAppHidden ${if(isAppHidden==true){"(这个应用也许没有被安装)"}else{""}}") - Button(onClick = {myDpm.setPackagesSuspended(myComponent, arrayOf(pkgName),true)}) { + Text("应用隐藏:$isAppHidden ${if(isAppHidden){"(这个应用也许没有被安装)"}else{""}}") + Button(onClick = {myDpm.setPackagesSuspended(myComponent, arrayOf(pkgName),true); isAppSuspended = myDpm.isPackageSuspended(myComponent,pkgName)}) { Text("停用") } - Button(onClick = {myDpm.setPackagesSuspended(myComponent, arrayOf(pkgName),true)}) { + Button(onClick = {myDpm.setPackagesSuspended(myComponent, arrayOf(pkgName),false); isAppSuspended = myDpm.isPackageSuspended(myComponent,pkgName)}) { Text("启用") } - Button(onClick = { myDpm.setUninstallBlocked(myComponent, pkgName, true) }) { - Text("禁止卸载") + Text("应用停用:$isAppSuspended $suspendedReply") + Text("阻止卸载功能有可能出问题") + Button(onClick = { myDpm.setUninstallBlocked(myComponent, pkgName, true); isAppUninstallBlock = myDpm.isUninstallBlocked(myComponent,pkgName) }) { + Text("阻止卸载") } - Button(onClick = { myDpm.setUninstallBlocked(myComponent, pkgName, false)}) { + Button(onClick = { myDpm.setUninstallBlocked(myComponent, pkgName, false); isAppUninstallBlock = myDpm.isUninstallBlocked(myComponent,pkgName)}) { Text("允许卸载") } + Text("应用防卸载:$isAppUninstallBlock ${if(!isAppUninstallBlock){"(这个应用也许没有被安装)"}else{""}}") } } diff --git a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt index c9c755b..514cfb5 100644 --- a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt +++ b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt @@ -6,6 +6,8 @@ import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Column import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -14,13 +16,13 @@ import androidx.compose.ui.graphics.Color @OptIn(ExperimentalFoundationApi::class) @Composable fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName){ - var wifimac = "Unknown" - val isdo = myDpm.isDeviceOwnerApp("com.binbin.androidowner") - if(isdo){ - wifimac = myDpm.getWifiMacAddress(myComponent).toString() + val wifimac = try { + myDpm.getWifiMacAddress(myComponent).toString() + }catch(e:SecurityException){ + "没有权限" } Column { - Text("WiFi MAC: $wifimac (需要DeviceOwner)") + Text("WiFi MAC: $wifimac") Button(onClick = {myDpm.setCameraDisabled(myComponent, true)}) { Text("禁用相机") } @@ -40,12 +42,16 @@ fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName){ Text("锁屏") } Button( - onClick = {}, - modifier = Modifier.combinedClickable( onClick = {}, - onLongClick = {myDpm.wipeData(0)}) + modifier = Modifier + .combinedClickable(onClick = {}, onLongClick = {myDpm.wipeData(0)}), + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.errorContainer + ) ) { - Text("FACTORY_RESET!!!!! (长按)(未测试)", color = Color.Red) + Text( + text = "FACTORY_RESET!!!!! (长按)(未测试)", + color = MaterialTheme.colorScheme.error) } } } diff --git a/app/src/main/java/com/binbin/androidowner/MainActivity.kt b/app/src/main/java/com/binbin/androidowner/MainActivity.kt index bdaf879..92a5d35 100644 --- a/app/src/main/java/com/binbin/androidowner/MainActivity.kt +++ b/app/src/main/java/com/binbin/androidowner/MainActivity.kt @@ -3,18 +3,32 @@ package com.binbin.androidowner import android.annotation.SuppressLint import android.app.admin.DevicePolicyManager import android.content.ComponentName +import android.content.Context import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable +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.unit.dp import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost @@ -30,7 +44,7 @@ class MainActivity : ComponentActivity() { val adminComponent = ComponentName(context,MyDeviceAdminReceiver::class.java) setContent { AndroidOwnerTheme { - MyScaffold(dpm,adminComponent) + MyScaffold(dpm,adminComponent,context) } } } @@ -39,23 +53,26 @@ class MainActivity : ComponentActivity() { @OptIn(ExperimentalMaterial3Api::class) @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable -fun MyScaffold(mainDpm:DevicePolicyManager, mainComponent:ComponentName){ +fun MyScaffold(mainDpm:DevicePolicyManager, mainComponent:ComponentName, mainContext:Context){ val navCtrl = rememberNavController() Scaffold( topBar = { TopAppBar( - title = { Text("Android Owner")} + title = { Text(text = "Android Owner",color = MaterialTheme.colorScheme.onSurface)}, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.surface + ) ) } ) { NavHost( navController = navCtrl, startDestination = "HomePage", - modifier = Modifier.padding(top = 80.dp) + modifier = Modifier.padding(top = 70.dp) ){ composable(route = "HomePage", content = { HomePage(navCtrl)}) composable(route = "DeviceControl", content = { DeviceControl(mainDpm,mainComponent)}) - composable(route = "Permissions", content = { DpmPermissions(mainDpm,mainComponent)}) + composable(route = "Permissions", content = { DpmPermissions(mainDpm,mainComponent,mainContext)}) composable(route = "UIControl", content = { UIControl(mainDpm,mainComponent)}) composable(route = "ApplicationManage", content = { ApplicationManage(mainDpm,mainComponent)}) composable(route = "UserRestriction", content = { UserRestriction(mainDpm,mainComponent)}) @@ -66,20 +83,42 @@ fun MyScaffold(mainDpm:DevicePolicyManager, mainComponent:ComponentName){ @Composable fun HomePage(navCtrl:NavHostController){ Column { - Button(onClick = {navCtrl.navigate("Permissions")}) { - Text("权限") - } - Button(onClick = {navCtrl.navigate("DeviceControl")}) { - Text("设备控制") - } - Button(onClick = {navCtrl.navigate("UIControl")}) { - Text("UI控制") - } - Button(onClick = {navCtrl.navigate("ApplicationManage")}) { - Text("应用管理") - } - Button(onClick = {navCtrl.navigate("UserRestriction")}) { - Text("用户限制") + HomePageItem(R.string.permission, R.drawable.info_fill0, R.string.permission_desc, "Permissions", navCtrl) + HomePageItem(R.string.device_ctrl, R.drawable.info_fill0, R.string.device_ctrl_desc, "DeviceControl", navCtrl) + HomePageItem(R.string.ui_ctrl, R.drawable.info_fill0, R.string.ui_ctrl_desc, "UIControl", navCtrl) + HomePageItem(R.string.app_manage, R.drawable.info_fill0, R.string.apps_ctrl_description, "ApplicationManage", navCtrl) + HomePageItem(R.string.user_restrict, R.drawable.info_fill0, R.string.user_restrict_desc, "UserRestriction", navCtrl) + } +} + +@Composable +fun HomePageItem(name:Int, imgVector:Int, description:Int, navTo:String, myNav:NavHostController){ + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 5.dp, horizontal = 8.dp) + .clip(RoundedCornerShape(15)) + .background(color = MaterialTheme.colorScheme.primaryContainer) + .clickable(onClick = { myNav.navigate(navTo) }) + .padding(5.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(imgVector), + contentDescription = null, + modifier = Modifier.padding(horizontal = 10.dp), + tint = MaterialTheme.colorScheme.primary + ) + Column { + Text( + text = stringResource(name), + style = MaterialTheme.typography.headlineSmall, + color = MaterialTheme.colorScheme.onPrimaryContainer + ) + Text( + text = stringResource(description), + color = MaterialTheme.colorScheme.onPrimaryContainer + ) } } } diff --git a/app/src/main/java/com/binbin/androidowner/Permissions.kt b/app/src/main/java/com/binbin/androidowner/Permissions.kt index 2048167..44cee00 100644 --- a/app/src/main/java/com/binbin/androidowner/Permissions.kt +++ b/app/src/main/java/com/binbin/androidowner/Permissions.kt @@ -2,21 +2,33 @@ package com.binbin.androidowner import android.app.admin.DevicePolicyManager import android.content.ComponentName +import android.content.Context import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import com.binbin.androidowner.ui.theme.AndroidOwnerTheme +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp + @Composable -fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName){ +fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myContext:Context){ //da:DeviceAdmin do:DeviceOwner val isda = myDpm.isAdminActive(myComponent) val isdo = myDpm.isDeviceOwnerApp("com.binbin.androidowner") - - Column { + Column( + modifier = Modifier.padding(8.dp) + ) { Text("Device Admin: $isda") Text("Device Owner: $isdo") + SelectionContainer { + Column { + Text("设置DeviceAdmin命令:dpm set-active-admin com.binbin.androidowner/com.binbin.androidowner.MyDeviceAdminReceiver") + Text("设置DeviceOwner命令:dpm set-device-owner com.binbin.androidowner/com.binbin.androidowner.MyDeviceAdminReceiver") + } + } Button(onClick = {Runtime.getRuntime().exec("su -c \"dpm set-active-admin com.binbin.androidowner/com.binbin.androidowner.MyDeviceAdminReceiver\"")}) { Text("获取DeviceAdmin(需root,未测试)") } diff --git a/app/src/main/java/com/binbin/androidowner/UIControl.kt b/app/src/main/java/com/binbin/androidowner/UIControl.kt index a9c2eab..2b94e1a 100644 --- a/app/src/main/java/com/binbin/androidowner/UIControl.kt +++ b/app/src/main/java/com/binbin/androidowner/UIControl.kt @@ -2,16 +2,24 @@ package com.binbin.androidowner import android.app.admin.DevicePolicyManager import android.content.ComponentName +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp @Composable fun UIControl(myDpm: DevicePolicyManager, myComponent: ComponentName){ - Button(onClick = {myDpm.setStatusBarDisabled(myComponent,true)}) { - Text("隐藏状态栏") - } - Button(onClick = {myDpm.setStatusBarDisabled(myComponent,false)}) { - Text("显示状态栏") + Column( + modifier = Modifier.padding(8.dp) + ) { + Button(onClick = {myDpm.setStatusBarDisabled(myComponent,true)}) { + Text("隐藏状态栏") + } + Button(onClick = {myDpm.setStatusBarDisabled(myComponent,false)}) { + Text("显示状态栏") + } } } diff --git a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt index a6c154a..3a5b157 100644 --- a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt +++ b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt @@ -3,45 +3,87 @@ package com.binbin.androidowner import android.app.admin.DevicePolicyManager import android.content.ComponentName import android.os.UserManager +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +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.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp @Composable fun UserRestriction(myDpm: DevicePolicyManager, myComponent: ComponentName){ val verticalScrolling = rememberScrollState() Column(modifier = Modifier.verticalScroll(verticalScrolling)) { - UserRestrictionItem(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS,R.string.config_mobile_network,myComponent, myDpm) - UserRestrictionItem(UserManager.DISALLOW_CONFIG_WIFI,R.string.config_wifi,myComponent, myDpm) - UserRestrictionItem(UserManager.DISALLOW_BLUETOOTH,R.string.bluetooth,myComponent, myDpm) - UserRestrictionItem(UserManager.DISALLOW_AIRPLANE_MODE,R.string.airplane_mode,myComponent, myDpm) - UserRestrictionItem(UserManager.DISALLOW_CONFIG_LOCATION,R.string.config_location,myComponent, myDpm) - UserRestrictionItem(UserManager.DISALLOW_DEBUGGING_FEATURES,R.string.debug_features,myComponent, myDpm) - UserRestrictionItem(UserManager.DISALLOW_CREATE_WINDOWS,R.string.create_windows,myComponent, myDpm) + UserRestrictionItem(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS,R.string.config_mobile_network,"",myComponent, myDpm) + UserRestrictionItem(UserManager.DISALLOW_CONFIG_WIFI,R.string.config_wifi,"",myComponent, myDpm) + UserRestrictionItem(UserManager.DISALLOW_BLUETOOTH,R.string.bluetooth,"",myComponent, myDpm) + UserRestrictionItem(UserManager.DISALLOW_AIRPLANE_MODE,R.string.airplane_mode,"",myComponent, myDpm) + UserRestrictionItem(UserManager.DISALLOW_CONFIG_LOCATION,R.string.config_location,"",myComponent, myDpm) + UserRestrictionItem(UserManager.DISALLOW_DEBUGGING_FEATURES,R.string.debug_features,"",myComponent, myDpm) + UserRestrictionItem(UserManager.DISALLOW_CREATE_WINDOWS,R.string.create_windows, stringResource(R.string.create_windows_description),myComponent, myDpm) + UserRestrictionItem(UserManager.DISALLOW_ADJUST_VOLUME,R.string.adjust_volume,"",myComponent, myDpm) + UserRestrictionItem(UserManager.DISALLOW_CONFIG_BRIGHTNESS,R.string.config_brightness,"",myComponent, myDpm) + UserRestrictionItem(UserManager.DISALLOW_INSTALL_APPS,R.string.install_apps,"",myComponent, myDpm) + UserRestrictionItem(UserManager.DISALLOW_SMS,R.string.sms,"",myComponent, myDpm) + UserRestrictionItem(UserManager.DISALLOW_APPS_CONTROL,R.string.apps_ctrl, stringResource(R.string.apps_ctrl_description),myComponent, myDpm) } } @Composable -private fun UserRestrictionItem(restriction:String, itemName:Int, myComponent: ComponentName, myDpm: DevicePolicyManager){ - val strictState = myDpm.getUserRestrictions(myComponent) - val currentState = stringResource(R.string.is_disallow)+strictState.getBoolean("no_create_windows").toString() - Column{ +private fun UserRestrictionItem(restriction:String, itemName:Int, restrictionDescription:String, myComponent: ComponentName, myDpm: DevicePolicyManager){ + var strictState by remember{ mutableStateOf(myDpm.getUserRestrictions(myComponent).getBoolean(restriction)) } + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 5.dp, horizontal = 8.dp) + .clip(RoundedCornerShape(10)) + .background(color = MaterialTheme.colorScheme.secondaryContainer) + .padding(5.dp) + ){ Text( text = stringResource(itemName), - style = MaterialTheme.typography.headlineSmall + style = MaterialTheme.typography.titleLarge ) - Text(text = currentState) - Button(onClick = {myDpm.clearUserRestriction(myComponent,restriction)}) { - Text(stringResource(R.string.disallow)) - } - Button(onClick = {myDpm.addUserRestriction(myComponent,restriction)}) { - Text(text = stringResource(R.string.allow)) + if(restrictionDescription!=""){Text(restrictionDescription)} + Text(text = "禁止:$strictState") + Row { + Button( + onClick = { + myDpm.clearUserRestriction(myComponent,restriction) + strictState = myDpm.getUserRestrictions(myComponent).getBoolean(restriction) + }, + modifier = Modifier.padding(3.dp) + ) { + Text(stringResource(R.string.allow)) + } + Button( + onClick = { + myDpm.addUserRestriction(myComponent,restriction) + strictState = myDpm.getUserRestrictions(myComponent).getBoolean(restriction) + }, + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.errorContainer, + contentColor = MaterialTheme.colorScheme.error + ) , + modifier = Modifier.padding(2.dp) + ) { + Text(text = stringResource(R.string.disallow)) + } } } } diff --git a/app/src/main/res/drawable/info_fill0.xml b/app/src/main/res/drawable/info_fill0.xml new file mode 100644 index 0000000..0f103e3 --- /dev/null +++ b/app/src/main/res/drawable/info_fill0.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 711a514..02a53b3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,4 +10,22 @@ 允许 禁止 是否禁止: + 调整音量 + 调整亮度(需安卓9) + 安装应用 + 短信 + 控制应用 + 包括清空存储空间、清空缓存 + 包括Toast和浮动通知 + 权限 + 设备控制 + UI控制 + 应用管理 + 用户限制 + + 授权与取消授权DeviceAdmin或DeviceOwner + 控制一些软件、硬件 + 目前没啥功能 + 非DeviceOwner勿入 + 限制一些功能 \ No newline at end of file