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

Commit 9171f26e authored by Charlie Anderson's avatar Charlie Anderson
Browse files

Do not cache default app icons when returned from PackageManager

Bug: 357441807
Flag: EXEMPT BC-triaged bug
Test: Locally tested reloading Launcher with stale data

Change-Id: Ia971f25c50b8fe188230e7016d3b30e4e5984266
parent 5024f96a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -208,7 +208,7 @@ public class BaseIconFactory implements AutoCloseable {
     * The bitmap is visually normalized with other icons and has enough spacing to add shadow.
     *
     * @param icon source of the icon
     * @return a bitmap suitable for disaplaying as an icon at various system UIs.
     * @return a bitmap suitable for displaying as an icon at various system UIs.
     */
    @TargetApi(Build.VERSION_CODES.TIRAMISU)
    @NonNull
+3 −1
Original line number Diff line number Diff line
@@ -367,7 +367,9 @@ public abstract class BaseIconCache {
        // Icon can't be loaded from cachingLogic, which implies alternative icon was loaded
        // (e.g. fallback icon, default icon). So we drop here since there's no point in caching
        // an empty entry.
        if (entry.bitmap.isNullOrLowRes()) return;
        if (entry.bitmap.isNullOrLowRes() || isDefaultIcon(entry.bitmap, user)) {
            return;
        }

        CharSequence entryTitle = cachingLogic.getLabel(object);
        if (TextUtils.isEmpty(entryTitle)) {
+17 −4
Original line number Diff line number Diff line
@@ -21,11 +21,13 @@ import android.content.Context
import android.content.pm.LauncherActivityInfo
import android.os.Build.VERSION
import android.os.UserHandle
import android.util.Log
import com.android.launcher3.Flags.useNewIconForArchivedApps
import com.android.launcher3.icons.BaseIconFactory.IconOptions
import com.android.launcher3.icons.BitmapInfo

object LauncherActivityCachingLogic : CachingLogic<LauncherActivityInfo> {
    const val TAG = "LauncherActivityCachingLogic"

    override fun getComponent(info: LauncherActivityInfo): ComponentName = info.componentName

@@ -45,10 +47,21 @@ object LauncherActivityCachingLogic : CachingLogic<LauncherActivityInfo> {
            iconOptions.setIsArchived(
                useNewIconForArchivedApps() && VERSION.SDK_INT >= 35 && info.activityInfo.isArchived
            )
            return li.createBadgedIconBitmap(
                cache.iconProvider.getIcon(info, li.fullResIconDpi),
                iconOptions,
            val iconDrawable = cache.iconProvider.getIcon(info, li.fullResIconDpi)
            if (
                VERSION.SDK_INT >= 30 &&
                    context.packageManager.isDefaultApplicationIcon(iconDrawable)
            ) {
                Log.w(
                    TAG,
                    "loadIcon: Default app icon returned from PackageManager." +
                        " component=${info.componentName}, user=${info.user}",
                    Exception(),
                )
                // Make sure this default icon always matches BaseIconCache#getDefaultIcon
                return cache.getDefaultIcon(info.user)
            }
            return li.createBadgedIconBitmap(iconDrawable, iconOptions)
        }
    }
}