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

Commit 57e2f4db authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

Make LockoutResetCallback oneway

Test: Get locked out, make sure wake-and-unlock is working
again after 30 seconds.

Change-Id: I2fb03775898c0567f058d6d9d0b963ed071cc786
Fixes: 32946531
parent e0b7a06d
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.os.CancellationSignal;
import android.os.CancellationSignal.OnCancelListener;
import android.os.Handler;
import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.Looper;
import android.os.PowerManager;
import android.os.RemoteException;
@@ -757,20 +758,22 @@ public class FingerprintManager {
                        new IFingerprintServiceLockoutResetCallback.Stub() {

                    @Override
                    public void onLockoutReset(long deviceId) throws RemoteException {
                    public void onLockoutReset(long deviceId, IRemoteCallback serverCallback)
                            throws RemoteException {
                        try {
                            final PowerManager.WakeLock wakeLock = powerManager.newWakeLock(
                                    PowerManager.PARTIAL_WAKE_LOCK, "lockoutResetCallback");
                            wakeLock.acquire();
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                            mHandler.post(() -> {
                                try {
                                    callback.onLockoutReset();
                                } finally {
                                    wakeLock.release();
                                }
                            }
                            });
                        } finally {
                            serverCallback.sendResult(null /* data */);
                        }
                    }
                });
            } catch (RemoteException e) {
+6 −3
Original line number Diff line number Diff line
@@ -17,14 +17,17 @@ package android.hardware.fingerprint;

import android.hardware.fingerprint.Fingerprint;
import android.os.Bundle;
import android.os.IRemoteCallback;
import android.os.UserHandle;

/**
 * Callback when lockout period expired and clients are allowed to authenticate again.
 * @hide
 */
interface IFingerprintServiceLockoutResetCallback {
oneway interface IFingerprintServiceLockoutResetCallback {

    /** Method is synchronous so wakelock is held when this is called from a WAKEUP alarm. */
    void onLockoutReset(long deviceId);
    /**
     * A wakelock will be held until the reciever calls back into {@param callback}
     */
    void onLockoutReset(long deviceId, IRemoteCallback callback);
}
+18 −1
Original line number Diff line number Diff line
@@ -32,11 +32,14 @@ import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.hardware.fingerprint.IFingerprintServiceLockoutResetCallback;
import android.os.Binder;
import android.os.Bundle;
import android.os.DeadObjectException;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.os.RemoteException;
import android.os.SELinux;
import android.os.ServiceManager;
@@ -625,17 +628,28 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe

    private class FingerprintServiceLockoutResetMonitor {

        private static final long WAKELOCK_TIMEOUT_MS = 2000;
        private final IFingerprintServiceLockoutResetCallback mCallback;
        private final WakeLock mWakeLock;

        public FingerprintServiceLockoutResetMonitor(
                IFingerprintServiceLockoutResetCallback callback) {
            mCallback = callback;
            mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                    "lockout reset callback");
        }

        public void sendLockoutReset() {
            if (mCallback != null) {
                try {
                    mCallback.onLockoutReset(mHalDeviceId);
                    mWakeLock.acquire(WAKELOCK_TIMEOUT_MS);
                    mCallback.onLockoutReset(mHalDeviceId, new IRemoteCallback.Stub() {

                        @Override
                        public void sendResult(Bundle data) throws RemoteException {
                            mWakeLock.release();
                        }
                    });
                } catch (DeadObjectException e) {
                    Slog.w(TAG, "Death object while invoking onLockoutReset: ", e);
                    mHandler.post(mRemoveCallbackRunnable);
@@ -648,6 +662,9 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
        private final Runnable mRemoveCallbackRunnable = new Runnable() {
            @Override
            public void run() {
                if (mWakeLock.isHeld()) {
                    mWakeLock.release();
                }
                removeLockoutResetCallback(FingerprintServiceLockoutResetMonitor.this);
            }
        };