Merge changes I2eebe329,I81f1dfc1 into sc-dev
* changes: Turn off HBM when AcquiredInfo#GOOD Do not handle requests on system_server thread
This commit is contained in:
@@ -35,6 +35,10 @@ oneway interface IUdfpsOverlayController {
|
|||||||
// Hides the overlay.
|
// Hides the overlay.
|
||||||
void hideUdfpsOverlay(int sensorId);
|
void hideUdfpsOverlay(int sensorId);
|
||||||
|
|
||||||
|
// Good image captured. Turn off HBM. Success/Reject comes after, which is when hideUdfpsOverlay
|
||||||
|
// will be called.
|
||||||
|
void onAcquiredGood(int sensorId);
|
||||||
|
|
||||||
// Notifies of enrollment progress changes.
|
// Notifies of enrollment progress changes.
|
||||||
void onEnrollmentProgress(int sensorId, int remaining);
|
void onEnrollmentProgress(int sensorId, int remaining);
|
||||||
|
|
||||||
|
|||||||
@@ -123,6 +123,11 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
private int mActivePointerId = -1;
|
private int mActivePointerId = -1;
|
||||||
// The timestamp of the most recent touch log.
|
// The timestamp of the most recent touch log.
|
||||||
private long mTouchLogTime;
|
private long mTouchLogTime;
|
||||||
|
// Sensor has a good capture for this touch. Do not need to illuminate for this particular
|
||||||
|
// touch event anymore. In other words, do not illuminate until user lifts and touches the
|
||||||
|
// sensor area again.
|
||||||
|
// TODO: We should probably try to make touch/illumination things more of a FSM
|
||||||
|
private boolean mGoodCaptureReceived;
|
||||||
|
|
||||||
@Nullable private UdfpsView mView;
|
@Nullable private UdfpsView mView;
|
||||||
// The current request from FingerprintService. Null if no current request.
|
// The current request from FingerprintService. Null if no current request.
|
||||||
@@ -225,6 +230,7 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
@Override
|
@Override
|
||||||
public void showUdfpsOverlay(int sensorId, int reason,
|
public void showUdfpsOverlay(int sensorId, int reason,
|
||||||
@NonNull IUdfpsOverlayControllerCallback callback) {
|
@NonNull IUdfpsOverlayControllerCallback callback) {
|
||||||
|
mFgExecutor.execute(() -> {
|
||||||
final UdfpsEnrollHelper enrollHelper;
|
final UdfpsEnrollHelper enrollHelper;
|
||||||
if (reason == IUdfpsOverlayController.REASON_ENROLL_FIND_SENSOR
|
if (reason == IUdfpsOverlayController.REASON_ENROLL_FIND_SENSOR
|
||||||
|| reason == IUdfpsOverlayController.REASON_ENROLL_ENROLLING) {
|
|| reason == IUdfpsOverlayController.REASON_ENROLL_ENROLLING) {
|
||||||
@@ -232,41 +238,61 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
} else {
|
} else {
|
||||||
enrollHelper = null;
|
enrollHelper = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
mServerRequest = new ServerRequest(reason, callback, enrollHelper);
|
mServerRequest = new ServerRequest(reason, callback, enrollHelper);
|
||||||
updateOverlay();
|
updateOverlay();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hideUdfpsOverlay(int sensorId) {
|
public void hideUdfpsOverlay(int sensorId) {
|
||||||
|
mFgExecutor.execute(() -> {
|
||||||
mServerRequest = null;
|
mServerRequest = null;
|
||||||
updateOverlay();
|
updateOverlay();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAcquiredGood(int sensorId) {
|
||||||
|
mFgExecutor.execute(() -> {
|
||||||
|
if (mView == null) {
|
||||||
|
Log.e(TAG, "Null view when onAcquiredGood for sensorId: " + sensorId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mGoodCaptureReceived = true;
|
||||||
|
mView.stopIllumination();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnrollmentProgress(int sensorId, int remaining) {
|
public void onEnrollmentProgress(int sensorId, int remaining) {
|
||||||
|
mFgExecutor.execute(() -> {
|
||||||
if (mServerRequest == null) {
|
if (mServerRequest == null) {
|
||||||
Log.e(TAG, "onEnrollProgress received but serverRequest is null");
|
Log.e(TAG, "onEnrollProgress received but serverRequest is null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mServerRequest.onEnrollmentProgress(remaining);
|
mServerRequest.onEnrollmentProgress(remaining);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnrollmentHelp(int sensorId) {
|
public void onEnrollmentHelp(int sensorId) {
|
||||||
|
mFgExecutor.execute(() -> {
|
||||||
if (mServerRequest == null) {
|
if (mServerRequest == null) {
|
||||||
Log.e(TAG, "onEnrollmentHelp received but serverRequest is null");
|
Log.e(TAG, "onEnrollmentHelp received but serverRequest is null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mServerRequest.onEnrollmentHelp();
|
mServerRequest.onEnrollmentHelp();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setDebugMessage(int sensorId, String message) {
|
public void setDebugMessage(int sensorId, String message) {
|
||||||
|
mFgExecutor.execute(() -> {
|
||||||
if (mView == null) {
|
if (mView == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mView.setDebugMessage(message);
|
mView.setDebugMessage(message);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,7 +359,7 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
|
|
||||||
private boolean onTouch(View view, MotionEvent event, boolean fromUdfpsView) {
|
private boolean onTouch(View view, MotionEvent event, boolean fromUdfpsView) {
|
||||||
UdfpsView udfpsView = (UdfpsView) view;
|
UdfpsView udfpsView = (UdfpsView) view;
|
||||||
final boolean isFingerDown = udfpsView.isIlluminationRequested();
|
final boolean isIlluminationRequested = udfpsView.isIlluminationRequested();
|
||||||
boolean handled = false;
|
boolean handled = false;
|
||||||
switch (event.getActionMasked()) {
|
switch (event.getActionMasked()) {
|
||||||
case MotionEvent.ACTION_OUTSIDE:
|
case MotionEvent.ACTION_OUTSIDE:
|
||||||
@@ -388,7 +414,8 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
"minor: %.1f, major: %.1f, v: %.1f, exceedsVelocityThreshold: %b",
|
"minor: %.1f, major: %.1f, v: %.1f, exceedsVelocityThreshold: %b",
|
||||||
minor, major, v, exceedsVelocityThreshold);
|
minor, major, v, exceedsVelocityThreshold);
|
||||||
final long sinceLastLog = SystemClock.elapsedRealtime() - mTouchLogTime;
|
final long sinceLastLog = SystemClock.elapsedRealtime() - mTouchLogTime;
|
||||||
if (!isFingerDown && !exceedsVelocityThreshold) {
|
if (!isIlluminationRequested && !mGoodCaptureReceived &&
|
||||||
|
!exceedsVelocityThreshold) {
|
||||||
onFingerDown((int) x, (int) y, minor, major);
|
onFingerDown((int) x, (int) y, minor, major);
|
||||||
Log.v(TAG, "onTouch | finger down: " + touchInfo);
|
Log.v(TAG, "onTouch | finger down: " + touchInfo);
|
||||||
mTouchLogTime = SystemClock.elapsedRealtime();
|
mTouchLogTime = SystemClock.elapsedRealtime();
|
||||||
@@ -423,7 +450,7 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
Log.v(TAG, "onTouch | finger move: " + touchInfo);
|
Log.v(TAG, "onTouch | finger move: " + touchInfo);
|
||||||
mTouchLogTime = SystemClock.elapsedRealtime();
|
mTouchLogTime = SystemClock.elapsedRealtime();
|
||||||
}
|
}
|
||||||
} else if (isFingerDown) {
|
} else {
|
||||||
Log.v(TAG, "onTouch | finger outside");
|
Log.v(TAG, "onTouch | finger outside");
|
||||||
onFingerUp();
|
onFingerUp();
|
||||||
}
|
}
|
||||||
@@ -438,10 +465,8 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
mVelocityTracker.recycle();
|
mVelocityTracker.recycle();
|
||||||
mVelocityTracker = null;
|
mVelocityTracker = null;
|
||||||
}
|
}
|
||||||
if (isFingerDown) {
|
|
||||||
Log.v(TAG, "onTouch | finger up");
|
Log.v(TAG, "onTouch | finger up");
|
||||||
onFingerUp();
|
onFingerUp();
|
||||||
}
|
|
||||||
mFalsingManager.isFalseTouch(UDFPS_AUTHENTICATION);
|
mFalsingManager.isFalseTouch(UDFPS_AUTHENTICATION);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -795,14 +820,17 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
// This method can be called from the UI thread.
|
// This method can be called from the UI thread.
|
||||||
private void onFingerUp() {
|
private void onFingerUp() {
|
||||||
mActivePointerId = -1;
|
mActivePointerId = -1;
|
||||||
|
mGoodCaptureReceived = false;
|
||||||
mMainHandler.removeCallbacks(mAcquiredVibration);
|
mMainHandler.removeCallbacks(mAcquiredVibration);
|
||||||
if (mView == null) {
|
if (mView == null) {
|
||||||
Log.w(TAG, "Null view in onFingerUp");
|
Log.w(TAG, "Null view in onFingerUp");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mFingerprintManager.onPointerUp(mSensorProps.sensorId);
|
mFingerprintManager.onPointerUp(mSensorProps.sensorId);
|
||||||
|
if (mView.isIlluminationRequested()) {
|
||||||
mView.stopIllumination();
|
mView.stopIllumination();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private VibrationEffect getVibration(String effect, VibrationEffect defaultEffect) {
|
private VibrationEffect getVibration(String effect, VibrationEffect defaultEffect) {
|
||||||
|
|||||||
@@ -275,6 +275,7 @@ public class UdfpsControllerTest extends SysuiTestCase {
|
|||||||
mScreenObserver.onScreenTurnedOn();
|
mScreenObserver.onScreenTurnedOn();
|
||||||
mFgExecutor.runAllReady();
|
mFgExecutor.runAllReady();
|
||||||
mUdfpsController.onAodInterrupt(0, 0, 0f, 0f);
|
mUdfpsController.onAodInterrupt(0, 0, 0f, 0f);
|
||||||
|
when(mUdfpsView.isIlluminationRequested()).thenReturn(true);
|
||||||
// WHEN it is cancelled
|
// WHEN it is cancelled
|
||||||
mUdfpsController.onCancelUdfps();
|
mUdfpsController.onCancelUdfps();
|
||||||
// THEN the illumination is hidden
|
// THEN the illumination is hidden
|
||||||
@@ -289,6 +290,7 @@ public class UdfpsControllerTest extends SysuiTestCase {
|
|||||||
mScreenObserver.onScreenTurnedOn();
|
mScreenObserver.onScreenTurnedOn();
|
||||||
mFgExecutor.runAllReady();
|
mFgExecutor.runAllReady();
|
||||||
mUdfpsController.onAodInterrupt(0, 0, 0f, 0f);
|
mUdfpsController.onAodInterrupt(0, 0, 0f, 0f);
|
||||||
|
when(mUdfpsView.isIlluminationRequested()).thenReturn(true);
|
||||||
// WHEN it times out
|
// WHEN it times out
|
||||||
mFgExecutor.advanceClockToNext();
|
mFgExecutor.advanceClockToNext();
|
||||||
mFgExecutor.runAllReady();
|
mFgExecutor.runAllReady();
|
||||||
|
|||||||
@@ -113,6 +113,19 @@ public class UdfpsHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void onAcquiredGood(int sensorId,
|
||||||
|
@Nullable IUdfpsOverlayController udfpsOverlayController) {
|
||||||
|
if (udfpsOverlayController == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
udfpsOverlayController.onAcquiredGood(sensorId);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
Slog.e(TAG, "Remote exception when sending onAcquiredGood", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void onEnrollmentProgress(int sensorId, int remaining,
|
public static void onEnrollmentProgress(int sensorId, int remaining,
|
||||||
@Nullable IUdfpsOverlayController udfpsOverlayController) {
|
@Nullable IUdfpsOverlayController udfpsOverlayController) {
|
||||||
if (udfpsOverlayController == null) {
|
if (udfpsOverlayController == null) {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import android.app.TaskStackListener;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.hardware.biometrics.BiometricAuthenticator;
|
import android.hardware.biometrics.BiometricAuthenticator;
|
||||||
import android.hardware.biometrics.BiometricFingerprintConstants;
|
import android.hardware.biometrics.BiometricFingerprintConstants;
|
||||||
|
import android.hardware.biometrics.BiometricFingerprintConstants.FingerprintAcquired;
|
||||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||||
import android.hardware.biometrics.common.ICancellationSignal;
|
import android.hardware.biometrics.common.ICancellationSignal;
|
||||||
import android.hardware.biometrics.fingerprint.ISession;
|
import android.hardware.biometrics.fingerprint.ISession;
|
||||||
@@ -80,6 +81,17 @@ class FingerprintAuthenticationClient extends AuthenticationClient<ISession> imp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAcquired(@FingerprintAcquired int acquiredInfo, int vendorCode) {
|
||||||
|
// For UDFPS, notify SysUI that the illumination can be turned off.
|
||||||
|
// See AcquiredInfo#GOOD and AcquiredInfo#RETRYING_CAPTURE
|
||||||
|
if (acquiredInfo == BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD) {
|
||||||
|
UdfpsHelper.onAcquiredGood(getSensorId(), mUdfpsOverlayController);
|
||||||
|
}
|
||||||
|
|
||||||
|
super.onAcquired(acquiredInfo, vendorCode);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(int errorCode, int vendorCode) {
|
public void onError(int errorCode, int vendorCode) {
|
||||||
super.onError(errorCode, vendorCode);
|
super.onError(errorCode, vendorCode);
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import android.annotation.Nullable;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.hardware.biometrics.BiometricAuthenticator;
|
import android.hardware.biometrics.BiometricAuthenticator;
|
||||||
import android.hardware.biometrics.BiometricFingerprintConstants;
|
import android.hardware.biometrics.BiometricFingerprintConstants;
|
||||||
|
import android.hardware.biometrics.BiometricFingerprintConstants.FingerprintAcquired;
|
||||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||||
import android.hardware.biometrics.common.ICancellationSignal;
|
import android.hardware.biometrics.common.ICancellationSignal;
|
||||||
import android.hardware.biometrics.fingerprint.ISession;
|
import android.hardware.biometrics.fingerprint.ISession;
|
||||||
@@ -85,14 +86,19 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAcquired(int acquiredInfo, int vendorCode) {
|
public void onAcquired(@FingerprintAcquired int acquiredInfo, int vendorCode) {
|
||||||
super.onAcquired(acquiredInfo, vendorCode);
|
// For UDFPS, notify SysUI that the illumination can be turned off.
|
||||||
|
// See AcquiredInfo#GOOD and AcquiredInfo#RETRYING_CAPTURE
|
||||||
|
if (acquiredInfo == BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD) {
|
||||||
|
UdfpsHelper.onAcquiredGood(getSensorId(), mUdfpsOverlayController);
|
||||||
|
}
|
||||||
|
|
||||||
if (UdfpsHelper.isValidAcquisitionMessage(getContext(), acquiredInfo, vendorCode)) {
|
if (UdfpsHelper.isValidAcquisitionMessage(getContext(), acquiredInfo, vendorCode)) {
|
||||||
UdfpsHelper.onEnrollmentHelp(getSensorId(), mUdfpsOverlayController);
|
UdfpsHelper.onEnrollmentHelp(getSensorId(), mUdfpsOverlayController);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
super.onAcquired(acquiredInfo, vendorCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user