From eadb2e9e8a3ac2790037bd6dead531098824188d Mon Sep 17 00:00:00 2001 From: BinTianqi Date: Sun, 24 Nov 2024 17:34:42 +0800 Subject: [PATCH] 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 --- Guide.md | 3 - Readme-en.md | 4 - Readme.md | 4 - .../com/bintianqi/owndroid/IUserService.aidl | 2 +- .../com/bintianqi/owndroid/MainActivity.kt | 2 +- .../java/com/bintianqi/owndroid/dpm/DPM.kt | 8 +- .../com/bintianqi/owndroid/dpm/Permissions.kt | 59 +++- .../bintianqi/owndroid/dpm/ShizukuActivate.kt | 17 +- .../bintianqi/owndroid/dpm/ShizukuService.kt | 16 +- .../bintianqi/owndroid/dpm/UserRestriction.kt | 256 +++++++----------- app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 14 files changed, 174 insertions(+), 201 deletions(-) delete mode 100644 Guide.md diff --git a/Guide.md b/Guide.md deleted file mode 100644 index 0e1afa9..0000000 --- a/Guide.md +++ /dev/null @@ -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文档 diff --git a/Readme-en.md b/Readme-en.md index 38c642b..971fd88 100644 --- a/Readme-en.md +++ b/Readme-en.md @@ -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. diff --git a/Readme.md b/Readme.md index 9473621..b9429ba 100644 --- a/Readme.md +++ b/Readme.md @@ -6,10 +6,6 @@ 使用安卓的Device Admin和Device Owner特权,完全掌控你的设备。 -### 文档 - -全新的OwnDroid文档:[owndroid.pages.dev](https://owndroid.pages.dev/zh_CN) - ### 优点 - 开源。Device owner权限可能比root权限更危险,闭源软件的安全性没有保证 diff --git a/app/src/main/aidl/com/bintianqi/owndroid/IUserService.aidl b/app/src/main/aidl/com/bintianqi/owndroid/IUserService.aidl index 9cff5e0..f53e85e 100644 --- a/app/src/main/aidl/com/bintianqi/owndroid/IUserService.aidl +++ b/app/src/main/aidl/com/bintianqi/owndroid/IUserService.aidl @@ -3,5 +3,5 @@ package com.bintianqi.owndroid; interface IUserService { void destroy() = 16777114; String execute(String command) = 1; - String getUid() = 2; + int getUid() = 2; } diff --git a/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt b/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt index 834ca64..d86dc11 100644 --- a/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt +++ b/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt @@ -97,7 +97,7 @@ class MainActivity : FragmentActivity() { toggleInstallAppActivity() val vm by viewModels() if(!vm.initialized) vm.initialize(context) - lifecycleScope.launch { setDefaultAffiliationID(context) } + lifecycleScope.launch { delay(5000); setDefaultAffiliationID(context) } setContent { OwnDroidTheme(vm) { Home(vm) diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt index 7dd8afa..5a07592 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/DPM.kt @@ -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) { diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt index a5677ad..a3da592 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt @@ -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) { diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt index 6fb1803..8c67c72 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt @@ -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 } diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuService.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuService.kt index 2308173..5eda5f0 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuService.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuService.kt @@ -13,32 +13,32 @@ val shizukuService = MutableStateFlow(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() } } diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/UserRestriction.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/UserRestriction.kt index da7ae55..57a50bc 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/UserRestriction.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/UserRestriction.kt @@ -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) { 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{ - val list:MutableList = 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 { + val list = 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) 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{ - val list:MutableList = mutableListOf() + fun connectivity(): List { + val list = mutableListOf() 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{ - val list:MutableList = 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 { + val list = 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) return list } - fun media(): List{ - val list:MutableList = mutableListOf() + fun media(): List { + val list = mutableListOf() 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{ - val list:MutableList = 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 { + val list = 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) 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{ - val list:MutableList = 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 { + val list = 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) 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 { val result = mutableListOf() - 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 } } diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index bc8b708..d7e1bb5 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -96,6 +96,7 @@ Краткое сообщение Подробное сообщение Передать + %1$s privilege will be transferred to %2$s Активируйте администратора устройства здесь. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index bf7e7d1..c55cb0c 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -97,6 +97,7 @@ Kısa Mesaj Uzun Mesaj Transfer + %1$s privilege will be transferred to %2$s Cihaz Yöneticisini Burada Etkinleştir. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4a862eb..c4d4413 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -92,6 +92,7 @@ 提供支持的短消息 提供支持的长消息 转移 + %1$s 特权将被转移至 %2$s 在这里激活Device admin diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4e81c94..56d5546 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -99,6 +99,7 @@ Short message Long message Transfer + %1$s privilege will be transferred to %2$s Activate Device admin here.