Loading packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt +2 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,8 @@ constructor( val keyguardAuthenticatedPrimaryAuth: Flow<Int> = repository.keyguardAuthenticatedPrimaryAuth val keyguardAuthenticatedBiometrics: Flow<Boolean> = repository.keyguardAuthenticatedBiometrics.filterNotNull() val keyguardAuthenticatedBiometricsHandled: Flow<Unit> = repository.keyguardAuthenticatedBiometrics.filter { it == null }.map {} val userRequestedBouncerWhenAlreadyAuthenticated: Flow<Int> = repository.userRequestedBouncerWhenAlreadyAuthenticated.filterNotNull() val isShowing: StateFlow<Boolean> = repository.primaryBouncerShow Loading packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModel.kt +2 −0 Original line number Diff line number Diff line Loading @@ -23,12 +23,14 @@ import com.android.systemui.bouncer.shared.model.BouncerShowMessageModel import com.android.systemui.bouncer.ui.BouncerView import com.android.systemui.bouncer.ui.BouncerViewDelegate import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge /** Models UI state for the lock screen bouncer; handles user input. */ @ExperimentalCoroutinesApi class KeyguardBouncerViewModel @Inject constructor( Loading packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt +7 −0 Original line number Diff line number Diff line Loading @@ -102,9 +102,16 @@ object AlternateBouncerViewBinder { launch { viewModel.scrimAlpha.collect { val wasVisible = alternateBouncerViewContainer.visibility == View.VISIBLE alternateBouncerViewContainer.visibility = if (it < .1f) View.INVISIBLE else View.VISIBLE scrim.viewAlpha = it if ( wasVisible && alternateBouncerViewContainer.visibility == View.INVISIBLE ) { // view is no longer visible viewModel.hideAlternateBouncer() } } } Loading packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt +4 −0 Original line number Diff line number Diff line Loading @@ -89,4 +89,8 @@ constructor( fun showPrimaryBouncer() { statusBarKeyguardViewManager.showPrimaryBouncer(/* scrimmed */ true) } fun hideAlternateBouncer() { statusBarKeyguardViewManager.hideAlternateBouncer(false) } } packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +44 −1 Original line number Diff line number Diff line Loading @@ -76,6 +76,8 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac import com.android.systemui.keyguard.domain.interactor.WindowManagerLockscreenVisibilityInteractor; import com.android.systemui.keyguard.shared.model.DismissAction; import com.android.systemui.keyguard.shared.model.KeyguardDone; import com.android.systemui.keyguard.shared.model.KeyguardState; import com.android.systemui.keyguard.shared.model.TransitionStep; import com.android.systemui.navigationbar.NavigationBarView; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.navigationbar.TaskbarDelegate; Loading Loading @@ -105,6 +107,8 @@ import com.android.systemui.util.kotlin.JavaAdapter; import dagger.Lazy; import kotlin.Unit; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashSet; Loading @@ -116,6 +120,7 @@ import javax.inject.Inject; import kotlinx.coroutines.CoroutineDispatcher; import kotlinx.coroutines.ExperimentalCoroutinesApi; import kotlinx.coroutines.Job; /** * Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back Loading Loading @@ -163,6 +168,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private final Lazy<ShadeController> mShadeController; private final Lazy<SceneInteractor> mSceneInteractorLazy; private Job mListenForAlternateBouncerTransitionSteps = null; private Job mListenForKeyguardAuthenticatedBiometricsHandled = null; // Local cache of expansion events, to avoid duplicates private float mFraction = -1f; private boolean mTracking = false; Loading Loading @@ -491,6 +499,26 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mDockManager.addListener(mDockEventListener); mIsDocked = mDockManager.isDocked(); } if (mListenForAlternateBouncerTransitionSteps != null) { mListenForAlternateBouncerTransitionSteps.cancel(null); } mListenForAlternateBouncerTransitionSteps = null; if (mListenForKeyguardAuthenticatedBiometricsHandled != null) { mListenForKeyguardAuthenticatedBiometricsHandled.cancel(null); } mListenForKeyguardAuthenticatedBiometricsHandled = null; if (!DeviceEntryUdfpsRefactor.isEnabled()) { mListenForAlternateBouncerTransitionSteps = mJavaAdapter.alwaysCollectFlow( mKeyguardTransitionInteractor.transitionStepsFromState( KeyguardState.ALTERNATE_BOUNCER), this::consumeFromAlternateBouncerTransitionSteps ); mListenForKeyguardAuthenticatedBiometricsHandled = mJavaAdapter.alwaysCollectFlow( mPrimaryBouncerInteractor.getKeyguardAuthenticatedBiometricsHandled(), this::consumeKeyguardAuthenticatedBiometricsHandled ); } if (KeyguardWmStateRefactor.isEnabled()) { // Show the keyguard views whenever we've told WM that the lockscreen is visible. Loading @@ -514,6 +542,22 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } } @VisibleForTesting void consumeFromAlternateBouncerTransitionSteps(TransitionStep step) { hideAlternateBouncer(false); } /** * Required without fix for b/328643370: missing AlternateBouncer (when occluded) => Gone * transition. */ @VisibleForTesting void consumeKeyguardAuthenticatedBiometricsHandled(Unit handled) { if (mAlternateBouncerInteractor.isVisibleState()) { hideAlternateBouncer(false); } } private void consumeShowStatusBarKeyguardView(boolean show) { if (show != mLastShowing) { if (show) { Loading Loading @@ -1458,7 +1502,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mPrimaryBouncerInteractor.notifyKeyguardAuthenticatedBiometrics(strongAuth); if (mAlternateBouncerInteractor.isVisibleState()) { hideAlternateBouncer(false); executeAfterKeyguardGoneAction(); } Loading Loading
packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt +2 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,8 @@ constructor( val keyguardAuthenticatedPrimaryAuth: Flow<Int> = repository.keyguardAuthenticatedPrimaryAuth val keyguardAuthenticatedBiometrics: Flow<Boolean> = repository.keyguardAuthenticatedBiometrics.filterNotNull() val keyguardAuthenticatedBiometricsHandled: Flow<Unit> = repository.keyguardAuthenticatedBiometrics.filter { it == null }.map {} val userRequestedBouncerWhenAlreadyAuthenticated: Flow<Int> = repository.userRequestedBouncerWhenAlreadyAuthenticated.filterNotNull() val isShowing: StateFlow<Boolean> = repository.primaryBouncerShow Loading
packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModel.kt +2 −0 Original line number Diff line number Diff line Loading @@ -23,12 +23,14 @@ import com.android.systemui.bouncer.shared.model.BouncerShowMessageModel import com.android.systemui.bouncer.ui.BouncerView import com.android.systemui.bouncer.ui.BouncerViewDelegate import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge /** Models UI state for the lock screen bouncer; handles user input. */ @ExperimentalCoroutinesApi class KeyguardBouncerViewModel @Inject constructor( Loading
packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt +7 −0 Original line number Diff line number Diff line Loading @@ -102,9 +102,16 @@ object AlternateBouncerViewBinder { launch { viewModel.scrimAlpha.collect { val wasVisible = alternateBouncerViewContainer.visibility == View.VISIBLE alternateBouncerViewContainer.visibility = if (it < .1f) View.INVISIBLE else View.VISIBLE scrim.viewAlpha = it if ( wasVisible && alternateBouncerViewContainer.visibility == View.INVISIBLE ) { // view is no longer visible viewModel.hideAlternateBouncer() } } } Loading
packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt +4 −0 Original line number Diff line number Diff line Loading @@ -89,4 +89,8 @@ constructor( fun showPrimaryBouncer() { statusBarKeyguardViewManager.showPrimaryBouncer(/* scrimmed */ true) } fun hideAlternateBouncer() { statusBarKeyguardViewManager.hideAlternateBouncer(false) } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +44 −1 Original line number Diff line number Diff line Loading @@ -76,6 +76,8 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac import com.android.systemui.keyguard.domain.interactor.WindowManagerLockscreenVisibilityInteractor; import com.android.systemui.keyguard.shared.model.DismissAction; import com.android.systemui.keyguard.shared.model.KeyguardDone; import com.android.systemui.keyguard.shared.model.KeyguardState; import com.android.systemui.keyguard.shared.model.TransitionStep; import com.android.systemui.navigationbar.NavigationBarView; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.navigationbar.TaskbarDelegate; Loading Loading @@ -105,6 +107,8 @@ import com.android.systemui.util.kotlin.JavaAdapter; import dagger.Lazy; import kotlin.Unit; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashSet; Loading @@ -116,6 +120,7 @@ import javax.inject.Inject; import kotlinx.coroutines.CoroutineDispatcher; import kotlinx.coroutines.ExperimentalCoroutinesApi; import kotlinx.coroutines.Job; /** * Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back Loading Loading @@ -163,6 +168,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private final Lazy<ShadeController> mShadeController; private final Lazy<SceneInteractor> mSceneInteractorLazy; private Job mListenForAlternateBouncerTransitionSteps = null; private Job mListenForKeyguardAuthenticatedBiometricsHandled = null; // Local cache of expansion events, to avoid duplicates private float mFraction = -1f; private boolean mTracking = false; Loading Loading @@ -491,6 +499,26 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mDockManager.addListener(mDockEventListener); mIsDocked = mDockManager.isDocked(); } if (mListenForAlternateBouncerTransitionSteps != null) { mListenForAlternateBouncerTransitionSteps.cancel(null); } mListenForAlternateBouncerTransitionSteps = null; if (mListenForKeyguardAuthenticatedBiometricsHandled != null) { mListenForKeyguardAuthenticatedBiometricsHandled.cancel(null); } mListenForKeyguardAuthenticatedBiometricsHandled = null; if (!DeviceEntryUdfpsRefactor.isEnabled()) { mListenForAlternateBouncerTransitionSteps = mJavaAdapter.alwaysCollectFlow( mKeyguardTransitionInteractor.transitionStepsFromState( KeyguardState.ALTERNATE_BOUNCER), this::consumeFromAlternateBouncerTransitionSteps ); mListenForKeyguardAuthenticatedBiometricsHandled = mJavaAdapter.alwaysCollectFlow( mPrimaryBouncerInteractor.getKeyguardAuthenticatedBiometricsHandled(), this::consumeKeyguardAuthenticatedBiometricsHandled ); } if (KeyguardWmStateRefactor.isEnabled()) { // Show the keyguard views whenever we've told WM that the lockscreen is visible. Loading @@ -514,6 +542,22 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } } @VisibleForTesting void consumeFromAlternateBouncerTransitionSteps(TransitionStep step) { hideAlternateBouncer(false); } /** * Required without fix for b/328643370: missing AlternateBouncer (when occluded) => Gone * transition. */ @VisibleForTesting void consumeKeyguardAuthenticatedBiometricsHandled(Unit handled) { if (mAlternateBouncerInteractor.isVisibleState()) { hideAlternateBouncer(false); } } private void consumeShowStatusBarKeyguardView(boolean show) { if (show != mLastShowing) { if (show) { Loading Loading @@ -1458,7 +1502,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mPrimaryBouncerInteractor.notifyKeyguardAuthenticatedBiometrics(strongAuth); if (mAlternateBouncerInteractor.isVisibleState()) { hideAlternateBouncer(false); executeAfterKeyguardGoneAction(); } Loading