mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-23 11:05:59 +00:00
some bugfix
This commit is contained in:
@@ -13,6 +13,7 @@ import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.compose.foundation.*
|
||||
import androidx.compose.foundation.gestures.detectTapGestures
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
@@ -25,7 +26,9 @@ import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.input.pointer.pointerInput
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalFocusManager
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
@@ -75,6 +78,7 @@ fun MyScaffold(){
|
||||
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
|
||||
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
|
||||
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
|
||||
val focusMgr = LocalFocusManager.current
|
||||
NavHost(
|
||||
navController = navCtrl,
|
||||
startDestination = "HomePage",
|
||||
@@ -82,7 +86,8 @@ fun MyScaffold(){
|
||||
.statusBarsPadding()
|
||||
.fillMaxSize()
|
||||
.background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) })
|
||||
.imePadding(),
|
||||
.imePadding()
|
||||
.pointerInput(Unit) {detectTapGestures(onTap = {focusMgr.clearFocus()})},
|
||||
enterTransition = Animations().navHostEnterTransition,
|
||||
exitTransition = Animations().navHostExitTransition,
|
||||
popEnterTransition = Animations().navHostPopEnterTransition,
|
||||
@@ -200,20 +205,3 @@ fun HomePageItem(name:Int, imgVector:Int, navTo:String, myNav:NavHostController)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@SuppressLint("ModifierFactoryExtensionFunction", "ComposableModifierFactory")
|
||||
@Composable
|
||||
@Stable
|
||||
fun sections(bgColor:Color=colorScheme.primaryContainer,onClick:()->Unit={},clickable:Boolean=false):Modifier{
|
||||
val backgroundColor = if(isSystemInDarkTheme()){bgColor.copy(0.3F)}else{bgColor.copy(0.8F)}
|
||||
return Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(horizontal = 8.dp, vertical = 4.dp)
|
||||
.clip(RoundedCornerShape(14.dp))
|
||||
.clickable(onClick=onClick, enabled = clickable)
|
||||
.background(color = backgroundColor)
|
||||
.padding(vertical = 10.dp, horizontal = 10.dp)
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ package com.binbin.androidowner
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Build.VERSION
|
||||
import androidx.compose.foundation.*
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.material3.*
|
||||
@@ -22,7 +21,6 @@ import androidx.navigation.compose.NavHost
|
||||
import androidx.navigation.compose.composable
|
||||
import androidx.navigation.compose.currentBackStackEntryAsState
|
||||
import androidx.navigation.compose.rememberNavController
|
||||
import com.binbin.androidowner.dpm.*
|
||||
import com.binbin.androidowner.ui.Animations
|
||||
import com.binbin.androidowner.ui.NavIcon
|
||||
import com.binbin.androidowner.ui.SubPageItem
|
||||
|
||||
@@ -18,7 +18,6 @@ import androidx.compose.material3.*
|
||||
import androidx.compose.material3.MaterialTheme.colorScheme
|
||||
import androidx.compose.material3.MaterialTheme.typography
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalFocusManager
|
||||
|
||||
@@ -19,7 +19,6 @@ import androidx.compose.material3.*
|
||||
import androidx.compose.material3.MaterialTheme.colorScheme
|
||||
import androidx.compose.material3.MaterialTheme.typography
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalFocusManager
|
||||
|
||||
@@ -19,7 +19,8 @@ import androidx.compose.material3.MaterialTheme.colorScheme
|
||||
import androidx.compose.material3.MaterialTheme.typography
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.focus.FocusDirection
|
||||
import androidx.compose.ui.focus.FocusRequester
|
||||
import androidx.compose.ui.focus.focusRequester
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalFocusManager
|
||||
import androidx.compose.ui.res.stringResource
|
||||
@@ -32,9 +33,12 @@ import androidx.navigation.compose.composable
|
||||
import androidx.navigation.compose.currentBackStackEntryAsState
|
||||
import androidx.navigation.compose.rememberNavController
|
||||
import com.binbin.androidowner.R
|
||||
import com.binbin.androidowner.ui.Animations
|
||||
import com.binbin.androidowner.ui.Information
|
||||
import com.binbin.androidowner.ui.NavIcon
|
||||
import com.binbin.androidowner.ui.SubPageItem
|
||||
import com.binbin.androidowner.ui.Animations
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -76,9 +80,9 @@ fun DpmPermissions(navCtrl:NavHostController){
|
||||
){
|
||||
composable(route = "Home"){Home(localNavCtrl)}
|
||||
composable(route = "Shizuku"){ShizukuActivate()}
|
||||
composable(route = "DeviceAdmin"){DeviceAdmin()}
|
||||
composable(route = "DeviceAdmin"){DeviceAdmin(navCtrl)}
|
||||
composable(route = "ProfileOwner"){ProfileOwner()}
|
||||
composable(route = "DeviceOwner"){DeviceOwner()}
|
||||
composable(route = "DeviceOwner"){DeviceOwner(navCtrl)}
|
||||
composable(route = "DeviceInfo"){DeviceInfo()}
|
||||
composable(route = "SpecificID"){SpecificID()}
|
||||
composable(route = "OrgName"){OrgName()}
|
||||
@@ -173,10 +177,11 @@ private fun LockScreenInfo(){
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun DeviceAdmin(){
|
||||
private fun DeviceAdmin(navCtrl: NavHostController){
|
||||
val myContext = LocalContext.current
|
||||
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
|
||||
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
|
||||
val co = rememberCoroutineScope()
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
|
||||
Spacer(Modifier.padding(vertical = 10.dp))
|
||||
Text(text = stringResource(R.string.device_admin), style = typography.headlineLarge)
|
||||
@@ -184,7 +189,13 @@ private fun DeviceAdmin(){
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
if(myDpm.isAdminActive(myComponent)) {
|
||||
if(!isDeviceOwner(myDpm)&&!isProfileOwner(myDpm)) {
|
||||
Button(onClick = {myDpm.removeActiveAdmin(myComponent)}, modifier = Modifier.fillMaxWidth()) {
|
||||
Button(
|
||||
onClick = {
|
||||
myDpm.removeActiveAdmin(myComponent)
|
||||
co.launch{ delay(600); if(!myDpm.isAdminActive(myComponent)){navCtrl.navigateUp()} }
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
Text(stringResource(R.string.deactivate))
|
||||
}
|
||||
}
|
||||
@@ -226,16 +237,23 @@ private fun ProfileOwner(){
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun DeviceOwner(){
|
||||
private fun DeviceOwner(navCtrl: NavHostController){
|
||||
val myContext = LocalContext.current
|
||||
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
|
||||
val co = rememberCoroutineScope()
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
|
||||
Spacer(Modifier.padding(vertical = 10.dp))
|
||||
Text(text = stringResource(R.string.device_owner), style = typography.headlineLarge)
|
||||
Text(text = stringResource(if(isDeviceOwner(myDpm)){R.string.activated}else{R.string.deactivated}), style = typography.titleLarge)
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
if(isDeviceOwner(myDpm)){
|
||||
Button(onClick = {myDpm.clearDeviceOwnerApp(myContext.packageName)}, modifier = Modifier.fillMaxWidth()) {
|
||||
Button(
|
||||
onClick = {
|
||||
myDpm.clearDeviceOwnerApp(myContext.packageName)
|
||||
co.launch{ delay(600); if(!isDeviceOwner(myDpm)){navCtrl.navigateUp()} }
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
Text(text = stringResource(R.string.deactivate))
|
||||
}
|
||||
}
|
||||
@@ -359,60 +377,46 @@ private fun SupportMsg(){
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
|
||||
Spacer(Modifier.padding(vertical = 10.dp))
|
||||
Text(text = stringResource(R.string.short_support_msg), style = typography.headlineLarge)
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
OutlinedTextField(
|
||||
value = shortMsg,
|
||||
label = {Text(stringResource(R.string.message))},
|
||||
label = {Text(stringResource(R.string.short_support_msg))},
|
||||
onValueChange = { shortMsg=it },
|
||||
modifier = Modifier.focusable().fillMaxWidth().padding(vertical = 4.dp)
|
||||
modifier = Modifier.focusable().fillMaxWidth()
|
||||
)
|
||||
Button(
|
||||
onClick = {
|
||||
focusMgr.clearFocus()
|
||||
myDpm.setShortSupportMessage(myComponent,shortMsg)
|
||||
Toast.makeText(myContext, myContext.getString(R.string.success), Toast.LENGTH_SHORT).show()
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
Text(text = stringResource(R.string.apply))
|
||||
}
|
||||
Button(
|
||||
onClick = {
|
||||
focusMgr.clearFocus()
|
||||
myDpm.setShortSupportMessage(myComponent,null)
|
||||
Toast.makeText(myContext, myContext.getString(R.string.success), Toast.LENGTH_SHORT).show()
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
Text(text = stringResource(R.string.reset))
|
||||
}
|
||||
Spacer(Modifier.padding(vertical = 10.dp))
|
||||
Text(text = stringResource(R.string.long_support_msg), style = typography.headlineLarge)
|
||||
Spacer(Modifier.padding(vertical = 2.dp))
|
||||
OutlinedTextField(
|
||||
value = longMsg,
|
||||
label = {Text(stringResource(R.string.message))},
|
||||
label = {Text(stringResource(R.string.long_support_msg))},
|
||||
onValueChange = { longMsg=it },
|
||||
modifier = Modifier.focusable().fillMaxWidth().padding(vertical = 4.dp)
|
||||
modifier = Modifier.focusable().fillMaxWidth()
|
||||
)
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
Button(
|
||||
onClick = {
|
||||
focusMgr.clearFocus()
|
||||
myDpm.setLongSupportMessage(myComponent,longMsg)
|
||||
myDpm.setShortSupportMessage(myComponent, shortMsg)
|
||||
myDpm.setLongSupportMessage(myComponent, longMsg)
|
||||
Toast.makeText(myContext, myContext.getString(R.string.success), Toast.LENGTH_SHORT).show()
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
Text(text = stringResource(R.string.apply))
|
||||
}
|
||||
Spacer(Modifier.padding(vertical = 1.dp))
|
||||
Button(
|
||||
onClick = {
|
||||
focusMgr.clearFocus()
|
||||
myDpm.setLongSupportMessage(myComponent,null)
|
||||
myDpm.setShortSupportMessage(myComponent, null)
|
||||
myDpm.setLongSupportMessage(myComponent, null)
|
||||
Toast.makeText(myContext, myContext.getString(R.string.success), Toast.LENGTH_SHORT).show()
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
Text(text = stringResource(R.string.reset))
|
||||
}
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
Information{Text(text = stringResource(R.string.support_msg_desc))}
|
||||
Spacer(Modifier.padding(vertical = 30.dp))
|
||||
}
|
||||
}
|
||||
@@ -477,6 +481,7 @@ private fun TransformOwnership(){
|
||||
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
|
||||
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
|
||||
val focusMgr = LocalFocusManager.current
|
||||
val focusRequester = FocusRequester()
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
|
||||
var pkg by remember{mutableStateOf("")}
|
||||
var cls by remember{mutableStateOf("")}
|
||||
@@ -484,18 +489,21 @@ private fun TransformOwnership(){
|
||||
Text(text = stringResource(R.string.transform_ownership), style = typography.headlineLarge)
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
Text(text = stringResource(R.string.transform_ownership_desc))
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
OutlinedTextField(
|
||||
value = pkg, onValueChange = {pkg = it}, label = {Text(stringResource(R.string.target_package_name))},
|
||||
modifier = Modifier.focusable().fillMaxWidth().padding(vertical = 4.dp),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
|
||||
keyboardActions = KeyboardActions(onNext = {focusMgr.moveFocus(FocusDirection.Down)})
|
||||
keyboardActions = KeyboardActions(onNext = {focusRequester.requestFocus()})
|
||||
)
|
||||
Spacer(Modifier.padding(vertical = 2.dp))
|
||||
OutlinedTextField(
|
||||
value = cls, onValueChange = {cls = it}, label = {Text(stringResource(R.string.target_class_name))},
|
||||
modifier = Modifier.focusable().fillMaxWidth().padding(vertical = 4.dp),
|
||||
modifier = Modifier.focusRequester(focusRequester).fillMaxWidth(),
|
||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
|
||||
keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus()})
|
||||
)
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
Button(
|
||||
onClick = {
|
||||
try {
|
||||
@@ -505,7 +513,7 @@ private fun TransformOwnership(){
|
||||
Toast.makeText(myContext, myContext.getString(R.string.fail), Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth().padding(top = 2.dp)
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
Text(stringResource(R.string.transform))
|
||||
}
|
||||
|
||||
@@ -56,7 +56,10 @@ fun ShizukuActivate(){
|
||||
val coScope = rememberCoroutineScope()
|
||||
val scrollState = rememberScrollState()
|
||||
val outputTextScrollState = rememberScrollState()
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(scrollState), horizontalAlignment = Alignment.CenterHorizontally){
|
||||
Column(
|
||||
modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(scrollState),
|
||||
horizontalAlignment = Alignment.CenterHorizontally
|
||||
){
|
||||
var outputText by remember{mutableStateOf("")}
|
||||
if(Binder.getCallingUid()/100000!=0){
|
||||
Row{
|
||||
@@ -64,7 +67,6 @@ fun ShizukuActivate(){
|
||||
Text(text = stringResource(R.string.not_primary_user_not_support_shizuku), style = bodyTextStyle, color = colorScheme.onErrorContainer)
|
||||
}
|
||||
}
|
||||
|
||||
Button(
|
||||
onClick = {
|
||||
coScope.launch {
|
||||
@@ -86,10 +88,21 @@ fun ShizukuActivate(){
|
||||
Text(text = stringResource(R.string.check_shizuku))
|
||||
}
|
||||
|
||||
Button(
|
||||
onClick = {
|
||||
coScope.launch{
|
||||
outputText=executeCommand(myContext, "sh rish.sh","dpm list-owners",null,filesDir)
|
||||
scrollState.animateScrollTo(scrollState.maxValue, scrollAnim())
|
||||
outputTextScrollState.animateScrollTo(0, scrollAnim())
|
||||
}
|
||||
}
|
||||
) {
|
||||
Text(text = stringResource(R.string.list_owners))
|
||||
}
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
|
||||
if(!isDeviceOwner(myDpm)&&!isProfileOwner(myDpm)){
|
||||
Column {
|
||||
Text(text = stringResource(R.string.activate), style = typography.titleLarge, color = colorScheme.onPrimaryContainer)
|
||||
|
||||
if(!myDpm.isAdminActive(myComponent)){
|
||||
Button(
|
||||
onClick = {
|
||||
@@ -100,7 +113,7 @@ fun ShizukuActivate(){
|
||||
}
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth()) {
|
||||
Text(text = "Device admin")
|
||||
Text(text = stringResource(R.string.activate_device_admin))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,7 +126,7 @@ fun ShizukuActivate(){
|
||||
}
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth()) {
|
||||
Text(text = "Profile owner")
|
||||
Text(text = stringResource(R.string.activate_profile_owner))
|
||||
}
|
||||
|
||||
Button(
|
||||
@@ -125,13 +138,16 @@ fun ShizukuActivate(){
|
||||
}
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth()) {
|
||||
Text(text = "Device owner")
|
||||
Text(text = stringResource(R.string.activate_device_owner))
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(VERSION.SDK_INT>=30&&!isDeviceOwner(myDpm)&&!myDpm.isProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE)&&!myDpm.isOrganizationOwnedDeviceWithManagedProfile){
|
||||
if(
|
||||
VERSION.SDK_INT>=30&&!isDeviceOwner(myDpm)&&!myDpm.isProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE)&&
|
||||
!myDpm.isOrganizationOwnedDeviceWithManagedProfile
|
||||
){
|
||||
Column {
|
||||
Text(text = stringResource(R.string.org_owned_work_profile), style = typography.titleLarge, color = colorScheme.onPrimaryContainer)
|
||||
Text(text = stringResource(R.string.input_userid_of_work_profile), style = bodyTextStyle)
|
||||
@@ -165,18 +181,6 @@ fun ShizukuActivate(){
|
||||
}
|
||||
}
|
||||
|
||||
Button(
|
||||
onClick = {
|
||||
coScope.launch{
|
||||
outputText=executeCommand(myContext, "sh rish.sh","dpm list-owners",null,filesDir)
|
||||
scrollState.animateScrollTo(scrollState.maxValue, scrollAnim())
|
||||
outputTextScrollState.animateScrollTo(0, scrollAnim())
|
||||
}
|
||||
}
|
||||
) {
|
||||
Text(text = stringResource(R.string.list_owners))
|
||||
}
|
||||
|
||||
SelectionContainer(modifier = Modifier.align(Alignment.Start).horizontalScroll(outputTextScrollState)){
|
||||
Text(text = outputText, style = bodyTextStyle, softWrap = false, modifier = Modifier.padding(4.dp))
|
||||
}
|
||||
|
||||
@@ -144,6 +144,7 @@ private fun Home(navCtrl: NavHostController){
|
||||
}
|
||||
SubPageItem(R.string.wipe_data,""){navCtrl.navigate("WipeData")}
|
||||
Spacer(Modifier.padding(vertical = 30.dp))
|
||||
LaunchedEffect(Unit){caCert=byteArrayOf()}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -594,7 +595,7 @@ private fun CaCert(){
|
||||
isEmpty = caCert.isEmpty()
|
||||
exist = if(!isEmpty){ myDpm.hasCaCertInstalled(myComponent, caCert) }else{ false }
|
||||
}
|
||||
LaunchedEffect(exist){ caCert=byteArrayOf(); while(true){ refresh();delay(600) } }
|
||||
LaunchedEffect(exist){ while(true){ refresh();delay(600) } }
|
||||
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
|
||||
Spacer(Modifier.padding(vertical = 10.dp))
|
||||
Text(text = stringResource(R.string.ca_cert), style = typography.headlineLarge)
|
||||
|
||||
@@ -158,7 +158,7 @@ private fun UserOperation(){
|
||||
var userHandleById:UserHandle by remember{ mutableStateOf(Process.myUserHandle()) }
|
||||
var useUid by remember{ mutableStateOf(false) }
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
TextField(
|
||||
OutlinedTextField(
|
||||
value = idInput,
|
||||
onValueChange = {
|
||||
idInput=it
|
||||
@@ -271,7 +271,7 @@ private fun CreateUser(){
|
||||
Spacer(Modifier.padding(vertical = 10.dp))
|
||||
Text(text = stringResource(R.string.create_user), style = typography.headlineLarge)
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
TextField(
|
||||
OutlinedTextField(
|
||||
value = userName,
|
||||
onValueChange = {userName=it},
|
||||
label = {Text(stringResource(R.string.username))},
|
||||
@@ -331,7 +331,7 @@ private fun AffiliationID(){
|
||||
Text(text = stringResource(R.string.none))
|
||||
}
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
TextField(
|
||||
OutlinedTextField(
|
||||
value = input,
|
||||
onValueChange = {input = it},
|
||||
label = {Text("ID")},
|
||||
@@ -388,7 +388,7 @@ private fun Username(){
|
||||
Spacer(Modifier.padding(vertical = 10.dp))
|
||||
Text(text = stringResource(R.string.edit_username), style = typography.headlineLarge)
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
TextField(
|
||||
OutlinedTextField(
|
||||
value = inputUsername,
|
||||
onValueChange = {inputUsername=it},
|
||||
label = {Text(stringResource(R.string.username))},
|
||||
@@ -427,13 +427,15 @@ private fun UserSessionMessage(){
|
||||
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
|
||||
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
|
||||
val focusMgr = LocalFocusManager.current
|
||||
var start by remember{mutableStateOf(myDpm.getStartUserSessionMessage(myComponent).toString())}
|
||||
var end by remember{mutableStateOf(myDpm.getEndUserSessionMessage(myComponent).toString())}
|
||||
val getStart = myDpm.getStartUserSessionMessage(myComponent)?:""
|
||||
val getEnd = myDpm.getEndUserSessionMessage(myComponent)?:""
|
||||
var start by remember{mutableStateOf(getStart.toString())}
|
||||
var end by remember{mutableStateOf(getEnd.toString())}
|
||||
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
|
||||
Spacer(Modifier.padding(vertical = 10.dp))
|
||||
Text(text = stringResource(R.string.user_session_msg), style = typography.headlineLarge)
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
TextField(
|
||||
OutlinedTextField(
|
||||
value = start,
|
||||
onValueChange = {start=it},
|
||||
label = {Text(stringResource(R.string.start_user_session_msg))},
|
||||
@@ -442,8 +444,8 @@ private fun UserSessionMessage(){
|
||||
modifier = Modifier.focusable().fillMaxWidth(),
|
||||
enabled = isDeviceOwner(myDpm)||isProfileOwner(myDpm)
|
||||
)
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
TextField(
|
||||
Spacer(Modifier.padding(vertical = 2.dp))
|
||||
OutlinedTextField(
|
||||
value = end,
|
||||
onValueChange = {end=it},
|
||||
label = {Text(stringResource(R.string.end_user_session_msg))},
|
||||
|
||||
@@ -287,19 +287,19 @@ private class RestrictionData{
|
||||
if(VERSION.SDK_INT>=26){ list += Restriction(UserManager.DISALLOW_AUTOFILL,R.string.autofill, "",R.drawable.password_fill0) }
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_CREDENTIALS,R.string.config_credentials,"",R.drawable.android_fill0)
|
||||
if(VERSION.SDK_INT>=29){
|
||||
list += Restriction(UserManager.DISALLOW_CONTENT_CAPTURE,R.string.content_capture,"",R.drawable.android_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONTENT_SUGGESTIONS,R.string.content_suggestions,"",R.drawable.android_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONTENT_CAPTURE,R.string.content_capture,"",R.drawable.screenshot_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONTENT_SUGGESTIONS,R.string.content_suggestions,"",R.drawable.sms_fill0)
|
||||
}
|
||||
list += Restriction(UserManager.DISALLOW_CREATE_WINDOWS,R.string.create_windows, myContext.getString(R.string.create_windows_desc),R.drawable.web_asset)
|
||||
if(VERSION.SDK_INT>=24){list += Restriction(UserManager.DISALLOW_SET_WALLPAPER,R.string.set_wallpaper,"",R.drawable.wallpaper_fill0)}
|
||||
if(VERSION.SDK_INT>=34){ list += Restriction(UserManager.DISALLOW_GRANT_ADMIN,R.string.grant_admin,"",R.drawable.android_fill0) }
|
||||
if(VERSION.SDK_INT>=34){ list += Restriction(UserManager.DISALLOW_GRANT_ADMIN,R.string.grant_admin,"",R.drawable.security_fill0) }
|
||||
if(VERSION.SDK_INT>=23){ list += Restriction(UserManager.DISALLOW_FUN,R.string.`fun`, myContext.getString(R.string.fun_desc),R.drawable.stadia_controller_fill0) }
|
||||
list += Restriction(UserManager.DISALLOW_MODIFY_ACCOUNTS,R.string.modify_accounts,"",R.drawable.manage_accounts_fill0)
|
||||
if(VERSION.SDK_INT>=28){
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_LOCALE,R.string.config_locale,"",R.drawable.language_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_DATE_TIME,R.string.config_date_time,"",R.drawable.schedule_fill0)
|
||||
}
|
||||
if(VERSION.SDK_INT>=28){list += Restriction(UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS,R.string.sys_err_dialog,"",R.drawable.android_fill0)}
|
||||
if(VERSION.SDK_INT>=28){list += Restriction(UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS,R.string.sys_err_dialog,"",R.drawable.warning_fill0)}
|
||||
list += Restriction(UserManager.DISALLOW_FACTORY_RESET,R.string.factory_reset,"",R.drawable.android_fill0)
|
||||
if(VERSION.SDK_INT>=23){ list += Restriction(UserManager.DISALLOW_SAFE_BOOT,R.string.safe_boot,"",R.drawable.security_fill0) }
|
||||
list += Restriction(UserManager.DISALLOW_DEBUGGING_FEATURES,R.string.debug_features,"",R.drawable.adb_fill0)
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
android:viewportHeight="960">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M382,720 L154,492l57,-57 171,171 367,-367 57,57 -424,424Z"/>
|
||||
android:pathData="m40,840 l440,-760 440,760L40,840ZM178,760h604L480,240 178,760ZM480,720q17,0 28.5,-11.5T520,680q0,-17 -11.5,-28.5T480,640q-17,0 -28.5,11.5T440,680q0,17 11.5,28.5T480,720ZM440,600h80v-200h-80v200ZM480,500Z"/>
|
||||
</vector>
|
||||
@@ -38,7 +38,6 @@
|
||||
<string name="decide_by_user">由用户决定</string>
|
||||
<string name="unsupported">不支持</string>
|
||||
<string name="developing">功能开发中</string>
|
||||
<string name="place_holder" />
|
||||
<string name="try_again">请再试一次</string>
|
||||
<string name="unknown_effect">效果未知</string>
|
||||
<string name="options">选项</string>
|
||||
@@ -48,7 +47,6 @@
|
||||
<string name="profile_owner">Profile owner</string>
|
||||
<string name="device_owner">Device owner</string>
|
||||
<string name="activate_device_admin">激活Device admin</string>
|
||||
<string name="touch_to_view_command">点击查看激活命令</string>
|
||||
<string name="activate_device_admin_command">adb shell dpm set-active-admin com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string>
|
||||
<string name="activate_profile_owner_command">adb shell dpm set-profile-owner com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string>
|
||||
<string name="activate_device_owner_command">adb shell dpm set-device-owner com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string>
|
||||
@@ -72,15 +70,10 @@
|
||||
<string name="target_class_name">目标类名</string>
|
||||
<string name="owner_lockscr_info">锁屏提示信息</string>
|
||||
<string name="support_msg">提供支持的消息</string>
|
||||
<string name="short_support_msg">提供支持的消息</string>
|
||||
<string name="short_support_msg">提供支持的短消息</string>
|
||||
<string name="support_msg_desc">如果你禁用了某个功能,用户尝试使用这个功能时会看见这个消息(可多行)</string>
|
||||
<string name="message">消息</string>
|
||||
<string name="long_support_msg">提供支持的长消息</string>
|
||||
<string name="long_support_msg_desc">都是显示短消息,长消息不知道在哪里显示</string>
|
||||
<string name="transform">转移</string>
|
||||
<string name="deactivate_da">撤销Device admin</string>
|
||||
<string name="deactivate_po">撤销Profile owner</string>
|
||||
<string name="deactivate_do">撤销Device owner</string>
|
||||
<string name="activate_android_owner_here">在这里激活Android Owner</string>
|
||||
|
||||
<!--Shizuku-->
|
||||
@@ -98,6 +91,8 @@
|
||||
<string name="dpm_activate_da_command">dpm set-active-admin com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string>
|
||||
<string name="shizuku_activated_shell">已授权(Shell)</string>
|
||||
<string name="shizuku_activated_root">已授权(Root)</string>
|
||||
<string name="activate_profile_owner">激活Profile owner</string>
|
||||
<string name="activate_device_owner">激活Device owner</string>
|
||||
|
||||
<!--System-->
|
||||
<string name="device_ctrl">系统</string>
|
||||
@@ -113,7 +108,6 @@
|
||||
<string name="common_criteria_mode">通用标准模式</string>
|
||||
<string name="common_criteria_mode_desc">Common Criteria</string>
|
||||
<string name="usb_signal">USB信号</string>
|
||||
<string name="turn_off_usb_not_support">你的设备不支持关闭USB信号</string>
|
||||
<string name="keyguard">锁屏</string>
|
||||
<string name="require_no_password_to_disable">禁用需要无密码</string>
|
||||
<string name="lock_now">立即锁屏</string>
|
||||
@@ -222,15 +216,10 @@
|
||||
<string name="work_profile">工作资料</string>
|
||||
<string name="work_profile_owner">Profile owner(工作资料)</string>
|
||||
<string name="work_profile_activated">工作资料已激活</string>
|
||||
<string name="info">信息</string>
|
||||
<string name="is_already_work_profile">已是工作资料</string>
|
||||
<string name="create_work_profile">创建工作资料</string>
|
||||
<string name="able_to_create_work_profile">可以创建工作资料:%1$s</string>
|
||||
<string name="device_owner_cannot_create_work_profile">Device owner不能创建工作资料</string>
|
||||
<string name="is_org_owned_profile">由组织拥有的工作资料:%1$s</string>
|
||||
<string name="org_owned_work_profile">组织拥有的工作资料</string>
|
||||
<string name="activate_org_profile_command" tools:ignore="TypographyDashes">adb shell \"dpm mark-profile-owner-on-organization-owned-device --user %1$s com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver\"</string>
|
||||
<string name="become_org_profile">成为组织拥有的工作资料</string>
|
||||
<string name="skip_encryption">跳过加密</string>
|
||||
<string name="create">创建</string>
|
||||
<string name="suspend_personal_app">挂起个人应用</string>
|
||||
@@ -245,8 +234,6 @@
|
||||
<string name="org_id">组织ID</string>
|
||||
<string name="length_6_to_64">长度应在6~64个字符之间</string>
|
||||
<string name="get_specific_id_after_set_org_id">设置组织ID后才能获取设备唯一标识码</string>
|
||||
<string name="activate_managed_profile">激活工作资料</string>
|
||||
<string name="activate_managed_profile_desc">你还没有激活工作资料,请立即激活</string>
|
||||
|
||||
<!--AppManage-->
|
||||
<string name="app_manage">应用管理</string>
|
||||
@@ -409,18 +396,13 @@
|
||||
<string name="password_info">密码信息</string>
|
||||
<string name="reset_pwd_desc">留空可以清除密码,纯数字将使用PIN码</string>
|
||||
<string name="max_pwd_fail">最大密码错误次数</string>
|
||||
<string name="max_pwd_fail_desc">达到该限制会恢复出厂设置</string>
|
||||
<string name="max_pwd_fail_desc">达到该限制会恢复出厂设置,0为无限制</string>
|
||||
<string name="max_pwd_fail_textfield">错误次数</string>
|
||||
<string name="pwd_timeout">密码失效超时时间</string>
|
||||
<string name="max_time_to_lock">屏幕超时</string>
|
||||
<string name="max_time_to_lock_desc">超时后锁屏(毫秒),0为由用户决定</string>
|
||||
<string name="pwd_timeout_desc">超时后用户需重新设置密码(毫秒),0为无限制</string>
|
||||
<string name="pwd_timeout_textfield">超时时间(ms)</string>
|
||||
<string name="pwd_history">密码历史记录长度</string>
|
||||
<string name="pwd_history_desc">用户输入的密码不能与历史记录中的任何密码相同,0为无限制</string>
|
||||
<string name="pwd_history_textfield">历史记录长度</string>
|
||||
<string name="password_warning">以下操作可能会造成不可挽回的损失,请先备份好数据。执行操作时一定要谨慎!!!</string>
|
||||
<string name="password_wearos_warning">警告!手表不支持带字母的密码,也不支持超过4位的PIN码!如果你设置了这样的密码(或密码复杂度要求),你将无法解锁你的手表!</string>
|
||||
<string name="password_complexity_none">无(允许不设密码)</string>
|
||||
<string name="password_complexity_low">低(允许图案和连续性)</string>
|
||||
<string name="password_complexity_medium">中(无连续性,至少4位)</string>
|
||||
|
||||
Reference in New Issue
Block a user