Fixing shortcut icons are not getting correct color extraction.
> Avoiding color extraction for icons which have already be evaluated > Fixing color extraction from hardware bitmaps Bug: 111343544 Change-Id: I624866e892465684871fbc130003e32945d86460
This commit is contained in:
parent
6478d4f41b
commit
b891eebbb5
|
@ -101,11 +101,11 @@ public class BaseIconFactory implements AutoCloseable {
|
|||
}
|
||||
|
||||
public BitmapInfo createIconBitmap(Bitmap icon) {
|
||||
if (mIconBitmapSize == icon.getWidth() && mIconBitmapSize == icon.getHeight()) {
|
||||
return BitmapInfo.fromBitmap(icon);
|
||||
if (mIconBitmapSize != icon.getWidth() || mIconBitmapSize != icon.getHeight()) {
|
||||
icon = createIconBitmap(new BitmapDrawable(mContext.getResources(), icon), 1f);
|
||||
}
|
||||
return BitmapInfo.fromBitmap(
|
||||
createIconBitmap(new BitmapDrawable(mContext.getResources(), icon), 1f));
|
||||
|
||||
return BitmapInfo.fromBitmap(icon, mDisableColorExtractor ? null : mColorExtractor);
|
||||
}
|
||||
|
||||
public BitmapInfo createBadgedIconBitmap(Drawable icon, UserHandle user,
|
||||
|
|
|
@ -114,7 +114,7 @@ public class LauncherIcons extends BaseIconFactory implements AutoCloseable {
|
|||
}
|
||||
|
||||
public BitmapInfo createShortcutIcon(ShortcutInfoCompat shortcutInfo,
|
||||
boolean badged, @Nullable Provider<Bitmap> fallbackIconProvider) {
|
||||
boolean badged, @Nullable Provider<ItemInfoWithIcon> fallbackIconProvider) {
|
||||
Drawable unbadgedDrawable = DeepShortcutManager.getInstance(mContext)
|
||||
.getShortcutIconDrawable(shortcutInfo, mFillResIconDpi);
|
||||
IconCache cache = LauncherAppState.getInstance(mContext).getIconCache();
|
||||
|
@ -125,9 +125,12 @@ public class LauncherIcons extends BaseIconFactory implements AutoCloseable {
|
|||
} else {
|
||||
if (fallbackIconProvider != null) {
|
||||
// Fallback icons are already badged and with appropriate shadow
|
||||
Bitmap fullIcon = fallbackIconProvider.get();
|
||||
if (fullIcon != null) {
|
||||
return createIconBitmap(fullIcon);
|
||||
ItemInfoWithIcon fullIcon = fallbackIconProvider.get();
|
||||
if (fullIcon != null && fullIcon.iconBitmap != null) {
|
||||
BitmapInfo result = new BitmapInfo();
|
||||
result.icon = fullIcon.iconBitmap;
|
||||
result.color = fullIcon.iconColor;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
unbadgedBitmap = cache.getDefaultIcon(Process.myUserHandle()).icon;
|
||||
|
|
|
@ -165,6 +165,15 @@ public class LoaderCursor extends CursorWrapper {
|
|||
* Loads the icon from the cursor and updates the {@param info} if the icon is an app resource.
|
||||
*/
|
||||
protected boolean loadIcon(ShortcutInfo info) {
|
||||
try (LauncherIcons li = LauncherIcons.obtain(mContext)) {
|
||||
return loadIcon(info, li);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the icon from the cursor and updates the {@param info} if the icon is an app resource.
|
||||
*/
|
||||
protected boolean loadIcon(ShortcutInfo info, LauncherIcons li) {
|
||||
if (itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
|
||||
String packageName = getString(iconPackageIndex);
|
||||
String resourceName = getString(iconResourceIndex);
|
||||
|
@ -172,9 +181,7 @@ public class LoaderCursor extends CursorWrapper {
|
|||
info.iconResource = new ShortcutIconResource();
|
||||
info.iconResource.packageName = packageName;
|
||||
info.iconResource.resourceName = resourceName;
|
||||
LauncherIcons li = LauncherIcons.obtain(mContext);
|
||||
BitmapInfo iconInfo = li.createIconBitmap(info.iconResource);
|
||||
li.recycle();
|
||||
if (iconInfo != null) {
|
||||
info.applyFrom(iconInfo);
|
||||
return true;
|
||||
|
@ -184,11 +191,11 @@ public class LoaderCursor extends CursorWrapper {
|
|||
|
||||
// Failed to load from resource, try loading from DB.
|
||||
byte[] data = getBlob(iconIndex);
|
||||
try (LauncherIcons li = LauncherIcons.obtain(mContext)) {
|
||||
try {
|
||||
info.applyFrom(li.createIconBitmap(BitmapFactory.decodeByteArray(data, 0, data.length)));
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Failed to load icon for info " + info, e);
|
||||
Log.e(TAG, "Failed to decode byte array for info " + info, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,6 +43,7 @@ import android.util.MutableInt;
|
|||
import com.android.launcher3.AllAppsList;
|
||||
import com.android.launcher3.AppInfo;
|
||||
import com.android.launcher3.FolderInfo;
|
||||
import com.android.launcher3.ItemInfoWithIcon;
|
||||
import com.android.launcher3.icons.ComponentWithLabel;
|
||||
import com.android.launcher3.icons.ComponentWithLabel.ComponentCachingLogic;
|
||||
import com.android.launcher3.icons.cache.IconCacheUpdateHandler;
|
||||
|
@ -493,12 +494,12 @@ public class LoaderTask implements Runnable {
|
|||
}
|
||||
info = new ShortcutInfo(pinnedShortcut, context);
|
||||
final ShortcutInfo finalInfo = info;
|
||||
// If the pinned deep shortcut is no longer published,
|
||||
// use the last saved icon instead of the default.
|
||||
Provider<Bitmap> fallbackIconProvider = () ->
|
||||
c.loadIcon(finalInfo) ? finalInfo.iconBitmap : null;
|
||||
|
||||
LauncherIcons li = LauncherIcons.obtain(context);
|
||||
// If the pinned deep shortcut is no longer published,
|
||||
// use the last saved icon instead of the default.
|
||||
Provider<ItemInfoWithIcon> fallbackIconProvider = () ->
|
||||
c.loadIcon(finalInfo, li) ? finalInfo : null;
|
||||
info.applyFrom(li.createShortcutIcon(pinnedShortcut,
|
||||
true /* badged */, fallbackIconProvider));
|
||||
li.recycle();
|
||||
|
|
|
@ -97,7 +97,7 @@ public class ShortcutsChangedTask extends BaseModelUpdateTask {
|
|||
// keep the current icon instead of reverting to the default icon.
|
||||
LauncherIcons li = LauncherIcons.obtain(context);
|
||||
shortcutInfo.applyFrom(li.createShortcutIcon(fullDetails, true,
|
||||
Provider.of(shortcutInfo.iconBitmap)));
|
||||
Provider.of(shortcutInfo)));
|
||||
li.recycle();
|
||||
updatedShortcutInfos.add(shortcutInfo);
|
||||
}
|
||||
|
|
|
@ -95,7 +95,7 @@ public class UserLockStateChangedTask extends BaseModelUpdateTask {
|
|||
// If the shortcut is pinned but no longer has an icon in the system,
|
||||
// keep the current icon instead of reverting to the default icon.
|
||||
LauncherIcons li = LauncherIcons.obtain(context);
|
||||
si.applyFrom(li.createShortcutIcon(shortcut, true, Provider.of(si.iconBitmap)));
|
||||
si.applyFrom(li.createShortcutIcon(shortcut, true, Provider.of(si)));
|
||||
li.recycle();
|
||||
} else {
|
||||
si.runtimeStatusFlags |= FLAG_DISABLED_LOCKED_USER;
|
||||
|
|
Loading…
Reference in New Issue