From 659b4ee91a9374ee8131a978a36eb388d7adfbb4 Mon Sep 17 00:00:00 2001 From: Joe Bolinger Date: Thu, 22 Jul 2021 22:09:07 -0700 Subject: [PATCH] Unsubscribe from ALS events when UDFPS does not have an active touch. Add probe interface for finer grained controll of data source sampling. Bug: 194322934 Fix: 194504328 Test: manual (statsd_testdrive 88) Change-Id: Ia55144fee642178d5aea81438dea8157c07e0b73 --- .../biometrics/sensors/LoggableMonitor.java | 82 +++++++++++++++---- .../face/aidl/FaceAuthenticationClient.java | 2 +- .../sensors/face/aidl/FaceEnrollClient.java | 3 +- .../face/hidl/FaceAuthenticationClient.java | 2 +- .../sensors/face/hidl/FaceEnrollClient.java | 2 +- .../aidl/FingerprintAuthenticationClient.java | 8 +- .../aidl/FingerprintEnrollClient.java | 2 +- .../hidl/FingerprintAuthenticationClient.java | 8 +- .../hidl/FingerprintEnrollClient.java | 2 +- 9 files changed, 89 insertions(+), 22 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/sensors/LoggableMonitor.java b/services/core/java/com/android/server/biometrics/sensors/LoggableMonitor.java index c8867ea2df1c4..b4c82f2ed7990 100644 --- a/services/core/java/com/android/server/biometrics/sensors/LoggableMonitor.java +++ b/services/core/java/com/android/server/biometrics/sensors/LoggableMonitor.java @@ -48,6 +48,64 @@ public abstract class LoggableMonitor { private boolean mLightSensorEnabled = false; private boolean mShouldLogMetrics = true; + /** + * Probe for loggable attributes that can be continuously monitored, such as ambient light. + * + * Disable probes when the sensors are in states that are not interesting for monitoring + * purposes to save power. + */ + protected interface Probe { + /** Ensure the probe is actively sampling for new data. */ + void enable(); + /** Stop sampling data. */ + void disable(); + } + + /** + * Client monitor callback that exposes a probe. + * + * Disables the probe when the operation completes. + */ + protected static class CallbackWithProbe + implements BaseClientMonitor.Callback { + private final boolean mStartWithClient; + private final T mProbe; + + public CallbackWithProbe(@NonNull T probe, boolean startWithClient) { + mProbe = probe; + mStartWithClient = startWithClient; + } + + @Override + public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) { + if (mStartWithClient) { + mProbe.enable(); + } + } + + @Override + public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) { + mProbe.disable(); + } + + @NonNull + public T getProbe() { + return mProbe; + } + } + + private class ALSProbe implements Probe { + @Override + public void enable() { + setLightSensorLoggingEnabled(getAmbientLightSensor(mSensorManager)); + } + + @Override + public void disable() { + setLightSensorLoggingEnabled(null); + } + } + // report only the most recent value // consider com.android.server.display.utils.AmbientFilter or similar if need arises private volatile float mLastAmbientLux = 0; @@ -285,21 +343,17 @@ public abstract class LoggableMonitor { return latency; } - /** Get a callback to start/stop ALS capture when client runs. */ + /** + * Get a callback to start/stop ALS capture when client runs. + * + * If the probe should not run for the entire operation, do not set startWithClient and + * start/stop the problem when needed. + * + * @param startWithClient if probe should start automatically when the operation starts. + */ @NonNull - protected BaseClientMonitor.Callback createALSCallback() { - return new BaseClientMonitor.Callback() { - @Override - public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) { - setLightSensorLoggingEnabled(getAmbientLightSensor(mSensorManager)); - } - - @Override - public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, - boolean success) { - setLightSensorLoggingEnabled(null); - } - }; + protected CallbackWithProbe createALSCallback(boolean startWithClient) { + return new CallbackWithProbe<>(new ALSProbe(), startWithClient); } /** The sensor to use for ALS logging. */ diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java index 35c17459804d9..0c06b205f2da7 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java @@ -98,7 +98,7 @@ class FaceAuthenticationClient extends AuthenticationClient implements @NonNull @Override protected Callback wrapCallbackForStart(@NonNull Callback callback) { - return new CompositeCallback(createALSCallback(), callback); + return new CompositeCallback(createALSCallback(true /* startWithClient */), callback); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java index 55c987a19e45f..a806277ed45e2 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java @@ -109,7 +109,8 @@ public class FaceEnrollClient extends EnrollClient { @NonNull @Override protected Callback wrapCallbackForStart(@NonNull Callback callback) { - return new CompositeCallback(mPreviewHandleDeleterCallback, createALSCallback(), callback); + return new CompositeCallback(mPreviewHandleDeleterCallback, + createALSCallback(true /* startWithClient */), callback); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java index e65245b98829e..868f3795845ac 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java @@ -88,7 +88,7 @@ class FaceAuthenticationClient extends AuthenticationClient { @NonNull @Override protected Callback wrapCallbackForStart(@NonNull Callback callback) { - return new CompositeCallback(createALSCallback(), callback); + return new CompositeCallback(createALSCallback(true /* startWithClient */), callback); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceEnrollClient.java index 455d6f868e65d..80828cced4e89 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceEnrollClient.java @@ -69,7 +69,7 @@ public class FaceEnrollClient extends EnrollClient { @NonNull @Override protected Callback wrapCallbackForStart(@NonNull Callback callback) { - return new CompositeCallback(createALSCallback(), callback); + return new CompositeCallback(createALSCallback(true /* startWithClient */), callback); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java index 14d18225d6740..fb2f2ef6b14cd 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java @@ -55,6 +55,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp @NonNull private final LockoutCache mLockoutCache; @Nullable private final IUdfpsOverlayController mUdfpsOverlayController; @NonNull private final FingerprintSensorPropertiesInternal mSensorProps; + @NonNull private final CallbackWithProbe mALSProbeCallback; @Nullable private ICancellationSignal mCancellationSignal; private boolean mIsPointerDown; @@ -75,6 +76,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp mLockoutCache = lockoutCache; mUdfpsOverlayController = udfpsOverlayController; mSensorProps = sensorProps; + mALSProbeCallback = createALSCallback(false /* startWithClient */); } @Override @@ -92,7 +94,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp @NonNull @Override protected Callback wrapCallbackForStart(@NonNull Callback callback) { - return new CompositeCallback(createALSCallback(), callback); + return new CompositeCallback(mALSProbeCallback, callback); } @Override @@ -170,7 +172,9 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp try { mIsPointerDown = true; mState = STATE_STARTED; + mALSProbeCallback.getProbe().enable(); getFreshDaemon().onPointerDown(0 /* pointerId */, x, y, minor, major); + if (getListener() != null) { getListener().onUdfpsPointerDown(getSensorId()); } @@ -184,7 +188,9 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp try { mIsPointerDown = false; mState = STATE_STARTED_PAUSED; + mALSProbeCallback.getProbe().disable(); getFreshDaemon().onPointerUp(0 /* pointerId */); + if (getListener() != null) { getListener().onUdfpsPointerUp(getSensorId()); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java index e8200af68db52..c420c5c572417 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java @@ -84,7 +84,7 @@ class FingerprintEnrollClient extends EnrollClient implements Udfps { @NonNull @Override protected Callback wrapCallbackForStart(@NonNull Callback callback) { - return new CompositeCallback(createALSCallback(), callback); + return new CompositeCallback(createALSCallback(true /* startWithClient */), callback); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java index 9347244d7c777..5c9a764f27da2 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java @@ -54,6 +54,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient mALSProbeCallback; private boolean mIsPointerDown; @@ -74,6 +75,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient