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

Commit 96bdbeeb authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Media color extraction rules

New color extraction logic that always guarantees light text and
a darker, more desaturated background.

Test: visual
Fixes: 156387556
Change-Id: Iee440308d109d01c7f4dfb66d6798aa50bb8f4ca
parent b16d28f2
Loading
Loading
Loading
Loading
+22 −10
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import android.content.ContentResolver
import android.content.Context
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.ImageDecoder
import android.graphics.ImageDecoder
import android.graphics.drawable.Drawable
import android.graphics.drawable.Drawable
import android.graphics.drawable.Icon
import android.graphics.drawable.Icon
@@ -30,7 +31,7 @@ import android.net.Uri
import android.service.notification.StatusBarNotification
import android.service.notification.StatusBarNotification
import android.text.TextUtils
import android.text.TextUtils
import android.util.Log
import android.util.Log
import com.android.internal.util.ContrastColorUtil
import com.android.internal.graphics.ColorUtils
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.notification.MediaNotificationProcessor
import com.android.systemui.statusbar.notification.MediaNotificationProcessor
@@ -40,7 +41,6 @@ import java.io.IOException
import java.util.concurrent.Executor
import java.util.concurrent.Executor
import javax.inject.Inject
import javax.inject.Inject
import javax.inject.Singleton
import javax.inject.Singleton
import kotlin.collections.LinkedHashMap


// URI fields to try loading album art from
// URI fields to try loading album art from
private val ART_URIS = arrayOf(
private val ART_URIS = arrayOf(
@@ -50,6 +50,9 @@ private val ART_URIS = arrayOf(
)
)


private const val TAG = "MediaDataManager"
private const val TAG = "MediaDataManager"
private const val DEFAULT_LUMINOSITY = 0.25f
private const val LUMINOSITY_THRESHOLD = 0.05f
private const val SATURATION_MULTIPLIER = 0.8f


private val LOADING = MediaData(false, 0, 0, null, null, null, null, null,
private val LOADING = MediaData(false, 0, 0, null, null, null, null, null,
        emptyList(), emptyList(), null, null, null)
        emptyList(), emptyList(), null, null, null)
@@ -107,8 +110,8 @@ class MediaDataManager @Inject constructor(


        // Foreground and Background colors computed from album art
        // Foreground and Background colors computed from album art
        val notif: Notification = sbn.notification
        val notif: Notification = sbn.notification
        var fgColor = notif.color
        val fgColor = Color.WHITE
        var bgColor = -1
        var bgColor = Color.WHITE
        var artworkBitmap = metadata.getBitmap(MediaMetadata.METADATA_KEY_ART)
        var artworkBitmap = metadata.getBitmap(MediaMetadata.METADATA_KEY_ART)
        if (artworkBitmap == null) {
        if (artworkBitmap == null) {
            artworkBitmap = metadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART)
            artworkBitmap = metadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART)
@@ -142,13 +145,22 @@ class MediaDataManager @Inject constructor(
                    .generate()
                    .generate()
            val swatch = MediaNotificationProcessor.findBackgroundSwatch(p)
            val swatch = MediaNotificationProcessor.findBackgroundSwatch(p)
            bgColor = swatch.rgb
            bgColor = swatch.rgb
            fgColor = MediaNotificationProcessor.selectForegroundColor(bgColor, p)
        }
        }
        // Make sure colors will be legible
        // Adapt background color, so it's always subdued and text is legible
        val isDark = !ContrastColorUtil.isColorLight(bgColor)
        val tmpHsl = floatArrayOf(0f, 0f, 0f)
        fgColor = ContrastColorUtil.resolveContrastColor(context, fgColor, bgColor,
        ColorUtils.colorToHSL(bgColor, tmpHsl)
                isDark)

        fgColor = ContrastColorUtil.ensureTextContrast(fgColor, bgColor, isDark)
        val l = tmpHsl[2]
        // Colors with very low luminosity can have any saturation. This means that changing the
        // luminosity can make a black become red. Let's remove the saturation of very light or
        // very dark colors to avoid this issue.
        if (l < LUMINOSITY_THRESHOLD || l > 1f - LUMINOSITY_THRESHOLD) {
            tmpHsl[1] = 0f
        }
        tmpHsl[1] *= SATURATION_MULTIPLIER
        tmpHsl[2] = DEFAULT_LUMINOSITY

        bgColor = ColorUtils.HSLToColor(tmpHsl)


        // App name
        // App name
        val builder = Notification.Builder.recoverBuilder(context, notif)
        val builder = Notification.Builder.recoverBuilder(context, notif)