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

Commit 330628ba authored by Ale Nijamkin's avatar Ale Nijamkin Committed by Android (Google) Code Review
Browse files

Merge changes I27452920,Ieeb5ba6d,I75ec4a7a,Ie10fc030,I4d66c629, ... into main

* changes:
  [flexiglass] Fixes PasswordBouncerViewModelTest when flexi is on
  [flexiglass] Fixes SideFpsOverlayViewModel when flexi is on
  [flexiglass] Disable PrimaryBouncerInteractorTest when flexi is on
  [flexiglass] Adds support for showing bouncer in BiometricTestExtensions
  [flexiglass] Disable BackActionInteractor when flexi is on
  [flexiglass] KeyguardSecurityContainerControllerTest when flexi is on
  [flexiglass] Fix ClockEventControllerTest when flexi is on
  [flexiglass] Animate dual shade edu tooltip
  [flexiglass] Hint and tooltip happen at the same time
  [flexiglass] Anchor dual shade tooltips to their elements
parents 327c32a4 3a5aaa90
Loading
Loading
Loading
Loading
+48 −33
Original line number Diff line number Diff line
@@ -18,12 +18,9 @@

package com.android.systemui.scene.ui.composable

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.RichTooltip
import androidx.compose.material3.Text
@@ -32,56 +29,74 @@ import androidx.compose.material3.TooltipDefaults
import androidx.compose.material3.rememberTooltipState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.dp
import com.android.compose.modifiers.height
import com.android.compose.theme.LocalAndroidColorScheme
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.scene.ui.viewmodel.DualShadeEducationalTooltipsViewModel

@Composable
fun DualShadeEducationalTooltips(viewModelFactory: DualShadeEducationalTooltipsViewModel.Factory) {
fun DualShadeEducationalTooltips(
    viewModelFactory: DualShadeEducationalTooltipsViewModel.Factory,
    modifier: Modifier = Modifier,
) {
    val context = LocalContext.current
    val viewModel =
        rememberViewModel(traceName = "DualShadeEducationalTooltips") {
            viewModelFactory.create(context)
        }

    val visibleTooltip = viewModel.visibleTooltip ?: return
    val visibleTooltip = viewModel.visibleTooltip

    val anchorBottomY = visibleTooltip.anchorBottomY
    // This Box represents the bounds of the top edge that the user can swipe down on to reveal
    // either of the dual shade overlays. It's used as a convenient way to position the anchor for
    // each of the tooltips that can be shown. As such, this Box is the same size as the status bar.
    Box(
        contentAlignment =
            if (visibleTooltip.isAlignedToStart) {
                Alignment.CenterStart
            } else {
                Alignment.CenterEnd
            },
        modifier = Modifier.fillMaxWidth().height { anchorBottomY }.padding(horizontal = 24.dp),
    ) {
    Layout(
        content = {
            AnchoredTooltip(
            text = visibleTooltip.text,
            onShown = visibleTooltip.onShown,
            onDismissed = visibleTooltip.onDismissed,
                isVisible = visibleTooltip != null,
                text = visibleTooltip?.text,
                onShown = visibleTooltip?.onShown,
                onDismissed = visibleTooltip?.onDismissed,
            )
        },
        modifier = modifier.fillMaxSize(),
    ) { measurables, constraints ->
        check(measurables.size == 1)
        val placeable =
            measurables[0].measure(
                Constraints.fixed(
                    width = visibleTooltip?.anchorBounds?.width ?: 0,
                    height = visibleTooltip?.anchorBounds?.height ?: 0,
                )
            )
        layout(constraints.maxWidth, constraints.maxHeight) {
            placeable.place(
                x = visibleTooltip?.anchorBounds?.left ?: 0,
                y = visibleTooltip?.anchorBounds?.top ?: 0,
            )
        }
    }
}

@Composable
private fun AnchoredTooltip(
    text: String,
    onShown: () -> Unit,
    onDismissed: () -> Unit,
    isVisible: Boolean,
    text: String?,
    onShown: (() -> Unit)?,
    onDismissed: (() -> Unit)?,
    modifier: Modifier = Modifier,
) {
    val tooltipState = rememberTooltipState(initialIsVisible = true, isPersistent = true)
    val tooltipState = rememberTooltipState(initialIsVisible = false, isPersistent = true)

    LaunchedEffect(Unit) { onShown() }
    LaunchedEffect(isVisible) {
        if (isVisible) {
            tooltipState.show()
            onShown?.invoke()
        } else {
            tooltipState.dismiss()
        }
    }

    TooltipBox(
        positionProvider = TooltipDefaults.rememberTooltipPositionProvider(),
@@ -95,13 +110,13 @@ private fun AnchoredTooltip(
                caretSize = TooltipDefaults.caretSize,
                shadowElevation = 2.dp,
            ) {
                Text(text = text, modifier = Modifier.padding(8.dp))
                Text(text = text ?: "", modifier = Modifier.padding(8.dp))
            }
        },
        state = tooltipState,
        onDismissRequest = onDismissed,
        modifier = modifier,
    ) {
        Spacer(modifier = Modifier.width(48.dp).fillMaxHeight())
        Spacer(modifier = Modifier.fillMaxSize())
    }
}
+40 −4
Original line number Diff line number Diff line
@@ -55,12 +55,15 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.layout.positionInWindow
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.max
@@ -87,6 +90,7 @@ import com.android.systemui.kairos.ExperimentalKairosApi
import com.android.systemui.kairos.buildSpec
import com.android.systemui.privacy.OngoingPrivacyChip
import com.android.systemui.res.R
import com.android.systemui.scene.shared.model.DualShadeEducationElement
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.ui.composable.ShadeHeader.Colors.onScrimDim
import com.android.systemui.shade.ui.composable.ShadeHeader.Dimensions.ChipPaddingHorizontal
@@ -351,7 +355,16 @@ fun ContentScope.OverlayShadeHeaderPartialStateless(
                NotificationsChip(
                    onClick = viewModel::onNotificationIconChipClicked,
                    backgroundColor = chipHighlight.backgroundColor(MaterialTheme.colorScheme),
                    modifier = Modifier.bouncy(isEnabled = viewModel.animateNotificationsChipBounce),
                    modifier =
                        Modifier.bouncy(
                            isEnabled = viewModel.animateNotificationsChipBounce,
                            onBoundsChange = { bounds ->
                                viewModel.onDualShadeEducationElementBoundsChange(
                                    element = DualShadeEducationElement.Notifications,
                                    bounds = bounds,
                                )
                            },
                        ),
                ) {
                    VariableDayDate(
                        longerDateText = viewModel.longerDateText,
@@ -371,7 +384,16 @@ fun ContentScope.OverlayShadeHeaderPartialStateless(
                SystemIconChip(
                    backgroundColor = chipHighlight.backgroundColor(MaterialTheme.colorScheme),
                    onClick = viewModel::onSystemIconChipClicked,
                    modifier = Modifier.bouncy(isEnabled = viewModel.animateSystemIconChipBounce),
                    modifier =
                        Modifier.bouncy(
                            isEnabled = viewModel.animateSystemIconChipBounce,
                            onBoundsChange = { bounds ->
                                viewModel.onDualShadeEducationElementBoundsChange(
                                    element = DualShadeEducationElement.QuickSettings,
                                    bounds = bounds,
                                )
                            },
                        ),
                ) {
                    val paddingEnd =
                        with(LocalDensity.current) {
@@ -803,7 +825,10 @@ private fun ContentScope.PrivacyChip(

/** Modifies the given [Modifier] such that it shows a looping vertical bounce animation. */
@Composable
private fun Modifier.bouncy(isEnabled: Boolean): Modifier {
private fun Modifier.bouncy(
    isEnabled: Boolean,
    onBoundsChange: (bounds: IntRect) -> Unit,
): Modifier {
    val density = LocalDensity.current
    val animatable = remember { Animatable(0f) }
    LaunchedEffect(isEnabled) {
@@ -853,7 +878,18 @@ private fun Modifier.bouncy(isEnabled: Boolean): Modifier {
        }
    }

    return this.offset { IntOffset(x = 0, y = animatable.value.roundToInt()) }
    return this.thenIf(isEnabled) {
        Modifier.offset { IntOffset(x = 0, y = animatable.value.roundToInt()) }
            .onGloballyPositioned { coordinates ->
                val offset = coordinates.positionInWindow()
                onBoundsChange(
                    IntRect(
                        offset = IntOffset(x = offset.x.roundToInt(), y = offset.y.roundToInt()),
                        size = coordinates.size,
                    )
                )
            }
    }
}

private fun shouldUseExpandedFormat(state: TransitionState): Boolean {
+41 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
import com.android.systemui.flags.DisableSceneContainer
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags
@@ -291,6 +292,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun onInitConfiguresViewMode() {
        underTest.onInit()
        verify(view)
@@ -305,11 +307,13 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun setAccessibilityDelegate() {
        verify(view).accessibilityDelegate = eq(faceAuthAccessibilityDelegate)
    }

    @Test
    @DisableSceneContainer
    fun showSecurityScreen_canInflateAllModes() {
        val modes = SecurityMode.values()
        for (mode in modes) {
@@ -324,6 +328,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun onResourcesUpdate_callsThroughOnRotationChange() {
        clearInvocations(view)

@@ -367,6 +372,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun onInterceptTap_inhibitsFalsingInSidedSecurityMode() {
        whenever(view.isTouchOnTheOtherSideOfSecurity(any())).thenReturn(false)
        touchDown()
@@ -377,6 +383,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showSecurityScreen_oneHandedMode_flagDisabled_noOneHandedMode() {
        testableResources.addOverride(R.bool.can_use_one_handed_bouncer, false)
        setupGetSecurityView(SecurityMode.Pattern)
@@ -393,6 +400,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showSecurityScreen_oneHandedMode_flagEnabled_oneHandedMode() {
        testableResources.addOverride(R.bool.can_use_one_handed_bouncer, true)
        setupGetSecurityView(SecurityMode.Pattern)
@@ -408,6 +416,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showSecurityScreen_oneHandedMode_flagEnabled_oneHandedMode_simpin() {
        testableResources.addOverride(R.bool.can_use_one_handed_bouncer, true)
        setupGetSecurityView(SecurityMode.SimPin)
@@ -423,6 +432,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showSecurityScreen_oneHandedMode_flagEnabled_oneHandedMode_simpuk() {
        testableResources.addOverride(R.bool.can_use_one_handed_bouncer, true)
        setupGetSecurityView(SecurityMode.SimPuk)
@@ -438,6 +448,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showSecurityScreen_twoHandedMode_flagEnabled_noOneHandedMode() {
        testableResources.addOverride(R.bool.can_use_one_handed_bouncer, true)
        setupGetSecurityView(SecurityMode.Password)
@@ -453,6 +464,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun addUserSwitcherCallback() {
        val captor = ArgumentCaptor.forClass(UserSwitcherCallback::class.java)
        setupGetSecurityView(SecurityMode.Password)
@@ -469,6 +481,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun addUserSwitchCallback() {
        underTest.onViewAttached()
        verify(userSwitcherController).addUserSwitchCallback(any())
@@ -477,12 +490,14 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun onBouncerVisibilityChanged_resetsScale() {
        underTest.onBouncerVisibilityChanged(false)
        verify(view).resetScale()
    }

    @Test
    @DisableSceneContainer
    fun showNextSecurityScreenOrFinish_DeviceNotSecure() {
        // GIVEN the current security method is SimPin
        whenever(keyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false)
@@ -506,6 +521,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showNextSecurityScreenOrFinish_ignoresCallWhenSecurityMethodHasChanged() {
        // GIVEN current security mode has been set to PIN
        underTest.showSecurityScreen(SecurityMode.PIN)
@@ -525,6 +541,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showNextSecurityScreenOrFinish_SimPin_Swipe() {
        // GIVEN the current security method is SimPin
        whenever(keyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false)
@@ -549,6 +566,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showNextSecurityScreenOrFinish_SimPin_Swipe_userNotSetup() {
        // GIVEN the current security method is SimPin
        whenever(keyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false)
@@ -574,6 +592,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showNextSecurityScreenOrFinish_SimPin_Password() {
        // GIVEN the current security method is SimPin
        whenever(keyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false)
@@ -600,6 +619,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showNextSecurityScreenOrFinish_SimPin_SimPin() {
        // GIVEN the current security method is SimPin
        whenever(keyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false)
@@ -625,6 +645,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showNextSecurityScreenOrFinish_calledWithNoAuthentication_butRequiresSimPin() {
        // GIVEN trust is true (extended unlock)
        whenever(keyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(true)
@@ -641,6 +662,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun onSwipeUp_forwardsItToFaceAuthInteractor() {
        val registeredSwipeListener = registeredSwipeListener
        setupGetSecurityView(SecurityMode.Password)
@@ -650,6 +672,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun onDensityOrFontScaleChanged() {
        val configurationListenerArgumentCaptor =
            ArgumentCaptor.forClass(ConfigurationController.ConfigurationListener::class.java)
@@ -661,6 +684,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun onThemeChanged() {
        val configurationListenerArgumentCaptor =
            ArgumentCaptor.forClass(ConfigurationController.ConfigurationListener::class.java)
@@ -671,6 +695,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun onUiModeChanged() {
        val configurationListenerArgumentCaptor =
            ArgumentCaptor.forClass(ConfigurationController.ConfigurationListener::class.java)
@@ -681,6 +706,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun hasDismissActions() {
        Assert.assertFalse("Action not set yet", underTest.hasDismissActions())
        underTest.setOnDismissAction(mock(), null /* cancelAction */)
@@ -688,6 +714,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun willRunDismissFromKeyguardIsTrue() {
        val action: OnDismissAction = mock()
        whenever(action.willRunAnimationOnKeyguard()).thenReturn(true)
@@ -697,6 +724,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun willRunDismissFromKeyguardIsFalse() {
        val action: OnDismissAction = mock()
        whenever(action.willRunAnimationOnKeyguard()).thenReturn(false)
@@ -706,6 +734,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun willRunDismissFromKeyguardIsFalseWhenNoDismissActionSet() {
        underTest.setOnDismissAction(null /* action */, null /* cancelAction */)
        underTest.finish(0 /* currentUser */)
@@ -713,6 +742,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun onStartingToHide() {
        underTest.onStartingToHide()
        verify(viewFlipperController)
@@ -722,6 +752,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun startAppearAnimation_ifDelayed() {
        val argumentCaptor = ArgumentCaptor.forClass(OnPreDrawListener::class.java)
        whenever(view.isAppearAnimationDelayed).thenReturn(true)
@@ -739,6 +770,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun appearAnimation_willNotStart_ifNotDelayed() {
        whenever(view.isAppearAnimationDelayed).thenReturn(false)
        val viewTreeObserver: ViewTreeObserver = mock()
@@ -753,6 +785,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun gravityReappliedOnConfigurationChange() {
        // Set initial gravity
        testableResources.addOverride(R.integer.keyguard_host_view_gravity, Gravity.CENTER)
@@ -773,6 +806,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun gravityUsesOneHandGravityWhenApplicable() {
        testableResources.addOverride(R.integer.keyguard_host_view_gravity, Gravity.CENTER)
        testableResources.addOverride(
@@ -805,12 +839,14 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun updateKeyguardPositionDelegatesToSecurityContainer() {
        underTest.updateKeyguardPosition(1.0f)
        verify(view).updatePositionByTouchX(1.0f)
    }

    @Test
    @DisableSceneContainer
    fun reinflateViewFlipper() {
        val onViewInflatedCallback = KeyguardSecurityViewFlipperController.OnViewInflatedCallback {}
        underTest.reinflateViewFlipper(onViewInflatedCallback)
@@ -822,6 +858,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun setExpansion_setsAlpha() {
        underTest.setExpansion(KeyguardBouncerConstants.EXPANSION_VISIBLE)
        verify(view).alpha = 1f
@@ -986,6 +1023,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    fun testResetUserSwitcher() {
        val userSwitcher = mock(View::class.java)
        whenever(view.findViewById<View>(R.id.keyguard_bouncer_user_switcher))
@@ -996,6 +1034,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun testOnUserSwitched() {
        val userSwitchCallbackArgumentCaptor =
            argumentCaptor<UserSwitcherController.UserSwitchCallback>()
@@ -1009,6 +1048,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showAlmostAtWipeDialog_calledOnMainUser_setsCorrectUserType() {
        val mainUserId = 10

@@ -1025,6 +1065,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }

    @Test
    @DisableSceneContainer
    fun showAlmostAtWipeDialog_calledOnNonMainUser_setsCorrectUserType() {
        val secondaryUserId = 10
        val mainUserId = 0
+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import androidx.test.filters.SmallTest
import com.android.internal.statusbar.IStatusBarService
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.flags.DisableSceneContainer
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.kosmos.testScope
import com.android.systemui.plugins.statusbar.StatusBarStateController
@@ -73,6 +74,7 @@ import org.mockito.junit.MockitoJUnit

@SmallTest
@RunWith(AndroidJUnit4::class)
@DisableSceneContainer
class BackActionInteractorTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
+13 −2
Original line number Diff line number Diff line
@@ -34,6 +34,9 @@ import com.android.systemui.biometrics.shared.model.AuthenticationReason
import com.android.systemui.bouncer.data.repository.keyguardBouncerRepository
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.res.R
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.util.mockito.whenever
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
@@ -205,8 +208,16 @@ internal fun updatePrimaryBouncer(
    fpsDetectionRunning: Boolean,
    isUnlockingWithFpAllowed: Boolean,
) {
    if (SceneContainerFlag.isEnabled) {
        if (isShowing) {
            kosmos.sceneInteractor.showOverlay(Overlays.Bouncer, "")
        } else {
            kosmos.sceneInteractor.hideOverlay(Overlays.Bouncer, "")
        }
    } else {
        kosmos.keyguardBouncerRepository.setPrimaryShow(isShowing)
        kosmos.keyguardBouncerRepository.setPrimaryStartingToHide(false)
    }
    val primaryStartDisappearAnimation = if (isAnimatingAway) Runnable {} else null
    kosmos.keyguardBouncerRepository.setPrimaryStartDisappearAnimation(
        primaryStartDisappearAnimation
Loading