Merge changes Id07e160b,I3ac8049c
* changes: Update client monitors to use HAL context methods. Add communication channel for AoD state for all biometric operations.
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.biometrics;
|
||||
|
||||
/**
|
||||
* A secondary communication channel from AuthController back to BiometricService for
|
||||
* events that are not associated with an autentication session. See
|
||||
* {@link IBiometricSysuiReceiver} for events associated with a session.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
oneway interface IBiometricContextListener {
|
||||
void onDozeChanged(boolean isDozing);
|
||||
}
|
||||
@@ -20,6 +20,7 @@ import android.app.ITransientNotificationCallback;
|
||||
import android.content.ComponentName;
|
||||
import android.graphics.drawable.Icon;
|
||||
import android.graphics.Rect;
|
||||
import android.hardware.biometrics.IBiometricContextListener;
|
||||
import android.hardware.biometrics.IBiometricSysuiReceiver;
|
||||
import android.hardware.biometrics.PromptInfo;
|
||||
import android.hardware.fingerprint.IUdfpsHbmListener;
|
||||
@@ -166,6 +167,8 @@ oneway interface IStatusBar
|
||||
* Used to hide the authentication dialog, e.g. when the application cancels authentication.
|
||||
*/
|
||||
void hideAuthenticationDialog();
|
||||
/* Used to notify the biometric service of events that occur outside of an operation. */
|
||||
void setBiometicContextListener(in IBiometricContextListener listener);
|
||||
|
||||
/**
|
||||
* Sets an instance of IUdfpsHbmListener for UdfpsController.
|
||||
|
||||
@@ -20,6 +20,7 @@ import android.app.Notification;
|
||||
import android.content.ComponentName;
|
||||
import android.graphics.drawable.Icon;
|
||||
import android.graphics.Rect;
|
||||
import android.hardware.biometrics.IBiometricContextListener;
|
||||
import android.hardware.biometrics.IBiometricSysuiReceiver;
|
||||
import android.hardware.biometrics.PromptInfo;
|
||||
import android.hardware.fingerprint.IUdfpsHbmListener;
|
||||
@@ -125,6 +126,8 @@ interface IStatusBarService
|
||||
void onBiometricError(int modality, int error, int vendorCode);
|
||||
// Used to hide the authentication dialog, e.g. when the application cancels authentication
|
||||
void hideAuthenticationDialog();
|
||||
// Used to notify the biometric service of events that occur outside of an operation.
|
||||
void setBiometicContextListener(in IBiometricContextListener listener);
|
||||
|
||||
/**
|
||||
* Sets an instance of IUdfpsHbmListener for UdfpsController.
|
||||
|
||||
@@ -37,6 +37,7 @@ import android.hardware.biometrics.BiometricConstants;
|
||||
import android.hardware.biometrics.BiometricManager.Authenticators;
|
||||
import android.hardware.biometrics.BiometricManager.BiometricMultiSensorMode;
|
||||
import android.hardware.biometrics.BiometricPrompt;
|
||||
import android.hardware.biometrics.IBiometricContextListener;
|
||||
import android.hardware.biometrics.IBiometricSysuiReceiver;
|
||||
import android.hardware.biometrics.PromptInfo;
|
||||
import android.hardware.display.DisplayManager;
|
||||
@@ -64,6 +65,7 @@ import com.android.systemui.dagger.SysUISingleton;
|
||||
import com.android.systemui.dagger.qualifiers.Main;
|
||||
import com.android.systemui.doze.DozeReceiver;
|
||||
import com.android.systemui.keyguard.WakefulnessLifecycle;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.util.concurrency.Execution;
|
||||
|
||||
@@ -96,6 +98,7 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
|
||||
private final Handler mHandler;
|
||||
private final Execution mExecution;
|
||||
private final CommandQueue mCommandQueue;
|
||||
private final StatusBarStateController mStatusBarStateController;
|
||||
private final ActivityTaskManager mActivityTaskManager;
|
||||
@Nullable
|
||||
private final FingerprintManager mFingerprintManager;
|
||||
@@ -118,6 +121,7 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
|
||||
@Nullable private UdfpsController mUdfpsController;
|
||||
@Nullable private IUdfpsHbmListener mUdfpsHbmListener;
|
||||
@Nullable private SidefpsController mSidefpsController;
|
||||
@Nullable private IBiometricContextListener mBiometricContextListener;
|
||||
@VisibleForTesting
|
||||
TaskStackListener mTaskStackListener;
|
||||
@VisibleForTesting
|
||||
@@ -130,7 +134,7 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
|
||||
@Nullable private List<FingerprintSensorPropertiesInternal> mSidefpsProps;
|
||||
|
||||
@NonNull private final SparseBooleanArray mUdfpsEnrolledForUser;
|
||||
private SensorPrivacyManager mSensorPrivacyManager;
|
||||
@NonNull private final SensorPrivacyManager mSensorPrivacyManager;
|
||||
private final WakefulnessLifecycle mWakefulnessLifecycle;
|
||||
|
||||
private class BiometricTaskStackListener extends TaskStackListener {
|
||||
@@ -491,6 +495,7 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
|
||||
Provider<SidefpsController> sidefpsControllerFactory,
|
||||
@NonNull DisplayManager displayManager,
|
||||
WakefulnessLifecycle wakefulnessLifecycle,
|
||||
@NonNull StatusBarStateController statusBarStateController,
|
||||
@Main Handler handler) {
|
||||
super(context);
|
||||
mExecution = execution;
|
||||
@@ -504,6 +509,7 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
|
||||
mSidefpsControllerFactory = sidefpsControllerFactory;
|
||||
mWindowManager = windowManager;
|
||||
mUdfpsEnrolledForUser = new SparseBooleanArray();
|
||||
|
||||
mOrientationListener = new BiometricDisplayListener(
|
||||
context,
|
||||
displayManager,
|
||||
@@ -514,6 +520,14 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
|
||||
return Unit.INSTANCE;
|
||||
});
|
||||
|
||||
mStatusBarStateController = statusBarStateController;
|
||||
mStatusBarStateController.addCallback(new StatusBarStateController.StateListener() {
|
||||
@Override
|
||||
public void onDozingChanged(boolean isDozing) {
|
||||
notifyDozeChanged(isDozing);
|
||||
}
|
||||
});
|
||||
|
||||
mFaceProps = mFaceManager != null ? mFaceManager.getSensorPropertiesInternal() : null;
|
||||
|
||||
int[] faceAuthLocation = context.getResources().getIntArray(
|
||||
@@ -564,6 +578,22 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
|
||||
mActivityTaskManager.registerTaskStackListener(mTaskStackListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiometicContextListener(IBiometricContextListener listener) {
|
||||
mBiometricContextListener = listener;
|
||||
notifyDozeChanged(mStatusBarStateController.isDozing());
|
||||
}
|
||||
|
||||
private void notifyDozeChanged(boolean isDozing) {
|
||||
if (mBiometricContextListener != null) {
|
||||
try {
|
||||
mBiometricContextListener.onDozeChanged(isDozing);
|
||||
} catch (RemoteException e) {
|
||||
Log.w(TAG, "failed to notify initial doze state");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stores the listener received from {@link com.android.server.display.DisplayModeDirector}.
|
||||
*
|
||||
|
||||
@@ -37,6 +37,7 @@ import android.content.Context;
|
||||
import android.graphics.drawable.Icon;
|
||||
import android.hardware.biometrics.BiometricAuthenticator.Modality;
|
||||
import android.hardware.biometrics.BiometricManager.BiometricMultiSensorMode;
|
||||
import android.hardware.biometrics.IBiometricContextListener;
|
||||
import android.hardware.biometrics.IBiometricSysuiReceiver;
|
||||
import android.hardware.biometrics.PromptInfo;
|
||||
import android.hardware.display.DisplayManager;
|
||||
@@ -154,6 +155,7 @@ public class CommandQueue extends IStatusBar.Stub implements
|
||||
private static final int MSG_SET_UDFPS_HBM_LISTENER = 60 << MSG_SHIFT;
|
||||
private static final int MSG_TILE_SERVICE_REQUEST_ADD = 61 << MSG_SHIFT;
|
||||
private static final int MSG_TILE_SERVICE_REQUEST_CANCEL = 62 << MSG_SHIFT;
|
||||
private static final int MSG_SET_BIOMETRICS_LISTENER = 63 << MSG_SHIFT;
|
||||
|
||||
public static final int FLAG_EXCLUDE_NONE = 0;
|
||||
public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
|
||||
@@ -316,6 +318,12 @@ public class CommandQueue extends IStatusBar.Stub implements
|
||||
default void hideAuthenticationDialog() {
|
||||
}
|
||||
|
||||
/**
|
||||
* @see IStatusBar#setBiometicContextListener(IBiometricContextListener)
|
||||
*/
|
||||
default void setBiometicContextListener(IBiometricContextListener listener) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @see IStatusBar#setUdfpsHbmListener(IUdfpsHbmListener)
|
||||
*/
|
||||
@@ -957,6 +965,13 @@ public class CommandQueue extends IStatusBar.Stub implements
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiometicContextListener(IBiometricContextListener listener) {
|
||||
synchronized (mLock) {
|
||||
mHandler.obtainMessage(MSG_SET_BIOMETRICS_LISTENER, listener).sendToTarget();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUdfpsHbmListener(IUdfpsHbmListener listener) {
|
||||
synchronized (mLock) {
|
||||
@@ -1411,6 +1426,12 @@ public class CommandQueue extends IStatusBar.Stub implements
|
||||
mCallbacks.get(i).hideAuthenticationDialog();
|
||||
}
|
||||
break;
|
||||
case MSG_SET_BIOMETRICS_LISTENER:
|
||||
for (int i = 0; i < mCallbacks.size(); i++) {
|
||||
mCallbacks.get(i).setBiometicContextListener(
|
||||
(IBiometricContextListener) msg.obj);
|
||||
}
|
||||
break;
|
||||
case MSG_SET_UDFPS_HBM_LISTENER:
|
||||
for (int i = 0; i < mCallbacks.size(); i++) {
|
||||
mCallbacks.get(i).setUdfpsHbmListener((IUdfpsHbmListener) msg.obj);
|
||||
|
||||
@@ -27,10 +27,12 @@ import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.anyString;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
import static org.mockito.Mockito.inOrder;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@@ -46,6 +48,7 @@ import android.hardware.biometrics.BiometricConstants;
|
||||
import android.hardware.biometrics.BiometricManager;
|
||||
import android.hardware.biometrics.BiometricPrompt;
|
||||
import android.hardware.biometrics.ComponentInfoInternal;
|
||||
import android.hardware.biometrics.IBiometricContextListener;
|
||||
import android.hardware.biometrics.IBiometricSysuiReceiver;
|
||||
import android.hardware.biometrics.PromptInfo;
|
||||
import android.hardware.biometrics.SensorProperties;
|
||||
@@ -70,6 +73,7 @@ import androidx.test.filters.SmallTest;
|
||||
import com.android.internal.R;
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.keyguard.WakefulnessLifecycle;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.util.concurrency.Execution;
|
||||
import com.android.systemui.util.concurrency.FakeExecution;
|
||||
@@ -80,6 +84,7 @@ import org.junit.runner.RunWith;
|
||||
import org.mockito.AdditionalMatchers;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.InOrder;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
@@ -99,6 +104,8 @@ public class AuthControllerTest extends SysuiTestCase {
|
||||
@Mock
|
||||
private IBiometricSysuiReceiver mReceiver;
|
||||
@Mock
|
||||
private IBiometricContextListener mContextListener;
|
||||
@Mock
|
||||
private AuthDialog mDialog1;
|
||||
@Mock
|
||||
private AuthDialog mDialog2;
|
||||
@@ -120,10 +127,14 @@ public class AuthControllerTest extends SysuiTestCase {
|
||||
private DisplayManager mDisplayManager;
|
||||
@Mock
|
||||
private WakefulnessLifecycle mWakefulnessLifecycle;
|
||||
@Mock
|
||||
private StatusBarStateController mStatusBarStateController;
|
||||
@Captor
|
||||
ArgumentCaptor<IFingerprintAuthenticatorsRegisteredCallback> mAuthenticatorsRegisteredCaptor;
|
||||
@Captor
|
||||
ArgumentCaptor<FingerprintStateListener> mFingerprintStateCaptor;
|
||||
@Captor
|
||||
ArgumentCaptor<StatusBarStateController.StateListener> mStatusBarStateListenerCaptor;
|
||||
|
||||
private TestableContext mContextSpy;
|
||||
private Execution mExecution;
|
||||
@@ -175,12 +186,15 @@ public class AuthControllerTest extends SysuiTestCase {
|
||||
|
||||
mAuthController = new TestableAuthController(mContextSpy, mExecution, mCommandQueue,
|
||||
mActivityTaskManager, mWindowManager, mFingerprintManager, mFaceManager,
|
||||
() -> mUdfpsController, () -> mSidefpsController);
|
||||
() -> mUdfpsController, () -> mSidefpsController, mStatusBarStateController);
|
||||
|
||||
mAuthController.start();
|
||||
verify(mFingerprintManager).addAuthenticatorsRegisteredCallback(
|
||||
mAuthenticatorsRegisteredCaptor.capture());
|
||||
|
||||
when(mStatusBarStateController.isDozing()).thenReturn(false);
|
||||
verify(mStatusBarStateController).addCallback(mStatusBarStateListenerCaptor.capture());
|
||||
|
||||
mAuthenticatorsRegisteredCaptor.getValue().onAllAuthenticatorsRegistered(props);
|
||||
|
||||
// Ensures that the operations posted on the handler get executed.
|
||||
@@ -198,7 +212,8 @@ public class AuthControllerTest extends SysuiTestCase {
|
||||
// This test requires an uninitialized AuthController.
|
||||
AuthController authController = new TestableAuthController(mContextSpy, mExecution,
|
||||
mCommandQueue, mActivityTaskManager, mWindowManager, mFingerprintManager,
|
||||
mFaceManager, () -> mUdfpsController, () -> mSidefpsController);
|
||||
mFaceManager, () -> mUdfpsController, () -> mSidefpsController,
|
||||
mStatusBarStateController);
|
||||
authController.start();
|
||||
|
||||
verify(mFingerprintManager).addAuthenticatorsRegisteredCallback(
|
||||
@@ -221,7 +236,8 @@ public class AuthControllerTest extends SysuiTestCase {
|
||||
// This test requires an uninitialized AuthController.
|
||||
AuthController authController = new TestableAuthController(mContextSpy, mExecution,
|
||||
mCommandQueue, mActivityTaskManager, mWindowManager, mFingerprintManager,
|
||||
mFaceManager, () -> mUdfpsController, () -> mSidefpsController);
|
||||
mFaceManager, () -> mUdfpsController, () -> mSidefpsController,
|
||||
mStatusBarStateController);
|
||||
authController.start();
|
||||
|
||||
verify(mFingerprintManager).addAuthenticatorsRegisteredCallback(
|
||||
@@ -656,6 +672,19 @@ public class AuthControllerTest extends SysuiTestCase {
|
||||
verify(callback).onBiometricPromptDismissed();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testForwardsDozeEvent() throws RemoteException {
|
||||
mAuthController.setBiometicContextListener(mContextListener);
|
||||
|
||||
mStatusBarStateListenerCaptor.getValue().onDozingChanged(false);
|
||||
mStatusBarStateListenerCaptor.getValue().onDozingChanged(true);
|
||||
|
||||
InOrder order = inOrder(mContextListener);
|
||||
// invoked twice since the initial state is false
|
||||
order.verify(mContextListener, times(2)).onDozeChanged(eq(false));
|
||||
order.verify(mContextListener).onDozeChanged(eq(true));
|
||||
}
|
||||
|
||||
// Helpers
|
||||
|
||||
private void showDialog(int[] sensorIds, boolean credentialAllowed) {
|
||||
@@ -705,10 +734,12 @@ public class AuthControllerTest extends SysuiTestCase {
|
||||
FingerprintManager fingerprintManager,
|
||||
FaceManager faceManager,
|
||||
Provider<UdfpsController> udfpsControllerFactory,
|
||||
Provider<SidefpsController> sidefpsControllerFactory) {
|
||||
Provider<SidefpsController> sidefpsControllerFactory,
|
||||
StatusBarStateController statusBarStateController) {
|
||||
super(context, execution, commandQueue, activityTaskManager, windowManager,
|
||||
fingerprintManager, faceManager, udfpsControllerFactory,
|
||||
sidefpsControllerFactory, mDisplayManager, mWakefulnessLifecycle, mHandler);
|
||||
sidefpsControllerFactory, mDisplayManager, mWakefulnessLifecycle,
|
||||
statusBarStateController, mHandler);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.server.biometrics.log;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Cache for system state not directly related to biometric operations that is used for
|
||||
* logging or optimizations.
|
||||
*/
|
||||
public interface BiometricContext {
|
||||
/** Gets the context source. */
|
||||
static BiometricContext getInstance() {
|
||||
return BiometricContextProvider.sInstance.get();
|
||||
}
|
||||
|
||||
/** If the display is in AOD. */
|
||||
boolean isAoD();
|
||||
|
||||
/**
|
||||
* Subscribe to context changes.
|
||||
*
|
||||
* @param context context that will be modified when changed
|
||||
* @param consumer callback when the context is modified
|
||||
*/
|
||||
void subscribe(@NonNull OperationContext context, @NonNull Consumer<OperationContext> consumer);
|
||||
|
||||
/** Unsubscribe from context changes. */
|
||||
void unsubscribe(@NonNull OperationContext context);
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.server.biometrics.log;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.IBiometricContextListener;
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.os.Handler;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.util.Singleton;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.statusbar.IStatusBarService;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* A default provider for {@link BiometricContext}.
|
||||
*/
|
||||
class BiometricContextProvider implements BiometricContext {
|
||||
|
||||
private static final String TAG = "BiometricContextProvider";
|
||||
|
||||
static final Singleton<BiometricContextProvider> sInstance =
|
||||
new Singleton<BiometricContextProvider>() {
|
||||
@Override
|
||||
protected BiometricContextProvider create() {
|
||||
return new BiometricContextProvider(IStatusBarService.Stub.asInterface(
|
||||
ServiceManager.getService(
|
||||
Context.STATUS_BAR_SERVICE)), null /* handler */);
|
||||
}
|
||||
};
|
||||
|
||||
@NonNull
|
||||
private final Map<OperationContext, Consumer<OperationContext>> mSubscribers =
|
||||
new ConcurrentHashMap<>();
|
||||
|
||||
@VisibleForTesting
|
||||
BiometricContextProvider(@NonNull IStatusBarService service, @Nullable Handler handler) {
|
||||
try {
|
||||
service.setBiometicContextListener(new IBiometricContextListener.Stub() {
|
||||
@Override
|
||||
public void onDozeChanged(boolean isDozing) {
|
||||
mIsDozing = isDozing;
|
||||
notifyChanged();
|
||||
}
|
||||
|
||||
private void notifyChanged() {
|
||||
if (handler != null) {
|
||||
handler.post(() -> notifySubscribers());
|
||||
} else {
|
||||
notifySubscribers();
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (RemoteException e) {
|
||||
Slog.e(TAG, "Unable to register biometric context listener", e);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean mIsDozing = false;
|
||||
|
||||
@Override
|
||||
public boolean isAoD() {
|
||||
return mIsDozing;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void subscribe(@NonNull OperationContext context,
|
||||
@NonNull Consumer<OperationContext> consumer) {
|
||||
mSubscribers.put(context, consumer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unsubscribe(@NonNull OperationContext context) {
|
||||
mSubscribers.remove(context);
|
||||
}
|
||||
|
||||
private void notifySubscribers() {
|
||||
mSubscribers.forEach((context, consumer) -> {
|
||||
context.isAoD = mIsDozing;
|
||||
consumer.accept(context);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -79,6 +79,12 @@ public class BiometricLogger {
|
||||
}
|
||||
};
|
||||
|
||||
/** Get a new logger with all unknown fields (for operations that do not require logs). */
|
||||
public static BiometricLogger ofUnknown(@NonNull Context context) {
|
||||
return new BiometricLogger(context, BiometricsProtoEnums.MODALITY_UNKNOWN,
|
||||
BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param context system_server context
|
||||
* @param statsModality One of {@link BiometricsProtoEnums} MODALITY_* constants.
|
||||
@@ -103,6 +109,11 @@ public class BiometricLogger {
|
||||
mSensorManager = sensorManager;
|
||||
}
|
||||
|
||||
/** Creates a new logger with the action replaced with the new action. */
|
||||
public BiometricLogger swapAction(@NonNull Context context, int statsAction) {
|
||||
return new BiometricLogger(context, mStatsModality, statsAction, mStatsClient);
|
||||
}
|
||||
|
||||
/** Disable logging metrics and only log critical events, such as system health issues. */
|
||||
public void disableMetrics() {
|
||||
mShouldLogMetrics = false;
|
||||
|
||||
@@ -29,6 +29,9 @@ import android.os.VibrationEffect;
|
||||
import android.os.Vibrator;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
@@ -57,9 +60,9 @@ public abstract class AcquisitionClient<T> extends HalClientMonitor<T> implement
|
||||
public AcquisitionClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
|
||||
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull String owner, int cookie, int sensorId, boolean shouldVibrate,
|
||||
int statsModality, int statsAction, int statsClient) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, cookie, sensorId, statsModality,
|
||||
statsAction, statsClient);
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, cookie, sensorId,
|
||||
logger, biometricContext);
|
||||
mPowerManager = context.getSystemService(PowerManager.class);
|
||||
mShouldVibrate = shouldVibrate;
|
||||
}
|
||||
|
||||
@@ -29,7 +29,6 @@ import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricConstants;
|
||||
import android.hardware.biometrics.BiometricManager;
|
||||
import android.hardware.biometrics.BiometricOverlayConstants;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.os.SystemClock;
|
||||
@@ -39,6 +38,8 @@ import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -93,13 +94,13 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T>
|
||||
public AuthenticationClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
|
||||
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
|
||||
int targetUserId, long operationId, boolean restricted, @NonNull String owner,
|
||||
int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric,
|
||||
int statsModality, int statsClient, @Nullable TaskStackListener taskStackListener,
|
||||
int cookie, boolean requireConfirmation, int sensorId,
|
||||
@NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext,
|
||||
boolean isStrongBiometric, @Nullable TaskStackListener taskStackListener,
|
||||
@NonNull LockoutTracker lockoutTracker, boolean allowBackgroundAuthentication,
|
||||
boolean shouldVibrate, boolean isKeyguardBypassEnabled) {
|
||||
super(context, lazyDaemon, token, listener, targetUserId, owner, cookie, sensorId,
|
||||
shouldVibrate, statsModality, BiometricsProtoEnums.ACTION_AUTHENTICATE,
|
||||
statsClient);
|
||||
shouldVibrate, biometricLogger, biometricContext);
|
||||
mIsStrongBiometric = isStrongBiometric;
|
||||
mOperationId = operationId;
|
||||
mRequireConfirmation = requireConfirmation;
|
||||
|
||||
@@ -21,12 +21,12 @@ import static com.android.internal.annotations.VisibleForTesting.Visibility;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.NoSuchElementException;
|
||||
@@ -50,6 +50,7 @@ public abstract class BaseClientMonitor implements IBinder.DeathRecipient {
|
||||
@NonNull private final String mOwner;
|
||||
private final int mSensorId; // sensorId as configured by the framework
|
||||
@NonNull private final BiometricLogger mLogger;
|
||||
@NonNull private final BiometricContext mBiometricContext;
|
||||
|
||||
@Nullable private IBinder mToken;
|
||||
private long mRequestId;
|
||||
@@ -82,22 +83,13 @@ public abstract class BaseClientMonitor implements IBinder.DeathRecipient {
|
||||
* @param owner name of the client that owns this
|
||||
* @param cookie BiometricPrompt authentication cookie (to be moved into a subclass soon)
|
||||
* @param sensorId ID of the sensor that the operation should be requested of
|
||||
* @param statsModality One of {@link BiometricsProtoEnums} MODALITY_* constants
|
||||
* @param statsAction One of {@link BiometricsProtoEnums} ACTION_* constants
|
||||
* @param statsClient One of {@link BiometricsProtoEnums} CLIENT_* constants
|
||||
* @param logger framework stats logger
|
||||
* @param biometricContext system context metadata
|
||||
*/
|
||||
public BaseClientMonitor(@NonNull Context context,
|
||||
@Nullable IBinder token, @Nullable ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull String owner, int cookie, int sensorId, int statsModality, int statsAction,
|
||||
int statsClient) {
|
||||
this(context, token, listener, userId, owner, cookie, sensorId,
|
||||
new BiometricLogger(context, statsModality, statsAction, statsClient));
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
BaseClientMonitor(@NonNull Context context,
|
||||
@Nullable IBinder token, @Nullable ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull String owner, int cookie, int sensorId, @NonNull BiometricLogger logger) {
|
||||
@NonNull String owner, int cookie, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
mSequentialId = sCount++;
|
||||
mContext = context;
|
||||
mToken = token;
|
||||
@@ -108,6 +100,7 @@ public abstract class BaseClientMonitor implements IBinder.DeathRecipient {
|
||||
mCookie = cookie;
|
||||
mSensorId = sensorId;
|
||||
mLogger = logger;
|
||||
mBiometricContext = biometricContext;
|
||||
|
||||
try {
|
||||
if (token != null) {
|
||||
@@ -207,20 +200,29 @@ public abstract class BaseClientMonitor implements IBinder.DeathRecipient {
|
||||
return false;
|
||||
}
|
||||
|
||||
/** System context that may change during operations. */
|
||||
@NonNull
|
||||
protected BiometricContext getBiometricContext() {
|
||||
return mBiometricContext;
|
||||
}
|
||||
|
||||
/** Logger for this client */
|
||||
@NonNull
|
||||
public BiometricLogger getLogger() {
|
||||
return mLogger;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public final Context getContext() {
|
||||
return mContext;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public final String getOwnerString() {
|
||||
return mOwner;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public final ClientMonitorCallbackConverter getListener() {
|
||||
return mListener;
|
||||
}
|
||||
@@ -229,6 +231,7 @@ public abstract class BaseClientMonitor implements IBinder.DeathRecipient {
|
||||
return mTargetUserId;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public final IBinder getToken() {
|
||||
return mToken;
|
||||
}
|
||||
|
||||
@@ -20,13 +20,14 @@ import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricOverlayConstants;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.fingerprint.FingerprintManager;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.function.Supplier;
|
||||
@@ -53,10 +54,10 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> implements En
|
||||
public EnrollClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
|
||||
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull byte[] hardwareAuthToken, @NonNull String owner, @NonNull BiometricUtils utils,
|
||||
int timeoutSec, int statsModality, int sensorId, boolean shouldVibrate) {
|
||||
int timeoutSec, int sensorId, boolean shouldVibrate,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
|
||||
shouldVibrate, statsModality, BiometricsProtoEnums.ACTION_ENROLL,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
shouldVibrate, logger, biometricContext);
|
||||
mBiometricUtils = utils;
|
||||
mHardwareAuthToken = Arrays.copyOf(hardwareAuthToken, hardwareAuthToken.length);
|
||||
mTimeoutSec = timeoutSec;
|
||||
|
||||
@@ -18,12 +18,13 @@ package com.android.server.biometrics.sensors;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@@ -33,10 +34,10 @@ public abstract class GenerateChallengeClient<T> extends HalClientMonitor<T> {
|
||||
|
||||
public GenerateChallengeClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
|
||||
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
|
||||
int userId, @NonNull String owner, int sensorId) {
|
||||
int userId, @NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
biometricLogger, biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,9 +19,12 @@ package com.android.server.biometrics.sensors;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.os.IBinder;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
@@ -33,6 +36,9 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor {
|
||||
@NonNull
|
||||
protected final Supplier<T> mLazyDaemon;
|
||||
|
||||
@NonNull
|
||||
protected final OperationContext mOperationContext = new OperationContext();
|
||||
|
||||
/**
|
||||
* @param context system_server context
|
||||
* @param lazyDaemon pointer for lazy retrieval of the HAL
|
||||
@@ -42,16 +48,15 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor {
|
||||
* @param owner name of the client that owns this
|
||||
* @param cookie BiometricPrompt authentication cookie (to be moved into a subclass soon)
|
||||
* @param sensorId ID of the sensor that the operation should be requested of
|
||||
* @param statsModality One of {@link BiometricsProtoEnums} MODALITY_* constants
|
||||
* @param statsAction One of {@link BiometricsProtoEnums} ACTION_* constants
|
||||
* @param statsClient One of {@link BiometricsProtoEnums} CLIENT_* constants
|
||||
* @param biometricLogger framework stats logger
|
||||
* @param biometricContext system context metadata
|
||||
*/
|
||||
public HalClientMonitor(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
|
||||
@Nullable IBinder token, @Nullable ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull String owner, int cookie, int sensorId, int statsModality, int statsAction,
|
||||
int statsClient) {
|
||||
super(context, token, listener, userId, owner, cookie, sensorId, statsModality,
|
||||
statsAction, statsClient);
|
||||
@NonNull String owner, int cookie, int sensorId,
|
||||
@NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, token, listener, userId, owner, cookie, sensorId,
|
||||
biometricLogger, biometricContext);
|
||||
mLazyDaemon = lazyDaemon;
|
||||
}
|
||||
|
||||
@@ -71,4 +76,12 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor {
|
||||
* {@link #start(ClientMonitorCallback)}.
|
||||
*/
|
||||
public abstract void unableToStart();
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
super.destroy();
|
||||
|
||||
// subclasses should do this earlier in most cases, but ensure it happens now
|
||||
getBiometricContext().unsubscribe(mOperationContext);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,11 +19,12 @@ package com.android.server.biometrics.sensors;
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.os.IBinder;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -101,19 +102,22 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide
|
||||
|
||||
protected abstract InternalEnumerateClient<T> getEnumerateClient(Context context,
|
||||
Supplier<T> lazyDaemon, IBinder token, int userId, String owner,
|
||||
List<S> enrolledList, BiometricUtils<S> utils, int sensorId);
|
||||
List<S> enrolledList, BiometricUtils<S> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext);
|
||||
|
||||
protected abstract RemovalClient<S, T> getRemovalClient(Context context,
|
||||
Supplier<T> lazyDaemon, IBinder token, int biometricId, int userId, String owner,
|
||||
BiometricUtils<S> utils, int sensorId, Map<Integer, Long> authenticatorIds);
|
||||
BiometricUtils<S> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
Map<Integer, Long> authenticatorIds);
|
||||
|
||||
protected InternalCleanupClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
|
||||
int userId, @NonNull String owner, int sensorId, int statsModality,
|
||||
int userId, @NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull List<S> enrolledList, @NonNull BiometricUtils<S> utils,
|
||||
@NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, null /* token */, null /* ClientMonitorCallbackConverter */,
|
||||
userId, owner, 0 /* cookie */, sensorId, statsModality,
|
||||
BiometricsProtoEnums.ACTION_ENUMERATE, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
userId, owner, 0 /* cookie */, sensorId, logger, biometricContext);
|
||||
mBiometricUtils = utils;
|
||||
mAuthenticatorIds = authenticatorIds;
|
||||
mEnrolledList = enrolledList;
|
||||
@@ -127,7 +131,8 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide
|
||||
mUnknownHALTemplates.remove(template);
|
||||
mCurrentTask = getRemovalClient(getContext(), mLazyDaemon, getToken(),
|
||||
template.mIdentifier.getBiometricId(), template.mUserId,
|
||||
getContext().getPackageName(), mBiometricUtils, getSensorId(), mAuthenticatorIds);
|
||||
getContext().getPackageName(), mBiometricUtils, getSensorId(),
|
||||
getLogger(), getBiometricContext(), mAuthenticatorIds);
|
||||
|
||||
getLogger().logUnknownEnrollmentInHal();
|
||||
|
||||
@@ -145,7 +150,8 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide
|
||||
|
||||
// Start enumeration. Removal will start if necessary, when enumeration is completed.
|
||||
mCurrentTask = getEnumerateClient(getContext(), mLazyDaemon, getToken(), getTargetUserId(),
|
||||
getOwnerString(), mEnrolledList, mBiometricUtils, getSensorId());
|
||||
getOwnerString(), mEnrolledList, mBiometricUtils, getSensorId(), getLogger(),
|
||||
getBiometricContext());
|
||||
|
||||
Slog.d(TAG, "Starting enumerate: " + mCurrentTask);
|
||||
mCurrentTask.start(mEnumerateCallback);
|
||||
|
||||
@@ -19,11 +19,12 @@ package com.android.server.biometrics.sensors;
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.os.IBinder;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -47,12 +48,14 @@ public abstract class InternalEnumerateClient<T> extends HalClientMonitor<T>
|
||||
protected InternalEnumerateClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
|
||||
@NonNull IBinder token, int userId, @NonNull String owner,
|
||||
@NonNull List<? extends BiometricAuthenticator.Identifier> enrolledList,
|
||||
@NonNull BiometricUtils utils, int sensorId, int statsModality) {
|
||||
@NonNull BiometricUtils utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
// Internal enumerate does not need to send results to anyone. Cleanup (enumerate + remove)
|
||||
// is all done internally.
|
||||
super(context, lazyDaemon, token, null /* ClientMonitorCallbackConverter */, userId, owner,
|
||||
0 /* cookie */, sensorId, statsModality, BiometricsProtoEnums.ACTION_ENUMERATE,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
0 /* cookie */, sensorId, logger, biometricContext);
|
||||
//, BiometricsProtoEnums.ACTION_ENUMERATE,
|
||||
// BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
mEnrolledList = enrolledList;
|
||||
mUtils = utils;
|
||||
}
|
||||
|
||||
@@ -19,12 +19,13 @@ package com.android.server.biometrics.sensors;
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.IInvalidationCallback;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.function.Supplier;
|
||||
@@ -42,12 +43,13 @@ public abstract class InvalidationClient<S extends BiometricAuthenticator.Identi
|
||||
@NonNull private final IInvalidationCallback mInvalidationCallback;
|
||||
|
||||
public InvalidationClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
|
||||
int userId, int sensorId, @NonNull Map<Integer, Long> authenticatorIds,
|
||||
int userId, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull Map<Integer, Long> authenticatorIds,
|
||||
@NonNull IInvalidationCallback callback) {
|
||||
super(context, lazyDaemon, null /* token */, null /* listener */, userId,
|
||||
context.getOpPackageName(), 0 /* cookie */, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
logger, biometricContext);
|
||||
mAuthenticatorIds = authenticatorIds;
|
||||
mInvalidationCallback = callback;
|
||||
}
|
||||
|
||||
@@ -20,10 +20,11 @@ import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricManager;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.IInvalidationCallback;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
/**
|
||||
* ClientMonitor subclass responsible for coordination of authenticatorId invalidation of other
|
||||
@@ -74,11 +75,10 @@ public class InvalidationRequesterClient<S extends BiometricAuthenticator.Identi
|
||||
};
|
||||
|
||||
public InvalidationRequesterClient(@NonNull Context context, int userId, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull BiometricUtils<S> utils) {
|
||||
super(context, null /* token */, null /* listener */, userId,
|
||||
context.getOpPackageName(), 0 /* cookie */, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
context.getOpPackageName(), 0 /* cookie */, sensorId, logger, biometricContext);
|
||||
mBiometricManager = context.getSystemService(BiometricManager.class);
|
||||
mUtils = utils;
|
||||
}
|
||||
|
||||
@@ -19,12 +19,13 @@ package com.android.server.biometrics.sensors;
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.function.Supplier;
|
||||
@@ -44,10 +45,12 @@ public abstract class RemovalClient<S extends BiometricAuthenticator.Identifier,
|
||||
public RemovalClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
|
||||
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
|
||||
int userId, @NonNull String owner, @NonNull BiometricUtils<S> utils, int sensorId,
|
||||
@NonNull Map<Integer, Long> authenticatorIds, int statsModality) {
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
|
||||
statsModality, BiometricsProtoEnums.ACTION_REMOVE,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
logger, biometricContext);
|
||||
//, BiometricsProtoEnums.ACTION_REMOVE,
|
||||
// BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
mBiometricUtils = utils;
|
||||
mAuthenticatorIds = authenticatorIds;
|
||||
mHasEnrollmentsBeforeStarting = !utils.getBiometricsForUser(context, userId).isEmpty();
|
||||
|
||||
@@ -18,20 +18,21 @@ package com.android.server.biometrics.sensors;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.os.IBinder;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public abstract class RevokeChallengeClient<T> extends HalClientMonitor<T> {
|
||||
|
||||
public RevokeChallengeClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
|
||||
@NonNull IBinder token, int userId, @NonNull String owner, int sensorId) {
|
||||
@NonNull IBinder token, int userId, @NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, null /* listener */, userId, owner,
|
||||
0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN,
|
||||
BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
0 /* cookie */, sensorId, biometricLogger, biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,11 +19,12 @@ package com.android.server.biometrics.sensors;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.os.IBinder;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@@ -47,10 +48,10 @@ public abstract class StartUserClient<T, U> extends HalClientMonitor<T> {
|
||||
|
||||
public StartUserClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
|
||||
@Nullable IBinder token, int userId, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull UserStartedCallback<U> callback) {
|
||||
super(context, lazyDaemon, token, null /* listener */, userId, context.getOpPackageName(),
|
||||
0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN,
|
||||
BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
0 /* cookie */, sensorId, logger, biometricContext);
|
||||
mUserStartedCallback = callback;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,11 +19,12 @@ package com.android.server.biometrics.sensors;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.os.IBinder;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@@ -47,10 +48,10 @@ public abstract class StopUserClient<T> extends HalClientMonitor<T> {
|
||||
|
||||
public StopUserClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
|
||||
@Nullable IBinder token, int userId, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull UserStoppedCallback callback) {
|
||||
super(context, lazyDaemon, token, null /* listener */, userId, context.getOpPackageName(),
|
||||
0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN,
|
||||
BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
0 /* cookie */, sensorId, logger, biometricContext);
|
||||
mUserStoppedCallback = callback;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,11 +16,11 @@
|
||||
|
||||
package com.android.server.biometrics.sensors.face.aidl;
|
||||
|
||||
import static com.android.server.biometrics.sensors.face.aidl.Sensor.HalSessionCallback;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.hardware.biometrics.face.ISession;
|
||||
|
||||
import static com.android.server.biometrics.sensors.face.aidl.Sensor.HalSessionCallback;
|
||||
|
||||
/**
|
||||
* A holder for an AIDL {@link ISession} with additional metadata about the current user
|
||||
* and the backend.
|
||||
|
||||
@@ -25,7 +25,6 @@ import android.hardware.SensorPrivacyManager;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricConstants;
|
||||
import android.hardware.biometrics.BiometricFaceConstants;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.common.ICancellationSignal;
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.hardware.biometrics.common.OperationReason;
|
||||
@@ -37,7 +36,10 @@ import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.internal.R;
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.AuthenticationClient;
|
||||
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
@@ -76,19 +78,36 @@ class FaceAuthenticationClient extends AuthenticationClient<AidlSession>
|
||||
@NonNull IBinder token, long requestId,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId,
|
||||
boolean restricted, String owner, int cookie, boolean requireConfirmation, int sensorId,
|
||||
boolean isStrongBiometric, int statsClient, @NonNull UsageStats usageStats,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
boolean isStrongBiometric, @NonNull UsageStats usageStats,
|
||||
@NonNull LockoutCache lockoutCache, boolean allowBackgroundAuthentication,
|
||||
boolean isKeyguardBypassEnabled) {
|
||||
this(context, lazyDaemon, token, requestId, listener, targetUserId, operationId,
|
||||
restricted, owner, cookie, requireConfirmation, sensorId, logger, biometricContext,
|
||||
isStrongBiometric, usageStats, lockoutCache, allowBackgroundAuthentication,
|
||||
isKeyguardBypassEnabled, context.getSystemService(SensorPrivacyManager.class));
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
FaceAuthenticationClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon,
|
||||
@NonNull IBinder token, long requestId,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId,
|
||||
boolean restricted, String owner, int cookie, boolean requireConfirmation, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
boolean isStrongBiometric, @NonNull UsageStats usageStats,
|
||||
@NonNull LockoutCache lockoutCache, boolean allowBackgroundAuthentication,
|
||||
boolean isKeyguardBypassEnabled, SensorPrivacyManager sensorPrivacyManager) {
|
||||
super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted,
|
||||
owner, cookie, requireConfirmation, sensorId, isStrongBiometric,
|
||||
BiometricsProtoEnums.MODALITY_FACE, statsClient, null /* taskStackListener */,
|
||||
lockoutCache, allowBackgroundAuthentication, true /* shouldVibrate */,
|
||||
owner, cookie, requireConfirmation, sensorId, logger, biometricContext,
|
||||
isStrongBiometric, null /* taskStackListener */, lockoutCache,
|
||||
allowBackgroundAuthentication, true /* shouldVibrate */,
|
||||
isKeyguardBypassEnabled);
|
||||
setRequestId(requestId);
|
||||
mUsageStats = usageStats;
|
||||
mLockoutCache = lockoutCache;
|
||||
mNotificationManager = context.getSystemService(NotificationManager.class);
|
||||
mSensorPrivacyManager = context.getSystemService(SensorPrivacyManager.class);
|
||||
mSensorPrivacyManager = sensorPrivacyManager;
|
||||
|
||||
final Resources resources = getContext().getResources();
|
||||
mBiometricPromptIgnoreList = resources.getIntArray(
|
||||
@@ -139,10 +158,10 @@ class FaceAuthenticationClient extends AuthenticationClient<AidlSession>
|
||||
|
||||
if (session.hasContextMethods()) {
|
||||
final OperationContext context = new OperationContext();
|
||||
// TODO: add reason, id, and isAoD
|
||||
// TODO: add reason, id
|
||||
context.id = 0;
|
||||
context.reason = OperationReason.UNKNOWN;
|
||||
context.isAoD = false;
|
||||
context.isAoD = getBiometricContext().isAoD();
|
||||
context.isCrypto = isCryptoOperation();
|
||||
return session.getSession().authenticateWithContext(mOperationId, context);
|
||||
} else {
|
||||
|
||||
@@ -21,7 +21,6 @@ import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.SensorPrivacyManager;
|
||||
import android.hardware.biometrics.BiometricConstants;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.common.ICancellationSignal;
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.hardware.biometrics.common.OperationReason;
|
||||
@@ -29,7 +28,10 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.AcquisitionClient;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
@@ -52,13 +54,26 @@ public class FaceDetectClient extends AcquisitionClient<AidlSession> implements
|
||||
FaceDetectClient(@NonNull Context context, @NonNull Supplier<AidlSession> lazyDaemon,
|
||||
@NonNull IBinder token, long requestId,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull String owner, int sensorId, boolean isStrongBiometric, int statsClient) {
|
||||
@NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
boolean isStrongBiometric) {
|
||||
this(context, lazyDaemon, token, requestId, listener, userId, owner, sensorId,
|
||||
logger, biometricContext, isStrongBiometric,
|
||||
context.getSystemService(SensorPrivacyManager.class));
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
FaceDetectClient(@NonNull Context context, @NonNull Supplier<AidlSession> lazyDaemon,
|
||||
@NonNull IBinder token, long requestId,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
boolean isStrongBiometric, SensorPrivacyManager sensorPrivacyManager) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
|
||||
true /* shouldVibrate */, BiometricsProtoEnums.MODALITY_FACE,
|
||||
BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient);
|
||||
true /* shouldVibrate */, logger, biometricContext);
|
||||
setRequestId(requestId);
|
||||
mIsStrongBiometric = isStrongBiometric;
|
||||
mSensorPrivacyManager = context.getSystemService(SensorPrivacyManager.class);
|
||||
mSensorPrivacyManager = sensorPrivacyManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -102,10 +117,10 @@ public class FaceDetectClient extends AcquisitionClient<AidlSession> implements
|
||||
|
||||
if (session.hasContextMethods()) {
|
||||
final OperationContext context = new OperationContext();
|
||||
// TODO: add reason, id, and isAoD
|
||||
// TODO: add reason, id
|
||||
context.id = 0;
|
||||
context.reason = OperationReason.UNKNOWN;
|
||||
context.isAoD = false;
|
||||
context.isAoD = getBiometricContext().isAoD();
|
||||
context.isCrypto = isCryptoOperation();
|
||||
return session.getSession().detectInteractionWithContext(context);
|
||||
} else {
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricFaceConstants;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.common.ICancellationSignal;
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.hardware.biometrics.common.OperationReason;
|
||||
@@ -40,6 +39,8 @@ import android.view.Surface;
|
||||
import com.android.internal.R;
|
||||
import com.android.server.biometrics.HardwareAuthTokenUtils;
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BaseClientMonitor;
|
||||
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
@@ -89,11 +90,11 @@ public class FaceEnrollClient extends EnrollClient<AidlSession> {
|
||||
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull byte[] hardwareAuthToken, @NonNull String opPackageName, long requestId,
|
||||
@NonNull BiometricUtils<Face> utils, @NonNull int[] disabledFeatures, int timeoutSec,
|
||||
@Nullable Surface previewSurface, int sensorId, int maxTemplatesPerUser,
|
||||
boolean debugConsent) {
|
||||
@Nullable Surface previewSurface, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
int maxTemplatesPerUser, boolean debugConsent) {
|
||||
super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, opPackageName, utils,
|
||||
timeoutSec, BiometricsProtoEnums.MODALITY_FACE, sensorId,
|
||||
false /* shouldVibrate */);
|
||||
timeoutSec, sensorId, false /* shouldVibrate */, logger, biometricContext);
|
||||
setRequestId(requestId);
|
||||
mEnrollIgnoreList = getContext().getResources()
|
||||
.getIntArray(R.array.config_face_acquire_enroll_ignorelist);
|
||||
@@ -200,10 +201,10 @@ public class FaceEnrollClient extends EnrollClient<AidlSession> {
|
||||
|
||||
if (session.hasContextMethods()) {
|
||||
final OperationContext context = new OperationContext();
|
||||
// TODO: add reason, id, and isAoD
|
||||
// TODO: add reason, id
|
||||
context.id = 0;
|
||||
context.reason = OperationReason.UNKNOWN;
|
||||
context.isAoD = false;
|
||||
context.isAoD = getBiometricContext().isAoD();
|
||||
context.isCrypto = isCryptoOperation();
|
||||
return session.getSession().enrollWithContext(
|
||||
hat, EnrollmentType.DEFAULT, features, mHwPreviewHandle, context);
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.GenerateChallengeClient;
|
||||
|
||||
@@ -37,8 +39,10 @@ public class FaceGenerateChallengeClient extends GenerateChallengeClient<AidlSes
|
||||
FaceGenerateChallengeClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, @NonNull IBinder token,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner,
|
||||
int sensorId) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, sensorId);
|
||||
int sensorId, @NonNull BiometricLogger logger,
|
||||
@NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, sensorId, logger,
|
||||
biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -18,11 +18,12 @@ package com.android.server.biometrics.sensors.face.aidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.HalClientMonitor;
|
||||
|
||||
@@ -38,10 +39,10 @@ class FaceGetAuthenticatorIdClient extends HalClientMonitor<AidlSession> {
|
||||
FaceGetAuthenticatorIdClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon,
|
||||
int userId, @NonNull String opPackageName, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, null /* token */, null /* listener */, userId, opPackageName,
|
||||
0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_FACE,
|
||||
BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
0 /* cookie */, sensorId, logger, biometricContext);
|
||||
mAuthenticatorIds = authenticatorIds;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricFaceConstants;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.IFace;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
@@ -28,6 +27,8 @@ import android.provider.Settings;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.ErrorConsumer;
|
||||
@@ -48,10 +49,10 @@ public class FaceGetFeatureClient extends HalClientMonitor<AidlSession> implemen
|
||||
|
||||
FaceGetFeatureClient(@NonNull Context context, @NonNull Supplier<AidlSession> lazyDaemon,
|
||||
@NonNull IBinder token, @Nullable ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull String owner, int sensorId) {
|
||||
@NonNull String owner, int sensorId, @NonNull BiometricLogger logger,
|
||||
@NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
logger, biometricContext);
|
||||
mUserId = userId;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,11 +18,12 @@ package com.android.server.biometrics.sensors.face.aidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.IFace;
|
||||
import android.hardware.face.Face;
|
||||
import android.os.IBinder;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.InternalCleanupClient;
|
||||
import com.android.server.biometrics.sensors.InternalEnumerateClient;
|
||||
@@ -39,29 +40,32 @@ class FaceInternalCleanupClient extends InternalCleanupClient<Face, AidlSession>
|
||||
|
||||
FaceInternalCleanupClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, int userId, @NonNull String owner,
|
||||
int sensorId, @NonNull List<Face> enrolledList, @NonNull BiometricUtils<Face> utils,
|
||||
@NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, userId, owner, sensorId, BiometricsProtoEnums.MODALITY_FACE,
|
||||
int sensorId, @NonNull BiometricLogger logger,
|
||||
@NonNull BiometricContext biometricContext, @NonNull List<Face> enrolledList,
|
||||
@NonNull BiometricUtils<Face> utils, @NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, userId, owner, sensorId, logger, biometricContext,
|
||||
enrolledList, utils, authenticatorIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected InternalEnumerateClient<AidlSession> getEnumerateClient(Context context,
|
||||
Supplier<AidlSession> lazyDaemon, IBinder token, int userId, String owner,
|
||||
List<Face> enrolledList, BiometricUtils<Face> utils, int sensorId) {
|
||||
List<Face> enrolledList, BiometricUtils<Face> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
return new FaceInternalEnumerateClient(context, lazyDaemon, token, userId, owner,
|
||||
enrolledList, utils, sensorId);
|
||||
enrolledList, utils, sensorId, logger, biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected RemovalClient<Face, AidlSession> getRemovalClient(Context context,
|
||||
Supplier<AidlSession> lazyDaemon, IBinder token,
|
||||
int biometricId, int userId, String owner, BiometricUtils<Face> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
Map<Integer, Long> authenticatorIds) {
|
||||
// Internal remove does not need to send results to anyone. Cleanup (enumerate + remove)
|
||||
// is all done internally.
|
||||
return new FaceRemovalClient(context, lazyDaemon, token,
|
||||
null /* ClientMonitorCallbackConverter */, new int[] {biometricId}, userId, owner,
|
||||
utils, sensorId, authenticatorIds);
|
||||
utils, sensorId, logger, biometricContext, authenticatorIds);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,13 +18,14 @@ package com.android.server.biometrics.sensors.face.aidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.IFace;
|
||||
import android.hardware.face.Face;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.InternalEnumerateClient;
|
||||
|
||||
@@ -40,9 +41,10 @@ class FaceInternalEnumerateClient extends InternalEnumerateClient<AidlSession> {
|
||||
FaceInternalEnumerateClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, @NonNull IBinder token, int userId,
|
||||
@NonNull String owner, @NonNull List<Face> enrolledList,
|
||||
@NonNull BiometricUtils<Face> utils, int sensorId) {
|
||||
@NonNull BiometricUtils<Face> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, userId, owner, enrolledList, utils, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_FACE);
|
||||
logger, biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.hardware.face.Face;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.InvalidationClient;
|
||||
|
||||
import java.util.Map;
|
||||
@@ -33,8 +35,10 @@ public class FaceInvalidationClient extends InvalidationClient<Face, AidlSession
|
||||
|
||||
public FaceInvalidationClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, int userId, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull Map<Integer, Long> authenticatorIds, @NonNull IInvalidationCallback callback) {
|
||||
super(context, lazyDaemon, userId, sensorId, authenticatorIds, callback);
|
||||
super(context, lazyDaemon, userId, sensorId, logger, biometricContext,
|
||||
authenticatorIds, callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,6 +23,7 @@ import android.app.ActivityTaskManager;
|
||||
import android.app.TaskStackListener;
|
||||
import android.content.Context;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.ComponentInfoInternal;
|
||||
import android.hardware.biometrics.IInvalidationCallback;
|
||||
import android.hardware.biometrics.ITestSession;
|
||||
@@ -47,6 +48,8 @@ import android.view.Surface;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.AuthenticationClient;
|
||||
import com.android.server.biometrics.sensors.BaseClientMonitor;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
@@ -237,6 +240,9 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
final FaceGetAuthenticatorIdClient client = new FaceGetAuthenticatorIdClient(
|
||||
mContext, mSensors.get(sensorId).getLazySession(), userId,
|
||||
mContext.getOpPackageName(), sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(),
|
||||
mSensors.get(sensorId).getAuthenticatorIds());
|
||||
|
||||
scheduleForSensor(sensorId, client);
|
||||
@@ -247,6 +253,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
mHandler.post(() -> {
|
||||
final InvalidationRequesterClient<Face> client =
|
||||
new InvalidationRequesterClient<>(mContext, userId, sensorId,
|
||||
BiometricLogger.ofUnknown(mContext), BiometricContext.getInstance(),
|
||||
FaceUtils.getInstance(sensorId));
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
@@ -285,6 +292,9 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
mHandler.post(() -> {
|
||||
final FaceInvalidationClient client = new FaceInvalidationClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), userId, sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(),
|
||||
mSensors.get(sensorId).getAuthenticatorIds(), callback);
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
@@ -311,7 +321,10 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
mHandler.post(() -> {
|
||||
final FaceGenerateChallengeClient client = new FaceGenerateChallengeClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), token,
|
||||
new ClientMonitorCallbackConverter(receiver), userId, opPackageName, sensorId);
|
||||
new ClientMonitorCallbackConverter(receiver), userId, opPackageName, sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance());
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
}
|
||||
@@ -322,7 +335,9 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
mHandler.post(() -> {
|
||||
final FaceRevokeChallengeClient client = new FaceRevokeChallengeClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), token, userId, opPackageName, sensorId,
|
||||
challenge);
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), challenge);
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
}
|
||||
@@ -340,8 +355,10 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
mSensors.get(sensorId).getLazySession(), token,
|
||||
new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken,
|
||||
opPackageName, id, FaceUtils.getInstance(sensorId), disabledFeatures,
|
||||
ENROLL_TIMEOUT_SEC, previewSurface, sensorId, maxTemplatesPerUser,
|
||||
debugConsent);
|
||||
ENROLL_TIMEOUT_SEC, previewSurface, sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_ENROLL,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), maxTemplatesPerUser, debugConsent);
|
||||
scheduleForSensor(sensorId, client, new ClientMonitorCallback() {
|
||||
@Override
|
||||
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
|
||||
@@ -372,8 +389,9 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId);
|
||||
final FaceDetectClient client = new FaceDetectClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(),
|
||||
token, id, callback, userId, opPackageName,
|
||||
sensorId, isStrongBiometric, statsClient);
|
||||
token, id, callback, userId, opPackageName, sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient),
|
||||
BiometricContext.getInstance(), isStrongBiometric);
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
|
||||
@@ -396,7 +414,9 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
final FaceAuthenticationClient client = new FaceAuthenticationClient(
|
||||
mContext, mSensors.get(sensorId).getLazySession(), token, requestId, callback,
|
||||
userId, operationId, restricted, opPackageName, cookie,
|
||||
false /* requireConfirmation */, sensorId, isStrongBiometric, statsClient,
|
||||
false /* requireConfirmation */, sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient),
|
||||
BiometricContext.getInstance(), isStrongBiometric,
|
||||
mUsageStats, mSensors.get(sensorId).getLockoutCache(),
|
||||
allowBackgroundAuthentication, isKeyguardBypassEnabled);
|
||||
scheduleForSensor(sensorId, client);
|
||||
@@ -450,6 +470,9 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
mSensors.get(sensorId).getLazySession(), token,
|
||||
new ClientMonitorCallbackConverter(receiver), faceIds, userId,
|
||||
opPackageName, FaceUtils.getInstance(sensorId), sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_REMOVE,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(),
|
||||
mSensors.get(sensorId).getAuthenticatorIds());
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
@@ -460,7 +483,10 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
mHandler.post(() -> {
|
||||
final FaceResetLockoutClient client = new FaceResetLockoutClient(
|
||||
mContext, mSensors.get(sensorId).getLazySession(), userId,
|
||||
mContext.getOpPackageName(), sensorId, hardwareAuthToken,
|
||||
mContext.getOpPackageName(), sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), hardwareAuthToken,
|
||||
mSensors.get(sensorId).getLockoutCache(), mLockoutResetDispatcher);
|
||||
|
||||
scheduleForSensor(sensorId, client);
|
||||
@@ -481,7 +507,9 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
final FaceSetFeatureClient client = new FaceSetFeatureClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), token,
|
||||
new ClientMonitorCallbackConverter(receiver), userId,
|
||||
mContext.getOpPackageName(), sensorId, feature, enabled, hardwareAuthToken);
|
||||
mContext.getOpPackageName(), sensorId,
|
||||
BiometricLogger.ofUnknown(mContext), BiometricContext.getInstance(),
|
||||
feature, enabled, hardwareAuthToken);
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
}
|
||||
@@ -498,7 +526,8 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
}
|
||||
final FaceGetFeatureClient client = new FaceGetFeatureClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), token, callback, userId,
|
||||
mContext.getOpPackageName(), sensorId);
|
||||
mContext.getOpPackageName(), sensorId, BiometricLogger.ofUnknown(mContext),
|
||||
BiometricContext.getInstance());
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
}
|
||||
@@ -518,13 +547,21 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
|
||||
final FaceInternalCleanupClient client =
|
||||
new FaceInternalCleanupClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), userId,
|
||||
mContext.getOpPackageName(), sensorId, enrolledList,
|
||||
mContext.getOpPackageName(), sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_ENUMERATE,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), enrolledList,
|
||||
FaceUtils.getInstance(sensorId),
|
||||
mSensors.get(sensorId).getAuthenticatorIds());
|
||||
scheduleForSensor(sensorId, client, callback);
|
||||
});
|
||||
}
|
||||
|
||||
private BiometricLogger createLogger(int statsAction, int statsClient) {
|
||||
return new BiometricLogger(mContext, BiometricsProtoEnums.MODALITY_FACE,
|
||||
statsAction, statsClient);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dumpProtoState(int sensorId, @NonNull ProtoOutputStream proto,
|
||||
boolean clearSchedulerBuffer) {
|
||||
|
||||
@@ -18,13 +18,14 @@ package com.android.server.biometrics.sensors.face.aidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.IFace;
|
||||
import android.hardware.face.Face;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.RemovalClient;
|
||||
@@ -44,9 +45,10 @@ class FaceRemovalClient extends RemovalClient<Face, AidlSession> {
|
||||
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
|
||||
int[] biometricIds, int userId, @NonNull String owner,
|
||||
@NonNull BiometricUtils<Face> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, utils, sensorId,
|
||||
authenticatorIds, BiometricsProtoEnums.MODALITY_FACE);
|
||||
logger, biometricContext, authenticatorIds);
|
||||
mBiometricIds = biometricIds;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@ package com.android.server.biometrics.sensors.face.aidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.IFace;
|
||||
import android.hardware.keymaster.HardwareAuthToken;
|
||||
import android.os.RemoteException;
|
||||
@@ -26,6 +25,8 @@ import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.HardwareAuthTokenUtils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ErrorConsumer;
|
||||
import com.android.server.biometrics.sensors.HalClientMonitor;
|
||||
@@ -50,11 +51,11 @@ public class FaceResetLockoutClient extends HalClientMonitor<AidlSession> implem
|
||||
|
||||
FaceResetLockoutClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, int userId, String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull byte[] hardwareAuthToken, @NonNull LockoutCache lockoutTracker,
|
||||
@NonNull LockoutResetDispatcher lockoutResetDispatcher) {
|
||||
super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner,
|
||||
0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN,
|
||||
BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
0 /* cookie */, sensorId, logger, biometricContext);
|
||||
mHardwareAuthToken = HardwareAuthTokenUtils.toHardwareAuthToken(hardwareAuthToken);
|
||||
mLockoutCache = lockoutTracker;
|
||||
mLockoutResetDispatcher = lockoutResetDispatcher;
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.RevokeChallengeClient;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
@@ -38,8 +40,10 @@ public class FaceRevokeChallengeClient extends RevokeChallengeClient<AidlSession
|
||||
|
||||
FaceRevokeChallengeClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, @NonNull IBinder token,
|
||||
int userId, @NonNull String owner, int sensorId, long challenge) {
|
||||
super(context, lazyDaemon, token, userId, owner, sensorId);
|
||||
int userId, @NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
long challenge) {
|
||||
super(context, lazyDaemon, token, userId, owner, sensorId, logger, biometricContext);
|
||||
mChallenge = challenge;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@ package com.android.server.biometrics.sensors.face.aidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.IFace;
|
||||
import android.hardware.keymaster.HardwareAuthToken;
|
||||
import android.os.IBinder;
|
||||
@@ -27,6 +26,8 @@ import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.HardwareAuthTokenUtils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.ErrorConsumer;
|
||||
@@ -47,11 +48,11 @@ public class FaceSetFeatureClient extends HalClientMonitor<AidlSession> implemen
|
||||
|
||||
FaceSetFeatureClient(@NonNull Context context, @NonNull Supplier<AidlSession> lazyDaemon,
|
||||
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull String owner, int sensorId, int feature, boolean enabled,
|
||||
byte[] hardwareAuthToken) {
|
||||
@NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
int feature, boolean enabled, byte[] hardwareAuthToken) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
logger, biometricContext);
|
||||
mFeature = feature;
|
||||
mEnabled = enabled;
|
||||
mHardwareAuthToken = HardwareAuthTokenUtils.toHardwareAuthToken(hardwareAuthToken);
|
||||
|
||||
@@ -27,6 +27,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.StartUserClient;
|
||||
|
||||
@@ -40,9 +42,10 @@ public class FaceStartUserClient extends StartUserClient<IFace, ISession> {
|
||||
public FaceStartUserClient(@NonNull Context context,
|
||||
@NonNull Supplier<IFace> lazyDaemon,
|
||||
@Nullable IBinder token, int userId, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull ISessionCallback sessionCallback,
|
||||
@NonNull UserStartedCallback<ISession> callback) {
|
||||
super(context, lazyDaemon, token, userId, sensorId, callback);
|
||||
super(context, lazyDaemon, token, userId, sensorId, logger, biometricContext, callback);
|
||||
mSessionCallback = sessionCallback;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.StopUserClient;
|
||||
|
||||
@@ -33,8 +35,9 @@ public class FaceStopUserClient extends StopUserClient<AidlSession> {
|
||||
|
||||
public FaceStopUserClient(@NonNull Context context, @NonNull Supplier<AidlSession> lazyDaemon,
|
||||
@Nullable IBinder token, int userId, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull UserStoppedCallback callback) {
|
||||
super(context, lazyDaemon, token, userId, sensorId, callback);
|
||||
super(context, lazyDaemon, token, userId, sensorId, logger, biometricContext, callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -42,12 +42,15 @@ import android.os.UserManager;
|
||||
import android.util.Slog;
|
||||
import android.util.proto.ProtoOutputStream;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.util.FrameworkStatsLog;
|
||||
import com.android.server.biometrics.HardwareAuthTokenUtils;
|
||||
import com.android.server.biometrics.SensorServiceStateProto;
|
||||
import com.android.server.biometrics.SensorStateProto;
|
||||
import com.android.server.biometrics.UserStateProto;
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.AuthenticationConsumer;
|
||||
import com.android.server.biometrics.sensors.BaseClientMonitor;
|
||||
import com.android.server.biometrics.sensors.BiometricScheduler;
|
||||
@@ -88,7 +91,8 @@ public class Sensor {
|
||||
@NonNull private final Supplier<AidlSession> mLazySession;
|
||||
@Nullable private AidlSession mCurrentSession;
|
||||
|
||||
static class HalSessionCallback extends ISessionCallback.Stub {
|
||||
@VisibleForTesting
|
||||
public static class HalSessionCallback extends ISessionCallback.Stub {
|
||||
/**
|
||||
* Interface to sends results to the HalSessionCallback's owner.
|
||||
*/
|
||||
@@ -487,7 +491,9 @@ public class Sensor {
|
||||
@Override
|
||||
public StopUserClient<?> getStopUserClient(int userId) {
|
||||
return new FaceStopUserClient(mContext, mLazySession, mToken, userId,
|
||||
mSensorProperties.sensorId, () -> mCurrentSession = null);
|
||||
mSensorProperties.sensorId,
|
||||
BiometricLogger.ofUnknown(mContext), BiometricContext.getInstance(),
|
||||
() -> mCurrentSession = null);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -523,6 +529,7 @@ public class Sensor {
|
||||
|
||||
return new FaceStartUserClient(mContext, provider::getHalInstance,
|
||||
mToken, newUserId, mSensorProperties.sensorId,
|
||||
BiometricLogger.ofUnknown(mContext), BiometricContext.getInstance(),
|
||||
resultController, userStartedCallback);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -55,6 +55,8 @@ import com.android.server.biometrics.SensorServiceStateProto;
|
||||
import com.android.server.biometrics.SensorStateProto;
|
||||
import com.android.server.biometrics.UserStateProto;
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.AcquisitionClient;
|
||||
import com.android.server.biometrics.sensors.AuthenticationConsumer;
|
||||
import com.android.server.biometrics.sensors.BaseClientMonitor;
|
||||
@@ -533,7 +535,10 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
|
||||
|
||||
final FaceGenerateChallengeClient client = new FaceGenerateChallengeClient(mContext,
|
||||
mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId,
|
||||
opPackageName, mSensorId, sSystemClock.millis());
|
||||
opPackageName, mSensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), sSystemClock.millis());
|
||||
mGeneratedChallengeCache = client;
|
||||
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
|
||||
@Override
|
||||
@@ -562,7 +567,10 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
|
||||
mGeneratedChallengeCache = null;
|
||||
|
||||
final FaceRevokeChallengeClient client = new FaceRevokeChallengeClient(mContext,
|
||||
mLazyDaemon, token, userId, opPackageName, mSensorId);
|
||||
mLazyDaemon, token, userId, opPackageName, mSensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance());
|
||||
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
|
||||
@Override
|
||||
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
|
||||
@@ -590,7 +598,10 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
|
||||
final FaceEnrollClient client = new FaceEnrollClient(mContext, mLazyDaemon, token,
|
||||
new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken,
|
||||
opPackageName, id, FaceUtils.getLegacyInstance(mSensorId), disabledFeatures,
|
||||
ENROLL_TIMEOUT_SEC, previewSurface, mSensorId);
|
||||
ENROLL_TIMEOUT_SEC, previewSurface, mSensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_ENROLL,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance());
|
||||
|
||||
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
|
||||
@Override
|
||||
@@ -637,7 +648,8 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
|
||||
final FaceAuthenticationClient client = new FaceAuthenticationClient(mContext,
|
||||
mLazyDaemon, token, requestId, receiver, userId, operationId, restricted,
|
||||
opPackageName, cookie, false /* requireConfirmation */, mSensorId,
|
||||
isStrongBiometric, statsClient, mLockoutTracker, mUsageStats,
|
||||
createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient),
|
||||
BiometricContext.getInstance(), isStrongBiometric, mLockoutTracker, mUsageStats,
|
||||
allowBackgroundAuthentication, isKeyguardBypassEnabled);
|
||||
mScheduler.scheduleClientMonitor(client);
|
||||
});
|
||||
@@ -670,7 +682,10 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
|
||||
|
||||
final FaceRemovalClient client = new FaceRemovalClient(mContext, mLazyDaemon, token,
|
||||
new ClientMonitorCallbackConverter(receiver), faceId, userId, opPackageName,
|
||||
FaceUtils.getLegacyInstance(mSensorId), mSensorId, mAuthenticatorIds);
|
||||
FaceUtils.getLegacyInstance(mSensorId), mSensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_REMOVE,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), mAuthenticatorIds);
|
||||
mScheduler.scheduleClientMonitor(client);
|
||||
});
|
||||
}
|
||||
@@ -685,7 +700,10 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
|
||||
final FaceRemovalClient client = new FaceRemovalClient(mContext, mLazyDaemon, token,
|
||||
new ClientMonitorCallbackConverter(receiver), 0 /* faceId */, userId,
|
||||
opPackageName,
|
||||
FaceUtils.getLegacyInstance(mSensorId), mSensorId, mAuthenticatorIds);
|
||||
FaceUtils.getLegacyInstance(mSensorId), mSensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_REMOVE,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), mAuthenticatorIds);
|
||||
mScheduler.scheduleClientMonitor(client);
|
||||
});
|
||||
}
|
||||
@@ -702,7 +720,9 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
|
||||
|
||||
final FaceResetLockoutClient client = new FaceResetLockoutClient(mContext,
|
||||
mLazyDaemon, userId, mContext.getOpPackageName(), mSensorId,
|
||||
hardwareAuthToken);
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), hardwareAuthToken);
|
||||
mScheduler.scheduleClientMonitor(client);
|
||||
});
|
||||
}
|
||||
@@ -723,7 +743,8 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
|
||||
final int faceId = faces.get(0).getBiometricId();
|
||||
final FaceSetFeatureClient client = new FaceSetFeatureClient(mContext,
|
||||
mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId,
|
||||
opPackageName, mSensorId, feature, enabled, hardwareAuthToken, faceId);
|
||||
opPackageName, mSensorId, BiometricLogger.ofUnknown(mContext),
|
||||
BiometricContext.getInstance(), feature, enabled, hardwareAuthToken, faceId);
|
||||
mScheduler.scheduleClientMonitor(client);
|
||||
});
|
||||
}
|
||||
@@ -742,7 +763,9 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
|
||||
|
||||
final int faceId = faces.get(0).getBiometricId();
|
||||
final FaceGetFeatureClient client = new FaceGetFeatureClient(mContext, mLazyDaemon,
|
||||
token, listener, userId, opPackageName, mSensorId, feature, faceId);
|
||||
token, listener, userId, opPackageName, mSensorId,
|
||||
BiometricLogger.ofUnknown(mContext), BiometricContext.getInstance(),
|
||||
feature, faceId);
|
||||
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
|
||||
@Override
|
||||
public void onClientFinished(
|
||||
@@ -767,7 +790,10 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
|
||||
|
||||
final List<Face> enrolledList = getEnrolledFaces(mSensorId, userId);
|
||||
final FaceInternalCleanupClient client = new FaceInternalCleanupClient(mContext,
|
||||
mLazyDaemon, userId, mContext.getOpPackageName(), mSensorId, enrolledList,
|
||||
mLazyDaemon, userId, mContext.getOpPackageName(), mSensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_ENUMERATE,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), enrolledList,
|
||||
FaceUtils.getLegacyInstance(mSensorId), mAuthenticatorIds);
|
||||
mScheduler.scheduleClientMonitor(client, callback);
|
||||
});
|
||||
@@ -890,7 +916,9 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
|
||||
final boolean hasEnrolled = !getEnrolledFaces(mSensorId, targetUserId).isEmpty();
|
||||
final FaceUpdateActiveUserClient client = new FaceUpdateActiveUserClient(mContext,
|
||||
mLazyDaemon, targetUserId, mContext.getOpPackageName(), mSensorId,
|
||||
hasEnrolled, mAuthenticatorIds);
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), hasEnrolled, mAuthenticatorIds);
|
||||
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
|
||||
@Override
|
||||
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
|
||||
@@ -904,6 +932,11 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
|
||||
});
|
||||
}
|
||||
|
||||
private BiometricLogger createLogger(int statsAction, int statsClient) {
|
||||
return new BiometricLogger(mContext, BiometricsProtoEnums.MODALITY_FACE,
|
||||
statsAction, statsClient);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a debug message to the HAL with the provided FileDescriptor and arguments.
|
||||
*/
|
||||
|
||||
@@ -23,7 +23,6 @@ import android.hardware.SensorPrivacyManager;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricConstants;
|
||||
import android.hardware.biometrics.BiometricFaceConstants;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
|
||||
import android.hardware.face.FaceManager;
|
||||
import android.os.IBinder;
|
||||
@@ -32,6 +31,8 @@ import android.util.Slog;
|
||||
|
||||
import com.android.internal.R;
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.AuthenticationClient;
|
||||
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
@@ -66,12 +67,13 @@ class FaceAuthenticationClient extends AuthenticationClient<IBiometricsFace> {
|
||||
@NonNull IBinder token, long requestId,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId,
|
||||
boolean restricted, String owner, int cookie, boolean requireConfirmation, int sensorId,
|
||||
boolean isStrongBiometric, int statsClient, @NonNull LockoutTracker lockoutTracker,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
boolean isStrongBiometric, @NonNull LockoutTracker lockoutTracker,
|
||||
@NonNull UsageStats usageStats, boolean allowBackgroundAuthentication,
|
||||
boolean isKeyguardBypassEnabled) {
|
||||
super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted,
|
||||
owner, cookie, requireConfirmation, sensorId, isStrongBiometric,
|
||||
BiometricsProtoEnums.MODALITY_FACE, statsClient, null /* taskStackListener */,
|
||||
owner, cookie, requireConfirmation, sensorId, logger, biometricContext,
|
||||
isStrongBiometric, null /* taskStackListener */,
|
||||
lockoutTracker, allowBackgroundAuthentication, true /* shouldVibrate */,
|
||||
isKeyguardBypassEnabled);
|
||||
setRequestId(requestId);
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricFaceConstants;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
|
||||
import android.hardware.biometrics.face.V1_0.Status;
|
||||
import android.hardware.face.Face;
|
||||
@@ -32,6 +31,8 @@ import android.view.Surface;
|
||||
|
||||
import com.android.internal.R;
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
@@ -58,10 +59,10 @@ public class FaceEnrollClient extends EnrollClient<IBiometricsFace> {
|
||||
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull byte[] hardwareAuthToken, @NonNull String owner, long requestId,
|
||||
@NonNull BiometricUtils<Face> utils, @NonNull int[] disabledFeatures, int timeoutSec,
|
||||
@Nullable Surface previewSurface, int sensorId) {
|
||||
@Nullable Surface previewSurface, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils,
|
||||
timeoutSec, BiometricsProtoEnums.MODALITY_FACE, sensorId,
|
||||
false /* shouldVibrate */);
|
||||
timeoutSec, sensorId, false /* shouldVibrate */, logger, biometricContext);
|
||||
setRequestId(requestId);
|
||||
mDisabledFeatures = Arrays.copyOf(disabledFeatures, disabledFeatures.length);
|
||||
mEnrollIgnoreList = getContext().getResources()
|
||||
|
||||
@@ -25,6 +25,8 @@ import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.internal.util.Preconditions;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.GenerateChallengeClient;
|
||||
@@ -51,8 +53,10 @@ public class FaceGenerateChallengeClient extends GenerateChallengeClient<IBiomet
|
||||
FaceGenerateChallengeClient(@NonNull Context context,
|
||||
@NonNull Supplier<IBiometricsFace> lazyDaemon, @NonNull IBinder token,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner,
|
||||
int sensorId, long now) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, sensorId);
|
||||
int sensorId, @NonNull BiometricLogger logger,
|
||||
@NonNull BiometricContext biometricContext, long now) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, sensorId, logger,
|
||||
biometricContext);
|
||||
mCreatedAt = now;
|
||||
mWaiting = new ArrayList<>();
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ package com.android.server.biometrics.sensors.face.hidl;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
|
||||
import android.hardware.biometrics.face.V1_0.OptionalBool;
|
||||
import android.hardware.biometrics.face.V1_0.Status;
|
||||
@@ -28,6 +27,8 @@ import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.HalClientMonitor;
|
||||
@@ -48,13 +49,13 @@ public class FaceGetFeatureClient extends HalClientMonitor<IBiometricsFace> {
|
||||
|
||||
FaceGetFeatureClient(@NonNull Context context, @NonNull Supplier<IBiometricsFace> lazyDaemon,
|
||||
@NonNull IBinder token, @Nullable ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull String owner, int sensorId, int feature, int faceId) {
|
||||
@NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
int feature, int faceId) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
logger, biometricContext);
|
||||
mFeature = feature;
|
||||
mFaceId = faceId;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -18,11 +18,12 @@ package com.android.server.biometrics.sensors.face.hidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
|
||||
import android.hardware.face.Face;
|
||||
import android.os.IBinder;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.InternalCleanupClient;
|
||||
import com.android.server.biometrics.sensors.InternalEnumerateClient;
|
||||
@@ -40,29 +41,32 @@ class FaceInternalCleanupClient extends InternalCleanupClient<Face, IBiometricsF
|
||||
|
||||
FaceInternalCleanupClient(@NonNull Context context,
|
||||
@NonNull Supplier<IBiometricsFace> lazyDaemon, int userId, @NonNull String owner,
|
||||
int sensorId, @NonNull List<Face> enrolledList, @NonNull BiometricUtils<Face> utils,
|
||||
@NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, userId, owner, sensorId, BiometricsProtoEnums.MODALITY_FACE,
|
||||
int sensorId, @NonNull BiometricLogger logger,
|
||||
@NonNull BiometricContext biometricContext, @NonNull List<Face> enrolledList,
|
||||
@NonNull BiometricUtils<Face> utils, @NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, userId, owner, sensorId, logger, biometricContext,
|
||||
enrolledList, utils, authenticatorIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected InternalEnumerateClient<IBiometricsFace> getEnumerateClient(Context context,
|
||||
Supplier<IBiometricsFace> lazyDaemon, IBinder token, int userId, String owner,
|
||||
List<Face> enrolledList, BiometricUtils<Face> utils, int sensorId) {
|
||||
List<Face> enrolledList, BiometricUtils<Face> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
return new FaceInternalEnumerateClient(context, lazyDaemon, token, userId, owner,
|
||||
enrolledList, utils, sensorId);
|
||||
enrolledList, utils, sensorId, logger, biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected RemovalClient<Face, IBiometricsFace> getRemovalClient(Context context,
|
||||
Supplier<IBiometricsFace> lazyDaemon, IBinder token,
|
||||
int biometricId, int userId, String owner, BiometricUtils<Face> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
Map<Integer, Long> authenticatorIds) {
|
||||
// Internal remove does not need to send results to anyone. Cleanup (enumerate + remove)
|
||||
// is all done internally.
|
||||
return new FaceRemovalClient(context, lazyDaemon, token,
|
||||
null /* ClientMonitorCallbackConverter */, biometricId, userId, owner, utils,
|
||||
sensorId, authenticatorIds);
|
||||
sensorId, logger, biometricContext, authenticatorIds);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,13 +18,14 @@ package com.android.server.biometrics.sensors.face.hidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
|
||||
import android.hardware.face.Face;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.InternalEnumerateClient;
|
||||
|
||||
@@ -41,9 +42,10 @@ class FaceInternalEnumerateClient extends InternalEnumerateClient<IBiometricsFac
|
||||
FaceInternalEnumerateClient(@NonNull Context context,
|
||||
@NonNull Supplier<IBiometricsFace> lazyDaemon, @NonNull IBinder token, int userId,
|
||||
@NonNull String owner, @NonNull List<Face> enrolledList,
|
||||
@NonNull BiometricUtils<Face> utils, int sensorId) {
|
||||
@NonNull BiometricUtils<Face> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, userId, owner, enrolledList, utils, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_FACE);
|
||||
logger, biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -18,13 +18,14 @@ package com.android.server.biometrics.sensors.face.hidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
|
||||
import android.hardware.face.Face;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.RemovalClient;
|
||||
@@ -44,9 +45,11 @@ class FaceRemovalClient extends RemovalClient<Face, IBiometricsFace> {
|
||||
FaceRemovalClient(@NonNull Context context, @NonNull Supplier<IBiometricsFace> lazyDaemon,
|
||||
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
|
||||
int biometricId, int userId, @NonNull String owner, @NonNull BiometricUtils<Face> utils,
|
||||
int sensorId, @NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, utils, sensorId,
|
||||
authenticatorIds, BiometricsProtoEnums.MODALITY_FACE);
|
||||
int sensorId, @NonNull BiometricLogger logger,
|
||||
@NonNull BiometricContext biometricContext,
|
||||
@NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, utils, sensorId, logger,
|
||||
biometricContext, authenticatorIds);
|
||||
mBiometricId = biometricId;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,12 +18,13 @@ package com.android.server.biometrics.sensors.face.hidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.HalClientMonitor;
|
||||
|
||||
@@ -42,10 +43,10 @@ public class FaceResetLockoutClient extends HalClientMonitor<IBiometricsFace> {
|
||||
|
||||
FaceResetLockoutClient(@NonNull Context context,
|
||||
@NonNull Supplier<IBiometricsFace> lazyDaemon, int userId, String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull byte[] hardwareAuthToken) {
|
||||
super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner,
|
||||
0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN,
|
||||
BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
0 /* cookie */, sensorId, logger, biometricContext);
|
||||
|
||||
mHardwareAuthToken = new ArrayList<>();
|
||||
for (byte b : hardwareAuthToken) {
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.RevokeChallengeClient;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
@@ -37,8 +39,9 @@ public class FaceRevokeChallengeClient extends RevokeChallengeClient<IBiometrics
|
||||
|
||||
FaceRevokeChallengeClient(@NonNull Context context,
|
||||
@NonNull Supplier<IBiometricsFace> lazyDaemon, @NonNull IBinder token,
|
||||
int userId, @NonNull String owner, int sensorId) {
|
||||
super(context, lazyDaemon, token, userId, owner, sensorId);
|
||||
int userId, @NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, userId, owner, sensorId, logger, biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -18,7 +18,6 @@ package com.android.server.biometrics.sensors.face.hidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
|
||||
import android.hardware.biometrics.face.V1_0.Status;
|
||||
import android.os.IBinder;
|
||||
@@ -26,6 +25,8 @@ import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.HalClientMonitor;
|
||||
@@ -48,11 +49,11 @@ public class FaceSetFeatureClient extends HalClientMonitor<IBiometricsFace> {
|
||||
|
||||
FaceSetFeatureClient(@NonNull Context context, @NonNull Supplier<IBiometricsFace> lazyDaemon,
|
||||
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull String owner, int sensorId, int feature, boolean enabled,
|
||||
byte[] hardwareAuthToken, int faceId) {
|
||||
@NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
int feature, boolean enabled, byte[] hardwareAuthToken, int faceId) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
logger, biometricContext);
|
||||
mFeature = feature;
|
||||
mEnabled = enabled;
|
||||
mFaceId = faceId;
|
||||
|
||||
@@ -18,13 +18,14 @@ package com.android.server.biometrics.sensors.face.hidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
|
||||
import android.os.Environment;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.HalClientMonitor;
|
||||
|
||||
@@ -41,11 +42,11 @@ public class FaceUpdateActiveUserClient extends HalClientMonitor<IBiometricsFace
|
||||
|
||||
FaceUpdateActiveUserClient(@NonNull Context context,
|
||||
@NonNull Supplier<IBiometricsFace> lazyDaemon, int userId, @NonNull String owner,
|
||||
int sensorId, boolean hasEnrolledBiometrics,
|
||||
int sensorId, @NonNull BiometricLogger logger,
|
||||
@NonNull BiometricContext biometricContext, boolean hasEnrolledBiometrics,
|
||||
@NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner,
|
||||
0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN,
|
||||
BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
0 /* cookie */, sensorId, logger, biometricContext);
|
||||
mHasEnrolledBiometrics = hasEnrolledBiometrics;
|
||||
mAuthenticatorIds = authenticatorIds;
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@
|
||||
|
||||
package com.android.server.biometrics.sensors.fingerprint.aidl;
|
||||
|
||||
import static com.android.server.biometrics.sensors.fingerprint.aidl.Sensor.HalSessionCallback;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.hardware.biometrics.fingerprint.ISession;
|
||||
|
||||
import static com.android.server.biometrics.sensors.fingerprint.aidl.Sensor.HalSessionCallback;
|
||||
|
||||
/**
|
||||
* A holder for an AIDL {@link ISession} with additional metadata about the current user
|
||||
* and the backend.
|
||||
|
||||
@@ -23,9 +23,7 @@ import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricFingerprintConstants;
|
||||
import android.hardware.biometrics.BiometricFingerprintConstants.FingerprintAcquired;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.common.ICancellationSignal;
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.hardware.biometrics.common.OperationReason;
|
||||
import android.hardware.biometrics.fingerprint.PointerContext;
|
||||
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
||||
@@ -35,6 +33,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.log.CallbackWithProbe;
|
||||
import com.android.server.biometrics.log.Probe;
|
||||
import com.android.server.biometrics.sensors.AuthenticationClient;
|
||||
@@ -72,15 +72,18 @@ class FingerprintAuthenticationClient extends AuthenticationClient<AidlSession>
|
||||
@NonNull IBinder token, long requestId,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId,
|
||||
boolean restricted, @NonNull String owner, int cookie, boolean requireConfirmation,
|
||||
int sensorId, boolean isStrongBiometric, int statsClient,
|
||||
int sensorId,
|
||||
@NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext,
|
||||
boolean isStrongBiometric,
|
||||
@Nullable TaskStackListener taskStackListener, @NonNull LockoutCache lockoutCache,
|
||||
@Nullable IUdfpsOverlayController udfpsOverlayController,
|
||||
@Nullable ISidefpsController sidefpsController,
|
||||
boolean allowBackgroundAuthentication,
|
||||
@NonNull FingerprintSensorPropertiesInternal sensorProps) {
|
||||
super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted, owner,
|
||||
cookie, requireConfirmation, sensorId, isStrongBiometric,
|
||||
BiometricsProtoEnums.MODALITY_FINGERPRINT, statsClient, taskStackListener,
|
||||
cookie, requireConfirmation, sensorId,
|
||||
biometricLogger, biometricContext,
|
||||
isStrongBiometric, taskStackListener,
|
||||
lockoutCache, allowBackgroundAuthentication, true /* shouldVibrate */,
|
||||
false /* isKeyguardBypassEnabled */);
|
||||
setRequestId(requestId);
|
||||
@@ -175,13 +178,12 @@ class FingerprintAuthenticationClient extends AuthenticationClient<AidlSession>
|
||||
final AidlSession session = getFreshDaemon();
|
||||
|
||||
if (session.hasContextMethods()) {
|
||||
final OperationContext context = new OperationContext();
|
||||
// TODO: add reason, id, and isAoD
|
||||
context.id = 0;
|
||||
context.reason = OperationReason.UNKNOWN;
|
||||
context.isAoD = false;
|
||||
context.isCrypto = isCryptoOperation();
|
||||
return session.getSession().authenticateWithContext(mOperationId, context);
|
||||
// TODO: add reason, id
|
||||
mOperationContext.id = 0;
|
||||
mOperationContext.reason = OperationReason.UNKNOWN;
|
||||
mOperationContext.isAoD = getBiometricContext().isAoD();
|
||||
mOperationContext.isCrypto = isCryptoOperation();
|
||||
return session.getSession().authenticateWithContext(mOperationId, mOperationContext);
|
||||
} else {
|
||||
return session.getSession().authenticate(mOperationId);
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricOverlayConstants;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.common.ICancellationSignal;
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.hardware.biometrics.common.OperationReason;
|
||||
@@ -30,6 +29,8 @@ import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.AcquisitionClient;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
@@ -54,11 +55,10 @@ class FingerprintDetectClient extends AcquisitionClient<AidlSession> implements
|
||||
@NonNull IBinder token, long requestId,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull String owner, int sensorId,
|
||||
@Nullable IUdfpsOverlayController udfpsOverlayController, boolean isStrongBiometric,
|
||||
int statsClient) {
|
||||
@NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext,
|
||||
@Nullable IUdfpsOverlayController udfpsOverlayController, boolean isStrongBiometric) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
|
||||
true /* shouldVibrate */, BiometricsProtoEnums.MODALITY_FINGERPRINT,
|
||||
BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient);
|
||||
true /* shouldVibrate */, biometricLogger, biometricContext);
|
||||
setRequestId(requestId);
|
||||
mIsStrongBiometric = isStrongBiometric;
|
||||
mSensorOverlays = new SensorOverlays(udfpsOverlayController, null /* sideFpsController*/);
|
||||
@@ -100,10 +100,10 @@ class FingerprintDetectClient extends AcquisitionClient<AidlSession> implements
|
||||
|
||||
if (session.hasContextMethods()) {
|
||||
final OperationContext context = new OperationContext();
|
||||
// TODO: add reason, id, and isAoD
|
||||
// TODO: add reason, id
|
||||
context.id = 0;
|
||||
context.reason = OperationReason.UNKNOWN;
|
||||
context.isAoD = false;
|
||||
context.isAoD = getBiometricContext().isAoD();
|
||||
context.isCrypto = isCryptoOperation();
|
||||
return session.getSession().detectInteractionWithContext(context);
|
||||
} else {
|
||||
|
||||
@@ -22,7 +22,6 @@ import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricFingerprintConstants;
|
||||
import android.hardware.biometrics.BiometricFingerprintConstants.FingerprintAcquired;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.common.ICancellationSignal;
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.hardware.biometrics.common.OperationReason;
|
||||
@@ -38,6 +37,8 @@ import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.HardwareAuthTokenUtils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
@@ -68,14 +69,15 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps
|
||||
@NonNull ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull byte[] hardwareAuthToken, @NonNull String owner,
|
||||
@NonNull BiometricUtils<Fingerprint> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull FingerprintSensorPropertiesInternal sensorProps,
|
||||
@Nullable IUdfpsOverlayController udfpsOverlayController,
|
||||
@Nullable ISidefpsController sidefpsController,
|
||||
int maxTemplatesPerUser, @FingerprintManager.EnrollReason int enrollReason) {
|
||||
// UDFPS haptics occur when an image is acquired (instead of when the result is known)
|
||||
super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils,
|
||||
0 /* timeoutSec */, BiometricsProtoEnums.MODALITY_FINGERPRINT, sensorId,
|
||||
!sensorProps.isAnyUdfpsType() /* shouldVibrate */);
|
||||
0 /* timeoutSec */, sensorId,
|
||||
!sensorProps.isAnyUdfpsType() /* shouldVibrate */, logger, biometricContext);
|
||||
setRequestId(requestId);
|
||||
mSensorProps = sensorProps;
|
||||
mSensorOverlays = new SensorOverlays(udfpsOverlayController, sidefpsController);
|
||||
@@ -177,10 +179,10 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps
|
||||
|
||||
if (session.hasContextMethods()) {
|
||||
final OperationContext context = new OperationContext();
|
||||
// TODO: add reason, id, and isAoD
|
||||
// TODO: add reason, id
|
||||
context.id = 0;
|
||||
context.reason = OperationReason.UNKNOWN;
|
||||
context.isAoD = false;
|
||||
context.isAoD = getBiometricContext().isAoD();
|
||||
context.isCrypto = isCryptoOperation();
|
||||
return session.getSession().enrollWithContext(hat, context);
|
||||
} else {
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.GenerateChallengeClient;
|
||||
|
||||
@@ -38,8 +40,10 @@ class FingerprintGenerateChallengeClient extends GenerateChallengeClient<AidlSes
|
||||
@NonNull Supplier<AidlSession> lazyDaemon,
|
||||
@NonNull IBinder token,
|
||||
@NonNull ClientMonitorCallbackConverter listener,
|
||||
int userId, @NonNull String owner, int sensorId) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, sensorId);
|
||||
int userId, @NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, sensorId,
|
||||
biometricLogger, biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -18,11 +18,12 @@ package com.android.server.biometrics.sensors.fingerprint.aidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.HalClientMonitor;
|
||||
|
||||
@@ -36,11 +37,12 @@ class FingerprintGetAuthenticatorIdClient extends HalClientMonitor<AidlSession>
|
||||
private final Map<Integer, Long> mAuthenticatorIds;
|
||||
|
||||
FingerprintGetAuthenticatorIdClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, int userId, @NonNull String owner,
|
||||
int sensorId, Map<Integer, Long> authenticatorIds) {
|
||||
@NonNull Supplier<AidlSession> lazyDaemon,
|
||||
int userId, @NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext,
|
||||
Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner,
|
||||
0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_FINGERPRINT,
|
||||
BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
0 /* cookie */, sensorId, biometricLogger, biometricContext);
|
||||
mAuthenticatorIds = authenticatorIds;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,8 @@ import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.fingerprint.Fingerprint;
|
||||
import android.os.IBinder;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.InternalCleanupClient;
|
||||
import com.android.server.biometrics.sensors.InternalEnumerateClient;
|
||||
@@ -39,28 +41,35 @@ import java.util.function.Supplier;
|
||||
class FingerprintInternalCleanupClient extends InternalCleanupClient<Fingerprint, AidlSession> {
|
||||
|
||||
FingerprintInternalCleanupClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, int userId, @NonNull String owner,
|
||||
int sensorId, @NonNull List<Fingerprint> enrolledList,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon,
|
||||
int userId, @NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull List<Fingerprint> enrolledList,
|
||||
@NonNull FingerprintUtils utils, @NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, userId, owner, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_FINGERPRINT, enrolledList, utils, authenticatorIds);
|
||||
super(context, lazyDaemon, userId, owner, sensorId, logger, biometricContext,
|
||||
enrolledList, utils, authenticatorIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected InternalEnumerateClient<AidlSession> getEnumerateClient(Context context,
|
||||
Supplier<AidlSession> lazyDaemon, IBinder token, int userId, String owner,
|
||||
List<Fingerprint> enrolledList, BiometricUtils<Fingerprint> utils, int sensorId) {
|
||||
List<Fingerprint> enrolledList, BiometricUtils<Fingerprint> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
return new FingerprintInternalEnumerateClient(context, lazyDaemon, token, userId, owner,
|
||||
enrolledList, utils, sensorId);
|
||||
enrolledList, utils, sensorId,
|
||||
logger.swapAction(context, BiometricsProtoEnums.ACTION_ENUMERATE),
|
||||
biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected RemovalClient<Fingerprint, AidlSession> getRemovalClient(Context context,
|
||||
Supplier<AidlSession> lazyDaemon, IBinder token, int biometricId, int userId,
|
||||
String owner, BiometricUtils<Fingerprint> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
Map<Integer, Long> authenticatorIds) {
|
||||
return new FingerprintRemovalClient(context, lazyDaemon, token,
|
||||
null /* ClientMonitorCallbackConverter */, new int[] {biometricId}, userId, owner,
|
||||
utils, sensorId, authenticatorIds);
|
||||
utils, sensorId, logger.swapAction(context, BiometricsProtoEnums.ACTION_REMOVE),
|
||||
biometricContext, authenticatorIds);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,12 +18,13 @@ package com.android.server.biometrics.sensors.fingerprint.aidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.fingerprint.Fingerprint;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.InternalEnumerateClient;
|
||||
|
||||
@@ -40,9 +41,10 @@ class FingerprintInternalEnumerateClient extends InternalEnumerateClient<AidlSes
|
||||
protected FingerprintInternalEnumerateClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, @NonNull IBinder token, int userId,
|
||||
@NonNull String owner, @NonNull List<Fingerprint> enrolledList,
|
||||
@NonNull BiometricUtils<Fingerprint> utils, int sensorId) {
|
||||
@NonNull BiometricUtils<Fingerprint> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, userId, owner, enrolledList, utils, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_FINGERPRINT);
|
||||
logger, biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.hardware.fingerprint.Fingerprint;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.InvalidationClient;
|
||||
|
||||
import java.util.Map;
|
||||
@@ -33,8 +35,10 @@ public class FingerprintInvalidationClient extends InvalidationClient<Fingerprin
|
||||
|
||||
public FingerprintInvalidationClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, int userId, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull Map<Integer, Long> authenticatorIds, @NonNull IInvalidationCallback callback) {
|
||||
super(context, lazyDaemon, userId, sensorId, authenticatorIds, callback);
|
||||
super(context, lazyDaemon, userId, sensorId, logger, biometricContext,
|
||||
authenticatorIds, callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -26,6 +26,7 @@ import android.app.TaskStackListener;
|
||||
import android.content.Context;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.content.res.TypedArray;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.ComponentInfoInternal;
|
||||
import android.hardware.biometrics.IInvalidationCallback;
|
||||
import android.hardware.biometrics.ITestSession;
|
||||
@@ -53,6 +54,8 @@ import android.util.proto.ProtoOutputStream;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.AuthenticationClient;
|
||||
import com.android.server.biometrics.sensors.BaseClientMonitor;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
@@ -298,6 +301,9 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
new FingerprintGetAuthenticatorIdClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), userId,
|
||||
mContext.getOpPackageName(), sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(),
|
||||
mSensors.get(sensorId).getAuthenticatorIds());
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
@@ -307,6 +313,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
mHandler.post(() -> {
|
||||
final InvalidationRequesterClient<Fingerprint> client =
|
||||
new InvalidationRequesterClient<>(mContext, userId, sensorId,
|
||||
BiometricLogger.ofUnknown(mContext), BiometricContext.getInstance(),
|
||||
FingerprintUtils.getInstance(sensorId));
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
@@ -317,7 +324,10 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
mHandler.post(() -> {
|
||||
final FingerprintResetLockoutClient client = new FingerprintResetLockoutClient(
|
||||
mContext, mSensors.get(sensorId).getLazySession(), userId,
|
||||
mContext.getOpPackageName(), sensorId, hardwareAuthToken,
|
||||
mContext.getOpPackageName(), sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), hardwareAuthToken,
|
||||
mSensors.get(sensorId).getLockoutCache(), mLockoutResetDispatcher);
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
@@ -331,7 +341,9 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
new FingerprintGenerateChallengeClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), token,
|
||||
new ClientMonitorCallbackConverter(receiver), userId, opPackageName,
|
||||
sensorId);
|
||||
sensorId, createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance());
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
}
|
||||
@@ -343,7 +355,10 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
final FingerprintRevokeChallengeClient client =
|
||||
new FingerprintRevokeChallengeClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), token,
|
||||
userId, opPackageName, sensorId, challenge);
|
||||
userId, opPackageName, sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), challenge);
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
}
|
||||
@@ -361,6 +376,9 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
mSensors.get(sensorId).getLazySession(), token, id,
|
||||
new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken,
|
||||
opPackageName, FingerprintUtils.getInstance(sensorId), sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_ENROLL,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(),
|
||||
mSensors.get(sensorId).getSensorProperties(),
|
||||
mUdfpsOverlayController, mSidefpsController, maxTemplatesPerUser, enrollReason);
|
||||
scheduleForSensor(sensorId, client, new ClientMonitorCallback() {
|
||||
@@ -399,8 +417,10 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId);
|
||||
final FingerprintDetectClient client = new FingerprintDetectClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), token, id, callback, userId,
|
||||
opPackageName, sensorId, mUdfpsOverlayController, isStrongBiometric,
|
||||
statsClient);
|
||||
opPackageName, sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient),
|
||||
BiometricContext.getInstance(),
|
||||
mUdfpsOverlayController, isStrongBiometric);
|
||||
scheduleForSensor(sensorId, client, mFingerprintStateCallback);
|
||||
});
|
||||
|
||||
@@ -417,7 +437,9 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
final FingerprintAuthenticationClient client = new FingerprintAuthenticationClient(
|
||||
mContext, mSensors.get(sensorId).getLazySession(), token, requestId, callback,
|
||||
userId, operationId, restricted, opPackageName, cookie,
|
||||
false /* requireConfirmation */, sensorId, isStrongBiometric, statsClient,
|
||||
false /* requireConfirmation */, sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient),
|
||||
BiometricContext.getInstance(), isStrongBiometric,
|
||||
mTaskStackListener, mSensors.get(sensorId).getLockoutCache(),
|
||||
mUdfpsOverlayController, mSidefpsController, allowBackgroundAuthentication,
|
||||
mSensors.get(sensorId).getSensorProperties());
|
||||
@@ -479,6 +501,9 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
mSensors.get(sensorId).getLazySession(), token,
|
||||
new ClientMonitorCallbackConverter(receiver), fingerprintIds, userId,
|
||||
opPackageName, FingerprintUtils.getInstance(sensorId), sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_REMOVE,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(),
|
||||
mSensors.get(sensorId).getAuthenticatorIds());
|
||||
scheduleForSensor(sensorId, client, mFingerprintStateCallback);
|
||||
});
|
||||
@@ -492,14 +517,22 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
final FingerprintInternalCleanupClient client =
|
||||
new FingerprintInternalCleanupClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), userId,
|
||||
mContext.getOpPackageName(), sensorId, enrolledList,
|
||||
FingerprintUtils.getInstance(sensorId),
|
||||
mContext.getOpPackageName(), sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_ENUMERATE,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(),
|
||||
enrolledList, FingerprintUtils.getInstance(sensorId),
|
||||
mSensors.get(sensorId).getAuthenticatorIds());
|
||||
scheduleForSensor(sensorId, client, new ClientMonitorCompositeCallback(callback,
|
||||
mFingerprintStateCallback));
|
||||
});
|
||||
}
|
||||
|
||||
private BiometricLogger createLogger(int statsAction, int statsClient) {
|
||||
return new BiometricLogger(mContext, BiometricsProtoEnums.MODALITY_FINGERPRINT,
|
||||
statsAction, statsClient);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isHardwareDetected(int sensorId) {
|
||||
return hasHalInstance();
|
||||
@@ -524,6 +557,9 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
final FingerprintInvalidationClient client =
|
||||
new FingerprintInvalidationClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), userId, sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(),
|
||||
mSensors.get(sensorId).getAuthenticatorIds(), callback);
|
||||
scheduleForSensor(sensorId, client);
|
||||
});
|
||||
|
||||
@@ -19,12 +19,13 @@ package com.android.server.biometrics.sensors.fingerprint.aidl;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.fingerprint.Fingerprint;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.RemovalClient;
|
||||
@@ -45,9 +46,10 @@ class FingerprintRemovalClient extends RemovalClient<Fingerprint, AidlSession> {
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, @NonNull IBinder token,
|
||||
@Nullable ClientMonitorCallbackConverter listener, int[] biometricIds, int userId,
|
||||
@NonNull String owner, @NonNull BiometricUtils<Fingerprint> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, utils, sensorId,
|
||||
authenticatorIds, BiometricsProtoEnums.MODALITY_FINGERPRINT);
|
||||
logger, biometricContext, authenticatorIds);
|
||||
mBiometricIds = biometricIds;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@ package com.android.server.biometrics.sensors.fingerprint.aidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.fingerprint.IFingerprint;
|
||||
import android.hardware.keymaster.HardwareAuthToken;
|
||||
import android.os.RemoteException;
|
||||
@@ -26,6 +25,8 @@ import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.HardwareAuthTokenUtils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ErrorConsumer;
|
||||
import com.android.server.biometrics.sensors.HalClientMonitor;
|
||||
@@ -50,11 +51,11 @@ class FingerprintResetLockoutClient extends HalClientMonitor<AidlSession> implem
|
||||
|
||||
FingerprintResetLockoutClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, int userId, String owner, int sensorId,
|
||||
@NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull byte[] hardwareAuthToken, @NonNull LockoutCache lockoutTracker,
|
||||
@NonNull LockoutResetDispatcher lockoutResetDispatcher) {
|
||||
super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner,
|
||||
0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN,
|
||||
BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
0 /* cookie */, sensorId, biometricLogger, biometricContext);
|
||||
mHardwareAuthToken = HardwareAuthTokenUtils.toHardwareAuthToken(hardwareAuthToken);
|
||||
mLockoutCache = lockoutTracker;
|
||||
mLockoutResetDispatcher = lockoutResetDispatcher;
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.RevokeChallengeClient;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
@@ -38,8 +40,10 @@ class FingerprintRevokeChallengeClient extends RevokeChallengeClient<AidlSession
|
||||
|
||||
FingerprintRevokeChallengeClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, @NonNull IBinder token,
|
||||
int userId, @NonNull String owner, int sensorId, long challenge) {
|
||||
super(context, lazyDaemon, token, userId, owner, sensorId);
|
||||
int userId, @NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
long challenge) {
|
||||
super(context, lazyDaemon, token, userId, owner, sensorId, logger, biometricContext);
|
||||
mChallenge = challenge;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.StartUserClient;
|
||||
|
||||
@@ -40,9 +42,10 @@ public class FingerprintStartUserClient extends StartUserClient<IFingerprint, IS
|
||||
public FingerprintStartUserClient(@NonNull Context context,
|
||||
@NonNull Supplier<IFingerprint> lazyDaemon,
|
||||
@Nullable IBinder token, int userId, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull ISessionCallback sessionCallback,
|
||||
@NonNull UserStartedCallback<ISession> callback) {
|
||||
super(context, lazyDaemon, token, userId, sensorId, callback);
|
||||
super(context, lazyDaemon, token, userId, sensorId, logger, biometricContext, callback);
|
||||
mSessionCallback = sessionCallback;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.StopUserClient;
|
||||
|
||||
@@ -33,8 +35,10 @@ public class FingerprintStopUserClient extends StopUserClient<AidlSession> {
|
||||
|
||||
public FingerprintStopUserClient(@NonNull Context context,
|
||||
@NonNull Supplier<AidlSession> lazyDaemon, @Nullable IBinder token, int userId,
|
||||
int sensorId, @NonNull UserStoppedCallback callback) {
|
||||
super(context, lazyDaemon, token, userId, sensorId, callback);
|
||||
int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull UserStoppedCallback callback) {
|
||||
super(context, lazyDaemon, token, userId, sensorId, logger, biometricContext, callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -39,12 +39,15 @@ import android.os.UserManager;
|
||||
import android.util.Slog;
|
||||
import android.util.proto.ProtoOutputStream;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.util.FrameworkStatsLog;
|
||||
import com.android.server.biometrics.HardwareAuthTokenUtils;
|
||||
import com.android.server.biometrics.SensorServiceStateProto;
|
||||
import com.android.server.biometrics.SensorStateProto;
|
||||
import com.android.server.biometrics.UserStateProto;
|
||||
import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.AcquisitionClient;
|
||||
import com.android.server.biometrics.sensors.AuthenticationConsumer;
|
||||
import com.android.server.biometrics.sensors.BaseClientMonitor;
|
||||
@@ -72,7 +75,7 @@ import java.util.function.Supplier;
|
||||
* {@link android.hardware.biometrics.fingerprint.IFingerprint} HAL.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
class Sensor {
|
||||
public class Sensor {
|
||||
|
||||
private boolean mTestHalEnabled;
|
||||
|
||||
@@ -89,7 +92,8 @@ class Sensor {
|
||||
@Nullable private AidlSession mCurrentSession;
|
||||
@NonNull private final Supplier<AidlSession> mLazySession;
|
||||
|
||||
static class HalSessionCallback extends ISessionCallback.Stub {
|
||||
@VisibleForTesting
|
||||
public static class HalSessionCallback extends ISessionCallback.Stub {
|
||||
|
||||
/**
|
||||
* Interface to sends results to the HalSessionCallback's owner.
|
||||
@@ -442,7 +446,9 @@ class Sensor {
|
||||
@Override
|
||||
public StopUserClient<?> getStopUserClient(int userId) {
|
||||
return new FingerprintStopUserClient(mContext, mLazySession, mToken,
|
||||
userId, mSensorProperties.sensorId, () -> mCurrentSession = null);
|
||||
userId, mSensorProperties.sensorId,
|
||||
BiometricLogger.ofUnknown(mContext), BiometricContext.getInstance(),
|
||||
() -> mCurrentSession = null);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -478,6 +484,7 @@ class Sensor {
|
||||
|
||||
return new FingerprintStartUserClient(mContext, provider::getHalInstance,
|
||||
mToken, newUserId, mSensorProperties.sensorId,
|
||||
BiometricLogger.ofUnknown(mContext), BiometricContext.getInstance(),
|
||||
resultController, userStartedCallback);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -57,6 +57,8 @@ import com.android.server.biometrics.Utils;
|
||||
import com.android.server.biometrics.fingerprint.FingerprintServiceDumpProto;
|
||||
import com.android.server.biometrics.fingerprint.FingerprintUserStatsProto;
|
||||
import com.android.server.biometrics.fingerprint.PerformanceStatsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.AcquisitionClient;
|
||||
import com.android.server.biometrics.sensors.AuthenticationClient;
|
||||
import com.android.server.biometrics.sensors.AuthenticationConsumer;
|
||||
@@ -493,6 +495,9 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
final FingerprintUpdateActiveUserClient client =
|
||||
new FingerprintUpdateActiveUserClient(mContext, mLazyDaemon, targetUserId,
|
||||
mContext.getOpPackageName(), mSensorProperties.sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(),
|
||||
this::getCurrentUser, hasEnrolled, mAuthenticatorIds, force);
|
||||
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
|
||||
@Override
|
||||
@@ -536,7 +541,10 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
// thread.
|
||||
mHandler.post(() -> {
|
||||
final FingerprintResetLockoutClient client = new FingerprintResetLockoutClient(mContext,
|
||||
userId, mContext.getOpPackageName(), sensorId, mLockoutTracker);
|
||||
userId, mContext.getOpPackageName(), sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), mLockoutTracker);
|
||||
mScheduler.scheduleClientMonitor(client);
|
||||
});
|
||||
}
|
||||
@@ -548,7 +556,10 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
final FingerprintGenerateChallengeClient client =
|
||||
new FingerprintGenerateChallengeClient(mContext, mLazyDaemon, token,
|
||||
new ClientMonitorCallbackConverter(receiver), userId, opPackageName,
|
||||
mSensorProperties.sensorId);
|
||||
mSensorProperties.sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance());
|
||||
mScheduler.scheduleClientMonitor(client);
|
||||
});
|
||||
}
|
||||
@@ -559,7 +570,10 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
mHandler.post(() -> {
|
||||
final FingerprintRevokeChallengeClient client = new FingerprintRevokeChallengeClient(
|
||||
mContext, mLazyDaemon, token, userId, opPackageName,
|
||||
mSensorProperties.sensorId);
|
||||
mSensorProperties.sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_UNKNOWN,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance());
|
||||
mScheduler.scheduleClientMonitor(client);
|
||||
});
|
||||
}
|
||||
@@ -577,7 +591,11 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
mLazyDaemon, token, id, new ClientMonitorCallbackConverter(receiver),
|
||||
userId, hardwareAuthToken, opPackageName,
|
||||
FingerprintUtils.getLegacyInstance(mSensorId), ENROLL_TIMEOUT_SEC,
|
||||
mSensorProperties.sensorId, mUdfpsOverlayController, mSidefpsController,
|
||||
mSensorProperties.sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_ENROLL,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(),
|
||||
mUdfpsOverlayController, mSidefpsController,
|
||||
enrollReason);
|
||||
mScheduler.scheduleClientMonitor(client, new ClientMonitorCallback() {
|
||||
@Override
|
||||
@@ -616,8 +634,9 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
final boolean isStrongBiometric = Utils.isStrongBiometric(mSensorProperties.sensorId);
|
||||
final FingerprintDetectClient client = new FingerprintDetectClient(mContext,
|
||||
mLazyDaemon, token, id, listener, userId, opPackageName,
|
||||
mSensorProperties.sensorId, mUdfpsOverlayController, isStrongBiometric,
|
||||
statsClient);
|
||||
mSensorProperties.sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient),
|
||||
BiometricContext.getInstance(), mUdfpsOverlayController, isStrongBiometric);
|
||||
mScheduler.scheduleClientMonitor(client, mFingerprintStateCallback);
|
||||
});
|
||||
|
||||
@@ -636,7 +655,9 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
final FingerprintAuthenticationClient client = new FingerprintAuthenticationClient(
|
||||
mContext, mLazyDaemon, token, requestId, listener, userId, operationId,
|
||||
restricted, opPackageName, cookie, false /* requireConfirmation */,
|
||||
mSensorProperties.sensorId, isStrongBiometric, statsClient,
|
||||
mSensorProperties.sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient),
|
||||
BiometricContext.getInstance(), isStrongBiometric,
|
||||
mTaskStackListener, mLockoutTracker,
|
||||
mUdfpsOverlayController, mSidefpsController,
|
||||
allowBackgroundAuthentication, mSensorProperties);
|
||||
@@ -678,7 +699,10 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
final FingerprintRemovalClient client = new FingerprintRemovalClient(mContext,
|
||||
mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), fingerId,
|
||||
userId, opPackageName, FingerprintUtils.getLegacyInstance(mSensorId),
|
||||
mSensorProperties.sensorId, mAuthenticatorIds);
|
||||
mSensorProperties.sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_REMOVE,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), mAuthenticatorIds);
|
||||
mScheduler.scheduleClientMonitor(client, mFingerprintStateCallback);
|
||||
});
|
||||
}
|
||||
@@ -695,7 +719,10 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver),
|
||||
0 /* fingerprintId */, userId, opPackageName,
|
||||
FingerprintUtils.getLegacyInstance(mSensorId),
|
||||
mSensorProperties.sensorId, mAuthenticatorIds);
|
||||
mSensorProperties.sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_REMOVE,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), mAuthenticatorIds);
|
||||
mScheduler.scheduleClientMonitor(client, mFingerprintStateCallback);
|
||||
});
|
||||
}
|
||||
@@ -709,7 +736,10 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
mSensorProperties.sensorId, userId);
|
||||
final FingerprintInternalCleanupClient client = new FingerprintInternalCleanupClient(
|
||||
mContext, mLazyDaemon, userId, mContext.getOpPackageName(),
|
||||
mSensorProperties.sensorId, enrolledList,
|
||||
mSensorProperties.sensorId,
|
||||
createLogger(BiometricsProtoEnums.ACTION_ENUMERATE,
|
||||
BiometricsProtoEnums.CLIENT_UNKNOWN),
|
||||
BiometricContext.getInstance(), enrolledList,
|
||||
FingerprintUtils.getLegacyInstance(mSensorId), mAuthenticatorIds);
|
||||
mScheduler.scheduleClientMonitor(client, callback);
|
||||
});
|
||||
@@ -722,6 +752,11 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
mFingerprintStateCallback));
|
||||
}
|
||||
|
||||
private BiometricLogger createLogger(int statsAction, int statsClient) {
|
||||
return new BiometricLogger(mContext, BiometricsProtoEnums.MODALITY_FINGERPRINT,
|
||||
statsAction, statsClient);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isHardwareDetected(int sensorId) {
|
||||
return getDaemon() != null;
|
||||
|
||||
@@ -23,7 +23,6 @@ import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricConstants;
|
||||
import android.hardware.biometrics.BiometricFingerprintConstants;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
|
||||
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
||||
import android.hardware.fingerprint.ISidefpsController;
|
||||
@@ -32,6 +31,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.log.CallbackWithProbe;
|
||||
import com.android.server.biometrics.log.Probe;
|
||||
import com.android.server.biometrics.sensors.AuthenticationClient;
|
||||
@@ -69,7 +70,8 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi
|
||||
@NonNull IBinder token, long requestId,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId,
|
||||
boolean restricted, @NonNull String owner, int cookie, boolean requireConfirmation,
|
||||
int sensorId, boolean isStrongBiometric, int statsClient,
|
||||
int sensorId, @NonNull BiometricLogger logger,
|
||||
@NonNull BiometricContext biometricContext, boolean isStrongBiometric,
|
||||
@NonNull TaskStackListener taskStackListener,
|
||||
@NonNull LockoutFrameworkImpl lockoutTracker,
|
||||
@Nullable IUdfpsOverlayController udfpsOverlayController,
|
||||
@@ -77,10 +79,9 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi
|
||||
boolean allowBackgroundAuthentication,
|
||||
@NonNull FingerprintSensorPropertiesInternal sensorProps) {
|
||||
super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted,
|
||||
owner, cookie, requireConfirmation, sensorId, isStrongBiometric,
|
||||
BiometricsProtoEnums.MODALITY_FINGERPRINT, statsClient, taskStackListener,
|
||||
lockoutTracker, allowBackgroundAuthentication, true /* shouldVibrate */,
|
||||
false /* isKeyguardBypassEnabled */);
|
||||
owner, cookie, requireConfirmation, sensorId, logger, biometricContext,
|
||||
isStrongBiometric, taskStackListener, lockoutTracker, allowBackgroundAuthentication,
|
||||
true /* shouldVibrate */, false /* isKeyguardBypassEnabled */);
|
||||
setRequestId(requestId);
|
||||
mLockoutFrameworkImpl = lockoutTracker;
|
||||
mSensorOverlays = new SensorOverlays(udfpsOverlayController, sidefpsController);
|
||||
|
||||
@@ -22,7 +22,6 @@ import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricFingerprintConstants;
|
||||
import android.hardware.biometrics.BiometricOverlayConstants;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
|
||||
import android.hardware.fingerprint.IUdfpsOverlayController;
|
||||
import android.os.IBinder;
|
||||
@@ -30,6 +29,8 @@ import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.AcquisitionClient;
|
||||
import com.android.server.biometrics.sensors.AuthenticationConsumer;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
@@ -59,11 +60,11 @@ class FingerprintDetectClient extends AcquisitionClient<IBiometricsFingerprint>
|
||||
@NonNull Supplier<IBiometricsFingerprint> lazyDaemon,
|
||||
@NonNull IBinder token, long requestId,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner,
|
||||
int sensorId, @Nullable IUdfpsOverlayController udfpsOverlayController,
|
||||
boolean isStrongBiometric, int statsClient) {
|
||||
int sensorId,
|
||||
@NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext,
|
||||
@Nullable IUdfpsOverlayController udfpsOverlayController, boolean isStrongBiometric) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
|
||||
true /* shouldVibrate */, BiometricsProtoEnums.MODALITY_FINGERPRINT,
|
||||
BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient);
|
||||
true /* shouldVibrate */, biometricLogger, biometricContext);
|
||||
setRequestId(requestId);
|
||||
mSensorOverlays = new SensorOverlays(udfpsOverlayController, null /* sideFpsController */);
|
||||
mIsStrongBiometric = isStrongBiometric;
|
||||
|
||||
@@ -21,7 +21,6 @@ import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricAuthenticator;
|
||||
import android.hardware.biometrics.BiometricFingerprintConstants;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
|
||||
import android.hardware.fingerprint.Fingerprint;
|
||||
import android.hardware.fingerprint.FingerprintManager;
|
||||
@@ -31,6 +30,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
@@ -62,12 +63,13 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint
|
||||
long requestId, @NonNull ClientMonitorCallbackConverter listener, int userId,
|
||||
@NonNull byte[] hardwareAuthToken, @NonNull String owner,
|
||||
@NonNull BiometricUtils<Fingerprint> utils, int timeoutSec, int sensorId,
|
||||
@NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext,
|
||||
@Nullable IUdfpsOverlayController udfpsOverlayController,
|
||||
@Nullable ISidefpsController sidefpsController,
|
||||
@FingerprintManager.EnrollReason int enrollReason) {
|
||||
super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils,
|
||||
timeoutSec, BiometricsProtoEnums.MODALITY_FINGERPRINT, sensorId,
|
||||
true /* shouldVibrate */);
|
||||
timeoutSec, sensorId, true /* shouldVibrate */, biometricLogger,
|
||||
biometricContext);
|
||||
setRequestId(requestId);
|
||||
mSensorOverlays = new SensorOverlays(udfpsOverlayController, sidefpsController);
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.GenerateChallengeClient;
|
||||
|
||||
@@ -41,8 +43,10 @@ public class FingerprintGenerateChallengeClient
|
||||
FingerprintGenerateChallengeClient(@NonNull Context context,
|
||||
@NonNull Supplier<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner,
|
||||
int sensorId) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, sensorId);
|
||||
int sensorId, @NonNull BiometricLogger logger,
|
||||
@NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, sensorId, logger,
|
||||
biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -18,11 +18,12 @@ package com.android.server.biometrics.sensors.fingerprint.hidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
|
||||
import android.hardware.fingerprint.Fingerprint;
|
||||
import android.os.IBinder;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.InternalCleanupClient;
|
||||
import com.android.server.biometrics.sensors.InternalEnumerateClient;
|
||||
@@ -42,31 +43,35 @@ class FingerprintInternalCleanupClient
|
||||
|
||||
FingerprintInternalCleanupClient(@NonNull Context context,
|
||||
@NonNull Supplier<IBiometricsFingerprint> lazyDaemon, int userId,
|
||||
@NonNull String owner, int sensorId, @NonNull List<Fingerprint> enrolledList,
|
||||
@NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull List<Fingerprint> enrolledList,
|
||||
@NonNull BiometricUtils<Fingerprint> utils,
|
||||
@NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, userId, owner, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_FINGERPRINT, enrolledList, utils, authenticatorIds);
|
||||
super(context, lazyDaemon, userId, owner, sensorId, logger, biometricContext,
|
||||
enrolledList, utils, authenticatorIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected InternalEnumerateClient<IBiometricsFingerprint> getEnumerateClient(
|
||||
Context context, Supplier<IBiometricsFingerprint> lazyDaemon, IBinder token,
|
||||
int userId, String owner, List<Fingerprint> enrolledList,
|
||||
BiometricUtils<Fingerprint> utils, int sensorId) {
|
||||
BiometricUtils<Fingerprint> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
return new FingerprintInternalEnumerateClient(context, lazyDaemon, token, userId, owner,
|
||||
enrolledList, utils, sensorId);
|
||||
enrolledList, utils, sensorId, logger, biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected RemovalClient<Fingerprint, IBiometricsFingerprint> getRemovalClient(Context context,
|
||||
Supplier<IBiometricsFingerprint> lazyDaemon, IBinder token,
|
||||
int biometricId, int userId, String owner, BiometricUtils<Fingerprint> utils,
|
||||
int sensorId, Map<Integer, Long> authenticatorIds) {
|
||||
int sensorId, @NonNull BiometricLogger logger,
|
||||
@NonNull BiometricContext biometricContext, Map<Integer, Long> authenticatorIds) {
|
||||
// Internal remove does not need to send results to anyone. Cleanup (enumerate + remove)
|
||||
// is all done internally.
|
||||
return new FingerprintRemovalClient(context, lazyDaemon, token,
|
||||
null /* ClientMonitorCallbackConverter */, biometricId, userId, owner, utils,
|
||||
sensorId, authenticatorIds);
|
||||
sensorId, logger, biometricContext, authenticatorIds);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,13 +18,14 @@ package com.android.server.biometrics.sensors.fingerprint.hidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
|
||||
import android.hardware.fingerprint.Fingerprint;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.InternalEnumerateClient;
|
||||
|
||||
@@ -42,9 +43,10 @@ class FingerprintInternalEnumerateClient extends InternalEnumerateClient<IBiomet
|
||||
FingerprintInternalEnumerateClient(@NonNull Context context,
|
||||
@NonNull Supplier<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token,
|
||||
int userId, @NonNull String owner, @NonNull List<Fingerprint> enrolledList,
|
||||
@NonNull BiometricUtils<Fingerprint> utils, int sensorId) {
|
||||
@NonNull BiometricUtils<Fingerprint> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, userId, owner, enrolledList, utils, sensorId,
|
||||
BiometricsProtoEnums.MODALITY_FINGERPRINT);
|
||||
logger, biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -18,13 +18,14 @@ package com.android.server.biometrics.sensors.fingerprint.hidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
|
||||
import android.hardware.fingerprint.Fingerprint;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.RemovalClient;
|
||||
@@ -46,9 +47,10 @@ class FingerprintRemovalClient extends RemovalClient<Fingerprint, IBiometricsFin
|
||||
@NonNull Supplier<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token,
|
||||
@NonNull ClientMonitorCallbackConverter listener, int biometricId, int userId,
|
||||
@NonNull String owner, @NonNull BiometricUtils<Fingerprint> utils, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull Map<Integer, Long> authenticatorIds) {
|
||||
super(context, lazyDaemon, token, listener, userId, owner, utils, sensorId,
|
||||
authenticatorIds, BiometricsProtoEnums.MODALITY_FINGERPRINT);
|
||||
logger, biometricContext, authenticatorIds);
|
||||
mBiometricId = biometricId;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,9 +18,10 @@ package com.android.server.biometrics.sensors.fingerprint.hidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BaseClientMonitor;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
|
||||
@@ -33,10 +34,11 @@ public class FingerprintResetLockoutClient extends BaseClientMonitor {
|
||||
@NonNull final LockoutFrameworkImpl mLockoutTracker;
|
||||
|
||||
public FingerprintResetLockoutClient(@NonNull Context context, int userId,
|
||||
@NonNull String owner, int sensorId, @NonNull LockoutFrameworkImpl lockoutTracker) {
|
||||
@NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
@NonNull LockoutFrameworkImpl lockoutTracker) {
|
||||
super(context, null /* token */, null /* listener */, userId, owner, 0 /* cookie */,
|
||||
sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN,
|
||||
BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
sensorId, logger, biometricContext);
|
||||
mLockoutTracker = lockoutTracker;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.RevokeChallengeClient;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
@@ -39,8 +41,9 @@ public class FingerprintRevokeChallengeClient
|
||||
|
||||
FingerprintRevokeChallengeClient(@NonNull Context context,
|
||||
@NonNull Supplier<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token,
|
||||
int userId, @NonNull String owner, int sensorId) {
|
||||
super(context, lazyDaemon, token, userId, owner, sensorId);
|
||||
int userId, @NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
|
||||
super(context, lazyDaemon, token, userId, owner, sensorId, logger, biometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -18,7 +18,6 @@ package com.android.server.biometrics.sensors.fingerprint.hidl;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.BiometricsProtoEnums;
|
||||
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
|
||||
import android.os.Build;
|
||||
import android.os.Environment;
|
||||
@@ -27,6 +26,8 @@ import android.os.SELinux;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.biometrics.BiometricsProto;
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.HalClientMonitor;
|
||||
|
||||
@@ -50,12 +51,13 @@ public class FingerprintUpdateActiveUserClient extends HalClientMonitor<IBiometr
|
||||
|
||||
FingerprintUpdateActiveUserClient(@NonNull Context context,
|
||||
@NonNull Supplier<IBiometricsFingerprint> lazyDaemon, int userId,
|
||||
@NonNull String owner, int sensorId, Supplier<Integer> currentUserId,
|
||||
@NonNull String owner, int sensorId,
|
||||
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
|
||||
Supplier<Integer> currentUserId,
|
||||
boolean hasEnrolledBiometrics, @NonNull Map<Integer, Long> authenticatorIds,
|
||||
boolean forceUpdateAuthenticatorId) {
|
||||
super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner,
|
||||
0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN,
|
||||
BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
|
||||
0 /* cookie */, sensorId, logger, biometricContext);
|
||||
mCurrentUserId = currentUserId;
|
||||
mForceUpdateAuthenticatorId = forceUpdateAuthenticatorId;
|
||||
mHasEnrolledBiometrics = hasEnrolledBiometrics;
|
||||
|
||||
@@ -47,6 +47,7 @@ import android.content.pm.ResolveInfo;
|
||||
import android.graphics.drawable.Icon;
|
||||
import android.hardware.biometrics.BiometricAuthenticator.Modality;
|
||||
import android.hardware.biometrics.BiometricManager.BiometricMultiSensorMode;
|
||||
import android.hardware.biometrics.IBiometricContextListener;
|
||||
import android.hardware.biometrics.IBiometricSysuiReceiver;
|
||||
import android.hardware.biometrics.PromptInfo;
|
||||
import android.hardware.display.DisplayManager;
|
||||
@@ -893,6 +894,17 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiometicContextListener(IBiometricContextListener listener) {
|
||||
enforceStatusBarService();
|
||||
if (mBar != null) {
|
||||
try {
|
||||
mBar.setBiometicContextListener(listener);
|
||||
} catch (RemoteException ex) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUdfpsHbmListener(IUdfpsHbmListener listener) {
|
||||
enforceStatusBarService();
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.server.biometrics.log;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.any;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.same;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.hardware.biometrics.IBiometricContextListener;
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.os.RemoteException;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.internal.statusbar.IStatusBarService;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
@Presubmit
|
||||
@SmallTest
|
||||
public class BiometricContextProviderTest {
|
||||
|
||||
@Rule
|
||||
public final MockitoRule mockito = MockitoJUnit.rule();
|
||||
|
||||
@Mock
|
||||
private IStatusBarService mStatusBarService;
|
||||
|
||||
private OperationContext mOpContext = new OperationContext();
|
||||
private IBiometricContextListener mListener;
|
||||
private BiometricContextProvider mProvider;
|
||||
|
||||
@Before
|
||||
public void setup() throws RemoteException {
|
||||
mProvider = new BiometricContextProvider(mStatusBarService, null /* handler */);
|
||||
ArgumentCaptor<IBiometricContextListener> captor =
|
||||
ArgumentCaptor.forClass(IBiometricContextListener.class);
|
||||
verify(mStatusBarService).setBiometicContextListener(captor.capture());
|
||||
mListener = captor.getValue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsAoD() throws RemoteException {
|
||||
mListener.onDozeChanged(true);
|
||||
assertThat(mProvider.isAoD()).isTrue();
|
||||
mListener.onDozeChanged(false);
|
||||
assertThat(mProvider.isAoD()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSubscribesToAoD() throws RemoteException {
|
||||
final List<Boolean> expected = ImmutableList.of(true, false, true, true, false);
|
||||
final List<Boolean> actual = new ArrayList<>();
|
||||
|
||||
mProvider.subscribe(mOpContext, ctx -> {
|
||||
assertThat(ctx).isSameInstanceAs(mOpContext);
|
||||
actual.add(ctx.isAoD);
|
||||
});
|
||||
|
||||
for (boolean v : expected) {
|
||||
mListener.onDozeChanged(v);
|
||||
}
|
||||
|
||||
assertThat(actual).containsExactlyElementsIn(expected).inOrder();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUnsubscribes() throws RemoteException {
|
||||
final Consumer<OperationContext> emptyConsumer = mock(Consumer.class);
|
||||
mProvider.subscribe(mOpContext, emptyConsumer);
|
||||
mProvider.unsubscribe(mOpContext);
|
||||
|
||||
mListener.onDozeChanged(true);
|
||||
|
||||
final Consumer<OperationContext> nonEmptyConsumer = mock(Consumer.class);
|
||||
mProvider.subscribe(mOpContext, nonEmptyConsumer);
|
||||
mListener.onDozeChanged(false);
|
||||
mProvider.unsubscribe(mOpContext);
|
||||
mListener.onDozeChanged(true);
|
||||
|
||||
verify(emptyConsumer, never()).accept(any());
|
||||
verify(nonEmptyConsumer).accept(same(mOpContext));
|
||||
}
|
||||
}
|
||||
@@ -44,7 +44,8 @@ import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
|
||||
@Presubmit
|
||||
@SmallTest
|
||||
@@ -54,6 +55,9 @@ public class BiometricLoggerTest {
|
||||
private static final int DEFAULT_ACTION = BiometricsProtoEnums.ACTION_AUTHENTICATE;
|
||||
private static final int DEFAULT_CLIENT = BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT;
|
||||
|
||||
@Rule
|
||||
public final MockitoRule mockito = MockitoJUnit.rule();
|
||||
|
||||
@Rule
|
||||
public TestableContext mContext = new TestableContext(
|
||||
InstrumentationRegistry.getInstrumentation().getContext());
|
||||
@@ -68,8 +72,6 @@ public class BiometricLoggerTest {
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mContext.addMockSystemService(SensorManager.class, mSensorManager);
|
||||
when(mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)).thenReturn(
|
||||
new Sensor(new InputSensorInfo("", "", 0, 0, Sensor.TYPE_LIGHT, 0, 0, 0, 0, 0, 0,
|
||||
|
||||
@@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
@@ -34,6 +35,9 @@ import android.platform.test.annotations.Presubmit;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mock;
|
||||
@@ -92,9 +96,8 @@ public class AcquisitionClientTest {
|
||||
@NonNull Supplier<Object> lazyDaemon, @NonNull IBinder token,
|
||||
@NonNull ClientMonitorCallbackConverter callback) {
|
||||
super(context, lazyDaemon, token, callback, 0 /* userId */, "Test", 0 /* cookie */,
|
||||
TEST_SENSOR_ID /* sensorId */, true /* shouldVibrate */, 0 /* statsModality */,
|
||||
0 /* statsAction */,
|
||||
0 /* statsClient */);
|
||||
TEST_SENSOR_ID /* sensorId */, true /* shouldVibrate */,
|
||||
mock(BiometricLogger.class), mock(BiometricContext.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -30,6 +30,7 @@ import android.platform.test.annotations.Presubmit;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -49,6 +50,8 @@ public class BaseClientMonitorTest {
|
||||
@Mock
|
||||
private BiometricLogger mLogger;
|
||||
@Mock
|
||||
private BiometricContext mBiometricContext;
|
||||
@Mock
|
||||
private ClientMonitorCallback mCallback;
|
||||
|
||||
private TestClientMonitor mClientMonitor;
|
||||
@@ -109,7 +112,7 @@ public class BaseClientMonitorTest {
|
||||
|
||||
TestClientMonitor() {
|
||||
super(mContext, mToken, mListener, 9 /* userId */, "foo" /* owner */, 2 /* cookie */,
|
||||
5 /* sensorId */, mLogger);
|
||||
5 /* sensorId */, mLogger, mBiometricContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -36,6 +36,9 @@ import android.testing.TestableLooper;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -54,7 +57,8 @@ public class BiometricSchedulerOperationTest {
|
||||
public abstract static class InterruptableMonitor<T>
|
||||
extends HalClientMonitor<T> implements Interruptable {
|
||||
public InterruptableMonitor() {
|
||||
super(null, null, null, null, 0, null, 0, 0, 0, 0, 0);
|
||||
super(null, null, null, null, 0, null, 0, 0,
|
||||
mock(BiometricLogger.class), mock(BiometricContext.class));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -51,6 +51,8 @@ import androidx.annotation.Nullable;
|
||||
import androidx.test.InstrumentationRegistry;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.nano.BiometricSchedulerProto;
|
||||
import com.android.server.biometrics.nano.BiometricsProto;
|
||||
|
||||
@@ -526,10 +528,10 @@ public class BiometricSchedulerTest {
|
||||
@NonNull ClientMonitorCallbackConverter listener) {
|
||||
super(context, lazyDaemon, token, listener, 0 /* targetUserId */, 0 /* operationId */,
|
||||
false /* restricted */, TAG, 1 /* cookie */, false /* requireConfirmation */,
|
||||
TEST_SENSOR_ID, true /* isStrongBiometric */, 0 /* statsModality */,
|
||||
0 /* statsClient */, null /* taskStackListener */, mock(LockoutTracker.class),
|
||||
false /* isKeyguard */, true /* shouldVibrate */,
|
||||
false /* isKeyguardBypassEnabled */);
|
||||
TEST_SENSOR_ID, mock(BiometricLogger.class), mock(BiometricContext.class),
|
||||
true /* isStrongBiometric */, null /* taskStackListener */,
|
||||
mock(LockoutTracker.class), false /* isKeyguard */,
|
||||
true /* shouldVibrate */, false /* isKeyguardBypassEnabled */);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -573,8 +575,9 @@ public class BiometricSchedulerTest {
|
||||
@NonNull ClientMonitorCallbackConverter listener) {
|
||||
super(context, lazyDaemon, token, listener, 0 /* userId */, new byte[69],
|
||||
"test" /* owner */, mock(BiometricUtils.class),
|
||||
5 /* timeoutSec */, 0 /* statsModality */, TEST_SENSOR_ID,
|
||||
true /* shouldVibrate */);
|
||||
5 /* timeoutSec */, TEST_SENSOR_ID,
|
||||
true /* shouldVibrate */,
|
||||
mock(BiometricLogger.class), mock(BiometricContext.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -613,8 +616,8 @@ public class BiometricSchedulerTest {
|
||||
TestHalClientMonitor(@NonNull Context context, @NonNull IBinder token,
|
||||
@NonNull Supplier<Object> lazyDaemon, int cookie, int protoEnum) {
|
||||
super(context, lazyDaemon, token /* token */, null /* listener */, 0 /* userId */,
|
||||
TAG, cookie, TEST_SENSOR_ID, 0 /* statsModality */,
|
||||
0 /* statsAction */, 0 /* statsClient */);
|
||||
TAG, cookie, TEST_SENSOR_ID,
|
||||
mock(BiometricLogger.class), mock(BiometricContext.class));
|
||||
mProtoEnum = protoEnum;
|
||||
}
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ public class CompositeCallbackTest {
|
||||
ClientMonitorCompositeCallback callback = new ClientMonitorCompositeCallback(callbacks);
|
||||
|
||||
callback.onClientStarted(mClientMonitor);
|
||||
final InOrder order = inOrder(expected);
|
||||
final InOrder order = inOrder((Object[]) expected);
|
||||
for (ClientMonitorCallback cb : expected) {
|
||||
order.verify(cb).onClientStarted(eq(mClientMonitor));
|
||||
}
|
||||
|
||||
@@ -41,6 +41,9 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -66,6 +69,10 @@ public class UserAwareBiometricSchedulerTest {
|
||||
private Context mContext;
|
||||
@Mock
|
||||
private IBiometricService mBiometricService;
|
||||
@Mock
|
||||
private BiometricLogger mBiometricLogger;
|
||||
@Mock
|
||||
private BiometricContext mBiometricContext;
|
||||
|
||||
private TestUserStartedCallback mUserStartedCallback = new TestUserStartedCallback();
|
||||
private TestUserStoppedCallback mUserStoppedCallback = new TestUserStoppedCallback();
|
||||
@@ -88,7 +95,8 @@ public class UserAwareBiometricSchedulerTest {
|
||||
@Override
|
||||
public StopUserClient<?> getStopUserClient(int userId) {
|
||||
return new TestStopUserClient(mContext, Object::new, mToken, userId,
|
||||
TEST_SENSOR_ID, mUserStoppedCallback);
|
||||
TEST_SENSOR_ID, mBiometricLogger, mBiometricContext,
|
||||
mUserStoppedCallback);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -96,7 +104,8 @@ public class UserAwareBiometricSchedulerTest {
|
||||
public StartUserClient<?, ?> getStartUserClient(int newUserId) {
|
||||
mStartUserClientCount++;
|
||||
return new TestStartUserClient(mContext, Object::new, mToken, newUserId,
|
||||
TEST_SENSOR_ID, mUserStartedCallback, mStartOperationsFinish);
|
||||
TEST_SENSOR_ID, mBiometricLogger, mBiometricContext,
|
||||
mUserStartedCallback, mStartOperationsFinish);
|
||||
}
|
||||
},
|
||||
CoexCoordinator.getInstance());
|
||||
@@ -226,8 +235,10 @@ public class UserAwareBiometricSchedulerTest {
|
||||
private static class TestStopUserClient extends StopUserClient<Object> {
|
||||
public TestStopUserClient(@NonNull Context context,
|
||||
@NonNull Supplier<Object> lazyDaemon, @Nullable IBinder token, int userId,
|
||||
int sensorId, @NonNull UserStoppedCallback callback) {
|
||||
super(context, lazyDaemon, token, userId, sensorId, callback);
|
||||
int sensorId, @NonNull BiometricLogger logger,
|
||||
@NonNull BiometricContext biometricContext,
|
||||
@NonNull UserStoppedCallback callback) {
|
||||
super(context, lazyDaemon, token, userId, sensorId, logger, biometricContext, callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -254,8 +265,10 @@ public class UserAwareBiometricSchedulerTest {
|
||||
|
||||
public TestStartUserClient(@NonNull Context context,
|
||||
@NonNull Supplier<Object> lazyDaemon, @Nullable IBinder token, int userId,
|
||||
int sensorId, @NonNull UserStartedCallback<Object> callback, boolean shouldFinish) {
|
||||
super(context, lazyDaemon, token, userId, sensorId, callback);
|
||||
int sensorId, @NonNull BiometricLogger logger,
|
||||
@NonNull BiometricContext biometricContext,
|
||||
@NonNull UserStartedCallback<Object> callback, boolean shouldFinish) {
|
||||
super(context, lazyDaemon, token, userId, sensorId, logger, biometricContext, callback);
|
||||
mShouldFinish = shouldFinish;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.server.biometrics.sensors.face.aidl;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyLong;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.hardware.biometrics.face.ISession;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.testing.TestableContext;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
import androidx.test.platform.app.InstrumentationRegistry;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.LockoutCache;
|
||||
import com.android.server.biometrics.sensors.face.UsageStats;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
|
||||
@Presubmit
|
||||
@SmallTest
|
||||
public class FaceAuthenticationClientTest {
|
||||
|
||||
private static final int USER_ID = 12;
|
||||
private static final long OP_ID = 32;
|
||||
private static final boolean HAS_AOD = true;
|
||||
|
||||
@Rule
|
||||
public final TestableContext mContext = new TestableContext(
|
||||
InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
|
||||
|
||||
@Mock
|
||||
private ISession mHal;
|
||||
@Mock
|
||||
private IBinder mToken;
|
||||
@Mock
|
||||
private ClientMonitorCallbackConverter mClientMonitorCallbackConverter;
|
||||
@Mock
|
||||
private BiometricLogger mBiometricLogger;
|
||||
@Mock
|
||||
private BiometricContext mBiometricContext;
|
||||
@Mock
|
||||
private LockoutCache mLockoutCache;
|
||||
@Mock
|
||||
private UsageStats mUsageStats;
|
||||
@Mock
|
||||
private ClientMonitorCallback mCallback;
|
||||
@Mock
|
||||
private Sensor.HalSessionCallback mHalSessionCallback;
|
||||
@Captor
|
||||
private ArgumentCaptor<OperationContext> mOperationContextCaptor;
|
||||
|
||||
@Rule
|
||||
public final MockitoRule mockito = MockitoJUnit.rule();
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
when(mBiometricContext.isAoD()).thenReturn(HAS_AOD);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void authNoContext_v1() throws RemoteException {
|
||||
final FaceAuthenticationClient client = createClient(1);
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mHal).authenticate(eq(OP_ID));
|
||||
verify(mHal, never()).authenticateWithContext(anyLong(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void authWithContext_v2() throws RemoteException {
|
||||
final FaceAuthenticationClient client = createClient(2);
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mHal).authenticateWithContext(eq(OP_ID), mOperationContextCaptor.capture());
|
||||
verify(mHal, never()).authenticate(anyLong());
|
||||
|
||||
final OperationContext opContext = mOperationContextCaptor.getValue();
|
||||
assertThat(opContext.isAoD).isEqualTo(HAS_AOD);
|
||||
}
|
||||
|
||||
private FaceAuthenticationClient createClient(int version) throws RemoteException {
|
||||
when(mHal.getInterfaceVersion()).thenReturn(version);
|
||||
|
||||
final AidlSession aidl = new AidlSession(version, mHal, USER_ID, mHalSessionCallback);
|
||||
return new FaceAuthenticationClient(mContext, () -> aidl, mToken,
|
||||
2 /* requestId */, mClientMonitorCallbackConverter, 5 /* targetUserId */, OP_ID,
|
||||
false /* restricted */, "test-owner", 4 /* cookie */,
|
||||
false /* requireConfirmation */, 9 /* sensorId */,
|
||||
mBiometricLogger, mBiometricContext, true /* isStrongBiometric */,
|
||||
mUsageStats, mLockoutCache, false /* allowBackgroundAuthentication */,
|
||||
false /* isKeyguardBypassEnabled */, null /* sensorPrivacyManager */);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.server.biometrics.sensors.face.aidl;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.hardware.biometrics.face.ISession;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.testing.TestableContext;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
import androidx.test.platform.app.InstrumentationRegistry;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
|
||||
@Presubmit
|
||||
@SmallTest
|
||||
public class FaceDetectClientTest {
|
||||
|
||||
private static final int USER_ID = 12;
|
||||
private static final boolean HAS_AOD = true;
|
||||
|
||||
@Rule
|
||||
public final TestableContext mContext = new TestableContext(
|
||||
InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
|
||||
|
||||
@Mock
|
||||
private ISession mHal;
|
||||
@Mock
|
||||
private IBinder mToken;
|
||||
@Mock
|
||||
private ClientMonitorCallbackConverter mClientMonitorCallbackConverter;
|
||||
@Mock
|
||||
private BiometricLogger mBiometricLogger;
|
||||
@Mock
|
||||
private BiometricContext mBiometricContext;
|
||||
@Mock
|
||||
private ClientMonitorCallback mCallback;
|
||||
@Mock
|
||||
private Sensor.HalSessionCallback mHalSessionCallback;
|
||||
@Captor
|
||||
private ArgumentCaptor<OperationContext> mOperationContextCaptor;
|
||||
|
||||
@Rule
|
||||
public final MockitoRule mockito = MockitoJUnit.rule();
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
when(mBiometricContext.isAoD()).thenReturn(HAS_AOD);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void detectNoContext_v1() throws RemoteException {
|
||||
final FaceDetectClient client = createClient(1);
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mHal).detectInteraction();
|
||||
verify(mHal, never()).detectInteractionWithContext(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void detectWithContext_v2() throws RemoteException {
|
||||
final FaceDetectClient client = createClient(2);
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mHal).detectInteractionWithContext(mOperationContextCaptor.capture());
|
||||
verify(mHal, never()).detectInteraction();
|
||||
|
||||
final OperationContext opContext = mOperationContextCaptor.getValue();
|
||||
assertThat(opContext.isAoD).isEqualTo(HAS_AOD);
|
||||
}
|
||||
|
||||
private FaceDetectClient createClient(int version) throws RemoteException {
|
||||
when(mHal.getInterfaceVersion()).thenReturn(version);
|
||||
|
||||
final AidlSession aidl = new AidlSession(version, mHal, USER_ID, mHalSessionCallback);
|
||||
return new FaceDetectClient(mContext, () -> aidl, mToken,
|
||||
99 /* requestId */, mClientMonitorCallbackConverter, USER_ID,
|
||||
"own-it", 5 /* sensorId */, mBiometricLogger, mBiometricContext,
|
||||
false /* isStrongBiometric */, null /* sensorPrivacyManager */);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.server.biometrics.sensors.face.aidl;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyByte;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.hardware.biometrics.face.ISession;
|
||||
import android.hardware.face.Face;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.testing.TestableContext;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
import androidx.test.platform.app.InstrumentationRegistry;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
|
||||
@Presubmit
|
||||
@SmallTest
|
||||
public class FaceEnrollClientTest {
|
||||
|
||||
private static final byte[] HAT = new byte[69];
|
||||
private static final int USER_ID = 12;
|
||||
|
||||
@Rule
|
||||
public final TestableContext mContext = new TestableContext(
|
||||
InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
|
||||
|
||||
@Mock
|
||||
private ISession mHal;
|
||||
@Mock
|
||||
private IBinder mToken;
|
||||
@Mock
|
||||
private ClientMonitorCallbackConverter mClientMonitorCallbackConverter;
|
||||
@Mock
|
||||
private BiometricLogger mBiometricLogger;
|
||||
@Mock
|
||||
private BiometricContext mBiometricContext;
|
||||
@Mock
|
||||
private BiometricUtils<Face> mUtils;
|
||||
@Mock
|
||||
private ClientMonitorCallback mCallback;
|
||||
@Mock
|
||||
private Sensor.HalSessionCallback mHalSessionCallback;
|
||||
|
||||
@Rule
|
||||
public final MockitoRule mockito = MockitoJUnit.rule();
|
||||
|
||||
@Test
|
||||
public void enrollNoContext_v1() throws RemoteException {
|
||||
final FaceEnrollClient client = createClient(1);
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mHal).enroll(any(), anyByte(), any(), any());
|
||||
verify(mHal, never()).enrollWithContext(any(), anyByte(), any(), any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void enrollWithContext_v2() throws RemoteException {
|
||||
final FaceEnrollClient client = createClient(2);
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mHal).enrollWithContext(any(), anyByte(), any(), any(), any());
|
||||
verify(mHal, never()).enroll(any(), anyByte(), any(), any());
|
||||
}
|
||||
|
||||
private FaceEnrollClient createClient(int version) throws RemoteException {
|
||||
when(mHal.getInterfaceVersion()).thenReturn(version);
|
||||
|
||||
final AidlSession aidl = new AidlSession(version, mHal, USER_ID, mHalSessionCallback);
|
||||
return new FaceEnrollClient(mContext, () -> aidl, mToken, mClientMonitorCallbackConverter,
|
||||
USER_ID, HAT, "com.foo.bar", 44 /* requestId */,
|
||||
mUtils, new int[0] /* disabledFeatures */, 6 /* timeoutSec */,
|
||||
null /* previewSurface */, 8 /* sensorId */,
|
||||
mBiometricLogger, mBiometricContext, 5 /* maxTemplatesPerUser */,
|
||||
true /* debugConsent */);
|
||||
}
|
||||
}
|
||||
@@ -32,6 +32,8 @@ import android.platform.test.annotations.Presubmit;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricScheduler;
|
||||
import com.android.server.biometrics.sensors.CoexCoordinator;
|
||||
import com.android.server.biometrics.sensors.LockoutCache;
|
||||
@@ -66,6 +68,10 @@ public class SensorTest {
|
||||
private Sensor.HalSessionCallback.Callback mHalSessionCallback;
|
||||
@Mock
|
||||
private LockoutResetDispatcher mLockoutResetDispatcher;
|
||||
@Mock
|
||||
private BiometricLogger mBiometricLogger;
|
||||
@Mock
|
||||
private BiometricContext mBiometricContext;
|
||||
|
||||
private final TestLooper mLooper = new TestLooper();
|
||||
private final LockoutCache mLockoutCache = new LockoutCache();
|
||||
@@ -102,7 +108,8 @@ public class SensorTest {
|
||||
|
||||
mScheduler.scheduleClientMonitor(new FaceResetLockoutClient(mContext,
|
||||
() -> new AidlSession(1, mSession, USER_ID, mHalCallback),
|
||||
USER_ID, TAG, SENSOR_ID, HAT, mLockoutCache, mLockoutResetDispatcher));
|
||||
USER_ID, TAG, SENSOR_ID, mBiometricLogger, mBiometricContext,
|
||||
HAT, mLockoutCache, mLockoutResetDispatcher));
|
||||
mLooper.dispatchAll();
|
||||
|
||||
verifyNotLocked();
|
||||
|
||||
@@ -34,6 +34,8 @@ import android.platform.test.annotations.Presubmit;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
|
||||
@@ -62,6 +64,10 @@ public class FaceGenerateChallengeClientTest {
|
||||
private IFaceServiceReceiver mOtherReceiver;
|
||||
@Mock
|
||||
private ClientMonitorCallback mMonitorCallback;
|
||||
@Mock
|
||||
private BiometricLogger mBiometricLogger;
|
||||
@Mock
|
||||
private BiometricContext mBiometricContext;
|
||||
|
||||
private FaceGenerateChallengeClient mClient;
|
||||
|
||||
@@ -75,7 +81,7 @@ public class FaceGenerateChallengeClientTest {
|
||||
|
||||
mClient = new FaceGenerateChallengeClient(mContext, () -> mIBiometricsFace, new Binder(),
|
||||
new ClientMonitorCallbackConverter(mClientReceiver), USER_ID,
|
||||
TAG, SENSOR_ID, START_TIME);
|
||||
TAG, SENSOR_ID, mBiometricLogger, mBiometricContext , START_TIME);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -0,0 +1,265 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.server.biometrics.sensors.fingerprint.aidl;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.Mockito.any;
|
||||
import static org.mockito.Mockito.anyFloat;
|
||||
import static org.mockito.Mockito.anyInt;
|
||||
import static org.mockito.Mockito.anyLong;
|
||||
import static org.mockito.Mockito.eq;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.hardware.biometrics.fingerprint.ISession;
|
||||
import android.hardware.biometrics.fingerprint.PointerContext;
|
||||
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
||||
import android.hardware.fingerprint.ISidefpsController;
|
||||
import android.hardware.fingerprint.IUdfpsOverlayController;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.testing.TestableContext;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
import androidx.test.platform.app.InstrumentationRegistry;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.log.CallbackWithProbe;
|
||||
import com.android.server.biometrics.log.Probe;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
import com.android.server.biometrics.sensors.LockoutCache;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
@Presubmit
|
||||
@SmallTest
|
||||
public class FingerprintAuthenticationClientTest {
|
||||
|
||||
private static final int USER_ID = 8;
|
||||
private static final long OP_ID = 7;
|
||||
private static final boolean HAS_AOD = true;
|
||||
private static final int POINTER_ID = 0;
|
||||
private static final int TOUCH_X = 8;
|
||||
private static final int TOUCH_Y = 20;
|
||||
private static final float TOUCH_MAJOR = 4.4f;
|
||||
private static final float TOUCH_MINOR = 5.5f;
|
||||
|
||||
@Rule
|
||||
public final TestableContext mContext = new TestableContext(
|
||||
InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
|
||||
|
||||
@Mock
|
||||
private ISession mHal;
|
||||
@Mock
|
||||
private IBinder mToken;
|
||||
@Mock
|
||||
private ClientMonitorCallbackConverter mClientMonitorCallbackConverter;
|
||||
@Mock
|
||||
private BiometricLogger mBiometricLogger;
|
||||
@Mock
|
||||
private BiometricContext mBiometricContext;
|
||||
@Mock
|
||||
private LockoutCache mLockoutCache;
|
||||
@Mock
|
||||
private IUdfpsOverlayController mUdfpsOverlayController;
|
||||
@Mock
|
||||
private ISidefpsController mSideFpsController;
|
||||
@Mock
|
||||
private FingerprintSensorPropertiesInternal mSensorProps;
|
||||
@Mock
|
||||
private ClientMonitorCallback mCallback;
|
||||
@Mock
|
||||
private Sensor.HalSessionCallback mHalSessionCallback;
|
||||
@Mock
|
||||
private Probe mLuxProbe;
|
||||
@Captor
|
||||
private ArgumentCaptor<OperationContext> mOperationContextCaptor;
|
||||
@Captor
|
||||
private ArgumentCaptor<PointerContext> mPointerContextCaptor;
|
||||
|
||||
@Rule
|
||||
public final MockitoRule mockito = MockitoJUnit.rule();
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
when(mBiometricLogger.createALSCallback(anyBoolean())).thenAnswer(i ->
|
||||
new CallbackWithProbe<>(mLuxProbe, i.getArgument(0)));
|
||||
when(mBiometricContext.isAoD()).thenReturn(HAS_AOD);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void authNoContext_v1() throws RemoteException {
|
||||
final FingerprintAuthenticationClient client = createClient(1);
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mHal).authenticate(eq(OP_ID));
|
||||
verify(mHal, never()).authenticateWithContext(anyLong(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void authWithContext_v2() throws RemoteException {
|
||||
final FingerprintAuthenticationClient client = createClient(2);
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mHal).authenticateWithContext(eq(OP_ID), mOperationContextCaptor.capture());
|
||||
verify(mHal, never()).authenticate(anyLong());
|
||||
|
||||
final OperationContext opContext = mOperationContextCaptor.getValue();
|
||||
assertThat(opContext.isAoD).isEqualTo(HAS_AOD);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void pointerUp_v1() throws RemoteException {
|
||||
final FingerprintAuthenticationClient client = createClient(1);
|
||||
client.start(mCallback);
|
||||
client.onPointerUp();
|
||||
|
||||
verify(mHal).onPointerUp(eq(POINTER_ID));
|
||||
verify(mHal, never()).onPointerUpWithContext(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void pointerDown_v1() throws RemoteException {
|
||||
final FingerprintAuthenticationClient client = createClient(1);
|
||||
client.start(mCallback);
|
||||
client.onPointerDown(TOUCH_X, TOUCH_Y, TOUCH_MAJOR, TOUCH_MINOR);
|
||||
|
||||
verify(mHal).onPointerDown(eq(0),
|
||||
eq(TOUCH_X), eq(TOUCH_Y), eq(TOUCH_MAJOR), eq(TOUCH_MINOR));
|
||||
verify(mHal, never()).onPointerDownWithContext(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void pointerUpWithContext_v2() throws RemoteException {
|
||||
final FingerprintAuthenticationClient client = createClient(2);
|
||||
client.start(mCallback);
|
||||
client.onPointerUp();
|
||||
|
||||
verify(mHal).onPointerUpWithContext(mPointerContextCaptor.capture());
|
||||
verify(mHal, never()).onPointerUp(eq(POINTER_ID));
|
||||
|
||||
final PointerContext pContext = mPointerContextCaptor.getValue();
|
||||
assertThat(pContext.pointerId).isEqualTo(POINTER_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void pointerDownWithContext_v2() throws RemoteException {
|
||||
final FingerprintAuthenticationClient client = createClient(2);
|
||||
client.start(mCallback);
|
||||
client.onPointerDown(TOUCH_X, TOUCH_Y, TOUCH_MAJOR, TOUCH_MINOR);
|
||||
|
||||
verify(mHal).onPointerDownWithContext(mPointerContextCaptor.capture());
|
||||
verify(mHal, never()).onPointerDown(anyInt(), anyInt(), anyInt(), anyFloat(), anyFloat());
|
||||
|
||||
final PointerContext pContext = mPointerContextCaptor.getValue();
|
||||
assertThat(pContext.pointerId).isEqualTo(POINTER_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void luxProbeWhenFingerDown() throws RemoteException {
|
||||
final FingerprintAuthenticationClient client = createClient();
|
||||
client.start(mCallback);
|
||||
|
||||
client.onPointerDown(TOUCH_X, TOUCH_Y, TOUCH_MAJOR, TOUCH_MINOR);
|
||||
verify(mLuxProbe).enable();
|
||||
|
||||
client.onAcquired(2, 0);
|
||||
verify(mLuxProbe, never()).disable();
|
||||
|
||||
client.onPointerUp();
|
||||
verify(mLuxProbe).disable();
|
||||
|
||||
client.onPointerDown(TOUCH_X, TOUCH_Y, TOUCH_MAJOR, TOUCH_MINOR);
|
||||
verify(mLuxProbe, times(2)).enable();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showHideOverlay_cancel() throws RemoteException {
|
||||
showHideOverlay(c -> c.cancel());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showHideOverlay_stop() throws RemoteException {
|
||||
showHideOverlay(c -> c.stopHalOperation());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showHideOverlay_error() throws RemoteException {
|
||||
showHideOverlay(c -> c.onError(0, 0));
|
||||
verify(mCallback).onClientFinished(any(), eq(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showHideOverlay_lockout() throws RemoteException {
|
||||
showHideOverlay(c -> c.onLockoutTimed(5000));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showHideOverlay_lockoutPerm() throws RemoteException {
|
||||
showHideOverlay(c -> c.onLockoutPermanent());
|
||||
}
|
||||
|
||||
private void showHideOverlay(Consumer<FingerprintAuthenticationClient> block)
|
||||
throws RemoteException {
|
||||
final FingerprintAuthenticationClient client = createClient();
|
||||
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mUdfpsOverlayController).showUdfpsOverlay(anyInt(), anyInt(), any());
|
||||
verify(mSideFpsController).show(anyInt(), anyInt());
|
||||
|
||||
block.accept(client);
|
||||
|
||||
verify(mUdfpsOverlayController).hideUdfpsOverlay(anyInt());
|
||||
verify(mSideFpsController).hide(anyInt());
|
||||
}
|
||||
|
||||
private FingerprintAuthenticationClient createClient() throws RemoteException {
|
||||
return createClient(100);
|
||||
}
|
||||
|
||||
private FingerprintAuthenticationClient createClient(int version) throws RemoteException {
|
||||
when(mHal.getInterfaceVersion()).thenReturn(version);
|
||||
|
||||
final AidlSession aidl = new AidlSession(version, mHal, USER_ID, mHalSessionCallback);
|
||||
return new FingerprintAuthenticationClient(mContext, () -> aidl, mToken,
|
||||
2 /* requestId */, mClientMonitorCallbackConverter, 5 /* targetUserId */, OP_ID,
|
||||
false /* restricted */, "test-owner", 4 /* cookie */, false /* requireConfirmation */,
|
||||
9 /* sensorId */, mBiometricLogger, mBiometricContext,
|
||||
true /* isStrongBiometric */,
|
||||
null /* taskStackListener */, mLockoutCache,
|
||||
mUdfpsOverlayController, mSideFpsController,
|
||||
false /* allowBackgroundAuthentication */, mSensorProps);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.server.biometrics.sensors.fingerprint.aidl;
|
||||
|
||||
import static org.mockito.Mockito.any;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.hardware.biometrics.fingerprint.ISession;
|
||||
import android.hardware.fingerprint.IUdfpsOverlayController;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.testing.TestableContext;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
import androidx.test.platform.app.InstrumentationRegistry;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
|
||||
@Presubmit
|
||||
@SmallTest
|
||||
public class FingerprintDetectClientTest {
|
||||
|
||||
private static final int USER_ID = 8;
|
||||
private static final boolean HAS_AOD = true;
|
||||
|
||||
@Rule
|
||||
public final TestableContext mContext = new TestableContext(
|
||||
InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
|
||||
|
||||
@Mock
|
||||
private ISession mHal;
|
||||
@Mock
|
||||
private IBinder mToken;
|
||||
@Mock
|
||||
private ClientMonitorCallbackConverter mClientMonitorCallbackConverter;
|
||||
@Mock
|
||||
private BiometricLogger mBiometricLogger;
|
||||
@Mock
|
||||
private BiometricContext mBiometricContext;
|
||||
@Mock
|
||||
private IUdfpsOverlayController mUdfpsOverlayController;
|
||||
@Mock
|
||||
private ClientMonitorCallback mCallback;
|
||||
@Mock
|
||||
private Sensor.HalSessionCallback mHalSessionCallback;
|
||||
@Captor
|
||||
private ArgumentCaptor<OperationContext> mOperationContextCaptor;
|
||||
|
||||
@Rule
|
||||
public final MockitoRule mockito = MockitoJUnit.rule();
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
when(mBiometricContext.isAoD()).thenReturn(HAS_AOD);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void detectNoContext_v1() throws RemoteException {
|
||||
final FingerprintDetectClient client = createClient(1);
|
||||
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mHal).detectInteraction();
|
||||
verify(mHal, never()).detectInteractionWithContext(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void detectNoContext_v2() throws RemoteException {
|
||||
final FingerprintDetectClient client = createClient(2);
|
||||
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mHal).detectInteractionWithContext(mOperationContextCaptor.capture());
|
||||
verify(mHal, never()).detectInteraction();
|
||||
}
|
||||
|
||||
private FingerprintDetectClient createClient(int version) throws RemoteException {
|
||||
when(mHal.getInterfaceVersion()).thenReturn(version);
|
||||
|
||||
final AidlSession aidl = new AidlSession(version, mHal, USER_ID, mHalSessionCallback);
|
||||
return new FingerprintDetectClient(mContext, () -> aidl, mToken,
|
||||
6 /* requestId */, mClientMonitorCallbackConverter, 2 /* userId */,
|
||||
"a-test", 1 /* sensorId */, mBiometricLogger, mBiometricContext,
|
||||
mUdfpsOverlayController, true /* isStrongBiometric */);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,224 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.server.biometrics.sensors.fingerprint.aidl;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.anyFloat;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.any;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.hardware.biometrics.common.OperationContext;
|
||||
import android.hardware.biometrics.fingerprint.ISession;
|
||||
import android.hardware.biometrics.fingerprint.PointerContext;
|
||||
import android.hardware.fingerprint.Fingerprint;
|
||||
import android.hardware.fingerprint.FingerprintManager;
|
||||
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
||||
import android.hardware.fingerprint.ISidefpsController;
|
||||
import android.hardware.fingerprint.IUdfpsOverlayController;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.testing.TestableContext;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
import androidx.test.platform.app.InstrumentationRegistry;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricUtils;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallback;
|
||||
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
|
||||
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
@Presubmit
|
||||
@SmallTest
|
||||
public class FingerprintEnrollClientTest {
|
||||
|
||||
private static final byte[] HAT = new byte[69];
|
||||
private static final int USER_ID = 8;
|
||||
private static final int POINTER_ID = 0;
|
||||
private static final int TOUCH_X = 8;
|
||||
private static final int TOUCH_Y = 20;
|
||||
private static final float TOUCH_MAJOR = 4.4f;
|
||||
private static final float TOUCH_MINOR = 5.5f;
|
||||
|
||||
@Rule
|
||||
public final TestableContext mContext = new TestableContext(
|
||||
InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
|
||||
|
||||
@Mock
|
||||
private ISession mHal;
|
||||
@Mock
|
||||
private IBinder mToken;
|
||||
@Mock
|
||||
private ClientMonitorCallbackConverter mClientMonitorCallbackConverter;
|
||||
@Mock
|
||||
private BiometricLogger mBiometricLogger;
|
||||
@Mock
|
||||
private BiometricContext mBiometricContext;
|
||||
@Mock
|
||||
private BiometricUtils<Fingerprint> mBiometricUtils;
|
||||
@Mock
|
||||
private IUdfpsOverlayController mUdfpsOverlayController;
|
||||
@Mock
|
||||
private ISidefpsController mSideFpsController;
|
||||
@Mock
|
||||
private FingerprintSensorPropertiesInternal mSensorProps;
|
||||
@Mock
|
||||
private ClientMonitorCallback mCallback;
|
||||
@Mock
|
||||
private Sensor.HalSessionCallback mHalSessionCallback;
|
||||
@Captor
|
||||
private ArgumentCaptor<OperationContext> mOperationContextCaptor;
|
||||
@Captor
|
||||
private ArgumentCaptor<PointerContext> mPointerContextCaptor;
|
||||
|
||||
@Rule
|
||||
public final MockitoRule mockito = MockitoJUnit.rule();
|
||||
|
||||
@Test
|
||||
public void enrollNoContext_v1() throws RemoteException {
|
||||
final FingerprintEnrollClient client = createClient(1);
|
||||
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mHal).enroll(any());
|
||||
verify(mHal, never()).enrollWithContext(any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void enrollWithContext_v2() throws RemoteException {
|
||||
final FingerprintEnrollClient client = createClient(2);
|
||||
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mHal).enrollWithContext(any(), mOperationContextCaptor.capture());
|
||||
verify(mHal, never()).enroll(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void pointerUp_v1() throws RemoteException {
|
||||
final FingerprintEnrollClient client = createClient(1);
|
||||
client.start(mCallback);
|
||||
client.onPointerUp();
|
||||
|
||||
verify(mHal).onPointerUp(eq(POINTER_ID));
|
||||
verify(mHal, never()).onPointerUpWithContext(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void pointerDown_v1() throws RemoteException {
|
||||
final FingerprintEnrollClient client = createClient(1);
|
||||
client.start(mCallback);
|
||||
client.onPointerDown(TOUCH_X, TOUCH_Y, TOUCH_MAJOR, TOUCH_MINOR);
|
||||
|
||||
verify(mHal).onPointerDown(eq(0),
|
||||
eq(TOUCH_X), eq(TOUCH_Y), eq(TOUCH_MAJOR), eq(TOUCH_MINOR));
|
||||
verify(mHal, never()).onPointerDownWithContext(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void pointerUpWithContext_v2() throws RemoteException {
|
||||
final FingerprintEnrollClient client = createClient(2);
|
||||
client.start(mCallback);
|
||||
client.onPointerUp();
|
||||
|
||||
verify(mHal).onPointerUpWithContext(mPointerContextCaptor.capture());
|
||||
verify(mHal, never()).onPointerUp(eq(POINTER_ID));
|
||||
|
||||
final PointerContext pContext = mPointerContextCaptor.getValue();
|
||||
assertThat(pContext.pointerId).isEqualTo(POINTER_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void pointerDownWithContext_v2() throws RemoteException {
|
||||
final FingerprintEnrollClient client = createClient(2);
|
||||
client.start(mCallback);
|
||||
client.onPointerDown(TOUCH_X, TOUCH_Y, TOUCH_MAJOR, TOUCH_MINOR);
|
||||
|
||||
verify(mHal).onPointerDownWithContext(mPointerContextCaptor.capture());
|
||||
verify(mHal, never()).onPointerDown(anyInt(), anyInt(), anyInt(), anyFloat(), anyFloat());
|
||||
|
||||
final PointerContext pContext = mPointerContextCaptor.getValue();
|
||||
assertThat(pContext.pointerId).isEqualTo(POINTER_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showHideOverlay_cancel() throws RemoteException {
|
||||
showHideOverlay(c -> c.cancel());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showHideOverlay_stop() throws RemoteException {
|
||||
showHideOverlay(c -> c.stopHalOperation());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showHideOverlay_error() throws RemoteException {
|
||||
showHideOverlay(c -> c.onError(0, 0));
|
||||
verify(mCallback).onClientFinished(any(), eq(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showHideOverlay_result() throws RemoteException {
|
||||
showHideOverlay(c -> c.onEnrollResult(new Fingerprint("", 1, 1), 0));
|
||||
}
|
||||
|
||||
private void showHideOverlay(Consumer<FingerprintEnrollClient> block)
|
||||
throws RemoteException {
|
||||
final FingerprintEnrollClient client = createClient();
|
||||
|
||||
client.start(mCallback);
|
||||
|
||||
verify(mUdfpsOverlayController).showUdfpsOverlay(anyInt(), anyInt(), any());
|
||||
verify(mSideFpsController).show(anyInt(), anyInt());
|
||||
|
||||
block.accept(client);
|
||||
|
||||
verify(mUdfpsOverlayController).hideUdfpsOverlay(anyInt());
|
||||
verify(mSideFpsController).hide(anyInt());
|
||||
}
|
||||
|
||||
private FingerprintEnrollClient createClient() throws RemoteException {
|
||||
return createClient(500);
|
||||
}
|
||||
|
||||
private FingerprintEnrollClient createClient(int version) throws RemoteException {
|
||||
when(mHal.getInterfaceVersion()).thenReturn(version);
|
||||
|
||||
final AidlSession aidl = new AidlSession(version, mHal, USER_ID, mHalSessionCallback);
|
||||
return new FingerprintEnrollClient(mContext, () -> aidl, mToken, 6 /* requestId */,
|
||||
mClientMonitorCallbackConverter, 0 /* userId */,
|
||||
HAT, "owner", mBiometricUtils, 8 /* sensorId */,
|
||||
mBiometricLogger, mBiometricContext, mSensorProps, mUdfpsOverlayController,
|
||||
mSideFpsController, 6 /* maxTemplatesPerUser */, FingerprintManager.ENROLL_ENROLL);
|
||||
}
|
||||
}
|
||||
@@ -32,6 +32,8 @@ import android.platform.test.annotations.Presubmit;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.server.biometrics.log.BiometricContext;
|
||||
import com.android.server.biometrics.log.BiometricLogger;
|
||||
import com.android.server.biometrics.sensors.BiometricScheduler;
|
||||
import com.android.server.biometrics.sensors.CoexCoordinator;
|
||||
import com.android.server.biometrics.sensors.LockoutCache;
|
||||
@@ -66,6 +68,10 @@ public class SensorTest {
|
||||
private Sensor.HalSessionCallback.Callback mHalSessionCallback;
|
||||
@Mock
|
||||
private LockoutResetDispatcher mLockoutResetDispatcher;
|
||||
@Mock
|
||||
private BiometricLogger mLogger;
|
||||
@Mock
|
||||
private BiometricContext mBiometricContext;
|
||||
|
||||
private final TestLooper mLooper = new TestLooper();
|
||||
private final LockoutCache mLockoutCache = new LockoutCache();
|
||||
@@ -102,7 +108,8 @@ public class SensorTest {
|
||||
|
||||
mScheduler.scheduleClientMonitor(new FingerprintResetLockoutClient(mContext,
|
||||
() -> new AidlSession(1, mSession, USER_ID, mHalCallback),
|
||||
USER_ID, TAG, SENSOR_ID, HAT, mLockoutCache, mLockoutResetDispatcher));
|
||||
USER_ID, TAG, SENSOR_ID, mLogger, mBiometricContext, HAT, mLockoutCache,
|
||||
mLockoutResetDispatcher));
|
||||
mLooper.dispatchAll();
|
||||
|
||||
verifyNotLocked();
|
||||
|
||||
Reference in New Issue
Block a user