Associate the session type in operation context with the client

Bug: 276271514
Test: atest android.server.biometrics.cts.BiometricsAtomsTests#testAuthenticateAtom -c
Change-Id: Ic85a279e437f5a0c553e658296e0745190d8202e
This commit is contained in:
Jeff Pu
2023-04-24 19:08:56 +00:00
parent a63b22c0b8
commit 45106a4b7e
8 changed files with 72 additions and 56 deletions

View File

@@ -704,7 +704,8 @@ public final class AuthSession implements IBinder.DeathRecipient {
}
BiometricFrameworkStatsLogger.getInstance().authenticate(
mBiometricContext.updateContext(new OperationContextExt(), isCrypto()),
mBiometricContext.updateContext(new OperationContextExt(true /* isBP */),
isCrypto()),
statsModality(),
BiometricsProtoEnums.ACTION_UNKNOWN,
BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT,
@@ -734,7 +735,8 @@ public final class AuthSession implements IBinder.DeathRecipient {
}
// Auth canceled
BiometricFrameworkStatsLogger.getInstance().error(
mBiometricContext.updateContext(new OperationContextExt(), isCrypto()),
mBiometricContext.updateContext(new OperationContextExt(true /* isBP */),
isCrypto()),
statsModality(),
BiometricsProtoEnums.ACTION_AUTHENTICATE,
BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT,

View File

@@ -46,15 +46,17 @@ public class OperationContextExt {
private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED;
@Surface.Rotation private int mOrientation = Surface.ROTATION_0;
private int mFoldState = IBiometricContextListener.FoldState.UNKNOWN;
private final boolean mIsBP;
/** Create a new empty context. */
public OperationContextExt() {
this(new OperationContext());
/** Create a context. */
public OperationContextExt(boolean isBP) {
this(new OperationContext(), isBP);
}
/** Create a wrapped context. */
public OperationContextExt(@NonNull OperationContext context) {
public OperationContextExt(@NonNull OperationContext context, boolean isBP) {
mAidlContext = context;
mIsBP = isBP;
}
/**
@@ -268,18 +270,20 @@ public class OperationContextExt {
}
private void setFirstSessionId(@NonNull BiometricContext biometricContext) {
mSessionInfo = biometricContext.getKeyguardEntrySessionInfo();
if (mSessionInfo != null) {
mAidlContext.id = mSessionInfo.getId();
mAidlContext.reason = OperationReason.KEYGUARD;
return;
}
mSessionInfo = biometricContext.getBiometricPromptSessionInfo();
if (mSessionInfo != null) {
mAidlContext.id = mSessionInfo.getId();
mAidlContext.reason = OperationReason.BIOMETRIC_PROMPT;
return;
if (mIsBP) {
mSessionInfo = biometricContext.getBiometricPromptSessionInfo();
if (mSessionInfo != null) {
mAidlContext.id = mSessionInfo.getId();
mAidlContext.reason = OperationReason.BIOMETRIC_PROMPT;
return;
}
} else {
mSessionInfo = biometricContext.getKeyguardEntrySessionInfo();
if (mSessionInfo != null) {
mAidlContext.id = mSessionInfo.getId();
mAidlContext.reason = OperationReason.KEYGUARD;
return;
}
}
// no session

View File

@@ -133,10 +133,6 @@ public abstract class AuthenticationClient<T, O extends AuthenticateOptions>
binderDiedInternal(clearListener);
}
public boolean isBiometricPrompt() {
return getCookie() != 0;
}
public long getOperationId() {
return mOperationId;
}

View File

@@ -37,7 +37,7 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor {
protected final Supplier<T> mLazyDaemon;
@NonNull
private final OperationContextExt mOperationContext = new OperationContextExt();
private final OperationContextExt mOperationContext;
/**
* @param context system_server context
@@ -58,6 +58,7 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor {
super(context, token, listener, userId, owner, cookie, sensorId,
biometricLogger, biometricContext);
mLazyDaemon = lazyDaemon;
mOperationContext = new OperationContextExt(isBiometricPrompt());
}
@Nullable
@@ -85,6 +86,10 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor {
unsubscribeBiometricContext();
}
public boolean isBiometricPrompt() {
return getCookie() != 0;
}
protected OperationContextExt getOperationContext() {
return getBiometricContext().updateContext(mOperationContext, isCryptoOperation());
}

View File

@@ -80,7 +80,7 @@ public class BiometricContextProviderTest {
@Mock
private WindowManager mWindowManager;
private OperationContextExt mOpContext = new OperationContextExt();
private OperationContextExt mOpContext = new OperationContextExt(true);
private IBiometricContextListener mListener;
private BiometricContextProvider mProvider;
@@ -316,25 +316,6 @@ public class BiometricContextProviderTest {
assertThat(aidlContext.isAod).isEqualTo(false);
assertThat(aidlContext.isCrypto).isEqualTo(false);
for (int type : List.of(StatusBarManager.SESSION_BIOMETRIC_PROMPT,
StatusBarManager.SESSION_KEYGUARD)) {
final int id = 40 + type;
final boolean aod = (type & 1) == 0;
mListener.onDisplayStateChanged(aod ? AuthenticateOptions.DISPLAY_STATE_AOD
: AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN);
mSessionListener.onSessionStarted(type, InstanceId.fakeInstanceId(id));
context = mProvider.updateContext(mOpContext, false /* crypto */);
aidlContext = context.toAidlContext();
assertThat(context).isSameInstanceAs(mOpContext);
assertThat(aidlContext.id).isEqualTo(id);
assertThat(aidlContext.reason).isEqualTo(reason(type));
assertThat(aidlContext.isAod).isEqualTo(aod);
assertThat(aidlContext.isCrypto).isEqualTo(false);
mSessionListener.onSessionEnded(type, InstanceId.fakeInstanceId(id));
}
context = mProvider.updateContext(mOpContext, false /* crypto */);
aidlContext = context.toAidlContext();
assertThat(context).isSameInstanceAs(mOpContext);
@@ -344,6 +325,33 @@ public class BiometricContextProviderTest {
assertThat(aidlContext.isCrypto).isEqualTo(false);
}
@Test
public void testUpdateAllSessionTypes() throws RemoteException {
OperationContextExt context = mProvider.updateContext(mOpContext, false /* crypto */);
OperationContext aidlContext = context.toAidlContext();
for (int type : List.of(StatusBarManager.SESSION_BIOMETRIC_PROMPT,
StatusBarManager.SESSION_KEYGUARD)) {
final int id = 40 + type;
final boolean aod = (type & 1) == 0;
OperationContextExt opContext =
new OperationContextExt(type == StatusBarManager.SESSION_BIOMETRIC_PROMPT);
mListener.onDisplayStateChanged(aod ? AuthenticateOptions.DISPLAY_STATE_AOD
: AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN);
mSessionListener.onSessionStarted(type, InstanceId.fakeInstanceId(id));
context = mProvider.updateContext(opContext, false /* crypto */);
aidlContext = context.toAidlContext();
assertThat(context).isSameInstanceAs(opContext);
assertThat(aidlContext.id).isEqualTo(id);
assertThat(aidlContext.reason).isEqualTo(reason(type));
assertThat(aidlContext.isAod).isEqualTo(aod);
assertThat(aidlContext.isCrypto).isEqualTo(false);
mSessionListener.onSessionEnded(type, InstanceId.fakeInstanceId(id));
}
}
private static byte reason(int type) {
if (type == StatusBarManager.SESSION_BIOMETRIC_PROMPT) {
return OperationReason.BIOMETRIC_PROMPT;

View File

@@ -34,7 +34,7 @@ public class BiometricFrameworkStatsLoggerTest {
@Test
public void testConvertsWakeReason_whenEmpty() {
final OperationContextExt ctx = new OperationContextExt();
final OperationContextExt ctx = new OperationContextExt(false);
final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx);
final int[] reasonDetails = BiometricFrameworkStatsLogger
@@ -48,11 +48,11 @@ public class BiometricFrameworkStatsLoggerTest {
public void testConvertsWakeReason_whenPowerReason() {
final OperationContext context = new OperationContext();
context.wakeReason = WakeReason.WAKE_MOTION;
final OperationContextExt ctx = new OperationContextExt(context);
final OperationContextExt ctx = new OperationContextExt(context, false);
final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx);
final int[] reasonDetails = BiometricFrameworkStatsLogger
.toProtoWakeReasonDetails(new OperationContextExt(context));
.toProtoWakeReasonDetails(new OperationContextExt(context, false));
assertThat(reason).isEqualTo(BiometricsProtoEnums.WAKE_REASON_WAKE_MOTION);
assertThat(reasonDetails).isEmpty();
@@ -63,7 +63,7 @@ public class BiometricFrameworkStatsLoggerTest {
final OperationContext context = new OperationContext();
context.authenticateReason = AuthenticateReason.faceAuthenticateReason(
AuthenticateReason.Face.ASSISTANT_VISIBLE);
final OperationContextExt ctx = new OperationContextExt(context);
final OperationContextExt ctx = new OperationContextExt(context, false);
final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx);
final int[] reasonDetails = BiometricFrameworkStatsLogger
@@ -79,7 +79,7 @@ public class BiometricFrameworkStatsLoggerTest {
final OperationContext context = new OperationContext();
context.authenticateReason = AuthenticateReason.vendorAuthenticateReason(
new AuthenticateReason.Vendor());
final OperationContextExt ctx = new OperationContextExt(context);
final OperationContextExt ctx = new OperationContextExt(context, false);
final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx);
final int[] reasonDetails = BiometricFrameworkStatsLogger
@@ -96,7 +96,7 @@ public class BiometricFrameworkStatsLoggerTest {
context.wakeReason = WakeReason.WAKE_KEY;
context.authenticateReason = AuthenticateReason.faceAuthenticateReason(
AuthenticateReason.Face.PRIMARY_BOUNCER_SHOWN);
final OperationContextExt ctx = new OperationContextExt(context);
final OperationContextExt ctx = new OperationContextExt(context, false);
final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx);
final int[] reasonDetails = BiometricFrameworkStatsLogger
@@ -113,7 +113,7 @@ public class BiometricFrameworkStatsLoggerTest {
context.wakeReason = WakeReason.LID;
context.authenticateReason = AuthenticateReason.vendorAuthenticateReason(
new AuthenticateReason.Vendor());
final OperationContextExt ctx = new OperationContextExt(context);
final OperationContextExt ctx = new OperationContextExt(context, false);
final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx);
final int[] reasonDetails = BiometricFrameworkStatsLogger

View File

@@ -74,7 +74,7 @@ public class BiometricLoggerTest {
@Before
public void setUp() {
mOpContext = new OperationContextExt();
mOpContext = new OperationContextExt(false);
mContext.addMockSystemService(SensorManager.class, mSensorManager);
when(mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)).thenReturn(
new Sensor(new InputSensorInfo("", "", 0, 0, Sensor.TYPE_LIGHT, 0, 0, 0, 0, 0, 0,

View File

@@ -53,12 +53,12 @@ public class OperationContextExtTest {
@Test
public void hasAidlContext() {
OperationContextExt context = new OperationContextExt();
OperationContextExt context = new OperationContextExt(false);
assertThat(context.toAidlContext()).isNotNull();
final OperationContext aidlContext = newAidlContext();
context = new OperationContextExt(aidlContext);
context = new OperationContextExt(aidlContext, false);
assertThat(context.toAidlContext()).isSameInstanceAs(aidlContext);
final int id = 5;
@@ -79,7 +79,7 @@ public class OperationContextExtTest {
@Test
public void hasNoOrderWithoutSession() {
OperationContextExt context = new OperationContextExt();
OperationContextExt context = new OperationContextExt(false);
assertThat(context.getOrderAndIncrement()).isEqualTo(-1);
assertThat(context.getOrderAndIncrement()).isEqualTo(-1);
}
@@ -96,7 +96,7 @@ public class OperationContextExtTest {
);
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
final OperationContextExt context = new OperationContextExt(newAidlContext());
final OperationContextExt context = new OperationContextExt(newAidlContext(), true);
when(mBiometricContext.getDisplayState()).thenReturn(entry.getKey());
assertThat(context.update(mBiometricContext).getDisplayState())
.isEqualTo(entry.getValue());
@@ -136,7 +136,8 @@ public class OperationContextExtTest {
when(mBiometricContext.isDisplayOn()).thenReturn(true);
when(mBiometricContext.getDisplayState()).thenReturn(displayState);
final OperationContextExt context = new OperationContextExt(newAidlContext());
final OperationContextExt context = new OperationContextExt(newAidlContext(),
sessionType == OperationReason.BIOMETRIC_PROMPT);
assertThat(context.update(mBiometricContext)).isSameInstanceAs(context);