summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/ShortcutService.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java4
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