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

Commit 800d39ee authored by Sunny Goyal's avatar Sunny Goyal Committed by Android (Google) Code Review
Browse files

Merge "Updating IconProvider API to use a single API to load icons" into main

parents 0200754b ecb6e17d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ package {
android_library {
    name: "iconloader_base",
    sdk_version: "current",
    min_sdk_version: "26",
    min_sdk_version: "31",
    static_libs: [
        "androidx.core_core",
        "com_android_launcher3_flags_lib",
@@ -36,7 +36,7 @@ android_library {
android_library {
    name: "iconloader",
    sdk_version: "system_current",
    min_sdk_version: "26",
    min_sdk_version: "31",
    static_libs: [
        "androidx.core_core",
        "com_android_launcher3_flags_lib",
+2 −9
Original line number Diff line number Diff line
@@ -43,7 +43,6 @@ import com.android.launcher3.util.FlagOp;
import com.android.launcher3.util.UserIconInfo;

import java.lang.annotation.Retention;
import java.util.Objects;

/**
 * This class will be moved to androidx library. There shouldn't be any dependency outside
@@ -488,14 +487,8 @@ public class BaseIconFactory implements AutoCloseable {
    }

    @NonNull
    public BitmapInfo makeDefaultIcon() {
        return createBadgedIconBitmap(getFullResDefaultActivityIcon(mFullResIconDpi));
    }

    @NonNull
    public static Drawable getFullResDefaultActivityIcon(final int iconDpi) {
        return Objects.requireNonNull(Resources.getSystem().getDrawableForDensity(
                android.R.drawable.sym_def_app_icon, iconDpi));
    public BitmapInfo makeDefaultIcon(IconProvider iconProvider) {
        return createBadgedIconBitmap(iconProvider.getFullResDefaultActivityIcon(mFullResIconDpi));
    }

    /**
+52 −28
Original line number Diff line number Diff line
@@ -28,8 +28,9 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.LauncherActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
@@ -47,13 +48,14 @@ import android.os.UserManager;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.os.BuildCompat;

import com.android.launcher3.util.SafeCloseable;

import java.util.Calendar;
import java.util.function.Supplier;
import java.util.Objects;

/**
 * Class to handle icon loading from different packages
@@ -95,31 +97,35 @@ public class IconProvider {
    }

    /**
     * Loads the icon for the provided LauncherActivityInfo
     * Loads the icon for the provided activity info
     */
    public Drawable getIcon(LauncherActivityInfo info, int iconDpi) {
        return getIconWithOverrides(info.getApplicationInfo().packageName, iconDpi,
                () -> info.getIcon(iconDpi));
    public Drawable getIcon(ComponentInfo info) {
        return getIcon(info, mContext.getResources().getConfiguration().densityDpi);
    }

    /**
     * Loads the icon for the provided activity info
     * Loads the icon for the provided component info
     */
    public Drawable getIcon(ActivityInfo info) {
    public Drawable getIcon(ComponentInfo info, int iconDpi) {
        return getIcon(info, info.applicationInfo, iconDpi);
    }

    /**
     * Loads the icon for the provided application info
     */
    public Drawable getIcon(ApplicationInfo info) {
        return getIcon(info, mContext.getResources().getConfiguration().densityDpi);
    }

    /**
     * Loads the icon for the provided activity info
     * Loads the icon for the provided application info
     */
    public Drawable getIcon(ActivityInfo info, int iconDpi) {
        return getIconWithOverrides(info.applicationInfo.packageName, iconDpi,
                () -> loadActivityInfoIcon(info, iconDpi));
    public Drawable getIcon(ApplicationInfo info, int iconDpi) {
        return getIcon(info, info, iconDpi);
    }

    @TargetApi(Build.VERSION_CODES.TIRAMISU)
    private Drawable getIconWithOverrides(String packageName, int iconDpi,
            Supplier<Drawable> fallback) {
    private Drawable getIcon(PackageItemInfo info, ApplicationInfo appInfo, int iconDpi) {
        String packageName = info.packageName;
        ThemeData td = getThemeDataForPackage(packageName);

        Drawable icon = null;
@@ -129,7 +135,7 @@ public class IconProvider {
            icon = ClockDrawableWrapper.forPackage(mContext, mClock.getPackageName(), iconDpi, td);
        }
        if (icon == null) {
            icon = fallback.get();
            icon = loadPackageIcon(info, appInfo, iconDpi);
            if (ATLEAST_T && icon instanceof AdaptiveIconDrawable && td != null) {
                AdaptiveIconDrawable aid = (AdaptiveIconDrawable) icon;
                if  (aid.getMonochrome() == null) {
@@ -145,22 +151,31 @@ public class IconProvider {
        return null;
    }

    private Drawable loadActivityInfoIcon(ActivityInfo ai, int density) {
        final int iconRes = ai.getIconResource();
    private Drawable loadPackageIcon(PackageItemInfo info, ApplicationInfo appInfo, int density) {
        Drawable icon = null;
        // Get the preferred density icon from the app's resources
        if (density != 0 && iconRes != 0) {
        if (BuildCompat.isAtLeastV() && info.isArchived) {
            // Icons for archived apps com from system service, let the default impl handle that
            icon = info.loadIcon(mContext.getPackageManager());
        }
        if (icon == null && density != 0 && (info.icon != 0 || appInfo.icon != 0)) {
            try {
                final Resources resources = mContext.getPackageManager()
                        .getResourcesForApplication(ai.applicationInfo);
                icon = resources.getDrawableForDensity(iconRes, density);
            } catch (NameNotFoundException | Resources.NotFoundException exc) { }
                        .getResourcesForApplication(appInfo);
                // Try to load the package item icon first
                if (info.icon != 0) {
                    try {
                        icon = resources.getDrawableForDensity(info.icon, density);
                    } catch (Resources.NotFoundException exc) { }
                }
        // Get the default density icon
        if (icon == null) {
            icon = ai.loadIcon(mContext.getPackageManager());
                if (icon == null && appInfo.icon != 0) {
                    // Load the fallback app icon
                    try {
                        icon = resources.getDrawableForDensity(appInfo.icon, density);
                    } catch (Resources.NotFoundException exc) { }
                }
        return icon;
            } catch (NameNotFoundException | Resources.NotFoundException exc) { }
        }
        return icon != null ? icon : getFullResDefaultActivityIcon(density);
    }

    @TargetApi(Build.VERSION_CODES.TIRAMISU)
@@ -201,6 +216,15 @@ public class IconProvider {
        return null;
    }

    /**
     * Returns the default activity icon
     */
    @NonNull
    public Drawable getFullResDefaultActivityIcon(final int iconDpi) {
        return Objects.requireNonNull(Resources.getSystem().getDrawableForDensity(
                android.R.drawable.sym_def_app_icon, iconDpi));
    }

    /**
     * @param metadata metadata of the default activity of Calendar
     * @param resources from the Calendar package
+2 −29
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@ package com.android.launcher3.icons.cache;

import static android.graphics.BitmapFactory.decodeByteArray;

import static com.android.launcher3.icons.BaseIconFactory.getFullResDefaultActivityIcon;
import static com.android.launcher3.icons.BitmapInfo.LOW_RES_ICON;
import static com.android.launcher3.icons.GraphicsUtils.flattenBitmap;
import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound;
@@ -32,7 +31,6 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
@@ -249,34 +247,9 @@ public abstract class BaseIconCache {
        }
    }

    @Nullable
    private Drawable getFullResIcon(@Nullable final Resources resources, final int iconId) {
        if (resources != null && iconId != 0) {
            try {
                return resources.getDrawableForDensity(iconId, mIconDpi);
            } catch (Resources.NotFoundException e) {
            }
        }
        return getFullResDefaultActivityIcon(mIconDpi);
    }

    @Nullable
    public Drawable getFullResIcon(@NonNull final String packageName, final int iconId) {
        try {
            return getFullResIcon(mPackageManager.getResourcesForApplication(packageName), iconId);
        } catch (PackageManager.NameNotFoundException e) {
        }
        return getFullResDefaultActivityIcon(mIconDpi);
    }

    @Nullable
    public Drawable getFullResIcon(@NonNull final ActivityInfo info) {
        try {
            return getFullResIcon(mPackageManager.getResourcesForApplication(info.applicationInfo),
                    info.getIconResource());
        } catch (PackageManager.NameNotFoundException e) {
        }
        return getFullResDefaultActivityIcon(mIconDpi);
        return mIconProvider.getIcon(info, mIconDpi);
    }

    public void setIconUpdateInProgress(boolean updating) {
@@ -436,7 +409,7 @@ public abstract class BaseIconCache {
    public synchronized BitmapInfo getDefaultIcon(@NonNull final UserHandle user) {
        if (mDefaultIcon == null) {
            try (BaseIconFactory li = getIconFactory()) {
                mDefaultIcon = li.makeDefaultIcon();
                mDefaultIcon = li.makeDefaultIcon(mIconProvider);
            }
        }
        return mDefaultIcon.withFlags(getUserFlagOpLocked(user));
+2 −5
Original line number Diff line number Diff line
@@ -47,11 +47,8 @@ object LauncherActivityCachingLogic : CachingLogic<LauncherActivityInfo> {
            iconOptions.setIsArchived(
                useNewIconForArchivedApps() && VERSION.SDK_INT >= 35 && info.activityInfo.isArchived
            )
            val iconDrawable = cache.iconProvider.getIcon(info, li.fullResIconDpi)
            if (
                VERSION.SDK_INT >= 30 &&
                    context.packageManager.isDefaultApplicationIcon(iconDrawable)
            ) {
            val iconDrawable = cache.iconProvider.getIcon(info.activityInfo, li.fullResIconDpi)
            if (context.packageManager.isDefaultApplicationIcon(iconDrawable)) {
                Log.w(
                    TAG,
                    "loadIcon: Default app icon returned from PackageManager." +