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

Commit 4c5bbf14 authored by Shawn Lin's avatar Shawn Lin
Browse files

Support force fingerprint reenrollment

Add a new fingerprint constant FINGERPRINT_ACQUIRED_RE_ENROLL_FORCED and
rename existing FINGERPRINT_ACQUIRED_RE_ENROLL to
FINGERPRINT_ACQUIRED_RE_ENROLL_OPTIONAL.

When force reenroll is received, only show the positive button in the
dialog.

Bug: 325516143
Test: atest BiometricNotificationDialogFactoryTest
            BiometricNotificationServiceTest
Flag: NONE

Change-Id: Ie7c1bb0df144172c5a202fcd74f4b3715b57869b
parent 58de75ce
Loading
Loading
Loading
Loading
+9 −2
Original line number Original line Diff line number Diff line
@@ -221,7 +221,8 @@ public interface BiometricFingerprintConstants {
            FINGERPRINT_ACQUIRED_IMMOBILE,
            FINGERPRINT_ACQUIRED_IMMOBILE,
            FINGERPRINT_ACQUIRED_TOO_BRIGHT,
            FINGERPRINT_ACQUIRED_TOO_BRIGHT,
            FINGERPRINT_ACQUIRED_POWER_PRESSED,
            FINGERPRINT_ACQUIRED_POWER_PRESSED,
            FINGERPRINT_ACQUIRED_RE_ENROLL})
            FINGERPRINT_ACQUIRED_RE_ENROLL_OPTIONAL,
            FINGERPRINT_ACQUIRED_RE_ENROLL_FORCED})
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
    @interface FingerprintAcquired {}
    @interface FingerprintAcquired {}


@@ -316,7 +317,13 @@ public interface BiometricFingerprintConstants {
     * This message is sent to encourage the user to re-enroll their fingerprints.
     * This message is sent to encourage the user to re-enroll their fingerprints.
     * @hide
     * @hide
     */
     */
    int FINGERPRINT_ACQUIRED_RE_ENROLL = 12;
    int FINGERPRINT_ACQUIRED_RE_ENROLL_OPTIONAL = 12;

    /**
     * This message is sent to force the user to re-enroll their fingerprints.
     * @hide
     */
    int FINGERPRINT_ACQUIRED_RE_ENROLL_FORCED = 13;


    /**
    /**
     * @hide
     * @hide
+6 −2
Original line number Original line Diff line number Diff line
@@ -35,6 +35,8 @@ public class BiometricNotificationBroadcastReceiver extends BroadcastReceiver {
    static final String ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG =
    static final String ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG =
            "fingerprint_action_show_reenroll_dialog";
            "fingerprint_action_show_reenroll_dialog";


    static final String EXTRA_IS_REENROLL_FORCED = "is_reenroll_forced";

    private static final String TAG = "BiometricNotificationBroadcastReceiver";
    private static final String TAG = "BiometricNotificationBroadcastReceiver";


    private final Context mContext;
    private final Context mContext;
@@ -56,14 +58,16 @@ public class BiometricNotificationBroadcastReceiver extends BroadcastReceiver {
                mNotificationDialogFactory.createReenrollDialog(
                mNotificationDialogFactory.createReenrollDialog(
                        mContext.getUserId(),
                        mContext.getUserId(),
                        mContext::startActivity,
                        mContext::startActivity,
                        BiometricSourceType.FACE)
                        BiometricSourceType.FACE,
                        false)
                        .show();
                        .show();
                break;
                break;
            case ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG:
            case ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG:
                mNotificationDialogFactory.createReenrollDialog(
                mNotificationDialogFactory.createReenrollDialog(
                        mContext.getUserId(),
                        mContext.getUserId(),
                        mContext::startActivity,
                        mContext::startActivity,
                        BiometricSourceType.FINGERPRINT)
                        BiometricSourceType.FINGERPRINT,
                        intent.getBooleanExtra(EXTRA_IS_REENROLL_FORCED, false))
                        .show();
                        .show();
                break;
                break;
            default:
            default:
+9 −5
Original line number Original line Diff line number Diff line
@@ -29,13 +29,12 @@ import android.hardware.fingerprint.FingerprintManager;
import android.provider.Settings;
import android.provider.Settings;
import android.util.Log;
import android.util.Log;


import com.android.systemui.res.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.phone.SystemUIDialog;


import javax.inject.Inject;
import javax.inject.Inject;
import javax.inject.Provider;


/**
/**
 * Manages the creation of dialogs to be shown for biometric re enroll notifications.
 * Manages the creation of dialogs to be shown for biometric re enroll notifications.
@@ -61,7 +60,8 @@ public class BiometricNotificationDialogFactory {
    }
    }


    Dialog createReenrollDialog(
    Dialog createReenrollDialog(
            int userId, ActivityStarter activityStarter, BiometricSourceType biometricSourceType) {
            int userId, ActivityStarter activityStarter, BiometricSourceType biometricSourceType,
            boolean isReenrollForced) {
        SystemUIDialog sysuiDialog = mSystemUIDialogFactory.create();
        SystemUIDialog sysuiDialog = mSystemUIDialogFactory.create();
        if (biometricSourceType == BiometricSourceType.FACE) {
        if (biometricSourceType == BiometricSourceType.FACE) {
            sysuiDialog.setTitle(mResources.getString(R.string.face_re_enroll_dialog_title));
            sysuiDialog.setTitle(mResources.getString(R.string.face_re_enroll_dialog_title));
@@ -80,8 +80,12 @@ public class BiometricNotificationDialogFactory {
        sysuiDialog.setPositiveButton(R.string.biometric_re_enroll_dialog_confirm,
        sysuiDialog.setPositiveButton(R.string.biometric_re_enroll_dialog_confirm,
                (dialog, which) -> onReenrollDialogConfirm(
                (dialog, which) -> onReenrollDialogConfirm(
                        userId, biometricSourceType, activityStarter));
                        userId, biometricSourceType, activityStarter));
        if (!isReenrollForced) {
            sysuiDialog.setNegativeButton(R.string.biometric_re_enroll_dialog_cancel,
            sysuiDialog.setNegativeButton(R.string.biometric_re_enroll_dialog_cancel,
                (dialog, which) -> {});
                    (dialog, which) -> {
                    });
        }
        sysuiDialog.setCanceledOnTouchOutside(!isReenrollForced);
        return sysuiDialog;
        return sysuiDialog;
    }
    }


+15 −6
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.biometrics;
package com.android.systemui.biometrics;


import static android.app.PendingIntent.FLAG_IMMUTABLE;
import static android.app.PendingIntent.FLAG_IMMUTABLE;
import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;


import static com.android.systemui.biometrics.BiometricNotificationBroadcastReceiver.ACTION_SHOW_FACE_REENROLL_DIALOG;
import static com.android.systemui.biometrics.BiometricNotificationBroadcastReceiver.ACTION_SHOW_FACE_REENROLL_DIALOG;
import static com.android.systemui.biometrics.BiometricNotificationBroadcastReceiver.ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG;
import static com.android.systemui.biometrics.BiometricNotificationBroadcastReceiver.ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG;
@@ -43,8 +44,8 @@ import android.util.Log;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.CoreStartable;
import com.android.systemui.CoreStartable;
import com.android.systemui.res.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.KeyguardStateController;


import java.util.Optional;
import java.util.Optional;
@@ -80,6 +81,8 @@ public class BiometricNotificationService implements CoreStartable {
    private boolean mFingerprintNotificationQueued;
    private boolean mFingerprintNotificationQueued;
    private boolean mFingerprintReenrollRequired;
    private boolean mFingerprintReenrollRequired;


    private boolean mIsFingerprintReenrollForced;

    private final KeyguardStateController.Callback mKeyguardStateControllerCallback =
    private final KeyguardStateController.Callback mKeyguardStateControllerCallback =
            new KeyguardStateController.Callback() {
            new KeyguardStateController.Callback() {
                private boolean mIsShowing = true;
                private boolean mIsShowing = true;
@@ -118,9 +121,11 @@ public class BiometricNotificationService implements CoreStartable {
                public void onBiometricHelp(int msgId, String helpString,
                public void onBiometricHelp(int msgId, String helpString,
                        BiometricSourceType biometricSourceType) {
                        BiometricSourceType biometricSourceType) {
                    if (biometricSourceType == BiometricSourceType.FINGERPRINT
                    if (biometricSourceType == BiometricSourceType.FINGERPRINT
                            && mFingerprintReEnrollNotification.isFingerprintReEnrollRequired(
                            && mFingerprintReEnrollNotification.isFingerprintReEnrollRequested(
                                    msgId)) {
                                    msgId)) {
                        mFingerprintReenrollRequired = true;
                        mFingerprintReenrollRequired = true;
                        mIsFingerprintReenrollForced =
                                mFingerprintReEnrollNotification.isFingerprintReEnrollForced(msgId);
                    }
                    }
                }
                }
            };
            };
@@ -191,7 +196,7 @@ public class BiometricNotificationService implements CoreStartable {
        final String name = mContext.getString(R.string.face_re_enroll_notification_name);
        final String name = mContext.getString(R.string.face_re_enroll_notification_name);
        mHandler.postDelayed(
        mHandler.postDelayed(
                () -> showNotification(ACTION_SHOW_FACE_REENROLL_DIALOG, title, content, name,
                () -> showNotification(ACTION_SHOW_FACE_REENROLL_DIALOG, title, content, name,
                        FACE_NOTIFICATION_ID),
                        FACE_NOTIFICATION_ID, false),
                SHOW_NOTIFICATION_DELAY_MS);
                SHOW_NOTIFICATION_DELAY_MS);
    }
    }


@@ -204,12 +209,12 @@ public class BiometricNotificationService implements CoreStartable {
        final String name = mContext.getString(R.string.fingerprint_re_enroll_notification_name);
        final String name = mContext.getString(R.string.fingerprint_re_enroll_notification_name);
        mHandler.postDelayed(
        mHandler.postDelayed(
                () -> showNotification(ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG, title, content,
                () -> showNotification(ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG, title, content,
                        name, FINGERPRINT_NOTIFICATION_ID),
                        name, FINGERPRINT_NOTIFICATION_ID, mIsFingerprintReenrollForced),
                SHOW_NOTIFICATION_DELAY_MS);
                SHOW_NOTIFICATION_DELAY_MS);
    }
    }


    private void showNotification(String action, CharSequence title, CharSequence content,
    private void showNotification(String action, CharSequence title, CharSequence content,
            CharSequence name, int notificationId) {
            CharSequence name, int notificationId, boolean isReenrollForced) {
        if (notificationId == FACE_NOTIFICATION_ID) {
        if (notificationId == FACE_NOTIFICATION_ID) {
            mFaceNotificationQueued = false;
            mFaceNotificationQueued = false;
        } else if (notificationId == FINGERPRINT_NOTIFICATION_ID) {
        } else if (notificationId == FINGERPRINT_NOTIFICATION_ID) {
@@ -223,8 +228,12 @@ public class BiometricNotificationService implements CoreStartable {
        }
        }


        final Intent onClickIntent = new Intent(action);
        final Intent onClickIntent = new Intent(action);
        onClickIntent.putExtra(BiometricNotificationBroadcastReceiver.EXTRA_IS_REENROLL_FORCED,
                isReenrollForced);

        final PendingIntent onClickPendingIntent = PendingIntent.getBroadcastAsUser(mContext,
        final PendingIntent onClickPendingIntent = PendingIntent.getBroadcastAsUser(mContext,
                0 /* requestCode */, onClickIntent, FLAG_IMMUTABLE, UserHandle.CURRENT);
                0 /* requestCode */, onClickIntent, FLAG_IMMUTABLE | FLAG_UPDATE_CURRENT,
                UserHandle.CURRENT);


        final Notification notification = new Notification.Builder(mContext, CHANNEL_ID)
        final Notification notification = new Notification.Builder(mContext, CHANNEL_ID)
                .setCategory(Notification.CATEGORY_SYSTEM)
                .setCategory(Notification.CATEGORY_SYSTEM)
+11 −2
Original line number Original line Diff line number Diff line
@@ -23,7 +23,16 @@ import android.hardware.biometrics.BiometricFingerprintConstants;
 */
 */
public interface FingerprintReEnrollNotification {
public interface FingerprintReEnrollNotification {
    //TODO: Remove this class and add a constant in the HAL API instead (b/281841852)
    //TODO: Remove this class and add a constant in the HAL API instead (b/281841852)
    /** Returns true if msgId corresponds to FINGERPRINT_ACQUIRED_RE_ENROLL. */
    /**
    boolean isFingerprintReEnrollRequired(
     * Returns true if msgId corresponds to FINGERPRINT_ACQUIRED_RE_ENROLL_OPTIONAL or
     * FINGERPRINT_ACQUIRED_RE_ENROLL_FORCED.
     */
    boolean isFingerprintReEnrollRequested(
            @BiometricFingerprintConstants.FingerprintAcquired int msgId);

    /**
     * Returns true if msgId corresponds to FINGERPRINT_ACQUIRED_RE_ENROLL_FORCED.
     */
    boolean isFingerprintReEnrollForced(
            @BiometricFingerprintConstants.FingerprintAcquired int msgId);
            @BiometricFingerprintConstants.FingerprintAcquired int msgId);
}
}
Loading