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位)