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

Commit aec85f81 authored by Joe Bolinger's avatar Joe Bolinger Committed by Automerger Merge Worker
Browse files

Merge changes If03d8ee3,I701d9d6f,I715e0e53 into sc-dev am: 73ffe99b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15193088

Change-Id: I0296de3e3384cfef061cc889b4cf1136640471d8
parents c16a65d2 73ffe99b
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -90,6 +90,7 @@ public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView {
    }
    }


    @Modality private int mActiveSensorType = TYPE_FACE;
    @Modality private int mActiveSensorType = TYPE_FACE;
    @Nullable private ModalityListener mModalityListener;
    @Nullable private FingerprintSensorPropertiesInternal mFingerprintSensorProps;
    @Nullable private FingerprintSensorPropertiesInternal mFingerprintSensorProps;
    @Nullable private UdfpsDialogMeasureAdapter mUdfpsMeasureAdapter;
    @Nullable private UdfpsDialogMeasureAdapter mUdfpsMeasureAdapter;


@@ -115,6 +116,10 @@ public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView {
        return mFingerprintSensorProps.isAnyUdfpsType();
        return mFingerprintSensorProps.isAnyUdfpsType();
    }
    }


    void setModalityListener(@NonNull ModalityListener listener) {
        mModalityListener = listener;
    }

    void setFingerprintSensorProps(@NonNull FingerprintSensorPropertiesInternal sensorProps) {
    void setFingerprintSensorProps(@NonNull FingerprintSensorPropertiesInternal sensorProps) {
        mFingerprintSensorProps = sensorProps;
        mFingerprintSensorProps = sensorProps;
    }
    }
@@ -182,11 +187,16 @@ public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView {
    @Override
    @Override
    public void updateState(@BiometricState int newState) {
    public void updateState(@BiometricState int newState) {
        if (mState == STATE_HELP || mState == STATE_ERROR) {
        if (mState == STATE_HELP || mState == STATE_ERROR) {
            @Modality final int currentType = mActiveSensorType;
            mActiveSensorType = TYPE_FINGERPRINT;
            mActiveSensorType = TYPE_FINGERPRINT;


            setRequireConfirmation(false);
            setRequireConfirmation(false);
            mConfirmButton.setEnabled(false);
            mConfirmButton.setEnabled(false);
            mConfirmButton.setVisibility(View.GONE);
            mConfirmButton.setVisibility(View.GONE);

            if (mModalityListener != null && currentType != mActiveSensorType) {
                mModalityListener.onModalitySwitched(currentType, mActiveSensorType);
            }
        }
        }


        super.updateState(newState);
        super.updateState(newState);
+3 −0
Original line number Original line Diff line number Diff line
@@ -759,6 +759,9 @@ public abstract class AuthBiometricView extends LinearLayout {
            // Restore positive button(s) state
            // Restore positive button(s) state
            mConfirmButton.setVisibility(
            mConfirmButton.setVisibility(
                    mSavedState.getInt(AuthDialog.KEY_BIOMETRIC_CONFIRM_VISIBILITY));
                    mSavedState.getInt(AuthDialog.KEY_BIOMETRIC_CONFIRM_VISIBILITY));
            if (mConfirmButton.getVisibility() == View.GONE) {
                setRequireConfirmation(false);
            }
            mTryAgainButton.setVisibility(
            mTryAgainButton.setVisibility(
                    mSavedState.getInt(AuthDialog.KEY_BIOMETRIC_TRY_AGAIN_VISIBILITY));
                    mSavedState.getInt(AuthDialog.KEY_BIOMETRIC_TRY_AGAIN_VISIBILITY));


+34 −17
Original line number Original line Diff line number Diff line
@@ -24,7 +24,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.content.Context;
import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.PixelFormat;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricAuthenticator.Modality;
import android.hardware.biometrics.BiometricAuthenticator.Modality;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.PromptInfo;
import android.hardware.biometrics.PromptInfo;
@@ -37,6 +36,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Looper;
import android.os.UserManager;
import android.os.UserManager;
import android.util.Log;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.LayoutInflater;
@@ -356,6 +356,12 @@ public class AuthContainerView extends LinearLayout
                            (AuthBiometricFaceToFingerprintView) factory.inflate(
                            (AuthBiometricFaceToFingerprintView) factory.inflate(
                                    R.layout.auth_biometric_face_to_fingerprint_view, null, false);
                                    R.layout.auth_biometric_face_to_fingerprint_view, null, false);
                    faceToFingerprintView.setFingerprintSensorProps(fingerprintSensorProps);
                    faceToFingerprintView.setFingerprintSensorProps(fingerprintSensorProps);
                    faceToFingerprintView.setModalityListener(new ModalityListener() {
                        @Override
                        public void onModalitySwitched(int oldModality, int newModality) {
                            maybeUpdatePositionForUdfps(true /* invalidate */);
                        }
                    });
                    mBiometricView = faceToFingerprintView;
                    mBiometricView = faceToFingerprintView;
                } else {
                } else {
                    Log.e(TAG, "Fingerprint props not found for sensor ID: " + fingerprintSensorId);
                    Log.e(TAG, "Fingerprint props not found for sensor ID: " + fingerprintSensorId);
@@ -470,6 +476,11 @@ public class AuthContainerView extends LinearLayout
        mPanelController.setContainerDimensions(getMeasuredWidth(), getMeasuredHeight());
        mPanelController.setContainerDimensions(getMeasuredWidth(), getMeasuredHeight());
    }
    }


    @Override
    public void onOrientationChanged() {
        maybeUpdatePositionForUdfps(true /* invalidate */);
    }

    @Override
    @Override
    public void onAttachedToWindow() {
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        super.onAttachedToWindow();
@@ -489,9 +500,7 @@ public class AuthContainerView extends LinearLayout
                    + mConfig.mPromptInfo.getAuthenticators());
                    + mConfig.mPromptInfo.getAuthenticators());
        }
        }


        if (shouldUpdatePositionForUdfps()) {
        maybeUpdatePositionForUdfps(false /* invalidate */);
            updatePositionForUdfps();
        }


        if (mConfig.mSkipIntro) {
        if (mConfig.mSkipIntro) {
            mContainerState = STATE_SHOWING;
            mContainerState = STATE_SHOWING;
@@ -536,14 +545,14 @@ public class AuthContainerView extends LinearLayout
        }
        }
    }
    }


    private boolean shouldUpdatePositionForUdfps() {
    private static boolean shouldUpdatePositionForUdfps(@NonNull View view) {
        if (mBiometricView instanceof AuthBiometricUdfpsView) {
        if (view instanceof AuthBiometricUdfpsView) {
            return true;
            return true;
        }
        }


        if (mBiometricView instanceof AuthBiometricFaceToFingerprintView) {
        if (view instanceof AuthBiometricFaceToFingerprintView) {
            AuthBiometricFaceToFingerprintView faceToFingerprintView =
            AuthBiometricFaceToFingerprintView faceToFingerprintView =
                    (AuthBiometricFaceToFingerprintView) mBiometricView;
                    (AuthBiometricFaceToFingerprintView) view;
            return faceToFingerprintView.getActiveSensorType() == TYPE_FINGERPRINT
            return faceToFingerprintView.getActiveSensorType() == TYPE_FINGERPRINT
                    && faceToFingerprintView.isFingerprintUdfps();
                    && faceToFingerprintView.isFingerprintUdfps();
        }
        }
@@ -551,8 +560,16 @@ public class AuthContainerView extends LinearLayout
        return false;
        return false;
    }
    }


    private void updatePositionForUdfps() {
    private boolean maybeUpdatePositionForUdfps(boolean invalidate) {
        final int displayRotation = getDisplay().getRotation();
        final Display display = getDisplay();
        if (display == null) {
            return false;
        }
        if (!shouldUpdatePositionForUdfps(mBiometricView)) {
            return false;
        }

        final int displayRotation = display.getRotation();
        switch (displayRotation) {
        switch (displayRotation) {
            case Surface.ROTATION_0:
            case Surface.ROTATION_0:
                mPanelController.setPosition(AuthPanelController.POSITION_BOTTOM);
                mPanelController.setPosition(AuthPanelController.POSITION_BOTTOM);
@@ -576,6 +593,13 @@ public class AuthContainerView extends LinearLayout
                setScrollViewGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
                setScrollViewGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
                break;
                break;
        }
        }

        if (invalidate) {
            mPanelView.invalidateOutline();
            mBiometricView.requestLayout();
        }

        return true;
    }
    }


    private void setScrollViewGravity(int gravity) {
    private void setScrollViewGravity(int gravity) {
@@ -626,13 +650,6 @@ public class AuthContainerView extends LinearLayout
    @Override
    @Override
    public void onAuthenticationFailed(@Modality int modality, String failureReason) {
    public void onAuthenticationFailed(@Modality int modality, String failureReason) {
        mBiometricView.onAuthenticationFailed(modality, failureReason);
        mBiometricView.onAuthenticationFailed(modality, failureReason);
        if (mBiometricView instanceof AuthBiometricFaceToFingerprintView
                && ((AuthBiometricFaceToFingerprintView) mBiometricView).isFingerprintUdfps()
                && modality == BiometricAuthenticator.TYPE_FACE) {
            updatePositionForUdfps();
            mPanelView.invalidateOutline();
            mBiometricView.requestLayout();
        }
    }
    }


    @Override
    @Override
+56 −28
Original line number Original line Diff line number Diff line
@@ -30,7 +30,6 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.content.res.Configuration;
import android.graphics.PointF;
import android.graphics.PointF;
import android.graphics.RectF;
import android.hardware.biometrics.BiometricAuthenticator.Modality;
import android.hardware.biometrics.BiometricAuthenticator.Modality;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricManager.Authenticators;
import android.hardware.biometrics.BiometricManager.Authenticators;
@@ -49,7 +48,10 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Looper;
import android.os.RemoteException;
import android.os.RemoteException;
import android.util.Log;
import android.util.Log;
import android.view.Display;
import android.view.MotionEvent;
import android.view.MotionEvent;
import android.view.OrientationEventListener;
import android.view.Surface;
import android.view.WindowManager;
import android.view.WindowManager;


import com.android.internal.R;
import com.android.internal.R;
@@ -97,17 +99,15 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
    @VisibleForTesting
    @VisibleForTesting
    AuthDialog mCurrentDialog;
    AuthDialog mCurrentDialog;


    private WindowManager mWindowManager;
    @NonNull private final WindowManager mWindowManager;
    @Nullable
    @Nullable private UdfpsController mUdfpsController;
    private UdfpsController mUdfpsController;
    @Nullable private IUdfpsHbmListener mUdfpsHbmListener;
    @Nullable
    @Nullable private SidefpsController mSidefpsController;
    private IUdfpsHbmListener mUdfpsHbmListener;
    @Nullable
    private SidefpsController mSidefpsController;
    @VisibleForTesting
    @VisibleForTesting
    TaskStackListener mTaskStackListener;
    TaskStackListener mTaskStackListener;
    @VisibleForTesting
    @VisibleForTesting
    IBiometricSysuiReceiver mReceiver;
    IBiometricSysuiReceiver mReceiver;
    @NonNull private final BiometricOrientationEventListener mOrientationListener;
    @Nullable private final List<FaceSensorPropertiesInternal> mFaceProps;
    @Nullable private final List<FaceSensorPropertiesInternal> mFaceProps;
    @Nullable private List<FingerprintSensorPropertiesInternal> mFpProps;
    @Nullable private List<FingerprintSensorPropertiesInternal> mFpProps;
    @Nullable private List<FingerprintSensorPropertiesInternal> mUdfpsProps;
    @Nullable private List<FingerprintSensorPropertiesInternal> mUdfpsProps;
@@ -120,6 +120,42 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
        }
        }
    }
    }


    private class BiometricOrientationEventListener extends OrientationEventListener {
        @Surface.Rotation private int mLastRotation;

        BiometricOrientationEventListener(Context context) {
            super(context);
            mLastRotation = context.getDisplay().getRotation();
        }

        @Override
        public void onOrientationChanged(int orientation) {
            if (orientation == ORIENTATION_UNKNOWN) {
                return;
            }

            final Display display = mContext.getDisplay();
            if (display == null) {
                return;
            }

            final int rotation = display.getRotation();
            if (mLastRotation != rotation) {
                mLastRotation = rotation;

                if (mCurrentDialog != null) {
                    mCurrentDialog.onOrientationChanged();
                }
                if (mUdfpsController != null) {
                    mUdfpsController.onOrientationChanged();
                }
                if (mSidefpsController != null) {
                    mSidefpsController.onOrientationChanged();
                }
            }
        }
    }

    @NonNull
    @NonNull
    private final IFingerprintAuthenticatorsRegisteredCallback
    private final IFingerprintAuthenticatorsRegisteredCallback
            mFingerprintAuthenticatorsRegisteredCallback =
            mFingerprintAuthenticatorsRegisteredCallback =
@@ -164,6 +200,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
                Log.w(TAG, "ACTION_CLOSE_SYSTEM_DIALOGS received");
                Log.w(TAG, "ACTION_CLOSE_SYSTEM_DIALOGS received");
                mCurrentDialog.dismissWithoutCallback(true /* animate */);
                mCurrentDialog.dismissWithoutCallback(true /* animate */);
                mCurrentDialog = null;
                mCurrentDialog = null;
                mOrientationListener.disable();


                try {
                try {
                    if (mReceiver != null) {
                    if (mReceiver != null) {
@@ -192,6 +229,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
                        Log.w(TAG, "Evicting client due to: " + topPackage);
                        Log.w(TAG, "Evicting client due to: " + topPackage);
                        mCurrentDialog.dismissWithoutCallback(true /* animate */);
                        mCurrentDialog.dismissWithoutCallback(true /* animate */);
                        mCurrentDialog = null;
                        mCurrentDialog = null;
                        mOrientationListener.disable();

                        if (mReceiver != null) {
                        if (mReceiver != null) {
                            mReceiver.onDialogDismissed(
                            mReceiver.onDialogDismissed(
                                    BiometricPrompt.DISMISSED_REASON_USER_CANCEL,
                                    BiometricPrompt.DISMISSED_REASON_USER_CANCEL,
@@ -339,15 +378,6 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
        }
        }
    }
    }


    /**
     * @return where the UDFPS exists on the screen in pixels in portrait mode.
     */
    @Nullable public RectF getUdfpsRegion() {
        return mUdfpsController == null
                ? null
                : mUdfpsController.getSensorLocation();
    }

    /**
    /**
     * @return where the UDFPS exists on the screen in pixels in portrait mode.
     * @return where the UDFPS exists on the screen in pixels in portrait mode.
     */
     */
@@ -422,8 +452,10 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
    }
    }


    @Inject
    @Inject
    public AuthController(Context context, CommandQueue commandQueue,
    public AuthController(Context context,
            CommandQueue commandQueue,
            ActivityTaskManager activityTaskManager,
            ActivityTaskManager activityTaskManager,
            @NonNull WindowManager windowManager,
            @Nullable FingerprintManager fingerprintManager,
            @Nullable FingerprintManager fingerprintManager,
            @Nullable FaceManager faceManager,
            @Nullable FaceManager faceManager,
            Provider<UdfpsController> udfpsControllerFactory,
            Provider<UdfpsController> udfpsControllerFactory,
@@ -435,6 +467,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
        mFaceManager = faceManager;
        mFaceManager = faceManager;
        mUdfpsControllerFactory = udfpsControllerFactory;
        mUdfpsControllerFactory = udfpsControllerFactory;
        mSidefpsControllerFactory = sidefpsControllerFactory;
        mSidefpsControllerFactory = sidefpsControllerFactory;
        mWindowManager = windowManager;
        mOrientationListener = new BiometricOrientationEventListener(context);


        mFaceProps = mFaceManager != null ? mFaceManager.getSensorPropertiesInternal() : null;
        mFaceProps = mFaceManager != null ? mFaceManager.getSensorPropertiesInternal() : null;


@@ -462,7 +496,6 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
    @Override
    @Override
    public void start() {
    public void start() {
        mCommandQueue.addCallback(this);
        mCommandQueue.addCallback(this);
        mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);


        if (mFingerprintManager != null) {
        if (mFingerprintManager != null) {
            mFingerprintManager.addAuthenticatorsRegisteredCallback(
            mFingerprintManager.addAuthenticatorsRegisteredCallback(
@@ -630,6 +663,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
        // BiometricService will have already sent the callback to the client in this case.
        // BiometricService will have already sent the callback to the client in this case.
        // This avoids a round trip to SystemUI. So, just dismiss the dialog and we're done.
        // This avoids a round trip to SystemUI. So, just dismiss the dialog and we're done.
        mCurrentDialog = null;
        mCurrentDialog = null;
        mOrientationListener.disable();
    }
    }


    /**
    /**
@@ -701,6 +735,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
        mReceiver = (IBiometricSysuiReceiver) args.arg2;
        mReceiver = (IBiometricSysuiReceiver) args.arg2;
        mCurrentDialog = newDialog;
        mCurrentDialog = newDialog;
        mCurrentDialog.show(mWindowManager, savedState);
        mCurrentDialog.show(mWindowManager, savedState);
        mOrientationListener.enable();
    }
    }


    private void onDialogDismissed(@DismissedReason int reason) {
    private void onDialogDismissed(@DismissedReason int reason) {
@@ -710,20 +745,12 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
        }
        }
        mReceiver = null;
        mReceiver = null;
        mCurrentDialog = null;
        mCurrentDialog = null;
        mOrientationListener.disable();
    }
    }


    @Override
    @Override
    protected void onConfigurationChanged(Configuration newConfig) {
    protected void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        super.onConfigurationChanged(newConfig);
        // UdfpsController is not BiometricPrompt-specific. It can be active for keyguard or
        // enrollment.
        if (mUdfpsController != null) {
            mUdfpsController.onConfigurationChanged();
        }

        if (mSidefpsController != null) {
            mSidefpsController.onConfigurationChanged();
        }


        // Save the state of the current dialog (buttons showing, etc)
        // Save the state of the current dialog (buttons showing, etc)
        if (mCurrentDialog != null) {
        if (mCurrentDialog != null) {
@@ -731,6 +758,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
            mCurrentDialog.onSaveState(savedState);
            mCurrentDialog.onSaveState(savedState);
            mCurrentDialog.dismissWithoutCallback(false /* animate */);
            mCurrentDialog.dismissWithoutCallback(false /* animate */);
            mCurrentDialog = null;
            mCurrentDialog = null;
            mOrientationListener.disable();


            // Only show the dialog if necessary. If it was animating out, the dialog is supposed
            // Only show the dialog if necessary. If it was animating out, the dialog is supposed
            // to send its pending callback immediately.
            // to send its pending callback immediately.
+8 −0
Original line number Original line Diff line number Diff line
@@ -156,4 +156,12 @@ public interface AuthDialog {
     * @return true if device credential is allowed.
     * @return true if device credential is allowed.
     */
     */
    boolean isAllowDeviceCredentials();
    boolean isAllowDeviceCredentials();

    /**
     * Called when the device's orientation changed and the dialog may need to do another
     * layout. This is most relevant to UDFPS since configuration changes are not sent by
     * the framework in equivalent cases (landscape to reverse landscape) but the dialog
     * must remain fixed on the physical sensor location.
     */
    void onOrientationChanged();
}
}
Loading