diff --git a/app/src/main/java/com/binbin/androidowner/MainActivity.kt b/app/src/main/java/com/binbin/androidowner/MainActivity.kt
index 6f57be6..ecf34ca 100644
--- a/app/src/main/java/com/binbin/androidowner/MainActivity.kt
+++ b/app/src/main/java/com/binbin/androidowner/MainActivity.kt
@@ -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)
-
-}
-
diff --git a/app/src/main/java/com/binbin/androidowner/Setting.kt b/app/src/main/java/com/binbin/androidowner/Setting.kt
index 0dd583f..e19163a 100644
--- a/app/src/main/java/com/binbin/androidowner/Setting.kt
+++ b/app/src/main/java/com/binbin/androidowner/Setting.kt
@@ -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
diff --git a/app/src/main/java/com/binbin/androidowner/dpm/ManagedProfile.kt b/app/src/main/java/com/binbin/androidowner/dpm/ManagedProfile.kt
index 762ca8e..43ec82a 100644
--- a/app/src/main/java/com/binbin/androidowner/dpm/ManagedProfile.kt
+++ b/app/src/main/java/com/binbin/androidowner/dpm/ManagedProfile.kt
@@ -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
diff --git a/app/src/main/java/com/binbin/androidowner/dpm/Password.kt b/app/src/main/java/com/binbin/androidowner/dpm/Password.kt
index e0be52a..924d7ed 100644
--- a/app/src/main/java/com/binbin/androidowner/dpm/Password.kt
+++ b/app/src/main/java/com/binbin/androidowner/dpm/Password.kt
@@ -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
diff --git a/app/src/main/java/com/binbin/androidowner/dpm/Permissions.kt b/app/src/main/java/com/binbin/androidowner/dpm/Permissions.kt
index 6ab7b3d..01af126 100644
--- a/app/src/main/java/com/binbin/androidowner/dpm/Permissions.kt
+++ b/app/src/main/java/com/binbin/androidowner/dpm/Permissions.kt
@@ -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))
}
diff --git a/app/src/main/java/com/binbin/androidowner/dpm/ShizukuActivate.kt b/app/src/main/java/com/binbin/androidowner/dpm/ShizukuActivate.kt
index 23e0d01..725f5ba 100644
--- a/app/src/main/java/com/binbin/androidowner/dpm/ShizukuActivate.kt
+++ b/app/src/main/java/com/binbin/androidowner/dpm/ShizukuActivate.kt
@@ -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))
}
diff --git a/app/src/main/java/com/binbin/androidowner/dpm/SystemManage.kt b/app/src/main/java/com/binbin/androidowner/dpm/SystemManage.kt
index d4a11ce..2e7d165 100644
--- a/app/src/main/java/com/binbin/androidowner/dpm/SystemManage.kt
+++ b/app/src/main/java/com/binbin/androidowner/dpm/SystemManage.kt
@@ -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)
diff --git a/app/src/main/java/com/binbin/androidowner/dpm/UserManage.kt b/app/src/main/java/com/binbin/androidowner/dpm/UserManage.kt
index 2617987..ed4dd16 100644
--- a/app/src/main/java/com/binbin/androidowner/dpm/UserManage.kt
+++ b/app/src/main/java/com/binbin/androidowner/dpm/UserManage.kt
@@ -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))},
diff --git a/app/src/main/java/com/binbin/androidowner/dpm/UserRestriction.kt b/app/src/main/java/com/binbin/androidowner/dpm/UserRestriction.kt
index a993ce6..c389dec 100644
--- a/app/src/main/java/com/binbin/androidowner/dpm/UserRestriction.kt
+++ b/app/src/main/java/com/binbin/androidowner/dpm/UserRestriction.kt
@@ -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)
diff --git a/app/src/main/res/drawable/check_fill0.xml b/app/src/main/res/drawable/warning_fill0.xml
similarity index 50%
rename from app/src/main/res/drawable/check_fill0.xml
rename to app/src/main/res/drawable/warning_fill0.xml
index f97e17d..8430f15 100644
--- a/app/src/main/res/drawable/check_fill0.xml
+++ b/app/src/main/res/drawable/warning_fill0.xml
@@ -5,5 +5,5 @@
android:viewportHeight="960">
+ 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"/>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index daa3de5..bef1dc2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -38,7 +38,6 @@
由用户决定
不支持
功能开发中
-
请再试一次
效果未知
选项
@@ -48,7 +47,6 @@
Profile owner
Device owner
激活Device admin
- 点击查看激活命令
adb shell dpm set-active-admin com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver
adb shell dpm set-profile-owner com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver
adb shell dpm set-device-owner com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver
@@ -72,15 +70,10 @@
目标类名
锁屏提示信息
提供支持的消息
- 提供支持的消息
+ 提供支持的短消息
如果你禁用了某个功能,用户尝试使用这个功能时会看见这个消息(可多行)
- 消息
提供支持的长消息
- 都是显示短消息,长消息不知道在哪里显示
转移
- 撤销Device admin
- 撤销Profile owner
- 撤销Device owner
在这里激活Android Owner
@@ -98,6 +91,8 @@
dpm set-active-admin com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver
已授权(Shell)
已授权(Root)
+ 激活Profile owner
+ 激活Device owner
系统
@@ -113,7 +108,6 @@
通用标准模式
Common Criteria
USB信号
- 你的设备不支持关闭USB信号
锁屏
禁用需要无密码
立即锁屏
@@ -222,15 +216,10 @@
工作资料
Profile owner(工作资料)
工作资料已激活
- 信息
- 已是工作资料
创建工作资料
- 可以创建工作资料:%1$s
- Device owner不能创建工作资料
由组织拥有的工作资料:%1$s
组织拥有的工作资料
adb shell \"dpm mark-profile-owner-on-organization-owned-device --user %1$s com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver\"
- 成为组织拥有的工作资料
跳过加密
创建
挂起个人应用
@@ -245,8 +234,6 @@
组织ID
长度应在6~64个字符之间
设置组织ID后才能获取设备唯一标识码
- 激活工作资料
- 你还没有激活工作资料,请立即激活
应用管理
@@ -409,18 +396,13 @@
密码信息
留空可以清除密码,纯数字将使用PIN码
最大密码错误次数
- 达到该限制会恢复出厂设置
+ 达到该限制会恢复出厂设置,0为无限制
错误次数
密码失效超时时间
屏幕超时
超时后锁屏(毫秒),0为由用户决定
超时后用户需重新设置密码(毫秒),0为无限制
- 超时时间(ms)
密码历史记录长度
- 用户输入的密码不能与历史记录中的任何密码相同,0为无限制
- 历史记录长度
- 以下操作可能会造成不可挽回的损失,请先备份好数据。执行操作时一定要谨慎!!!
- 警告!手表不支持带字母的密码,也不支持超过4位的PIN码!如果你设置了这样的密码(或密码复杂度要求),你将无法解锁你的手表!
无(允许不设密码)
低(允许图案和连续性)
中(无连续性,至少4位)