From ef0d366a5fe9fe06bb69d5f2afe813904fddc280 Mon Sep 17 00:00:00 2001 From: Suprabh Shukla Date: Fri, 21 May 2021 23:39:12 -0700 Subject: [PATCH] Add a shell command for distraction restrictions Test: adb shell pm set-distracting-restriction E.g. adb shell pm set-distracting-restriction --flag hide-notifications \ com.android.chrome Then, verify the distractionFlags shown in adb shell dumpsys package com.android.chrome Fixes: 169841816 Change-Id: Ic056cb33759a9e36f722c3b3622d9f714ab668c8 --- .../server/pm/PackageManagerShellCommand.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 853b6a7c946ad..5a4dbb1465bdd 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -121,6 +121,7 @@ import java.io.PrintWriter; import java.net.URISyntaxException; import java.security.SecureRandom; import java.util.ArrayList; +import java.util.Arrays; import java.util.Base64; import java.util.Collection; import java.util.Collections; @@ -253,6 +254,8 @@ class PackageManagerShellCommand extends ShellCommand { return runSuspend(true); case "unsuspend": return runSuspend(false); + case "set-distracting-restriction": + return runSetDistractingRestriction(); case "grant": return runGrantRevokePermission(true); case "revoke": @@ -2205,6 +2208,57 @@ class PackageManagerShellCommand extends ShellCommand { return 0; } + private int runSetDistractingRestriction() { + final PrintWriter pw = getOutPrintWriter(); + int userId = UserHandle.USER_SYSTEM; + String opt; + int flags = 0; + while ((opt = getNextOption()) != null) { + switch (opt) { + case "--user": + userId = UserHandle.parseUserArg(getNextArgRequired()); + break; + case "--flag": + final String flag = getNextArgRequired(); + switch (flag) { + case "hide-notifications": + flags |= PackageManager.RESTRICTION_HIDE_NOTIFICATIONS; + break; + case "hide-from-suggestions": + flags |= PackageManager.RESTRICTION_HIDE_FROM_SUGGESTIONS; + break; + default: + pw.println("Unrecognized flag: " + flag); + return 1; + } + break; + default: + pw.println("Error: Unknown option: " + opt); + return 1; + } + } + + final List packageNames = getRemainingArgs(); + if (packageNames.isEmpty()) { + pw.println("Error: package name not specified"); + return 1; + } + try { + final int translatedUserId = translateUserId(userId, UserHandle.USER_NULL, + "set-distracting"); + final String[] errored = mInterface.setDistractingPackageRestrictionsAsUser( + packageNames.toArray(new String[]{}), flags, translatedUserId); + if (errored.length > 0) { + pw.println("Could not set restriction for: " + Arrays.toString(errored)); + return 1; + } + return 0; + } catch (RemoteException | IllegalArgumentException e) { + pw.println(e.toString()); + return 1; + } + } + private int runSuspend(boolean suspendedState) { final PrintWriter pw = getOutPrintWriter(); int userId = UserHandle.USER_SYSTEM; @@ -3652,6 +3706,16 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" unsuspend [--user USER_ID] PACKAGE [PACKAGE...]"); pw.println(" Unsuspends the specified package(s) (as user)."); pw.println(""); + pw.println(" set-distracting-restriction [--user USER_ID] [--flag FLAG ...]"); + pw.println(" PACKAGE [PACKAGE...]"); + pw.println(" Sets the specified restriction flags to given package(s) (for user)."); + pw.println(" Flags are:"); + pw.println(" hide-notifications: Hides notifications from this package"); + pw.println(" hide-from-suggestions: Hides this package from suggestions"); + pw.println(" (by the launcher, etc.)"); + pw.println(" Any existing flags are overwritten, which also means that if no flags are"); + pw.println(" specified then all existing flags will be cleared."); + pw.println(""); pw.println(" grant [--user USER_ID] PACKAGE PERMISSION"); pw.println(" revoke [--user USER_ID] PACKAGE PERMISSION"); pw.println(" These commands either grant or revoke permissions to apps. The permissions");