From fb059fc06b34da5ef576e471cd3a43dccb7d7891 Mon Sep 17 00:00:00 2001 From: Pinyao Ting Date: Wed, 14 Apr 2021 19:48:49 -0700 Subject: [PATCH] Various fixes in ShortcutService 1. Currently AppSearchSession#setSchema is only invoked when the schema hasn't been created. The correct logic should be, call setSchema if the schema version on the device is older than current. 2. Add null check on the call-site of ShortcutPackage#getShortcutById, the return value is generally non-null (on misses it simply return an empty list), the only case it can be null is when there was an exception thrown from AppSearch. 3. Update ShortcutManagerTest10 in comply with security fix in LauncherAppService#getShortcutConfigActivityIntent Bug: 151359749 Test: atest ShortcutManagerTest1 ShortcutManagerTest2 ShortcutManagerTest3 ShortcutManagerTest4 ShortcutManagerTest5 ShortcutManagerTest6 ShortcutManagerTest7 ShortcutManagerTest8 ShortcutManagerTest9 ShortcutManagerTest10 ShortcutManagerTest11 ShortcutManagerTest12 Test: atest CtsShortcutManagerTestCases Change-Id: I214b0e9c8030f45cff5e6451733bf853f6303030 --- .../android/server/pm/ShortcutPackage.java | 25 +++++++++++-------- .../server/pm/BaseShortcutManagerTest.java | 8 ++++++ .../server/pm/ShortcutManagerTest10.java | 1 + 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index c462a6c7877ee..c6d98e768ce35 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -663,12 +663,14 @@ class ShortcutPackage extends ShortcutPackageItem { }); // Then, update the pinned state if necessary. final List pinned = getShortcutById(pinnedShortcuts); - pinned.forEach(si -> { - if (!si.isPinned()) { - si.addFlags(ShortcutInfo.FLAG_PINNED); - } - }); - saveShortcut(pinned); + if (pinned != null) { + pinned.forEach(si -> { + if (!si.isPinned()) { + si.addFlags(ShortcutInfo.FLAG_PINNED); + } + }); + saveShortcut(pinned); + } forEachShortcutMutateIf(AppSearchShortcutInfo.QUERY_IS_PINNED, si -> { if (!pinnedShortcuts.contains(si.getId()) && si.isPinned()) { si.clearFlags(ShortcutInfo.FLAG_PINNED); @@ -826,9 +828,11 @@ class ShortcutPackage extends ShortcutPackageItem { : s.getLauncherShortcutsLocked(callingLauncher, getPackageUserId(), launcherUserId) .getPinnedShortcutIds(getPackageName(), getPackageUserId()); final List shortcuts = getShortcutById(ids); - for (ShortcutInfo si : shortcuts) { - filter(result, query, cloneFlag, callingLauncher, pinnedByCallerSet, - getPinnedByAnyLauncher, si); + if (shortcuts != null) { + for (ShortcutInfo si : shortcuts) { + filter(result, query, cloneFlag, callingLauncher, pinnedByCallerSet, + getPinnedByAnyLauncher, si); + } } } @@ -1903,7 +1907,8 @@ class ShortcutPackage extends ShortcutPackageItem { final ShortcutPackage ret = new ShortcutPackage(shortcutUser, shortcutUser.getUserId(), packageName); - ret.mIsInitilized = ShortcutService.parseIntAttribute(parser, ATTR_SCHEMA_VERSON, 0) > 0; + ret.mIsInitilized = ShortcutService.parseIntAttribute(parser, ATTR_SCHEMA_VERSON, 0) + == AppSearchShortcutInfo.SCHEMA_VERSION; ret.mApiCallCount = ShortcutService.parseIntAttribute(parser, ATTR_CALL_COUNT); ret.mLastResetTime = diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java index 198fb4f5d2955..b9f70da60de22 100644 --- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java @@ -125,6 +125,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -2598,6 +2599,13 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { }).when(mMockPackageManagerInternal).getHomeActivitiesAsUser(any(List.class), eq(userId)); } + protected void prepareIntentActivities(ComponentName cn) { + when(mMockPackageManagerInternal.queryIntentActivities( + anyOrNull(Intent.class), anyStringOrNull(), anyInt(), anyInt(), anyInt())) + .thenReturn(Collections.singletonList( + ri(cn.getPackageName(), cn.getClassName(), false, 0))); + } + protected static ComponentName cn(String packageName, String name) { return new ComponentName(packageName, name); } diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest10.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest10.java index eceb17a424ddd..e92c849b50b63 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest10.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest10.java @@ -159,6 +159,7 @@ public class ShortcutManagerTest10 extends BaseShortcutManagerTest { public void testStartConfigActivity_defaultLauncher() { LauncherActivityInfo info = setupMockActivityInfo(); + prepareIntentActivities(info.getComponentName()); setDefaultLauncher(USER_0, LAUNCHER_1); runWithCaller(LAUNCHER_1, USER_0, () -> assertNotNull(mLauncherApps.getShortcutConfigActivityIntent(info))