summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/ShortcutNonPersistentUser.java98
-rw-r--r--services/core/java/com/android/server/pm/ShortcutService.java34
-rw-r--r--services/core/java/com/android/server/pm/ShortcutUser.java43
3 files changed, 127 insertions, 48 deletions
diff --git a/services/core/java/com/android/server/pm/ShortcutNonPersistentUser.java b/services/core/java/com/android/server/pm/ShortcutNonPersistentUser.java
new file mode 100644
index 000000000000..7f6f684e0b68
--- /dev/null
+++ b/services/core/java/com/android/server/pm/ShortcutNonPersistentUser.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.pm;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+
+import com.android.server.pm.ShortcutService.DumpFilter;
+
+import java.io.PrintWriter;
+
+/**
+ * This class holds per-user information for {@link ShortcutService} that doesn't have to be
+ * persisted and is kept in-memory.
+ *
+ * The access to it must be guarded with the shortcut manager lock.
+ */
+public class ShortcutNonPersistentUser {
+ private final ShortcutService mService;
+
+ private final int mUserId;
+
+ /**
+ * Keep track of additional packages that other parts of the system have said are
+ * allowed to access shortcuts. The key is the part of the system it came from,
+ * the value is the package name that has access. We don't persist these because
+ * at boot all relevant system services will push this data back to us they do their
+ * normal evaluation of the state of the world.
+ */
+ private final ArrayMap<String, String> mHostPackages = new ArrayMap<>();
+
+ /**
+ * Set of package name values from above.
+ */
+ private final ArraySet<String> mHostPackageSet = new ArraySet<>();
+
+ public ShortcutNonPersistentUser(ShortcutService service, int userId) {
+ mService = service;
+ mUserId = userId;
+ }
+
+ public int getUserId() {
+ return mUserId;
+ }
+
+ public void setShortcutHostPackage(@NonNull String type, @Nullable String packageName) {
+ if (packageName != null) {
+ mHostPackages.put(type, packageName);
+ } else {
+ mHostPackages.remove(type);
+ }
+
+ mHostPackageSet.clear();
+ for (int i = 0; i < mHostPackages.size(); i++) {
+ mHostPackageSet.add(mHostPackages.valueAt(i));
+ }
+ }
+
+ public boolean hasHostPackage(@NonNull String packageName) {
+ return mHostPackageSet.contains(packageName);
+ }
+
+ public void dump(@NonNull PrintWriter pw, @NonNull String prefix, DumpFilter filter) {
+ if (filter.shouldDumpDetails()) {
+ if (mHostPackages.size() > 0) {
+ pw.print(prefix);
+ pw.print("Non-persistent: user ID:");
+ pw.println(mUserId);
+
+ pw.print(prefix);
+ pw.println(" Host packages:");
+ for (int i = 0; i < mHostPackages.size(); i++) {
+ pw.print(prefix);
+ pw.print(" ");
+ pw.print(mHostPackages.keyAt(i));
+ pw.print(": ");
+ pw.println(mHostPackages.valueAt(i));
+ }
+ pw.println();
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index ee2f3742c811..2a581530a68a 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -280,6 +280,13 @@ public class ShortcutService extends IShortcutService.Stub {
private final SparseArray<ShortcutUser> mUsers = new SparseArray<>();
/**
+ * User ID -> ShortcutNonPersistentUser
+ */
+ @GuardedBy("mLock")
+ private final SparseArray<ShortcutNonPersistentUser> mShortcutNonPersistentUsers =
+ new SparseArray<>();
+
+ /**
* Max number of dynamic + manifest shortcuts that each application can have at a time.
*/
private int mMaxShortcuts;
@@ -1199,6 +1206,18 @@ public class ShortcutService extends IShortcutService.Stub {
return userPackages;
}
+ /** Return the non-persistent per-user state. */
+ @GuardedBy("mLock")
+ @NonNull
+ ShortcutNonPersistentUser getNonPersistentUserLocked(@UserIdInt int userId) {
+ ShortcutNonPersistentUser ret = mShortcutNonPersistentUsers.get(userId);
+ if (ret == null) {
+ ret = new ShortcutNonPersistentUser(this, userId);
+ mShortcutNonPersistentUsers.put(userId, ret);
+ }
+ return ret;
+ }
+
void forEachLoadedUserLocked(@NonNull Consumer<ShortcutUser> c) {
for (int i = mUsers.size() - 1; i >= 0; i--) {
c.accept(mUsers.valueAt(i));
@@ -2251,7 +2270,7 @@ public class ShortcutService extends IShortcutService.Stub {
return true;
}
synchronized (mLock) {
- return getUserShortcutsLocked(userId).hasHostPackage(callingPackage);
+ return getNonPersistentUserLocked(userId).hasHostPackage(callingPackage);
}
}
@@ -2375,10 +2394,7 @@ public class ShortcutService extends IShortcutService.Stub {
public void setShortcutHostPackage(@NonNull String type, @Nullable String packageName,
int userId) {
synchronized (mLock) {
- throwIfUserLockedL(userId);
-
- final ShortcutUser user = getUserShortcutsLocked(userId);
- user.setShortcutHostPackage(type, packageName);
+ getNonPersistentUserLocked(userId).setShortcutHostPackage(type, packageName);
}
}
@@ -3836,6 +3852,14 @@ public class ShortcutService extends IShortcutService.Stub {
pw.println();
}
}
+
+ for (int i = 0; i < mShortcutNonPersistentUsers.size(); i++) {
+ final ShortcutNonPersistentUser user = mShortcutNonPersistentUsers.valueAt(i);
+ if (filter.isUserMatch(user.getUserId())) {
+ user.dump(pw, " ", filter);
+ pw.println();
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/pm/ShortcutUser.java b/services/core/java/com/android/server/pm/ShortcutUser.java
index 1efd765b18fa..b7247df3b2a1 100644
--- a/services/core/java/com/android/server/pm/ShortcutUser.java
+++ b/services/core/java/com/android/server/pm/ShortcutUser.java
@@ -124,20 +124,6 @@ class ShortcutUser {
/** In-memory-cached default launcher. */
private ComponentName mCachedLauncher;
- /**
- * Keep track of additional packages that other parts of the system have said are
- * allowed to access shortcuts. The key is the part of the system it came from,
- * the value is the package name that has access. We don't persist these because
- * at boot all relevant system services will push this data back to us they do their
- * normal evaluation of the state of the world.
- */
- private final ArrayMap<String, String> mHostPackages = new ArrayMap<>();
-
- /**
- * Set of package name values from above.
- */
- private final ArraySet<String> mHostPackageSet = new ArraySet<>();
-
private String mKnownLocales;
private long mLastAppScanTime;
@@ -482,23 +468,6 @@ class ShortcutUser {
return mCachedLauncher;
}
- public void setShortcutHostPackage(@NonNull String type, @Nullable String packageName) {
- if (packageName != null) {
- mHostPackages.put(type, packageName);
- } else {
- mHostPackages.remove(type);
- }
-
- mHostPackageSet.clear();
- for (int i = 0; i < mHostPackages.size(); i++) {
- mHostPackageSet.add(mHostPackages.valueAt(i));
- }
- }
-
- public boolean hasHostPackage(@NonNull String packageName) {
- return mHostPackageSet.contains(packageName);
- }
-
public void resetThrottling() {
for (int i = mPackages.size() - 1; i >= 0; i--) {
mPackages.valueAt(i).resetThrottling();
@@ -587,18 +556,6 @@ class ShortcutUser {
pw.print("Last known launcher: ");
pw.print(mLastKnownLauncher);
pw.println();
-
- if (mHostPackages.size() > 0) {
- pw.print(prefix);
- pw.println("Host packages:");
- for (int i = 0; i < mHostPackages.size(); i++) {
- pw.print(prefix);
- pw.print(" ");
- pw.print(mHostPackages.keyAt(i));
- pw.print(": ");
- pw.println(mHostPackages.valueAt(i));
- }
- }
}
for (int i = 0; i < mLaunchers.size(); i++) {