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

Commit 9ff30d93 authored by Charlie Anderson's avatar Charlie Anderson Committed by Android (Google) Code Review
Browse files

Merge "Add methods for getting default shape bitmap" into main

parents d52ec29a 18d04a13
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 {