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

Commit 4f0e5060 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

Fix AuthController crash

1) Provide udfps aidl methods in FingerprintManager to reduce
   boilerplate code in SystemUI
2) Add null check in FingerprintService#isHardwareDetected, add
   isHardwareDetected check to AuthController

Fixes: 161199262
Fixes: 161196229
Bug: 161201849

Test: Boot aosp_blueline-eng

Change-Id: I6c037f90691e4da2f88419c6f80994e8ae1565b0
parent 727da88f
Loading
Loading
Loading
Loading
+70 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.hardware.fingerprint;
import static android.Manifest.permission.INTERACT_ACROSS_USERS;
import static android.Manifest.permission.MANAGE_FINGERPRINT;
import static android.Manifest.permission.USE_BIOMETRIC;
import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL;
import static android.Manifest.permission.USE_FINGERPRINT;

import android.annotation.NonNull;
@@ -684,6 +685,75 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
        return hasEnrolledFingerprints(userId);
    }

    /**
     * @hide
     */
    @RequiresPermission(USE_BIOMETRIC_INTERNAL)
    public boolean isUdfps() {
        if (mService == null) {
            Slog.w(TAG, "isUdfps: no fingerprint service");
            return false;
        }

        try {
            return mService.isUdfps();
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
        }
        return false;
    }

    /**
     * @hide
     */
    @RequiresPermission(USE_BIOMETRIC_INTERNAL)
    public void setUdfpsOverlayController(IUdfpsOverlayController controller) {
        if (mService == null) {
            Slog.w(TAG, "setUdfpsOverlayController: no fingerprint service");
            return;
        }

        try {
            mService.setUdfpsOverlayController(controller);
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
        }
    }

    /**
     * @hide
     */
    @RequiresPermission(USE_BIOMETRIC_INTERNAL)
    public void onFingerDown(int x, int y, float minor, float major) {
        if (mService == null) {
            Slog.w(TAG, "onFingerDown: no fingerprint service");
            return;
        }

        try {
            mService.onFingerDown(x, y, minor, major);
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
        }
    }

    /**
     * @hide
     */
    @RequiresPermission(USE_BIOMETRIC_INTERNAL)
    public void onFingerUp() {
        if (mService == null) {
            Slog.w(TAG, "onFingerDown: no fingerprint service");
            return;
        }

        try {
            mService.onFingerUp();
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
        }
    }

    /**
     * Determine if there is at least one fingerprint enrolled.
     *
+2 −2
Original line number Diff line number Diff line
@@ -114,8 +114,8 @@ interface IFingerprintService {
    // Notifies about a finger leaving the sensor area.
    void onFingerUp();

    // Returns whether the specified sensor is an under-display fingerprint sensor (UDFPS).
    boolean isUdfps(int sensorId);
    // Returns whether the sensor is an under-display fingerprint sensor (UDFPS).
    boolean isUdfps();

    // Sets the controller for managing the UDFPS overlay.
    void setUdfpsOverlayController(in IUdfpsOverlayController controller);
+6 −22
Original line number Diff line number Diff line
@@ -246,11 +246,6 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
        IActivityTaskManager getActivityTaskManager() {
            return ActivityTaskManager.getService();
        }

        IFingerprintService getFingerprintService() {
            return IFingerprintService.Stub.asInterface(
                    ServiceManager.getService(Context.FINGERPRINT_SERVICE));
        }
    }

    @Inject
@@ -276,23 +271,12 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
        mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        mActivityTaskManager = mInjector.getActivityTaskManager();

        if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
            IFingerprintService fingerprintService = mInjector.getFingerprintService();
            if (fingerprintService == null) {
                Log.e(TAG, "FEATURE_FINGERPRINT is available, but FingerprintService is null");
            } else {
                boolean isUdfps = false;
                try {
        final FingerprintManager fpm = mContext.getSystemService(FingerprintManager.class);
        if (fpm != null && fpm.isHardwareDetected()) {
            // TODO(b/160024833): Enumerate through all of the sensors and check whether
            //  at least one of them is UDFPS.
                    isUdfps = fingerprintService.isUdfps(0 /* sensorId */);
                } catch (RemoteException e) {
                    Log.w(TAG, "Unable to check whether the sensor is a UDFPS", e);
                }
                if (isUdfps) {
                    mUdfpsController = new UdfpsController(mContext, fingerprintService,
                            mWindowManager);
                }
            if (fpm.isUdfps()) {
                mUdfpsController = new UdfpsController(mContext, mWindowManager);
            }
        }

+7 −19
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.Handler;
@@ -44,7 +45,7 @@ class UdfpsController {
    private static final String TAG = "UdfpsController";

    private final Context mContext;
    private final IFingerprintService mFingerprintService;
    private final FingerprintManager mFingerprintManager;
    private final WindowManager mWindowManager;
    private final Handler mHandler;

@@ -94,10 +95,9 @@ class UdfpsController {
        }
    };

    UdfpsController(Context context, IFingerprintService fingerprintService,
            WindowManager windowManager) {
    UdfpsController(Context context, WindowManager windowManager) {
        mContext = context;
        mFingerprintService = fingerprintService;
        mFingerprintManager = context.getSystemService(FingerprintManager.class);
        mWindowManager = windowManager;
        mHandler = new Handler(Looper.getMainLooper());
        start();
@@ -133,11 +133,7 @@ class UdfpsController {
        mHbmEnableCommand = mContext.getResources().getString(R.string.udfps_hbm_enable_command);
        mHbmDisableCommand = mContext.getResources().getString(R.string.udfps_hbm_disable_command);

        try {
            mFingerprintService.setUdfpsOverlayController(new UdfpsOverlayController());
        } catch (RemoteException e) {
            Log.e(TAG, "start | failed to set UDFPS controller", e);
        }
        mFingerprintManager.setUdfpsOverlayController(new UdfpsOverlayController());
        mIsOverlayShowing = false;
    }

@@ -175,19 +171,11 @@ class UdfpsController {
            Log.e(TAG, "onFingerDown | failed to enable HBM: " + e.getMessage());
        }
        mView.onFingerDown();
        try {
            mFingerprintService.onFingerDown(x, y, minor, major);
        } catch (RemoteException e) {
            Log.e(TAG, "onFingerDown | failed to propagate onFingerDown", e);
        }
        mFingerprintManager.onFingerDown(x, y, minor, major);
    }

    private void onFingerUp() {
        try {
            mFingerprintService.onFingerUp();
        } catch (RemoteException e) {
            Log.e(TAG, "onFingeUp | failed to propagate onFingerUp", e);
        }
        mFingerprintManager.onFingerUp();
        mView.onFingerUp();
        try {
            FileWriter fw = new FileWriter(mHbmPath);
+5 −1
Original line number Diff line number Diff line
@@ -213,6 +213,10 @@ public class FingerprintService extends SystemService {

            final long token = Binder.clearCallingIdentity();
            try {
                if (mFingerprint21 == null) {
                    Slog.e(TAG, "No HAL");
                    return false;
                }
                return mFingerprint21.isHardwareDetected();
            } finally {
                Binder.restoreCallingIdentity(token);
@@ -313,7 +317,7 @@ public class FingerprintService extends SystemService {
        }

        @Override
        public boolean isUdfps(int sensorId) {
        public boolean isUdfps() {
            Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
            return mFingerprint21.isUdfps();
        }