some bugfix

This commit is contained in:
BinTianqi
2024-03-10 21:07:32 +08:00
parent d7ed1b2071
commit 88630471b3
11 changed files with 100 additions and 119 deletions

View File

@@ -13,6 +13,7 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.* import androidx.compose.foundation.*
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
@@ -25,7 +26,9 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@@ -75,6 +78,7 @@ fun MyScaffold(){
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
val focusMgr = LocalFocusManager.current
NavHost( NavHost(
navController = navCtrl, navController = navCtrl,
startDestination = "HomePage", startDestination = "HomePage",
@@ -82,7 +86,8 @@ fun MyScaffold(){
.statusBarsPadding() .statusBarsPadding()
.fillMaxSize() .fillMaxSize()
.background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) }) .background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) })
.imePadding(), .imePadding()
.pointerInput(Unit) {detectTapGestures(onTap = {focusMgr.clearFocus()})},
enterTransition = Animations().navHostEnterTransition, enterTransition = Animations().navHostEnterTransition,
exitTransition = Animations().navHostExitTransition, exitTransition = Animations().navHostExitTransition,
popEnterTransition = Animations().navHostPopEnterTransition, 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)
}

View File

@@ -3,7 +3,6 @@ package com.binbin.androidowner
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Build.VERSION
import androidx.compose.foundation.* import androidx.compose.foundation.*
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.* import androidx.compose.material3.*
@@ -22,7 +21,6 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.dpm.*
import com.binbin.androidowner.ui.Animations import com.binbin.androidowner.ui.Animations
import com.binbin.androidowner.ui.NavIcon import com.binbin.androidowner.ui.NavIcon
import com.binbin.androidowner.ui.SubPageItem import com.binbin.androidowner.ui.SubPageItem

View File

@@ -18,7 +18,6 @@ import androidx.compose.material3.*
import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.MaterialTheme.typography
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager

View File

@@ -19,7 +19,6 @@ import androidx.compose.material3.*
import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.MaterialTheme.typography
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager

View File

@@ -19,7 +19,8 @@ import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.MaterialTheme.typography
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier 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.LocalContext
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@@ -32,9 +33,12 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R 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.NavIcon
import com.binbin.androidowner.ui.SubPageItem import com.binbin.androidowner.ui.SubPageItem
import com.binbin.androidowner.ui.Animations import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -76,9 +80,9 @@ fun DpmPermissions(navCtrl:NavHostController){
){ ){
composable(route = "Home"){Home(localNavCtrl)} composable(route = "Home"){Home(localNavCtrl)}
composable(route = "Shizuku"){ShizukuActivate()} composable(route = "Shizuku"){ShizukuActivate()}
composable(route = "DeviceAdmin"){DeviceAdmin()} composable(route = "DeviceAdmin"){DeviceAdmin(navCtrl)}
composable(route = "ProfileOwner"){ProfileOwner()} composable(route = "ProfileOwner"){ProfileOwner()}
composable(route = "DeviceOwner"){DeviceOwner()} composable(route = "DeviceOwner"){DeviceOwner(navCtrl)}
composable(route = "DeviceInfo"){DeviceInfo()} composable(route = "DeviceInfo"){DeviceInfo()}
composable(route = "SpecificID"){SpecificID()} composable(route = "SpecificID"){SpecificID()}
composable(route = "OrgName"){OrgName()} composable(route = "OrgName"){OrgName()}
@@ -173,10 +177,11 @@ private fun LockScreenInfo(){
} }
@Composable @Composable
private fun DeviceAdmin(){ private fun DeviceAdmin(navCtrl: NavHostController){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
val co = rememberCoroutineScope()
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.device_admin), style = typography.headlineLarge) Text(text = stringResource(R.string.device_admin), style = typography.headlineLarge)
@@ -184,7 +189,13 @@ private fun DeviceAdmin(){
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
if(myDpm.isAdminActive(myComponent)) { if(myDpm.isAdminActive(myComponent)) {
if(!isDeviceOwner(myDpm)&&!isProfileOwner(myDpm)) { 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)) Text(stringResource(R.string.deactivate))
} }
} }
@@ -226,16 +237,23 @@ private fun ProfileOwner(){
} }
@Composable @Composable
private fun DeviceOwner(){ private fun DeviceOwner(navCtrl: NavHostController){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val co = rememberCoroutineScope()
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.device_owner), style = typography.headlineLarge) 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) Text(text = stringResource(if(isDeviceOwner(myDpm)){R.string.activated}else{R.string.deactivated}), style = typography.titleLarge)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
if(isDeviceOwner(myDpm)){ 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)) Text(text = stringResource(R.string.deactivate))
} }
} }
@@ -359,60 +377,46 @@ private fun SupportMsg(){
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.short_support_msg), style = typography.headlineLarge) Text(text = stringResource(R.string.short_support_msg), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp))
OutlinedTextField( OutlinedTextField(
value = shortMsg, value = shortMsg,
label = {Text(stringResource(R.string.message))}, label = {Text(stringResource(R.string.short_support_msg))},
onValueChange = { shortMsg=it }, onValueChange = { shortMsg=it },
modifier = Modifier.focusable().fillMaxWidth().padding(vertical = 4.dp) modifier = Modifier.focusable().fillMaxWidth()
) )
Button( Spacer(Modifier.padding(vertical = 2.dp))
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)
OutlinedTextField( OutlinedTextField(
value = longMsg, value = longMsg,
label = {Text(stringResource(R.string.message))}, label = {Text(stringResource(R.string.long_support_msg))},
onValueChange = { longMsg=it }, onValueChange = { longMsg=it },
modifier = Modifier.focusable().fillMaxWidth().padding(vertical = 4.dp) modifier = Modifier.focusable().fillMaxWidth()
) )
Spacer(Modifier.padding(vertical = 5.dp))
Button( Button(
onClick = { onClick = {
focusMgr.clearFocus() 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() Toast.makeText(myContext, myContext.getString(R.string.success), Toast.LENGTH_SHORT).show()
}, },
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(text = stringResource(R.string.apply)) Text(text = stringResource(R.string.apply))
} }
Spacer(Modifier.padding(vertical = 1.dp))
Button( Button(
onClick = { onClick = {
focusMgr.clearFocus() 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() Toast.makeText(myContext, myContext.getString(R.string.success), Toast.LENGTH_SHORT).show()
}, },
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(text = stringResource(R.string.reset)) 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)) Spacer(Modifier.padding(vertical = 30.dp))
} }
} }
@@ -477,6 +481,7 @@ private fun TransformOwnership(){
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
val focusRequester = FocusRequester()
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
var pkg by remember{mutableStateOf("")} var pkg by remember{mutableStateOf("")}
var cls 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) Text(text = stringResource(R.string.transform_ownership), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
Text(text = stringResource(R.string.transform_ownership_desc)) Text(text = stringResource(R.string.transform_ownership_desc))
Spacer(Modifier.padding(vertical = 5.dp))
OutlinedTextField( OutlinedTextField(
value = pkg, onValueChange = {pkg = it}, label = {Text(stringResource(R.string.target_package_name))}, 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), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
keyboardActions = KeyboardActions(onNext = {focusMgr.moveFocus(FocusDirection.Down)}) keyboardActions = KeyboardActions(onNext = {focusRequester.requestFocus()})
) )
Spacer(Modifier.padding(vertical = 2.dp))
OutlinedTextField( OutlinedTextField(
value = cls, onValueChange = {cls = it}, label = {Text(stringResource(R.string.target_class_name))}, 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), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus()}) keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus()})
) )
Spacer(Modifier.padding(vertical = 5.dp))
Button( Button(
onClick = { onClick = {
try { try {
@@ -505,7 +513,7 @@ private fun TransformOwnership(){
Toast.makeText(myContext, myContext.getString(R.string.fail), Toast.LENGTH_SHORT).show() 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)) Text(stringResource(R.string.transform))
} }

View File

@@ -56,7 +56,10 @@ fun ShizukuActivate(){
val coScope = rememberCoroutineScope() val coScope = rememberCoroutineScope()
val scrollState = rememberScrollState() val scrollState = rememberScrollState()
val outputTextScrollState = 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("")} var outputText by remember{mutableStateOf("")}
if(Binder.getCallingUid()/100000!=0){ if(Binder.getCallingUid()/100000!=0){
Row{ Row{
@@ -64,7 +67,6 @@ fun ShizukuActivate(){
Text(text = stringResource(R.string.not_primary_user_not_support_shizuku), style = bodyTextStyle, color = colorScheme.onErrorContainer) Text(text = stringResource(R.string.not_primary_user_not_support_shizuku), style = bodyTextStyle, color = colorScheme.onErrorContainer)
} }
} }
Button( Button(
onClick = { onClick = {
coScope.launch { coScope.launch {
@@ -86,10 +88,21 @@ fun ShizukuActivate(){
Text(text = stringResource(R.string.check_shizuku)) 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)){ if(!isDeviceOwner(myDpm)&&!isProfileOwner(myDpm)){
Column { Column {
Text(text = stringResource(R.string.activate), style = typography.titleLarge, color = colorScheme.onPrimaryContainer)
if(!myDpm.isAdminActive(myComponent)){ if(!myDpm.isAdminActive(myComponent)){
Button( Button(
onClick = { onClick = {
@@ -100,7 +113,7 @@ fun ShizukuActivate(){
} }
}, },
modifier = Modifier.fillMaxWidth()) { modifier = Modifier.fillMaxWidth()) {
Text(text = "Device admin") Text(text = stringResource(R.string.activate_device_admin))
} }
} }
@@ -113,7 +126,7 @@ fun ShizukuActivate(){
} }
}, },
modifier = Modifier.fillMaxWidth()) { modifier = Modifier.fillMaxWidth()) {
Text(text = "Profile owner") Text(text = stringResource(R.string.activate_profile_owner))
} }
Button( Button(
@@ -125,13 +138,16 @@ fun ShizukuActivate(){
} }
}, },
modifier = Modifier.fillMaxWidth()) { 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 { Column {
Text(text = stringResource(R.string.org_owned_work_profile), style = typography.titleLarge, color = colorScheme.onPrimaryContainer) 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) 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)){ SelectionContainer(modifier = Modifier.align(Alignment.Start).horizontalScroll(outputTextScrollState)){
Text(text = outputText, style = bodyTextStyle, softWrap = false, modifier = Modifier.padding(4.dp)) Text(text = outputText, style = bodyTextStyle, softWrap = false, modifier = Modifier.padding(4.dp))
} }

View File

@@ -144,6 +144,7 @@ private fun Home(navCtrl: NavHostController){
} }
SubPageItem(R.string.wipe_data,""){navCtrl.navigate("WipeData")} SubPageItem(R.string.wipe_data,""){navCtrl.navigate("WipeData")}
Spacer(Modifier.padding(vertical = 30.dp)) Spacer(Modifier.padding(vertical = 30.dp))
LaunchedEffect(Unit){caCert=byteArrayOf()}
} }
} }
@@ -594,7 +595,7 @@ private fun CaCert(){
isEmpty = caCert.isEmpty() isEmpty = caCert.isEmpty()
exist = if(!isEmpty){ myDpm.hasCaCertInstalled(myComponent, caCert) }else{ false } 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())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.ca_cert), style = typography.headlineLarge) Text(text = stringResource(R.string.ca_cert), style = typography.headlineLarge)

View File

@@ -158,7 +158,7 @@ private fun UserOperation(){
var userHandleById:UserHandle by remember{ mutableStateOf(Process.myUserHandle()) } var userHandleById:UserHandle by remember{ mutableStateOf(Process.myUserHandle()) }
var useUid by remember{ mutableStateOf(false) } var useUid by remember{ mutableStateOf(false) }
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
TextField( OutlinedTextField(
value = idInput, value = idInput,
onValueChange = { onValueChange = {
idInput=it idInput=it
@@ -271,7 +271,7 @@ private fun CreateUser(){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.create_user), style = typography.headlineLarge) Text(text = stringResource(R.string.create_user), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
TextField( OutlinedTextField(
value = userName, value = userName,
onValueChange = {userName=it}, onValueChange = {userName=it},
label = {Text(stringResource(R.string.username))}, label = {Text(stringResource(R.string.username))},
@@ -331,7 +331,7 @@ private fun AffiliationID(){
Text(text = stringResource(R.string.none)) Text(text = stringResource(R.string.none))
} }
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
TextField( OutlinedTextField(
value = input, value = input,
onValueChange = {input = it}, onValueChange = {input = it},
label = {Text("ID")}, label = {Text("ID")},
@@ -388,7 +388,7 @@ private fun Username(){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.edit_username), style = typography.headlineLarge) Text(text = stringResource(R.string.edit_username), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
TextField( OutlinedTextField(
value = inputUsername, value = inputUsername,
onValueChange = {inputUsername=it}, onValueChange = {inputUsername=it},
label = {Text(stringResource(R.string.username))}, label = {Text(stringResource(R.string.username))},
@@ -427,13 +427,15 @@ private fun UserSessionMessage(){
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var start by remember{mutableStateOf(myDpm.getStartUserSessionMessage(myComponent).toString())} val getStart = myDpm.getStartUserSessionMessage(myComponent)?:""
var end by remember{mutableStateOf(myDpm.getEndUserSessionMessage(myComponent).toString())} 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())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.user_session_msg), style = typography.headlineLarge) Text(text = stringResource(R.string.user_session_msg), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
TextField( OutlinedTextField(
value = start, value = start,
onValueChange = {start=it}, onValueChange = {start=it},
label = {Text(stringResource(R.string.start_user_session_msg))}, label = {Text(stringResource(R.string.start_user_session_msg))},
@@ -442,8 +444,8 @@ private fun UserSessionMessage(){
modifier = Modifier.focusable().fillMaxWidth(), modifier = Modifier.focusable().fillMaxWidth(),
enabled = isDeviceOwner(myDpm)||isProfileOwner(myDpm) enabled = isDeviceOwner(myDpm)||isProfileOwner(myDpm)
) )
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 2.dp))
TextField( OutlinedTextField(
value = end, value = end,
onValueChange = {end=it}, onValueChange = {end=it},
label = {Text(stringResource(R.string.end_user_session_msg))}, label = {Text(stringResource(R.string.end_user_session_msg))},

View File

@@ -287,19 +287,19 @@ private class RestrictionData{
if(VERSION.SDK_INT>=26){ list += Restriction(UserManager.DISALLOW_AUTOFILL,R.string.autofill, "",R.drawable.password_fill0) } 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) list += Restriction(UserManager.DISALLOW_CONFIG_CREDENTIALS,R.string.config_credentials,"",R.drawable.android_fill0)
if(VERSION.SDK_INT>=29){ if(VERSION.SDK_INT>=29){
list += Restriction(UserManager.DISALLOW_CONTENT_CAPTURE,R.string.content_capture,"",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.android_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) 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>=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) } 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) list += Restriction(UserManager.DISALLOW_MODIFY_ACCOUNTS,R.string.modify_accounts,"",R.drawable.manage_accounts_fill0)
if(VERSION.SDK_INT>=28){ if(VERSION.SDK_INT>=28){
list += Restriction(UserManager.DISALLOW_CONFIG_LOCALE,R.string.config_locale,"",R.drawable.language_fill0) 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) 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) 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) } 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) list += Restriction(UserManager.DISALLOW_DEBUGGING_FEATURES,R.string.debug_features,"",R.drawable.adb_fill0)

View File

@@ -5,5 +5,5 @@
android:viewportHeight="960"> android:viewportHeight="960">
<path <path
android:fillColor="#FF000000" 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> </vector>

View File

@@ -38,7 +38,6 @@
<string name="decide_by_user">由用户决定</string> <string name="decide_by_user">由用户决定</string>
<string name="unsupported">不支持</string> <string name="unsupported">不支持</string>
<string name="developing">功能开发中</string> <string name="developing">功能开发中</string>
<string name="place_holder" />
<string name="try_again">请再试一次</string> <string name="try_again">请再试一次</string>
<string name="unknown_effect">效果未知</string> <string name="unknown_effect">效果未知</string>
<string name="options">选项</string> <string name="options">选项</string>
@@ -48,7 +47,6 @@
<string name="profile_owner">Profile owner</string> <string name="profile_owner">Profile owner</string>
<string name="device_owner">Device owner</string> <string name="device_owner">Device owner</string>
<string name="activate_device_admin">激活Device admin</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_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_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> <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="target_class_name">目标类名</string>
<string name="owner_lockscr_info">锁屏提示信息</string> <string name="owner_lockscr_info">锁屏提示信息</string>
<string name="support_msg">提供支持的消息</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="support_msg_desc">如果你禁用了某个功能,用户尝试使用这个功能时会看见这个消息(可多行)</string>
<string name="message">消息</string>
<string name="long_support_msg">提供支持的长消息</string> <string name="long_support_msg">提供支持的长消息</string>
<string name="long_support_msg_desc">都是显示短消息,长消息不知道在哪里显示</string>
<string name="transform">转移</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> <string name="activate_android_owner_here">在这里激活Android Owner</string>
<!--Shizuku--> <!--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="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_shell">已授权Shell</string>
<string name="shizuku_activated_root">已授权Root</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--> <!--System-->
<string name="device_ctrl">系统</string> <string name="device_ctrl">系统</string>
@@ -113,7 +108,6 @@
<string name="common_criteria_mode">通用标准模式</string> <string name="common_criteria_mode">通用标准模式</string>
<string name="common_criteria_mode_desc">Common Criteria</string> <string name="common_criteria_mode_desc">Common Criteria</string>
<string name="usb_signal">USB信号</string> <string name="usb_signal">USB信号</string>
<string name="turn_off_usb_not_support">你的设备不支持关闭USB信号</string>
<string name="keyguard">锁屏</string> <string name="keyguard">锁屏</string>
<string name="require_no_password_to_disable">禁用需要无密码</string> <string name="require_no_password_to_disable">禁用需要无密码</string>
<string name="lock_now">立即锁屏</string> <string name="lock_now">立即锁屏</string>
@@ -222,15 +216,10 @@
<string name="work_profile">工作资料</string> <string name="work_profile">工作资料</string>
<string name="work_profile_owner">Profile owner工作资料</string> <string name="work_profile_owner">Profile owner工作资料</string>
<string name="work_profile_activated">工作资料已激活</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="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="is_org_owned_profile">由组织拥有的工作资料:%1$s</string>
<string name="org_owned_work_profile">组织拥有的工作资料</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="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="skip_encryption">跳过加密</string>
<string name="create">创建</string> <string name="create">创建</string>
<string name="suspend_personal_app">挂起个人应用</string> <string name="suspend_personal_app">挂起个人应用</string>
@@ -245,8 +234,6 @@
<string name="org_id">组织ID</string> <string name="org_id">组织ID</string>
<string name="length_6_to_64">长度应在6~64个字符之间</string> <string name="length_6_to_64">长度应在6~64个字符之间</string>
<string name="get_specific_id_after_set_org_id">设置组织ID后才能获取设备唯一标识码</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--> <!--AppManage-->
<string name="app_manage">应用管理</string> <string name="app_manage">应用管理</string>
@@ -409,18 +396,13 @@
<string name="password_info">密码信息</string> <string name="password_info">密码信息</string>
<string name="reset_pwd_desc">留空可以清除密码纯数字将使用PIN码</string> <string name="reset_pwd_desc">留空可以清除密码纯数字将使用PIN码</string>
<string name="max_pwd_fail">最大密码错误次数</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="max_pwd_fail_textfield">错误次数</string>
<string name="pwd_timeout">密码失效超时时间</string> <string name="pwd_timeout">密码失效超时时间</string>
<string name="max_time_to_lock">屏幕超时</string> <string name="max_time_to_lock">屏幕超时</string>
<string name="max_time_to_lock_desc">超时后锁屏(毫秒)0为由用户决定</string> <string name="max_time_to_lock_desc">超时后锁屏(毫秒)0为由用户决定</string>
<string name="pwd_timeout_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">密码历史记录长度</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_none">无(允许不设密码)</string>
<string name="password_complexity_low">低(允许图案和连续性)</string> <string name="password_complexity_low">低(允许图案和连续性)</string>
<string name="password_complexity_medium">无连续性至少4位</string> <string name="password_complexity_medium">无连续性至少4位</string>