Loading iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.kt +9 −3 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.graphics.drawable.InsetDrawable import android.os.UserHandle import android.util.Log import android.util.SparseArray import androidx.annotation.ColorInt import androidx.annotation.IntDef Loading Loading @@ -100,21 +101,22 @@ constructor( IconOptions().setExtractedColor(color), ) fun createIconBitmap(icon: Bitmap): BitmapInfo = fun createIconBitmap(icon: Bitmap, isFullBleed: Boolean): BitmapInfo = if (iconBitmapSize != icon.width || iconBitmapSize != icon.height) createBadgedIconBitmap( BitmapDrawable(context.resources, icon), IconOptions() .setWrapNonAdaptiveIcon(false) .setIconScale(1f) .assumeFullBleedIcon(icon.width == icon.height && !icon.hasAlpha()), .assumeFullBleedIcon(isFullBleed && isIconFullBleed(icon)) .setDrawFullBleed(isFullBleed && isIconFullBleed(icon)) ) else BitmapInfo( icon = icon, color = findDominantColorByHue(icon), defaultIconShape = defaultIconShape, flags = if (icon.hasAlpha()) 0 else BitmapInfo.FLAG_FULL_BLEED, flags = if (isFullBleed && isIconFullBleed(icon)) BitmapInfo.FLAG_FULL_BLEED else 0 ) fun createScaledBitmap(icon: Drawable, @BitmapGenerationMode mode: Int): Bitmap = Loading Loading @@ -244,6 +246,10 @@ constructor( private fun UserHandle.isWorkUser() = NoopDrawable().let { d -> d !== context.packageManager.getUserBadgedIcon(d, this) } private fun isIconFullBleed(icon: Bitmap): Boolean { return icon.height == icon.width && !icon.hasAlpha() } /** * Wraps this drawable in [InsetDrawable] such that the final drawable has square bounds, while * preserving the aspect ratio of the source Loading iconloaderlib/src/com/android/launcher3/icons/BitmapInfo.kt +7 −0 Original line number Diff line number Diff line Loading @@ -176,6 +176,13 @@ data class BitmapInfo( } } /** * Checks for FLAG_FULL_BLEED from factory as well as checking bitmap content to verify. */ fun isFullBleed(): Boolean { return flags.hasMask(FLAG_FULL_BLEED) } /** Interface to be implemented by drawables to customize a BitmapInfo */ interface Extender { Loading iconloaderlib/src/com/android/launcher3/icons/GraphicsUtils.kt +24 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ import android.graphics.ColorMatrixColorFilter import android.graphics.Matrix import android.graphics.Paint import android.graphics.Path import android.graphics.PorterDuff import android.graphics.PorterDuffXfermode import android.graphics.Rect import android.graphics.RectF import android.util.Log Loading Loading @@ -75,6 +77,28 @@ object GraphicsUtils { } } /** Compresses BitmapInfo default shape bitmap to a byte array **/ @JvmStatic fun createDefaultFlatBitmap(bitmapInfo: BitmapInfo): ByteArray { val bitmap = bitmapInfo.icon.copy(Bitmap.Config.ARGB_8888, /* isMutable **/ true) val cropBitmap = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888) val canvas = Canvas(cropBitmap) var paint = Paint(Paint.ANTI_ALIAS_FLAG) paint.color = Color.BLACK paint.style = Paint.Style.FILL canvas.drawPath(bitmapInfo.defaultIconShape.path, paint) paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG) paint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.SRC_IN)) canvas.drawBitmap(bitmap, 0f, 0f, paint) val flatBitmap = flattenBitmap(cropBitmap) cropBitmap.recycle() bitmap.recycle() return flatBitmap } /** Tries to decode the [ByteArray] into a [Bitmap] consuming any parsing errors */ fun ByteArray.parseBitmapSafe(config: Bitmap.Config): Bitmap? = try { Loading Loading
iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.kt +9 −3 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.graphics.drawable.InsetDrawable import android.os.UserHandle import android.util.Log import android.util.SparseArray import androidx.annotation.ColorInt import androidx.annotation.IntDef Loading Loading @@ -100,21 +101,22 @@ constructor( IconOptions().setExtractedColor(color), ) fun createIconBitmap(icon: Bitmap): BitmapInfo = fun createIconBitmap(icon: Bitmap, isFullBleed: Boolean): BitmapInfo = if (iconBitmapSize != icon.width || iconBitmapSize != icon.height) createBadgedIconBitmap( BitmapDrawable(context.resources, icon), IconOptions() .setWrapNonAdaptiveIcon(false) .setIconScale(1f) .assumeFullBleedIcon(icon.width == icon.height && !icon.hasAlpha()), .assumeFullBleedIcon(isFullBleed && isIconFullBleed(icon)) .setDrawFullBleed(isFullBleed && isIconFullBleed(icon)) ) else BitmapInfo( icon = icon, color = findDominantColorByHue(icon), defaultIconShape = defaultIconShape, flags = if (icon.hasAlpha()) 0 else BitmapInfo.FLAG_FULL_BLEED, flags = if (isFullBleed && isIconFullBleed(icon)) BitmapInfo.FLAG_FULL_BLEED else 0 ) fun createScaledBitmap(icon: Drawable, @BitmapGenerationMode mode: Int): Bitmap = Loading Loading @@ -244,6 +246,10 @@ constructor( private fun UserHandle.isWorkUser() = NoopDrawable().let { d -> d !== context.packageManager.getUserBadgedIcon(d, this) } private fun isIconFullBleed(icon: Bitmap): Boolean { return icon.height == icon.width && !icon.hasAlpha() } /** * Wraps this drawable in [InsetDrawable] such that the final drawable has square bounds, while * preserving the aspect ratio of the source Loading
iconloaderlib/src/com/android/launcher3/icons/BitmapInfo.kt +7 −0 Original line number Diff line number Diff line Loading @@ -176,6 +176,13 @@ data class BitmapInfo( } } /** * Checks for FLAG_FULL_BLEED from factory as well as checking bitmap content to verify. */ fun isFullBleed(): Boolean { return flags.hasMask(FLAG_FULL_BLEED) } /** Interface to be implemented by drawables to customize a BitmapInfo */ interface Extender { Loading
iconloaderlib/src/com/android/launcher3/icons/GraphicsUtils.kt +24 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ import android.graphics.ColorMatrixColorFilter import android.graphics.Matrix import android.graphics.Paint import android.graphics.Path import android.graphics.PorterDuff import android.graphics.PorterDuffXfermode import android.graphics.Rect import android.graphics.RectF import android.util.Log Loading Loading @@ -75,6 +77,28 @@ object GraphicsUtils { } } /** Compresses BitmapInfo default shape bitmap to a byte array **/ @JvmStatic fun createDefaultFlatBitmap(bitmapInfo: BitmapInfo): ByteArray { val bitmap = bitmapInfo.icon.copy(Bitmap.Config.ARGB_8888, /* isMutable **/ true) val cropBitmap = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888) val canvas = Canvas(cropBitmap) var paint = Paint(Paint.ANTI_ALIAS_FLAG) paint.color = Color.BLACK paint.style = Paint.Style.FILL canvas.drawPath(bitmapInfo.defaultIconShape.path, paint) paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG) paint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.SRC_IN)) canvas.drawBitmap(bitmap, 0f, 0f, paint) val flatBitmap = flattenBitmap(cropBitmap) cropBitmap.recycle() bitmap.recycle() return flatBitmap } /** Tries to decode the [ByteArray] into a [Bitmap] consuming any parsing errors */ fun ByteArray.parseBitmapSafe(config: Bitmap.Config): Bitmap? = try { Loading