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

Commit 45106a4b authored by Jeff Pu's avatar Jeff Pu
Browse files

Associate the session type in operation context with the client

Bug: 276271514
Test: atest android.server.biometrics.cts.BiometricsAtomsTests#testAuthenticateAtom -c
Change-Id: Ic85a279e437f5a0c553e658296e0745190d8202e
parent a63b22c0
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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,
+20 −16
Original line number Diff line number Diff line
@@ -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,19 +270,21 @@ public class OperationContextExt {
    }

    private void setFirstSessionId(@NonNull BiometricContext biometricContext) {
        mSessionInfo = biometricContext.getKeyguardEntrySessionInfo();
        if (mIsBP) {
            mSessionInfo = biometricContext.getBiometricPromptSessionInfo();
            if (mSessionInfo != null) {
                mAidlContext.id = mSessionInfo.getId();
            mAidlContext.reason = OperationReason.KEYGUARD;
                mAidlContext.reason = OperationReason.BIOMETRIC_PROMPT;
                return;
            }

        mSessionInfo = biometricContext.getBiometricPromptSessionInfo();
        } else {
            mSessionInfo = biometricContext.getKeyguardEntrySessionInfo();
            if (mSessionInfo != null) {
                mAidlContext.id = mSessionInfo.getId();
            mAidlContext.reason = OperationReason.BIOMETRIC_PROMPT;
                mAidlContext.reason = OperationReason.KEYGUARD;
                return;
            }
        }

        // no session
        mAidlContext.id = 0;
+0 −4
Original line number Diff line number Diff line
@@ -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;
    }
+6 −1
Original line number Diff line number Diff line
@@ -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());
    }
+19 −11
Original line number Diff line number Diff line
@@ -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,17 +316,33 @@ public class BiometricContextProviderTest {
        assertThat(aidlContext.isAod).isEqualTo(false);
        assertThat(aidlContext.isCrypto).isEqualTo(false);

        context = mProvider.updateContext(mOpContext, false /* crypto */);
        aidlContext = context.toAidlContext();
        assertThat(context).isSameInstanceAs(mOpContext);
        assertThat(aidlContext.id).isEqualTo(0);
        assertThat(aidlContext.reason).isEqualTo(OperationReason.UNKNOWN);
        assertThat(aidlContext.isAod).isEqualTo(false);
        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(mOpContext, false /* crypto */);
            context = mProvider.updateContext(opContext, false /* crypto */);
            aidlContext = context.toAidlContext();
            assertThat(context).isSameInstanceAs(mOpContext);
            assertThat(context).isSameInstanceAs(opContext);
            assertThat(aidlContext.id).isEqualTo(id);
            assertThat(aidlContext.reason).isEqualTo(reason(type));
            assertThat(aidlContext.isAod).isEqualTo(aod);
@@ -334,14 +350,6 @@ public class BiometricContextProviderTest {

            mSessionListener.onSessionEnded(type, InstanceId.fakeInstanceId(id));
        }

        context = mProvider.updateContext(mOpContext, false /* crypto */);
        aidlContext = context.toAidlContext();
        assertThat(context).isSameInstanceAs(mOpContext);
        assertThat(aidlContext.id).isEqualTo(0);
        assertThat(aidlContext.reason).isEqualTo(OperationReason.UNKNOWN);
        assertThat(aidlContext.isAod).isEqualTo(false);
        assertThat(aidlContext.isCrypto).isEqualTo(false);
    }

    private static byte reason(int type) {
Loading