diff options
Diffstat (limited to 'src/com/android/launcher3/IconCache.java')
-rw-r--r-- | src/com/android/launcher3/IconCache.java | 74 |
1 files changed, 35 insertions, 39 deletions
diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 5c86b6b33..661f99b9e 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -47,6 +47,7 @@ import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.SQLiteCacheHelper; @@ -187,7 +188,7 @@ public class IconCache { private Bitmap makeDefaultIcon(UserHandleCompat user) { Drawable unbadged = getFullResDefaultActivityIcon(); - return Utilities.createBadgedIconBitmap(unbadged, user, mContext); + return LauncherIcons.createBadgedIconBitmap(unbadged, user, mContext); } /** @@ -223,7 +224,7 @@ public class IconCache { PackageManager.GET_UNINSTALLED_PACKAGES); long userSerial = mUserManager.getSerialNumberForUser(user); for (LauncherActivityInfoCompat app : mLauncherApps.getActivityList(packageName, user)) { - addIconToDBAndMemCache(app, info, userSerial); + addIconToDBAndMemCache(app, info, userSerial, false /*replace existing*/); } } catch (NameNotFoundException e) { Log.d(TAG, "Package not found", e); @@ -353,29 +354,14 @@ public class IconCache { } } - @Thunk void addIconToDBAndMemCache(LauncherActivityInfoCompat app, PackageInfo info, - long userSerial) { - // Reuse the existing entry if it already exists in the DB. This ensures that we do not - // create bitmap if it was already created during loader. - ContentValues values = updateCacheAndGetContentValues(app, false); - addIconToDB(values, app.getComponentName(), info, userSerial); - } - /** - * Updates {@param values} to contain versoning information and adds it to the DB. - * @param values {@link ContentValues} containing icon & title + * Adds an entry into the DB and the in-memory cache. + * @param replaceExisting if true, it will recreate the bitmap even if it already exists in + * the memory. This is useful then the previous bitmap was created using + * old data. */ - private void addIconToDB(ContentValues values, ComponentName key, - PackageInfo info, long userSerial) { - values.put(IconDB.COLUMN_COMPONENT, key.flattenToString()); - values.put(IconDB.COLUMN_USER, userSerial); - values.put(IconDB.COLUMN_LAST_UPDATED, info.lastUpdateTime); - values.put(IconDB.COLUMN_VERSION, info.versionCode); - mIconDb.insertOrReplace(values); - } - - @Thunk ContentValues updateCacheAndGetContentValues(LauncherActivityInfoCompat app, - boolean replaceExisting) { + @Thunk synchronized void addIconToDBAndMemCache(LauncherActivityInfoCompat app, + PackageInfo info, long userSerial, boolean replaceExisting) { final ComponentKey key = new ComponentKey(app.getComponentName(), app.getUser()); CacheEntry entry = null; if (!replaceExisting) { @@ -387,17 +373,31 @@ public class IconCache { } if (entry == null) { entry = new CacheEntry(); - entry.icon = Utilities.createBadgedIconBitmap( + entry.icon = LauncherIcons.createBadgedIconBitmap( mIconProvider.getIcon(app, mIconDpi), app.getUser(), mContext); } entry.title = app.getLabel(); entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, app.getUser()); - mCache.put(new ComponentKey(app.getComponentName(), app.getUser()), entry); + mCache.put(key, entry); Bitmap lowResIcon = generateLowResIcon(entry.icon, mActivityBgColor); - return newContentValues(entry.icon, lowResIcon, entry.title.toString(), + ContentValues values = newContentValues(entry.icon, lowResIcon, entry.title.toString(), app.getApplicationInfo().packageName); + addIconToDB(values, app.getComponentName(), info, userSerial); + } + + /** + * Updates {@param values} to contain versioning information and adds it to the DB. + * @param values {@link ContentValues} containing icon & title + */ + private void addIconToDB(ContentValues values, ComponentName key, + PackageInfo info, long userSerial) { + values.put(IconDB.COLUMN_COMPONENT, key.flattenToString()); + values.put(IconDB.COLUMN_USER, userSerial); + values.put(IconDB.COLUMN_LAST_UPDATED, info.lastUpdateTime); + values.put(IconDB.COLUMN_VERSION, info.versionCode); + mIconDb.insertOrReplace(values); } /** @@ -555,7 +555,7 @@ public class IconCache { // Check the DB first. if (!getEntryFromDB(cacheKey, entry, useLowResIcon) || DEBUG_IGNORE_CACHE) { if (info != null) { - entry.icon = Utilities.createBadgedIconBitmap( + entry.icon = LauncherIcons.createBadgedIconBitmap( mIconProvider.getIcon(info, mIconDpi), info.getUser(), mContext); } else { @@ -606,7 +606,7 @@ public class IconCache { entry.title = title; } if (icon != null) { - entry.icon = Utilities.createIconBitmap(icon, mContext); + entry.icon = LauncherIcons.createIconBitmap(icon, mContext); } } @@ -641,7 +641,7 @@ public class IconCache { // Load the full res icon for the application, but if useLowResIcon is set, then // only keep the low resolution icon instead of the larger full-sized icon - Bitmap icon = Utilities.createBadgedIconBitmap( + Bitmap icon = LauncherIcons.createBadgedIconBitmap( appInfo.loadIcon(mPackageManager), user, mContext); Bitmap lowResIcon = generateLowResIcon(icon, mPackageBgColor); entry.title = appInfo.loadLabel(mPackageManager); @@ -774,13 +774,9 @@ public class IconCache { LauncherActivityInfoCompat app = mAppsToUpdate.pop(); String pkg = app.getComponentName().getPackageName(); PackageInfo info = mPkgInfoMap.get(pkg); - if (info != null) { - synchronized (IconCache.this) { - ContentValues values = updateCacheAndGetContentValues(app, true); - addIconToDB(values, app.getComponentName(), info, mUserSerial); - } - mUpdatedPackages.add(pkg); - } + addIconToDBAndMemCache(app, info, mUserSerial, true /*replace existing*/); + mUpdatedPackages.add(pkg); + if (mAppsToUpdate.isEmpty() && !mUpdatedPackages.isEmpty()) { // No more app to update. Notify model. LauncherAppState.getInstance().getModel().onPackageIconsUpdated( @@ -792,10 +788,10 @@ public class IconCache { } else if (!mAppsToAdd.isEmpty()) { LauncherActivityInfoCompat app = mAppsToAdd.pop(); PackageInfo info = mPkgInfoMap.get(app.getComponentName().getPackageName()); + // We do not check the mPkgInfoMap when generating the mAppsToAdd. Although every + // app should have package info, this is not guaranteed by the api if (info != null) { - synchronized (IconCache.this) { - addIconToDBAndMemCache(app, info, mUserSerial); - } + addIconToDBAndMemCache(app, info, mUserSerial, false /*replace existing*/); } if (!mAppsToAdd.isEmpty()) { |