Loading iconloaderlib/Android.bp +2 −2 Original line number Diff line number Diff line Loading @@ -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", Loading @@ -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", Loading iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java +2 −9 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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)); } /** Loading iconloaderlib/src/com/android/launcher3/icons/IconProvider.java +52 −28 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; Loading @@ -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) { Loading @@ -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) Loading Loading @@ -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 Loading iconloaderlib/src/com/android/launcher3/icons/cache/BaseIconCache.java +2 −29 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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)); Loading iconloaderlib/src/com/android/launcher3/icons/cache/LauncherActivityCachingLogic.kt +2 −5 Original line number Diff line number Diff line Loading @@ -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." + Loading Loading
iconloaderlib/Android.bp +2 −2 Original line number Diff line number Diff line Loading @@ -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", Loading @@ -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", Loading
iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java +2 −9 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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)); } /** Loading
iconloaderlib/src/com/android/launcher3/icons/IconProvider.java +52 −28 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; Loading @@ -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) { Loading @@ -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) Loading Loading @@ -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 Loading
iconloaderlib/src/com/android/launcher3/icons/cache/BaseIconCache.java +2 −29 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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)); Loading
iconloaderlib/src/com/android/launcher3/icons/cache/LauncherActivityCachingLogic.kt +2 −5 Original line number Diff line number Diff line Loading @@ -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." + Loading