Loading services/core/java/com/android/server/pm/ShortcutService.java +451 −411 File changed.Preview size limit exceeded, changes collapsed. Show changes services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java +154 −47 Original line number Diff line number Diff line Loading @@ -85,7 +85,7 @@ public class ShortcutManagerTest extends AndroidTestCase { * Whether to enable dump or not. Should be only true when debugging to avoid bugs where * dump affecting the behavior. */ private static final boolean ENABLE_DUMP = true; // DO NOT SUBMIT WITH true private static final boolean ENABLE_DUMP = false; // DO NOT SUBMIT WITH true /** Context used in the client side */ private final class ClientContext extends MockContext { Loading Loading @@ -145,7 +145,7 @@ public class ShortcutManagerTest extends AndroidTestCase { @Override int injectGetPackageUid(String packageName, int userId) { Integer uid = mInjectedPackageUidMap.get(packageName); return uid != null ? uid : -1; return UserHandle.getUid(getCallingUserId(), (uid != null ? uid : 0)); } @Override Loading Loading @@ -224,6 +224,9 @@ public class ShortcutManagerTest extends AndroidTestCase { private static final String LAUNCHER_2 = "com.android.launcher.2"; private static final int LAUNCHER_UID_2 = 10012; private static final int USER_10 = 10; private static final int USER_11 = 11; private static final long START_TIME = 1234560000000L; private static final long INTERVAL = 10000; Loading Loading @@ -282,16 +285,32 @@ public class ShortcutManagerTest extends AndroidTestCase { } /** Replace the current calling package */ private void setCaller(String packageName) { private void setCaller(String packageName, int userId) { mInjectedClientPackage = packageName; mInjectedCallingUid = Preconditions.checkNotNull(mInjectedPackageUidMap.get(packageName), "Unknown package"); mInjectedCallingUid = UserHandle.getUid(userId, Preconditions.checkNotNull(mInjectedPackageUidMap.get(packageName), "Unknown package")); } private void setCaller(String packageName) { setCaller(packageName, UserHandle.USER_SYSTEM); } private String getCallingPackage() { return mInjectedClientPackage; } private void runWithCaller(String packageName, int userId, Runnable r) { final String previousPackage = mInjectedClientPackage; final int previousUid = mInjectedCallingUid; setCaller(packageName, userId); r.run(); setCaller(previousPackage, previousUid); } private int getCallingUserId() { return UserHandle.getUserId(mInjectedCallingUid); } Loading Loading @@ -564,6 +583,15 @@ public class ShortcutManagerTest extends AndroidTestCase { return actualShortcuts; } @NonNull private List<ShortcutInfo> assertAllHaveIcon( @NonNull List<ShortcutInfo> actualShortcuts) { for (ShortcutInfo s : actualShortcuts) { assertTrue("ID " + s.getId(), s.hasIconFile() || s.hasIconResource()); } return actualShortcuts; } @NonNull private List<ShortcutInfo> assertAllHaveFlags(@NonNull List<ShortcutInfo> actualShortcuts, int shortcutFlags) { Loading Loading @@ -635,6 +663,18 @@ public class ShortcutManagerTest extends AndroidTestCase { } } private ShortcutInfo getPackageShortcut(String packageName, String shortcutId, int userId) { return mService.getPackageShortcutForTest(packageName, shortcutId, userId); } private ShortcutInfo getPackageShortcut(String packageName, String shortcutId) { return getPackageShortcut(packageName, shortcutId, getCallingUserId()); } private ShortcutInfo getCallerShortcut(String shortcutId) { return getPackageShortcut(getCallingPackage(), shortcutId, getCallingUserId()); } /** * Test for the first launch path, no settings file available. */ Loading Loading @@ -1083,7 +1123,8 @@ public class ShortcutManagerTest extends AndroidTestCase { "res64x64", "none"); dumpsysOnLogcat(); // Re-initialize and load from the files. initService(); // Load from launcher. Bitmap bmp; Loading Loading @@ -1568,13 +1609,14 @@ public class ShortcutManagerTest extends AndroidTestCase { */ public void testSaveAndLoadUser() { // First, create some shortcuts and save. final Icon icon1 = Icon.createWithResource(mContext, R.drawable.icon1); runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { final Icon icon1 = Icon.createWithResource(mContext, R.drawable.black_64x16); final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource( mContext.getResources(), R.drawable.icon2)); final ShortcutInfo si1 = makeShortcut( "shortcut1", "Title 1", "s1", "title1-1", makeComponent(ShortcutActivity.class), icon1, makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class, Loading @@ -1582,8 +1624,8 @@ public class ShortcutManagerTest extends AndroidTestCase { /* weight */ 10); final ShortcutInfo si2 = makeShortcut( "shortcut2", "Title 2", "s2", "title1-2", /* activity */ null, icon2, makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class), Loading @@ -1593,10 +1635,61 @@ public class ShortcutManagerTest extends AndroidTestCase { assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime()); assertEquals(2, mManager.getRemainingCallCount()); }); runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> { final Icon icon1 = Icon.createWithResource(mContext, R.drawable.black_16x64); final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource( mContext.getResources(), R.drawable.icon2)); Log.i(TAG, "Saved state"); dumpsysOnLogcat(); dumpUserFile(0); final ShortcutInfo si1 = makeShortcut( "s1", "title2-1", makeComponent(ShortcutActivity.class), icon1, makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class, "key1", "val1", "nest", makeBundle("key", 123)), /* weight */ 10); final ShortcutInfo si2 = makeShortcut( "s2", "title2-2", /* activity */ null, icon2, makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class), /* weight */ 12); assertTrue(mManager.setDynamicShortcuts(Arrays.asList(si1, si2))); assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime()); assertEquals(2, mManager.getRemainingCallCount()); }); runWithCaller(CALLING_PACKAGE_1, USER_10, () -> { final Icon icon1 = Icon.createWithResource(mContext, R.drawable.black_64x64); final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource( mContext.getResources(), R.drawable.icon2)); final ShortcutInfo si1 = makeShortcut( "s1", "title10-1-1", makeComponent(ShortcutActivity.class), icon1, makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class, "key1", "val1", "nest", makeBundle("key", 123)), /* weight */ 10); final ShortcutInfo si2 = makeShortcut( "s2", "title10-1-2", /* activity */ null, icon2, makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class), /* weight */ 12); assertTrue(mManager.setDynamicShortcuts(Arrays.asList(si1, si2))); assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime()); assertEquals(2, mManager.getRemainingCallCount()); }); // Restore. initService(); Loading @@ -1610,26 +1703,40 @@ public class ShortcutManagerTest extends AndroidTestCase { // Now it's loaded. assertEquals(1, mService.getShortcutsForTest().size()); // Start another user mService.onStartUserLocked(10); // Now the size is 2. assertEquals(2, mService.getShortcutsForTest().size()); runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon( mManager.getDynamicShortcuts()))), "s1", "s2"); assertEquals(2, mManager.getRemainingCallCount()); Log.i(TAG, "Dumping the new instance"); assertEquals("title1-1", getCallerShortcut("s1").getTitle()); assertEquals("title1-2", getCallerShortcut("s2").getTitle()); }); runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> { assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon( mManager.getDynamicShortcuts()))), "s1", "s2"); assertEquals(2, mManager.getRemainingCallCount()); List<ShortcutInfo> loaded = mManager.getDynamicShortcuts(); assertEquals("title2-1", getCallerShortcut("s1").getTitle()); assertEquals("title2-2", getCallerShortcut("s2").getTitle()); }); Log.i(TAG, "Loaded state"); dumpsysOnLogcat(); // Start another user mService.onStartUserLocked(USER_10); assertEquals(2, loaded.size()); // Now the size is 2. assertEquals(2, mService.getShortcutsForTest().size()); assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime()); runWithCaller(CALLING_PACKAGE_1, USER_10, () -> { assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon( mManager.getDynamicShortcuts()))), "s1", "s2"); assertEquals(2, mManager.getRemainingCallCount()); assertEquals("title10-1-1", getCallerShortcut("s1").getTitle()); assertEquals("title10-1-2", getCallerShortcut("s2").getTitle()); }); // Try stopping the user mService.onCleanupUserInner(UserHandle.USER_SYSTEM); mService.onCleanupUserInner(USER_10); // Now it's unloaded. assertEquals(1, mService.getShortcutsForTest().size()); Loading Loading
services/core/java/com/android/server/pm/ShortcutService.java +451 −411 File changed.Preview size limit exceeded, changes collapsed. Show changes
services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java +154 −47 Original line number Diff line number Diff line Loading @@ -85,7 +85,7 @@ public class ShortcutManagerTest extends AndroidTestCase { * Whether to enable dump or not. Should be only true when debugging to avoid bugs where * dump affecting the behavior. */ private static final boolean ENABLE_DUMP = true; // DO NOT SUBMIT WITH true private static final boolean ENABLE_DUMP = false; // DO NOT SUBMIT WITH true /** Context used in the client side */ private final class ClientContext extends MockContext { Loading Loading @@ -145,7 +145,7 @@ public class ShortcutManagerTest extends AndroidTestCase { @Override int injectGetPackageUid(String packageName, int userId) { Integer uid = mInjectedPackageUidMap.get(packageName); return uid != null ? uid : -1; return UserHandle.getUid(getCallingUserId(), (uid != null ? uid : 0)); } @Override Loading Loading @@ -224,6 +224,9 @@ public class ShortcutManagerTest extends AndroidTestCase { private static final String LAUNCHER_2 = "com.android.launcher.2"; private static final int LAUNCHER_UID_2 = 10012; private static final int USER_10 = 10; private static final int USER_11 = 11; private static final long START_TIME = 1234560000000L; private static final long INTERVAL = 10000; Loading Loading @@ -282,16 +285,32 @@ public class ShortcutManagerTest extends AndroidTestCase { } /** Replace the current calling package */ private void setCaller(String packageName) { private void setCaller(String packageName, int userId) { mInjectedClientPackage = packageName; mInjectedCallingUid = Preconditions.checkNotNull(mInjectedPackageUidMap.get(packageName), "Unknown package"); mInjectedCallingUid = UserHandle.getUid(userId, Preconditions.checkNotNull(mInjectedPackageUidMap.get(packageName), "Unknown package")); } private void setCaller(String packageName) { setCaller(packageName, UserHandle.USER_SYSTEM); } private String getCallingPackage() { return mInjectedClientPackage; } private void runWithCaller(String packageName, int userId, Runnable r) { final String previousPackage = mInjectedClientPackage; final int previousUid = mInjectedCallingUid; setCaller(packageName, userId); r.run(); setCaller(previousPackage, previousUid); } private int getCallingUserId() { return UserHandle.getUserId(mInjectedCallingUid); } Loading Loading @@ -564,6 +583,15 @@ public class ShortcutManagerTest extends AndroidTestCase { return actualShortcuts; } @NonNull private List<ShortcutInfo> assertAllHaveIcon( @NonNull List<ShortcutInfo> actualShortcuts) { for (ShortcutInfo s : actualShortcuts) { assertTrue("ID " + s.getId(), s.hasIconFile() || s.hasIconResource()); } return actualShortcuts; } @NonNull private List<ShortcutInfo> assertAllHaveFlags(@NonNull List<ShortcutInfo> actualShortcuts, int shortcutFlags) { Loading Loading @@ -635,6 +663,18 @@ public class ShortcutManagerTest extends AndroidTestCase { } } private ShortcutInfo getPackageShortcut(String packageName, String shortcutId, int userId) { return mService.getPackageShortcutForTest(packageName, shortcutId, userId); } private ShortcutInfo getPackageShortcut(String packageName, String shortcutId) { return getPackageShortcut(packageName, shortcutId, getCallingUserId()); } private ShortcutInfo getCallerShortcut(String shortcutId) { return getPackageShortcut(getCallingPackage(), shortcutId, getCallingUserId()); } /** * Test for the first launch path, no settings file available. */ Loading Loading @@ -1083,7 +1123,8 @@ public class ShortcutManagerTest extends AndroidTestCase { "res64x64", "none"); dumpsysOnLogcat(); // Re-initialize and load from the files. initService(); // Load from launcher. Bitmap bmp; Loading Loading @@ -1568,13 +1609,14 @@ public class ShortcutManagerTest extends AndroidTestCase { */ public void testSaveAndLoadUser() { // First, create some shortcuts and save. final Icon icon1 = Icon.createWithResource(mContext, R.drawable.icon1); runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { final Icon icon1 = Icon.createWithResource(mContext, R.drawable.black_64x16); final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource( mContext.getResources(), R.drawable.icon2)); final ShortcutInfo si1 = makeShortcut( "shortcut1", "Title 1", "s1", "title1-1", makeComponent(ShortcutActivity.class), icon1, makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class, Loading @@ -1582,8 +1624,8 @@ public class ShortcutManagerTest extends AndroidTestCase { /* weight */ 10); final ShortcutInfo si2 = makeShortcut( "shortcut2", "Title 2", "s2", "title1-2", /* activity */ null, icon2, makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class), Loading @@ -1593,10 +1635,61 @@ public class ShortcutManagerTest extends AndroidTestCase { assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime()); assertEquals(2, mManager.getRemainingCallCount()); }); runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> { final Icon icon1 = Icon.createWithResource(mContext, R.drawable.black_16x64); final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource( mContext.getResources(), R.drawable.icon2)); Log.i(TAG, "Saved state"); dumpsysOnLogcat(); dumpUserFile(0); final ShortcutInfo si1 = makeShortcut( "s1", "title2-1", makeComponent(ShortcutActivity.class), icon1, makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class, "key1", "val1", "nest", makeBundle("key", 123)), /* weight */ 10); final ShortcutInfo si2 = makeShortcut( "s2", "title2-2", /* activity */ null, icon2, makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class), /* weight */ 12); assertTrue(mManager.setDynamicShortcuts(Arrays.asList(si1, si2))); assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime()); assertEquals(2, mManager.getRemainingCallCount()); }); runWithCaller(CALLING_PACKAGE_1, USER_10, () -> { final Icon icon1 = Icon.createWithResource(mContext, R.drawable.black_64x64); final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource( mContext.getResources(), R.drawable.icon2)); final ShortcutInfo si1 = makeShortcut( "s1", "title10-1-1", makeComponent(ShortcutActivity.class), icon1, makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class, "key1", "val1", "nest", makeBundle("key", 123)), /* weight */ 10); final ShortcutInfo si2 = makeShortcut( "s2", "title10-1-2", /* activity */ null, icon2, makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class), /* weight */ 12); assertTrue(mManager.setDynamicShortcuts(Arrays.asList(si1, si2))); assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime()); assertEquals(2, mManager.getRemainingCallCount()); }); // Restore. initService(); Loading @@ -1610,26 +1703,40 @@ public class ShortcutManagerTest extends AndroidTestCase { // Now it's loaded. assertEquals(1, mService.getShortcutsForTest().size()); // Start another user mService.onStartUserLocked(10); // Now the size is 2. assertEquals(2, mService.getShortcutsForTest().size()); runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon( mManager.getDynamicShortcuts()))), "s1", "s2"); assertEquals(2, mManager.getRemainingCallCount()); Log.i(TAG, "Dumping the new instance"); assertEquals("title1-1", getCallerShortcut("s1").getTitle()); assertEquals("title1-2", getCallerShortcut("s2").getTitle()); }); runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> { assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon( mManager.getDynamicShortcuts()))), "s1", "s2"); assertEquals(2, mManager.getRemainingCallCount()); List<ShortcutInfo> loaded = mManager.getDynamicShortcuts(); assertEquals("title2-1", getCallerShortcut("s1").getTitle()); assertEquals("title2-2", getCallerShortcut("s2").getTitle()); }); Log.i(TAG, "Loaded state"); dumpsysOnLogcat(); // Start another user mService.onStartUserLocked(USER_10); assertEquals(2, loaded.size()); // Now the size is 2. assertEquals(2, mService.getShortcutsForTest().size()); assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime()); runWithCaller(CALLING_PACKAGE_1, USER_10, () -> { assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon( mManager.getDynamicShortcuts()))), "s1", "s2"); assertEquals(2, mManager.getRemainingCallCount()); assertEquals("title10-1-1", getCallerShortcut("s1").getTitle()); assertEquals("title10-1-2", getCallerShortcut("s2").getTitle()); }); // Try stopping the user mService.onCleanupUserInner(UserHandle.USER_SYSTEM); mService.onCleanupUserInner(USER_10); // Now it's unloaded. assertEquals(1, mService.getShortcutsForTest().size()); Loading