Move biometric setting observer from KeyguardUpdateMonitor to BiometricService
Fixes: 116872423
Test: with additional logging, do
adb shell settings put secure face_unlock_keyguard_enabled 1 (or 0)
Test: content observer updates when user changes
Test: clients receive the current state upon registering
Change-Id: Id37381a8c263b29a0b91abb5241d74bb52364d63
diff --git a/Android.bp b/Android.bp
index faad6f3..9f93d39 100644
--- a/Android.bp
+++ b/Android.bp
@@ -152,9 +152,10 @@
":libcamera_client_framework_aidl",
"core/java/android/hardware/IConsumerIrService.aidl",
"core/java/android/hardware/ISerialManager.aidl",
+ "core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl",
+ "core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl",
"core/java/android/hardware/biometrics/IBiometricService.aidl",
"core/java/android/hardware/biometrics/IBiometricServiceReceiver.aidl",
- "core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl",
"core/java/android/hardware/biometrics/IBiometricServiceLockoutResetCallback.aidl",
"core/java/android/hardware/display/IDisplayManager.aidl",
"core/java/android/hardware/display/IDisplayManagerCallback.aidl",
diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java
index 8cba1f8..b8739b9 100644
--- a/core/java/android/hardware/biometrics/BiometricManager.java
+++ b/core/java/android/hardware/biometrics/BiometricManager.java
@@ -17,6 +17,7 @@
package android.hardware.biometrics;
import static android.Manifest.permission.USE_BIOMETRIC;
+import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL;
import android.annotation.RequiresPermission;
import android.content.Context;
@@ -79,4 +80,22 @@
return ERROR_UNAVAILABLE;
}
}
+
+ /**
+ * Listens for changes to biometric eligibility on keyguard from user settings.
+ * @param callback
+ * @hide
+ */
+ @RequiresPermission(USE_BIOMETRIC_INTERNAL)
+ public void registerEnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback) {
+ if (mService != null) {
+ try {
+ mService.registerEnabledOnKeyguardCallback(callback);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ } else {
+ Slog.w(TAG, "registerEnabledOnKeyguardCallback(): Service not connected");
+ }
+ }
}
diff --git a/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl b/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl
new file mode 100644
index 0000000..d22e7e2
--- /dev/null
+++ b/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2018 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;
+
+import android.hardware.biometrics.BiometricSourceType;
+
+/**
+ * @hide
+ */
+oneway interface IBiometricEnabledOnKeyguardCallback {
+ void onChanged(in BiometricSourceType type, boolean enabled);
+}
\ No newline at end of file
diff --git a/core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl b/core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl
index 67c9346..27d25b8 100644
--- a/core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl
+++ b/core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl
@@ -15,9 +15,6 @@
*/
package android.hardware.biometrics;
-import android.os.Bundle;
-import android.os.UserHandle;
-
/**
* Communication channel from the BiometricPrompt (SysUI) back to AuthenticationClient.
* @hide
diff --git a/core/java/android/hardware/biometrics/IBiometricService.aidl b/core/java/android/hardware/biometrics/IBiometricService.aidl
index 1987f80..51e4ecb 100644
--- a/core/java/android/hardware/biometrics/IBiometricService.aidl
+++ b/core/java/android/hardware/biometrics/IBiometricService.aidl
@@ -17,6 +17,7 @@
package android.hardware.biometrics;
import android.os.Bundle;
+import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
import android.hardware.biometrics.IBiometricPromptReceiver;
import android.hardware.biometrics.IBiometricServiceReceiver;
@@ -39,4 +40,7 @@
// Checks if biometrics can be used.
int canAuthenticate(String opPackageName);
+
+ // Register callback for when keyguard biometric eligibility changes.
+ void registerEnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback);
}
\ No newline at end of file
diff --git a/core/java/android/hardware/biometrics/IBiometricServiceReceiver.aidl b/core/java/android/hardware/biometrics/IBiometricServiceReceiver.aidl
index 71abdd2..a6e3696 100644
--- a/core/java/android/hardware/biometrics/IBiometricServiceReceiver.aidl
+++ b/core/java/android/hardware/biometrics/IBiometricServiceReceiver.aidl
@@ -15,10 +15,6 @@
*/
package android.hardware.biometrics;
-import android.hardware.biometrics.BiometricSourceType;
-import android.os.Bundle;
-import android.os.UserHandle;
-
/**
* Communication channel from the BiometricService back to BiometricPrompt.
* @hide
diff --git a/core/java/android/hardware/face/IFaceServiceReceiver.aidl b/core/java/android/hardware/face/IFaceServiceReceiver.aidl
index 16fb690..b88574b 100644
--- a/core/java/android/hardware/face/IFaceServiceReceiver.aidl
+++ b/core/java/android/hardware/face/IFaceServiceReceiver.aidl
@@ -16,8 +16,6 @@
package android.hardware.face;
import android.hardware.face.Face;
-import android.os.Bundle;
-import android.os.UserHandle;
/**
* Communication channel from the FaceService back to FaceAuthenticationManager.
diff --git a/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl b/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl
index 370383f..cf1c94e 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl
@@ -16,8 +16,6 @@
package android.hardware.fingerprint;
import android.hardware.fingerprint.Fingerprint;
-import android.os.Bundle;
-import android.os.UserHandle;
/**
* Communication channel from the FingerprintService back to FingerprintManager.
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index f1b53fe..c7685f8 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -41,7 +41,6 @@
import android.app.trust.TrustManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -49,13 +48,14 @@
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.ContentObserver;
+import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricSourceType;
+import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback;
import android.hardware.fingerprint.FingerprintManager.AuthenticationResult;
import android.media.AudioManager;
-import android.net.Uri;
import android.os.BatteryManager;
import android.os.CancellationSignal;
import android.os.Handler;
@@ -250,51 +250,6 @@
private static final int HW_UNAVAILABLE_TIMEOUT = 3000; // ms
private static final int HW_UNAVAILABLE_RETRY_MAX = 3;
- private class SettingObserver extends ContentObserver {
- private final Uri FACE_UNLOCK_KEYGUARD_ENABLED =
- Settings.Secure.getUriFor(Settings.Secure.FACE_UNLOCK_KEYGUARD_ENABLED);
-
- private final ContentResolver mContentResolver;
-
- /**
- * Creates a content observer.
- *
- * @param handler The handler to run {@link #onChange} on, or null if none.
- */
- public SettingObserver(Handler handler) {
- super(handler);
- mContentResolver = mContext.getContentResolver();
- updateContentObserver();
- }
-
- public void updateContentObserver() {
- mContentResolver.unregisterContentObserver(this);
- mContentResolver.registerContentObserver(FACE_UNLOCK_KEYGUARD_ENABLED,
- false /* notifyForDescendents */,
- this,
- UserHandle.USER_CURRENT);
-
- // Update the value immediately
- onChange(true /* selfChange */, FACE_UNLOCK_KEYGUARD_ENABLED);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- if (FACE_UNLOCK_KEYGUARD_ENABLED.equals(uri)) {
- mFaceSettingEnabledForUser =
- Settings.Secure.getIntForUser(
- mContentResolver,
- Settings.Secure.FACE_UNLOCK_KEYGUARD_ENABLED,
- 1 /* default */,
- UserHandle.USER_CURRENT) != 0;
- updateBiometricListeningState();
- }
- }
- }
-
- private final SettingObserver mSettingObserver;
- private boolean mFaceSettingEnabledForUser;
-
private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
@@ -400,6 +355,18 @@
}
};
+ private boolean mFaceSettingEnabledForUser;
+ private BiometricManager mBiometricManager;
+ private IBiometricEnabledOnKeyguardCallback mBiometricEnabledCallback =
+ new IBiometricEnabledOnKeyguardCallback.Stub() {
+ @Override
+ public void onChanged(BiometricSourceType type, boolean enabled) throws RemoteException {
+ if (type == BiometricSourceType.FACE) {
+ mFaceSettingEnabledForUser = enabled;
+ }
+ }
+ };
+
private OnSubscriptionsChangedListener mSubscriptionListener =
new OnSubscriptionsChangedListener() {
@Override
@@ -1165,7 +1132,7 @@
private CancellationSignal mFingerprintCancelSignal;
private CancellationSignal mFaceCancelSignal;
private FingerprintManager mFpm;
- private FaceManager mFaceAuthenticationManager;
+ private FaceManager mFaceManager;
/**
* When we receive a
@@ -1434,7 +1401,6 @@
mSubscriptionManager = SubscriptionManager.from(context);
mDeviceProvisioned = isDeviceProvisionedInSettingsDb();
mStrongAuthTracker = new StrongAuthTracker(context);
- mSettingObserver = new SettingObserver(mHandler);
// Since device can't be un-provisioned, we only need to register a content observer
// to update mDeviceProvisioned when we are...
@@ -1504,17 +1470,21 @@
if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
mFpm = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
}
-
if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) {
- mFaceAuthenticationManager =
- (FaceManager) context.getSystemService(Context.FACE_SERVICE);
+ mFaceManager = (FaceManager) context.getSystemService(Context.FACE_SERVICE);
}
+
+ if (mFpm != null || mFaceManager != null) {
+ mBiometricManager = context.getSystemService(BiometricManager.class);
+ mBiometricManager.registerEnabledOnKeyguardCallback(mBiometricEnabledCallback);
+ }
+
updateBiometricListeningState();
if (mFpm != null) {
mFpm.addLockoutResetCallback(mFingerprintLockoutResetCallback);
}
- if (mFaceAuthenticationManager != null) {
- mFaceAuthenticationManager.addLockoutResetCallback(mFaceLockoutResetCallback);
+ if (mFaceManager != null) {
+ mFaceManager.addLockoutResetCallback(mFaceLockoutResetCallback);
}
ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener);
@@ -1629,7 +1599,7 @@
mFaceCancelSignal.cancel();
}
mFaceCancelSignal = new CancellationSignal();
- mFaceAuthenticationManager.authenticate(null, mFaceCancelSignal, 0,
+ mFaceManager.authenticate(null, mFaceCancelSignal, 0,
mFaceAuthenticationCallback, null);
setFaceRunningState(BIOMETRIC_STATE_RUNNING);
}
@@ -1641,9 +1611,9 @@
}
public boolean isUnlockWithFacePossible(int userId) {
- return mFaceAuthenticationManager != null && mFaceAuthenticationManager.isHardwareDetected()
+ return mFaceManager != null && mFaceManager.isHardwareDetected()
&& !isFaceDisabled(userId)
- && mFaceAuthenticationManager.hasEnrolledTemplates(userId);
+ && mFaceManager.hasEnrolledTemplates(userId);
}
private void stopListeningForFingerprint() {
@@ -1765,7 +1735,6 @@
* Handle {@link #MSG_USER_SWITCH_COMPLETE}
*/
private void handleUserSwitchComplete(int userId) {
- mSettingObserver.updateContentObserver();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -2437,7 +2406,7 @@
pw.println(" strongAuthFlags=" + Integer.toHexString(strongAuthFlags));
pw.println(" trustManaged=" + getUserTrustIsManaged(userId));
}
- if (mFaceAuthenticationManager != null && mFaceAuthenticationManager.isHardwareDetected()) {
+ if (mFaceManager != null && mFaceManager.isHardwareDetected()) {
final int userId = ActivityManager.getCurrentUser();
final int strongAuthFlags = mStrongAuthTracker.getStrongAuthForUser(userId);
pw.println(" Face authentication state (user=" + userId + ")");
@@ -2449,6 +2418,7 @@
pw.println(" possible=" + isUnlockWithFacePossible(userId));
pw.println(" strongAuthFlags=" + Integer.toHexString(strongAuthFlags));
pw.println(" trustManaged=" + getUserTrustIsManaged(userId));
+ pw.println(" enabledByUser=" + mFaceSettingEnabledForUser);
}
}
}
diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java
index 4d637d4..5eca489 100644
--- a/services/core/java/com/android/server/biometrics/BiometricService.java
+++ b/services/core/java/com/android/server/biometrics/BiometricService.java
@@ -17,13 +17,20 @@
package com.android.server.biometrics;
import static android.Manifest.permission.USE_BIOMETRIC;
+import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL;
import static android.Manifest.permission.USE_FINGERPRINT;
+import android.app.ActivityManager;
import android.app.AppOpsManager;
+import android.app.UserSwitchObserver;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.database.ContentObserver;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants;
+import android.hardware.biometrics.BiometricSourceType;
+import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
import android.hardware.biometrics.IBiometricPromptReceiver;
import android.hardware.biometrics.IBiometricService;
import android.hardware.biometrics.IBiometricServiceReceiver;
@@ -31,8 +38,10 @@
import android.hardware.face.IFaceService;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.IFingerprintService;
+import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
+import android.os.DeadObjectException;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -47,6 +56,7 @@
import com.android.server.SystemService;
import java.util.ArrayList;
+import java.util.List;
/**
* System service that arbitrates the modality for BiometricPrompt to use.
@@ -88,6 +98,8 @@
private final boolean mHasFeatureFingerprint;
private final boolean mHasFeatureIris;
private final boolean mHasFeatureFace;
+ private final SettingObserver mSettingObserver;
+ private final List<EnabledOnKeyguardCallback> mEnabledOnKeyguardCallbacks;
private IFingerprintService mFingerprintService;
private IFaceService mFaceService;
@@ -121,6 +133,107 @@
}
}
+ private final class SettingObserver extends ContentObserver {
+ private final Uri FACE_UNLOCK_KEYGUARD_ENABLED =
+ Settings.Secure.getUriFor(Settings.Secure.FACE_UNLOCK_KEYGUARD_ENABLED);
+ private final Uri FACE_UNLOCK_APP_ENABLED =
+ Settings.Secure.getUriFor(Settings.Secure.FACE_UNLOCK_APP_ENABLED);
+
+ private final ContentResolver mContentResolver;
+ private boolean mFaceEnabledOnKeyguard;
+ private boolean mFaceEnabledForApps;
+
+ /**
+ * Creates a content observer.
+ *
+ * @param handler The handler to run {@link #onChange} on, or null if none.
+ */
+ SettingObserver(Handler handler) {
+ super(handler);
+ mContentResolver = getContext().getContentResolver();
+ updateContentObserver();
+ }
+
+ void updateContentObserver() {
+ mContentResolver.unregisterContentObserver(this);
+ mContentResolver.registerContentObserver(FACE_UNLOCK_KEYGUARD_ENABLED,
+ false /* notifyForDescendents */,
+ this /* observer */,
+ UserHandle.USER_CURRENT);
+ mContentResolver.registerContentObserver(FACE_UNLOCK_APP_ENABLED,
+ false /* notifyForDescendents */,
+ this /* observer */,
+ UserHandle.USER_CURRENT);
+
+ // Update the value immediately
+ onChange(true /* selfChange */, FACE_UNLOCK_KEYGUARD_ENABLED);
+ onChange(true /* selfChange */, FACE_UNLOCK_APP_ENABLED);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ if (FACE_UNLOCK_KEYGUARD_ENABLED.equals(uri)) {
+ mFaceEnabledOnKeyguard =
+ Settings.Secure.getIntForUser(
+ mContentResolver,
+ Settings.Secure.FACE_UNLOCK_KEYGUARD_ENABLED,
+ 1 /* default */,
+ UserHandle.USER_CURRENT) != 0;
+
+ List<EnabledOnKeyguardCallback> callbacks = mEnabledOnKeyguardCallbacks;
+ for (int i = 0; i < callbacks.size(); i++) {
+ callbacks.get(i).notify(BiometricSourceType.FACE, mFaceEnabledOnKeyguard);
+ }
+ } else if (FACE_UNLOCK_APP_ENABLED.equals(uri)) {
+ mFaceEnabledForApps =
+ Settings.Secure.getIntForUser(
+ mContentResolver,
+ Settings.Secure.FACE_UNLOCK_APP_ENABLED,
+ 1 /* default */,
+ UserHandle.USER_CURRENT) != 0;
+ }
+ }
+
+ boolean getFaceEnabledOnKeyguard() {
+ return mFaceEnabledOnKeyguard;
+ }
+
+ boolean getFaceEnabledForApps() {
+ return mFaceEnabledForApps;
+ }
+ }
+
+ private final class EnabledOnKeyguardCallback implements IBinder.DeathRecipient {
+
+ private final IBiometricEnabledOnKeyguardCallback mCallback;
+
+ EnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback) {
+ mCallback = callback;
+ try {
+ mCallback.asBinder().linkToDeath(EnabledOnKeyguardCallback.this, 0);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Unable to linkToDeath", e);
+ }
+ }
+
+ void notify(BiometricSourceType sourceType, boolean enabled) {
+ try {
+ mCallback.onChanged(sourceType, enabled);
+ } catch (DeadObjectException e) {
+ Slog.w(TAG, "Death while invoking notify", e);
+ mEnabledOnKeyguardCallbacks.remove(this);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to invoke onChanged", e);
+ }
+ }
+
+ @Override
+ public void binderDied() {
+ Slog.e(TAG, "Enabled callback binder died");
+ mEnabledOnKeyguardCallbacks.remove(this);
+ }
+ }
+
/**
* This is just a pass-through service that wraps Fingerprint, Iris, Face services. This service
* should not carry any state. The reality is we need to keep a tiny amount of state so that
@@ -248,6 +361,19 @@
}
return error;
}
+
+ @Override
+ public void registerEnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback)
+ throws RemoteException {
+ checkInternalPermission();
+ mEnabledOnKeyguardCallbacks.add(new EnabledOnKeyguardCallback(callback));
+ try {
+ callback.onChanged(BiometricSourceType.FACE,
+ mSettingObserver.getFaceEnabledOnKeyguard());
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Remote exception", e);
+ }
+ }
}
private void checkAppOp(String opPackageName, int callingUid) {
@@ -258,6 +384,11 @@
}
}
+ private void checkInternalPermission() {
+ getContext().enforceCallingPermission(USE_BIOMETRIC_INTERNAL,
+ "Must have MANAGE_BIOMETRIC permission");
+ }
+
private void checkPermission() {
if (getContext().checkCallingPermission(USE_FINGERPRINT)
!= PackageManager.PERMISSION_GRANTED) {
@@ -280,11 +411,26 @@
mAppOps = context.getSystemService(AppOpsManager.class);
mHandler = new Handler(Looper.getMainLooper());
+ mEnabledOnKeyguardCallbacks = new ArrayList<>();
+ mSettingObserver = new SettingObserver(mHandler);
final PackageManager pm = context.getPackageManager();
mHasFeatureFingerprint = pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT);
mHasFeatureIris = pm.hasSystemFeature(PackageManager.FEATURE_IRIS);
mHasFeatureFace = pm.hasSystemFeature(PackageManager.FEATURE_FACE);
+
+ try {
+ ActivityManager.getService().registerUserSwitchObserver(
+ new UserSwitchObserver() {
+ @Override
+ public void onUserSwitchComplete(int newUserId) {
+ mSettingObserver.updateContentObserver();
+ }
+ }, BiometricService.class.getName()
+ );
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to register user switch observer", e);
+ }
}
@Override
@@ -311,15 +457,6 @@
publishBinderService(Context.BIOMETRIC_SERVICE, new BiometricPromptServiceWrapper());
}
- private boolean isFaceEnabledForApps() {
- // TODO: maybe cache this and eliminate duplicated code with KeyguardUpdateMonitor
- return Settings.Secure.getIntForUser(
- getContext().getContentResolver(),
- Settings.Secure.FACE_UNLOCK_APP_ENABLED,
- 1 /* default */,
- UserHandle.USER_CURRENT) == 1;
- }
-
/**
* Checks if there are any available biometrics, and returns the modality. This method also
* returns errors through the callback (no biometric feature, hardware not detected, no
@@ -389,7 +526,7 @@
case BIOMETRIC_IRIS:
return true;
case BIOMETRIC_FACE:
- return isFaceEnabledForApps();
+ return mSettingObserver.getFaceEnabledForApps();
default:
Slog.w(TAG, "Unsupported modality: " + modality);
return false;