Bugfix and new APIs

Fix permitted accessibility services and permitted ime, close #165
New APIs, close #166
Optimize shortcuts creation, add ShortcutUtils
This commit is contained in:
BinTianqi
2025-09-25 23:01:02 +08:00
parent 289afb63ff
commit 5928dbb657
10 changed files with 158 additions and 123 deletions

View File

@@ -93,6 +93,8 @@ Samsung restricts Android's multiple users feature. There is currently no soluti
## API ## API
OwnDroid provides an API based on Intent and BroadcastReceiver.
| ID | Extras | Minimum Android version | | ID | Extras | Minimum Android version |
|--------------------------|------------------------|:-----------------------:| |--------------------------|------------------------|:-----------------------:|
| `HIDE` | `package` | | | `HIDE` | `package` | |
@@ -104,6 +106,10 @@ Samsung restricts Android's multiple users feature. There is currently no soluti
| `SET_PERMISSION_DEFAULT` | `package` `permission` | 6 | | `SET_PERMISSION_DEFAULT` | `package` `permission` | 6 |
| `SET_PERMISSION_GRANTED` | `package` `permission` | 6 | | `SET_PERMISSION_GRANTED` | `package` `permission` | 6 |
| `SET_PERMISSION_DENIED` | `package` `permission` | 6 | | `SET_PERMISSION_DENIED` | `package` `permission` | 6 |
| `SET_CAMERA_DISABLED` | | |
| `SET_CAMERA_ENABLED` | | |
| `SET_USB_DISABLED` | | 12 |
| `SET_USB_ENABLED` | | 12 |
| `LOCK` | | | | `LOCK` | | |
| `REBOOT` | | 7 | | `REBOOT` | | 7 |

View File

@@ -91,6 +91,8 @@ user limit reached
## API ## API
OwnDroid提供了一个基于Intent和BroadcastReceiver的API。
| ID | Extra | 最小安卓版本 | | ID | Extra | 最小安卓版本 |
|--------------------------|------------------------|:------:| |--------------------------|------------------------|:------:|
| `HIDE` | `package` | | | `HIDE` | `package` | |
@@ -102,6 +104,10 @@ user limit reached
| `SET_PERMISSION_DEFAULT` | `package` `permission` | 6 | | `SET_PERMISSION_DEFAULT` | `package` `permission` | 6 |
| `SET_PERMISSION_GRANTED` | `package` `permission` | 6 | | `SET_PERMISSION_GRANTED` | `package` `permission` | 6 |
| `SET_PERMISSION_DENIED` | `package` `permission` | 6 | | `SET_PERMISSION_DENIED` | `package` `permission` | 6 |
| `SET_CAMERA_DISABLED` | | |
| `SET_CAMERA_ENABLED` | | |
| `SET_USB_DISABLED` | | 12 |
| `SET_USB_ENABLED` | | 12 |
| `LOCK` | | | | `LOCK` | | |
| `REBOOT` | | 7 | | `REBOOT` | | 7 |

View File

@@ -47,6 +47,22 @@ class ApiReceiver: BroadcastReceiver() {
} }
"LOCK" -> { Privilege.DPM.lockNow(); true } "LOCK" -> { Privilege.DPM.lockNow(); true }
"REBOOT" -> { Privilege.DPM.reboot(Privilege.DAR); true } "REBOOT" -> { Privilege.DPM.reboot(Privilege.DAR); true }
"SET_CAMERA_DISABLED" -> {
Privilege.DPM.setCameraDisabled(Privilege.DAR, true)
true
}
"SET_CAMERA_ENABLED" -> {
Privilege.DPM.setCameraDisabled(Privilege.DAR, false)
true
}
"SET_USB_DISABLED" -> {
Privilege.DPM.isUsbDataSignalingEnabled = false
true
}
"SET_USB_ENABLED" -> {
Privilege.DPM.isUsbDataSignalingEnabled = true
true
}
else -> { else -> {
log += "\nInvalid action" log += "\nInvalid action"
false false

View File

@@ -44,9 +44,10 @@ import com.bintianqi.owndroid.dpm.SystemOptionsStatus
import com.bintianqi.owndroid.dpm.SystemUpdatePolicyInfo import com.bintianqi.owndroid.dpm.SystemUpdatePolicyInfo
import com.bintianqi.owndroid.dpm.delegatedScopesList import com.bintianqi.owndroid.dpm.delegatedScopesList
import com.bintianqi.owndroid.dpm.getPackageInstaller import com.bintianqi.owndroid.dpm.getPackageInstaller
import com.bintianqi.owndroid.dpm.handlePrivilegeChange
import com.bintianqi.owndroid.dpm.isValidPackageName import com.bintianqi.owndroid.dpm.isValidPackageName
import com.bintianqi.owndroid.dpm.parsePackageInstallerMessage import com.bintianqi.owndroid.dpm.parsePackageInstallerMessage
import com.bintianqi.owndroid.dpm.permissionList import com.bintianqi.owndroid.dpm.runtimePermissions
import com.bintianqi.owndroid.dpm.temperatureTypes import com.bintianqi.owndroid.dpm.temperatureTypes
import com.rosan.dhizuku.api.Dhizuku import com.rosan.dhizuku.api.Dhizuku
import com.rosan.dhizuku.api.DhizukuRequestPermissionListener import com.rosan.dhizuku.api.DhizukuRequestPermissionListener
@@ -165,7 +166,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
@RequiresApi(23) @RequiresApi(23)
fun getPackagePermissions(name: String) { fun getPackagePermissions(name: String) {
if (name.isValidPackageName) { if (name.isValidPackageName) {
packagePermissions.value = permissionList().associate { packagePermissions.value = runtimePermissions.associate {
it.permission to DPM.getPermissionGrantState(DAR, name, it.permission) it.permission to DPM.getPermissionGrantState(DAR, name, it.permission)
} }
} else { } else {
@@ -458,7 +459,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
} }
fun setCameraDisabled(disabled: Boolean) { fun setCameraDisabled(disabled: Boolean) {
DPM.setCameraDisabled(DAR, disabled) DPM.setCameraDisabled(DAR, disabled)
createShortcuts(application) ShortcutUtils.setShortcut(application, MyShortcut.DisableCamera, !disabled)
systemOptionsStatus.update { it.copy(cameraDisabled = DPM.getCameraDisabled(null)) } systemOptionsStatus.update { it.copy(cameraDisabled = DPM.getCameraDisabled(null)) }
} }
fun setScreenCaptureDisabled(disabled: Boolean) { fun setScreenCaptureDisabled(disabled: Boolean) {
@@ -491,7 +492,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
} }
fun setMasterVolumeMuted(muted: Boolean) { fun setMasterVolumeMuted(muted: Boolean) {
DPM.setMasterVolumeMuted(DAR, muted) DPM.setMasterVolumeMuted(DAR, muted)
createShortcuts(application) ShortcutUtils.setShortcut(application, MyShortcut.Mute, !muted)
systemOptionsStatus.update { it.copy(masterVolumeMuted = DPM.isMasterVolumeMuted(DAR)) } systemOptionsStatus.update { it.copy(masterVolumeMuted = DPM.isMasterVolumeMuted(DAR)) }
} }
@RequiresApi(26) @RequiresApi(26)
@@ -812,6 +813,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
callback(false, null) callback(false, null)
} else { } else {
Privilege.updateStatus() Privilege.updateStatus()
handlePrivilegeChange(application)
callback( callback(
true, result.getString("output") + "\n" + result.getString("error") true, result.getString("output") + "\n" + result.getString("error")
) )
@@ -828,7 +830,10 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
if(shell.isRoot) { if(shell.isRoot) {
val result = Shell.cmd(ACTIVATE_DEVICE_OWNER_COMMAND).exec() val result = Shell.cmd(ACTIVATE_DEVICE_OWNER_COMMAND).exec()
val output = result.out.joinToString("\n") + "\n" + result.err.joinToString("\n") val output = result.out.joinToString("\n") + "\n" + result.err.joinToString("\n")
if (result.isSuccess) {
Privilege.updateStatus() Privilege.updateStatus()
handlePrivilegeChange(application)
}
callback(result.isSuccess, output) callback(result.isSuccess, output)
} else { } else {
callback(false, application.getString(R.string.permission_denied)) callback(false, application.getString(R.string.permission_denied))
@@ -840,12 +845,14 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
DPM.transferOwnership(DAR, MyAdminComponent, null) DPM.transferOwnership(DAR, MyAdminComponent, null)
SP.dhizuku = false SP.dhizuku = false
Privilege.initialize(application) Privilege.initialize(application)
handlePrivilegeChange(application)
callback(true, null) callback(true, null)
} }
fun activateDhizukuMode(callback: (Boolean, String?) -> Unit) { fun activateDhizukuMode(callback: (Boolean, String?) -> Unit) {
fun onSucceed() { fun onSucceed() {
SP.dhizuku = true SP.dhizuku = true
Privilege.initialize(application) Privilege.initialize(application)
handlePrivilegeChange(application)
callback(true, null) callback(true, null)
} }
if (Dhizuku.init(application)) { if (Dhizuku.init(application)) {

View File

@@ -11,7 +11,6 @@ import android.os.UserHandle
import android.os.UserManager import android.os.UserManager
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import com.bintianqi.owndroid.dpm.handleNetworkLogs import com.bintianqi.owndroid.dpm.handleNetworkLogs
import com.bintianqi.owndroid.dpm.handlePrivilegeChange
import com.bintianqi.owndroid.dpm.processSecurityLogs import com.bintianqi.owndroid.dpm.processSecurityLogs
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -35,13 +34,11 @@ 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)
Privilege.updateStatus() Privilege.updateStatus()
handlePrivilegeChange(context)
} }
override fun onDisabled(context: Context, intent: Intent) { override fun onDisabled(context: Context, intent: Intent) {
super.onDisabled(context, intent) super.onDisabled(context, intent)
Privilege.updateStatus() Privilege.updateStatus()
handlePrivilegeChange(context)
} }
override fun onProfileProvisioningComplete(context: Context, intent: Intent) { override fun onProfileProvisioningComplete(context: Context, intent: Intent) {

View File

@@ -57,7 +57,6 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.content.edit import androidx.core.content.edit
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.bintianqi.owndroid.ui.FunctionItem import com.bintianqi.owndroid.ui.FunctionItem
@@ -155,8 +154,7 @@ fun SettingsOptionsScreen(onNavigateUp: () -> Unit) {
R.string.shortcuts, icon = R.drawable.open_in_new, R.string.shortcuts, icon = R.drawable.open_in_new,
getState = { SP.shortcuts }, onCheckedChange = { getState = { SP.shortcuts }, onCheckedChange = {
SP.shortcuts = it SP.shortcuts = it
ShortcutManagerCompat.removeAllDynamicShortcuts(context) ShortcutUtils.setAllShortcuts(context)
createShortcuts(context)
} }
) )
} }

View File

@@ -0,0 +1,57 @@
package com.bintianqi.owndroid
import android.content.Context
import android.content.Intent
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.IconCompat
object ShortcutUtils {
fun setAllShortcuts(context: Context) {
if (SP.shortcuts) {
val list = listOf(
createShortcut(context, MyShortcut.Lock, true),
createShortcut(context, MyShortcut.DisableCamera,
!Privilege.DPM.getCameraDisabled(Privilege.DAR)),
createShortcut(context, MyShortcut.Mute,
!Privilege.DPM.isMasterVolumeMuted(Privilege.DAR))
)
ShortcutManagerCompat.setDynamicShortcuts(context, list)
} else {
ShortcutManagerCompat.removeAllDynamicShortcuts(context)
}
}
fun setShortcut(context: Context, shortcut: MyShortcut, state: Boolean) {
ShortcutManagerCompat.pushDynamicShortcut(
context, createShortcut(context, shortcut, state)
)
}
private fun createShortcut(
context: Context, shortcut: MyShortcut, state: Boolean
): ShortcutInfoCompat {
val icon = IconCompat.createWithResource(
context,
if (!state && shortcut.iconDisable != null) shortcut.iconDisable else shortcut.iconEnable
)
return ShortcutInfoCompat.Builder(context, shortcut.id)
.setIcon(icon)
.setShortLabel(context.getText(
if (!state && shortcut.labelDisable != null) shortcut.labelDisable else shortcut.labelEnable
))
.setIntent(
Intent(context, ShortcutsReceiverActivity::class.java)
.setAction("com.bintianqi.owndroid.action.${shortcut.id}")
)
.build()
}
}
enum class MyShortcut(
val id: String, val labelEnable: Int, val labelDisable: Int? = null, val iconEnable: Int,
val iconDisable: Int? = null
) {
Lock("LOCK", R.string.lock_screen, iconEnable = R.drawable.lock_fill0),
DisableCamera("DISABLE_CAMERA", R.string.disable_cam, R.string.enable_camera,
R.drawable.no_photography_fill0, R.drawable.photo_camera_fill0),
Mute("MUTE", R.string.mute, R.string.unmute, R.drawable.volume_off_fill0, R.drawable.volume_up_fill0)
}

View File

@@ -1,12 +1,8 @@
package com.bintianqi.owndroid package com.bintianqi.owndroid
import android.app.Activity import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.core.content.pm.ShortcutInfoCompat import android.util.Log
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.IconCompat
class ShortcutsReceiverActivity : Activity() { class ShortcutsReceiverActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -17,50 +13,24 @@ class ShortcutsReceiverActivity : Activity() {
when (action) { when (action) {
"LOCK" -> Privilege.DPM.lockNow() "LOCK" -> Privilege.DPM.lockNow()
"DISABLE_CAMERA" -> { "DISABLE_CAMERA" -> {
Privilege.DPM.setCameraDisabled(Privilege.DAR, !Privilege.DPM.getCameraDisabled(Privilege.DAR)) val state = Privilege.DPM.getCameraDisabled(Privilege.DAR)
createShortcuts(this) Privilege.DPM.setCameraDisabled(Privilege.DAR, !state)
ShortcutUtils.setShortcut(this, MyShortcut.DisableCamera, state)
} }
"MUTE" -> { "MUTE" -> {
Privilege.DPM.setMasterVolumeMuted(Privilege.DAR, !Privilege.DPM.isMasterVolumeMuted(Privilege.DAR)) val state = Privilege.DPM.isMasterVolumeMuted(Privilege.DAR)
createShortcuts(this) Privilege.DPM.setMasterVolumeMuted(Privilege.DAR, !state)
ShortcutUtils.setShortcut(this, MyShortcut.Mute, state)
} }
} }
Log.d(TAG, "Received intent: $action")
showOperationResultToast(true)
} }
} finally { } finally {
finish() finish()
} }
} }
} companion object {
private const val TAG = "ShortcutsReceiver"
fun createShortcuts(context: Context) { }
if (!SP.shortcuts) return
val action = "com.bintianqi.owndroid.action"
val baseIntent = Intent(context, ShortcutsReceiverActivity::class.java)
val cameraDisabled = Privilege.DPM.getCameraDisabled(Privilege.DAR)
val muted = Privilege.DPM.isMasterVolumeMuted(Privilege.DAR)
val list = listOf(
ShortcutInfoCompat.Builder(context, "LOCK")
.setIcon(IconCompat.createWithResource(context, R.drawable.screen_lock_portrait_fill0))
.setShortLabel(context.getString(R.string.lock_screen))
.setIntent(Intent(baseIntent).setAction("$action.LOCK")),
ShortcutInfoCompat.Builder(context, "DISABLE_CAMERA")
.setIcon(
IconCompat.createWithResource(
context,
if (cameraDisabled) R.drawable.photo_camera_fill0 else R.drawable.no_photography_fill0
)
)
.setShortLabel(context.getString(if (cameraDisabled) R.string.enable_camera else R.string.disable_cam))
.setIntent(Intent(baseIntent).setAction("$action.DISABLE_CAMERA")),
ShortcutInfoCompat.Builder(context, "MUTE")
.setIcon(
IconCompat.createWithResource(
context,
if (muted) R.drawable.volume_up_fill0 else R.drawable.volume_off_fill0
)
)
.setShortLabel(context.getString(if (muted) R.string.unmute else R.string.mute))
.setIntent(Intent(baseIntent).setAction("$action.MUTE"))
)
ShortcutManagerCompat.setDynamicShortcuts(context, list.map { it.build() })
} }

View File

@@ -315,7 +315,7 @@ fun PermissionsManagerScreen(
Spacer(Modifier.padding(vertical = 4.dp)) Spacer(Modifier.padding(vertical = 4.dp))
} }
} }
items(permissionList(), { it.permission }) { items(runtimePermissions, { it.permission }) {
Row( Row(
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
modifier = Modifier modifier = Modifier
@@ -630,11 +630,11 @@ fun PermittedAsAndImPackages(
item { item {
SwitchItem(R.string.allow_all, state = allowAll, onCheckedChange = { allowAll = it }) SwitchItem(R.string.allow_all, state = allowAll, onCheckedChange = { allowAll = it })
} }
if (allowAll) items(packages, { it.name }) { if (!allowAll) items(packages, { it.name }) {
ApplicationItem(it) { setPackage(it.name, false) } ApplicationItem(it) { setPackage(it.name, false) }
} }
item { item {
if (allowAll) { if (!allowAll) {
PackageNameTextField(packageName, onChoosePackage, PackageNameTextField(packageName, onChoosePackage,
Modifier.padding(HorizontalPadding, 8.dp)) { packageName = it } Modifier.padding(HorizontalPadding, 8.dp)) { packageName = it }
Button( Button(

View File

@@ -13,14 +13,11 @@ import android.content.pm.IPackageInstaller
import android.content.pm.PackageInstaller import android.content.pm.PackageInstaller
import android.os.Build.VERSION import android.os.Build.VERSION
import android.util.Log import android.util.Log
import androidx.annotation.DrawableRes
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.annotation.StringRes
import androidx.core.content.pm.ShortcutManagerCompat
import com.bintianqi.owndroid.Privilege import com.bintianqi.owndroid.Privilege
import com.bintianqi.owndroid.R import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.SP import com.bintianqi.owndroid.SP
import com.bintianqi.owndroid.createShortcuts import com.bintianqi.owndroid.ShortcutUtils
import com.rosan.dhizuku.api.Dhizuku import com.rosan.dhizuku.api.Dhizuku
import com.rosan.dhizuku.api.DhizukuBinderWrapper import com.rosan.dhizuku.api.DhizukuBinderWrapper
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@@ -90,67 +87,49 @@ val dhizukuErrorStatus = MutableStateFlow(0)
data class PermissionItem( data class PermissionItem(
val permission: String, val permission: String,
@StringRes val label: Int, val label: Int,
@DrawableRes val icon: Int, val icon: Int,
val profileOwnerRestricted: Boolean = false val profileOwnerRestricted: Boolean = false,
val requiresApi: Int = 23
) )
fun permissionList(): List<PermissionItem>{ @Suppress("InlinedApi")
val list = mutableListOf<PermissionItem>() val runtimePermissions = listOf(
if(VERSION.SDK_INT >= 33) { PermissionItem(Manifest.permission.POST_NOTIFICATIONS, R.string.permission_POST_NOTIFICATIONS, R.drawable.notifications_fill0, requiresApi = 33),
list.add(PermissionItem(Manifest.permission.POST_NOTIFICATIONS, R.string.permission_POST_NOTIFICATIONS, R.drawable.notifications_fill0)) PermissionItem(Manifest.permission.READ_EXTERNAL_STORAGE, R.string.permission_READ_EXTERNAL_STORAGE, R.drawable.folder_fill0),
} PermissionItem(Manifest.permission.WRITE_EXTERNAL_STORAGE, R.string.permission_WRITE_EXTERNAL_STORAGE, R.drawable.folder_fill0),
list.add(PermissionItem(Manifest.permission.READ_EXTERNAL_STORAGE, R.string.permission_READ_EXTERNAL_STORAGE, R.drawable.folder_fill0)) PermissionItem(Manifest.permission.READ_MEDIA_AUDIO, R.string.permission_READ_MEDIA_AUDIO, R.drawable.music_note_fill0, requiresApi = 33),
list.add(PermissionItem(Manifest.permission.WRITE_EXTERNAL_STORAGE, R.string.permission_WRITE_EXTERNAL_STORAGE, R.drawable.folder_fill0)) PermissionItem(Manifest.permission.READ_MEDIA_VIDEO, R.string.permission_READ_MEDIA_VIDEO, R.drawable.movie_fill0, requiresApi = 33),
if(VERSION.SDK_INT >= 33) { PermissionItem(Manifest.permission.READ_MEDIA_IMAGES, R.string.permission_READ_MEDIA_IMAGES, R.drawable.image_fill0, requiresApi = 33),
list.add(PermissionItem(Manifest.permission.READ_MEDIA_AUDIO, R.string.permission_READ_MEDIA_AUDIO, R.drawable.music_note_fill0)) PermissionItem(Manifest.permission.CAMERA, R.string.permission_CAMERA, R.drawable.photo_camera_fill0, true),
list.add(PermissionItem(Manifest.permission.READ_MEDIA_VIDEO, R.string.permission_READ_MEDIA_VIDEO, R.drawable.movie_fill0)) PermissionItem(Manifest.permission.RECORD_AUDIO, R.string.permission_RECORD_AUDIO, R.drawable.mic_fill0, true),
list.add(PermissionItem(Manifest.permission.READ_MEDIA_IMAGES, R.string.permission_READ_MEDIA_IMAGES, R.drawable.image_fill0)) PermissionItem(Manifest.permission.ACCESS_COARSE_LOCATION, R.string.permission_ACCESS_COARSE_LOCATION, R.drawable.location_on_fill0, true),
} PermissionItem(Manifest.permission.ACCESS_FINE_LOCATION, R.string.permission_ACCESS_FINE_LOCATION, R.drawable.location_on_fill0, true),
list.add(PermissionItem(Manifest.permission.CAMERA, R.string.permission_CAMERA, R.drawable.photo_camera_fill0, true)) PermissionItem(Manifest.permission.ACCESS_BACKGROUND_LOCATION, R.string.permission_ACCESS_BACKGROUND_LOCATION, R.drawable.location_on_fill0, true, 29),
list.add(PermissionItem(Manifest.permission.RECORD_AUDIO, R.string.permission_RECORD_AUDIO, R.drawable.mic_fill0, true)) PermissionItem(Manifest.permission.READ_CONTACTS, R.string.permission_READ_CONTACTS, R.drawable.contacts_fill0),
list.add(PermissionItem(Manifest.permission.ACCESS_COARSE_LOCATION, R.string.permission_ACCESS_COARSE_LOCATION, R.drawable.location_on_fill0, true)) PermissionItem(Manifest.permission.WRITE_CONTACTS, R.string.permission_WRITE_CONTACTS, R.drawable.contacts_fill0),
list.add(PermissionItem(Manifest.permission.ACCESS_FINE_LOCATION, R.string.permission_ACCESS_FINE_LOCATION, R.drawable.location_on_fill0, true)) PermissionItem(Manifest.permission.READ_CALENDAR, R.string.permission_READ_CALENDAR, R.drawable.calendar_month_fill0),
if(VERSION.SDK_INT >= 29) { PermissionItem(Manifest.permission.WRITE_CALENDAR, R.string.permission_WRITE_CALENDAR, R.drawable.calendar_month_fill0),
list.add(PermissionItem(Manifest.permission.ACCESS_BACKGROUND_LOCATION, R.string.permission_ACCESS_BACKGROUND_LOCATION, R.drawable.location_on_fill0, true)) PermissionItem(Manifest.permission.BLUETOOTH_CONNECT, R.string.permission_BLUETOOTH_CONNECT, R.drawable.bluetooth_fill0, requiresApi = 31),
} PermissionItem(Manifest.permission.BLUETOOTH_SCAN, R.string.permission_BLUETOOTH_SCAN, R.drawable.bluetooth_searching_fill0, requiresApi = 31),
list.add(PermissionItem(Manifest.permission.READ_CONTACTS, R.string.permission_READ_CONTACTS, R.drawable.contacts_fill0)) PermissionItem(Manifest.permission.BLUETOOTH_ADVERTISE, R.string.permission_BLUETOOTH_ADVERTISE, R.drawable.bluetooth_fill0, requiresApi = 31),
list.add(PermissionItem(Manifest.permission.WRITE_CONTACTS, R.string.permission_WRITE_CONTACTS, R.drawable.contacts_fill0)) PermissionItem(Manifest.permission.NEARBY_WIFI_DEVICES, R.string.permission_NEARBY_WIFI_DEVICES, R.drawable.wifi_fill0, requiresApi = 33),
list.add(PermissionItem(Manifest.permission.READ_CALENDAR, R.string.permission_READ_CALENDAR, R.drawable.calendar_month_fill0)) PermissionItem(Manifest.permission.CALL_PHONE, R.string.permission_CALL_PHONE, R.drawable.call_fill0),
list.add(PermissionItem(Manifest.permission.WRITE_CALENDAR, R.string.permission_WRITE_CALENDAR, R.drawable.calendar_month_fill0)) PermissionItem(Manifest.permission.ANSWER_PHONE_CALLS, R.string.permission_ANSWER_PHONE_CALLS, R.drawable.call_fill0, requiresApi = 26),
if(VERSION.SDK_INT >= 31) { PermissionItem(Manifest.permission.READ_PHONE_NUMBERS, R.string.permission_READ_PHONE_STATE, R.drawable.mobile_phone_fill0, requiresApi = 26),
list.add(PermissionItem(Manifest.permission.BLUETOOTH_CONNECT, R.string.permission_BLUETOOTH_CONNECT, R.drawable.bluetooth_fill0)) PermissionItem(Manifest.permission.READ_PHONE_STATE, R.string.permission_READ_PHONE_STATE, R.drawable.mobile_phone_fill0),
list.add(PermissionItem(Manifest.permission.BLUETOOTH_SCAN, R.string.permission_BLUETOOTH_SCAN, R.drawable.bluetooth_searching_fill0)) PermissionItem(Manifest.permission.USE_SIP, R.string.permission_USE_SIP, R.drawable.call_fill0),
list.add(PermissionItem(Manifest.permission.BLUETOOTH_ADVERTISE, R.string.permission_BLUETOOTH_ADVERTISE, R.drawable.bluetooth_fill0)) PermissionItem(Manifest.permission.UWB_RANGING, R.string.permission_UWB_RANGING, R.drawable.cell_tower_fill0, requiresApi = 31),
} PermissionItem(Manifest.permission.READ_SMS, R.string.permission_READ_SMS, R.drawable.sms_fill0),
if(VERSION.SDK_INT >= 33) { PermissionItem(Manifest.permission.RECEIVE_SMS, R.string.permission_RECEIVE_SMS, R.drawable.sms_fill0),
list.add(PermissionItem(Manifest.permission.NEARBY_WIFI_DEVICES, R.string.permission_NEARBY_WIFI_DEVICES, R.drawable.wifi_fill0)) PermissionItem(Manifest.permission.SEND_SMS, R.string.permission_SEND_SMS, R.drawable.sms_fill0),
} PermissionItem(Manifest.permission.READ_CALL_LOG, R.string.permission_READ_CALL_LOG, R.drawable.call_log_fill0),
list.add(PermissionItem(Manifest.permission.CALL_PHONE, R.string.permission_CALL_PHONE, R.drawable.call_fill0)) PermissionItem(Manifest.permission.WRITE_CALL_LOG, R.string.permission_WRITE_CALL_LOG, R.drawable.call_log_fill0),
if(VERSION.SDK_INT >= 26) { PermissionItem(Manifest.permission.RECEIVE_WAP_PUSH, R.string.permission_RECEIVE_WAP_PUSH, R.drawable.wifi_fill0),
list.add(PermissionItem(Manifest.permission.ANSWER_PHONE_CALLS, R.string.permission_ANSWER_PHONE_CALLS, R.drawable.call_fill0)) PermissionItem(Manifest.permission.BODY_SENSORS, R.string.permission_BODY_SENSORS, R.drawable.sensors_fill0, true),
list.add(PermissionItem(Manifest.permission.READ_PHONE_NUMBERS, R.string.permission_READ_PHONE_STATE, R.drawable.mobile_phone_fill0)) PermissionItem(Manifest.permission.BODY_SENSORS_BACKGROUND, R.string.permission_BODY_SENSORS_BACKGROUND, R.drawable.sensors_fill0, requiresApi = 33),
} PermissionItem(Manifest.permission.ACTIVITY_RECOGNITION, R.string.permission_ACTIVITY_RECOGNITION, R.drawable.history_fill0, true, 29)
list.add(PermissionItem(Manifest.permission.READ_PHONE_STATE, R.string.permission_READ_PHONE_STATE, R.drawable.mobile_phone_fill0)) ).filter { VERSION.SDK_INT >= it.requiresApi }
list.add(PermissionItem(Manifest.permission.USE_SIP, R.string.permission_USE_SIP, R.drawable.call_fill0))
if(VERSION.SDK_INT >= 31) {
list.add(PermissionItem(Manifest.permission.UWB_RANGING, R.string.permission_UWB_RANGING, R.drawable.cell_tower_fill0))
}
list.add(PermissionItem(Manifest.permission.READ_SMS, R.string.permission_READ_SMS, R.drawable.sms_fill0))
list.add(PermissionItem(Manifest.permission.RECEIVE_SMS, R.string.permission_RECEIVE_SMS, R.drawable.sms_fill0))
list.add(PermissionItem(Manifest.permission.SEND_SMS, R.string.permission_SEND_SMS, R.drawable.sms_fill0))
list.add(PermissionItem(Manifest.permission.READ_CALL_LOG, R.string.permission_READ_CALL_LOG, R.drawable.call_log_fill0))
list.add(PermissionItem(Manifest.permission.WRITE_CALL_LOG, R.string.permission_WRITE_CALL_LOG, R.drawable.call_log_fill0))
list.add(PermissionItem(Manifest.permission.RECEIVE_WAP_PUSH, R.string.permission_RECEIVE_WAP_PUSH, R.drawable.wifi_fill0))
list.add(PermissionItem(Manifest.permission.BODY_SENSORS, R.string.permission_BODY_SENSORS, R.drawable.sensors_fill0, true))
if(VERSION.SDK_INT >= 33) {
list.add(PermissionItem(Manifest.permission.BODY_SENSORS_BACKGROUND, R.string.permission_BODY_SENSORS_BACKGROUND, R.drawable.sensors_fill0))
}
if(VERSION.SDK_INT > 29) {
list.add(PermissionItem(Manifest.permission.ACTIVITY_RECOGNITION, R.string.permission_ACTIVITY_RECOGNITION, R.drawable.history_fill0, true))
}
return list
}
@RequiresApi(26) @RequiresApi(26)
fun handleNetworkLogs(context: Context, batchToken: Long) { fun handleNetworkLogs(context: Context, batchToken: Long) {
@@ -468,16 +447,15 @@ fun parsePackageInstallerMessage(context: Context, result: Intent): String {
fun handlePrivilegeChange(context: Context) { fun handlePrivilegeChange(context: Context) {
val privilege = Privilege.status.value val privilege = Privilege.status.value
SP.dhizukuServer = false SP.dhizukuServer = false
SP.shortcuts = privilege.activated
if (privilege.activated) { if (privilege.activated) {
createShortcuts(context) ShortcutUtils.setAllShortcuts(context)
if (!privilege.dhizuku) { if (!privilege.dhizuku) {
setDefaultAffiliationID() setDefaultAffiliationID()
} }
} else { } else {
SP.isDefaultAffiliationIdSet = false SP.isDefaultAffiliationIdSet = false
if(VERSION.SDK_INT >= 25) { ShortcutUtils.setAllShortcuts(context)
ShortcutManagerCompat.removeAllDynamicShortcuts(context)
}
SP.isApiEnabled = false SP.isApiEnabled = false
} }
} }