[Bouncer] Do not send message if face auth...

Succeeded.

When we authenticate the face, the KeyguardIndicationController checks
to see if the bouncer is showing and will set message to "Swipe up and
try again." if so. Ensure that we only show "Swipe up and try again." when face auth
fails.

Also ensure that message is removed when bouncer no longer becomes
visible.

Fixes: 259007288
Test: Enroll in FP and face. Open bouncer and auth via face. Turn off
and on and open bouncer again to view initial message.
Test: Unit Test

Change-Id: I8ee56d27ff60f32e696ac100a64d0553ce3c77e0
This commit is contained in:
Aaron Liu
2022-12-13 12:23:23 -08:00
parent 1c34df1da0
commit 4dd9900361
7 changed files with 26 additions and 15 deletions

View File

@@ -103,6 +103,7 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey
@Override
public void reset() {
super.reset();
// start fresh
mDismissing = false;
mView.resetPasswordText(false /* animate */, false /* announce */);

View File

@@ -121,6 +121,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
@Override
public void reset() {
mMessageAreaController.setMessage("", false);
}
@Override

View File

@@ -104,14 +104,6 @@ object KeyguardBouncerViewBinder {
}
}
launch {
viewModel.showWithFullExpansion.collect { model ->
hostViewController.resetSecurityContainer()
hostViewController.showPromptReason(model.promptReason)
hostViewController.onResume()
}
}
launch {
viewModel.hide.collect {
hostViewController.cancelDismissAction()

View File

@@ -22,10 +22,8 @@ import com.android.systemui.keyguard.data.BouncerViewDelegate
import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.keyguard.shared.model.BouncerShowMessageModel
import com.android.systemui.keyguard.shared.model.KeyguardBouncerModel
import com.android.systemui.statusbar.phone.KeyguardBouncer.EXPANSION_VISIBLE
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.map
/** Models UI state for the lock screen bouncer; handles user input. */
@@ -44,10 +42,6 @@ constructor(
/** Observe whether bouncer is showing. */
val show: Flow<KeyguardBouncerModel> = interactor.show
/** Observe visible expansion when bouncer is showing. */
val showWithFullExpansion: Flow<KeyguardBouncerModel> =
interactor.show.filter { it.expansionAmount == EXPANSION_VISIBLE }
/** Observe whether bouncer is hiding. */
val hide: Flow<Unit> = interactor.hide

View File

@@ -930,7 +930,8 @@ public class KeyguardIndicationController {
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
if (mStatusBarKeyguardViewManager.isShowingAlternateBouncer()) {
return; // udfps affordance is highlighted, no need to show action to unlock
} else if (mKeyguardUpdateMonitor.isFaceEnrolled()) {
} else if (!mKeyguardUpdateMonitor.getIsFaceAuthenticated()
&& mKeyguardUpdateMonitor.isFaceEnrolled()) {
String message = mContext.getString(R.string.keyguard_retry);
mStatusBarKeyguardViewManager.setKeyguardMessage(message, mInitialTextColorState);
}

View File

@@ -150,4 +150,10 @@ public class KeyguardAbsKeyInputViewControllerTest extends SysuiTestCase {
getContext().getResources().getString(R.string.kg_prompt_reason_restart_password),
false);
}
@Test
public void testReset() {
mKeyguardAbsKeyInputViewController.reset();
verify(mKeyguardMessageAreaController).setMessage("", false);
}
}

View File

@@ -660,6 +660,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
createController();
String message = mContext.getString(R.string.keyguard_retry);
when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
when(mKeyguardUpdateMonitor.getIsFaceAuthenticated()).thenReturn(false);
when(mKeyguardUpdateMonitor.isFaceEnrolled()).thenReturn(true);
mController.setVisible(true);
@@ -669,6 +670,21 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
verify(mStatusBarKeyguardViewManager).setKeyguardMessage(eq(message), any());
}
@Test
public void transientIndication_swipeUpToRetry_faceAuthenticated() {
createController();
String message = mContext.getString(R.string.keyguard_retry);
when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
when(mKeyguardUpdateMonitor.getIsFaceAuthenticated()).thenReturn(true);
when(mKeyguardUpdateMonitor.isFaceEnrolled()).thenReturn(true);
mController.setVisible(true);
mController.getKeyguardCallback().onBiometricError(FACE_ERROR_TIMEOUT,
"A message", BiometricSourceType.FACE);
verify(mStatusBarKeyguardViewManager, never()).setKeyguardMessage(eq(message), any());
}
@Test
public void faceErrorTimeout_whenFingerprintEnrolled_doesNotShowMessage() {
createController();