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

Commit f284f67f authored by Chris Göllner's avatar Chris Göllner
Browse files

Ensure notification status bar icons scale well on low-density displays

On low-density displays, notification icons appeared too small because
their view's ScaleType was being set to `CENTER_INSIDE`. This scale type
does not scale up drawables that are smaller than their container,
resulting in a small icon centered within a larger, square view.

This CL resolves the issue by changing the ScaleType to `FIT_CENTER`.
This ensures the drawable is correctly scaled up to fit its container
bounds while preserving the aspect ratio.

Test: IconManagerTest
Test: Simulate a low density display with `adb shell wm density 88` and
      `adb shell wm size 1080x1920`
Flag: com.android.systemui.shared.status_bar_connected_displays
Bug: 413620149
Change-Id: If00d1aea7937a1031661821ca46080d5bd8a19b2
parent 878b1320
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ constructor(
            StatusBarConnectedDisplays.unsafeAssertInNewMode()

            val sbIcon = iconBuilder.createIconView(entry, context)
            sbIcon.scaleType = ImageView.ScaleType.CENTER_INSIDE
            sbIcon.scaleType = ImageView.ScaleType.FIT_CENTER
            val (normalIconDescriptor, _) = getIconDescriptors(entry)
            setIcon(entry, normalIconDescriptor, sbIcon)
            return sbIcon
@@ -162,7 +162,12 @@ constructor(
        traceSection("IconManager.createIcons") {
            // Construct the status bar icon view.
            val sbIcon = iconBuilder.createIconView(entry)
            sbIcon.scaleType = ImageView.ScaleType.CENTER_INSIDE
            sbIcon.scaleType =
                if (StatusBarConnectedDisplays.isEnabled) {
                    ImageView.ScaleType.FIT_CENTER
                } else {
                    ImageView.ScaleType.CENTER_INSIDE
                }
            val sbChipIcon: StatusBarIconView?
            if (!StatusBarConnectedDisplays.isEnabled) {
                sbChipIcon = iconBuilder.createIconView(entry)
@@ -288,7 +293,12 @@ constructor(
        traceSection("IconManager.createIcons") {
            // Construct the status bar icon view.
            val sbIcon = iconBuilder.createIconView(entry)
            sbIcon.scaleType = ImageView.ScaleType.CENTER_INSIDE
            sbIcon.scaleType =
                if (StatusBarConnectedDisplays.isEnabled) {
                    ImageView.ScaleType.FIT_CENTER
                } else {
                    ImageView.ScaleType.CENTER_INSIDE
                }
            val sbChipIcon: StatusBarIconView?
            if (!StatusBarConnectedDisplays.isEnabled) {
                sbChipIcon = iconBuilder.createIconView(entry)
+47 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ import android.os.SystemClock
import android.os.UserHandle
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.widget.ImageView.ScaleType.CENTER_INSIDE
import android.widget.ImageView.ScaleType.FIT_CENTER
import androidx.test.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -279,6 +281,51 @@ class IconManagerTest : SysuiTestCase() {
        assertThat(entry?.icons?.shelfIcon?.sourceIcon).isEqualTo(shortcutIc)
    }

    @Test
    @EnableFlags(StatusBarConnectedDisplays.FLAG_NAME)
    fun testCreateIcons_cdFlagEnabled_scaleTypeIsFitCenter() {
        val entry =
            notificationEntry(
                hasShortcut = false,
                hasMessageSenderIcon = false,
                hasLargeIcon = false,
            )

        iconManager.createIcons(entry!!)

        assertThat(entry.icons.statusBarIcon!!.scaleType).isEqualTo(FIT_CENTER)
    }

    @Test
    @DisableFlags(StatusBarConnectedDisplays.FLAG_NAME)
    fun testCreateIcons_cdFlagDisabled_scaleTypeIsCenterInside() {
        val entry =
            notificationEntry(
                hasShortcut = false,
                hasMessageSenderIcon = false,
                hasLargeIcon = false,
            )

        iconManager.createIcons(entry!!)

        assertThat(entry.icons.statusBarIcon!!.scaleType).isEqualTo(CENTER_INSIDE)
    }

    @Test
    @EnableFlags(StatusBarConnectedDisplays.FLAG_NAME)
    fun testCreateSbIconView_cdFlagEnabled_scaleTypeIsFitCenter() {
        val entry =
            notificationEntry(
                hasShortcut = false,
                hasMessageSenderIcon = false,
                hasLargeIcon = false,
            )

        val sbIconView = iconManager.createSbIconView(context, entry!!)

        assertThat(sbIconView.scaleType).isEqualTo(FIT_CENTER)
    }

    private fun notificationEntry(
        hasShortcut: Boolean,
        hasMessageSenderIcon: Boolean,