From ed5b23edf695111ff90fa4c4078522d4697e841c Mon Sep 17 00:00:00 2001 From: BinTianqi Date: Sun, 24 Aug 2025 19:34:17 +0800 Subject: [PATCH] Add SET_PERMISSION APIs (#159) --- Readme-en.md | 23 +++++++++++-------- Readme-ja.md | 3 +++ Readme.md | 23 +++++++++++-------- .../com/bintianqi/owndroid/ApiReceiver.kt | 23 ++++++++++++++++++- .../java/com/bintianqi/owndroid/Settings.kt | 3 ++- .../bintianqi/owndroid/dpm/Applications.kt | 3 ++- 6 files changed, 55 insertions(+), 23 deletions(-) diff --git a/Readme-en.md b/Readme-en.md index 0545fee..6265fe8 100644 --- a/Readme-en.md +++ b/Readme-en.md @@ -85,16 +85,19 @@ Samsung restricts Android's multiple users feature. There is currently no soluti ## API -| ID | Extras | Minimum Android version | -|------------------------|---------------|:-----------------------:| -| HIDE | `package` | | -| UNHIDE | `package` | | -| SUSPEND | `package` | 7 | -| UNSUSPEND | `package` | 7 | -| ADD_USER_RESTRICTION | `restriction` | | -| CLEAR_USER_RESTRICTION | `restriction` | | -| LOCK | | | -| REBOOT | | 7 | +| ID | Extras | Minimum Android version | +|--------------------------|------------------------|:-----------------------:| +| `HIDE` | `package` | | +| `UNHIDE` | `package` | | +| `SUSPEND` | `package` | 7 | +| `UNSUSPEND` | `package` | 7 | +| `ADD_USER_RESTRICTION` | `restriction` | | +| `CLEAR_USER_RESTRICTION` | `restriction` | | +| `SET_PERMISSION_DEFAULT` | `package` `permission` | 6 | +| `SET_PERMISSION_GRANTED` | `package` `permission` | 6 | +| `SET_PERMISSION_DENIED` | `package` `permission` | 6 | +| `LOCK` | | | +| `REBOOT` | | 7 | [Available user restrictions](https://developer.android.com/reference/android/os/UserManager#constants_1) diff --git a/Readme-ja.md b/Readme-ja.md index 861dec0..b72641b 100644 --- a/Readme-ja.md +++ b/Readme-ja.md @@ -1,5 +1,8 @@ [English](Readme-en.md) | [简体中文](Readme.md) +> [!important] +> The Japanese readme need update + # OwnDroid AndroidのDevice owner特権を使用してデバイスを管理します。 diff --git a/Readme.md b/Readme.md index 81d0a7c..d3309b0 100644 --- a/Readme.md +++ b/Readme.md @@ -83,16 +83,19 @@ user limit reached ## API -| ID | Extra | 最小安卓版本 | -|------------------------|---------------|:------:| -| HIDE | `package` | | -| UNHIDE | `package` | | -| SUSPEND | `package` | 7 | -| UNSUSPEND | `package` | 7 | -| ADD_USER_RESTRICTION | `restriction` | | -| CLEAR_USER_RESTRICTION | `restriction` | | -| LOCK | | | -| REBOOT | | 7 | +| ID | Extra | 最小安卓版本 | +|--------------------------|------------------------|:------:| +| `HIDE` | `package` | | +| `UNHIDE` | `package` | | +| `SUSPEND` | `package` | 7 | +| `UNSUSPEND` | `package` | 7 | +| `ADD_USER_RESTRICTION` | `restriction` | | +| `CLEAR_USER_RESTRICTION` | `restriction` | | +| `SET_PERMISSION_DEFAULT` | `package` `permission` | 6 | +| `SET_PERMISSION_GRANTED` | `package` `permission` | 6 | +| `SET_PERMISSION_DENIED` | `package` `permission` | 6 | +| `LOCK` | | | +| `REBOOT` | | 7 | [可用的用户限制](https://developer.android.google.cn/reference/android/os/UserManager#constants_1) diff --git a/app/src/main/java/com/bintianqi/owndroid/ApiReceiver.kt b/app/src/main/java/com/bintianqi/owndroid/ApiReceiver.kt index 0cf7fcd..1d4ca9a 100644 --- a/app/src/main/java/com/bintianqi/owndroid/ApiReceiver.kt +++ b/app/src/main/java/com/bintianqi/owndroid/ApiReceiver.kt @@ -1,5 +1,6 @@ package com.bintianqi.owndroid +import android.app.admin.DevicePolicyManager import android.content.BroadcastReceiver import android.content.Context import android.content.Intent @@ -18,8 +19,10 @@ class ApiReceiver: BroadcastReceiver() { val dpm = context.getDPM() val receiver = context.getReceiver() val app = intent.getStringExtra("package") + val permission = intent.getStringExtra("permission") val restriction = intent.getStringExtra("restriction") - if(!app.isNullOrEmpty()) log += "\npackage: $app" + if (!app.isNullOrEmpty()) log += "\npackage: $app" + if (!permission.isNullOrEmpty()) log += "\npermission: $permission" try { @SuppressWarnings("NewApi") val ok = when(intent.action?.removePrefix("com.bintianqi.owndroid.action.")) { @@ -29,6 +32,24 @@ class ApiReceiver: BroadcastReceiver() { "UNSUSPEND" -> dpm.setPackagesSuspended(receiver, arrayOf(app), false).isEmpty() "ADD_USER_RESTRICTION" -> { dpm.addUserRestriction(receiver, restriction); true } "CLEAR_USER_RESTRICTION" -> { dpm.clearUserRestriction(receiver, restriction); true } + "SET_PERMISSION_DEFAULT" -> { + dpm.setPermissionGrantState( + receiver, app!!, permission!!, + DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT + ) + } + "SET_PERMISSION_GRANTED" -> { + dpm.setPermissionGrantState( + receiver, app!!, permission!!, + DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED + ) + } + "SET_PERMISSION_DENIED" -> { + dpm.setPermissionGrantState( + receiver, app!!, permission!!, + DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED + ) + } "LOCK" -> { dpm.lockNow(); true } "REBOOT" -> { dpm.reboot(receiver); true } else -> { diff --git a/app/src/main/java/com/bintianqi/owndroid/Settings.kt b/app/src/main/java/com/bintianqi/owndroid/Settings.kt index 112df0f..23abe1b 100644 --- a/app/src/main/java/com/bintianqi/owndroid/Settings.kt +++ b/app/src/main/java/com/bintianqi/owndroid/Settings.kt @@ -323,7 +323,8 @@ fun ApiSettings(onNavigateUp: () -> Unit) { onClick = { sp.apiKey = key context.showOperationResultToast(true) - } + }, + enabled = key.isNotEmpty() ) { Text(stringResource(R.string.apply)) } diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Applications.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Applications.kt index 17a434c..d976ddb 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Applications.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Applications.kt @@ -536,7 +536,8 @@ fun PermissionsManagerScreen(onNavigateUp: () -> Unit, param: PermissionsManager } if(selectedPermission != null) { fun changeState(state: Int) { - dpm.setPermissionGrantState(receiver, packageName, selectedPermission!!.permission, state) + val result = dpm.setPermissionGrantState(receiver, packageName, selectedPermission!!.permission, state) + if (!result) context.showOperationResultToast(false) statusMap[selectedPermission!!.permission] = dpm.getPermissionGrantState(receiver, packageName, selectedPermission!!.permission) selectedPermission = null }