mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-23 19:15:58 +00:00
Transfer ownership warning dialog
Update READMEs Display restriction id under UserRestrictionItem Optimize some Shizuku-related features Delay setting default affiliation id to wait Dhizuku initialize, fix #85
This commit is contained in:
3
Guide.md
3
Guide.md
@@ -1,3 +0,0 @@
|
||||
The new OwnDroid docs are available on [owndroid.pages.dev](https://owndroid.pages.dev)
|
||||
|
||||
请在[owndroid.pages.dev](https://owndroid.pages.dev)查看新的OwnDroid文档
|
||||
@@ -6,10 +6,6 @@
|
||||
|
||||
Use Device admin and Device owner privilege to take full control of your device.
|
||||
|
||||
### Docs
|
||||
|
||||
A renewed OwnDroid docs are available on [owndroid.pages.dev](https://owndroid.pages.dev)
|
||||
|
||||
### Advantage
|
||||
|
||||
- Open source. Device owner privilege could be more dangerous than root, close-source software's security is not guaranteed.
|
||||
|
||||
@@ -6,10 +6,6 @@
|
||||
|
||||
使用安卓的Device Admin和Device Owner特权,完全掌控你的设备。
|
||||
|
||||
### 文档
|
||||
|
||||
全新的OwnDroid文档:[owndroid.pages.dev](https://owndroid.pages.dev/zh_CN)
|
||||
|
||||
### 优点
|
||||
|
||||
- 开源。Device owner权限可能比root权限更危险,闭源软件的安全性没有保证
|
||||
|
||||
@@ -3,5 +3,5 @@ package com.bintianqi.owndroid;
|
||||
interface IUserService {
|
||||
void destroy() = 16777114;
|
||||
String execute(String command) = 1;
|
||||
String getUid() = 2;
|
||||
int getUid() = 2;
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ class MainActivity : FragmentActivity() {
|
||||
toggleInstallAppActivity()
|
||||
val vm by viewModels<MyViewModel>()
|
||||
if(!vm.initialized) vm.initialize(context)
|
||||
lifecycleScope.launch { setDefaultAffiliationID(context) }
|
||||
lifecycleScope.launch { delay(5000); setDefaultAffiliationID(context) }
|
||||
setContent {
|
||||
OwnDroidTheme(vm) {
|
||||
Home(vm)
|
||||
|
||||
@@ -17,6 +17,7 @@ import android.content.pm.PackageInstaller
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build.VERSION
|
||||
import android.os.UserManager
|
||||
import android.util.Log
|
||||
import androidx.activity.result.ActivityResultLauncher
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.annotation.RequiresApi
|
||||
@@ -116,7 +117,7 @@ private fun binderWrapperDevicePolicyManager(appContext: Context): DevicePolicyM
|
||||
val newInterface = IDevicePolicyManager.Stub.asInterface(newBinder)
|
||||
field[manager] = newInterface
|
||||
return manager
|
||||
} catch (e: Exception) {
|
||||
} catch (_: Exception) {
|
||||
dhizukuErrorStatus.value = 1
|
||||
}
|
||||
return null
|
||||
@@ -136,7 +137,7 @@ private fun binderWrapperPackageInstaller(appContext: Context): PackageInstaller
|
||||
val newInterface = IPackageInstaller.Stub.asInterface(newBinder)
|
||||
field[installer] = newInterface
|
||||
return installer
|
||||
} catch (e: Exception) {
|
||||
} catch (_: Exception) {
|
||||
dhizukuErrorStatus.value = 1
|
||||
}
|
||||
return null
|
||||
@@ -343,7 +344,7 @@ fun handleNetworkLogs(context: Context, batchToken: Long) {
|
||||
, timestamp = event.timestamp, type = "dns", hostName = dnsEvent.hostname,
|
||||
hostAddresses = addresses, totalResolvedAddressCount = dnsEvent.totalResolvedAddressCount
|
||||
)
|
||||
} catch(e: Exception) {
|
||||
} catch(_: Exception) {
|
||||
val connectEvent = event as ConnectEvent
|
||||
events += NetworkEventItem(
|
||||
id = if(VERSION.SDK_INT >= 28) event.id else null, packageName = event.packageName, timestamp = event.timestamp, type = "connect",
|
||||
@@ -416,6 +417,7 @@ fun setDefaultAffiliationID(context: Context) {
|
||||
if(affiliationIDs.isEmpty()) {
|
||||
dpm.setAffiliationIds(receiver, setOf("OwnDroid_default_affiliation_id"))
|
||||
sharedPrefs.edit().putBoolean("default_affiliation_id_set", true).apply()
|
||||
Log.d("DPM", "Default affiliation id set")
|
||||
}
|
||||
}
|
||||
} catch(e: Exception) {
|
||||
|
||||
@@ -239,6 +239,7 @@ private fun toggleDhizukuMode(status: Boolean, context: Context) {
|
||||
}
|
||||
if(Dhizuku.isPermissionGranted()) {
|
||||
sharedPref.edit().putBoolean("dhizuku", true).apply()
|
||||
Dhizuku.init()
|
||||
backToHomeStateFlow.value = true
|
||||
} else {
|
||||
Dhizuku.requestPermission(object: DhizukuRequestPermissionListener() {
|
||||
@@ -246,6 +247,7 @@ private fun toggleDhizukuMode(status: Boolean, context: Context) {
|
||||
override fun onRequestPermission(grantResult: Int) {
|
||||
if(grantResult == PackageManager.PERMISSION_GRANTED) {
|
||||
sharedPref.edit().putBoolean("dhizuku", true).apply()
|
||||
Dhizuku.init()
|
||||
context.toggleInstallAppActivity()
|
||||
backToHomeStateFlow.value = true
|
||||
} else {
|
||||
@@ -615,37 +617,66 @@ private fun SupportMsg() {
|
||||
private fun TransferOwnership() {
|
||||
val context = LocalContext.current
|
||||
val focusMgr = LocalFocusManager.current
|
||||
var component by remember { mutableStateOf("") }
|
||||
var input by remember { mutableStateOf("") }
|
||||
val componentName = ComponentName.unflattenFromString(input)
|
||||
var dialog by remember { mutableStateOf(false) }
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)) {
|
||||
Spacer(Modifier.padding(vertical = 10.dp))
|
||||
Text(text = stringResource(R.string.transfer_ownership), style = typography.headlineLarge)
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
OutlinedTextField(
|
||||
value = component, onValueChange = { component = it }, label = { Text(stringResource(R.string.target_component_name)) },
|
||||
value = input, onValueChange = { input = it }, label = { Text(stringResource(R.string.target_component_name)) },
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
isError = input != "" && componentName == null,
|
||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
|
||||
keyboardActions = KeyboardActions(onNext = { focusMgr.clearFocus() })
|
||||
)
|
||||
Spacer(Modifier.padding(vertical = 5.dp))
|
||||
Button(
|
||||
onClick = {
|
||||
val dpm = context.getDPM()
|
||||
val receiver = context.getReceiver()
|
||||
try {
|
||||
dpm.transferOwnership(receiver, ComponentName.unflattenFromString(component)!!, null)
|
||||
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()
|
||||
} catch(e: Exception) {
|
||||
e.printStackTrace()
|
||||
Toast.makeText(context, R.string.failed, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
onClick = { dialog = true },
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
enabled = componentName != null
|
||||
) {
|
||||
Text(stringResource(R.string.transfer))
|
||||
}
|
||||
Spacer(Modifier.padding(vertical = 10.dp))
|
||||
InfoCard(R.string.info_transfer_ownership)
|
||||
}
|
||||
if(dialog) AlertDialog(
|
||||
text = {
|
||||
Text(stringResource(
|
||||
R.string.transfer_ownership_warning,
|
||||
stringResource(if(context.isDeviceOwner) R.string.device_owner else R.string.profile_owner),
|
||||
ComponentName.unflattenFromString(input)!!.packageName
|
||||
))
|
||||
},
|
||||
confirmButton = {
|
||||
TextButton(
|
||||
onClick = {
|
||||
val dpm = context.getDPM()
|
||||
val receiver = context.getReceiver()
|
||||
try {
|
||||
dpm.transferOwnership(receiver, componentName!!, null)
|
||||
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()
|
||||
dialog = false
|
||||
backToHomeStateFlow.value = true
|
||||
} catch(e: Exception) {
|
||||
e.printStackTrace()
|
||||
Toast.makeText(context, R.string.failed, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
},
|
||||
colors = ButtonDefaults.textButtonColors(contentColor = colorScheme.error)
|
||||
) {
|
||||
Text(stringResource(R.string.confirm))
|
||||
}
|
||||
},
|
||||
dismissButton = {
|
||||
TextButton(onClick = { dialog = false }) {
|
||||
Text(stringResource(R.string.cancel))
|
||||
}
|
||||
},
|
||||
onDismissRequest = { dialog = false }
|
||||
)
|
||||
}
|
||||
|
||||
private fun activateDeviceAdmin(inputContext:Context,inputComponent:ComponentName) {
|
||||
|
||||
@@ -203,11 +203,16 @@ fun ShizukuActivate() {
|
||||
|
||||
private fun checkPermission(context: Context): String {
|
||||
if(checkShizukuStatus() == -1) { return context.getString(R.string.shizuku_not_started) }
|
||||
val getUid = if(shizukuService.value == null) { return context.getString(R.string.shizuku_not_bind) } else { shizukuService.value!!.uid }
|
||||
return when(getUid) {
|
||||
"2000"->context.getString(R.string.shizuku_activated_shell)
|
||||
"0"->context.getString(R.string.shizuku_activated_root)
|
||||
else->context.getString(R.string.unknown_status) + "\nUID: $getUid"
|
||||
return shizukuService.value.let {
|
||||
if(it == null) {
|
||||
context.getString(R.string.shizuku_not_bind)
|
||||
} else {
|
||||
when(it.uid) {
|
||||
2000 -> context.getString(R.string.shizuku_activated_shell)
|
||||
0 -> context.getString(R.string.shizuku_activated_root)
|
||||
else -> context.getString(R.string.unknown_status) + "\nUID: ${it.uid}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,7 +225,7 @@ fun checkShizukuStatus(): Int {
|
||||
waitGrantPermission = true
|
||||
0
|
||||
}
|
||||
} catch(e:Exception) { -1 }
|
||||
} catch(_: Exception) { -1 }
|
||||
return status
|
||||
}
|
||||
|
||||
|
||||
@@ -13,32 +13,32 @@ val shizukuService = MutableStateFlow<IUserService?>(null)
|
||||
class ShizukuService: IUserService.Stub() {
|
||||
override fun destroy() { }
|
||||
|
||||
override fun execute(command: String?): String {
|
||||
override fun execute(command: String): String {
|
||||
var result = ""
|
||||
val process: Process
|
||||
try {
|
||||
process = Runtime.getRuntime().exec(command)
|
||||
val exitCode = process.waitFor()
|
||||
if(exitCode!=0){ result+="Error: $exitCode" }
|
||||
} catch(e:Exception) {
|
||||
if(exitCode != 0){ result += "Error: $exitCode" }
|
||||
} catch(e: Exception) {
|
||||
e.printStackTrace()
|
||||
return e.toString()
|
||||
}
|
||||
try {
|
||||
val outputReader = BufferedReader(InputStreamReader(process.inputStream))
|
||||
var outputLine: String
|
||||
while(outputReader.readLine().also {outputLine = it}!=null) { result+="$outputLine\n" }
|
||||
while(outputReader.readLine().also {outputLine = it} != null) { result += "$outputLine\n" }
|
||||
val errorReader = BufferedReader(InputStreamReader(process.errorStream))
|
||||
var errorLine: String
|
||||
while(errorReader.readLine().also {errorLine = it}!=null) { result+="$errorLine\n" }
|
||||
while(errorReader.readLine().also {errorLine = it} != null) { result += "$errorLine\n" }
|
||||
} catch(e: NullPointerException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
if(result=="") { return "No result" }
|
||||
if(result == "") { return "No result" }
|
||||
return result
|
||||
}
|
||||
|
||||
override fun getUid(): String {
|
||||
return Os.getuid().toString()
|
||||
override fun getUid(): Int {
|
||||
return Os.getuid()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,10 +36,9 @@ import com.bintianqi.owndroid.ui.SwitchItem
|
||||
import com.bintianqi.owndroid.ui.TopBar
|
||||
|
||||
data class Restriction(
|
||||
val restriction:String,
|
||||
@StringRes val name:Int,
|
||||
val desc:String,
|
||||
@DrawableRes val ico:Int
|
||||
val id: String,
|
||||
@StringRes val name: Int,
|
||||
@DrawableRes val icon: Int
|
||||
)
|
||||
|
||||
@Composable
|
||||
@@ -80,13 +79,13 @@ fun UserRestriction(navCtrl: NavHostController) {
|
||||
popExitTransition = Animations.navHostPopExitTransition,
|
||||
modifier = Modifier.padding(top = it.calculateTopPadding())
|
||||
) {
|
||||
composable(route = "Internet") { Internet() }
|
||||
composable(route = "Home") { Home(localNavCtrl,scrollState) }
|
||||
composable(route = "Connectivity") { Connectivity() }
|
||||
composable(route = "Applications") { Application() }
|
||||
composable(route = "Users") { User() }
|
||||
composable(route = "Media") { Media() }
|
||||
composable(route = "Other") { Other() }
|
||||
composable(route = "Home") { Home(localNavCtrl, scrollState) }
|
||||
composable(route = "Internet") { UserRestrictionPage(RestrictionData.internet()) }
|
||||
composable(route = "Connectivity") { UserRestrictionPage(RestrictionData.connectivity())}
|
||||
composable(route = "Applications") { UserRestrictionPage(RestrictionData.connectivity()) }
|
||||
composable(route = "Users") { UserRestrictionPage(RestrictionData.user()) }
|
||||
composable(route = "Media") { UserRestrictionPage(RestrictionData.media()) }
|
||||
composable(route = "Other") { UserRestrictionPage(RestrictionData.other()) }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -118,89 +117,32 @@ private fun Home(navCtrl:NavHostController, scrollState: ScrollState) {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
@Composable
|
||||
private fun Internet() {
|
||||
private fun UserRestrictionPage(restrictions: List<Restriction>) {
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
|
||||
for(internetItem in RestrictionData.internet()) {
|
||||
UserRestrictionItem(internetItem.restriction, internetItem.name, internetItem.desc, internetItem.ico)
|
||||
}
|
||||
Spacer(Modifier.padding(vertical = 30.dp))
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun Connectivity() {
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
|
||||
for(connectivityItem in RestrictionData.connectivity()) {
|
||||
UserRestrictionItem(connectivityItem.restriction, connectivityItem.name, connectivityItem.desc, connectivityItem.ico)
|
||||
}
|
||||
Spacer(Modifier.padding(vertical = 30.dp))
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun Application() {
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
|
||||
for(applicationItem in RestrictionData.application()) {
|
||||
UserRestrictionItem(applicationItem.restriction, applicationItem.name, applicationItem.desc, applicationItem.ico)
|
||||
}
|
||||
Spacer(Modifier.padding(vertical = 30.dp))
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun User() {
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
|
||||
for(userItem in RestrictionData.user()) {
|
||||
UserRestrictionItem(userItem.restriction, userItem.name, userItem.desc, userItem.ico)
|
||||
}
|
||||
Spacer(Modifier.padding(vertical = 30.dp))
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun Media() {
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
|
||||
for(mediaItem in RestrictionData.media()) {
|
||||
UserRestrictionItem(mediaItem.restriction, mediaItem.name, mediaItem.desc, mediaItem.ico)
|
||||
}
|
||||
Spacer(Modifier.padding(vertical = 30.dp))
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun Other() {
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
|
||||
for(otherItem in RestrictionData.other()) {
|
||||
UserRestrictionItem(otherItem.restriction, otherItem.name, otherItem.desc, otherItem.ico)
|
||||
}
|
||||
restrictions.forEach { UserRestrictionItem(it) }
|
||||
Spacer(Modifier.padding(vertical = 30.dp))
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
@Composable
|
||||
private fun UserRestrictionItem(
|
||||
restriction:String, itemName:Int,
|
||||
restrictionDescription:String,
|
||||
leadIcon:Int
|
||||
) {
|
||||
private fun UserRestrictionItem(restriction: Restriction) {
|
||||
val context = LocalContext.current
|
||||
val dpm = context.getDPM()
|
||||
val receiver = context.getReceiver()
|
||||
Box(modifier = Modifier.padding(start = 22.dp, end = 16.dp)) {
|
||||
SwitchItem(
|
||||
itemName, restrictionDescription, leadIcon,
|
||||
{ dpm.getUserRestrictions(receiver).getBoolean(restriction) },
|
||||
restriction.name, restriction.id, restriction.icon,
|
||||
{ dpm.getUserRestrictions(receiver).getBoolean(restriction.id) },
|
||||
{
|
||||
try{
|
||||
try {
|
||||
if(it) {
|
||||
dpm.addUserRestriction(receiver,restriction)
|
||||
}else{
|
||||
dpm.clearUserRestriction(receiver,restriction)
|
||||
dpm.addUserRestriction(receiver, restriction.id)
|
||||
} else {
|
||||
dpm.clearUserRestriction(receiver, restriction.id)
|
||||
}
|
||||
} catch(e:SecurityException) {
|
||||
} catch(_: SecurityException) {
|
||||
if(context.isProfileOwner) {
|
||||
Toast.makeText(context, R.string.require_device_owner, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
@@ -211,115 +153,115 @@ private fun UserRestrictionItem(
|
||||
}
|
||||
|
||||
object RestrictionData {
|
||||
fun internet(): List<Restriction>{
|
||||
val list:MutableList<Restriction> = mutableListOf()
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, R.string.config_mobile_network, "", R.drawable.signal_cellular_alt_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_WIFI, R.string.config_wifi, "", R.drawable.wifi_fill0)
|
||||
if(VERSION.SDK_INT>=24) { list += Restriction(UserManager.DISALLOW_DATA_ROAMING, R.string.data_roaming, "", R.drawable.network_cell_fill0) }
|
||||
fun internet(): List<Restriction> {
|
||||
val list = mutableListOf<Restriction>()
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, R.string.config_mobile_network, R.drawable.signal_cellular_alt_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_WIFI, R.string.config_wifi, R.drawable.wifi_fill0)
|
||||
if(VERSION.SDK_INT>=24) list += Restriction(UserManager.DISALLOW_DATA_ROAMING, R.string.data_roaming, R.drawable.network_cell_fill0)
|
||||
if(VERSION.SDK_INT>=34) {
|
||||
list += Restriction(UserManager.DISALLOW_CELLULAR_2G, R.string.cellular_2g, "", R.drawable.network_cell_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_ULTRA_WIDEBAND_RADIO, R.string.ultra_wideband_radio, "", R.drawable.wifi_tethering_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CELLULAR_2G, R.string.cellular_2g, R.drawable.network_cell_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_ULTRA_WIDEBAND_RADIO, R.string.ultra_wideband_radio, R.drawable.wifi_tethering_fill0)
|
||||
}
|
||||
if(VERSION.SDK_INT>=33) {
|
||||
list += Restriction(UserManager.DISALLOW_ADD_WIFI_CONFIG, R.string.add_wifi_conf, "", R.drawable.wifi_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CHANGE_WIFI_STATE, R.string.change_wifi_state, "", R.drawable.wifi_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_WIFI_DIRECT, R.string.wifi_direct, "", R.drawable.wifi_tethering_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_WIFI_TETHERING, R.string.wifi_tethering, "", R.drawable.wifi_tethering_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_SHARING_ADMIN_CONFIGURED_WIFI, R.string.share_admin_wifi, "", R.drawable.share_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_ADD_WIFI_CONFIG, R.string.add_wifi_conf, R.drawable.wifi_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CHANGE_WIFI_STATE, R.string.change_wifi_state, R.drawable.wifi_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_WIFI_DIRECT, R.string.wifi_direct, R.drawable.wifi_tethering_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_WIFI_TETHERING, R.string.wifi_tethering, R.drawable.wifi_tethering_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_SHARING_ADMIN_CONFIGURED_WIFI, R.string.share_admin_wifi, R.drawable.share_fill0)
|
||||
}
|
||||
if(VERSION.SDK_INT>=23) { list += Restriction(UserManager.DISALLOW_NETWORK_RESET, R.string.network_reset, "", R.drawable.reset_wrench_fill0) }
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_TETHERING, R.string.config_tethering, "", R.drawable.wifi_tethering_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_VPN, R.string.config_vpn, "", R.drawable.vpn_key_fill0)
|
||||
if(VERSION.SDK_INT>=29) { list += Restriction(UserManager.DISALLOW_CONFIG_PRIVATE_DNS, R.string.config_private_dns, "", R.drawable.dns_fill0) }
|
||||
if(VERSION.SDK_INT>=28) { list += Restriction(UserManager.DISALLOW_AIRPLANE_MODE, R.string.airplane_mode, "", R.drawable.airplanemode_active_fill0) }
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS, R.string.config_cell_broadcasts, "", R.drawable.cell_tower_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_SMS, R.string.sms, "", R.drawable.sms_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_OUTGOING_CALLS, R.string.outgoing_calls, "", R.drawable.phone_forwarded_fill0)
|
||||
if(VERSION.SDK_INT>=23) list += Restriction(UserManager.DISALLOW_NETWORK_RESET, R.string.network_reset, R.drawable.reset_wrench_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_TETHERING, R.string.config_tethering, R.drawable.wifi_tethering_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_VPN, R.string.config_vpn, R.drawable.vpn_key_fill0)
|
||||
if(VERSION.SDK_INT>=29) list += Restriction(UserManager.DISALLOW_CONFIG_PRIVATE_DNS, R.string.config_private_dns, R.drawable.dns_fill0)
|
||||
if(VERSION.SDK_INT>=28) list += Restriction(UserManager.DISALLOW_AIRPLANE_MODE, R.string.airplane_mode, R.drawable.airplanemode_active_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS, R.string.config_cell_broadcasts, R.drawable.cell_tower_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_SMS, R.string.sms, R.drawable.sms_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_OUTGOING_CALLS, R.string.outgoing_calls, R.drawable.phone_forwarded_fill0)
|
||||
return list
|
||||
}
|
||||
fun connectivity(): List<Restriction>{
|
||||
val list:MutableList<Restriction> = mutableListOf()
|
||||
fun connectivity(): List<Restriction> {
|
||||
val list = mutableListOf<Restriction>()
|
||||
if(VERSION.SDK_INT>=26) {
|
||||
list += Restriction(UserManager.DISALLOW_BLUETOOTH, R.string.bluetooth, "", R.drawable.bluetooth_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_BLUETOOTH_SHARING, R.string.bt_share, "", R.drawable.bluetooth_searching_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_BLUETOOTH, R.string.bluetooth, R.drawable.bluetooth_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_BLUETOOTH_SHARING, R.string.bt_share, R.drawable.bluetooth_searching_fill0)
|
||||
}
|
||||
list += Restriction(UserManager.DISALLOW_SHARE_LOCATION, R.string.share_location, "", R.drawable.location_on_fill0)
|
||||
if(VERSION.SDK_INT>=28) { list += Restriction(UserManager.DISALLOW_CONFIG_LOCATION, R.string.config_location, "", R.drawable.location_on_fill0) }
|
||||
if(VERSION.SDK_INT>=22) { list += Restriction(UserManager.DISALLOW_OUTGOING_BEAM, R.string.outgoing_beam, "", R.drawable.nfc_fill0) }
|
||||
list += Restriction(UserManager.DISALLOW_USB_FILE_TRANSFER, R.string.usb_file_transfer, "", R.drawable.usb_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, R.string.mount_physical_media, "", R.drawable.sd_card_fill0)
|
||||
if(VERSION.SDK_INT>=28) { list += Restriction(UserManager.DISALLOW_PRINTING, R.string.printing, "", R.drawable.print_fill0) }
|
||||
list += Restriction(UserManager.DISALLOW_SHARE_LOCATION, R.string.share_location, R.drawable.location_on_fill0)
|
||||
if(VERSION.SDK_INT>=28) list += Restriction(UserManager.DISALLOW_CONFIG_LOCATION, R.string.config_location, R.drawable.location_on_fill0)
|
||||
if(VERSION.SDK_INT>=22) list += Restriction(UserManager.DISALLOW_OUTGOING_BEAM, R.string.outgoing_beam, R.drawable.nfc_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_USB_FILE_TRANSFER, R.string.usb_file_transfer, R.drawable.usb_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, R.string.mount_physical_media, R.drawable.sd_card_fill0)
|
||||
if(VERSION.SDK_INT>=28) list += Restriction(UserManager.DISALLOW_PRINTING, R.string.printing, R.drawable.print_fill0)
|
||||
return list
|
||||
}
|
||||
fun application(): List<Restriction>{
|
||||
val list:MutableList<Restriction> = mutableListOf()
|
||||
list += Restriction(UserManager.DISALLOW_INSTALL_APPS, R.string.install_app, "", R.drawable.android_fill0)
|
||||
if(VERSION.SDK_INT>=29) { list += Restriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY, R.string.install_unknown_src_globally, "", R.drawable.android_fill0) }
|
||||
list += Restriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, R.string.inst_unknown_src, "", R.drawable.android_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_UNINSTALL_APPS, R.string.uninstall_app, "", R.drawable.delete_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_APPS_CONTROL, R.string.apps_ctrl, "", R.drawable.apps_fill0)
|
||||
if(VERSION.SDK_INT>=34) { list += Restriction(UserManager.DISALLOW_CONFIG_DEFAULT_APPS, R.string.config_default_apps, "", R.drawable.apps_fill0) }
|
||||
fun application(): List<Restriction> {
|
||||
val list = mutableListOf<Restriction>()
|
||||
list += Restriction(UserManager.DISALLOW_INSTALL_APPS, R.string.install_app, R.drawable.android_fill0)
|
||||
if(VERSION.SDK_INT>=29) list += Restriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY, R.string.install_unknown_src_globally, R.drawable.android_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, R.string.inst_unknown_src, R.drawable.android_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_UNINSTALL_APPS, R.string.uninstall_app, R.drawable.delete_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_APPS_CONTROL, R.string.apps_ctrl, R.drawable.apps_fill0)
|
||||
if(VERSION.SDK_INT>=34) list += Restriction(UserManager.DISALLOW_CONFIG_DEFAULT_APPS, R.string.config_default_apps, R.drawable.apps_fill0)
|
||||
return list
|
||||
}
|
||||
fun media(): List<Restriction>{
|
||||
val list:MutableList<Restriction> = mutableListOf()
|
||||
fun media(): List<Restriction> {
|
||||
val list = mutableListOf<Restriction>()
|
||||
if(VERSION.SDK_INT>=28) {
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_BRIGHTNESS, R.string.config_brightness, "", R.drawable.brightness_5_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT, R.string.config_scr_timeout, "", R.drawable.screen_lock_portrait_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_AMBIENT_DISPLAY, R.string.ambient_display, "", R.drawable.brightness_5_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_BRIGHTNESS, R.string.config_brightness, R.drawable.brightness_5_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT, R.string.config_scr_timeout, R.drawable.screen_lock_portrait_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_AMBIENT_DISPLAY, R.string.ambient_display, R.drawable.brightness_5_fill0)
|
||||
}
|
||||
list += Restriction(UserManager.DISALLOW_ADJUST_VOLUME, R.string.adjust_volume, "", R.drawable.volume_up_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_UNMUTE_MICROPHONE, R.string.unmute_microphone, "", R.drawable.mic_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_ADJUST_VOLUME, R.string.adjust_volume, R.drawable.volume_up_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_UNMUTE_MICROPHONE, R.string.unmute_microphone, R.drawable.mic_fill0)
|
||||
if(VERSION.SDK_INT>=31) {
|
||||
list += Restriction(UserManager.DISALLOW_CAMERA_TOGGLE, R.string.camera_toggle, "", R.drawable.cameraswitch_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_MICROPHONE_TOGGLE, R.string.microphone_toggle, "", R.drawable.mic_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CAMERA_TOGGLE, R.string.camera_toggle, R.drawable.cameraswitch_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_MICROPHONE_TOGGLE, R.string.microphone_toggle, R.drawable.mic_fill0)
|
||||
}
|
||||
return list
|
||||
}
|
||||
fun user(): List<Restriction>{
|
||||
val list:MutableList<Restriction> = mutableListOf()
|
||||
list += Restriction(UserManager.DISALLOW_ADD_USER, R.string.add_user, "", R.drawable.account_circle_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_REMOVE_USER, R.string.remove_user, "", R.drawable.account_circle_fill0)
|
||||
if(VERSION.SDK_INT>=28) { list += Restriction(UserManager.DISALLOW_USER_SWITCH, R.string.switch_user, "", R.drawable.account_circle_fill0) }
|
||||
if(VERSION.SDK_INT>=24) { list += Restriction(UserManager.DISALLOW_SET_USER_ICON, R.string.set_user_icon, "", R.drawable.account_circle_fill0) }
|
||||
list += Restriction(UserManager.DISALLOW_CROSS_PROFILE_COPY_PASTE, R.string.cross_profile_copy, "", R.drawable.content_paste_fill0)
|
||||
fun user(): List<Restriction> {
|
||||
val list = mutableListOf<Restriction>()
|
||||
list += Restriction(UserManager.DISALLOW_ADD_USER, R.string.add_user, R.drawable.account_circle_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_REMOVE_USER, R.string.remove_user, R.drawable.account_circle_fill0)
|
||||
if(VERSION.SDK_INT>=28) list += Restriction(UserManager.DISALLOW_USER_SWITCH, R.string.switch_user, R.drawable.account_circle_fill0)
|
||||
if(VERSION.SDK_INT>=24) list += Restriction(UserManager.DISALLOW_SET_USER_ICON, R.string.set_user_icon, R.drawable.account_circle_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CROSS_PROFILE_COPY_PASTE, R.string.cross_profile_copy, R.drawable.content_paste_fill0)
|
||||
if(VERSION.SDK_INT>=28) {
|
||||
list += Restriction(UserManager.DISALLOW_SHARE_INTO_MANAGED_PROFILE, R.string.share_into_managed_profile, "", R.drawable.share_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_UNIFIED_PASSWORD, R.string.unified_pwd, "", R.drawable.work_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_SHARE_INTO_MANAGED_PROFILE, R.string.share_into_managed_profile, R.drawable.share_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_UNIFIED_PASSWORD, R.string.unified_pwd, R.drawable.work_fill0)
|
||||
}
|
||||
return list
|
||||
}
|
||||
fun other(): List<Restriction>{
|
||||
val list:MutableList<Restriction> = mutableListOf()
|
||||
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)
|
||||
fun other(): List<Restriction> {
|
||||
val list = mutableListOf<Restriction>()
|
||||
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.screenshot_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CONTENT_SUGGESTIONS, R.string.content_suggestions, "", R.drawable.sms_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, "", 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.security_fill0) }
|
||||
if(VERSION.SDK_INT>=23) { list += Restriction(UserManager.DISALLOW_FUN, R.string.`fun`, "", R.drawable.stadia_controller_fill0) }
|
||||
list += Restriction(UserManager.DISALLOW_MODIFY_ACCOUNTS, R.string.modify_accounts, "", R.drawable.manage_accounts_fill0)
|
||||
list += Restriction(UserManager.DISALLOW_CREATE_WINDOWS, R.string.create_windows, 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.security_fill0)
|
||||
if(VERSION.SDK_INT>=23) list += Restriction(UserManager.DISALLOW_FUN, R.string.`fun`, 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)
|
||||
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.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)
|
||||
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)
|
||||
return list
|
||||
}
|
||||
fun getAllRestrictions(): List<String> {
|
||||
val result = mutableListOf<String>()
|
||||
internet().forEach { result.add(it.restriction) }
|
||||
connectivity().forEach { result.add(it.restriction) }
|
||||
media().forEach { result.add(it.restriction) }
|
||||
application().forEach { result.add(it.restriction) }
|
||||
user().forEach { result.add(it.restriction) }
|
||||
other().forEach { result.add(it.restriction) }
|
||||
internet().forEach { result.add(it.id) }
|
||||
connectivity().forEach { result.add(it.id) }
|
||||
media().forEach { result.add(it.id) }
|
||||
application().forEach { result.add(it.id) }
|
||||
user().forEach { result.add(it.id) }
|
||||
other().forEach { result.add(it.id) }
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,6 +96,7 @@
|
||||
<string name="short_support_msg">Краткое сообщение</string>
|
||||
<string name="long_support_msg">Подробное сообщение</string>
|
||||
<string name="transfer">Передать</string>
|
||||
<string name="transfer_ownership_warning">%1$s privilege will be transferred to %2$s</string> <!--TODO-->
|
||||
<string name="activate_device_admin_here">Активируйте администратора устройства здесь.</string>
|
||||
|
||||
<!--Приемник-->
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
<string name="short_support_msg">Kısa Mesaj</string>
|
||||
<string name="long_support_msg">Uzun Mesaj</string>
|
||||
<string name="transfer">Transfer</string>
|
||||
<string name="transfer_ownership_warning">%1$s privilege will be transferred to %2$s</string> <!--TODO-->
|
||||
<string name="activate_device_admin_here">Cihaz Yöneticisini Burada Etkinleştir.</string>
|
||||
|
||||
<!--Receiver-->
|
||||
|
||||
@@ -92,6 +92,7 @@
|
||||
<string name="short_support_msg">提供支持的短消息</string>
|
||||
<string name="long_support_msg">提供支持的长消息</string>
|
||||
<string name="transfer">转移</string>
|
||||
<string name="transfer_ownership_warning">%1$s 特权将被转移至 %2$s</string>
|
||||
<string name="activate_device_admin_here">在这里激活Device admin</string>
|
||||
|
||||
<!--Receiver-->
|
||||
|
||||
@@ -99,6 +99,7 @@
|
||||
<string name="short_support_msg">Short message</string>
|
||||
<string name="long_support_msg">Long message</string>
|
||||
<string name="transfer">Transfer</string>
|
||||
<string name="transfer_ownership_warning">%1$s privilege will be transferred to %2$s</string>
|
||||
<string name="activate_device_admin_here">Activate Device admin here.</string>
|
||||
|
||||
<!--Receiver-->
|
||||
|
||||
Reference in New Issue
Block a user