Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b891eebb authored by Sunny Goyal's avatar Sunny Goyal
Browse files

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
parent 6478d4f4
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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,
+7 −4
Original line number Diff line number Diff line
@@ -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;
+11 −4
Original line number Diff line number Diff line
@@ -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;
        }
    }
+5 −4
Original line number Diff line number Diff line
@@ -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();
+1 −1
Original line number Diff line number Diff line
@@ -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);
                }
Loading