Configures FingerprintService to use FingerprintStateCallback to notify
clients of fingerprint sensor state changes Implements FingerprintStateCallback class to receive notifications of changes in fingerprint state, and updates ServiceProvider method signatures and Fingerprint21 accordingly to use this callback type for authentication, enrollment, and other side fps events. Also defines FingerprintStateListener class to forward state changes in fingerprint-related events from FingerprintService to the SideFpsEventHandler, which defines logic for PhoneWindowManager to use in interactions between power button state and side fps state. Test: adb shell dumpsys fingerprint Bug: 183997671 Change-Id: I3147d41074589fe5a47434b96d10e78182ab3747
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (C) 2021 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.hardware.fingerprint;
|
||||
|
||||
import android.annotation.IntDef;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
/**
|
||||
* Interface for handling state changes in fingerprint-related events.
|
||||
* @hide
|
||||
*/
|
||||
public abstract class FingerprintStateListener extends IFingerprintStateListener.Stub {
|
||||
// Operation has not started yet.
|
||||
public static final int STATE_IDLE = 0;
|
||||
|
||||
// Enrollment is in progress.
|
||||
public static final int STATE_ENROLLING = 1;
|
||||
|
||||
// Lockscreen authentication in progress.
|
||||
public static final int STATE_KEYGUARD_AUTH = 2;
|
||||
|
||||
// BiometricPrompt authentication in progress.
|
||||
public static final int STATE_BP_AUTH = 3;
|
||||
|
||||
// Other Authentication State
|
||||
public static final int STATE_AUTH_OTHER = 4;
|
||||
|
||||
@IntDef({STATE_IDLE, STATE_ENROLLING, STATE_KEYGUARD_AUTH, STATE_BP_AUTH, STATE_AUTH_OTHER})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface State {}
|
||||
|
||||
/**
|
||||
* Defines behavior in response to state update
|
||||
* @param newState new state of fingerprint sensor
|
||||
*/
|
||||
public abstract void onStateChanged(@FingerprintStateListener.State int newState);
|
||||
}
|
||||
@@ -22,6 +22,7 @@ import android.hardware.biometrics.ITestSession;
|
||||
import android.hardware.biometrics.ITestSessionCallback;
|
||||
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
|
||||
import android.hardware.fingerprint.IFingerprintServiceReceiver;
|
||||
import android.hardware.fingerprint.IFingerprintStateListener;
|
||||
import android.hardware.fingerprint.IUdfpsOverlayController;
|
||||
import android.hardware.fingerprint.Fingerprint;
|
||||
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
||||
@@ -154,4 +155,7 @@ interface IFingerprintService {
|
||||
|
||||
// Sets the controller for managing the UDFPS overlay.
|
||||
void setUdfpsOverlayController(in IUdfpsOverlayController controller);
|
||||
|
||||
// Registers FingerprintStateListener in list stored by FingerprintService
|
||||
void registerFingerprintStateListener(IFingerprintStateListener listener);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright (C) 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package android.hardware.fingerprint;
|
||||
|
||||
import android.hardware.fingerprint.Fingerprint;
|
||||
|
||||
/**
|
||||
* Communication channel for FingerprintManager to register the FingerprintStateListener
|
||||
* in FingerprintService
|
||||
* @hide
|
||||
*/
|
||||
oneway interface IFingerprintStateListener {
|
||||
void onStateChanged(int newState);
|
||||
}
|
||||
@@ -471,8 +471,7 @@ public class BiometricScheduler {
|
||||
* Adds a {@link BaseClientMonitor} to the pending queue
|
||||
*
|
||||
* @param clientMonitor operation to be scheduled
|
||||
* @param clientCallback optional callback, invoked when the client is finished, but
|
||||
* before it has been removed from the queue.
|
||||
* @param clientCallback optional callback, invoked when the client state changes
|
||||
*/
|
||||
public void scheduleClientMonitor(@NonNull BaseClientMonitor clientMonitor,
|
||||
@Nullable BaseClientMonitor.Callback clientCallback) {
|
||||
|
||||
@@ -29,6 +29,11 @@ import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPR
|
||||
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_USER_CANCELED;
|
||||
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_VENDOR;
|
||||
import static android.hardware.biometrics.SensorProperties.STRENGTH_STRONG;
|
||||
import static android.hardware.fingerprint.FingerprintStateListener.STATE_AUTH_OTHER;
|
||||
import static android.hardware.fingerprint.FingerprintStateListener.STATE_BP_AUTH;
|
||||
import static android.hardware.fingerprint.FingerprintStateListener.STATE_ENROLLING;
|
||||
import static android.hardware.fingerprint.FingerprintStateListener.STATE_IDLE;
|
||||
import static android.hardware.fingerprint.FingerprintStateListener.STATE_KEYGUARD_AUTH;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
@@ -50,9 +55,11 @@ import android.hardware.fingerprint.Fingerprint;
|
||||
import android.hardware.fingerprint.FingerprintManager;
|
||||
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
||||
import android.hardware.fingerprint.FingerprintServiceReceiver;
|
||||
import android.hardware.fingerprint.FingerprintStateListener;
|
||||
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
|
||||
import android.hardware.fingerprint.IFingerprintService;
|
||||
import android.hardware.fingerprint.IFingerprintServiceReceiver;
|
||||
import android.hardware.fingerprint.IFingerprintStateListener;
|
||||
import android.hardware.fingerprint.IUdfpsOverlayController;
|
||||
import android.os.Binder;
|
||||
import android.os.Build;
|
||||
@@ -75,6 +82,8 @@ import com.android.internal.widget.LockPatternUtils;
|
||||
import com.android.server.ServiceThread;
|
||||
import com.android.server.SystemService;
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.sensors.AuthenticationClient;
|
||||
import com.android.server.biometrics.sensors.BaseClientMonitor;
|
||||
import com.android.server.biometrics.sensors.BiometricServiceCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
|
||||
@@ -82,6 +91,7 @@ import com.android.server.biometrics.sensors.LockoutTracker;
|
||||
import com.android.server.biometrics.sensors.fingerprint.aidl.FingerprintProvider;
|
||||
import com.android.server.biometrics.sensors.fingerprint.hidl.Fingerprint21;
|
||||
import com.android.server.biometrics.sensors.fingerprint.hidl.Fingerprint21UdfpsMock;
|
||||
import com.android.server.biometrics.sensors.fingerprint.hidl.FingerprintEnrollClient;
|
||||
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.PrintWriter;
|
||||
@@ -105,6 +115,62 @@ public class FingerprintService extends SystemService implements BiometricServic
|
||||
private final LockPatternUtils mLockPatternUtils;
|
||||
private final FingerprintServiceWrapper mServiceWrapper;
|
||||
@NonNull private List<ServiceProvider> mServiceProviders;
|
||||
@NonNull private final FingerprintStateCallback mFingerprintStateCallback;
|
||||
@NonNull private @FingerprintStateListener.State int mFingerprintState;
|
||||
|
||||
private List<IFingerprintStateListener> mFingerprintStateListeners = new ArrayList<>();
|
||||
|
||||
/** Callback to receive notifications about changes in fingerprint state. */
|
||||
public final class FingerprintStateCallback implements BaseClientMonitor.Callback {
|
||||
@Override
|
||||
public void onClientStarted(@NonNull BaseClientMonitor client) {
|
||||
final int previousFingerprintState = mFingerprintState;
|
||||
if (client instanceof AuthenticationClient) {
|
||||
AuthenticationClient authClient = (AuthenticationClient) client;
|
||||
if (authClient.isKeyguard()) {
|
||||
mFingerprintState = STATE_KEYGUARD_AUTH;
|
||||
} else if (authClient.isBiometricPrompt()) {
|
||||
mFingerprintState = STATE_BP_AUTH;
|
||||
} else {
|
||||
mFingerprintState = STATE_AUTH_OTHER;
|
||||
}
|
||||
} else if (client instanceof FingerprintEnrollClient) {
|
||||
mFingerprintState = STATE_ENROLLING;
|
||||
} else {
|
||||
Slog.w(TAG, "Other authentication client: " + Utils.getClientName(client));
|
||||
mFingerprintState = STATE_IDLE;
|
||||
}
|
||||
Slog.d(TAG, "Fps state updated from " + previousFingerprintState + " to "
|
||||
+ mFingerprintState + ", client " + client);
|
||||
notifyFingerprintStateListeners(mFingerprintState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClientFinished(@NonNull BaseClientMonitor client, boolean success) {
|
||||
mFingerprintState = STATE_IDLE;
|
||||
Slog.d(TAG, "Client finished, fps state updated to " + mFingerprintState
|
||||
+ ", client " + client);
|
||||
notifyFingerprintStateListeners(mFingerprintState);
|
||||
}
|
||||
|
||||
private void notifyFingerprintStateListeners(@FingerprintStateListener.State int newState) {
|
||||
for (IFingerprintStateListener listener : mFingerprintStateListeners) {
|
||||
try {
|
||||
listener.onStateChanged(newState);
|
||||
} catch (RemoteException e) {
|
||||
Slog.e(TAG, "Remote exception in fingerprint state change", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers FingerprintStateListener in list stored by FingerprintService
|
||||
* @param listener new FingerprintStateListener being added
|
||||
*/
|
||||
public void registerFingerprintStateListener(IFingerprintStateListener listener) {
|
||||
mFingerprintStateListeners.add(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Receives the incoming binder calls from FingerprintManager.
|
||||
@@ -122,7 +188,8 @@ public class FingerprintService extends SystemService implements BiometricServic
|
||||
return null;
|
||||
}
|
||||
|
||||
return provider.createTestSession(sensorId, callback, opPackageName);
|
||||
return provider.createTestSession(sensorId, callback, mFingerprintStateCallback,
|
||||
opPackageName);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -205,7 +272,7 @@ public class FingerprintService extends SystemService implements BiometricServic
|
||||
}
|
||||
|
||||
provider.second.scheduleEnroll(provider.first, token, hardwareAuthToken, userId,
|
||||
receiver, opPackageName, enrollReason);
|
||||
receiver, opPackageName, enrollReason, mFingerprintStateCallback);
|
||||
}
|
||||
|
||||
@Override // Binder call
|
||||
@@ -284,7 +351,7 @@ public class FingerprintService extends SystemService implements BiometricServic
|
||||
} else {
|
||||
provider.second.scheduleAuthenticate(provider.first, token, operationId, userId,
|
||||
0 /* cookie */, new ClientMonitorCallbackConverter(receiver), opPackageName,
|
||||
restricted, statsClient, isKeyguard);
|
||||
restricted, statsClient, isKeyguard, mFingerprintStateCallback);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -393,7 +460,7 @@ public class FingerprintService extends SystemService implements BiometricServic
|
||||
|
||||
provider.second.scheduleFingerDetect(provider.first, token, userId,
|
||||
new ClientMonitorCallbackConverter(receiver), opPackageName,
|
||||
BiometricsProtoEnums.CLIENT_KEYGUARD);
|
||||
BiometricsProtoEnums.CLIENT_KEYGUARD, mFingerprintStateCallback);
|
||||
}
|
||||
|
||||
@Override // Binder call
|
||||
@@ -411,7 +478,8 @@ public class FingerprintService extends SystemService implements BiometricServic
|
||||
final boolean restricted = true; // BiometricPrompt is always restricted
|
||||
provider.scheduleAuthenticate(sensorId, token, operationId, userId, cookie,
|
||||
new ClientMonitorCallbackConverter(sensorReceiver), opPackageName, restricted,
|
||||
BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, allowBackgroundAuthentication);
|
||||
BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, allowBackgroundAuthentication,
|
||||
mFingerprintStateCallback);
|
||||
}
|
||||
|
||||
@Override // Binder call
|
||||
@@ -568,6 +636,7 @@ public class FingerprintService extends SystemService implements BiometricServic
|
||||
: provider.getSensorProperties()) {
|
||||
pw.println("Dumping for sensorId: " + props.sensorId
|
||||
+ ", provider: " + provider.getClass().getSimpleName());
|
||||
pw.println("Fps state: " + mFingerprintState);
|
||||
provider.dumpInternal(props.sensorId, pw);
|
||||
pw.println();
|
||||
}
|
||||
@@ -813,6 +882,11 @@ public class FingerprintService extends SystemService implements BiometricServic
|
||||
provider.setUdfpsOverlayController(controller);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerFingerprintStateListener(@NonNull IFingerprintStateListener listener) {
|
||||
FingerprintService.this.registerFingerprintStateListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
public FingerprintService(Context context) {
|
||||
@@ -823,6 +897,8 @@ public class FingerprintService extends SystemService implements BiometricServic
|
||||
mLockoutResetDispatcher = new LockoutResetDispatcher(context);
|
||||
mLockPatternUtils = new LockPatternUtils(context);
|
||||
mServiceProviders = new ArrayList<>();
|
||||
mFingerprintStateCallback = new FingerprintStateCallback();
|
||||
mFingerprintState = STATE_IDLE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -86,18 +86,21 @@ public interface ServiceProvider {
|
||||
|
||||
void scheduleEnroll(int sensorId, @NonNull IBinder token, byte[] hardwareAuthToken, int userId,
|
||||
@NonNull IFingerprintServiceReceiver receiver, @NonNull String opPackageName,
|
||||
@FingerprintManager.EnrollReason int enrollReason);
|
||||
@FingerprintManager.EnrollReason int enrollReason,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback);
|
||||
|
||||
void cancelEnrollment(int sensorId, @NonNull IBinder token);
|
||||
|
||||
void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId,
|
||||
@NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName,
|
||||
int statsClient);
|
||||
int statsClient,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback);
|
||||
|
||||
void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId,
|
||||
int cookie, @NonNull ClientMonitorCallbackConverter callback,
|
||||
@NonNull String opPackageName, boolean restricted, int statsClient,
|
||||
boolean allowBackgroundAuthentication);
|
||||
boolean allowBackgroundAuthentication,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback);
|
||||
|
||||
void startPreparedClient(int sensorId, int cookie);
|
||||
|
||||
@@ -148,5 +151,6 @@ public interface ServiceProvider {
|
||||
|
||||
@NonNull
|
||||
ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback,
|
||||
@NonNull String opPackageName);
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ import android.util.Slog;
|
||||
import com.android.server.biometrics.HardwareAuthTokenUtils;
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.sensors.BaseClientMonitor;
|
||||
import com.android.server.biometrics.sensors.fingerprint.FingerprintService;
|
||||
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
|
||||
|
||||
import java.util.HashSet;
|
||||
@@ -50,6 +51,7 @@ class BiometricTestSessionImpl extends ITestSession.Stub {
|
||||
@NonNull private final Context mContext;
|
||||
private final int mSensorId;
|
||||
@NonNull private final ITestSessionCallback mCallback;
|
||||
@NonNull private final FingerprintService.FingerprintStateCallback mFingerprintStateCallback;
|
||||
@NonNull private final FingerprintProvider mProvider;
|
||||
@NonNull private final Sensor mSensor;
|
||||
@NonNull private final Set<Integer> mEnrollmentIds;
|
||||
@@ -114,11 +116,14 @@ class BiometricTestSessionImpl extends ITestSession.Stub {
|
||||
};
|
||||
|
||||
BiometricTestSessionImpl(@NonNull Context context, int sensorId,
|
||||
@NonNull ITestSessionCallback callback, @NonNull FingerprintProvider provider,
|
||||
@NonNull ITestSessionCallback callback,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback,
|
||||
@NonNull FingerprintProvider provider,
|
||||
@NonNull Sensor sensor) {
|
||||
mContext = context;
|
||||
mSensorId = sensorId;
|
||||
mCallback = callback;
|
||||
mFingerprintStateCallback = fingerprintStateCallback;
|
||||
mProvider = provider;
|
||||
mSensor = sensor;
|
||||
mEnrollmentIds = new HashSet<>();
|
||||
@@ -138,7 +143,8 @@ class BiometricTestSessionImpl extends ITestSession.Stub {
|
||||
Utils.checkPermission(mContext, TEST_BIOMETRIC);
|
||||
|
||||
mProvider.scheduleEnroll(mSensorId, new Binder(), new byte[69], userId, mReceiver,
|
||||
mContext.getOpPackageName(), FingerprintManager.ENROLL_ENROLL);
|
||||
mContext.getOpPackageName(), FingerprintManager.ENROLL_ENROLL,
|
||||
mFingerprintStateCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -55,6 +55,7 @@ import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.InvalidationRequesterClient;
|
||||
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
|
||||
import com.android.server.biometrics.sensors.PerformanceTracker;
|
||||
import com.android.server.biometrics.sensors.fingerprint.FingerprintService;
|
||||
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
|
||||
import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher;
|
||||
import com.android.server.biometrics.sensors.fingerprint.ServiceProvider;
|
||||
@@ -318,7 +319,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
@Override
|
||||
public void scheduleEnroll(int sensorId, @NonNull IBinder token, byte[] hardwareAuthToken,
|
||||
int userId, @NonNull IFingerprintServiceReceiver receiver,
|
||||
@NonNull String opPackageName, @FingerprintManager.EnrollReason int enrollReason) {
|
||||
@NonNull String opPackageName, @FingerprintManager.EnrollReason int enrollReason,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
|
||||
mHandler.post(() -> {
|
||||
final int maxTemplatesPerUser = mSensors.get(sensorId).getSensorProperties()
|
||||
.maxEnrollmentsPerUser;
|
||||
@@ -328,9 +330,16 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
opPackageName, FingerprintUtils.getInstance(sensorId), sensorId,
|
||||
mUdfpsOverlayController, maxTemplatesPerUser, enrollReason);
|
||||
scheduleForSensor(sensorId, client, new BaseClientMonitor.Callback() {
|
||||
|
||||
@Override
|
||||
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
|
||||
fingerprintStateCallback.onClientStarted(clientMonitor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
|
||||
boolean success) {
|
||||
fingerprintStateCallback.onClientFinished(clientMonitor, success);
|
||||
if (success) {
|
||||
scheduleLoadAuthenticatorIdsForUser(sensorId, userId);
|
||||
scheduleInvalidationRequest(sensorId, userId);
|
||||
@@ -348,14 +357,15 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
@Override
|
||||
public void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId,
|
||||
@NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName,
|
||||
int statsClient) {
|
||||
int statsClient,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
|
||||
mHandler.post(() -> {
|
||||
final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId);
|
||||
final FingerprintDetectClient client = new FingerprintDetectClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), token, callback, userId,
|
||||
opPackageName, sensorId, mUdfpsOverlayController, isStrongBiometric,
|
||||
statsClient);
|
||||
scheduleForSensor(sensorId, client);
|
||||
scheduleForSensor(sensorId, client, fingerprintStateCallback);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -363,7 +373,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId,
|
||||
int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback,
|
||||
@NonNull String opPackageName, boolean restricted, int statsClient,
|
||||
boolean allowBackgroundAuthentication) {
|
||||
boolean allowBackgroundAuthentication,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
|
||||
mHandler.post(() -> {
|
||||
final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId);
|
||||
final FingerprintAuthenticationClient client = new FingerprintAuthenticationClient(
|
||||
@@ -372,7 +383,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
false /* requireConfirmation */, sensorId, isStrongBiometric, statsClient,
|
||||
mTaskStackListener, mSensors.get(sensorId).getLockoutCache(),
|
||||
mUdfpsOverlayController, allowBackgroundAuthentication);
|
||||
scheduleForSensor(sensorId, client);
|
||||
scheduleForSensor(sensorId, client, fingerprintStateCallback);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -561,8 +572,9 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
@NonNull
|
||||
@Override
|
||||
public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback,
|
||||
@NonNull String opPackageName) {
|
||||
return mSensors.get(sensorId).createTestSession(callback);
|
||||
return mSensors.get(sensorId).createTestSession(callback, fingerprintStateCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -52,13 +52,13 @@ import com.android.server.biometrics.sensors.BiometricScheduler;
|
||||
import com.android.server.biometrics.sensors.EnumerateConsumer;
|
||||
import com.android.server.biometrics.sensors.ErrorConsumer;
|
||||
import com.android.server.biometrics.sensors.HalClientMonitor;
|
||||
import com.android.server.biometrics.sensors.Interruptable;
|
||||
import com.android.server.biometrics.sensors.LockoutCache;
|
||||
import com.android.server.biometrics.sensors.LockoutConsumer;
|
||||
import com.android.server.biometrics.sensors.RemovalConsumer;
|
||||
import com.android.server.biometrics.sensors.StartUserClient;
|
||||
import com.android.server.biometrics.sensors.StopUserClient;
|
||||
import com.android.server.biometrics.sensors.UserAwareBiometricScheduler;
|
||||
import com.android.server.biometrics.sensors.fingerprint.FingerprintService;
|
||||
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
|
||||
import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher;
|
||||
|
||||
@@ -486,9 +486,10 @@ class Sensor {
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull ITestSession createTestSession(@NonNull ITestSessionCallback callback) {
|
||||
@NonNull ITestSession createTestSession(@NonNull ITestSessionCallback callback,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
|
||||
return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback,
|
||||
mProvider, this);
|
||||
fingerprintStateCallback, mProvider, this);
|
||||
}
|
||||
|
||||
@NonNull BiometricScheduler getScheduler() {
|
||||
|
||||
@@ -31,6 +31,7 @@ import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.sensors.BaseClientMonitor;
|
||||
import com.android.server.biometrics.sensors.fingerprint.FingerprintService;
|
||||
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -51,6 +52,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
|
||||
@NonNull private final Context mContext;
|
||||
private final int mSensorId;
|
||||
@NonNull private final ITestSessionCallback mCallback;
|
||||
@NonNull private final FingerprintService.FingerprintStateCallback mFingerprintStateCallback;
|
||||
@NonNull private final Fingerprint21 mFingerprint21;
|
||||
@NonNull private final Fingerprint21.HalResultController mHalResultController;
|
||||
@NonNull private final Set<Integer> mEnrollmentIds;
|
||||
@@ -116,12 +118,14 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
|
||||
|
||||
BiometricTestSessionImpl(@NonNull Context context, int sensorId,
|
||||
@NonNull ITestSessionCallback callback,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback,
|
||||
@NonNull Fingerprint21 fingerprint21,
|
||||
@NonNull Fingerprint21.HalResultController halResultController) {
|
||||
mContext = context;
|
||||
mSensorId = sensorId;
|
||||
mCallback = callback;
|
||||
mFingerprint21 = fingerprint21;
|
||||
mFingerprintStateCallback = fingerprintStateCallback;
|
||||
mHalResultController = halResultController;
|
||||
mEnrollmentIds = new HashSet<>();
|
||||
mRandom = new Random();
|
||||
@@ -139,7 +143,8 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
|
||||
Utils.checkPermission(mContext, TEST_BIOMETRIC);
|
||||
|
||||
mFingerprint21.scheduleEnroll(mSensorId, new Binder(), new byte[69], userId, mReceiver,
|
||||
mContext.getOpPackageName(), FingerprintManager.ENROLL_ENROLL);
|
||||
mContext.getOpPackageName(), FingerprintManager.ENROLL_ENROLL,
|
||||
mFingerprintStateCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -70,11 +70,11 @@ import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.EnumerateConsumer;
|
||||
import com.android.server.biometrics.sensors.ErrorConsumer;
|
||||
import com.android.server.biometrics.sensors.HalClientMonitor;
|
||||
import com.android.server.biometrics.sensors.Interruptable;
|
||||
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
|
||||
import com.android.server.biometrics.sensors.LockoutTracker;
|
||||
import com.android.server.biometrics.sensors.PerformanceTracker;
|
||||
import com.android.server.biometrics.sensors.RemovalConsumer;
|
||||
import com.android.server.biometrics.sensors.fingerprint.FingerprintService;
|
||||
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
|
||||
import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher;
|
||||
import com.android.server.biometrics.sensors.fingerprint.ServiceProvider;
|
||||
@@ -120,7 +120,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
private int mCurrentUserId = UserHandle.USER_NULL;
|
||||
private final boolean mIsUdfps;
|
||||
private final int mSensorId;
|
||||
private boolean mIsPowerbuttonFps;
|
||||
private final boolean mIsPowerbuttonFps;
|
||||
|
||||
private final class BiometricTaskStackListener extends TaskStackListener {
|
||||
@Override
|
||||
@@ -573,7 +573,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
public void scheduleEnroll(int sensorId, @NonNull IBinder token,
|
||||
@NonNull byte[] hardwareAuthToken, int userId,
|
||||
@NonNull IFingerprintServiceReceiver receiver, @NonNull String opPackageName,
|
||||
@FingerprintManager.EnrollReason int enrollReason) {
|
||||
@FingerprintManager.EnrollReason int enrollReason,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
|
||||
mHandler.post(() -> {
|
||||
scheduleUpdateActiveUserWithoutHandler(userId);
|
||||
|
||||
@@ -583,9 +584,15 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
ENROLL_TIMEOUT_SEC, mSensorProperties.sensorId, mUdfpsOverlayController,
|
||||
enrollReason);
|
||||
mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
|
||||
@Override
|
||||
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
|
||||
fingerprintStateCallback.onClientStarted(clientMonitor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
|
||||
boolean success) {
|
||||
fingerprintStateCallback.onClientFinished(clientMonitor, success);
|
||||
if (success) {
|
||||
// Update authenticatorIds
|
||||
scheduleUpdateActiveUserWithoutHandler(clientMonitor.getTargetUserId(),
|
||||
@@ -606,7 +613,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
@Override
|
||||
public void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId,
|
||||
@NonNull ClientMonitorCallbackConverter listener, @NonNull String opPackageName,
|
||||
int statsClient) {
|
||||
int statsClient,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
|
||||
mHandler.post(() -> {
|
||||
scheduleUpdateActiveUserWithoutHandler(userId);
|
||||
|
||||
@@ -615,7 +623,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
mLazyDaemon, token, listener, userId, opPackageName,
|
||||
mSensorProperties.sensorId, mUdfpsOverlayController, isStrongBiometric,
|
||||
statsClient);
|
||||
mScheduler.scheduleClientMonitor(client);
|
||||
mScheduler.scheduleClientMonitor(client, fingerprintStateCallback);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -623,7 +631,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId,
|
||||
int userId, int cookie, @NonNull ClientMonitorCallbackConverter listener,
|
||||
@NonNull String opPackageName, boolean restricted, int statsClient,
|
||||
boolean allowBackgroundAuthentication) {
|
||||
boolean allowBackgroundAuthentication,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback) {
|
||||
mHandler.post(() -> {
|
||||
scheduleUpdateActiveUserWithoutHandler(userId);
|
||||
|
||||
@@ -634,7 +643,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
mSensorProperties.sensorId, isStrongBiometric, statsClient,
|
||||
mTaskStackListener, mLockoutTracker, mUdfpsOverlayController,
|
||||
allowBackgroundAuthentication);
|
||||
mScheduler.scheduleClientMonitor(client);
|
||||
mScheduler.scheduleClientMonitor(client, fingerprintStateCallback);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -887,8 +896,9 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
@NonNull
|
||||
@Override
|
||||
public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
|
||||
@NonNull FingerprintService.FingerprintStateCallback fingerprintStateCallback,
|
||||
@NonNull String opPackageName) {
|
||||
return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback, this,
|
||||
mHalResultController);
|
||||
return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback,
|
||||
fingerprintStateCallback, this, mHalResultController);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -402,7 +402,7 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage
|
||||
// internal preemption logic is not run.
|
||||
mFingerprint21.scheduleAuthenticate(mFingerprint21.mSensorProperties.sensorId, token,
|
||||
operationId, user, cookie, listener, opPackageName, restricted, statsClient,
|
||||
isKeyguard);
|
||||
isKeyguard, null /* fingerprintStateCallback */);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user