Loading services/core/java/com/android/server/pm/ShortcutLauncher.java +12 −12 Original line number Original line Diff line number Diff line Loading @@ -46,7 +46,7 @@ import java.util.List; /** /** * Launcher information used by {@link ShortcutService}. * Launcher information used by {@link ShortcutService}. * * * All methods should be guarded by {@code #mShortcutUser.mService.mLock}. * All methods should be guarded by {@code ShortcutPackageItem#mPackageItemLock}. */ */ class ShortcutLauncher extends ShortcutPackageItem { class ShortcutLauncher extends ShortcutPackageItem { private static final String TAG = ShortcutService.TAG; private static final String TAG = ShortcutService.TAG; Loading @@ -66,7 +66,7 @@ class ShortcutLauncher extends ShortcutPackageItem { /** /** * Package name -> IDs. * Package name -> IDs. */ */ @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private final ArrayMap<UserPackage, ArraySet<String>> mPinnedShortcuts = new ArrayMap<>(); private final ArrayMap<UserPackage, ArraySet<String>> mPinnedShortcuts = new ArrayMap<>(); private ShortcutLauncher(@NonNull ShortcutUser shortcutUser, private ShortcutLauncher(@NonNull ShortcutUser shortcutUser, Loading Loading @@ -99,7 +99,7 @@ class ShortcutLauncher extends ShortcutPackageItem { */ */ private void onRestoreBlocked() { private void onRestoreBlocked() { final ArrayList<UserPackage> pinnedPackages; final ArrayList<UserPackage> pinnedPackages; synchronized (mLock) { synchronized (mPackageItemLock) { pinnedPackages = new ArrayList<>(mPinnedShortcuts.keySet()); pinnedPackages = new ArrayList<>(mPinnedShortcuts.keySet()); mPinnedShortcuts.clear(); mPinnedShortcuts.clear(); } } Loading Loading @@ -138,7 +138,7 @@ class ShortcutLauncher extends ShortcutPackageItem { final int idSize = ids.size(); final int idSize = ids.size(); if (idSize == 0) { if (idSize == 0) { synchronized (mLock) { synchronized (mPackageItemLock) { mPinnedShortcuts.remove(up); mPinnedShortcuts.remove(up); } } } else { } else { Loading @@ -165,7 +165,7 @@ class ShortcutLauncher extends ShortcutPackageItem { floatingSet.add(id); floatingSet.add(id); } } } } synchronized (mLock) { synchronized (mPackageItemLock) { final ArraySet<String> prevSet = mPinnedShortcuts.get(up); final ArraySet<String> prevSet = mPinnedShortcuts.get(up); if (prevSet != null) { if (prevSet != null) { for (String id : floatingSet) { for (String id : floatingSet) { Loading @@ -187,7 +187,7 @@ class ShortcutLauncher extends ShortcutPackageItem { @Nullable @Nullable public ArraySet<String> getPinnedShortcutIds(@NonNull String packageName, public ArraySet<String> getPinnedShortcutIds(@NonNull String packageName, @UserIdInt int packageUserId) { @UserIdInt int packageUserId) { synchronized (mLock) { synchronized (mPackageItemLock) { final ArraySet<String> pinnedShortcuts = mPinnedShortcuts.get( final ArraySet<String> pinnedShortcuts = mPinnedShortcuts.get( UserPackage.of(packageUserId, packageName)); UserPackage.of(packageUserId, packageName)); return pinnedShortcuts == null ? null : new ArraySet<>(pinnedShortcuts); return pinnedShortcuts == null ? null : new ArraySet<>(pinnedShortcuts); Loading @@ -198,7 +198,7 @@ class ShortcutLauncher extends ShortcutPackageItem { * Return true if the given shortcut is pinned by this launcher.<code></code> * Return true if the given shortcut is pinned by this launcher.<code></code> */ */ public boolean hasPinned(ShortcutInfo shortcut) { public boolean hasPinned(ShortcutInfo shortcut) { synchronized (mLock) { synchronized (mPackageItemLock) { final ArraySet<String> pinned = mPinnedShortcuts.get( final ArraySet<String> pinned = mPinnedShortcuts.get( UserPackage.of(shortcut.getUserId(), shortcut.getPackage())); UserPackage.of(shortcut.getUserId(), shortcut.getPackage())); return (pinned != null) && pinned.contains(shortcut.getId()); return (pinned != null) && pinned.contains(shortcut.getId()); Loading @@ -211,7 +211,7 @@ class ShortcutLauncher extends ShortcutPackageItem { public void addPinnedShortcut(@NonNull String packageName, @UserIdInt int packageUserId, public void addPinnedShortcut(@NonNull String packageName, @UserIdInt int packageUserId, String id, boolean forPinRequest) { String id, boolean forPinRequest) { final ArrayList<String> pinnedList; final ArrayList<String> pinnedList; synchronized (mLock) { synchronized (mPackageItemLock) { final ArraySet<String> pinnedSet = mPinnedShortcuts.get( final ArraySet<String> pinnedSet = mPinnedShortcuts.get( UserPackage.of(packageUserId, packageName)); UserPackage.of(packageUserId, packageName)); if (pinnedSet != null) { if (pinnedSet != null) { Loading @@ -227,7 +227,7 @@ class ShortcutLauncher extends ShortcutPackageItem { } } boolean cleanUpPackage(String packageName, @UserIdInt int packageUserId) { boolean cleanUpPackage(String packageName, @UserIdInt int packageUserId) { synchronized (mLock) { synchronized (mPackageItemLock) { return mPinnedShortcuts.remove(UserPackage.of(packageUserId, packageName)) != null; return mPinnedShortcuts.remove(UserPackage.of(packageUserId, packageName)) != null; } } } } Loading @@ -253,7 +253,7 @@ class ShortcutLauncher extends ShortcutPackageItem { return; return; } } final ArrayMap<UserPackage, ArraySet<String>> pinnedShortcuts; final ArrayMap<UserPackage, ArraySet<String>> pinnedShortcuts; synchronized (mLock) { synchronized (mPackageItemLock) { pinnedShortcuts = new ArrayMap<>(mPinnedShortcuts); pinnedShortcuts = new ArrayMap<>(mPinnedShortcuts); } } final int size = pinnedShortcuts.size(); final int size = pinnedShortcuts.size(); Loading Loading @@ -366,7 +366,7 @@ class ShortcutLauncher extends ShortcutPackageItem { : ShortcutService.parseIntAttribute(parser, : ShortcutService.parseIntAttribute(parser, ATTR_PACKAGE_USER_ID, ownerUserId); ATTR_PACKAGE_USER_ID, ownerUserId); ids = new ArraySet<>(); ids = new ArraySet<>(); synchronized (ret.mLock) { synchronized (ret.mPackageItemLock) { ret.mPinnedShortcuts.put( ret.mPinnedShortcuts.put( UserPackage.of(packageUserId, packageName), ids); UserPackage.of(packageUserId, packageName), ids); } } Loading Loading @@ -407,7 +407,7 @@ class ShortcutLauncher extends ShortcutPackageItem { pw.println(); pw.println(); final ArrayMap<UserPackage, ArraySet<String>> pinnedShortcuts; final ArrayMap<UserPackage, ArraySet<String>> pinnedShortcuts; synchronized (mLock) { synchronized (mPackageItemLock) { pinnedShortcuts = new ArrayMap<>(mPinnedShortcuts); pinnedShortcuts = new ArrayMap<>(mPinnedShortcuts); } } final int size = pinnedShortcuts.size(); final int size = pinnedShortcuts.size(); Loading services/core/java/com/android/server/pm/ShortcutPackage.java +29 −29 Original line number Original line Diff line number Diff line Loading @@ -163,20 +163,20 @@ class ShortcutPackage extends ShortcutPackageItem { /** /** * An in-memory copy of shortcuts for this package that was loaded from xml, keyed on IDs. * An in-memory copy of shortcuts for this package that was loaded from xml, keyed on IDs. */ */ @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private final ArrayMap<String, ShortcutInfo> mShortcuts = new ArrayMap<>(); private final ArrayMap<String, ShortcutInfo> mShortcuts = new ArrayMap<>(); /** /** * A temporary copy of shortcuts that are to be cleared once persisted into AppSearch, keyed on * A temporary copy of shortcuts that are to be cleared once persisted into AppSearch, keyed on * IDs. * IDs. */ */ @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private final ArrayMap<String, ShortcutInfo> mTransientShortcuts = new ArrayMap<>(0); private final ArrayMap<String, ShortcutInfo> mTransientShortcuts = new ArrayMap<>(0); /** /** * All the share targets from the package * All the share targets from the package */ */ @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private final ArrayList<ShareTargetInfo> mShareTargets = new ArrayList<>(0); private final ArrayList<ShareTargetInfo> mShareTargets = new ArrayList<>(0); /** /** Loading @@ -193,10 +193,10 @@ class ShortcutPackage extends ShortcutPackageItem { private long mLastKnownForegroundElapsedTime; private long mLastKnownForegroundElapsedTime; @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private long mLastReportedTime; private long mLastReportedTime; @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private boolean mIsAppSearchSchemaUpToDate; private boolean mIsAppSearchSchemaUpToDate; private ShortcutPackage(ShortcutUser shortcutUser, private ShortcutPackage(ShortcutUser shortcutUser, Loading Loading @@ -233,7 +233,7 @@ class ShortcutPackage extends ShortcutPackageItem { } } public int getShortcutCount() { public int getShortcutCount() { synchronized (mLock) { synchronized (mPackageItemLock) { return mShortcuts.size(); return mShortcuts.size(); } } } } Loading Loading @@ -276,7 +276,7 @@ class ShortcutPackage extends ShortcutPackageItem { @Nullable @Nullable public ShortcutInfo findShortcutById(@Nullable final String id) { public ShortcutInfo findShortcutById(@Nullable final String id) { if (id == null) return null; if (id == null) return null; synchronized (mLock) { synchronized (mPackageItemLock) { return mShortcuts.get(id); return mShortcuts.get(id); } } } } Loading Loading @@ -354,7 +354,7 @@ class ShortcutPackage extends ShortcutPackageItem { */ */ private ShortcutInfo forceDeleteShortcutInner(@NonNull String id) { private ShortcutInfo forceDeleteShortcutInner(@NonNull String id) { final ShortcutInfo shortcut; final ShortcutInfo shortcut; synchronized (mLock) { synchronized (mPackageItemLock) { shortcut = mShortcuts.remove(id); shortcut = mShortcuts.remove(id); if (shortcut != null) { if (shortcut != null) { removeIcon(shortcut); removeIcon(shortcut); Loading Loading @@ -409,7 +409,7 @@ class ShortcutPackage extends ShortcutPackageItem { if (newShortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER)) { if (newShortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER)) { if (isAppSearchEnabled()) { if (isAppSearchEnabled()) { synchronized (mLock) { synchronized (mPackageItemLock) { mTransientShortcuts.put(newShortcut.getId(), newShortcut); mTransientShortcuts.put(newShortcut.getId(), newShortcut); } } } } Loading Loading @@ -482,7 +482,7 @@ class ShortcutPackage extends ShortcutPackageItem { if (newShortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER)) { if (newShortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER)) { if (isAppSearchEnabled()) { if (isAppSearchEnabled()) { synchronized (mLock) { synchronized (mPackageItemLock) { mTransientShortcuts.put(newShortcut.getId(), newShortcut); mTransientShortcuts.put(newShortcut.getId(), newShortcut); } } } } Loading @@ -506,7 +506,7 @@ class ShortcutPackage extends ShortcutPackageItem { final ShortcutService service = mShortcutUser.mService; final ShortcutService service = mShortcutUser.mService; // Ensure the total number of shortcuts doesn't exceed the hard limit per app. // Ensure the total number of shortcuts doesn't exceed the hard limit per app. final int maxShortcutPerApp = service.getMaxAppShortcuts(); final int maxShortcutPerApp = service.getMaxAppShortcuts(); synchronized (mLock) { synchronized (mPackageItemLock) { final List<ShortcutInfo> appShortcuts = mShortcuts.values().stream().filter(si -> final List<ShortcutInfo> appShortcuts = mShortcuts.values().stream().filter(si -> !si.isPinned()).collect(Collectors.toList()); !si.isPinned()).collect(Collectors.toList()); if (appShortcuts.size() >= maxShortcutPerApp) { if (appShortcuts.size() >= maxShortcutPerApp) { Loading Loading @@ -555,7 +555,7 @@ class ShortcutPackage extends ShortcutPackageItem { public List<ShortcutInfo> deleteAllDynamicShortcuts() { public List<ShortcutInfo> deleteAllDynamicShortcuts() { final long now = mShortcutUser.mService.injectCurrentTimeMillis(); final long now = mShortcutUser.mService.injectCurrentTimeMillis(); boolean changed = false; boolean changed = false; synchronized (mLock) { synchronized (mPackageItemLock) { for (int i = mShortcuts.size() - 1; i >= 0; i--) { for (int i = mShortcuts.size() - 1; i >= 0; i--) { ShortcutInfo si = mShortcuts.valueAt(i); ShortcutInfo si = mShortcuts.valueAt(i); if (si.isDynamic() && si.isVisibleToPublisher()) { if (si.isDynamic() && si.isVisibleToPublisher()) { Loading Loading @@ -914,7 +914,7 @@ class ShortcutPackage extends ShortcutPackageItem { List<ShortcutManager.ShareShortcutInfo> getMatchingShareTargets( List<ShortcutManager.ShareShortcutInfo> getMatchingShareTargets( @NonNull final IntentFilter filter, @Nullable final String pkgName) { @NonNull final IntentFilter filter, @Nullable final String pkgName) { synchronized (mLock) { synchronized (mPackageItemLock) { final List<ShareTargetInfo> matchedTargets = new ArrayList<>(); final List<ShareTargetInfo> matchedTargets = new ArrayList<>(); for (int i = 0; i < mShareTargets.size(); i++) { for (int i = 0; i < mShareTargets.size(); i++) { final ShareTargetInfo target = mShareTargets.get(i); final ShareTargetInfo target = mShareTargets.get(i); Loading Loading @@ -967,7 +967,7 @@ class ShortcutPackage extends ShortcutPackageItem { } } public boolean hasShareTargets() { public boolean hasShareTargets() { synchronized (mLock) { synchronized (mPackageItemLock) { return !mShareTargets.isEmpty(); return !mShareTargets.isEmpty(); } } } } Loading @@ -978,7 +978,7 @@ class ShortcutPackage extends ShortcutPackageItem { * the app's Xml resource. * the app's Xml resource. */ */ int getSharingShortcutCount() { int getSharingShortcutCount() { synchronized (mLock) { synchronized (mPackageItemLock) { if (mShareTargets.isEmpty()) { if (mShareTargets.isEmpty()) { return 0; return 0; } } Loading Loading @@ -1017,7 +1017,7 @@ class ShortcutPackage extends ShortcutPackageItem { /** /** * Return the filenames (excluding path names) of icon bitmap files from this package. * Return the filenames (excluding path names) of icon bitmap files from this package. */ */ @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private ArraySet<String> getUsedBitmapFilesLocked() { private ArraySet<String> getUsedBitmapFilesLocked() { final ArraySet<String> usedFiles = new ArraySet<>(1); final ArraySet<String> usedFiles = new ArraySet<>(1); forEachShortcut(si -> { forEachShortcut(si -> { Loading @@ -1029,7 +1029,7 @@ class ShortcutPackage extends ShortcutPackageItem { } } public void cleanupDanglingBitmapFiles(@NonNull File path) { public void cleanupDanglingBitmapFiles(@NonNull File path) { synchronized (mLock) { synchronized (mPackageItemLock) { mShortcutBitmapSaver.waitForAllSavesLocked(); mShortcutBitmapSaver.waitForAllSavesLocked(); final ArraySet<String> usedFiles = getUsedBitmapFilesLocked(); final ArraySet<String> usedFiles = getUsedBitmapFilesLocked(); Loading Loading @@ -1136,7 +1136,7 @@ class ShortcutPackage extends ShortcutPackageItem { // Now prepare to publish manifest shortcuts. // Now prepare to publish manifest shortcuts. List<ShortcutInfo> newManifestShortcutList = null; List<ShortcutInfo> newManifestShortcutList = null; int shareTargetSize = 0; int shareTargetSize = 0; synchronized (mLock) { synchronized (mPackageItemLock) { try { try { shareTargetSize = mShareTargets.size(); shareTargetSize = mShareTargets.size(); newManifestShortcutList = ShortcutParser.parseShortcuts(mShortcutUser.mService, newManifestShortcutList = ShortcutParser.parseShortcuts(mShortcutUser.mService, Loading Loading @@ -1680,7 +1680,7 @@ class ShortcutPackage extends ShortcutPackageItem { void reportShortcutUsed(@NonNull final UsageStatsManagerInternal usageStatsManagerInternal, void reportShortcutUsed(@NonNull final UsageStatsManagerInternal usageStatsManagerInternal, @NonNull final String shortcutId) { @NonNull final String shortcutId) { synchronized (mLock) { synchronized (mPackageItemLock) { final long currentTS = SystemClock.elapsedRealtime(); final long currentTS = SystemClock.elapsedRealtime(); final ShortcutService s = mShortcutUser.mService; final ShortcutService s = mShortcutUser.mService; if (currentTS - mLastReportedTime > s.mSaveDelayMillis) { if (currentTS - mLastReportedTime > s.mSaveDelayMillis) { Loading Loading @@ -1757,7 +1757,7 @@ class ShortcutPackage extends ShortcutPackageItem { pw.println(")"); pw.println(")"); pw.println(); pw.println(); synchronized (mLock) { synchronized (mPackageItemLock) { mShortcutBitmapSaver.dumpLocked(pw, " "); mShortcutBitmapSaver.dumpLocked(pw, " "); } } } } Loading Loading @@ -1827,7 +1827,7 @@ class ShortcutPackage extends ShortcutPackageItem { @Override @Override public void saveToXml(@NonNull TypedXmlSerializer out, boolean forBackup) public void saveToXml(@NonNull TypedXmlSerializer out, boolean forBackup) throws IOException, XmlPullParserException { throws IOException, XmlPullParserException { synchronized (mLock) { synchronized (mPackageItemLock) { final int size = mShortcuts.size(); final int size = mShortcuts.size(); final int shareTargetSize = mShareTargets.size(); final int shareTargetSize = mShareTargets.size(); Loading Loading @@ -2037,7 +2037,7 @@ class ShortcutPackage extends ShortcutPackageItem { final ShortcutPackage ret = new ShortcutPackage(shortcutUser, final ShortcutPackage ret = new ShortcutPackage(shortcutUser, shortcutUser.getUserId(), packageName); shortcutUser.getUserId(), packageName); synchronized (ret.mLock) { synchronized (ret.mPackageItemLock) { ret.mIsAppSearchSchemaUpToDate = ShortcutService.parseIntAttribute( ret.mIsAppSearchSchemaUpToDate = ShortcutService.parseIntAttribute( parser, ATTR_SCHEMA_VERSON, 0) == AppSearchShortcutInfo.SCHEMA_VERSION; parser, ATTR_SCHEMA_VERSON, 0) == AppSearchShortcutInfo.SCHEMA_VERSION; Loading Loading @@ -2283,7 +2283,7 @@ class ShortcutPackage extends ShortcutPackageItem { @VisibleForTesting @VisibleForTesting List<ShareTargetInfo> getAllShareTargetsForTest() { List<ShareTargetInfo> getAllShareTargetsForTest() { synchronized (mLock) { synchronized (mPackageItemLock) { return new ArrayList<>(mShareTargets); return new ArrayList<>(mShareTargets); } } } } Loading Loading @@ -2404,7 +2404,7 @@ class ShortcutPackage extends ShortcutPackageItem { @NonNull final Consumer<ShortcutInfo> transform) { @NonNull final Consumer<ShortcutInfo> transform) { Objects.requireNonNull(id); Objects.requireNonNull(id); Objects.requireNonNull(transform); Objects.requireNonNull(transform); synchronized (mLock) { synchronized (mPackageItemLock) { if (shortcut != null) { if (shortcut != null) { transform.accept(shortcut); transform.accept(shortcut); } } Loading @@ -2424,7 +2424,7 @@ class ShortcutPackage extends ShortcutPackageItem { private void saveShortcut(@NonNull final Collection<ShortcutInfo> shortcuts) { private void saveShortcut(@NonNull final Collection<ShortcutInfo> shortcuts) { Objects.requireNonNull(shortcuts); Objects.requireNonNull(shortcuts); synchronized (mLock) { synchronized (mPackageItemLock) { for (ShortcutInfo si : shortcuts) { for (ShortcutInfo si : shortcuts) { mShortcuts.put(si.getId(), si); mShortcuts.put(si.getId(), si); } } Loading @@ -2433,7 +2433,7 @@ class ShortcutPackage extends ShortcutPackageItem { @Nullable @Nullable List<ShortcutInfo> findAll(@NonNull final Collection<String> ids) { List<ShortcutInfo> findAll(@NonNull final Collection<String> ids) { synchronized (mLock) { synchronized (mPackageItemLock) { return ids.stream().map(mShortcuts::get) return ids.stream().map(mShortcuts::get) .filter(Objects::nonNull).collect(Collectors.toList()); .filter(Objects::nonNull).collect(Collectors.toList()); } } Loading @@ -2455,7 +2455,7 @@ class ShortcutPackage extends ShortcutPackageItem { private void forEachShortcutStopWhen( private void forEachShortcutStopWhen( @NonNull final Function<ShortcutInfo, Boolean> cb) { @NonNull final Function<ShortcutInfo, Boolean> cb) { synchronized (mLock) { synchronized (mPackageItemLock) { for (int i = mShortcuts.size() - 1; i >= 0; i--) { for (int i = mShortcuts.size() - 1; i >= 0; i--) { final ShortcutInfo si = mShortcuts.valueAt(i); final ShortcutInfo si = mShortcuts.valueAt(i); if (cb.apply(si)) { if (cb.apply(si)) { Loading Loading @@ -2600,7 +2600,7 @@ class ShortcutPackage extends ShortcutPackageItem { }))); }))); } } @GuardedBy("mLock") @GuardedBy("mPackageItemLock") @Override @Override void scheduleSaveToAppSearchLocked() { void scheduleSaveToAppSearchLocked() { final Map<String, ShortcutInfo> copy = new ArrayMap<>(mShortcuts); final Map<String, ShortcutInfo> copy = new ArrayMap<>(mShortcuts); Loading Loading @@ -2684,7 +2684,7 @@ class ShortcutPackage extends ShortcutPackageItem { .penaltyLog() // TODO: change this to penaltyDeath to fix the call-site .penaltyLog() // TODO: change this to penaltyDeath to fix the call-site .build()); .build()); future = mShortcutUser.getAppSearch(searchContext); future = mShortcutUser.getAppSearch(searchContext); synchronized (mLock) { synchronized (mPackageItemLock) { if (!mIsAppSearchSchemaUpToDate) { if (!mIsAppSearchSchemaUpToDate) { future = future.thenCompose(this::setupSchema); future = future.thenCompose(this::setupSchema); } } Loading services/core/java/com/android/server/pm/ShortcutPackageItem.java +11 −11 Original line number Original line Diff line number Diff line Loading @@ -39,7 +39,7 @@ import java.nio.charset.StandardCharsets; import java.util.Objects; import java.util.Objects; /** /** * All methods should be either guarded by {@code #mShortcutUser.mService.mLock} or {@code #mLock}. * All methods should be either guarded by {@code #mPackageItemLock}. */ */ abstract class ShortcutPackageItem { abstract class ShortcutPackageItem { private static final String TAG = ShortcutService.TAG; private static final String TAG = ShortcutService.TAG; Loading @@ -52,10 +52,10 @@ abstract class ShortcutPackageItem { protected ShortcutUser mShortcutUser; protected ShortcutUser mShortcutUser; @GuardedBy("mLock") @GuardedBy("mPackageItemLock") protected final ShortcutBitmapSaver mShortcutBitmapSaver; protected final ShortcutBitmapSaver mShortcutBitmapSaver; protected final Object mLock = new Object(); protected final Object mPackageItemLock = new Object(); protected ShortcutPackageItem(@NonNull ShortcutUser shortcutUser, protected ShortcutPackageItem(@NonNull ShortcutUser shortcutUser, int packageUserId, @NonNull String packageName, int packageUserId, @NonNull String packageName, Loading Loading @@ -157,7 +157,7 @@ abstract class ShortcutPackageItem { public abstract void saveToXml(@NonNull TypedXmlSerializer out, boolean forBackup) public abstract void saveToXml(@NonNull TypedXmlSerializer out, boolean forBackup) throws IOException, XmlPullParserException; throws IOException, XmlPullParserException; @GuardedBy("mLock") @GuardedBy("mPackageItemLock") public void saveToFileLocked(File path, boolean forBackup) { public void saveToFileLocked(File path, boolean forBackup) { try (ResilientAtomicFile file = getResilientFile(path)) { try (ResilientAtomicFile file = getResilientFile(path)) { FileOutputStream os = null; FileOutputStream os = null; Loading Loading @@ -187,7 +187,7 @@ abstract class ShortcutPackageItem { } } } } @GuardedBy("mLock") @GuardedBy("mPackageItemLock") void scheduleSaveToAppSearchLocked() { void scheduleSaveToAppSearchLocked() { } } Loading Loading @@ -219,7 +219,7 @@ abstract class ShortcutPackageItem { if (ShortcutService.DEBUG || ShortcutService.DEBUG_REBOOT) { if (ShortcutService.DEBUG || ShortcutService.DEBUG_REBOOT) { Slog.d(TAG, "Saving package item " + getPackageName() + " to " + path); Slog.d(TAG, "Saving package item " + getPackageName() + " to " + path); } } synchronized (mLock) { synchronized (mPackageItemLock) { path.getParentFile().mkdirs(); path.getParentFile().mkdirs(); // TODO: Since we are persisting shortcuts into AppSearch, we should read from/write to // TODO: Since we are persisting shortcuts into AppSearch, we should read from/write to // AppSearch as opposed to maintaining a separate XML file. // AppSearch as opposed to maintaining a separate XML file. Loading @@ -229,14 +229,14 @@ abstract class ShortcutPackageItem { } } public boolean waitForBitmapSaves() { public boolean waitForBitmapSaves() { synchronized (mLock) { synchronized (mPackageItemLock) { return mShortcutBitmapSaver.waitForAllSavesLocked(); return mShortcutBitmapSaver.waitForAllSavesLocked(); } } } } public void saveBitmap(ShortcutInfo shortcut, public void saveBitmap(ShortcutInfo shortcut, int maxDimension, Bitmap.CompressFormat format, int quality) { int maxDimension, Bitmap.CompressFormat format, int quality) { synchronized (mLock) { synchronized (mPackageItemLock) { mShortcutBitmapSaver.saveBitmapLocked(shortcut, maxDimension, format, quality); mShortcutBitmapSaver.saveBitmapLocked(shortcut, maxDimension, format, quality); } } } } Loading @@ -246,19 +246,19 @@ abstract class ShortcutPackageItem { */ */ @Nullable @Nullable public String getBitmapPathMayWait(ShortcutInfo shortcut) { public String getBitmapPathMayWait(ShortcutInfo shortcut) { synchronized (mLock) { synchronized (mPackageItemLock) { return mShortcutBitmapSaver.getBitmapPathMayWaitLocked(shortcut); return mShortcutBitmapSaver.getBitmapPathMayWaitLocked(shortcut); } } } } public void removeIcon(ShortcutInfo shortcut) { public void removeIcon(ShortcutInfo shortcut) { synchronized (mLock) { synchronized (mPackageItemLock) { mShortcutBitmapSaver.removeIcon(shortcut); mShortcutBitmapSaver.removeIcon(shortcut); } } } } void removeShortcutPackageItem() { void removeShortcutPackageItem() { synchronized (mLock) { synchronized (mPackageItemLock) { getResilientFile(getShortcutPackageItemFile()).delete(); getResilientFile(getShortcutPackageItemFile()).delete(); } } } } Loading services/core/java/com/android/server/pm/ShortcutService.java +106 −106 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
services/core/java/com/android/server/pm/ShortcutLauncher.java +12 −12 Original line number Original line Diff line number Diff line Loading @@ -46,7 +46,7 @@ import java.util.List; /** /** * Launcher information used by {@link ShortcutService}. * Launcher information used by {@link ShortcutService}. * * * All methods should be guarded by {@code #mShortcutUser.mService.mLock}. * All methods should be guarded by {@code ShortcutPackageItem#mPackageItemLock}. */ */ class ShortcutLauncher extends ShortcutPackageItem { class ShortcutLauncher extends ShortcutPackageItem { private static final String TAG = ShortcutService.TAG; private static final String TAG = ShortcutService.TAG; Loading @@ -66,7 +66,7 @@ class ShortcutLauncher extends ShortcutPackageItem { /** /** * Package name -> IDs. * Package name -> IDs. */ */ @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private final ArrayMap<UserPackage, ArraySet<String>> mPinnedShortcuts = new ArrayMap<>(); private final ArrayMap<UserPackage, ArraySet<String>> mPinnedShortcuts = new ArrayMap<>(); private ShortcutLauncher(@NonNull ShortcutUser shortcutUser, private ShortcutLauncher(@NonNull ShortcutUser shortcutUser, Loading Loading @@ -99,7 +99,7 @@ class ShortcutLauncher extends ShortcutPackageItem { */ */ private void onRestoreBlocked() { private void onRestoreBlocked() { final ArrayList<UserPackage> pinnedPackages; final ArrayList<UserPackage> pinnedPackages; synchronized (mLock) { synchronized (mPackageItemLock) { pinnedPackages = new ArrayList<>(mPinnedShortcuts.keySet()); pinnedPackages = new ArrayList<>(mPinnedShortcuts.keySet()); mPinnedShortcuts.clear(); mPinnedShortcuts.clear(); } } Loading Loading @@ -138,7 +138,7 @@ class ShortcutLauncher extends ShortcutPackageItem { final int idSize = ids.size(); final int idSize = ids.size(); if (idSize == 0) { if (idSize == 0) { synchronized (mLock) { synchronized (mPackageItemLock) { mPinnedShortcuts.remove(up); mPinnedShortcuts.remove(up); } } } else { } else { Loading @@ -165,7 +165,7 @@ class ShortcutLauncher extends ShortcutPackageItem { floatingSet.add(id); floatingSet.add(id); } } } } synchronized (mLock) { synchronized (mPackageItemLock) { final ArraySet<String> prevSet = mPinnedShortcuts.get(up); final ArraySet<String> prevSet = mPinnedShortcuts.get(up); if (prevSet != null) { if (prevSet != null) { for (String id : floatingSet) { for (String id : floatingSet) { Loading @@ -187,7 +187,7 @@ class ShortcutLauncher extends ShortcutPackageItem { @Nullable @Nullable public ArraySet<String> getPinnedShortcutIds(@NonNull String packageName, public ArraySet<String> getPinnedShortcutIds(@NonNull String packageName, @UserIdInt int packageUserId) { @UserIdInt int packageUserId) { synchronized (mLock) { synchronized (mPackageItemLock) { final ArraySet<String> pinnedShortcuts = mPinnedShortcuts.get( final ArraySet<String> pinnedShortcuts = mPinnedShortcuts.get( UserPackage.of(packageUserId, packageName)); UserPackage.of(packageUserId, packageName)); return pinnedShortcuts == null ? null : new ArraySet<>(pinnedShortcuts); return pinnedShortcuts == null ? null : new ArraySet<>(pinnedShortcuts); Loading @@ -198,7 +198,7 @@ class ShortcutLauncher extends ShortcutPackageItem { * Return true if the given shortcut is pinned by this launcher.<code></code> * Return true if the given shortcut is pinned by this launcher.<code></code> */ */ public boolean hasPinned(ShortcutInfo shortcut) { public boolean hasPinned(ShortcutInfo shortcut) { synchronized (mLock) { synchronized (mPackageItemLock) { final ArraySet<String> pinned = mPinnedShortcuts.get( final ArraySet<String> pinned = mPinnedShortcuts.get( UserPackage.of(shortcut.getUserId(), shortcut.getPackage())); UserPackage.of(shortcut.getUserId(), shortcut.getPackage())); return (pinned != null) && pinned.contains(shortcut.getId()); return (pinned != null) && pinned.contains(shortcut.getId()); Loading @@ -211,7 +211,7 @@ class ShortcutLauncher extends ShortcutPackageItem { public void addPinnedShortcut(@NonNull String packageName, @UserIdInt int packageUserId, public void addPinnedShortcut(@NonNull String packageName, @UserIdInt int packageUserId, String id, boolean forPinRequest) { String id, boolean forPinRequest) { final ArrayList<String> pinnedList; final ArrayList<String> pinnedList; synchronized (mLock) { synchronized (mPackageItemLock) { final ArraySet<String> pinnedSet = mPinnedShortcuts.get( final ArraySet<String> pinnedSet = mPinnedShortcuts.get( UserPackage.of(packageUserId, packageName)); UserPackage.of(packageUserId, packageName)); if (pinnedSet != null) { if (pinnedSet != null) { Loading @@ -227,7 +227,7 @@ class ShortcutLauncher extends ShortcutPackageItem { } } boolean cleanUpPackage(String packageName, @UserIdInt int packageUserId) { boolean cleanUpPackage(String packageName, @UserIdInt int packageUserId) { synchronized (mLock) { synchronized (mPackageItemLock) { return mPinnedShortcuts.remove(UserPackage.of(packageUserId, packageName)) != null; return mPinnedShortcuts.remove(UserPackage.of(packageUserId, packageName)) != null; } } } } Loading @@ -253,7 +253,7 @@ class ShortcutLauncher extends ShortcutPackageItem { return; return; } } final ArrayMap<UserPackage, ArraySet<String>> pinnedShortcuts; final ArrayMap<UserPackage, ArraySet<String>> pinnedShortcuts; synchronized (mLock) { synchronized (mPackageItemLock) { pinnedShortcuts = new ArrayMap<>(mPinnedShortcuts); pinnedShortcuts = new ArrayMap<>(mPinnedShortcuts); } } final int size = pinnedShortcuts.size(); final int size = pinnedShortcuts.size(); Loading Loading @@ -366,7 +366,7 @@ class ShortcutLauncher extends ShortcutPackageItem { : ShortcutService.parseIntAttribute(parser, : ShortcutService.parseIntAttribute(parser, ATTR_PACKAGE_USER_ID, ownerUserId); ATTR_PACKAGE_USER_ID, ownerUserId); ids = new ArraySet<>(); ids = new ArraySet<>(); synchronized (ret.mLock) { synchronized (ret.mPackageItemLock) { ret.mPinnedShortcuts.put( ret.mPinnedShortcuts.put( UserPackage.of(packageUserId, packageName), ids); UserPackage.of(packageUserId, packageName), ids); } } Loading Loading @@ -407,7 +407,7 @@ class ShortcutLauncher extends ShortcutPackageItem { pw.println(); pw.println(); final ArrayMap<UserPackage, ArraySet<String>> pinnedShortcuts; final ArrayMap<UserPackage, ArraySet<String>> pinnedShortcuts; synchronized (mLock) { synchronized (mPackageItemLock) { pinnedShortcuts = new ArrayMap<>(mPinnedShortcuts); pinnedShortcuts = new ArrayMap<>(mPinnedShortcuts); } } final int size = pinnedShortcuts.size(); final int size = pinnedShortcuts.size(); Loading
services/core/java/com/android/server/pm/ShortcutPackage.java +29 −29 Original line number Original line Diff line number Diff line Loading @@ -163,20 +163,20 @@ class ShortcutPackage extends ShortcutPackageItem { /** /** * An in-memory copy of shortcuts for this package that was loaded from xml, keyed on IDs. * An in-memory copy of shortcuts for this package that was loaded from xml, keyed on IDs. */ */ @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private final ArrayMap<String, ShortcutInfo> mShortcuts = new ArrayMap<>(); private final ArrayMap<String, ShortcutInfo> mShortcuts = new ArrayMap<>(); /** /** * A temporary copy of shortcuts that are to be cleared once persisted into AppSearch, keyed on * A temporary copy of shortcuts that are to be cleared once persisted into AppSearch, keyed on * IDs. * IDs. */ */ @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private final ArrayMap<String, ShortcutInfo> mTransientShortcuts = new ArrayMap<>(0); private final ArrayMap<String, ShortcutInfo> mTransientShortcuts = new ArrayMap<>(0); /** /** * All the share targets from the package * All the share targets from the package */ */ @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private final ArrayList<ShareTargetInfo> mShareTargets = new ArrayList<>(0); private final ArrayList<ShareTargetInfo> mShareTargets = new ArrayList<>(0); /** /** Loading @@ -193,10 +193,10 @@ class ShortcutPackage extends ShortcutPackageItem { private long mLastKnownForegroundElapsedTime; private long mLastKnownForegroundElapsedTime; @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private long mLastReportedTime; private long mLastReportedTime; @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private boolean mIsAppSearchSchemaUpToDate; private boolean mIsAppSearchSchemaUpToDate; private ShortcutPackage(ShortcutUser shortcutUser, private ShortcutPackage(ShortcutUser shortcutUser, Loading Loading @@ -233,7 +233,7 @@ class ShortcutPackage extends ShortcutPackageItem { } } public int getShortcutCount() { public int getShortcutCount() { synchronized (mLock) { synchronized (mPackageItemLock) { return mShortcuts.size(); return mShortcuts.size(); } } } } Loading Loading @@ -276,7 +276,7 @@ class ShortcutPackage extends ShortcutPackageItem { @Nullable @Nullable public ShortcutInfo findShortcutById(@Nullable final String id) { public ShortcutInfo findShortcutById(@Nullable final String id) { if (id == null) return null; if (id == null) return null; synchronized (mLock) { synchronized (mPackageItemLock) { return mShortcuts.get(id); return mShortcuts.get(id); } } } } Loading Loading @@ -354,7 +354,7 @@ class ShortcutPackage extends ShortcutPackageItem { */ */ private ShortcutInfo forceDeleteShortcutInner(@NonNull String id) { private ShortcutInfo forceDeleteShortcutInner(@NonNull String id) { final ShortcutInfo shortcut; final ShortcutInfo shortcut; synchronized (mLock) { synchronized (mPackageItemLock) { shortcut = mShortcuts.remove(id); shortcut = mShortcuts.remove(id); if (shortcut != null) { if (shortcut != null) { removeIcon(shortcut); removeIcon(shortcut); Loading Loading @@ -409,7 +409,7 @@ class ShortcutPackage extends ShortcutPackageItem { if (newShortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER)) { if (newShortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER)) { if (isAppSearchEnabled()) { if (isAppSearchEnabled()) { synchronized (mLock) { synchronized (mPackageItemLock) { mTransientShortcuts.put(newShortcut.getId(), newShortcut); mTransientShortcuts.put(newShortcut.getId(), newShortcut); } } } } Loading Loading @@ -482,7 +482,7 @@ class ShortcutPackage extends ShortcutPackageItem { if (newShortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER)) { if (newShortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER)) { if (isAppSearchEnabled()) { if (isAppSearchEnabled()) { synchronized (mLock) { synchronized (mPackageItemLock) { mTransientShortcuts.put(newShortcut.getId(), newShortcut); mTransientShortcuts.put(newShortcut.getId(), newShortcut); } } } } Loading @@ -506,7 +506,7 @@ class ShortcutPackage extends ShortcutPackageItem { final ShortcutService service = mShortcutUser.mService; final ShortcutService service = mShortcutUser.mService; // Ensure the total number of shortcuts doesn't exceed the hard limit per app. // Ensure the total number of shortcuts doesn't exceed the hard limit per app. final int maxShortcutPerApp = service.getMaxAppShortcuts(); final int maxShortcutPerApp = service.getMaxAppShortcuts(); synchronized (mLock) { synchronized (mPackageItemLock) { final List<ShortcutInfo> appShortcuts = mShortcuts.values().stream().filter(si -> final List<ShortcutInfo> appShortcuts = mShortcuts.values().stream().filter(si -> !si.isPinned()).collect(Collectors.toList()); !si.isPinned()).collect(Collectors.toList()); if (appShortcuts.size() >= maxShortcutPerApp) { if (appShortcuts.size() >= maxShortcutPerApp) { Loading Loading @@ -555,7 +555,7 @@ class ShortcutPackage extends ShortcutPackageItem { public List<ShortcutInfo> deleteAllDynamicShortcuts() { public List<ShortcutInfo> deleteAllDynamicShortcuts() { final long now = mShortcutUser.mService.injectCurrentTimeMillis(); final long now = mShortcutUser.mService.injectCurrentTimeMillis(); boolean changed = false; boolean changed = false; synchronized (mLock) { synchronized (mPackageItemLock) { for (int i = mShortcuts.size() - 1; i >= 0; i--) { for (int i = mShortcuts.size() - 1; i >= 0; i--) { ShortcutInfo si = mShortcuts.valueAt(i); ShortcutInfo si = mShortcuts.valueAt(i); if (si.isDynamic() && si.isVisibleToPublisher()) { if (si.isDynamic() && si.isVisibleToPublisher()) { Loading Loading @@ -914,7 +914,7 @@ class ShortcutPackage extends ShortcutPackageItem { List<ShortcutManager.ShareShortcutInfo> getMatchingShareTargets( List<ShortcutManager.ShareShortcutInfo> getMatchingShareTargets( @NonNull final IntentFilter filter, @Nullable final String pkgName) { @NonNull final IntentFilter filter, @Nullable final String pkgName) { synchronized (mLock) { synchronized (mPackageItemLock) { final List<ShareTargetInfo> matchedTargets = new ArrayList<>(); final List<ShareTargetInfo> matchedTargets = new ArrayList<>(); for (int i = 0; i < mShareTargets.size(); i++) { for (int i = 0; i < mShareTargets.size(); i++) { final ShareTargetInfo target = mShareTargets.get(i); final ShareTargetInfo target = mShareTargets.get(i); Loading Loading @@ -967,7 +967,7 @@ class ShortcutPackage extends ShortcutPackageItem { } } public boolean hasShareTargets() { public boolean hasShareTargets() { synchronized (mLock) { synchronized (mPackageItemLock) { return !mShareTargets.isEmpty(); return !mShareTargets.isEmpty(); } } } } Loading @@ -978,7 +978,7 @@ class ShortcutPackage extends ShortcutPackageItem { * the app's Xml resource. * the app's Xml resource. */ */ int getSharingShortcutCount() { int getSharingShortcutCount() { synchronized (mLock) { synchronized (mPackageItemLock) { if (mShareTargets.isEmpty()) { if (mShareTargets.isEmpty()) { return 0; return 0; } } Loading Loading @@ -1017,7 +1017,7 @@ class ShortcutPackage extends ShortcutPackageItem { /** /** * Return the filenames (excluding path names) of icon bitmap files from this package. * Return the filenames (excluding path names) of icon bitmap files from this package. */ */ @GuardedBy("mLock") @GuardedBy("mPackageItemLock") private ArraySet<String> getUsedBitmapFilesLocked() { private ArraySet<String> getUsedBitmapFilesLocked() { final ArraySet<String> usedFiles = new ArraySet<>(1); final ArraySet<String> usedFiles = new ArraySet<>(1); forEachShortcut(si -> { forEachShortcut(si -> { Loading @@ -1029,7 +1029,7 @@ class ShortcutPackage extends ShortcutPackageItem { } } public void cleanupDanglingBitmapFiles(@NonNull File path) { public void cleanupDanglingBitmapFiles(@NonNull File path) { synchronized (mLock) { synchronized (mPackageItemLock) { mShortcutBitmapSaver.waitForAllSavesLocked(); mShortcutBitmapSaver.waitForAllSavesLocked(); final ArraySet<String> usedFiles = getUsedBitmapFilesLocked(); final ArraySet<String> usedFiles = getUsedBitmapFilesLocked(); Loading Loading @@ -1136,7 +1136,7 @@ class ShortcutPackage extends ShortcutPackageItem { // Now prepare to publish manifest shortcuts. // Now prepare to publish manifest shortcuts. List<ShortcutInfo> newManifestShortcutList = null; List<ShortcutInfo> newManifestShortcutList = null; int shareTargetSize = 0; int shareTargetSize = 0; synchronized (mLock) { synchronized (mPackageItemLock) { try { try { shareTargetSize = mShareTargets.size(); shareTargetSize = mShareTargets.size(); newManifestShortcutList = ShortcutParser.parseShortcuts(mShortcutUser.mService, newManifestShortcutList = ShortcutParser.parseShortcuts(mShortcutUser.mService, Loading Loading @@ -1680,7 +1680,7 @@ class ShortcutPackage extends ShortcutPackageItem { void reportShortcutUsed(@NonNull final UsageStatsManagerInternal usageStatsManagerInternal, void reportShortcutUsed(@NonNull final UsageStatsManagerInternal usageStatsManagerInternal, @NonNull final String shortcutId) { @NonNull final String shortcutId) { synchronized (mLock) { synchronized (mPackageItemLock) { final long currentTS = SystemClock.elapsedRealtime(); final long currentTS = SystemClock.elapsedRealtime(); final ShortcutService s = mShortcutUser.mService; final ShortcutService s = mShortcutUser.mService; if (currentTS - mLastReportedTime > s.mSaveDelayMillis) { if (currentTS - mLastReportedTime > s.mSaveDelayMillis) { Loading Loading @@ -1757,7 +1757,7 @@ class ShortcutPackage extends ShortcutPackageItem { pw.println(")"); pw.println(")"); pw.println(); pw.println(); synchronized (mLock) { synchronized (mPackageItemLock) { mShortcutBitmapSaver.dumpLocked(pw, " "); mShortcutBitmapSaver.dumpLocked(pw, " "); } } } } Loading Loading @@ -1827,7 +1827,7 @@ class ShortcutPackage extends ShortcutPackageItem { @Override @Override public void saveToXml(@NonNull TypedXmlSerializer out, boolean forBackup) public void saveToXml(@NonNull TypedXmlSerializer out, boolean forBackup) throws IOException, XmlPullParserException { throws IOException, XmlPullParserException { synchronized (mLock) { synchronized (mPackageItemLock) { final int size = mShortcuts.size(); final int size = mShortcuts.size(); final int shareTargetSize = mShareTargets.size(); final int shareTargetSize = mShareTargets.size(); Loading Loading @@ -2037,7 +2037,7 @@ class ShortcutPackage extends ShortcutPackageItem { final ShortcutPackage ret = new ShortcutPackage(shortcutUser, final ShortcutPackage ret = new ShortcutPackage(shortcutUser, shortcutUser.getUserId(), packageName); shortcutUser.getUserId(), packageName); synchronized (ret.mLock) { synchronized (ret.mPackageItemLock) { ret.mIsAppSearchSchemaUpToDate = ShortcutService.parseIntAttribute( ret.mIsAppSearchSchemaUpToDate = ShortcutService.parseIntAttribute( parser, ATTR_SCHEMA_VERSON, 0) == AppSearchShortcutInfo.SCHEMA_VERSION; parser, ATTR_SCHEMA_VERSON, 0) == AppSearchShortcutInfo.SCHEMA_VERSION; Loading Loading @@ -2283,7 +2283,7 @@ class ShortcutPackage extends ShortcutPackageItem { @VisibleForTesting @VisibleForTesting List<ShareTargetInfo> getAllShareTargetsForTest() { List<ShareTargetInfo> getAllShareTargetsForTest() { synchronized (mLock) { synchronized (mPackageItemLock) { return new ArrayList<>(mShareTargets); return new ArrayList<>(mShareTargets); } } } } Loading Loading @@ -2404,7 +2404,7 @@ class ShortcutPackage extends ShortcutPackageItem { @NonNull final Consumer<ShortcutInfo> transform) { @NonNull final Consumer<ShortcutInfo> transform) { Objects.requireNonNull(id); Objects.requireNonNull(id); Objects.requireNonNull(transform); Objects.requireNonNull(transform); synchronized (mLock) { synchronized (mPackageItemLock) { if (shortcut != null) { if (shortcut != null) { transform.accept(shortcut); transform.accept(shortcut); } } Loading @@ -2424,7 +2424,7 @@ class ShortcutPackage extends ShortcutPackageItem { private void saveShortcut(@NonNull final Collection<ShortcutInfo> shortcuts) { private void saveShortcut(@NonNull final Collection<ShortcutInfo> shortcuts) { Objects.requireNonNull(shortcuts); Objects.requireNonNull(shortcuts); synchronized (mLock) { synchronized (mPackageItemLock) { for (ShortcutInfo si : shortcuts) { for (ShortcutInfo si : shortcuts) { mShortcuts.put(si.getId(), si); mShortcuts.put(si.getId(), si); } } Loading @@ -2433,7 +2433,7 @@ class ShortcutPackage extends ShortcutPackageItem { @Nullable @Nullable List<ShortcutInfo> findAll(@NonNull final Collection<String> ids) { List<ShortcutInfo> findAll(@NonNull final Collection<String> ids) { synchronized (mLock) { synchronized (mPackageItemLock) { return ids.stream().map(mShortcuts::get) return ids.stream().map(mShortcuts::get) .filter(Objects::nonNull).collect(Collectors.toList()); .filter(Objects::nonNull).collect(Collectors.toList()); } } Loading @@ -2455,7 +2455,7 @@ class ShortcutPackage extends ShortcutPackageItem { private void forEachShortcutStopWhen( private void forEachShortcutStopWhen( @NonNull final Function<ShortcutInfo, Boolean> cb) { @NonNull final Function<ShortcutInfo, Boolean> cb) { synchronized (mLock) { synchronized (mPackageItemLock) { for (int i = mShortcuts.size() - 1; i >= 0; i--) { for (int i = mShortcuts.size() - 1; i >= 0; i--) { final ShortcutInfo si = mShortcuts.valueAt(i); final ShortcutInfo si = mShortcuts.valueAt(i); if (cb.apply(si)) { if (cb.apply(si)) { Loading Loading @@ -2600,7 +2600,7 @@ class ShortcutPackage extends ShortcutPackageItem { }))); }))); } } @GuardedBy("mLock") @GuardedBy("mPackageItemLock") @Override @Override void scheduleSaveToAppSearchLocked() { void scheduleSaveToAppSearchLocked() { final Map<String, ShortcutInfo> copy = new ArrayMap<>(mShortcuts); final Map<String, ShortcutInfo> copy = new ArrayMap<>(mShortcuts); Loading Loading @@ -2684,7 +2684,7 @@ class ShortcutPackage extends ShortcutPackageItem { .penaltyLog() // TODO: change this to penaltyDeath to fix the call-site .penaltyLog() // TODO: change this to penaltyDeath to fix the call-site .build()); .build()); future = mShortcutUser.getAppSearch(searchContext); future = mShortcutUser.getAppSearch(searchContext); synchronized (mLock) { synchronized (mPackageItemLock) { if (!mIsAppSearchSchemaUpToDate) { if (!mIsAppSearchSchemaUpToDate) { future = future.thenCompose(this::setupSchema); future = future.thenCompose(this::setupSchema); } } Loading
services/core/java/com/android/server/pm/ShortcutPackageItem.java +11 −11 Original line number Original line Diff line number Diff line Loading @@ -39,7 +39,7 @@ import java.nio.charset.StandardCharsets; import java.util.Objects; import java.util.Objects; /** /** * All methods should be either guarded by {@code #mShortcutUser.mService.mLock} or {@code #mLock}. * All methods should be either guarded by {@code #mPackageItemLock}. */ */ abstract class ShortcutPackageItem { abstract class ShortcutPackageItem { private static final String TAG = ShortcutService.TAG; private static final String TAG = ShortcutService.TAG; Loading @@ -52,10 +52,10 @@ abstract class ShortcutPackageItem { protected ShortcutUser mShortcutUser; protected ShortcutUser mShortcutUser; @GuardedBy("mLock") @GuardedBy("mPackageItemLock") protected final ShortcutBitmapSaver mShortcutBitmapSaver; protected final ShortcutBitmapSaver mShortcutBitmapSaver; protected final Object mLock = new Object(); protected final Object mPackageItemLock = new Object(); protected ShortcutPackageItem(@NonNull ShortcutUser shortcutUser, protected ShortcutPackageItem(@NonNull ShortcutUser shortcutUser, int packageUserId, @NonNull String packageName, int packageUserId, @NonNull String packageName, Loading Loading @@ -157,7 +157,7 @@ abstract class ShortcutPackageItem { public abstract void saveToXml(@NonNull TypedXmlSerializer out, boolean forBackup) public abstract void saveToXml(@NonNull TypedXmlSerializer out, boolean forBackup) throws IOException, XmlPullParserException; throws IOException, XmlPullParserException; @GuardedBy("mLock") @GuardedBy("mPackageItemLock") public void saveToFileLocked(File path, boolean forBackup) { public void saveToFileLocked(File path, boolean forBackup) { try (ResilientAtomicFile file = getResilientFile(path)) { try (ResilientAtomicFile file = getResilientFile(path)) { FileOutputStream os = null; FileOutputStream os = null; Loading Loading @@ -187,7 +187,7 @@ abstract class ShortcutPackageItem { } } } } @GuardedBy("mLock") @GuardedBy("mPackageItemLock") void scheduleSaveToAppSearchLocked() { void scheduleSaveToAppSearchLocked() { } } Loading Loading @@ -219,7 +219,7 @@ abstract class ShortcutPackageItem { if (ShortcutService.DEBUG || ShortcutService.DEBUG_REBOOT) { if (ShortcutService.DEBUG || ShortcutService.DEBUG_REBOOT) { Slog.d(TAG, "Saving package item " + getPackageName() + " to " + path); Slog.d(TAG, "Saving package item " + getPackageName() + " to " + path); } } synchronized (mLock) { synchronized (mPackageItemLock) { path.getParentFile().mkdirs(); path.getParentFile().mkdirs(); // TODO: Since we are persisting shortcuts into AppSearch, we should read from/write to // TODO: Since we are persisting shortcuts into AppSearch, we should read from/write to // AppSearch as opposed to maintaining a separate XML file. // AppSearch as opposed to maintaining a separate XML file. Loading @@ -229,14 +229,14 @@ abstract class ShortcutPackageItem { } } public boolean waitForBitmapSaves() { public boolean waitForBitmapSaves() { synchronized (mLock) { synchronized (mPackageItemLock) { return mShortcutBitmapSaver.waitForAllSavesLocked(); return mShortcutBitmapSaver.waitForAllSavesLocked(); } } } } public void saveBitmap(ShortcutInfo shortcut, public void saveBitmap(ShortcutInfo shortcut, int maxDimension, Bitmap.CompressFormat format, int quality) { int maxDimension, Bitmap.CompressFormat format, int quality) { synchronized (mLock) { synchronized (mPackageItemLock) { mShortcutBitmapSaver.saveBitmapLocked(shortcut, maxDimension, format, quality); mShortcutBitmapSaver.saveBitmapLocked(shortcut, maxDimension, format, quality); } } } } Loading @@ -246,19 +246,19 @@ abstract class ShortcutPackageItem { */ */ @Nullable @Nullable public String getBitmapPathMayWait(ShortcutInfo shortcut) { public String getBitmapPathMayWait(ShortcutInfo shortcut) { synchronized (mLock) { synchronized (mPackageItemLock) { return mShortcutBitmapSaver.getBitmapPathMayWaitLocked(shortcut); return mShortcutBitmapSaver.getBitmapPathMayWaitLocked(shortcut); } } } } public void removeIcon(ShortcutInfo shortcut) { public void removeIcon(ShortcutInfo shortcut) { synchronized (mLock) { synchronized (mPackageItemLock) { mShortcutBitmapSaver.removeIcon(shortcut); mShortcutBitmapSaver.removeIcon(shortcut); } } } } void removeShortcutPackageItem() { void removeShortcutPackageItem() { synchronized (mLock) { synchronized (mPackageItemLock) { getResilientFile(getShortcutPackageItemFile()).delete(); getResilientFile(getShortcutPackageItemFile()).delete(); } } } } Loading
services/core/java/com/android/server/pm/ShortcutService.java +106 −106 File changed.Preview size limit exceeded, changes collapsed. Show changes