Merge "Have FingerprintService keep the device awake on relevant events." into mnc-dev

This commit is contained in:
Jim Miller
2015-06-26 21:01:04 +00:00
committed by Android (Google) Code Review
3 changed files with 30 additions and 4 deletions

View File

@@ -26,7 +26,7 @@ import java.util.List;
*/
interface IFingerprintService {
// Authenticate the given sessionId with a fingerprint
void authenticate(IBinder token, long sessionId, int groupId,
void authenticate(IBinder token, long sessionId, int userId,
IFingerprintServiceReceiver receiver, int flags, String opPackageName);
// Cancel authentication for the given sessionId

View File

@@ -30,9 +30,11 @@ import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.Looper;
import android.os.MessageQueue;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.SELinux;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.util.Slog;
@@ -70,6 +72,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
private static final int MSG_USER_SWITCHING = 10;
private static final int ENROLLMENT_TIMEOUT_MS = 60 * 1000; // 1 minute
private boolean mIsKeyguard; // true if the authentication client is keyguard
private ClientMonitor mAuthClient = null;
private ClientMonitor mEnrollClient = null;
private ClientMonitor mRemoveClient = null;
@@ -78,6 +81,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
private static final long MS_PER_SEC = 1000;
private static final long FAIL_LOCKOUT_TIMEOUT_MS = 30*1000;
private static final int MAX_FAILED_ATTEMPTS = 5;
private static final int FINGERPRINT_ACQUIRED_GOOD = 0;
Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
@@ -97,6 +101,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
private long mHalDeviceId;
private int mFailedAttempts;
private IFingerprintDaemon mDaemon;
private PowerManager mPowerManager;
private final Runnable mLockoutReset = new Runnable() {
@Override
@@ -109,6 +114,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
super(context);
mContext = context;
mAppOps = context.getSystemService(AppOpsManager.class);
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
}
@Override
@@ -191,7 +197,11 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
removeClient(mAuthClient);
}
}
}
private void userActivity() {
long now = SystemClock.uptimeMillis();
mPowerManager.userActivity(now, PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
}
void handleUserSwitching(int userId) {
@@ -498,9 +508,10 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
*/
private boolean sendAuthenticated(int fpId, int groupId) {
boolean result = false;
boolean authenticated = fpId != 0;
if (receiver != null) {
try {
if (fpId == 0) {
if (!authenticated) {
receiver.onAuthenticationFailed(mHalDeviceId);
} else {
Fingerprint fp = !restricted ?
@@ -522,6 +533,11 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
result |= true; // we have a valid fingerprint
mLockoutReset.run();
}
// For fingerprint devices that support touch-to-wake, this will ensure the device
// wakes up and turns the screen on when fingerprint is authenticated.
if (mIsKeyguard && authenticated) {
mPowerManager.wakeUp(SystemClock.uptimeMillis());
}
return result;
}
@@ -537,6 +553,12 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
Slog.w(TAG, "Failed to invoke sendAcquired:", e);
return true; // client failed
}
finally {
// Good scans will keep the device awake
if (acquiredInfo == FINGERPRINT_ACQUIRED_GOOD) {
userActivity();
}
}
}
/*
@@ -589,6 +611,8 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
};
private final class FingerprintServiceWrapper extends IFingerprintService.Stub {
private static final String KEYGUARD_PACKAGE = "com.android.systemui";
@Override // Binder call
public long preEnroll(IBinder token) {
checkPermission(MANAGE_FINGERPRINT);
@@ -638,7 +662,8 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
@Override // Binder call
public void authenticate(final IBinder token, final long opId, final int groupId,
final IFingerprintServiceReceiver receiver, final int flags, String opPackageName) {
final IFingerprintServiceReceiver receiver, final int flags,
final String opPackageName) {
if (!canUseFingerprint(opPackageName)) {
return;
@@ -647,6 +672,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
mHandler.post(new Runnable() {
@Override
public void run() {
mIsKeyguard = KEYGUARD_PACKAGE.equals(opPackageName);
startAuthentication(token, opId, groupId, receiver, flags, restricted);
}
});

View File

@@ -3117,7 +3117,7 @@ public final class PowerManagerService extends SystemService
return;
}
if (eventTime > SystemClock.uptimeMillis()) {
if (eventTime > now) {
throw new IllegalArgumentException("event time must not be in the future");
}