From 202fabfe10626448b7aa2d349ed3566f0d22550f Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 9 Nov 2018 11:13:10 -0800 Subject: Adding reusable version of IconCache and IconFactory > Adding resource based allowing projects to control cache behavior > Fixing missing comments from ag/5470467 > Adding support for no-immemory cache Bug: 115891474 Change-Id: I691206805430cd93d3be78119bc249cefd79790a --- .../android/launcher3/icons/BaseIconFactory.java | 32 +++++++++++---- .../launcher3/icons/cache/BaseIconCache.java | 46 ++++++++++++++-------- 2 files changed, 53 insertions(+), 25 deletions(-) (limited to 'iconloaderlib/src') diff --git a/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java b/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java index 065a14d5f..a3185741c 100644 --- a/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java +++ b/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java @@ -1,5 +1,10 @@ package com.android.launcher3.icons; +import static android.graphics.Paint.DITHER_FLAG; +import static android.graphics.Paint.FILTER_BITMAP_FLAG; + +import static com.android.launcher3.icons.ShadowGenerator.BLUR_FACTOR; + import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -18,29 +23,26 @@ import android.os.Build; import android.os.Process; import android.os.UserHandle; -import static android.graphics.Paint.DITHER_FLAG; -import static android.graphics.Paint.FILTER_BITMAP_FLAG; -import static com.android.launcher3.icons.ShadowGenerator.BLUR_FACTOR; - /** * This class will be moved to androidx library. There shouldn't be any dependency outside * this package. */ public class BaseIconFactory implements AutoCloseable { + private static final String TAG = "BaseIconFactory"; private static final int DEFAULT_WRAPPER_BACKGROUND = Color.WHITE; static final boolean ATLEAST_OREO = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O; static final boolean ATLEAST_P = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P; private final Rect mOldBounds = new Rect(); - private final Context mContext; + protected final Context mContext; private final Canvas mCanvas; private final PackageManager mPm; private final ColorExtractor mColorExtractor; private boolean mDisableColorExtractor; - private int mFillResIconDpi; - private int mIconBitmapSize; + protected final int mFillResIconDpi; + protected final int mIconBitmapSize; private IconNormalizer mNormalizer; private ShadowGenerator mShadowGenerator; @@ -302,7 +304,21 @@ public class BaseIconFactory implements AutoCloseable { } @Override - public void close() { } + public void close() { + clear(); + } + + public BitmapInfo makeDefaultIcon(UserHandle user) { + return createBadgedIconBitmap(getFullResDefaultActivityIcon(mFillResIconDpi), + user, Build.VERSION.SDK_INT); + } + + public static Drawable getFullResDefaultActivityIcon(int iconDpi) { + return Resources.getSystem().getDrawableForDensity( + Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + ? android.R.drawable.sym_def_app_icon : android.R.mipmap.sym_def_app_icon, + iconDpi); + } /** * An extension of {@link BitmapDrawable} which returns the bitmap pixel size as intrinsic size. diff --git a/iconloaderlib/src/com/android/launcher3/icons/cache/BaseIconCache.java b/iconloaderlib/src/com/android/launcher3/icons/cache/BaseIconCache.java index 2fa4b6883..63820f6d0 100644 --- a/iconloaderlib/src/com/android/launcher3/icons/cache/BaseIconCache.java +++ b/iconloaderlib/src/com/android/launcher3/icons/cache/BaseIconCache.java @@ -15,6 +15,7 @@ */ package com.android.launcher3.icons.cache; +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.setColorAlphaBound; @@ -34,7 +35,6 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.os.Build; -import android.os.Build.VERSION; import android.os.Handler; import android.os.Looper; import android.os.Process; @@ -50,9 +50,13 @@ import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.Provider; import com.android.launcher3.util.SQLiteCacheHelper; +import java.util.AbstractMap; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Locale; +import java.util.Map; +import java.util.Set; import androidx.annotation.NonNull; @@ -76,8 +80,7 @@ public abstract class BaseIconCache { protected final Context mContext; protected final PackageManager mPackageManager; - private final HashMap mCache = - new HashMap<>(INITIAL_ICON_CACHE_CAPACITY); + private final Map mCache; protected final Handler mWorkerHandler; protected int mIconDpi; @@ -89,13 +92,30 @@ public abstract class BaseIconCache { private final Looper mBgLooper; public BaseIconCache(Context context, String dbFileName, Looper bgLooper, - int iconDpi, int iconPixelSize) { + int iconDpi, int iconPixelSize, boolean inMemoryCache) { mContext = context; mDbFileName = dbFileName; mPackageManager = context.getPackageManager(); mBgLooper = bgLooper; mWorkerHandler = new Handler(mBgLooper); + if (inMemoryCache) { + mCache = new HashMap<>(INITIAL_ICON_CACHE_CAPACITY); + } else { + // Use a dummy cache + mCache = new AbstractMap() { + @Override + public Set> entrySet() { + return Collections.emptySet(); + } + + @Override + public CacheEntry put(ComponentKey key, CacheEntry value) { + return value; + } + }; + } + if (BitmapRenderer.USE_HARDWARE_BITMAP && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { mDecodeOptions = new BitmapFactory.Options(); mDecodeOptions.inPreferredConfig = Bitmap.Config.HARDWARE; @@ -137,27 +157,20 @@ public abstract class BaseIconCache { mCache.clear(); } - private Drawable getFullResDefaultActivityIcon() { - return Resources.getSystem().getDrawableForDensity( - Build.VERSION.SDK_INT >= Build.VERSION_CODES.O - ? android.R.drawable.sym_def_app_icon : android.R.mipmap.sym_def_app_icon, - mIconDpi); - } - private Drawable getFullResIcon(Resources resources, int iconId) { if (resources != null && iconId != 0) { try { return resources.getDrawableForDensity(iconId, mIconDpi); } catch (Resources.NotFoundException e) { } } - return getFullResDefaultActivityIcon(); + return getFullResDefaultActivityIcon(mIconDpi); } public Drawable getFullResIcon(String packageName, int iconId) { try { return getFullResIcon(mPackageManager.getResourcesForApplication(packageName), iconId); } catch (PackageManager.NameNotFoundException e) { } - return getFullResDefaultActivityIcon(); + return getFullResDefaultActivityIcon(mIconDpi); } public Drawable getFullResIcon(ActivityInfo info) { @@ -165,13 +178,12 @@ public abstract class BaseIconCache { return getFullResIcon(mPackageManager.getResourcesForApplication(info.applicationInfo), info.getIconResource()); } catch (PackageManager.NameNotFoundException e) { } - return getFullResDefaultActivityIcon(); + return getFullResDefaultActivityIcon(mIconDpi); } - protected BitmapInfo makeDefaultIcon(UserHandle user) { + private BitmapInfo makeDefaultIcon(UserHandle user) { try (BaseIconFactory li = getIconFactory()) { - return li.createBadgedIconBitmap( - getFullResDefaultActivityIcon(), user, VERSION.SDK_INT); + return li.makeDefaultIcon(user); } } -- cgit v1.2.3