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

Commit 90884dbc authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[CS] 4/ Small updates to LetterboxAppearanceCalculator APIs.

The next CL will move the status bar mode & appearance calculations
which require some updates to the LetterboxAppearanceCalculator APIs.
This CL makes those API changes so that the next CL is slightly cleaner.

Changes:
 - Use List instead of Array. (Kotlin data classes require List instead
   of Array and the upcoming repo will use data classes)
 - Directly fetch the icon colors instead of getting them from
   LightBarController. (Removing this LightBarController dependency
   means that the next CL won't have a circular dependency)

Bug: 300519002
Test: smoke test of letterboxing effect on status bar icons
Test: dump LetterboxAppearanceCalculator
Test: atest LetterboxAppearanceCalculatorTest
Change-Id: Ifafceabd19de86961693136e26df5314728340ca
parent b14d7c70
Loading
Loading
Loading
Loading
+32 −25
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.phone

import android.annotation.ColorInt
import android.content.Context
import android.graphics.Rect
import android.view.InsetsFlags
import android.view.ViewDebug
@@ -32,17 +33,16 @@ import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewInitializedListener
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent
import java.io.PrintWriter
import java.util.Arrays
import javax.inject.Inject

class LetterboxAppearance(
data class LetterboxAppearance(
    @Appearance val appearance: Int,
    val appearanceRegions: Array<AppearanceRegion>
    val appearanceRegions: List<AppearanceRegion>,
) {
    override fun toString(): String {
        val appearanceString =
                ViewDebug.flagsToString(InsetsFlags::class.java, "appearance", appearance)
        return "LetterboxAppearance{$appearanceString, ${appearanceRegions.contentToString()}}"
        return "LetterboxAppearance{$appearanceString, $appearanceRegions}"
    }
}

@@ -54,11 +54,20 @@ class LetterboxAppearance(
class LetterboxAppearanceCalculator
@Inject
constructor(
    private val lightBarController: LightBarController,
    context: Context,
    dumpManager: DumpManager,
    private val letterboxBackgroundProvider: LetterboxBackgroundProvider,
) : OnStatusBarViewInitializedListener, Dumpable {

    private val darkAppearanceIconColor = context.getColor(
        // For a dark background status bar, use a *light* icon color.
        com.android.settingslib.R.color.light_mode_icon_color_single_tone
    )
    private val lightAppearanceIconColor = context.getColor(
        // For a light background status bar, use a *dark* icon color.
        com.android.settingslib.R.color.dark_mode_icon_color_single_tone
    )

    init {
        dumpManager.registerCriticalDumpable(this)
    }
@@ -66,14 +75,14 @@ constructor(
    private var statusBarBoundsProvider: StatusBarBoundsProvider? = null

    private var lastAppearance: Int? = null
    private var lastAppearanceRegions: Array<AppearanceRegion>? = null
    private var lastLetterboxes: Array<LetterboxDetails>? = null
    private var lastAppearanceRegions: List<AppearanceRegion>? = null
    private var lastLetterboxes: List<LetterboxDetails>? = null
    private var lastLetterboxAppearance: LetterboxAppearance? = null

    fun getLetterboxAppearance(
        @Appearance originalAppearance: Int,
        originalAppearanceRegions: Array<AppearanceRegion>,
        letterboxes: Array<LetterboxDetails>
        originalAppearanceRegions: List<AppearanceRegion>,
        letterboxes: List<LetterboxDetails>
    ): LetterboxAppearance {
        lastAppearance = originalAppearance
        lastAppearanceRegions = originalAppearanceRegions
@@ -84,19 +93,19 @@ constructor(
    }

    private fun getLetterboxAppearanceInternal(
        letterboxes: Array<LetterboxDetails>,
        letterboxes: List<LetterboxDetails>,
        originalAppearance: Int,
        originalAppearanceRegions: Array<AppearanceRegion>
        originalAppearanceRegions: List<AppearanceRegion>
    ): LetterboxAppearance {
        if (isScrimNeeded(letterboxes)) {
            return originalAppearanceWithScrim(originalAppearance, originalAppearanceRegions)
        }
        val appearance = appearanceWithoutScrim(originalAppearance)
        val appearanceRegions = getAppearanceRegions(originalAppearanceRegions, letterboxes)
        return LetterboxAppearance(appearance, appearanceRegions.toTypedArray())
        return LetterboxAppearance(appearance, appearanceRegions)
    }

    private fun isScrimNeeded(letterboxes: Array<LetterboxDetails>): Boolean {
    private fun isScrimNeeded(letterboxes: List<LetterboxDetails>): Boolean {
        if (isOuterLetterboxMultiColored()) {
            return true
        }
@@ -107,16 +116,16 @@ constructor(
    }

    private fun getAppearanceRegions(
        originalAppearanceRegions: Array<AppearanceRegion>,
        letterboxes: Array<LetterboxDetails>
        originalAppearanceRegions: List<AppearanceRegion>,
        letterboxes: List<LetterboxDetails>
    ): List<AppearanceRegion> {
        return sanitizeAppearanceRegions(originalAppearanceRegions, letterboxes) +
            getAllOuterAppearanceRegions(letterboxes)
    }

    private fun sanitizeAppearanceRegions(
        originalAppearanceRegions: Array<AppearanceRegion>,
        letterboxes: Array<LetterboxDetails>
        originalAppearanceRegions: List<AppearanceRegion>,
        letterboxes: List<LetterboxDetails>
    ): List<AppearanceRegion> =
        originalAppearanceRegions.map { appearanceRegion ->
            val matchingLetterbox =
@@ -134,7 +143,7 @@ constructor(

    private fun originalAppearanceWithScrim(
        @Appearance originalAppearance: Int,
        originalAppearanceRegions: Array<AppearanceRegion>
        originalAppearanceRegions: List<AppearanceRegion>
    ): LetterboxAppearance {
        return LetterboxAppearance(
            originalAppearance or APPEARANCE_SEMI_TRANSPARENT_STATUS_BARS,
@@ -146,7 +155,7 @@ constructor(
        originalAppearance and APPEARANCE_SEMI_TRANSPARENT_STATUS_BARS.inv()

    private fun getAllOuterAppearanceRegions(
        letterboxes: Array<LetterboxDetails>
        letterboxes: List<LetterboxDetails>
    ): List<AppearanceRegion> = letterboxes.map(this::getOuterAppearanceRegions).flatten()

    private fun getOuterAppearanceRegions(
@@ -172,11 +181,9 @@ constructor(
    private fun getOuterAppearance(): Int {
        val backgroundColor = outerLetterboxBackgroundColor()
        val darkAppearanceContrast =
            ContrastColorUtil.calculateContrast(
                lightBarController.darkAppearanceIconColor, backgroundColor)
            ContrastColorUtil.calculateContrast(darkAppearanceIconColor, backgroundColor)
        val lightAppearanceContrast =
            ContrastColorUtil.calculateContrast(
                lightBarController.lightAppearanceIconColor, backgroundColor)
            ContrastColorUtil.calculateContrast(lightAppearanceIconColor, backgroundColor)
        return if (lightAppearanceContrast > darkAppearanceContrast) {
            WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
        } else {
@@ -216,8 +223,8 @@ constructor(
        pw.println(
            """
           lastAppearance: ${lastAppearance?.toAppearanceString()}
           lastAppearanceRegion: ${Arrays.toString(lastAppearanceRegions)},
           lastLetterboxes: ${Arrays.toString(lastLetterboxes)},
           lastAppearanceRegion: $lastAppearanceRegions,
           lastLetterboxes: $lastLetterboxes,
           lastLetterboxAppearance: $lastLetterboxAppearance
       """.trimIndent())
    }
+0 −17
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;

import android.annotation.ColorInt;
import android.content.Context;
import android.graphics.Rect;
import android.util.Log;
@@ -70,8 +69,6 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
    private int mStatusBarMode;
    private int mNavigationBarMode;
    private int mNavigationMode;
    private final int mDarkIconColor;
    private final int mLightIconColor;

    /**
     * Whether the navigation bar should be light factoring in already how much alpha the scrim has.
@@ -121,10 +118,6 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
            NavigationModeController navModeController,
            DumpManager dumpManager,
            DisplayTracker displayTracker) {
        mDarkIconColor = ctx.getColor(
                com.android.settingslib.R.color.dark_mode_icon_color_single_tone);
        mLightIconColor = ctx.getColor(
                com.android.settingslib.R.color.light_mode_icon_color_single_tone);
        mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
        mBatteryController = batteryController;
        mBatteryController.addCallback(this);
@@ -137,16 +130,6 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
        }
    }

    @ColorInt
    int getLightAppearanceIconColor() {
        return mDarkIconColor;
    }

    @ColorInt
    int getDarkAppearanceIconColor() {
        return mLightIconColor;
    }

    public void setNavigationBar(LightBarTransitionsController navigationBar) {
        mNavigationBarController = navigationBar;
        updateNavigation();
+5 −2
Original line number Diff line number Diff line
@@ -109,9 +109,12 @@ internal constructor(
        if (shouldUseLetterboxAppearance(letterboxDetails)) {
            val letterboxAppearance =
                letterboxAppearanceCalculator.getLetterboxAppearance(
                    appearance, appearanceRegions, letterboxDetails)
                    appearance, appearanceRegions.toList(), letterboxDetails.toList())
            lastLetterboxAppearance = letterboxAppearance
            Pair(letterboxAppearance.appearance, letterboxAppearance.appearanceRegions)
            Pair(
                letterboxAppearance.appearance,
                letterboxAppearance.appearanceRegions.toTypedArray()
            )
        } else {
            lastLetterboxAppearance = null
            Pair(appearance, appearanceRegions)
+19 −17
Original line number Diff line number Diff line
@@ -47,13 +47,12 @@ class LetterboxAppearanceCalculatorTest : SysuiTestCase() {
        private val TEST_APPEARANCE_REGION_BOUNDS = Rect(0, 0, 20, 100)
        private val TEST_APPEARANCE_REGION =
            AppearanceRegion(TEST_APPEARANCE, TEST_APPEARANCE_REGION_BOUNDS)
        private val TEST_APPEARANCE_REGIONS = arrayOf(TEST_APPEARANCE_REGION)
        private val TEST_APPEARANCE_REGIONS = listOf(TEST_APPEARANCE_REGION)
        private val TEST_WINDOW_BOUNDS = Rect(0, 0, 500, 500)
    }

    @get:Rule var expect = Expect.create()

    @Mock private lateinit var lightBarController: LightBarController
    @Mock private lateinit var statusBarBoundsProvider: StatusBarBoundsProvider
    @Mock private lateinit var statusBarFragmentComponent: StatusBarFragmentComponent
    @Mock private lateinit var dumpManager: DumpManager
@@ -66,8 +65,7 @@ class LetterboxAppearanceCalculatorTest : SysuiTestCase() {
        MockitoAnnotations.initMocks(this)
        whenever(statusBarFragmentComponent.boundsProvider).thenReturn(statusBarBoundsProvider)
        calculator =
            LetterboxAppearanceCalculator(
                lightBarController, dumpManager, letterboxBackgroundProvider)
            LetterboxAppearanceCalculator(context, dumpManager, letterboxBackgroundProvider)
        calculator.onStatusBarViewInitialized(statusBarFragmentComponent)
        whenever(letterboxBackgroundProvider.letterboxBackgroundColor).thenReturn(Color.BLACK)
        whenever(letterboxBackgroundProvider.isLetterboxBackgroundMultiColored).thenReturn(false)
@@ -81,7 +79,7 @@ class LetterboxAppearanceCalculatorTest : SysuiTestCase() {

        val letterboxAppearance =
            calculator.getLetterboxAppearance(
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, arrayOf(letterbox))
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox))

        expect
            .that(letterboxAppearance.appearance)
@@ -97,7 +95,7 @@ class LetterboxAppearanceCalculatorTest : SysuiTestCase() {

        val letterboxAppearance =
            calculator.getLetterboxAppearance(
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, arrayOf(letterbox))
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox))

        expect
            .that(letterboxAppearance.appearance)
@@ -121,7 +119,7 @@ class LetterboxAppearanceCalculatorTest : SysuiTestCase() {
        calculator.getLetterboxAppearance(
                TEST_APPEARANCE,
                TEST_APPEARANCE_REGIONS,
                arrayOf(letterboxWithInnerBounds(letterBoxInnerBounds))
            listOf(letterboxWithInnerBounds(letterBoxInnerBounds))
        )

        expect.that(statusBarStartSideBounds).isEqualTo(statusBarStartSideBoundsCopy)
@@ -138,7 +136,7 @@ class LetterboxAppearanceCalculatorTest : SysuiTestCase() {

        val letterboxAppearance =
            calculator.getLetterboxAppearance(
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, arrayOf(letterbox))
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox))

        expect
                .that(letterboxAppearance.appearance)
@@ -154,7 +152,7 @@ class LetterboxAppearanceCalculatorTest : SysuiTestCase() {

        val letterboxAppearance =
            calculator.getLetterboxAppearance(
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, arrayOf(letterbox))
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox))

        assertThat(letterboxAppearance.appearance).isEqualTo(TEST_APPEARANCE)
    }
@@ -167,7 +165,7 @@ class LetterboxAppearanceCalculatorTest : SysuiTestCase() {

        val letterboxAppearance =
            calculator.getLetterboxAppearance(
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, arrayOf(letterbox))
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox))

        assertThat(letterboxAppearance.appearance).isEqualTo(TEST_APPEARANCE)
    }
@@ -180,7 +178,7 @@ class LetterboxAppearanceCalculatorTest : SysuiTestCase() {

        val letterboxAppearance =
            calculator.getLetterboxAppearance(
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, arrayOf(letterbox))
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox))

        assertThat(letterboxAppearance.appearance).isEqualTo(TEST_APPEARANCE)
    }
@@ -193,7 +191,7 @@ class LetterboxAppearanceCalculatorTest : SysuiTestCase() {

        val letterboxAppearance =
            calculator.getLetterboxAppearance(
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, arrayOf(letterbox))
                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox))

        assertThat(letterboxAppearance.appearance).isEqualTo(TEST_APPEARANCE)
    }
@@ -207,7 +205,7 @@ class LetterboxAppearanceCalculatorTest : SysuiTestCase() {

        val letterboxAppearance =
            calculator.getLetterboxAppearance(
                TEST_APPEARANCE, arrayOf(letterboxRegion), arrayOf(letterbox))
                TEST_APPEARANCE, listOf(letterboxRegion), listOf(letterbox))

        val letterboxAdaptedRegion = letterboxRegion.copy(bounds = letterbox.letterboxInnerBounds)
        assertThat(letterboxAppearance.appearanceRegions.toList()).contains(letterboxAdaptedRegion)
@@ -226,16 +224,20 @@ class LetterboxAppearanceCalculatorTest : SysuiTestCase() {

        val letterboxAppearance =
            calculator.getLetterboxAppearance(
                TEST_APPEARANCE, arrayOf(letterboxRegion), arrayOf(letterbox))
                TEST_APPEARANCE, listOf(letterboxRegion), listOf(letterbox))

        val outerRegions =
            listOf(
                AppearanceRegion(
                    DEFAULT_APPEARANCE, Rect(left = 0, top = 0, right = 25, bottom = 100)),
                    DEFAULT_APPEARANCE,
                    Rect(left = 0, top = 0, right = 25, bottom = 100),
                ),
                AppearanceRegion(
                    DEFAULT_APPEARANCE, Rect(left = 75, top = 0, right = 100, bottom = 100)),
                    DEFAULT_APPEARANCE,
                    Rect(left = 75, top = 0, right = 100, bottom = 100),
                ),
            )
        assertThat(letterboxAppearance.appearanceRegions.toList())
        assertThat(letterboxAppearance.appearanceRegions)
            .containsAtLeastElementsIn(outerRegions)
    }

+3 −3
Original line number Diff line number Diff line
@@ -91,7 +91,7 @@ class SystemBarAttributesListenerTest : SysuiTestCase() {

        verify(lightBarController)
            .onStatusBarAppearanceChanged(
                eq(TEST_LETTERBOX_APPEARANCE.appearanceRegions),
                eq(TEST_LETTERBOX_APPEARANCE.appearanceRegions.toTypedArray()),
                anyBoolean(),
                anyInt(),
                anyBoolean())
@@ -106,7 +106,7 @@ class SystemBarAttributesListenerTest : SysuiTestCase() {

        verify(lightBarController)
            .onStatusBarAppearanceChanged(
                eq(TEST_LETTERBOX_APPEARANCE.appearanceRegions),
                eq(TEST_LETTERBOX_APPEARANCE.appearanceRegions.toTypedArray()),
                anyBoolean(),
                anyInt(),
                anyBoolean())
@@ -178,7 +178,7 @@ class SystemBarAttributesListenerTest : SysuiTestCase() {
                    /* letterboxFullBounds= */ Rect(0, 0, 0, 0),
                    /* appAppearance= */ 0))
        private val TEST_LETTERBOX_APPEARANCE =
            LetterboxAppearance(/* appearance= */ APPEARANCE_LOW_PROFILE_BARS, arrayOf())
            LetterboxAppearance(/* appearance= */ APPEARANCE_LOW_PROFILE_BARS, listOf())
    }
}