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

Commit 18d04a13 authored by Charlie Anderson's avatar Charlie Anderson
Browse files

Add methods for getting default shape bitmap

Flag: com.android.launcher3.enable_launcher_icon_shapes
Test: restoring in downgrade and upgrade scenarios
Bug: 439974991

Change-Id: I5d76985938a1624b003450790ff6df15e43abf69
parent db8118b6
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -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
@@ -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 =
@@ -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
+7 −0
Original line number Diff line number Diff line
@@ -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 {

+24 −0
Original line number Diff line number Diff line
@@ -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
@@ -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 {