[DO NOT MERGE] Remove duplicate face re-enroll notification am: b803e95bca

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23907135

Change-Id: I278e664d150a0cce6d1b5c26335a395de2699031
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Diya Bera
2023-07-06 02:21:52 +00:00
committed by Automerger Merge Worker
3 changed files with 111 additions and 14 deletions

View File

@@ -21,6 +21,8 @@ import static android.app.PendingIntent.FLAG_IMMUTABLE;
import static com.android.systemui.biometrics.BiometricNotificationBroadcastReceiver.ACTION_SHOW_FACE_REENROLL_DIALOG;
import static com.android.systemui.biometrics.BiometricNotificationBroadcastReceiver.ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -30,6 +32,9 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.biometrics.BiometricFaceConstants;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.biometrics.BiometricStateListener;
import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Handler;
import android.os.UserHandle;
import android.provider.Settings;
@@ -42,7 +47,6 @@ import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import java.util.Optional;
import javax.inject.Inject;
@@ -69,6 +73,8 @@ public class BiometricNotificationService implements CoreStartable {
private final NotificationManager mNotificationManager;
private final BiometricNotificationBroadcastReceiver mBroadcastReceiver;
private final FingerprintReEnrollNotification mFingerprintReEnrollNotification;
private final FingerprintManager mFingerprintManager;
private final FaceManager mFaceManager;
private NotificationChannel mNotificationChannel;
private boolean mFaceNotificationQueued;
private boolean mFingerprintNotificationQueued;
@@ -119,14 +125,29 @@ public class BiometricNotificationService implements CoreStartable {
}
};
private final BiometricStateListener mFaceStateListener = new BiometricStateListener() {
@Override
public void onEnrollmentsChanged(int userId, int sensorId, boolean hasEnrollments) {
mNotificationManager.cancelAsUser(TAG, FACE_NOTIFICATION_ID, UserHandle.CURRENT);
}
};
private final BiometricStateListener mFingerprintStateListener = new BiometricStateListener() {
@Override
public void onEnrollmentsChanged(int userId, int sensorId, boolean hasEnrollments) {
mNotificationManager.cancelAsUser(TAG, FINGERPRINT_NOTIFICATION_ID, UserHandle.CURRENT);
}
};
@Inject
public BiometricNotificationService(Context context,
KeyguardUpdateMonitor keyguardUpdateMonitor,
KeyguardStateController keyguardStateController,
Handler handler, NotificationManager notificationManager,
BiometricNotificationBroadcastReceiver biometricNotificationBroadcastReceiver,
Optional<FingerprintReEnrollNotification> fingerprintReEnrollNotification) {
public BiometricNotificationService(@NonNull Context context,
@NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
@NonNull KeyguardStateController keyguardStateController,
@NonNull Handler handler, @NonNull NotificationManager notificationManager,
@NonNull BiometricNotificationBroadcastReceiver biometricNotificationBroadcastReceiver,
@NonNull Optional<FingerprintReEnrollNotification> fingerprintReEnrollNotification,
@Nullable FingerprintManager fingerprintManager,
@Nullable FaceManager faceManager) {
mContext = context;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mKeyguardStateController = keyguardStateController;
@@ -135,6 +156,8 @@ public class BiometricNotificationService implements CoreStartable {
mBroadcastReceiver = biometricNotificationBroadcastReceiver;
mFingerprintReEnrollNotification = fingerprintReEnrollNotification.orElse(
new FingerprintReEnrollNotificationImpl());
mFingerprintManager = fingerprintManager;
mFaceManager = faceManager;
}
@Override
@@ -148,9 +171,16 @@ public class BiometricNotificationService implements CoreStartable {
intentFilter.addAction(ACTION_SHOW_FACE_REENROLL_DIALOG);
mContext.registerReceiver(mBroadcastReceiver, intentFilter,
Context.RECEIVER_EXPORTED_UNAUDITED);
if (mFingerprintManager != null) {
mFingerprintManager.registerBiometricStateListener(mFingerprintStateListener);
}
if (mFaceManager != null) {
mFaceManager.registerBiometricStateListener(mFaceStateListener);
}
}
private void queueFaceReenrollNotification() {
Log.d(TAG, "Face re-enroll notification queued.");
mFaceNotificationQueued = true;
final String title = mContext.getString(R.string.face_re_enroll_notification_title);
final String content = mContext.getString(
@@ -163,6 +193,7 @@ public class BiometricNotificationService implements CoreStartable {
}
private void queueFingerprintReenrollNotification() {
Log.d(TAG, "Fingerprint re-enroll notification queued.");
mFingerprintNotificationQueued = true;
final String title = mContext.getString(R.string.fingerprint_re_enroll_notification_title);
final String content = mContext.getString(

View File

@@ -30,7 +30,11 @@ import android.app.Notification;
import android.app.NotificationManager;
import android.hardware.biometrics.BiometricFaceConstants;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.biometrics.BiometricStateListener;
import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Handler;
import android.os.UserHandle;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -69,6 +73,10 @@ public class BiometricNotificationServiceTest extends SysuiTestCase {
Optional<FingerprintReEnrollNotification> mFingerprintReEnrollNotificationOptional;
@Mock
FingerprintReEnrollNotification mFingerprintReEnrollNotification;
@Mock
FingerprintManager mFingerprintManager;
@Mock
FaceManager mFaceManager;
private static final String TAG = "BiometricNotificationService";
private static final int FACE_NOTIFICATION_ID = 1;
@@ -81,6 +89,8 @@ public class BiometricNotificationServiceTest extends SysuiTestCase {
private TestableLooper mLooper;
private KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback;
private KeyguardStateController.Callback mKeyguardStateControllerCallback;
private BiometricStateListener mFaceStateListener;
private BiometricStateListener mFingerprintStateListener;
@Before
public void setUp() {
@@ -99,25 +109,37 @@ public class BiometricNotificationServiceTest extends SysuiTestCase {
mKeyguardUpdateMonitor, mKeyguardStateController, handler,
mNotificationManager,
broadcastReceiver,
mFingerprintReEnrollNotificationOptional);
mFingerprintReEnrollNotificationOptional,
mFingerprintManager,
mFaceManager);
biometricNotificationService.start();
ArgumentCaptor<KeyguardUpdateMonitorCallback> updateMonitorCallbackArgumentCaptor =
ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback.class);
ArgumentCaptor<KeyguardStateController.Callback> stateControllerCallbackArgumentCaptor =
ArgumentCaptor.forClass(KeyguardStateController.Callback.class);
ArgumentCaptor<BiometricStateListener> faceStateListenerArgumentCaptor =
ArgumentCaptor.forClass(BiometricStateListener.class);
ArgumentCaptor<BiometricStateListener> fingerprintStateListenerArgumentCaptor =
ArgumentCaptor.forClass(BiometricStateListener.class);
verify(mKeyguardUpdateMonitor).registerCallback(
updateMonitorCallbackArgumentCaptor.capture());
verify(mKeyguardStateController).addCallback(
stateControllerCallbackArgumentCaptor.capture());
verify(mFaceManager).registerBiometricStateListener(
faceStateListenerArgumentCaptor.capture());
verify(mFingerprintManager).registerBiometricStateListener(
fingerprintStateListenerArgumentCaptor.capture());
mFaceStateListener = faceStateListenerArgumentCaptor.getValue();
mFingerprintStateListener = fingerprintStateListenerArgumentCaptor.getValue();
mKeyguardUpdateMonitorCallback = updateMonitorCallbackArgumentCaptor.getValue();
mKeyguardStateControllerCallback = stateControllerCallbackArgumentCaptor.getValue();
}
@Test
public void testShowFingerprintReEnrollNotification() {
public void testShowFingerprintReEnrollNotification_onAcquiredReEnroll() {
when(mKeyguardStateController.isShowing()).thenReturn(false);
mKeyguardUpdateMonitorCallback.onBiometricHelp(
@@ -139,7 +161,7 @@ public class BiometricNotificationServiceTest extends SysuiTestCase {
.isEqualTo(ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG);
}
@Test
public void testShowFaceReEnrollNotification() {
public void testShowFaceReEnrollNotification_onErrorReEnroll() {
when(mKeyguardStateController.isShowing()).thenReturn(false);
mKeyguardUpdateMonitorCallback.onBiometricError(
@@ -161,4 +183,52 @@ public class BiometricNotificationServiceTest extends SysuiTestCase {
.isEqualTo(ACTION_SHOW_FACE_REENROLL_DIALOG);
}
@Test
public void testCancelReEnrollmentNotification_onFaceEnrollmentStateChange() {
when(mKeyguardStateController.isShowing()).thenReturn(false);
mKeyguardUpdateMonitorCallback.onBiometricError(
BiometricFaceConstants.BIOMETRIC_ERROR_RE_ENROLL,
"Testing Face Re-enrollment" /* errString */,
BiometricSourceType.FACE
);
mKeyguardStateControllerCallback.onKeyguardShowingChanged();
mLooper.moveTimeForward(SHOW_NOTIFICATION_DELAY_MS);
mLooper.processAllMessages();
verify(mNotificationManager).notifyAsUser(eq(TAG), eq(FACE_NOTIFICATION_ID),
mNotificationArgumentCaptor.capture(), any());
mFaceStateListener.onEnrollmentsChanged(0 /* userId */, 0 /* sensorId */,
false /* hasEnrollments */);
verify(mNotificationManager).cancelAsUser(eq(TAG), eq(FACE_NOTIFICATION_ID),
eq(UserHandle.CURRENT));
}
@Test
public void testCancelReEnrollmentNotification_onFingerprintEnrollmentStateChange() {
when(mKeyguardStateController.isShowing()).thenReturn(false);
mKeyguardUpdateMonitorCallback.onBiometricHelp(
FINGERPRINT_ACQUIRED_RE_ENROLL,
"Testing Fingerprint Re-enrollment" /* errString */,
BiometricSourceType.FINGERPRINT
);
mKeyguardStateControllerCallback.onKeyguardShowingChanged();
mLooper.moveTimeForward(SHOW_NOTIFICATION_DELAY_MS);
mLooper.processAllMessages();
verify(mNotificationManager).notifyAsUser(eq(TAG), eq(FINGERPRINT_NOTIFICATION_ID),
mNotificationArgumentCaptor.capture(), any());
mFingerprintStateListener.onEnrollmentsChanged(0 /* userId */, 0 /* sensorId */,
false /* hasEnrollments */);
verify(mNotificationManager).cancelAsUser(eq(TAG), eq(FINGERPRINT_NOTIFICATION_ID),
eq(UserHandle.CURRENT));
}
}

View File

@@ -43,7 +43,6 @@ import com.android.server.biometrics.log.BiometricLogger;
import com.android.server.biometrics.log.OperationContextExt;
import com.android.server.biometrics.sensors.AuthSessionCoordinator;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.ClientMonitorCompositeCallback;
@@ -240,9 +239,6 @@ class FaceAuthenticationClient extends AuthenticationClient<AidlSession, FaceAut
vendorCode,
getTargetUserId()));
if (error == BiometricConstants.BIOMETRIC_ERROR_RE_ENROLL) {
BiometricNotificationUtils.showReEnrollmentNotification(getContext());
}
super.onError(error, vendorCode);
}