Make LockoutResetCallback oneway

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

Change-Id: I2fb03775898c0567f058d6d9d0b963ed071cc786
Fixes: 32946531
This commit is contained in:
Jorim Jaggi
2016-11-24 14:38:18 +01:00
parent e0b7a06d6f
commit 57e2f4db35
3 changed files with 36 additions and 13 deletions

View File

@@ -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 {
final PowerManager.WakeLock wakeLock = powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "lockoutResetCallback");
wakeLock.acquire();
mHandler.post(new Runnable() {
@Override
public void run() {
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(() -> {
try {
callback.onLockoutReset();
} finally {
wakeLock.release();
}
}
});
});
} finally {
serverCallback.sendResult(null /* data */);
}
}
});
} catch (RemoteException e) {

View File

@@ -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);
}

View File

@@ -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);
}
};