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 Original line Diff line number Diff line
@@ -18,12 +18,9 @@


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


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


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


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


    val anchorBottomY = visibleTooltip.anchorBottomY
    Layout(
    // This Box represents the bounds of the top edge that the user can swipe down on to reveal
        content = {
    // 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),
    ) {
            AnchoredTooltip(
            AnchoredTooltip(
            text = visibleTooltip.text,
                isVisible = visibleTooltip != null,
            onShown = visibleTooltip.onShown,
                text = visibleTooltip?.text,
            onDismissed = visibleTooltip.onDismissed,
                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
@Composable
private fun AnchoredTooltip(
private fun AnchoredTooltip(
    text: String,
    isVisible: Boolean,
    onShown: () -> Unit,
    text: String?,
    onDismissed: () -> Unit,
    onShown: (() -> Unit)?,
    onDismissed: (() -> Unit)?,
    modifier: Modifier = Modifier,
    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(
    TooltipBox(
        positionProvider = TooltipDefaults.rememberTooltipPositionProvider(),
        positionProvider = TooltipDefaults.rememberTooltipPositionProvider(),
@@ -95,13 +110,13 @@ private fun AnchoredTooltip(
                caretSize = TooltipDefaults.caretSize,
                caretSize = TooltipDefaults.caretSize,
                shadowElevation = 2.dp,
                shadowElevation = 2.dp,
            ) {
            ) {
                Text(text = text, modifier = Modifier.padding(8.dp))
                Text(text = text ?: "", modifier = Modifier.padding(8.dp))
            }
            }
        },
        },
        state = tooltipState,
        state = tooltipState,
        onDismissRequest = onDismissed,
        onDismissRequest = onDismissed,
        modifier = modifier,
        modifier = modifier,
    ) {
    ) {
        Spacer(modifier = Modifier.width(48.dp).fillMaxHeight())
        Spacer(modifier = Modifier.fillMaxSize())
    }
    }
}
}
+40 −4
Original line number Original line 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.TransformOrigin
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.Layout
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.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.max
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.kairos.buildSpec
import com.android.systemui.privacy.OngoingPrivacyChip
import com.android.systemui.privacy.OngoingPrivacyChip
import com.android.systemui.res.R
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.scene.shared.model.Scenes
import com.android.systemui.shade.ui.composable.ShadeHeader.Colors.onScrimDim
import com.android.systemui.shade.ui.composable.ShadeHeader.Colors.onScrimDim
import com.android.systemui.shade.ui.composable.ShadeHeader.Dimensions.ChipPaddingHorizontal
import com.android.systemui.shade.ui.composable.ShadeHeader.Dimensions.ChipPaddingHorizontal
@@ -351,7 +355,16 @@ fun ContentScope.OverlayShadeHeaderPartialStateless(
                NotificationsChip(
                NotificationsChip(
                    onClick = viewModel::onNotificationIconChipClicked,
                    onClick = viewModel::onNotificationIconChipClicked,
                    backgroundColor = chipHighlight.backgroundColor(MaterialTheme.colorScheme),
                    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(
                    VariableDayDate(
                        longerDateText = viewModel.longerDateText,
                        longerDateText = viewModel.longerDateText,
@@ -371,7 +384,16 @@ fun ContentScope.OverlayShadeHeaderPartialStateless(
                SystemIconChip(
                SystemIconChip(
                    backgroundColor = chipHighlight.backgroundColor(MaterialTheme.colorScheme),
                    backgroundColor = chipHighlight.backgroundColor(MaterialTheme.colorScheme),
                    onClick = viewModel::onSystemIconChipClicked,
                    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 =
                    val paddingEnd =
                        with(LocalDensity.current) {
                        with(LocalDensity.current) {
@@ -803,7 +825,10 @@ private fun ContentScope.PrivacyChip(


/** Modifies the given [Modifier] such that it shows a looping vertical bounce animation. */
/** Modifies the given [Modifier] such that it shows a looping vertical bounce animation. */
@Composable
@Composable
private fun Modifier.bouncy(isEnabled: Boolean): Modifier {
private fun Modifier.bouncy(
    isEnabled: Boolean,
    onBoundsChange: (bounds: IntRect) -> Unit,
): Modifier {
    val density = LocalDensity.current
    val density = LocalDensity.current
    val animatable = remember { Animatable(0f) }
    val animatable = remember { Animatable(0f) }
    LaunchedEffect(isEnabled) {
    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 {
private fun shouldUseExpandedFormat(state: TransitionState): Boolean {
+41 −0
Original line number Original line 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.DeviceEntryFaceAuthInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
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.EnableSceneContainer
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.flags.Flags
@@ -291,6 +292,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    }
    }


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


@SmallTest
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWith(AndroidJUnit4::class)
@DisableSceneContainer
class BackActionInteractorTest : SysuiTestCase() {
class BackActionInteractorTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
    private val testScope = kosmos.testScope
+13 −2
Original line number Original line 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.bouncer.data.repository.keyguardBouncerRepository
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.res.R
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 com.android.systemui.util.mockito.whenever
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runCurrent
@@ -205,8 +208,16 @@ internal fun updatePrimaryBouncer(
    fpsDetectionRunning: Boolean,
    fpsDetectionRunning: Boolean,
    isUnlockingWithFpAllowed: 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.setPrimaryShow(isShowing)
        kosmos.keyguardBouncerRepository.setPrimaryStartingToHide(false)
        kosmos.keyguardBouncerRepository.setPrimaryStartingToHide(false)
    }
    val primaryStartDisappearAnimation = if (isAnimatingAway) Runnable {} else null
    val primaryStartDisappearAnimation = if (isAnimatingAway) Runnable {} else null
    kosmos.keyguardBouncerRepository.setPrimaryStartDisappearAnimation(
    kosmos.keyguardBouncerRepository.setPrimaryStartDisappearAnimation(
        primaryStartDisappearAnimation
        primaryStartDisappearAnimation
Loading