Do nothing in duplicate onDialogAnimatedIn calls

Bug: 233448368
Test: atest AuthSessionTest
Change-Id: I171604ee6dc40f1d44ac65525c32ff97f1fa1d76
Merged-In: I171604ee6dc40f1d44ac65525c32ff97f1fa1d76
This commit is contained in:
Ilya Matyukhin
2022-06-23 07:40:59 +00:00
parent 3c4ebbbbc1
commit 8f803aea46
2 changed files with 44 additions and 4 deletions

View File

@@ -538,13 +538,12 @@ public final class AuthSession implements IBinder.DeathRecipient {
void onDialogAnimatedIn() {
if (mState != STATE_AUTH_STARTED) {
Slog.w(TAG, "onDialogAnimatedIn, unexpected state: " + mState);
Slog.e(TAG, "onDialogAnimatedIn, unexpected state: " + mState);
return;
}
mState = STATE_AUTH_STARTED_UI_SHOWING;
startAllPreparedFingerprintSensors();
mState = STATE_AUTH_STARTED_UI_SHOWING;
}
void onTryAgainPressed() {

View File

@@ -20,7 +20,9 @@ import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
import static android.hardware.biometrics.BiometricPrompt.DISMISSED_REASON_NEGATIVE;
import static com.android.server.biometrics.BiometricServiceStateProto.*;
import static com.android.server.biometrics.BiometricServiceStateProto.STATE_AUTH_CALLED;
import static com.android.server.biometrics.BiometricServiceStateProto.STATE_AUTH_STARTED;
import static com.android.server.biometrics.BiometricServiceStateProto.STATE_AUTH_STARTED_UI_SHOWING;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
@@ -32,6 +34,8 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -279,6 +283,43 @@ public class AuthSessionTest {
session.mPreAuthInfo.eligibleSensors.get(fingerprintSensorId).getSensorState());
}
@Test
public void testOnDialogAnimatedInDoesNothingDuringInvalidState() throws Exception {
setupFingerprint(0 /* id */, FingerprintSensorProperties.TYPE_UDFPS_OPTICAL);
final long operationId = 123;
final int userId = 10;
final AuthSession session = createAuthSession(mSensors,
false /* checkDevicePolicyManager */,
Authenticators.BIOMETRIC_STRONG,
TEST_REQUEST_ID,
operationId,
userId);
final IBiometricAuthenticator impl = session.mPreAuthInfo.eligibleSensors.get(0).impl;
session.goToInitialState();
for (BiometricSensor sensor : session.mPreAuthInfo.eligibleSensors) {
assertEquals(BiometricSensor.STATE_WAITING_FOR_COOKIE, sensor.getSensorState());
session.onCookieReceived(
session.mPreAuthInfo.eligibleSensors.get(sensor.id).getCookie());
}
assertTrue(session.allCookiesReceived());
assertEquals(STATE_AUTH_STARTED, session.getState());
verify(impl, never()).startPreparedClient(anyInt());
// First invocation should start the client monitor.
session.onDialogAnimatedIn();
assertEquals(STATE_AUTH_STARTED_UI_SHOWING, session.getState());
verify(impl).startPreparedClient(anyInt());
// Subsequent invocations should not start the client monitor again.
session.onDialogAnimatedIn();
session.onDialogAnimatedIn();
session.onDialogAnimatedIn();
assertEquals(STATE_AUTH_STARTED_UI_SHOWING, session.getState());
verify(impl, times(1)).startPreparedClient(anyInt());
}
@Test
public void testCancelAuthentication_whenStateAuthCalled_invokesCancel()
throws RemoteException {