mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-25 11:36:00 +00:00
fix some problems of AppControlDialog
use state to control SwitchItem
This commit is contained in:
@@ -66,6 +66,7 @@ import com.bintianqi.owndroid.dpm.getReceiver
|
|||||||
import com.bintianqi.owndroid.dpm.isDeviceAdmin
|
import com.bintianqi.owndroid.dpm.isDeviceAdmin
|
||||||
import com.bintianqi.owndroid.dpm.isDeviceOwner
|
import com.bintianqi.owndroid.dpm.isDeviceOwner
|
||||||
import com.bintianqi.owndroid.dpm.isProfileOwner
|
import com.bintianqi.owndroid.dpm.isProfileOwner
|
||||||
|
import com.bintianqi.owndroid.dpm.toggleInstallAppActivity
|
||||||
import com.bintianqi.owndroid.ui.Animations
|
import com.bintianqi.owndroid.ui.Animations
|
||||||
import com.bintianqi.owndroid.ui.theme.OwnDroidTheme
|
import com.bintianqi.owndroid.ui.theme.OwnDroidTheme
|
||||||
import com.rosan.dhizuku.api.Dhizuku
|
import com.rosan.dhizuku.api.Dhizuku
|
||||||
@@ -91,6 +92,7 @@ class MainActivity : FragmentActivity() {
|
|||||||
}
|
}
|
||||||
val locale = applicationContext.resources?.configuration?.locale
|
val locale = applicationContext.resources?.configuration?.locale
|
||||||
zhCN = locale == Locale.SIMPLIFIED_CHINESE || locale == Locale.CHINESE || locale == Locale.CHINA
|
zhCN = locale == Locale.SIMPLIFIED_CHINESE || locale == Locale.CHINESE || locale == Locale.CHINA
|
||||||
|
toggleInstallAppActivity()
|
||||||
setContent {
|
setContent {
|
||||||
val materialYou = remember { mutableStateOf(sharedPref.getBoolean("material_you", true)) }
|
val materialYou = remember { mutableStateOf(sharedPref.getBoolean("material_you", true)) }
|
||||||
val blackTheme = remember { mutableStateOf(sharedPref.getBoolean("black_theme", false)) }
|
val blackTheme = remember { mutableStateOf(sharedPref.getBoolean("black_theme", false)) }
|
||||||
@@ -284,6 +286,7 @@ private fun DhizukuErrorDialog() {
|
|||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val sharedPref = context.getSharedPreferences("data", Context.MODE_PRIVATE)
|
val sharedPref = context.getSharedPreferences("data", Context.MODE_PRIVATE)
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
|
context.toggleInstallAppActivity()
|
||||||
delay(200)
|
delay(200)
|
||||||
sharedPref.edit().putBoolean("dhizuku", false).apply()
|
sharedPref.edit().putBoolean("dhizuku", false).apply()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,11 +25,13 @@ import com.bintianqi.owndroid.dpm.getReceiver
|
|||||||
import com.bintianqi.owndroid.dpm.isDeviceAdmin
|
import com.bintianqi.owndroid.dpm.isDeviceAdmin
|
||||||
import com.bintianqi.owndroid.dpm.isDeviceOwner
|
import com.bintianqi.owndroid.dpm.isDeviceOwner
|
||||||
import com.bintianqi.owndroid.dpm.isProfileOwner
|
import com.bintianqi.owndroid.dpm.isProfileOwner
|
||||||
|
import com.bintianqi.owndroid.dpm.toggleInstallAppActivity
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
|
||||||
class Receiver : DeviceAdminReceiver() {
|
class Receiver : DeviceAdminReceiver() {
|
||||||
override fun onEnabled(context: Context, intent: Intent) {
|
override fun onEnabled(context: Context, intent: Intent) {
|
||||||
super.onEnabled(context, intent)
|
super.onEnabled(context, intent)
|
||||||
|
context.toggleInstallAppActivity()
|
||||||
if(context.isDeviceAdmin || context.isProfileOwner || context.isDeviceOwner){
|
if(context.isDeviceAdmin || context.isProfileOwner || context.isDeviceOwner){
|
||||||
Toast.makeText(context, context.getString(R.string.onEnabled), Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, context.getString(R.string.onEnabled), Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
@@ -37,6 +39,7 @@ class Receiver : DeviceAdminReceiver() {
|
|||||||
|
|
||||||
override fun onDisabled(context: Context, intent: Intent) {
|
override fun onDisabled(context: Context, intent: Intent) {
|
||||||
super.onDisabled(context, intent)
|
super.onDisabled(context, intent)
|
||||||
|
context.toggleInstallAppActivity()
|
||||||
backToHomeStateFlow.value = true
|
backToHomeStateFlow.value = true
|
||||||
Toast.makeText(context, R.string.onDisabled, Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, R.string.onDisabled, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,8 +109,7 @@ private fun AuthSettings() {
|
|||||||
var auth by remember{ mutableStateOf(sharedPref.getBoolean("auth",false)) }
|
var auth by remember{ mutableStateOf(sharedPref.getBoolean("auth",false)) }
|
||||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
|
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
|
||||||
SwitchItem(
|
SwitchItem(
|
||||||
R.string.lock_owndroid, "", null,
|
R.string.lock_owndroid, "", null, auth,
|
||||||
{ auth },
|
|
||||||
{
|
{
|
||||||
sharedPref.edit().putBoolean("auth", it).apply()
|
sharedPref.edit().putBoolean("auth", it).apply()
|
||||||
auth = sharedPref.getBoolean("auth", false)
|
auth = sharedPref.getBoolean("auth", false)
|
||||||
|
|||||||
@@ -94,10 +94,6 @@ import com.bintianqi.owndroid.ui.SubPageItem
|
|||||||
import com.bintianqi.owndroid.ui.SwitchItem
|
import com.bintianqi.owndroid.ui.SwitchItem
|
||||||
import java.util.concurrent.Executors
|
import java.util.concurrent.Executors
|
||||||
|
|
||||||
private var dialogConfirmButtonAction = {}
|
|
||||||
private var dialogDismissButtonAction = {}
|
|
||||||
private var dialogGetStatus = { false }
|
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun ApplicationManage(navCtrl:NavHostController, dialogStatus: MutableIntState) {
|
fun ApplicationManage(navCtrl:NavHostController, dialogStatus: MutableIntState) {
|
||||||
@@ -166,10 +162,9 @@ fun ApplicationManage(navCtrl:NavHostController, dialogStatus: MutableIntState)
|
|||||||
}
|
}
|
||||||
when(dialogStatus.intValue) {
|
when(dialogStatus.intValue) {
|
||||||
0 -> {}
|
0 -> {}
|
||||||
4 -> EnableSystemAppDialog(dialogStatus, pkgName)
|
1 -> EnableSystemAppDialog(dialogStatus, pkgName)
|
||||||
5 -> ClearAppDataDialog(dialogStatus, pkgName)
|
2 -> ClearAppDataDialog(dialogStatus, pkgName)
|
||||||
6 -> DefaultDialerAppDialog(dialogStatus, pkgName)
|
3 -> DefaultDialerAppDialog(dialogStatus, pkgName)
|
||||||
else -> AppControlDialog(dialogStatus)
|
|
||||||
}
|
}
|
||||||
LaunchedEffect(dialogStatus.intValue) {
|
LaunchedEffect(dialogStatus.intValue) {
|
||||||
focusMgr.clearFocus()
|
focusMgr.clearFocus()
|
||||||
@@ -185,9 +180,35 @@ private fun Home(
|
|||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val dpm = context.getDPM()
|
val dpm = context.getDPM()
|
||||||
val receiver = context.getReceiver()
|
val receiver = context.getReceiver()
|
||||||
val sharedPrefs = context.getSharedPreferences("data", Context.MODE_PRIVATE)
|
|
||||||
val deviceOwner = context.isDeviceOwner
|
val deviceOwner = context.isDeviceOwner
|
||||||
val profileOwner = context.isProfileOwner
|
val profileOwner = context.isProfileOwner
|
||||||
|
var suspend by remember { mutableStateOf(false) }
|
||||||
|
suspend = try{ if(VERSION.SDK_INT >= 24) dpm.isPackageSuspended(receiver, pkgName) else false }
|
||||||
|
catch(e:NameNotFoundException) { false }
|
||||||
|
catch(e:IllegalArgumentException) { false }
|
||||||
|
var hide by remember { mutableStateOf(false) }
|
||||||
|
hide = dpm.isApplicationHidden(receiver, pkgName)
|
||||||
|
var blockUninstall by remember { mutableStateOf(false) }
|
||||||
|
blockUninstall = dpm.isUninstallBlocked(receiver,pkgName)
|
||||||
|
var appControlDialog by remember { mutableStateOf(false) }
|
||||||
|
var appControlAction by remember { mutableIntStateOf(0) }
|
||||||
|
val focusMgr = LocalFocusManager.current
|
||||||
|
val appControl: (Boolean) -> Unit = {
|
||||||
|
when(appControlAction) {
|
||||||
|
1 -> if(VERSION.SDK_INT >= 24) dpm.setPackagesSuspended(receiver, arrayOf(pkgName), it)
|
||||||
|
2 -> dpm.setApplicationHidden(receiver, pkgName, it)
|
||||||
|
3 -> dpm.setUninstallBlocked(receiver, pkgName, it)
|
||||||
|
}
|
||||||
|
when(appControlAction) {
|
||||||
|
1 -> {
|
||||||
|
suspend = try{ if(VERSION.SDK_INT >= 24) dpm.isPackageSuspended(receiver, pkgName) else false }
|
||||||
|
catch(e:NameNotFoundException) { false }
|
||||||
|
catch(e:IllegalArgumentException) { false }
|
||||||
|
}
|
||||||
|
2 -> hide = dpm.isApplicationHidden(receiver,pkgName)
|
||||||
|
3 -> blockUninstall = dpm.isUninstallBlocked(receiver,pkgName)
|
||||||
|
}
|
||||||
|
}
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())
|
modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())
|
||||||
) {
|
) {
|
||||||
@@ -201,53 +222,33 @@ private fun Home(
|
|||||||
startActivity(context, intent, null)
|
startActivity(context, intent, null)
|
||||||
}
|
}
|
||||||
if(VERSION.SDK_INT >= 24 && (deviceOwner || profileOwner)) {
|
if(VERSION.SDK_INT >= 24 && (deviceOwner || profileOwner)) {
|
||||||
val getSuspendStatus = {
|
|
||||||
try{ dpm.isPackageSuspended(receiver, pkgName) }
|
|
||||||
catch(e:NameNotFoundException) { false }
|
|
||||||
catch(e:IllegalArgumentException) { false }
|
|
||||||
}
|
|
||||||
SwitchItem(
|
SwitchItem(
|
||||||
title = R.string.suspend, desc = "", icon = R.drawable.block_fill0,
|
title = R.string.suspend, desc = "", icon = R.drawable.block_fill0,
|
||||||
getState = getSuspendStatus,
|
state = suspend,
|
||||||
onCheckedChange = { dpm.setPackagesSuspended(receiver, arrayOf(pkgName), it) },
|
onCheckedChange = { appControlAction = 1; appControl(it) },
|
||||||
onClickBlank = {
|
onClickBlank = { appControlAction = 1; appControlDialog = true }
|
||||||
dialogGetStatus = getSuspendStatus
|
|
||||||
dialogConfirmButtonAction = { dpm.setPackagesSuspended(receiver, arrayOf(pkgName), true) }
|
|
||||||
dialogDismissButtonAction = { dpm.setPackagesSuspended(receiver, arrayOf(pkgName), false) }
|
|
||||||
dialogStatus.intValue = 1
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if(deviceOwner || profileOwner) {
|
if(deviceOwner || profileOwner) {
|
||||||
SwitchItem(
|
SwitchItem(
|
||||||
title = R.string.hide, desc = stringResource(R.string.isapphidden_desc), icon = R.drawable.visibility_off_fill0,
|
title = R.string.hide, desc = stringResource(R.string.isapphidden_desc), icon = R.drawable.visibility_off_fill0,
|
||||||
getState = { dpm.isApplicationHidden(receiver,pkgName) },
|
state = hide,
|
||||||
onCheckedChange = { dpm.setApplicationHidden(receiver, pkgName, it) },
|
onCheckedChange = { appControlAction = 2; appControl(it) },
|
||||||
onClickBlank = {
|
onClickBlank = { appControlAction = 2; appControlDialog = true }
|
||||||
dialogGetStatus = { dpm.isApplicationHidden(receiver,pkgName) }
|
|
||||||
dialogConfirmButtonAction = { dpm.setApplicationHidden(receiver, pkgName, true) }
|
|
||||||
dialogDismissButtonAction = { dpm.setApplicationHidden(receiver, pkgName, false) }
|
|
||||||
dialogStatus.intValue = 2
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if(deviceOwner || profileOwner) {
|
if(deviceOwner || profileOwner) {
|
||||||
SwitchItem(
|
SwitchItem(
|
||||||
title = R.string.block_uninstall, desc = "", icon = R.drawable.delete_forever_fill0,
|
title = R.string.block_uninstall, desc = "", icon = R.drawable.delete_forever_fill0,
|
||||||
getState = { dpm.isUninstallBlocked(receiver,pkgName) },
|
state = blockUninstall,
|
||||||
onCheckedChange = { dpm.setUninstallBlocked(receiver,pkgName,it) },
|
onCheckedChange = { appControlAction = 3; appControl(it) },
|
||||||
onClickBlank = {
|
onClickBlank = { appControlAction = 3; appControlDialog = true }
|
||||||
dialogGetStatus = { dpm.isUninstallBlocked(receiver,pkgName) }
|
|
||||||
dialogConfirmButtonAction = { dpm.setUninstallBlocked(receiver,pkgName,true) }
|
|
||||||
dialogDismissButtonAction = { dpm.setUninstallBlocked(receiver,pkgName,false) }
|
|
||||||
dialogStatus.intValue = 3
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if(VERSION.SDK_INT>=24 && (deviceOwner || profileOwner)) {
|
if(VERSION.SDK_INT >= 24 && (deviceOwner || profileOwner)) {
|
||||||
SubPageItem(R.string.always_on_vpn, "", R.drawable.vpn_key_fill0) { navCtrl.navigate("AlwaysOnVpn") }
|
SubPageItem(R.string.always_on_vpn, "", R.drawable.vpn_key_fill0) { navCtrl.navigate("AlwaysOnVpn") }
|
||||||
}
|
}
|
||||||
if((VERSION.SDK_INT>=33&&profileOwner)||(VERSION.SDK_INT>=30&&deviceOwner)) {
|
if((VERSION.SDK_INT >= 33 && profileOwner) || (VERSION.SDK_INT >= 30 && deviceOwner)) {
|
||||||
SubPageItem(R.string.ucd, "", R.drawable.do_not_touch_fill0) { navCtrl.navigate("UserControlDisabled") }
|
SubPageItem(R.string.ucd, "", R.drawable.do_not_touch_fill0) { navCtrl.navigate("UserControlDisabled") }
|
||||||
}
|
}
|
||||||
if(VERSION.SDK_INT>=23&&(deviceOwner||profileOwner)) {
|
if(VERSION.SDK_INT>=23&&(deviceOwner||profileOwner)) {
|
||||||
@@ -270,7 +271,7 @@ private fun Home(
|
|||||||
}
|
}
|
||||||
if(deviceOwner || profileOwner) {
|
if(deviceOwner || profileOwner) {
|
||||||
SubPageItem(R.string.enable_system_app, "", R.drawable.enable_fill0) {
|
SubPageItem(R.string.enable_system_app, "", R.drawable.enable_fill0) {
|
||||||
if(pkgName != "") dialogStatus.intValue = 4
|
if(pkgName != "") dialogStatus.intValue = 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(VERSION.SDK_INT >= 28 && deviceOwner) {
|
if(VERSION.SDK_INT >= 28 && deviceOwner) {
|
||||||
@@ -278,21 +279,74 @@ private fun Home(
|
|||||||
}
|
}
|
||||||
if(VERSION.SDK_INT >= 28 && (deviceOwner || profileOwner)) {
|
if(VERSION.SDK_INT >= 28 && (deviceOwner || profileOwner)) {
|
||||||
SubPageItem(R.string.clear_app_storage, "", R.drawable.mop_fill0) {
|
SubPageItem(R.string.clear_app_storage, "", R.drawable.mop_fill0) {
|
||||||
if(pkgName != "") dialogStatus.intValue = 5
|
if(pkgName != "") dialogStatus.intValue = 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!sharedPrefs.getBoolean("dhizuku", false)) {
|
|
||||||
SubPageItem(R.string.install_app, "", R.drawable.install_mobile_fill0) { navCtrl.navigate("InstallApp") }
|
SubPageItem(R.string.install_app, "", R.drawable.install_mobile_fill0) { navCtrl.navigate("InstallApp") }
|
||||||
}
|
|
||||||
SubPageItem(R.string.uninstall_app, "", R.drawable.delete_fill0) { navCtrl.navigate("UninstallApp") }
|
SubPageItem(R.string.uninstall_app, "", R.drawable.delete_fill0) { navCtrl.navigate("UninstallApp") }
|
||||||
if(VERSION.SDK_INT >= 34 && (deviceOwner || dpm.isOrgProfile(receiver))) {
|
if(VERSION.SDK_INT >= 34 && (deviceOwner || dpm.isOrgProfile(receiver))) {
|
||||||
SubPageItem(R.string.set_default_dialer, "", R.drawable.call_fill0) {
|
SubPageItem(R.string.set_default_dialer, "", R.drawable.call_fill0) {
|
||||||
if(pkgName != "") dialogStatus.intValue = 6
|
if(pkgName != "") dialogStatus.intValue = 3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Spacer(Modifier.padding(vertical = 30.dp))
|
Spacer(Modifier.padding(vertical = 30.dp))
|
||||||
LaunchedEffect(Unit) { fileUriFlow.value = Uri.parse("") }
|
LaunchedEffect(Unit) { fileUriFlow.value = Uri.parse("") }
|
||||||
}
|
}
|
||||||
|
if(appControlDialog) {
|
||||||
|
LaunchedEffect(Unit) {
|
||||||
|
focusMgr.clearFocus()
|
||||||
|
}
|
||||||
|
AlertDialog(
|
||||||
|
onDismissRequest = { appControlDialog = false },
|
||||||
|
title = {
|
||||||
|
Text(
|
||||||
|
text = stringResource(
|
||||||
|
when(appControlAction) {
|
||||||
|
1 -> R.string.suspend
|
||||||
|
2 -> R.string.hide
|
||||||
|
3 -> R.string.block_uninstall
|
||||||
|
4 -> R.string.always_on_vpn
|
||||||
|
else -> R.string.unknown
|
||||||
|
}
|
||||||
|
),
|
||||||
|
style = typography.headlineMedium,
|
||||||
|
modifier = Modifier.padding(start = 5.dp)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
text = {
|
||||||
|
val enabled = when(appControlAction){
|
||||||
|
1 -> suspend
|
||||||
|
2 -> hide
|
||||||
|
3 -> blockUninstall
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.current_state, stringResource(if(enabled) R.string.enabled else R.string.disabled)),
|
||||||
|
modifier = Modifier.padding(start = 5.dp, top = 5.dp, bottom = 5.dp)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
confirmButton = {
|
||||||
|
TextButton(
|
||||||
|
onClick = {
|
||||||
|
appControl(true)
|
||||||
|
appControlDialog = false
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
Text(text = stringResource(R.string.enable))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dismissButton = {
|
||||||
|
TextButton(
|
||||||
|
onClick = {
|
||||||
|
appControl(false)
|
||||||
|
appControlDialog = false
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
Text(text = stringResource(R.string.disable))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
@@ -319,7 +373,7 @@ fun AlwaysOnVPNPackage(pkgName: String) {
|
|||||||
Spacer(Modifier.padding(vertical = 10.dp))
|
Spacer(Modifier.padding(vertical = 10.dp))
|
||||||
Text(text = stringResource(R.string.always_on_vpn), style = typography.headlineLarge, modifier = Modifier.padding(vertical = 8.dp))
|
Text(text = stringResource(R.string.always_on_vpn), style = typography.headlineLarge, modifier = Modifier.padding(vertical = 8.dp))
|
||||||
Text(text = stringResource(R.string.current_app_is) + pkg, modifier = Modifier.padding(vertical = 8.dp))
|
Text(text = stringResource(R.string.current_app_is) + pkg, modifier = Modifier.padding(vertical = 8.dp))
|
||||||
SwitchItem(R.string.enable_lockdown, "", null, { lockdown }, { lockdown = it }, padding = false)
|
SwitchItem(R.string.enable_lockdown, "", null, lockdown, { lockdown = it }, padding = false)
|
||||||
Spacer(Modifier.padding(vertical = 5.dp))
|
Spacer(Modifier.padding(vertical = 5.dp))
|
||||||
Button(
|
Button(
|
||||||
onClick = { setAlwaysOnVpn(pkgName, lockdown); refresh() },
|
onClick = { setAlwaysOnVpn(pkgName, lockdown); refresh() },
|
||||||
@@ -809,7 +863,7 @@ private fun PermittedIME(pkgName: String) {
|
|||||||
Text(text = stringResource(R.string.permitted_ime), style = typography.headlineLarge)
|
Text(text = stringResource(R.string.permitted_ime), style = typography.headlineLarge)
|
||||||
Spacer(Modifier.padding(vertical = 5.dp))
|
Spacer(Modifier.padding(vertical = 5.dp))
|
||||||
SwitchItem(
|
SwitchItem(
|
||||||
R.string.allow_all, "", null, { allowAll },
|
R.string.allow_all, "", null, allowAll,
|
||||||
{
|
{
|
||||||
dpm.setPermittedInputMethods(receiver, if(it) null else listOf())
|
dpm.setPermittedInputMethods(receiver, if(it) null else listOf())
|
||||||
refresh()
|
refresh()
|
||||||
@@ -963,6 +1017,7 @@ private fun InstallApp() {
|
|||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val focusMgr = LocalFocusManager.current
|
val focusMgr = LocalFocusManager.current
|
||||||
val selected = fileUriFlow.collectAsState().value != Uri.parse("")
|
val selected = fileUriFlow.collectAsState().value != Uri.parse("")
|
||||||
|
val sharedPrefs = context.getSharedPreferences("data", Context.MODE_PRIVATE)
|
||||||
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.install_app), style = typography.headlineLarge)
|
Text(text = stringResource(R.string.install_app), style = typography.headlineLarge)
|
||||||
@@ -988,6 +1043,7 @@ private fun InstallApp() {
|
|||||||
intent.data = fileUriFlow.value
|
intent.data = fileUriFlow.value
|
||||||
context.startActivity(intent)
|
context.startActivity(intent)
|
||||||
},
|
},
|
||||||
|
enabled = !sharedPrefs.getBoolean("dhizuku", false) && context.isDeviceOwner,
|
||||||
modifier = Modifier.fillMaxWidth()
|
modifier = Modifier.fillMaxWidth()
|
||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.silent_install))
|
Text(stringResource(R.string.silent_install))
|
||||||
@@ -1121,46 +1177,3 @@ private fun EnableSystemAppDialog(status: MutableIntState, pkgName: String) {
|
|||||||
modifier = Modifier.fillMaxWidth()
|
modifier = Modifier.fillMaxWidth()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
|
||||||
private fun AppControlDialog(status: MutableIntState) {
|
|
||||||
val enabled = dialogGetStatus()
|
|
||||||
AlertDialog(
|
|
||||||
onDismissRequest = { status.intValue = 0 },
|
|
||||||
title = {
|
|
||||||
Text(
|
|
||||||
text = stringResource(
|
|
||||||
when(status.intValue) {
|
|
||||||
1 -> R.string.suspend
|
|
||||||
2 -> R.string.hide
|
|
||||||
3 -> R.string.block_uninstall
|
|
||||||
4 -> R.string.always_on_vpn
|
|
||||||
else -> R.string.unknown
|
|
||||||
}
|
|
||||||
),
|
|
||||||
style = typography.headlineMedium,
|
|
||||||
modifier = Modifier.padding(start = 5.dp)
|
|
||||||
)
|
|
||||||
},
|
|
||||||
text = {
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.current_status_is) + stringResource(if(enabled) R.string.enabled else R.string.disabled),
|
|
||||||
modifier = Modifier.padding(start = 5.dp, top = 5.dp, bottom = 5.dp)
|
|
||||||
)
|
|
||||||
},
|
|
||||||
confirmButton = {
|
|
||||||
TextButton(
|
|
||||||
onClick = { dialogConfirmButtonAction(); status.intValue = 0 }
|
|
||||||
) {
|
|
||||||
Text(text = stringResource(R.string.enable))
|
|
||||||
}
|
|
||||||
},
|
|
||||||
dismissButton = {
|
|
||||||
TextButton(
|
|
||||||
onClick = { dialogDismissButtonAction(); status.intValue = 0 }
|
|
||||||
) {
|
|
||||||
Text(text = stringResource(R.string.disable))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -12,10 +12,12 @@ import android.content.Context
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.IPackageInstaller
|
import android.content.pm.IPackageInstaller
|
||||||
import android.content.pm.PackageInstaller
|
import android.content.pm.PackageInstaller
|
||||||
|
import android.content.pm.PackageManager
|
||||||
import android.os.Build.VERSION
|
import android.os.Build.VERSION
|
||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
import androidx.annotation.DrawableRes
|
import androidx.annotation.DrawableRes
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
|
import com.bintianqi.owndroid.InstallAppActivity
|
||||||
import com.bintianqi.owndroid.PackageInstallerReceiver
|
import com.bintianqi.owndroid.PackageInstallerReceiver
|
||||||
import com.bintianqi.owndroid.R
|
import com.bintianqi.owndroid.R
|
||||||
import com.bintianqi.owndroid.Receiver
|
import com.bintianqi.owndroid.Receiver
|
||||||
@@ -230,6 +232,15 @@ fun Context.resetDevicePolicy() {
|
|||||||
dpm.setRecommendedGlobalProxy(receiver, null)
|
dpm.setRecommendedGlobalProxy(receiver, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Context.toggleInstallAppActivity() {
|
||||||
|
val sharedPrefs = getSharedPreferences("data", Context.MODE_PRIVATE)
|
||||||
|
val disable = sharedPrefs.getBoolean("dhizuku", false) || !isDeviceOwner
|
||||||
|
packageManager?.setComponentEnabledSetting(
|
||||||
|
ComponentName(this, InstallAppActivity::class.java),
|
||||||
|
if (disable) PackageManager.COMPONENT_ENABLED_STATE_DISABLED else PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
|
||||||
|
PackageManager.DONT_KILL_APP
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
data class PermissionItem(
|
data class PermissionItem(
|
||||||
val permission: String,
|
val permission: String,
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import androidx.compose.foundation.layout.Column
|
|||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.offset
|
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.rememberScrollState
|
import androidx.compose.foundation.rememberScrollState
|
||||||
import androidx.compose.foundation.text.KeyboardActions
|
import androidx.compose.foundation.text.KeyboardActions
|
||||||
@@ -190,12 +189,16 @@ private fun SuspendPersonalApp() {
|
|||||||
val dpm = context.getDPM()
|
val dpm = context.getDPM()
|
||||||
val receiver = context.getReceiver()
|
val receiver = context.getReceiver()
|
||||||
val focusMgr = LocalFocusManager.current
|
val focusMgr = LocalFocusManager.current
|
||||||
|
var suspend by remember { mutableStateOf(dpm.getPersonalAppsSuspendedReasons(receiver) != PERSONAL_APPS_NOT_SUSPENDED) }
|
||||||
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))
|
||||||
SwitchItem(
|
SwitchItem(
|
||||||
R.string.suspend_personal_app, "", null,
|
R.string.suspend_personal_app, "", null,
|
||||||
{ dpm.getPersonalAppsSuspendedReasons(receiver)!=PERSONAL_APPS_NOT_SUSPENDED },
|
suspend,
|
||||||
{ dpm.setPersonalAppsSuspended(receiver,it) }, padding = false
|
{
|
||||||
|
dpm.setPersonalAppsSuspended(receiver,it)
|
||||||
|
suspend = dpm.getPersonalAppsSuspendedReasons(receiver) != PERSONAL_APPS_NOT_SUSPENDED
|
||||||
|
}, padding = false
|
||||||
)
|
)
|
||||||
var time by remember { mutableStateOf("") }
|
var time by remember { mutableStateOf("") }
|
||||||
time = dpm.getManagedProfileMaximumTimeOff(receiver).toString()
|
time = dpm.getManagedProfileMaximumTimeOff(receiver).toString()
|
||||||
|
|||||||
@@ -547,7 +547,7 @@ private fun NetworkLog() {
|
|||||||
Spacer(Modifier.padding(vertical = 5.dp))
|
Spacer(Modifier.padding(vertical = 5.dp))
|
||||||
Text(text = stringResource(R.string.developing))
|
Text(text = stringResource(R.string.developing))
|
||||||
Spacer(Modifier.padding(vertical = 5.dp))
|
Spacer(Modifier.padding(vertical = 5.dp))
|
||||||
SwitchItem(R.string.enable,"",null, {dpm.isNetworkLoggingEnabled(receiver) }, {dpm.setNetworkLoggingEnabled(receiver,it) }, padding = false)
|
SwitchItem(R.string.enable,"",null, { dpm.isNetworkLoggingEnabled(receiver) }, {dpm.setNetworkLoggingEnabled(receiver,it) }, padding = false)
|
||||||
Spacer(Modifier.padding(vertical = 5.dp))
|
Spacer(Modifier.padding(vertical = 5.dp))
|
||||||
Button(
|
Button(
|
||||||
onClick = {
|
onClick = {
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ import androidx.compose.foundation.layout.Row
|
|||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.offset
|
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.rememberScrollState
|
import androidx.compose.foundation.rememberScrollState
|
||||||
import androidx.compose.foundation.text.KeyboardActions
|
import androidx.compose.foundation.text.KeyboardActions
|
||||||
|
|||||||
@@ -90,7 +90,6 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) {
|
|||||||
val dpm = context.getDPM()
|
val dpm = context.getDPM()
|
||||||
val receiver = context.getReceiver()
|
val receiver = context.getReceiver()
|
||||||
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
|
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
|
||||||
var dhizukuStatus by remember { mutableStateOf(sharedPref.getBoolean("dhizuku", false)) }
|
|
||||||
val deviceAdmin = context.isDeviceAdmin
|
val deviceAdmin = context.isDeviceAdmin
|
||||||
val deviceOwner = context.isDeviceOwner
|
val deviceOwner = context.isDeviceOwner
|
||||||
val profileOwner = context.isProfileOwner
|
val profileOwner = context.isProfileOwner
|
||||||
@@ -103,10 +102,9 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState) {
|
|||||||
if(!dpm.isDeviceOwnerApp(context.packageName)) {
|
if(!dpm.isDeviceOwnerApp(context.packageName)) {
|
||||||
SwitchItem(
|
SwitchItem(
|
||||||
R.string.dhizuku, "", null,
|
R.string.dhizuku, "", null,
|
||||||
{ dhizukuStatus },
|
{ sharedPref.getBoolean("dhizuku", false) },
|
||||||
{
|
{
|
||||||
toggleDhizukuMode(it, context)
|
toggleDhizukuMode(it, context)
|
||||||
dhizukuStatus = sharedPref.getBoolean("dhizuku", false)
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -171,6 +169,7 @@ private fun toggleDhizukuMode(status: Boolean, context: Context) {
|
|||||||
override fun onRequestPermission(grantResult: Int) {
|
override fun onRequestPermission(grantResult: Int) {
|
||||||
if(grantResult == PackageManager.PERMISSION_GRANTED) {
|
if(grantResult == PackageManager.PERMISSION_GRANTED) {
|
||||||
sharedPref.edit().putBoolean("dhizuku", true).apply()
|
sharedPref.edit().putBoolean("dhizuku", true).apply()
|
||||||
|
context.toggleInstallAppActivity()
|
||||||
backToHomeStateFlow.value = true
|
backToHomeStateFlow.value = true
|
||||||
} else {
|
} else {
|
||||||
dhizukuErrorStatus.value = 2
|
dhizukuErrorStatus.value = 2
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.Row
|
|||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.offset
|
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.rememberScrollState
|
import androidx.compose.foundation.rememberScrollState
|
||||||
import androidx.compose.foundation.text.KeyboardActions
|
import androidx.compose.foundation.text.KeyboardActions
|
||||||
|
|||||||
@@ -195,7 +195,7 @@ private fun UserRestrictionItem(
|
|||||||
val receiver = context.getReceiver()
|
val receiver = context.getReceiver()
|
||||||
Box(modifier = Modifier.padding(start = 22.dp, end = 16.dp)) {
|
Box(modifier = Modifier.padding(start = 22.dp, end = 16.dp)) {
|
||||||
SwitchItem(
|
SwitchItem(
|
||||||
itemName,restrictionDescription,leadIcon,
|
itemName, restrictionDescription, leadIcon,
|
||||||
{ dpm.getUserRestrictions(receiver).getBoolean(restriction) },
|
{ dpm.getUserRestrictions(receiver).getBoolean(restriction) },
|
||||||
{
|
{
|
||||||
try{
|
try{
|
||||||
|
|||||||
@@ -124,6 +124,7 @@ fun CheckBoxItem(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun SwitchItem(
|
fun SwitchItem(
|
||||||
@StringRes title: Int,
|
@StringRes title: Int,
|
||||||
@@ -135,7 +136,21 @@ fun SwitchItem(
|
|||||||
onClickBlank: (() -> Unit)? = null,
|
onClickBlank: (() -> Unit)? = null,
|
||||||
padding: Boolean = true
|
padding: Boolean = true
|
||||||
) {
|
) {
|
||||||
var checked by remember { mutableStateOf(getState()) }
|
var state by remember { mutableStateOf(getState()) }
|
||||||
|
SwitchItem(title, desc, icon, state, { onCheckedChange(it); state = getState() }, enable, onClickBlank, padding)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun SwitchItem(
|
||||||
|
@StringRes title: Int,
|
||||||
|
desc: String,
|
||||||
|
@DrawableRes icon: Int?,
|
||||||
|
state: Boolean,
|
||||||
|
onCheckedChange: (Boolean)->Unit,
|
||||||
|
enable: Boolean = true,
|
||||||
|
onClickBlank: (() -> Unit)? = null,
|
||||||
|
padding: Boolean = true
|
||||||
|
) {
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
@@ -159,7 +174,7 @@ fun SwitchItem(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Switch(
|
Switch(
|
||||||
checked = checked, onCheckedChange = { onCheckedChange(it); checked = getState() },
|
checked = state, onCheckedChange = { onCheckedChange(it) },
|
||||||
modifier = Modifier.align(Alignment.CenterEnd), enabled = enable
|
modifier = Modifier.align(Alignment.CenterEnd), enabled = enable
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,7 +124,6 @@
|
|||||||
<string name="disable_cam">Kamerayı devre dışı bırak</string>
|
<string name="disable_cam">Kamerayı devre dışı bırak</string>
|
||||||
<string name="disable_screen_capture">Ekran görüntüsünü devre dışı bırak</string>
|
<string name="disable_screen_capture">Ekran görüntüsünü devre dışı bırak</string>
|
||||||
<string name="disable_status_bar">Durum çubuğunu devre dışı bırak</string>
|
<string name="disable_status_bar">Durum çubuğunu devre dışı bırak</string>
|
||||||
<string name="also_disable_aosp_screen_record">AOSP\'de ekran kaydını da devre dışı bırak</string>
|
|
||||||
<string name="auto_time">Otomatik saat</string>
|
<string name="auto_time">Otomatik saat</string>
|
||||||
<string name="require_auto_time">Otomatik saat gerektir</string>
|
<string name="require_auto_time">Otomatik saat gerektir</string>
|
||||||
<string name="auto_timezone">Otomatik saat dilimi</string>
|
<string name="auto_timezone">Otomatik saat dilimi</string>
|
||||||
@@ -132,7 +131,6 @@
|
|||||||
<string name="backup_service">Yedekleme servisi</string>
|
<string name="backup_service">Yedekleme servisi</string>
|
||||||
<string name="disable_bt_contact_share">Bluetooth kişi paylaşımını devre dışı bırak</string>
|
<string name="disable_bt_contact_share">Bluetooth kişi paylaşımını devre dışı bırak</string>
|
||||||
<string name="common_criteria_mode">Ortak kriter modu</string>
|
<string name="common_criteria_mode">Ortak kriter modu</string>
|
||||||
<string name="common_criteria_mode_desc">Bilinmeyen etki</string>
|
|
||||||
<string name="usb_signal">USB sinyali</string>
|
<string name="usb_signal">USB sinyali</string>
|
||||||
<string name="keyguard">Ekran kilidi</string>
|
<string name="keyguard">Ekran kilidi</string>
|
||||||
<string name="require_no_password_to_disable">Ekran kilidini devre dışı bırakmak için parola ayarlanmamış olmalıdır</string>
|
<string name="require_no_password_to_disable">Ekran kilidini devre dışı bırakmak için parola ayarlanmamış olmalıdır</string>
|
||||||
@@ -398,7 +396,6 @@
|
|||||||
<string name="install_unknown_src_globally">Bilinmeyen kaynakları global olarak yükle</string>
|
<string name="install_unknown_src_globally">Bilinmeyen kaynakları global olarak yükle</string>
|
||||||
<string name="inst_unknown_src">Bilinmeyen kaynakları yükle</string>
|
<string name="inst_unknown_src">Bilinmeyen kaynakları yükle</string>
|
||||||
<string name="apps_ctrl">Uygulama kontrolü</string>
|
<string name="apps_ctrl">Uygulama kontrolü</string>
|
||||||
<string name="apps_control_desc">Uygulama verilerini veya önbelleği temizle</string>
|
|
||||||
<string name="config_default_apps">Varsayılan uygulamaları yapılandır</string>
|
<string name="config_default_apps">Varsayılan uygulamaları yapılandır</string>
|
||||||
|
|
||||||
<string name="config_brightness">Parlaklığı yapılandır</string>
|
<string name="config_brightness">Parlaklığı yapılandır</string>
|
||||||
@@ -422,11 +419,9 @@
|
|||||||
<string name="content_capture">İçerik yakalama</string>
|
<string name="content_capture">İçerik yakalama</string>
|
||||||
<string name="content_suggestions">İçerik önerileri</string>
|
<string name="content_suggestions">İçerik önerileri</string>
|
||||||
<string name="create_windows">Pencere oluştur</string>
|
<string name="create_windows">Pencere oluştur</string>
|
||||||
<string name="create_windows_desc">ör. tostlar, bildirim afişi</string>
|
|
||||||
<string name="set_wallpaper">Duvar kağıdı ayarla</string>
|
<string name="set_wallpaper">Duvar kağıdı ayarla</string>
|
||||||
<string name="grant_admin">Cihaz yöneticisi yetkisi ver</string>
|
<string name="grant_admin">Cihaz yöneticisi yetkisi ver</string>
|
||||||
<string name="fun">Eğlence</string>
|
<string name="fun">Eğlence</string>
|
||||||
<string name="fun_desc">Oyunları devre dışı bırakabilir</string>
|
|
||||||
<string name="modify_accounts">Hesapları değiştir</string>
|
<string name="modify_accounts">Hesapları değiştir</string>
|
||||||
<string name="config_locale">Yerel ayarları yapılandır</string>
|
<string name="config_locale">Yerel ayarları yapılandır</string>
|
||||||
<string name="config_date_time">Tarihi veya saati yapılandır</string>
|
<string name="config_date_time">Tarihi veya saati yapılandır</string>
|
||||||
@@ -544,7 +539,6 @@
|
|||||||
<string name="material_you_color">Material You rengi</string>
|
<string name="material_you_color">Material You rengi</string>
|
||||||
<string name="dynamic_color_desc">Android 12+</string>
|
<string name="dynamic_color_desc">Android 12+</string>
|
||||||
<string name="about">Hakkında</string>
|
<string name="about">Hakkında</string>
|
||||||
<string name="about_desc">Cihazınızı tam kontrol altına almak için Cihaz yöneticisi, Profil sahibi ve Cihaz sahibi ayrıcalıklarını kullanın.</string>
|
|
||||||
<string name="user_guide">Kullanıcı rehberi</string>
|
<string name="user_guide">Kullanıcı rehberi</string>
|
||||||
<string name="source_code">Kaynak kodu</string>
|
<string name="source_code">Kaynak kodu</string>
|
||||||
<string name="theme">Tema</string>
|
<string name="theme">Tema</string>
|
||||||
@@ -555,7 +549,6 @@
|
|||||||
<string name="lock_owndroid">OwnDroid\'u kilitle</string>
|
<string name="lock_owndroid">OwnDroid\'u kilitle</string>
|
||||||
<string name="enable_bio_auth">Biyometri ile doğrulama</string>
|
<string name="enable_bio_auth">Biyometri ile doğrulama</string>
|
||||||
<string name="authenticate">Doğrula</string>
|
<string name="authenticate">Doğrula</string>
|
||||||
<string name="auth_on_start">OwnDroid başlatıldığında ana ekran şifresi veya biyometri ile doğrulama</string>
|
|
||||||
<string name="use_password">Şifre kullan</string>
|
<string name="use_password">Şifre kullan</string>
|
||||||
<string name="auth_with_password">OwnDroid\'u şifre ile doğrula</string>
|
<string name="auth_with_password">OwnDroid\'u şifre ile doğrula</string>
|
||||||
<string name="auth_with_bio">OwnDroid\'u biyometri ile doğrula</string>
|
<string name="auth_with_bio">OwnDroid\'u biyometri ile doğrula</string>
|
||||||
|
|||||||
@@ -119,7 +119,6 @@
|
|||||||
<string name="disable_cam">禁用相机</string>
|
<string name="disable_cam">禁用相机</string>
|
||||||
<string name="disable_screen_capture">禁止屏幕捕获</string>
|
<string name="disable_screen_capture">禁止屏幕捕获</string>
|
||||||
<string name="disable_status_bar">禁用状态栏</string>
|
<string name="disable_status_bar">禁用状态栏</string>
|
||||||
<string name="also_disable_aosp_screen_record">对AOSP的录屏也起作用</string>
|
|
||||||
<string name="auto_time">自动设置时间</string>
|
<string name="auto_time">自动设置时间</string>
|
||||||
<string name="auto_timezone">自动设置时区</string>
|
<string name="auto_timezone">自动设置时区</string>
|
||||||
<string name="require_auto_time">要求自动时间</string>
|
<string name="require_auto_time">要求自动时间</string>
|
||||||
@@ -127,7 +126,6 @@
|
|||||||
<string name="backup_service">备份服务</string>
|
<string name="backup_service">备份服务</string>
|
||||||
<string name="disable_bt_contact_share">禁止蓝牙分享联系人</string>
|
<string name="disable_bt_contact_share">禁止蓝牙分享联系人</string>
|
||||||
<string name="common_criteria_mode">通用标准模式</string>
|
<string name="common_criteria_mode">通用标准模式</string>
|
||||||
<string name="common_criteria_mode_desc">Common Criteria</string>
|
|
||||||
<string name="usb_signal">USB信号</string>
|
<string name="usb_signal">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>
|
||||||
@@ -390,7 +388,6 @@
|
|||||||
<string name="install_unknown_src_globally">安装未知来源应用(全局)</string>
|
<string name="install_unknown_src_globally">安装未知来源应用(全局)</string>
|
||||||
<string name="inst_unknown_src">安装未知来源应用</string>
|
<string name="inst_unknown_src">安装未知来源应用</string>
|
||||||
<string name="apps_ctrl">控制应用</string>
|
<string name="apps_ctrl">控制应用</string>
|
||||||
<string name="apps_control_desc">清空缓存/清空内部存储</string>
|
|
||||||
<string name="config_default_apps">修改默认App</string>
|
<string name="config_default_apps">修改默认App</string>
|
||||||
|
|
||||||
<string name="config_brightness">调整亮度</string>
|
<string name="config_brightness">调整亮度</string>
|
||||||
@@ -414,11 +411,9 @@
|
|||||||
<string name="content_capture">内容捕获</string>
|
<string name="content_capture">内容捕获</string>
|
||||||
<string name="content_suggestions">内容建议</string>
|
<string name="content_suggestions">内容建议</string>
|
||||||
<string name="create_windows">创建窗口</string>
|
<string name="create_windows">创建窗口</string>
|
||||||
<string name="create_windows_desc">可能包括Toast和浮动通知</string>
|
|
||||||
<string name="set_wallpaper">更换壁纸</string>
|
<string name="set_wallpaper">更换壁纸</string>
|
||||||
<string name="grant_admin">启用设备管理器</string>
|
<string name="grant_admin">启用设备管理器</string>
|
||||||
<string name="fun">娱乐</string>
|
<string name="fun">娱乐</string>
|
||||||
<string name="fun_desc">会影响谷歌商店的游戏</string>
|
|
||||||
<string name="modify_accounts">修改账号设置</string>
|
<string name="modify_accounts">修改账号设置</string>
|
||||||
<string name="config_locale">修改语言</string>
|
<string name="config_locale">修改语言</string>
|
||||||
<string name="config_date_time">修改日期、时间</string>
|
<string name="config_date_time">修改日期、时间</string>
|
||||||
@@ -536,7 +531,6 @@
|
|||||||
<string name="material_you_color">Material you 颜色</string>
|
<string name="material_you_color">Material you 颜色</string>
|
||||||
<string name="dynamic_color_desc">安卓12+</string>
|
<string name="dynamic_color_desc">安卓12+</string>
|
||||||
<string name="about">关于</string>
|
<string name="about">关于</string>
|
||||||
<string name="about_desc">使用安卓的Device admin、Device owner、Profile owner,全方位掌控你的设备</string>
|
|
||||||
<string name="user_guide">使用教程</string>
|
<string name="user_guide">使用教程</string>
|
||||||
<string name="source_code">源代码</string>
|
<string name="source_code">源代码</string>
|
||||||
<string name="theme">主题</string>
|
<string name="theme">主题</string>
|
||||||
@@ -547,7 +541,6 @@
|
|||||||
<string name="lock_owndroid">锁定OwnDroid</string>
|
<string name="lock_owndroid">锁定OwnDroid</string>
|
||||||
<string name="enable_bio_auth">使用生物识别</string>
|
<string name="enable_bio_auth">使用生物识别</string>
|
||||||
<string name="authenticate">验证</string>
|
<string name="authenticate">验证</string>
|
||||||
<string name="auth_on_start">在OwnDroid启动时使用锁屏密码或生物识别进行验证</string>
|
|
||||||
<string name="use_password">使用密码</string>
|
<string name="use_password">使用密码</string>
|
||||||
<string name="auth_with_password">使用密码进行验证</string>
|
<string name="auth_with_password">使用密码进行验证</string>
|
||||||
<string name="auth_with_bio">使用生物识别进行验证</string>
|
<string name="auth_with_bio">使用生物识别进行验证</string>
|
||||||
|
|||||||
@@ -128,7 +128,6 @@
|
|||||||
<string name="disable_cam">Disable camera</string>
|
<string name="disable_cam">Disable camera</string>
|
||||||
<string name="disable_screen_capture">Disable screen capture</string>
|
<string name="disable_screen_capture">Disable screen capture</string>
|
||||||
<string name="disable_status_bar">Disable status bar</string>
|
<string name="disable_status_bar">Disable status bar</string>
|
||||||
<string name="also_disable_aosp_screen_record">Also disable screen record in AOSP. </string>
|
|
||||||
<string name="auto_time">Auto time</string>
|
<string name="auto_time">Auto time</string>
|
||||||
<string name="require_auto_time">Require auto time</string>
|
<string name="require_auto_time">Require auto time</string>
|
||||||
<string name="auto_timezone">Auto timezone</string>
|
<string name="auto_timezone">Auto timezone</string>
|
||||||
@@ -136,7 +135,6 @@
|
|||||||
<string name="backup_service">Backup service</string>
|
<string name="backup_service">Backup service</string>
|
||||||
<string name="disable_bt_contact_share">Disable bluetooth contact sharing</string>
|
<string name="disable_bt_contact_share">Disable bluetooth contact sharing</string>
|
||||||
<string name="common_criteria_mode">Common criteria mode</string>
|
<string name="common_criteria_mode">Common criteria mode</string>
|
||||||
<string name="common_criteria_mode_desc">Unknown effect</string>
|
|
||||||
<string name="usb_signal">USB signal</string>
|
<string name="usb_signal">USB signal</string>
|
||||||
<string name="keyguard">Keyguard</string>
|
<string name="keyguard">Keyguard</string>
|
||||||
<string name="require_no_password_to_disable">Disable keyguard require no password is set. </string>
|
<string name="require_no_password_to_disable">Disable keyguard require no password is set. </string>
|
||||||
@@ -403,7 +401,6 @@
|
|||||||
<string name="install_unknown_src_globally">Install unknown sources globally</string>
|
<string name="install_unknown_src_globally">Install unknown sources globally</string>
|
||||||
<string name="inst_unknown_src">Install unknown sources</string>
|
<string name="inst_unknown_src">Install unknown sources</string>
|
||||||
<string name="apps_ctrl">Apps control</string>
|
<string name="apps_ctrl">Apps control</string>
|
||||||
<string name="apps_control_desc">Clear app data or cache</string>
|
|
||||||
<string name="config_default_apps">Configure default apps</string>
|
<string name="config_default_apps">Configure default apps</string>
|
||||||
|
|
||||||
<string name="config_brightness">Configure brightness</string>
|
<string name="config_brightness">Configure brightness</string>
|
||||||
@@ -427,11 +424,9 @@
|
|||||||
<string name="content_capture">Content capture</string>
|
<string name="content_capture">Content capture</string>
|
||||||
<string name="content_suggestions">Content suggestions</string>
|
<string name="content_suggestions">Content suggestions</string>
|
||||||
<string name="create_windows">Create windows</string>
|
<string name="create_windows">Create windows</string>
|
||||||
<string name="create_windows_desc">e.g. toasts, notifications banner</string>
|
|
||||||
<string name="set_wallpaper">Set wallpaper</string>
|
<string name="set_wallpaper">Set wallpaper</string>
|
||||||
<string name="grant_admin">Grant device admin</string>
|
<string name="grant_admin">Grant device admin</string>
|
||||||
<string name="fun">Fun</string>
|
<string name="fun">Fun</string>
|
||||||
<string name="fun_desc">May disable games</string>
|
|
||||||
<string name="modify_accounts">Modify accounts</string>
|
<string name="modify_accounts">Modify accounts</string>
|
||||||
<string name="config_locale">Configure locale</string>
|
<string name="config_locale">Configure locale</string>
|
||||||
<string name="config_date_time">Configure date or time</string>
|
<string name="config_date_time">Configure date or time</string>
|
||||||
@@ -549,7 +544,6 @@
|
|||||||
<string name="material_you_color">Material you color</string>
|
<string name="material_you_color">Material you color</string>
|
||||||
<string name="dynamic_color_desc">Android 12+</string>
|
<string name="dynamic_color_desc">Android 12+</string>
|
||||||
<string name="about">About</string>
|
<string name="about">About</string>
|
||||||
<string name="about_desc">Use Device admin, Profile owner and Device owner privilege to take full control of your device. </string>
|
|
||||||
<string name="user_guide">User guide</string>
|
<string name="user_guide">User guide</string>
|
||||||
<string name="source_code">Source code</string>
|
<string name="source_code">Source code</string>
|
||||||
<string name="theme">Theme</string>
|
<string name="theme">Theme</string>
|
||||||
@@ -560,7 +554,6 @@
|
|||||||
<string name="lock_owndroid">Lock OwnDroid</string>
|
<string name="lock_owndroid">Lock OwnDroid</string>
|
||||||
<string name="enable_bio_auth">Auth with biometrics</string>
|
<string name="enable_bio_auth">Auth with biometrics</string>
|
||||||
<string name="authenticate">Authenticate</string>
|
<string name="authenticate">Authenticate</string>
|
||||||
<string name="auth_on_start">Authenticating with keyguard password or biometrics when OwnDroid launch</string>
|
|
||||||
<string name="use_password">Use password</string>
|
<string name="use_password">Use password</string>
|
||||||
<string name="auth_with_password">Authenticate OwnDroid with password</string>
|
<string name="auth_with_password">Authenticate OwnDroid with password</string>
|
||||||
<string name="auth_with_bio">Authenticate OwnDroid with biometrics</string>
|
<string name="auth_with_bio">Authenticate OwnDroid with biometrics</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user