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

Commit 47082920 authored by Diya Bera's avatar Diya Bera
Browse files

Add mandatory biometric prompt to platform surfaces (3/N)

1. Power off

Flag: android.hardware.biometrics.Flags.MANDATORY_BIOMETRICS
Bug: 339910718
Test: atest GlobalActionsDialogLiteTest

Change-Id: Icd024c52b3e4ecc5a3800215e8e0181147b468ce
parent a514bd3b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -722,6 +722,9 @@
    <!-- label for screenshot item in power menu [CHAR LIMIT=24]-->
    <string name="global_action_screenshot">Screenshot</string>

    <!-- description for mandatory biometrics prompt -->
    <string name="identity_check_biometric_prompt_description">This is needed since Identity Check is on</string>

    <!-- Take bug report menu title [CHAR LIMIT=30] -->
    <string name="bugreport_title">Bug report</string>
    <!-- Message in bugreport dialog describing what it does [CHAR LIMIT=NONE] -->
+1 −0
Original line number Diff line number Diff line
@@ -1918,6 +1918,7 @@
  <java-symbol type="string" name="global_action_voice_assist" />
  <java-symbol type="string" name="global_action_assist" />
  <java-symbol type="string" name="global_action_screenshot" />
  <java-symbol type="string" name="identity_check_biometric_prompt_description" />
  <java-symbol type="string" name="invalidPuk" />
  <java-symbol type="string" name="lockscreen_carrier_default" />
  <java-symbol type="style" name="Animation.LockScreen" />
+1 −0
Original line number Diff line number Diff line
@@ -92,5 +92,6 @@
        <permission name="android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS" />
        <permission name="android.permission.CONTROL_UI_TRACING" />
        <permission name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND" />
        <permission name="android.permission.SET_BIOMETRIC_DIALOG_ADVANCED" />
    </privapp-permissions>
</permissions>
+2 −0
Original line number Diff line number Diff line
@@ -373,6 +373,8 @@
    <!-- Listen to (dis-)connection of external displays and enable / disable them. -->
    <uses-permission android:name="android.permission.MANAGE_DISPLAYS" />

    <uses-permission android:name="android.permission.SET_BIOMETRIC_DIALOG_ADVANCED" />

    <protected-broadcast android:name="com.android.settingslib.action.REGISTER_SLICE_RECEIVER" />
    <protected-broadcast android:name="com.android.settingslib.action.UNREGISTER_SLICE_RECEIVER" />
    <protected-broadcast android:name="com.android.settings.flashlight.action.FLASHLIGHT_CHANGED" />
+56 −0
Original line number Diff line number Diff line
@@ -51,10 +51,14 @@ import android.content.res.Resources;
import android.database.ContentObserver;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricPrompt;
import android.hardware.biometrics.Flags;
import android.media.AudioManager;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
@@ -857,6 +861,29 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
            if (ActivityManager.isUserAMonkey()) {
                return;
            }
            if (Flags.mandatoryBiometrics()
                    && requestBiometricAuthenticationForMandatoryBiometrics()) {
                launchBiometricPromptForMandatoryBiometrics(
                        new BiometricPrompt.AuthenticationCallback() {
                            @Override
                            public void onAuthenticationError(int errorCode,
                                    CharSequence errString) {
                                super.onAuthenticationError(errorCode, errString);
                            }

                            @Override
                            public void onAuthenticationSucceeded(
                                    BiometricPrompt.AuthenticationResult result) {
                                super.onAuthenticationSucceeded(result);
                                shutDown();
                            }
                        });
            } else {
                shutDown();
            }
        }

        private void shutDown() {
            mUiEventLogger.log(GlobalActionsEvent.GA_SHUTDOWN_PRESS);
            // shutdown by making sure radio and power are handled accordingly.
            mWindowManagerFuncs.shutdown();
@@ -2260,6 +2287,35 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
        return mLifecycle;
    }

    @VisibleForTesting
    void launchBiometricPromptForMandatoryBiometrics(
            BiometricPrompt.AuthenticationCallback authenticationCallback) {
        final CancellationSignal cancellationSignal = new CancellationSignal();
        final BiometricPrompt biometricPrompt = new BiometricPrompt.Builder(mContext)
                .setAllowedAuthenticators(BiometricManager.Authenticators.MANDATORY_BIOMETRICS)
                .setUseDefaultTitle()
                .setDescription(mContext.getString(
                        R.string.identity_check_biometric_prompt_description))
                .setNegativeButton(mContext.getString(R.string.cancel), mContext.getMainExecutor(),
                        (dialog, which) -> cancellationSignal.cancel())
                .setAllowBackgroundAuthentication(true)
                .build();
        biometricPrompt.authenticate(cancellationSignal, mContext.getMainExecutor(),
                authenticationCallback);
    }

    private boolean requestBiometricAuthenticationForMandatoryBiometrics() {
        final BiometricManager biometricManager =
                (BiometricManager) mContext.getSystemService(Context.BIOMETRIC_SERVICE);
        if (biometricManager == null) {
            Log.e(TAG, "Biometric Manager is null.");
            return false;
        }
        final int status = biometricManager.canAuthenticate(
                BiometricManager.Authenticators.MANDATORY_BIOMETRICS);
        return status == BiometricManager.BIOMETRIC_SUCCESS;
    }

    @VisibleForTesting
    static class ActionsDialogLite extends SystemUIDialog implements DialogInterface,
            ColorExtractor.OnColorsChangedListener {
Loading