Loading services/core/java/com/android/server/pm/ShortcutNonPersistentUser.java 0 → 100644 +98 −0 Original line number Diff line number Diff line /* * 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(); } } } } services/core/java/com/android/server/pm/ShortcutService.java +29 −5 Original line number Diff line number Diff line Loading @@ -279,6 +279,13 @@ public class ShortcutService extends IShortcutService.Stub { @GuardedBy("mLock") 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. */ Loading Loading @@ -1207,6 +1214,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)); Loading Loading @@ -2259,7 +2278,7 @@ public class ShortcutService extends IShortcutService.Stub { return true; } synchronized (mLock) { return getUserShortcutsLocked(userId).hasHostPackage(callingPackage); return getNonPersistentUserLocked(userId).hasHostPackage(callingPackage); } } Loading Loading @@ -2383,10 +2402,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); } } Loading Loading @@ -3844,6 +3860,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(); } } } } Loading services/core/java/com/android/server/pm/ShortcutUser.java +0 −43 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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++) { Loading Loading
services/core/java/com/android/server/pm/ShortcutNonPersistentUser.java 0 → 100644 +98 −0 Original line number Diff line number Diff line /* * 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(); } } } }
services/core/java/com/android/server/pm/ShortcutService.java +29 −5 Original line number Diff line number Diff line Loading @@ -279,6 +279,13 @@ public class ShortcutService extends IShortcutService.Stub { @GuardedBy("mLock") 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. */ Loading Loading @@ -1207,6 +1214,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)); Loading Loading @@ -2259,7 +2278,7 @@ public class ShortcutService extends IShortcutService.Stub { return true; } synchronized (mLock) { return getUserShortcutsLocked(userId).hasHostPackage(callingPackage); return getNonPersistentUserLocked(userId).hasHostPackage(callingPackage); } } Loading Loading @@ -2383,10 +2402,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); } } Loading Loading @@ -3844,6 +3860,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(); } } } } Loading
services/core/java/com/android/server/pm/ShortcutUser.java +0 −43 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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++) { Loading