diff options
| author | 2021-02-07 20:26:02 +0000 | |
|---|---|---|
| committer | 2021-02-07 20:26:02 +0000 | |
| commit | ba898f46b45ff20403bf96f6e9a86dea07f7b9f5 (patch) | |
| tree | fbc941f4fbf3e6aa2efb5a620346e5d3f029d192 | |
| parent | 9a95eef41dd1ff7650fbc37b804a4ead80577ef9 (diff) | |
| parent | 45c777b01908de2d7e08012f1e9bedf1f14940f7 (diff) | |
Merge "Adds a new adb command to get shortcuts from shortcut service" into sc-dev
4 files changed, 148 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index 89729b585b14..9b092c000172 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -1535,6 +1535,27 @@ class ShortcutPackage extends ShortcutPackageItem { pw.println(")"); } + public void dumpShortcuts(@NonNull PrintWriter pw, int matchFlags) { + final boolean matchDynamic = (matchFlags & ShortcutManager.FLAG_MATCH_DYNAMIC) != 0; + final boolean matchPinned = (matchFlags & ShortcutManager.FLAG_MATCH_PINNED) != 0; + final boolean matchManifest = (matchFlags & ShortcutManager.FLAG_MATCH_MANIFEST) != 0; + final boolean matchCached = (matchFlags & ShortcutManager.FLAG_MATCH_CACHED) != 0; + + final int shortcutFlags = (matchDynamic ? ShortcutInfo.FLAG_DYNAMIC : 0) + | (matchPinned ? ShortcutInfo.FLAG_PINNED : 0) + | (matchManifest ? ShortcutInfo.FLAG_MANIFEST : 0) + | (matchCached ? ShortcutInfo.FLAG_CACHED_ALL : 0); + + final ArrayMap<String, ShortcutInfo> shortcuts = mShortcuts; + final int size = shortcuts.size(); + for (int i = 0; i < size; i++) { + final ShortcutInfo si = shortcuts.valueAt(i); + if ((si.getFlags() & shortcutFlags) != 0) { + pw.println(si.toDumpString("")); + } + } + } + @Override public JSONObject dumpCheckin(boolean clear) throws JSONException { final JSONObject result = super.dumpCheckin(clear); diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 3c4457db6cf0..532e78c0f5a2 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -4556,6 +4556,10 @@ public class ShortcutService extends IShortcutService.Stub { private int mUserId = UserHandle.USER_SYSTEM; + private int mShortcutMatchFlags = ShortcutManager.FLAG_MATCH_CACHED + | ShortcutManager.FLAG_MATCH_DYNAMIC | ShortcutManager.FLAG_MATCH_MANIFEST + | ShortcutManager.FLAG_MATCH_PINNED; + private void parseOptionsLocked(boolean takeUser) throws CommandException { String opt; @@ -4571,6 +4575,9 @@ public class ShortcutService extends IShortcutService.Stub { break; } // fallthrough + case "--flags": + mShortcutMatchFlags = Integer.parseInt(getNextArgRequired()); + break; default: throw new CommandException("Unknown option: " + opt); } @@ -4606,6 +4613,9 @@ public class ShortcutService extends IShortcutService.Stub { case "clear-shortcuts": handleClearShortcuts(); break; + case "get-shortcuts": + handleGetShortcuts(); + break; case "verify-states": // hidden command to verify various internal states. handleVerifyStates(); break; @@ -4649,6 +4659,9 @@ public class ShortcutService extends IShortcutService.Stub { pw.println("cmd shortcut clear-shortcuts [--user USER_ID] PACKAGE"); pw.println(" Remove all shortcuts from a package, including pinned shortcuts"); pw.println(); + pw.println("cmd shortcut get-shortcuts [--user USER_ID] [--flags FLAGS] PACKAGE"); + pw.println(" Show the shortcuts for a package that match the given flags"); + pw.println(); } private void handleResetThrottling() throws CommandException { @@ -4723,6 +4736,24 @@ public class ShortcutService extends IShortcutService.Stub { } } + private void handleGetShortcuts() throws CommandException { + synchronized (mLock) { + parseOptionsLocked(/* takeUser =*/ true); + final String packageName = getNextArgRequired(); + + Slog.i(TAG, "cmd: handleGetShortcuts: user=" + mUserId + ", flags=" + + mShortcutMatchFlags + ", package=" + packageName); + + final ShortcutUser user = ShortcutService.this.getUserShortcutsLocked(mUserId); + final ShortcutPackage p = user.getPackageShortcutsIfExists(packageName); + if (p == null) { + return; + } + + p.dumpShortcuts(getOutPrintWriter(), mShortcutMatchFlags); + } + } + private void handleVerifyStates() throws CommandException { try { verifyStatesForce(); // This will throw when there's an issue. diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest7.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest7.java index e6c3d7c3fc5b..62b6c7165c25 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest7.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest7.java @@ -18,6 +18,7 @@ package com.android.server.pm; import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.array; import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertContains; import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertExpectException; +import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertHaveIds; import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertSuccess; import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertWith; import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.list; @@ -25,6 +26,8 @@ import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.resultContains; import android.content.ComponentName; +import android.content.pm.LauncherApps; +import android.content.pm.ShortcutManager; import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.os.Process; @@ -47,6 +50,9 @@ import java.util.concurrent.atomic.AtomicInteger; */ @SmallTest public class ShortcutManagerTest7 extends BaseShortcutManagerTest { + + private static final int CACHE_OWNER = LauncherApps.FLAG_CACHE_NOTIFICATION_SHORTCUTS; + private List<String> callShellCommand(String... args) throws IOException, RemoteException { // For reset to work, the current time needs to be incrementing. @@ -323,6 +329,72 @@ public class ShortcutManagerTest7 extends BaseShortcutManagerTest { }); } + public void testGetShortcuts() throws Exception { + + mRunningUsers.put(USER_10, true); + + // Add two manifests and two dynamics. + addManifestShortcutResource( + new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), + R.xml.shortcut_2); + updatePackageVersion(CALLING_PACKAGE_1, 1); + mService.mPackageMonitor.onReceive(getTestContext(), + genPackageAddIntent(CALLING_PACKAGE_1, USER_10)); + + runWithCaller(CALLING_PACKAGE_1, USER_10, () -> { + assertTrue(mManager.addDynamicShortcuts(list( + makeLongLivedShortcut("s1"), makeShortcut("s2")))); + }); + runWithCaller(LAUNCHER_1, USER_10, () -> { + mInjectCheckAccessShortcutsPermission = true; + mLauncherApps.cacheShortcuts(CALLING_PACKAGE_1, list("s1"), HANDLE_USER_10, + CACHE_OWNER); + mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms2", "s2"), HANDLE_USER_10); + }); + + runWithCaller(CALLING_PACKAGE_1, USER_10, () -> { + assertWith(getCallerShortcuts()) + .haveIds("ms1", "ms2", "s1", "s2") + .areAllEnabled() + + .selectPinned() + .haveIds("ms2", "s2"); + }); + + + mRunningUsers.put(USER_10, true); + mUnlockedUsers.put(USER_10, true); + + mInjectedCallingUid = Process.SHELL_UID; + + assertHaveIds(callShellCommand("get-shortcuts", "--user", "10", "--flags", + Integer.toString(ShortcutManager.FLAG_MATCH_CACHED), CALLING_PACKAGE_1), + "s1"); + + assertHaveIds(callShellCommand("get-shortcuts", "--user", "10", "--flags", + Integer.toString(ShortcutManager.FLAG_MATCH_DYNAMIC), CALLING_PACKAGE_1), + "s1", "s2"); + + assertHaveIds(callShellCommand("get-shortcuts", "--user", "10", "--flags", + Integer.toString(ShortcutManager.FLAG_MATCH_MANIFEST), CALLING_PACKAGE_1), + "ms1", "ms2"); + + assertHaveIds(callShellCommand("get-shortcuts", "--user", "10", "--flags", + Integer.toString(ShortcutManager.FLAG_MATCH_PINNED), CALLING_PACKAGE_1), + "ms2", "s2"); + + assertHaveIds(callShellCommand("get-shortcuts", "--user", "10", "--flags", + Integer.toString(ShortcutManager.FLAG_MATCH_DYNAMIC + | ShortcutManager.FLAG_MATCH_PINNED), CALLING_PACKAGE_1), + "ms2", "s1", "s2"); + + assertHaveIds(callShellCommand("get-shortcuts", "--user", "10", "--flags", + Integer.toString(ShortcutManager.FLAG_MATCH_MANIFEST + | ShortcutManager.FLAG_MATCH_CACHED), CALLING_PACKAGE_1), + "ms1", "ms2", "s1"); + + } + public void testDumpsysArgs() { checkDumpsysArgs(null, true, false, false); checkDumpsysArgs(array("-u"), true, true, false); diff --git a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java index 907f887ec228..9f1fff7b67ad 100644 --- a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java +++ b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java @@ -136,6 +136,20 @@ public class ShortcutManagerTestUtils { return sb.toString(); } + public static List<String> extractShortcutIds(List<String> result) { + final String prefix = "ShortcutInfo {id="; + final String postfix = ", "; + + List<String> ids = new ArrayList<>(); + for (String line : result) { + if (line.contains(prefix)) { + ids.add(line.substring( + line.indexOf(prefix) + prefix.length(), line.indexOf(postfix))); + } + } + return ids; + } + public static boolean resultContains(List<String> result, String expected) { for (String line : result) { if (line.contains(expected)) { @@ -160,6 +174,16 @@ public class ShortcutManagerTestUtils { return result; } + public static List<String> assertHaveIds(List<String> result, String... expectedIds) { + assertSuccess(result); + + final SortedSet<String> expected = new TreeSet<>(list(expectedIds)); + final SortedSet<String> actual = new TreeSet<>(extractShortcutIds(result)); + assertEquals(expected, actual); + + return result; + } + public static List<String> runCommand(Instrumentation instrumentation, String command) { return runCommand(instrumentation, command, null); } |