diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java index f15dcc3108373..a1f12b896d3b6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java @@ -81,6 +81,7 @@ public class HeadsUpAppearanceController extends ViewController mSetExpandedHeight = this::setAppearFraction; private final KeyguardBypassController mBypassController; private final StatusBarStateController mStatusBarStateController; + private final PhoneStatusBarTransitions mPhoneStatusBarTransitions; private final CommandQueue mCommandQueue; private final NotificationWakeUpCoordinator mWakeUpCoordinator; @@ -109,6 +110,7 @@ public class HeadsUpAppearanceController extends ViewController() + private val statusIcons = mock() + private val startIcons = mock() + private val statusBarView = + mock().apply { + whenever(this.context).thenReturn(mContext) + whenever(this.findViewById(R.id.battery)).thenReturn(batteryView) + whenever(this.findViewById(R.id.statusIcons)).thenReturn(statusIcons) + whenever(this.findViewById(R.id.status_bar_start_side_except_heads_up)) + .thenReturn(startIcons) + } + private val backgroundView = mock().apply { whenever(this.context).thenReturn(mContext) } + + private val underTest: PhoneStatusBarTransitions by lazy { + PhoneStatusBarTransitions(statusBarView, backgroundView).also { + // The views' alphas will be set when PhoneStatusBarTransitions is created and we want + // to ignore those in the tests, so clear those verifications here. + reset(batteryView) + reset(statusIcons) + reset(startIcons) + } + } + + @Before + fun setUp() { + context.orCreateTestableResources.addOverride( + R.dimen.status_bar_icon_drawing_alpha, + RESOURCE_ALPHA, + ) + } + + @Test + fun transitionTo_lightsOutMode_batteryTranslucent() { + underTest.transitionTo(/* mode= */ MODE_LIGHTS_OUT, /* animate= */ false) + + val alpha = batteryView.capturedAlpha() + assertThat(alpha).isGreaterThan(0) + assertThat(alpha).isLessThan(1) + } + + @Test + fun transitionTo_lightsOutMode_statusIconsHidden() { + underTest.transitionTo(/* mode= */ MODE_LIGHTS_OUT, /* animate= */ false) + + assertThat(statusIcons.capturedAlpha()).isEqualTo(0) + } + + @Test + fun transitionTo_lightsOutMode_startIconsHidden() { + underTest.transitionTo(/* mode= */ MODE_LIGHTS_OUT, /* animate= */ false) + + assertThat(startIcons.capturedAlpha()).isEqualTo(0) + } + + @Test + fun transitionTo_lightsOutTransparentMode_batteryTranslucent() { + underTest.transitionTo(/* mode= */ MODE_LIGHTS_OUT_TRANSPARENT, /* animate= */ false) + + val alpha = batteryView.capturedAlpha() + assertThat(alpha).isGreaterThan(0) + assertThat(alpha).isLessThan(1) + } + + @Test + fun transitionTo_lightsOutTransparentMode_statusIconsHidden() { + underTest.transitionTo(/* mode= */ MODE_LIGHTS_OUT_TRANSPARENT, /* animate= */ false) + + assertThat(statusIcons.capturedAlpha()).isEqualTo(0) + } + + @Test + fun transitionTo_lightsOutTransparentMode_startIconsHidden() { + underTest.transitionTo(/* mode= */ MODE_LIGHTS_OUT_TRANSPARENT, /* animate= */ false) + + assertThat(startIcons.capturedAlpha()).isEqualTo(0) + } + + @Test + fun transitionTo_translucentMode_batteryIconShown() { + underTest.transitionTo(/* mode= */ MODE_TRANSLUCENT, /* animate= */ false) + + assertThat(batteryView.capturedAlpha()).isEqualTo(1) + } + + @Test + fun transitionTo_semiTransparentMode_statusIconsShown() { + underTest.transitionTo(/* mode= */ MODE_SEMI_TRANSPARENT, /* animate= */ false) + + assertThat(statusIcons.capturedAlpha()).isEqualTo(1) + } + + @Test + fun transitionTo_transparentMode_startIconsShown() { + // Transparent is the default, so we need to switch to a different mode first + underTest.transitionTo(/* mode= */ MODE_OPAQUE, /* animate= */ false) + reset(startIcons) + + underTest.transitionTo(/* mode= */ MODE_TRANSPARENT, /* animate= */ false) + + assertThat(startIcons.capturedAlpha()).isEqualTo(1) + } + + @Test + fun transitionTo_opaqueMode_batteryIconUsesResourceAlpha() { + underTest.transitionTo(/* mode= */ MODE_OPAQUE, /* animate= */ false) + + assertThat(batteryView.capturedAlpha()).isEqualTo(RESOURCE_ALPHA) + } + + @Test + fun transitionTo_opaqueMode_statusIconsUseResourceAlpha() { + underTest.transitionTo(/* mode= */ MODE_OPAQUE, /* animate= */ false) + + assertThat(statusIcons.capturedAlpha()).isEqualTo(RESOURCE_ALPHA) + } + + @Test + fun transitionTo_opaqueMode_startIconsUseResourceAlpha() { + underTest.transitionTo(/* mode= */ MODE_OPAQUE, /* animate= */ false) + + assertThat(startIcons.capturedAlpha()).isEqualTo(RESOURCE_ALPHA) + } + + @Test + fun onHeadsUpStateChanged_true_semiTransparentMode_startIconsShown() { + underTest.transitionTo(/* mode= */ MODE_SEMI_TRANSPARENT, /* animate= */ false) + reset(startIcons) + + underTest.onHeadsUpStateChanged(true) + + assertThat(startIcons.capturedAlpha()).isEqualTo(1) + } + + @Test + fun onHeadsUpStateChanged_true_opaqueMode_startIconsUseResourceAlpha() { + underTest.transitionTo(/* mode= */ MODE_OPAQUE, /* animate= */ false) + reset(startIcons) + + underTest.onHeadsUpStateChanged(true) + + assertThat(startIcons.capturedAlpha()).isEqualTo(RESOURCE_ALPHA) + } + + /** Regression test for b/291173113. */ + @Test + fun onHeadsUpStateChanged_true_lightsOutMode_startIconsUseResourceAlpha() { + underTest.transitionTo(/* mode= */ MODE_LIGHTS_OUT, /* animate= */ false) + reset(startIcons) + + underTest.onHeadsUpStateChanged(true) + + assertThat(startIcons.capturedAlpha()).isEqualTo(RESOURCE_ALPHA) + } + + @Test + fun onHeadsUpStateChanged_false_semiTransparentMode_startIconsShown() { + underTest.transitionTo(/* mode= */ MODE_SEMI_TRANSPARENT, /* animate= */ false) + reset(startIcons) + + underTest.onHeadsUpStateChanged(false) + + assertThat(startIcons.capturedAlpha()).isEqualTo(1) + } + + @Test + fun onHeadsUpStateChanged_false_opaqueMode_startIconsUseResourceAlpha() { + underTest.transitionTo(/* mode= */ MODE_OPAQUE, /* animate= */ false) + reset(startIcons) + + underTest.onHeadsUpStateChanged(false) + + assertThat(startIcons.capturedAlpha()).isEqualTo(RESOURCE_ALPHA) + } + + @Test + fun onHeadsUpStateChanged_false_lightsOutMode_startIconsHidden() { + underTest.transitionTo(/* mode= */ MODE_LIGHTS_OUT, /* animate= */ false) + reset(startIcons) + + underTest.onHeadsUpStateChanged(false) + + assertThat(startIcons.capturedAlpha()).isEqualTo(0) + } + + private fun View.capturedAlpha(): Float { + val captor = argumentCaptor() + verify(this).alpha = captor.capture() + return captor.value + } + + private companion object { + const val RESOURCE_ALPHA = 0.34f + } +}