Skip to content

Commit 7f12991

Browse files
committed
Added Shell commands to manage permission grants.
Example: $ adb shell dumpsys activity service --user 0 com.afwsamples.testdpc get-permission-grant-state com.afwsamples.testdpc android.permission.GET_ACCOUNTS SERVICE com.afwsamples.testdpc/.DeviceAdminService cbc953f pid=18731 user=0 Client: android.permission.GET_ACCOUNTS state for com.afwsamples.testdpc: DEFAULT $ adb shell dumpsys activity service --user 0 com.afwsamples.testdpc set-permission-grant-state com.afwsamples.testdpc android.permission.GET_ACCOUNTS 1 SERVICE com.afwsamples.testdpc/.DeviceAdminService cbc953f pid=18731 user=0 Client: Set android.permission.GET_ACCOUNTS state on com.afwsamples.testdpc to GRANTED $ adb shell dumpsys activity service --user 0 com.afwsamples.testdpc get-permission-grant-state com.afwsamples.testdpc android.permission.GET_ACCOUNTS SERVICE com.afwsamples.testdpc/.DeviceAdminService cbc953f pid=18731 user=0 Client: android.permission.GET_ACCOUNTS state for com.afwsamples.testdpc: GRANTED Test: see above Bug: 171350084 Bug: 181238156 Change-Id: Ib3a92a397029cb4cdb859997ff52bdf5fd6b1940 (cherry picked from commit 8dcd4f9ee1f4ed33d0865cf63ea2e97bcb7f45b6)
1 parent c969296 commit 7f12991

File tree

4 files changed

+92
-0
lines changed

4 files changed

+92
-0
lines changed

app/src/main/java/com/afwsamples/testdpc/DevicePolicyManagerGateway.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,17 @@ void setApplicationRestrictions(String packageName, Bundle settings,
316316
*/
317317
Bundle getSelfRestrictions();
318318

319+
/**
320+
* See {@link android.app.admin.DevicePolicyManager#setPermissionGrantState(ComponentName, String, String, int)}.
321+
*/
322+
void setPermissionGrantState(String packageName, String permission, int grantState,
323+
@NonNull Consumer<Boolean> onSuccess, @NonNull Consumer<Exception> onError);
324+
325+
/**
326+
* See {@link android.app.admin.DevicePolicyManager#getPermissionGrantState(ComponentName, String, String)}.
327+
*/
328+
int getPermissionGrantState(String packageName, String permission);
329+
319330
/**
320331
* Used on error callbacks to indicate a {@link android.app.admin.DevicePolicyManager} method
321332
* call failed.

app/src/main/java/com/afwsamples/testdpc/DevicePolicyManagerGatewayImpl.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,29 @@ public void setApplicationRestrictions(String packageName, Bundle settings,
575575
}
576576
}
577577

578+
@Override
579+
public void setPermissionGrantState(String packageName, String permission, int grantState,
580+
Consumer<Boolean> onSuccess, Consumer<Exception> onError) {
581+
Log.d(TAG, "setPermissionGrantState(" + packageName + ", " + permission + "): "
582+
+ Util.grantStateToString(grantState));
583+
try {
584+
boolean result = mDevicePolicyManager.setPermissionGrantState(mAdminComponentName,
585+
packageName, permission, grantState);
586+
onSuccess.accept(result);
587+
} catch (Exception e) {
588+
onError.accept(e);
589+
}
590+
}
591+
592+
@Override
593+
public int getPermissionGrantState(String packageName, String permission) {
594+
int grantState = mDevicePolicyManager.getPermissionGrantState(mAdminComponentName,
595+
packageName, permission);
596+
Log.d(TAG, "getPermissionGrantState(" + packageName + ", " + permission + "): "
597+
+ Util.grantStateToString(grantState));
598+
return grantState;
599+
}
600+
578601
@Override
579602
public String toString() {
580603
return "DevicePolicyManagerGatewayImpl[" + mAdminComponentName + "]";

app/src/main/java/com/afwsamples/testdpc/ShellCommand.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ final class ShellCommand {
9393
private static final String CMD_GET_LOCK_TASK_FEATURES = "get-lock-task-features";
9494
private static final String CMD_SET_APP_RESTRICTIONS = "set-app-restrictions";
9595
private static final String CMD_GET_APP_RESTRICTIONS = "get-app-restrictions";
96+
private static final String CMD_SET_PERMISSION_GRANT_STATE = "set-permission-grant-state";
97+
private static final String CMD_GET_PERMISSION_GRANT_STATE = "get-permission-grant-state";
9698

9799
private static final String ARG_FLAGS = "--flags";
98100

@@ -241,6 +243,12 @@ public void run() {
241243
case CMD_GET_APP_RESTRICTIONS:
242244
execute(() -> getAppRestrictions());
243245
break;
246+
case CMD_SET_PERMISSION_GRANT_STATE:
247+
execute(() -> setPermissionGrantState());
248+
break;
249+
case CMD_GET_PERMISSION_GRANT_STATE:
250+
execute(() -> getPermissionGrantState());
251+
break;
244252
default:
245253
mWriter.printf("Invalid command: %s\n\n", cmd);
246254
showUsage();
@@ -333,6 +341,13 @@ private void showUsage() {
333341
mWriter.printf("\t%s [PKG1] [PKGNn] - get the application restrictions for the given apps, "
334342
+ "or for TestDPC itself (using UserManager) when PKG is not passed\n",
335343
CMD_GET_APP_RESTRICTIONS);
344+
mWriter.printf("\t%s <PKG> <PERMISSION> <STATE> - set the grant state for the given "
345+
+ "package / permission\n",
346+
CMD_SET_PERMISSION_GRANT_STATE);
347+
mWriter.printf("\t%s <PKG> <PERMISSION> - get the grant state for the given permission / "
348+
+ "package\n", CMD_GET_PERMISSION_GRANT_STATE);
349+
350+
// Separator for S / pre-S commands - do NOT remove line to avoid cherry-pick conflicts
336351
}
337352

338353
private void createUser() {
@@ -753,6 +768,29 @@ private void printAppRestrictions(String packageName, Bundle settings) {
753768
}
754769
}
755770

771+
private void setPermissionGrantState() {
772+
// TODO(b/171350084): check args
773+
String packageName = mArgs[1];
774+
String permission = mArgs[2];
775+
int grantState = getIntArg(3);
776+
String grantName = Util.grantStateToString(grantState);
777+
778+
mDevicePolicyManagerGateway.setPermissionGrantState(packageName, permission, grantState,
779+
(v) -> onSuccess("Set %s state on %s to %s", permission, packageName, grantName),
780+
(e) -> onError(e, "Error setting %s state on %s to %s", packageName, permission,
781+
grantName));
782+
}
783+
784+
private void getPermissionGrantState() {
785+
// TODO(b/171350084): check args
786+
String packageName = mArgs[1];
787+
String permission = mArgs[2];
788+
int grantState = mDevicePolicyManagerGateway.getPermissionGrantState(packageName,
789+
permission);
790+
mWriter.printf("%s state for %s: %s\n", permission, packageName,
791+
Util.grantStateToString(grantState));
792+
}
793+
756794
private static String permittedToString(boolean permitted) {
757795
return permitted ? "PERMITTED" : "NOT PERMITTED";
758796
}

app/src/main/java/com/afwsamples/testdpc/common/Util.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,10 @@ public static String personalAppsSuspensionReasonToString(int reasons) {
258258
return flagsToString(DevicePolicyManager.class, "PERSONAL_APPS_", reasons);
259259
}
260260

261+
public static String grantStateToString(int grantState) {
262+
return constantToString(DevicePolicyManager.class, "PERMISSION_GRANT_STATE_", grantState);
263+
}
264+
261265
public static void onSuccessLog(String tag, String template, Object... args) {
262266
Log.d(tag, String.format(template, args) + " succeeded");
263267
}
@@ -296,6 +300,22 @@ public static String flagsToString(Class<?> clazz, String prefix, int flags) {
296300
return res.toString();
297301
}
298302

303+
// Copied from DebugUtils
304+
public static String constantToString(Class<?> clazz, String prefix, int value) {
305+
for (Field field : clazz.getDeclaredFields()) {
306+
final int modifiers = field.getModifiers();
307+
try {
308+
if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)
309+
&& field.getType().equals(int.class) && field.getName().startsWith(prefix)
310+
&& field.getInt(null) == value) {
311+
return constNameWithoutPrefix(prefix, field);
312+
}
313+
} catch (IllegalAccessException ignored) {
314+
}
315+
}
316+
return prefix + Integer.toString(value);
317+
}
318+
299319
// Copied from DebugUtils
300320
private static String constNameWithoutPrefix(String prefix, Field field) {
301321
return field.getName().substring(prefix.length());

0 commit comments

Comments
 (0)