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

Commit d5fc30bf authored by Joe Bolinger's avatar Joe Bolinger
Browse files

Add initial plugin for contextual auth prototypes to support BP and bouncer.

Bug: 373600589
Test: atest AuthContainerViewTest AuthControllerTest
Flag: com.android.systemui.cont_auth_plugin
Change-Id: Ie0a24c63fd1cb0cca8beba13f0e4461fd216b4fc
parent 36867b8e
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -12,3 +12,10 @@ flag {
    purpose: PURPOSE_BUGFIX
  }
}

flag {
    name: "cont_auth_plugin"
    namespace: "biometrics_framework"
    description: "Plugin and related API hooks for contextual auth plugins"
    bug: "373600589"
}
+1 −0
Original line number Diff line number Diff line
@@ -667,6 +667,7 @@ open class AuthContainerViewTest : SysuiTestCase() {
            faceProps,
            wakefulnessLifecycle,
            userManager,
            null /* authContextPlugins */,
            lockPatternUtils,
            interactionJankMonitor,
            { promptSelectorInteractor },
+3 −1
Original line number Diff line number Diff line
@@ -117,6 +117,7 @@ import org.mockito.junit.MockitoRule;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Random;

@RunWith(AndroidJUnit4.class)
@@ -1187,7 +1188,8 @@ public class AuthControllerTest extends SysuiTestCase {
        TestableAuthController(Context context) {
            super(context, null /* applicationCoroutineScope */,
                    mExecution, mCommandQueue, mActivityTaskManager, mWindowManager,
                    mFingerprintManager, mFaceManager, () -> mUdfpsController, mDisplayManager,
                    mFingerprintManager, mFaceManager, Optional.empty(),
                    () -> mUdfpsController, mDisplayManager,
                    mWakefulnessLifecycle, mUserManager, mLockPatternUtils, () -> mUdfpsLogger,
                    () -> mLogContextInteractor, () -> mPromptSelectionInteractor,
                    () -> mCredentialViewModel, () -> mPromptViewModel, mInteractionJankMonitor,
+85 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.plugins

import android.os.IBinder
import android.view.View
import com.android.systemui.plugins.annotations.ProvidesInterface

/**
 * Plugin for experimental "Contextual Auth" features.
 *
 * These plugins will get raw access to low-level events about the user's environment, such as
 * moving in/out of trusted locations, connection status of trusted devices, auth attempts, etc.
 * They will also receive callbacks related to system events & transitions to enable prototypes on
 * sensitive surfaces like lock screen and BiometricPrompt.
 *
 * Note to rebuild the plugin jar run: m PluginDummyLib
 */
@ProvidesInterface(action = AuthContextPlugin.ACTION, version = AuthContextPlugin.VERSION)
interface AuthContextPlugin : Plugin {

    /**
     * Called in the background when the plugin is enabled.
     *
     * This is a good time to ask your friendly [saucier] to cook up something special. The
     * [Plugin.onCreate] can also be used for initialization.
     */
    fun activated(saucier: Saucier)

    /**
     * Called when a [SensitiveSurface] is first shown.
     *
     * This may be called repeatedly if the state of the surface changes after it is shown. For
     * example, [SensitiveSurface.BiometricPrompt.isCredential] will change if the user falls back
     * to a credential-based auth method.
     */
    fun onShowingSensitiveSurface(surface: SensitiveSurface)

    /**
     * Called when a [SensitiveSurface] sensitive surface is hidden.
     *
     * This method may still be called without [onShowingSensitiveSurface] in cases of rapid
     * dismissal and plugins implementations should typically be idempotent.
     */
    fun onHidingSensitiveSurface(surface: SensitiveSurface)

    companion object {
        /** Plugin action. */
        const val ACTION = "com.android.systemui.action.PLUGIN_AUTH_CONTEXT"
        /** Plugin version. */
        const val VERSION = 1
    }

    /** Information about a sensitive surface in the framework, which the Plugin may augment. */
    sealed interface SensitiveSurface {

        /** Information about the BiometricPrompt that is being shown to the user. */
        data class BiometricPrompt(val view: View? = null, val isCredential: Boolean = false) :
            SensitiveSurface

        /** Information about bouncer. */
        data class LockscreenBouncer(val view: View? = null) : SensitiveSurface
    }

    /** Ask for the special. */
    interface Saucier {

        /** What [flavor] would you like? */
        fun getSauce(flavor: String): IBinder?
    }
}
+5 −1
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.biometrics.AuthController.ScaleFactorProvider;
import com.android.systemui.biometrics.domain.interactor.PromptSelectorInteractor;
import com.android.systemui.biometrics.plugins.AuthContextPlugins;
import com.android.systemui.biometrics.shared.model.BiometricModalities;
import com.android.systemui.biometrics.shared.model.PromptKind;
import com.android.systemui.biometrics.ui.CredentialView;
@@ -132,6 +133,7 @@ public class AuthContainerView extends LinearLayout
    private final int mEffectiveUserId;
    private final IBinder mWindowToken = new Binder();
    private final ViewCaptureAwareWindowManager mWindowManager;
    @Nullable private final AuthContextPlugins mAuthContextPlugins;
    private final Interpolator mLinearOutSlowIn;
    private final LockPatternUtils mLockPatternUtils;
    private final WakefulnessLifecycle mWakefulnessLifecycle;
@@ -289,6 +291,7 @@ public class AuthContainerView extends LinearLayout
            @Nullable List<FaceSensorPropertiesInternal> faceProps,
            @NonNull WakefulnessLifecycle wakefulnessLifecycle,
            @NonNull UserManager userManager,
            @Nullable AuthContextPlugins authContextPlugins,
            @NonNull LockPatternUtils lockPatternUtils,
            @NonNull InteractionJankMonitor jankMonitor,
            @NonNull Provider<PromptSelectorInteractor> promptSelectorInteractorProvider,
@@ -306,6 +309,7 @@ public class AuthContainerView extends LinearLayout
        WindowManager wm = getContext().getSystemService(WindowManager.class);
        mWindowManager = new ViewCaptureAwareWindowManager(wm, lazyViewCapture,
                enableViewCaptureTracing());
        mAuthContextPlugins = authContextPlugins;
        mWakefulnessLifecycle = wakefulnessLifecycle;
        mApplicationCoroutineScope = applicationCoroutineScope;

@@ -446,7 +450,7 @@ public class AuthContainerView extends LinearLayout
        final CredentialViewModel vm = mCredentialViewModelProvider.get();
        vm.setAnimateContents(animateContents);
        ((CredentialView) mCredentialView).init(vm, this, mPanelController, animatePanel,
                mBiometricCallback);
                mBiometricCallback, mAuthContextPlugins);

        mLayout.addView(mCredentialView);
    }
Loading