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

Commit 83f38405 authored by Alejandro Nijamkin's avatar Alejandro Nijamkin
Browse files

Replaces collectAsState with collectAsStateWithLifecycle

See go/sysui-compose#collect-as-state

Bug: 299077501
Test: built and ran System UI with and without flexiglass on, expanded
the shade and QS and unlocked the device from the bouncer
Flag: NA

Change-Id: I3d82e6aa25e3296f5b5ab1a8f47e53ed694d9abb
parent f4e055ca
Loading
Loading
Loading
Loading
+13 −12
Original line number Diff line number Diff line
@@ -56,7 +56,6 @@ import androidx.compose.material3.windowsizeclass.WindowHeightSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -77,6 +76,7 @@ import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.unit.times
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.PlatformButton
import com.android.compose.animation.Easings
import com.android.compose.animation.scene.ElementKey
@@ -111,7 +111,7 @@ fun BouncerContent(
    dialogFactory: BouncerDialogFactory,
    modifier: Modifier = Modifier,
) {
    val isSideBySideSupported by viewModel.isSideBySideSupported.collectAsState()
    val isSideBySideSupported by viewModel.isSideBySideSupported.collectAsStateWithLifecycle()
    val layout = calculateLayout(isSideBySideSupported = isSideBySideSupported)

    Box(
@@ -220,7 +220,7 @@ private fun SplitLayout(
    viewModel: BouncerViewModel,
    modifier: Modifier = Modifier,
) {
    val authMethod by viewModel.authMethodViewModel.collectAsState()
    val authMethod by viewModel.authMethodViewModel.collectAsStateWithLifecycle()

    Row(
        modifier =
@@ -316,7 +316,7 @@ private fun BesideUserSwitcherLayout(
    val (isSwapped, setSwapped) = rememberSaveable(isLeftToRight) { mutableStateOf(!isLeftToRight) }
    val isHeightExpanded =
        LocalWindowSizeClass.current.heightSizeClass == WindowHeightSizeClass.Expanded
    val authMethod by viewModel.authMethodViewModel.collectAsState()
    val authMethod by viewModel.authMethodViewModel.collectAsStateWithLifecycle()

    Row(
        modifier =
@@ -480,7 +480,7 @@ private fun FoldAware(
    modifier: Modifier = Modifier,
) {
    val foldPosture: FoldPosture by foldPosture()
    val isSplitAroundTheFoldRequired by viewModel.isFoldSplitRequired.collectAsState()
    val isSplitAroundTheFoldRequired by viewModel.isFoldSplitRequired.collectAsStateWithLifecycle()
    val isSplitAroundTheFold = foldPosture == FoldPosture.Tabletop && isSplitAroundTheFoldRequired
    val currentSceneKey =
        if (isSplitAroundTheFold) SceneKeys.SplitSceneKey else SceneKeys.ContiguousSceneKey
@@ -562,7 +562,7 @@ private fun StatusMessage(
    viewModel: BouncerMessageViewModel,
    modifier: Modifier = Modifier,
) {
    val message: MessageViewModel? by viewModel.message.collectAsState()
    val message: MessageViewModel? by viewModel.message.collectAsStateWithLifecycle()

    DisposableEffect(Unit) {
        viewModel.onShown()
@@ -612,7 +612,7 @@ private fun OutputArea(
    modifier: Modifier = Modifier,
) {
    val authMethodViewModel: AuthMethodBouncerViewModel? by
        viewModel.authMethodViewModel.collectAsState()
        viewModel.authMethodViewModel.collectAsStateWithLifecycle()

    when (val nonNullViewModel = authMethodViewModel) {
        is PinBouncerViewModel ->
@@ -642,7 +642,7 @@ private fun InputArea(
    modifier: Modifier = Modifier,
) {
    val authMethodViewModel: AuthMethodBouncerViewModel? by
        viewModel.authMethodViewModel.collectAsState()
        viewModel.authMethodViewModel.collectAsStateWithLifecycle()

    when (val nonNullViewModel = authMethodViewModel) {
        is PinBouncerViewModel -> {
@@ -668,7 +668,8 @@ private fun ActionArea(
    viewModel: BouncerViewModel,
    modifier: Modifier = Modifier,
) {
    val actionButton: BouncerActionButtonModel? by viewModel.actionButton.collectAsState()
    val actionButton: BouncerActionButtonModel? by
        viewModel.actionButton.collectAsStateWithLifecycle()
    val appearFadeInAnimatable = remember { Animatable(0f) }
    val appearMoveAnimatable = remember { Animatable(0f) }
    val appearAnimationInitialOffset = with(LocalDensity.current) { 80.dp.toPx() }
@@ -735,7 +736,7 @@ private fun Dialog(
    bouncerViewModel: BouncerViewModel,
    dialogFactory: BouncerDialogFactory,
) {
    val dialogViewModel by bouncerViewModel.dialogViewModel.collectAsState()
    val dialogViewModel by bouncerViewModel.dialogViewModel.collectAsStateWithLifecycle()
    var dialog: AlertDialog? by remember { mutableStateOf(null) }

    dialogViewModel?.let { viewModel ->
@@ -772,8 +773,8 @@ private fun UserSwitcher(
        return
    }

    val selectedUserImage by viewModel.selectedUserImage.collectAsState(null)
    val dropdownItems by viewModel.userSwitcherDropdown.collectAsState(emptyList())
    val selectedUserImage by viewModel.selectedUserImage.collectAsStateWithLifecycle(null)
    val dropdownItems by viewModel.userSwitcherDropdown.collectAsStateWithLifecycle(emptyList())

    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
+9 −7
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.ExperimentalComposeUiApi
@@ -49,6 +48,7 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.PlatformIconButton
import com.android.systemui.bouncer.ui.viewmodel.PasswordBouncerViewModel
import com.android.systemui.common.ui.compose.SelectedUserAwareInputConnection
@@ -62,18 +62,20 @@ internal fun PasswordBouncer(
    modifier: Modifier = Modifier,
) {
    val focusRequester = remember { FocusRequester() }
    val isTextFieldFocusRequested by viewModel.isTextFieldFocusRequested.collectAsState()
    val isTextFieldFocusRequested by
        viewModel.isTextFieldFocusRequested.collectAsStateWithLifecycle()
    LaunchedEffect(isTextFieldFocusRequested) {
        if (isTextFieldFocusRequested) {
            focusRequester.requestFocus()
        }
    }

    val password: String by viewModel.password.collectAsState()
    val isInputEnabled: Boolean by viewModel.isInputEnabled.collectAsState()
    val animateFailure: Boolean by viewModel.animateFailure.collectAsState()
    val isImeSwitcherButtonVisible by viewModel.isImeSwitcherButtonVisible.collectAsState()
    val selectedUserId by viewModel.selectedUserId.collectAsState()
    val password: String by viewModel.password.collectAsStateWithLifecycle()
    val isInputEnabled: Boolean by viewModel.isInputEnabled.collectAsStateWithLifecycle()
    val animateFailure: Boolean by viewModel.animateFailure.collectAsStateWithLifecycle()
    val isImeSwitcherButtonVisible by
        viewModel.isImeSwitcherButtonVisible.collectAsStateWithLifecycle()
    val selectedUserId by viewModel.selectedUserId.collectAsStateWithLifecycle()

    DisposableEffect(Unit) { onDispose { viewModel.onHidden() } }

+8 −7
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -47,6 +46,7 @@ import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.integerResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.animation.Easings
import com.android.compose.modifiers.thenIf
import com.android.internal.R
@@ -86,14 +86,15 @@ internal fun PatternBouncer(
    val lineStrokeWidth = with(density) { LINE_STROKE_WIDTH_DP.dp.toPx() }

    // All dots that should be rendered on the grid.
    val dots: List<PatternDotViewModel> by viewModel.dots.collectAsState()
    val dots: List<PatternDotViewModel> by viewModel.dots.collectAsStateWithLifecycle()
    // The most recently selected dot, if the user is currently dragging.
    val currentDot: PatternDotViewModel? by viewModel.currentDot.collectAsState()
    val currentDot: PatternDotViewModel? by viewModel.currentDot.collectAsStateWithLifecycle()
    // The dots selected so far, if the user is currently dragging.
    val selectedDots: List<PatternDotViewModel> by viewModel.selectedDots.collectAsState()
    val isInputEnabled: Boolean by viewModel.isInputEnabled.collectAsState()
    val isAnimationEnabled: Boolean by viewModel.isPatternVisible.collectAsState()
    val animateFailure: Boolean by viewModel.animateFailure.collectAsState()
    val selectedDots: List<PatternDotViewModel> by
        viewModel.selectedDots.collectAsStateWithLifecycle()
    val isInputEnabled: Boolean by viewModel.isInputEnabled.collectAsStateWithLifecycle()
    val isAnimationEnabled: Boolean by viewModel.isPatternVisible.collectAsStateWithLifecycle()
    val animateFailure: Boolean by viewModel.animateFailure.collectAsStateWithLifecycle()

    // Map of animatables for the scale of each dot, keyed by dot.
    val dotScalingAnimatables = remember(dots) { dots.associateWith { Animatable(1f) } }
+7 −6
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -49,6 +48,7 @@ import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.animation.Easings
import com.android.compose.grid.VerticalGrid
import com.android.compose.modifiers.thenIf
@@ -74,12 +74,13 @@ fun PinPad(
) {
    DisposableEffect(Unit) { onDispose { viewModel.onHidden() } }

    val isInputEnabled: Boolean by viewModel.isInputEnabled.collectAsState()
    val backspaceButtonAppearance by viewModel.backspaceButtonAppearance.collectAsState()
    val confirmButtonAppearance by viewModel.confirmButtonAppearance.collectAsState()
    val animateFailure: Boolean by viewModel.animateFailure.collectAsState()
    val isInputEnabled: Boolean by viewModel.isInputEnabled.collectAsStateWithLifecycle()
    val backspaceButtonAppearance by
        viewModel.backspaceButtonAppearance.collectAsStateWithLifecycle()
    val confirmButtonAppearance by viewModel.confirmButtonAppearance.collectAsStateWithLifecycle()
    val animateFailure: Boolean by viewModel.animateFailure.collectAsStateWithLifecycle()
    val isDigitButtonAnimationEnabled: Boolean by
        viewModel.isDigitButtonAnimationEnabled.collectAsState()
        viewModel.isDigitButtonAnimationEnabled.collectAsStateWithLifecycle()

    val buttonScaleAnimatables = remember { List(12) { Animatable(1f) } }
    LaunchedEffect(animateFailure) {
+7 −6
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
import androidx.compose.runtime.mutableStateListOf
@@ -65,6 +64,7 @@ import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.PlatformOutlinedButton
import com.android.compose.animation.Easings
import com.android.keyguard.PinShapeAdapter
@@ -86,7 +86,7 @@ fun PinInputDisplay(
    viewModel: PinBouncerViewModel,
    modifier: Modifier = Modifier,
) {
    val hintedPinLength: Int? by viewModel.hintedPinLength.collectAsState()
    val hintedPinLength: Int? by viewModel.hintedPinLength.collectAsStateWithLifecycle()
    val shapeAnimations = rememberShapeAnimations(viewModel.pinShapes)

    // The display comes in two different flavors:
@@ -119,7 +119,7 @@ private fun HintingPinInputDisplay(
    hintedPinLength: Int,
    modifier: Modifier = Modifier,
) {
    val pinInput: PinInputViewModel by viewModel.pinInput.collectAsState()
    val pinInput: PinInputViewModel by viewModel.pinInput.collectAsStateWithLifecycle()
    // [ClearAll] marker pointing at the beginning of the current pin input.
    // When a new [ClearAll] token is added to the [pinInput], the clear-all animation is played
    // and the marker is advanced manually to the most recent marker. See LaunchedEffect below.
@@ -257,9 +257,10 @@ private fun RegularPinInputDisplay(

@Composable
private fun SimArea(viewModel: PinBouncerViewModel) {
    val isLockedEsim by viewModel.isLockedEsim.collectAsState()
    val isSimUnlockingDialogVisible by viewModel.isSimUnlockingDialogVisible.collectAsState()
    val errorDialogMessage by viewModel.errorDialogMessage.collectAsState()
    val isLockedEsim by viewModel.isLockedEsim.collectAsStateWithLifecycle()
    val isSimUnlockingDialogVisible by
        viewModel.isSimUnlockingDialogVisible.collectAsStateWithLifecycle()
    val errorDialogMessage by viewModel.errorDialogMessage.collectAsStateWithLifecycle()
    var unlockDialog: Dialog? by remember { mutableStateOf(null) }
    var errorDialog: Dialog? by remember { mutableStateOf(null) }
    val context = LocalView.current.context
Loading