diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/ShortcutService.java | 11 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java | 4 |
2 files changed, 10 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index e1d1c264e666..780e5e5cf0e3 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -270,6 +270,7 @@ public class ShortcutService extends IShortcutService.Stub { final Context mContext; private final Object mLock = new Object(); + private final Object mNonPersistentUsersLock = new Object(); private static List<ResolveInfo> EMPTY_RESOLVE_INFO = new ArrayList<>(0); @@ -310,8 +311,10 @@ public class ShortcutService extends IShortcutService.Stub { /** * User ID -> ShortcutNonPersistentUser + * + * Note we use a fine-grained lock for {@link #mShortcutNonPersistentUsers} due to b/183618378. */ - @GuardedBy("mLock") + @GuardedBy("mNonPersistentUsersLock") private final SparseArray<ShortcutNonPersistentUser> mShortcutNonPersistentUsers = new SparseArray<>(); @@ -1308,7 +1311,7 @@ public class ShortcutService extends IShortcutService.Stub { } /** Return the non-persistent per-user state. */ - @GuardedBy("mLock") + @GuardedBy("mNonPersistentUsersLock") @NonNull ShortcutNonPersistentUser getNonPersistentUserLocked(@UserIdInt int userId) { ShortcutNonPersistentUser ret = mShortcutNonPersistentUsers.get(userId); @@ -2748,7 +2751,7 @@ public class ShortcutService extends IShortcutService.Stub { if (injectHasAccessShortcutsPermission(callingPid, callingUid)) { return true; } - synchronized (mLock) { + synchronized (mNonPersistentUsersLock) { return getNonPersistentUserLocked(userId).hasHostPackage(callingPackage); } } @@ -2831,7 +2834,7 @@ public class ShortcutService extends IShortcutService.Stub { public void setShortcutHostPackage(@NonNull String type, @Nullable String packageName, int userId) { - synchronized (mLock) { + synchronized (mNonPersistentUsersLock) { getNonPersistentUserLocked(userId).setShortcutHostPackage(type, packageName); } } 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 02b8dddae7c1..ef3e320cb84b 100644 --- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java @@ -55,6 +55,7 @@ import android.app.appsearch.IAppSearchManager; import android.app.appsearch.IAppSearchResultCallback; import android.app.appsearch.PackageIdentifier; import android.app.appsearch.SearchResultPage; +import android.app.appsearch.SetSchemaResponse; import android.app.role.OnRoleHoldersChangedListener; import android.app.usage.UsageStatsManagerInternal; import android.content.ActivityNotFoundException; @@ -672,7 +673,8 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { packageIdentifiers.add(new PackageIdentifier(entry.getValue().get(i))); } } - callback.onResult(AppSearchResult.newSuccessfulResult(null)); + final SetSchemaResponse response = new SetSchemaResponse.Builder().build(); + callback.onResult(AppSearchResult.newSuccessfulResult(response.getBundle())); } @Override |