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

Commit 96c3f9d2 authored by Josh Tsuji's avatar Josh Tsuji Committed by Android (Google) Code Review
Browse files

Merge "(Fix-forward) Emit notificationsAlpha=0f earlier in the OCCLUDED->LS transition." into main

parents 94001be9 3cfc3abb
Loading
Loading
Loading
Loading
+55 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.keyguard.ui.viewmodel

import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow

/** Breaks down OCCLUDED->GONE transition into discrete steps for corresponding views to consume. */
@ExperimentalCoroutinesApi
@SysUISingleton
class OccludedToGoneTransitionViewModel
@Inject
constructor(
    animationFlow: KeyguardTransitionAnimationFlow,
) {
    private val transitionAnimation =
        animationFlow.setup(
            duration = DEFAULT_DURATION,
            from = KeyguardState.OCCLUDED,
            to = KeyguardState.GONE,
        )

    fun notificationAlpha(viewState: ViewStateAccessor): Flow<Float> {
        var currentAlpha = 0f
        return transitionAnimation.sharedFlow(
            duration = DEFAULT_DURATION,
            onStart = { currentAlpha = viewState.alpha() },
            onStep = { currentAlpha },
            onFinish = { 1f },
        )
    }

    companion object {
        val DEFAULT_DURATION = 300.milliseconds
    }
}
+30 −5
Original line number Diff line number Diff line
@@ -21,15 +21,21 @@ import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
import com.android.systemui.keyguard.domain.interactor.FromOccludedTransitionInteractor.Companion.TO_LOCKSCREEN_DURATION
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
import com.android.systemui.res.R
import com.android.systemui.util.kotlin.pairwise
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.merge

/**
 * Breaks down OCCLUDED->LOCKSCREEN transition into discrete steps for corresponding views to
@@ -43,6 +49,8 @@ constructor(
    deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor,
    configurationInteractor: ConfigurationInteractor,
    animationFlow: KeyguardTransitionAnimationFlow,
    keyguardInteractor: KeyguardInteractor,
    keyguardTransitionInteractor: KeyguardTransitionInteractor,
) : DeviceEntryIconTransition {

    private val transitionAnimation =
@@ -74,11 +82,28 @@ constructor(

    /** Lockscreen views alpha */
    val lockscreenAlpha: Flow<Float> =
        merge(
            transitionAnimation.sharedFlow(
                startTime = 233.milliseconds,
                duration = 250.milliseconds,
                onStep = { it },
                name = "OCCLUDED->LOCKSCREEN: lockscreenAlpha",
            ),
            // Required to fix a bug where the shade expands while lockscreenAlpha=1f, due to a call
            // to setOccluded(false) triggering a reset() call in KeyguardViewMediator. The
            // permanent solution is to only expand the shade once the keyguard transition from
            // OCCLUDED starts, but that requires more refactoring of expansion amounts. For now,
            // emit alpha = 0f for OCCLUDED -> LOCKSCREEN whenever isOccluded flips from true to
            // false while currentState == OCCLUDED, so that alpha = 0f when that expansion occurs.
            // TODO(b/332946323): Remove this once it's no longer needed.
            keyguardInteractor.isKeyguardOccluded
                .pairwise()
                .filter { (wasOccluded, isOccluded) ->
                    wasOccluded &&
                        !isOccluded &&
                        keyguardTransitionInteractor.getCurrentState() == KeyguardState.OCCLUDED
                }
                .map { 0f }
        )

    val deviceEntryBackgroundViewAlpha: Flow<Float> =
+3 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ import com.android.systemui.keyguard.ui.viewmodel.LockscreenToGoneTransitionView
import com.android.systemui.keyguard.ui.viewmodel.LockscreenToOccludedTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.LockscreenToPrimaryBouncerTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.OccludedToAodTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.OccludedToGoneTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.OccludedToLockscreenTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToLockscreenTransitionViewModel
@@ -121,6 +122,7 @@ constructor(
        LockscreenToPrimaryBouncerTransitionViewModel,
    private val lockscreenToOccludedTransitionViewModel: LockscreenToOccludedTransitionViewModel,
    private val occludedToAodTransitionViewModel: OccludedToAodTransitionViewModel,
    private val occludedToGoneTransitionViewModel: OccludedToGoneTransitionViewModel,
    private val occludedToLockscreenTransitionViewModel: OccludedToLockscreenTransitionViewModel,
    private val primaryBouncerToGoneTransitionViewModel: PrimaryBouncerToGoneTransitionViewModel,
    private val primaryBouncerToLockscreenTransitionViewModel:
@@ -472,6 +474,7 @@ constructor(
                lockscreenToOccludedTransitionViewModel.lockscreenAlpha,
                lockscreenToPrimaryBouncerTransitionViewModel.lockscreenAlpha,
                occludedToAodTransitionViewModel.lockscreenAlpha,
                occludedToGoneTransitionViewModel.notificationAlpha(viewState),
                occludedToLockscreenTransitionViewModel.lockscreenAlpha,
                primaryBouncerToGoneTransitionViewModel.notificationAlpha,
                primaryBouncerToLockscreenTransitionViewModel.lockscreenAlpha,
+30 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

@file:OptIn(ExperimentalCoroutinesApi::class)

package com.android.systemui.keyguard.ui.viewmodel

import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import kotlinx.coroutines.ExperimentalCoroutinesApi

var Kosmos.occludedToGoneTransitionViewModel by Fixture {
    OccludedToGoneTransitionViewModel(
        animationFlow = keyguardTransitionAnimationFlow,
    )
}
+4 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ package com.android.systemui.keyguard.ui.viewmodel

import com.android.systemui.common.ui.domain.interactor.configurationInteractor
import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
@@ -30,5 +32,7 @@ var Kosmos.occludedToLockscreenTransitionViewModel by Fixture {
        deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor,
        configurationInteractor = configurationInteractor,
        animationFlow = keyguardTransitionAnimationFlow,
        keyguardInteractor = keyguardInteractor,
        keyguardTransitionInteractor = keyguardTransitionInteractor,
    )
}
Loading