blob: fa7b2599c108d7f52e7c6adbcc0b4ca4b7ed4bc5 [file] [log] [blame]
package com.android.systemui.statusbar.phone
import android.graphics.Rect
import android.testing.AndroidTestingRunner
import android.view.Display
import android.view.InsetsVisibilities
import android.view.WindowInsetsController
import android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS
import android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
import android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS
import android.view.WindowInsetsController.Appearance
import androidx.test.filters.SmallTest
import com.android.internal.statusbar.LetterboxDetails
import com.android.internal.view.AppearanceRegion
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.statusbar.SysuiStatusBarStateController
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.any
import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.reset
import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyZeroInteractions
import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
@SmallTest
@RunWith(AndroidTestingRunner::class)
class SystemBarAttributesListenerTest : SysuiTestCase() {
@Mock private lateinit var dumpManager: DumpManager
@Mock private lateinit var lightBarController: LightBarController
@Mock private lateinit var statusBarStateController: SysuiStatusBarStateController
@Mock private lateinit var letterboxAppearanceCalculator: LetterboxAppearanceCalculator
@Mock private lateinit var featureFlags: FeatureFlags
@Mock private lateinit var centralSurfaces: CentralSurfaces
private lateinit var sysBarAttrsListener: SystemBarAttributesListener
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
whenever(
letterboxAppearanceCalculator.getLetterboxAppearance(
anyInt(), anyObject(), anyObject()))
.thenReturn(TEST_LETTERBOX_APPEARANCE)
sysBarAttrsListener =
SystemBarAttributesListener(
centralSurfaces,
featureFlags,
letterboxAppearanceCalculator,
statusBarStateController,
lightBarController,
dumpManager)
}
@Test
fun onSysBarAttrsChanged_forwardsAppearanceToCentralSurfaces() {
val appearance = APPEARANCE_LIGHT_STATUS_BARS or APPEARANCE_LIGHT_NAVIGATION_BARS
changeSysBarAttrs(appearance)
verify(centralSurfaces).setAppearance(appearance)
}
@Test
fun onSysBarAttrsChanged_flagTrue_forwardsLetterboxAppearanceToCentralSurfaces() {
whenever(featureFlags.isEnabled(Flags.STATUS_BAR_LETTERBOX_APPEARANCE)).thenReturn(true)
changeSysBarAttrs(TEST_APPEARANCE, TEST_LETTERBOX_DETAILS)
verify(centralSurfaces).setAppearance(TEST_LETTERBOX_APPEARANCE.appearance)
}
@Test
fun onSysBarAttrsChanged_flagTrue_noLetterbox_forwardsOriginalAppearanceToCtrlSrfcs() {
whenever(featureFlags.isEnabled(Flags.STATUS_BAR_LETTERBOX_APPEARANCE)).thenReturn(true)
changeSysBarAttrs(TEST_APPEARANCE, arrayOf<LetterboxDetails>())
verify(centralSurfaces).setAppearance(TEST_APPEARANCE)
}
@Test
fun onSysBarAttrsChanged_forwardsAppearanceToStatusBarStateController() {
changeSysBarAttrs(TEST_APPEARANCE)
verify(statusBarStateController)
.setSystemBarAttributes(eq(TEST_APPEARANCE), anyInt(), any(), any())
}
@Test
fun onSysBarAttrsChanged_flagTrue_forwardsLetterboxAppearanceToStatusBarStateCtrl() {
whenever(featureFlags.isEnabled(Flags.STATUS_BAR_LETTERBOX_APPEARANCE)).thenReturn(true)
changeSysBarAttrs(TEST_APPEARANCE, TEST_LETTERBOX_DETAILS)
verify(statusBarStateController)
.setSystemBarAttributes(
eq(TEST_LETTERBOX_APPEARANCE.appearance), anyInt(), any(), any())
}
@Test
fun onSysBarAttrsChanged_forwardsAppearanceToLightBarController() {
changeSysBarAttrs(TEST_APPEARANCE, TEST_APPEARANCE_REGIONS)
verify(lightBarController)
.onStatusBarAppearanceChanged(
eq(TEST_APPEARANCE_REGIONS), anyBoolean(), anyInt(), anyBoolean())
}
@Test
fun onSysBarAttrsChanged_flagTrue_forwardsLetterboxAppearanceToLightBarController() {
whenever(featureFlags.isEnabled(Flags.STATUS_BAR_LETTERBOX_APPEARANCE)).thenReturn(true)
changeSysBarAttrs(TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, TEST_LETTERBOX_DETAILS)
verify(lightBarController)
.onStatusBarAppearanceChanged(
eq(TEST_LETTERBOX_APPEARANCE.appearanceRegions),
anyBoolean(),
anyInt(),
anyBoolean())
}
@Test
fun onStatusBarBoundsChanged_forwardsLetterboxAppearanceToStatusBarStateController() {
whenever(featureFlags.isEnabled(Flags.STATUS_BAR_LETTERBOX_APPEARANCE)).thenReturn(true)
changeSysBarAttrs(TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, TEST_LETTERBOX_DETAILS)
reset(centralSurfaces, lightBarController, statusBarStateController)
sysBarAttrsListener.onStatusBarBoundsChanged()
verify(statusBarStateController)
.setSystemBarAttributes(
eq(TEST_LETTERBOX_APPEARANCE.appearance), anyInt(), any(), any())
}
@Test
fun onStatusBarBoundsChanged_forwardsLetterboxAppearanceToLightBarController() {
whenever(featureFlags.isEnabled(Flags.STATUS_BAR_LETTERBOX_APPEARANCE)).thenReturn(true)
changeSysBarAttrs(TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, TEST_LETTERBOX_DETAILS)
reset(centralSurfaces, lightBarController, statusBarStateController)
sysBarAttrsListener.onStatusBarBoundsChanged()
verify(lightBarController)
.onStatusBarAppearanceChanged(
eq(TEST_LETTERBOX_APPEARANCE.appearanceRegions),
anyBoolean(),
anyInt(),
anyBoolean())
}
@Test
fun onStatusBarBoundsChanged_forwardsLetterboxAppearanceToCentralSurfaces() {
whenever(featureFlags.isEnabled(Flags.STATUS_BAR_LETTERBOX_APPEARANCE)).thenReturn(true)
changeSysBarAttrs(TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, TEST_LETTERBOX_DETAILS)
reset(centralSurfaces, lightBarController, statusBarStateController)
sysBarAttrsListener.onStatusBarBoundsChanged()
verify(centralSurfaces).setAppearance(TEST_LETTERBOX_APPEARANCE.appearance)
}
@Test
fun onStatusBarBoundsChanged_previousCallEmptyLetterbox_doesNothing() {
whenever(featureFlags.isEnabled(Flags.STATUS_BAR_LETTERBOX_APPEARANCE)).thenReturn(true)
changeSysBarAttrs(TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, arrayOf())
reset(centralSurfaces, lightBarController, statusBarStateController)
sysBarAttrsListener.onStatusBarBoundsChanged()
verifyZeroInteractions(centralSurfaces, lightBarController, statusBarStateController)
}
@Test
fun onStatusBarBoundsChanged_flagFalse_doesNothing() {
whenever(featureFlags.isEnabled(Flags.STATUS_BAR_LETTERBOX_APPEARANCE)).thenReturn(false)
changeSysBarAttrs(TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, TEST_LETTERBOX_DETAILS)
reset(centralSurfaces, lightBarController, statusBarStateController)
sysBarAttrsListener.onStatusBarBoundsChanged()
verifyZeroInteractions(centralSurfaces, lightBarController, statusBarStateController)
}
private fun changeSysBarAttrs(@Appearance appearance: Int) {
changeSysBarAttrs(appearance, arrayOf<LetterboxDetails>())
}
private fun changeSysBarAttrs(
@Appearance appearance: Int,
letterboxDetails: Array<LetterboxDetails>
) {
changeSysBarAttrs(appearance, arrayOf(), letterboxDetails)
}
private fun changeSysBarAttrs(
@Appearance appearance: Int,
appearanceRegions: Array<AppearanceRegion>
) {
changeSysBarAttrs(appearance, appearanceRegions, arrayOf())
}
private fun changeSysBarAttrs(
@Appearance appearance: Int,
appearanceRegions: Array<AppearanceRegion>,
letterboxDetails: Array<LetterboxDetails>
) {
sysBarAttrsListener.onSystemBarAttributesChanged(
Display.DEFAULT_DISPLAY,
appearance,
appearanceRegions,
/* navbarColorManagedByIme= */ false,
WindowInsetsController.BEHAVIOR_DEFAULT,
InsetsVisibilities(),
"package name",
letterboxDetails)
}
companion object {
private const val TEST_APPEARANCE =
APPEARANCE_LIGHT_STATUS_BARS or APPEARANCE_LIGHT_NAVIGATION_BARS
private val TEST_APPEARANCE_REGION = AppearanceRegion(TEST_APPEARANCE, Rect(0, 0, 150, 300))
private val TEST_APPEARANCE_REGIONS = arrayOf(TEST_APPEARANCE_REGION)
private val TEST_LETTERBOX_DETAILS =
arrayOf(
LetterboxDetails(
/* letterboxInnerBounds= */ Rect(0, 0, 0, 0),
/* letterboxFullBounds= */ Rect(0, 0, 0, 0),
/* appAppearance= */ 0))
private val TEST_LETTERBOX_APPEARANCE =
LetterboxAppearance(/* appearance= */ APPEARANCE_LOW_PROFILE_BARS, arrayOf())
}
}
private fun <T> anyObject(): T {
return Mockito.anyObject<T>()
}