Loading packages/SystemUI/src/com/android/keyguard/KeyguardBiometricLockoutLogger.kt +13 −16 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.keyguard import android.app.StatusBarManager.SESSION_KEYGUARD import android.content.Context import android.hardware.biometrics.BiometricSourceType import com.android.internal.annotations.VisibleForTesting Loading @@ -28,7 +29,7 @@ import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUT import com.android.keyguard.KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent import com.android.systemui.CoreStartable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.log.SessionTracker import java.io.FileDescriptor import java.io.PrintWriter import javax.inject.Inject Loading @@ -44,7 +45,7 @@ class KeyguardBiometricLockoutLogger @Inject constructor( context: Context?, private val uiEventLogger: UiEventLogger, private val keyguardUpdateMonitor: KeyguardUpdateMonitor, private val dumpManager: DumpManager private val sessionTracker: SessionTracker ) : CoreStartable(context) { private var fingerprintLockedOut = false private var faceLockedOut = false Loading @@ -53,7 +54,6 @@ class KeyguardBiometricLockoutLogger @Inject constructor( private var timeout = false override fun start() { dumpManager.registerDumpable(this) mKeyguardUpdateMonitorCallback.onStrongAuthStateChanged( KeyguardUpdateMonitor.getCurrentUser()) keyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback) Loading @@ -65,22 +65,17 @@ class KeyguardBiometricLockoutLogger @Inject constructor( if (biometricSourceType == BiometricSourceType.FINGERPRINT) { val lockedOut = keyguardUpdateMonitor.isFingerprintLockedOut if (lockedOut && !fingerprintLockedOut) { uiEventLogger.log( PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT) } else if (!lockedOut && fingerprintLockedOut) { uiEventLogger.log( PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT_RESET) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT_RESET) } fingerprintLockedOut = lockedOut } else if (biometricSourceType == BiometricSourceType.FACE) { val lockedOut = keyguardUpdateMonitor.isFaceLockedOut if (lockedOut && !faceLockedOut) { uiEventLogger.log( PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT) } else if (!lockedOut && faceLockedOut) { uiEventLogger.log( PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT_RESET) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT_RESET) } faceLockedOut = lockedOut } Loading @@ -95,20 +90,19 @@ class KeyguardBiometricLockoutLogger @Inject constructor( val newEncryptedOrLockdown = keyguardUpdateMonitor.isEncryptedOrLockdown(userId) if (newEncryptedOrLockdown && !encryptedOrLockdown) { uiEventLogger.log( PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_ENCRYPTED_OR_LOCKDOWN) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_ENCRYPTED_OR_LOCKDOWN) } encryptedOrLockdown = newEncryptedOrLockdown val newUnattendedUpdate = isUnattendedUpdate(strongAuthFlags) if (newUnattendedUpdate && !unattendedUpdate) { uiEventLogger.log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE) } unattendedUpdate = newUnattendedUpdate val newTimeout = isStrongAuthTimeout(strongAuthFlags) if (newTimeout && !timeout) { uiEventLogger.log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_TIMEOUT) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_TIMEOUT) } timeout = newTimeout } Loading @@ -123,6 +117,9 @@ class KeyguardBiometricLockoutLogger @Inject constructor( ) = containsFlag(flags, STRONG_AUTH_REQUIRED_AFTER_TIMEOUT) || containsFlag(flags, STRONG_AUTH_REQUIRED_AFTER_NON_STRONG_BIOMETRICS_TIMEOUT) private fun log(event: PrimaryAuthRequiredEvent) = uiEventLogger.log(event, sessionTracker.getSessionId(SESSION_KEYGUARD)) override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<String>) { pw.println(" mFingerprintLockedOut=$fingerprintLockedOut") pw.println(" mFaceLockedOut=$faceLockedOut") Loading packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +21 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.keyguard; import static android.app.StatusBarManager.SESSION_KEYGUARD; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_BIOMETRIC; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_EXTENDED_ACCESS; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_NONE_SECURITY; Loading @@ -36,7 +38,10 @@ import android.util.Log; import android.util.Slog; import android.view.MotionEvent; import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.InstanceId; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.nano.MetricsProto; Loading @@ -53,6 +58,7 @@ import com.android.systemui.R; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.statusbar.policy.ConfigurationController; Loading Loading @@ -86,6 +92,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private final UserSwitcherController mUserSwitcherController; private final GlobalSettings mGlobalSettings; private final FeatureFlags mFeatureFlags; private final SessionTracker mSessionTracker; private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED; Loading Loading @@ -191,7 +198,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mMetricsLogger.write(new LogMaker(MetricsEvent.BOUNCER) .setType(success ? MetricsEvent.TYPE_SUCCESS : MetricsEvent.TYPE_FAILURE)); mUiEventLogger.log(success ? BouncerUiEvent.BOUNCER_PASSWORD_SUCCESS : BouncerUiEvent.BOUNCER_PASSWORD_FAILURE); : BouncerUiEvent.BOUNCER_PASSWORD_FAILURE, getSessionId()); } public void reset() { Loading Loading @@ -242,7 +249,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard FalsingManager falsingManager, UserSwitcherController userSwitcherController, FeatureFlags featureFlags, GlobalSettings globalSettings) { GlobalSettings globalSettings, SessionTracker sessionTracker) { super(view); mLockPatternUtils = lockPatternUtils; mUpdateMonitor = keyguardUpdateMonitor; Loading @@ -261,6 +269,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mUserSwitcherController = userSwitcherController; mFeatureFlags = featureFlags; mGlobalSettings = globalSettings; mSessionTracker = sessionTracker; } @Override Loading Loading @@ -456,7 +465,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard .setType(MetricsProto.MetricsEvent.TYPE_DISMISS).setSubtype(eventSubtype)); } if (uiEvent != BouncerUiEvent.UNKNOWN) { mUiEventLogger.log(uiEvent); mUiEventLogger.log(uiEvent, getSessionId()); } if (finish) { mSecurityCallback.finish(strongAuth, targetUserId); Loading Loading @@ -599,6 +608,10 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard } } private @Nullable InstanceId getSessionId() { return mSessionTracker.getSessionId(SESSION_KEYGUARD); } /** Update keyguard position based on a tapped X coordinate. */ public void updateKeyguardPosition(float x) { mView.updatePositionByTouchX(x); Loading @@ -622,6 +635,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private final GlobalSettings mGlobalSettings; private final FeatureFlags mFeatureFlags; private final UserSwitcherController mUserSwitcherController; private final SessionTracker mSessionTracker; @Inject Factory(KeyguardSecurityContainer view, Loading @@ -639,7 +653,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard FalsingManager falsingManager, UserSwitcherController userSwitcherController, FeatureFlags featureFlags, GlobalSettings globalSettings) { GlobalSettings globalSettings, SessionTracker sessionTracker) { mView = view; mAdminSecondaryLockScreenControllerFactory = adminSecondaryLockScreenControllerFactory; mLockPatternUtils = lockPatternUtils; Loading @@ -655,6 +670,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mFeatureFlags = featureFlags; mGlobalSettings = globalSettings; mUserSwitcherController = userSwitcherController; mSessionTracker = sessionTracker; } public KeyguardSecurityContainerController create( Loading @@ -664,7 +680,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mKeyguardUpdateMonitor, mKeyguardSecurityModel, mMetricsLogger, mUiEventLogger, mKeyguardStateController, securityCallback, mSecurityViewFlipperController, mConfigurationController, mFalsingCollector, mFalsingManager, mUserSwitcherController, mFeatureFlags, mGlobalSettings); mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker); } } } packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +18 −6 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; import static android.app.StatusBarManager.SESSION_KEYGUARD; import android.annotation.IntDef; import android.content.Context; import android.content.res.Resources; Loading @@ -28,7 +30,10 @@ import android.os.SystemClock; import android.os.Trace; import android.util.Log; import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.InstanceId; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; Loading @@ -48,6 +53,7 @@ import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationMediaManager; Loading Loading @@ -156,6 +162,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp private final DozeParameters mDozeParameters; private final KeyguardStateController mKeyguardStateController; private final NotificationShadeWindowController mNotificationShadeWindowController; private final SessionTracker mSessionTracker; private final Context mContext; private final int mWakeUpDelay; private int mMode; Loading Loading @@ -273,7 +280,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp ScreenLifecycle screenLifecycle, AuthController authController, StatusBarStateController statusBarStateController, KeyguardUnlockAnimationController keyguardUnlockAnimationController) { KeyguardUnlockAnimationController keyguardUnlockAnimationController, SessionTracker sessionTracker) { mContext = context; mPowerManager = powerManager; mShadeController = shadeController; Loading @@ -297,6 +305,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp mAuthController = authController; mStatusBarStateController = statusBarStateController; mKeyguardUnlockAnimationController = keyguardUnlockAnimationController; mSessionTracker = sessionTracker; dumpManager.registerDumpable(getClass().getName(), this); } Loading Loading @@ -376,7 +385,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp mMetricsLogger.write(new LogMaker(MetricsEvent.BIOMETRIC_AUTH) .setType(MetricsEvent.TYPE_SUCCESS).setSubtype(toSubtype(biometricSourceType))); Optional.ofNullable(BiometricUiEvent.SUCCESS_EVENT_BY_SOURCE_TYPE.get(biometricSourceType)) .ifPresent(UI_EVENT_LOGGER::log); .ifPresent(event -> UI_EVENT_LOGGER.log(event, getSessionId())); boolean unlockAllowed = mKeyguardStateController.isOccluded() Loading Loading @@ -641,7 +650,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp mMetricsLogger.write(new LogMaker(MetricsEvent.BIOMETRIC_AUTH) .setType(MetricsEvent.TYPE_FAILURE).setSubtype(toSubtype(biometricSourceType))); Optional.ofNullable(BiometricUiEvent.FAILURE_EVENT_BY_SOURCE_TYPE.get(biometricSourceType)) .ifPresent(UI_EVENT_LOGGER::log); .ifPresent(event -> UI_EVENT_LOGGER.log(event, getSessionId())); if (biometricSourceType == BiometricSourceType.FINGERPRINT && mUpdateMonitor.isUdfpsSupported()) { Loading @@ -656,7 +665,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp if (mNumConsecutiveFpFailures >= FP_ATTEMPTS_BEFORE_SHOW_BOUNCER) { startWakeAndUnlock(MODE_SHOW_BOUNCER); UI_EVENT_LOGGER.log(BiometricUiEvent.BIOMETRIC_BOUNCER_SHOWN); UI_EVENT_LOGGER.log(BiometricUiEvent.BIOMETRIC_BOUNCER_SHOWN, getSessionId()); mNumConsecutiveFpFailures = 0; } } Loading @@ -670,7 +679,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp .setType(MetricsEvent.TYPE_ERROR).setSubtype(toSubtype(biometricSourceType)) .addTaggedData(MetricsEvent.FIELD_BIOMETRIC_AUTH_ERROR, msgId)); Optional.ofNullable(BiometricUiEvent.ERROR_EVENT_BY_SOURCE_TYPE.get(biometricSourceType)) .ifPresent(UI_EVENT_LOGGER::log); .ifPresent(event -> UI_EVENT_LOGGER.log(event, getSessionId())); // if we're on the shade and we're locked out, immediately show the bouncer if (biometricSourceType == BiometricSourceType.FINGERPRINT Loading @@ -680,7 +689,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp && (mStatusBarStateController.getState() == StatusBarState.SHADE || mStatusBarStateController.getState() == StatusBarState.SHADE_LOCKED)) { startWakeAndUnlock(MODE_SHOW_BOUNCER); UI_EVENT_LOGGER.log(BiometricUiEvent.BIOMETRIC_BOUNCER_SHOWN); UI_EVENT_LOGGER.log(BiometricUiEvent.BIOMETRIC_BOUNCER_SHOWN, getSessionId()); } cleanup(); } Loading Loading @@ -786,6 +795,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp return mBiometricType; } private @Nullable InstanceId getSessionId() { return mSessionTracker.getSessionId(SESSION_KEYGUARD); } /** * Translates biometric source type for logging purpose. */ Loading packages/SystemUI/tests/src/com/android/keyguard/KeyguardBiometricLockoutLoggerTest.kt +17 −13 Original line number Diff line number Diff line Loading @@ -20,11 +20,12 @@ import android.hardware.biometrics.BiometricSourceType import org.mockito.Mockito.verify import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.internal.logging.InstanceId import com.android.internal.logging.UiEventLogger import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_TIMEOUT import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_FOR_UNATTENDED_UPDATE import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.log.SessionTracker import org.junit.Before import org.junit.Test import org.junit.runner.RunWith Loading @@ -44,9 +45,11 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { @Mock lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor @Mock lateinit var dumpManager: DumpManager @Mock lateinit var strongAuthTracker: KeyguardUpdateMonitor.StrongAuthTracker @Mock lateinit var sessionTracker: SessionTracker @Mock lateinit var sessionId: InstanceId @Captor lateinit var updateMonitorCallbackCaptor: ArgumentCaptor<KeyguardUpdateMonitorCallback> Loading @@ -58,11 +61,12 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) whenever(keyguardUpdateMonitor.strongAuthTracker).thenReturn(strongAuthTracker) whenever(sessionTracker.getSessionId(anyInt())).thenReturn(sessionId) keyguardBiometricLockoutLogger = KeyguardBiometricLockoutLogger( mContext, uiEventLogger, keyguardUpdateMonitor, dumpManager) sessionTracker) } @Test Loading @@ -76,7 +80,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN encrypted / lockdown state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_ENCRYPTED_OR_LOCKDOWN) .PRIMARY_AUTH_REQUIRED_ENCRYPTED_OR_LOCKDOWN, sessionId) } @Test Loading @@ -93,7 +97,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_TIMEOUT) .PRIMARY_AUTH_REQUIRED_TIMEOUT, sessionId) } @Test Loading @@ -110,7 +114,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE) .PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE, sessionId) } @Test Loading @@ -128,9 +132,9 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged with all the reasons verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_TIMEOUT) .PRIMARY_AUTH_REQUIRED_TIMEOUT, sessionId) verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE) .PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE, sessionId) // WHEN onStrongAuthStateChanged is called again updateMonitorCallback.onStrongAuthStateChanged(0) Loading @@ -152,7 +156,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT) .PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT, sessionId) // WHEN face lockout is reset whenever(keyguardUpdateMonitor.isFaceLockedOut).thenReturn(false) Loading @@ -160,7 +164,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT_RESET) .PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT_RESET, sessionId) } @Test Loading @@ -176,7 +180,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT) .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT, sessionId) // WHEN fingerprint lockout is reset whenever(keyguardUpdateMonitor.isFingerprintLockedOut).thenReturn(false) Loading @@ -184,7 +188,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT_RESET) .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT_RESET, sessionId) } fun captureUpdateMonitorCallback() { Loading packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java +5 −1 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; Loading Loading @@ -120,6 +121,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { private FeatureFlags mFeatureFlags; @Mock private UserSwitcherController mUserSwitcherController; @Mock private SessionTracker mSessionTracker; private Configuration mConfiguration; private KeyguardSecurityContainerController mKeyguardSecurityContainerController; Loading Loading @@ -154,7 +157,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { mKeyguardUpdateMonitor, mKeyguardSecurityModel, mMetricsLogger, mUiEventLogger, mKeyguardStateController, mKeyguardSecurityViewFlipperController, mConfigurationController, mFalsingCollector, mFalsingManager, mUserSwitcherController, mFeatureFlags, mGlobalSettings).create(mSecurityCallback); mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker).create(mSecurityCallback); } @Test Loading Loading
packages/SystemUI/src/com/android/keyguard/KeyguardBiometricLockoutLogger.kt +13 −16 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.keyguard import android.app.StatusBarManager.SESSION_KEYGUARD import android.content.Context import android.hardware.biometrics.BiometricSourceType import com.android.internal.annotations.VisibleForTesting Loading @@ -28,7 +29,7 @@ import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUT import com.android.keyguard.KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent import com.android.systemui.CoreStartable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.log.SessionTracker import java.io.FileDescriptor import java.io.PrintWriter import javax.inject.Inject Loading @@ -44,7 +45,7 @@ class KeyguardBiometricLockoutLogger @Inject constructor( context: Context?, private val uiEventLogger: UiEventLogger, private val keyguardUpdateMonitor: KeyguardUpdateMonitor, private val dumpManager: DumpManager private val sessionTracker: SessionTracker ) : CoreStartable(context) { private var fingerprintLockedOut = false private var faceLockedOut = false Loading @@ -53,7 +54,6 @@ class KeyguardBiometricLockoutLogger @Inject constructor( private var timeout = false override fun start() { dumpManager.registerDumpable(this) mKeyguardUpdateMonitorCallback.onStrongAuthStateChanged( KeyguardUpdateMonitor.getCurrentUser()) keyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback) Loading @@ -65,22 +65,17 @@ class KeyguardBiometricLockoutLogger @Inject constructor( if (biometricSourceType == BiometricSourceType.FINGERPRINT) { val lockedOut = keyguardUpdateMonitor.isFingerprintLockedOut if (lockedOut && !fingerprintLockedOut) { uiEventLogger.log( PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT) } else if (!lockedOut && fingerprintLockedOut) { uiEventLogger.log( PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT_RESET) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT_RESET) } fingerprintLockedOut = lockedOut } else if (biometricSourceType == BiometricSourceType.FACE) { val lockedOut = keyguardUpdateMonitor.isFaceLockedOut if (lockedOut && !faceLockedOut) { uiEventLogger.log( PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT) } else if (!lockedOut && faceLockedOut) { uiEventLogger.log( PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT_RESET) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT_RESET) } faceLockedOut = lockedOut } Loading @@ -95,20 +90,19 @@ class KeyguardBiometricLockoutLogger @Inject constructor( val newEncryptedOrLockdown = keyguardUpdateMonitor.isEncryptedOrLockdown(userId) if (newEncryptedOrLockdown && !encryptedOrLockdown) { uiEventLogger.log( PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_ENCRYPTED_OR_LOCKDOWN) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_ENCRYPTED_OR_LOCKDOWN) } encryptedOrLockdown = newEncryptedOrLockdown val newUnattendedUpdate = isUnattendedUpdate(strongAuthFlags) if (newUnattendedUpdate && !unattendedUpdate) { uiEventLogger.log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE) } unattendedUpdate = newUnattendedUpdate val newTimeout = isStrongAuthTimeout(strongAuthFlags) if (newTimeout && !timeout) { uiEventLogger.log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_TIMEOUT) log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_TIMEOUT) } timeout = newTimeout } Loading @@ -123,6 +117,9 @@ class KeyguardBiometricLockoutLogger @Inject constructor( ) = containsFlag(flags, STRONG_AUTH_REQUIRED_AFTER_TIMEOUT) || containsFlag(flags, STRONG_AUTH_REQUIRED_AFTER_NON_STRONG_BIOMETRICS_TIMEOUT) private fun log(event: PrimaryAuthRequiredEvent) = uiEventLogger.log(event, sessionTracker.getSessionId(SESSION_KEYGUARD)) override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<String>) { pw.println(" mFingerprintLockedOut=$fingerprintLockedOut") pw.println(" mFaceLockedOut=$faceLockedOut") Loading
packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +21 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.keyguard; import static android.app.StatusBarManager.SESSION_KEYGUARD; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_BIOMETRIC; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_EXTENDED_ACCESS; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_NONE_SECURITY; Loading @@ -36,7 +38,10 @@ import android.util.Log; import android.util.Slog; import android.view.MotionEvent; import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.InstanceId; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.nano.MetricsProto; Loading @@ -53,6 +58,7 @@ import com.android.systemui.R; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.statusbar.policy.ConfigurationController; Loading Loading @@ -86,6 +92,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private final UserSwitcherController mUserSwitcherController; private final GlobalSettings mGlobalSettings; private final FeatureFlags mFeatureFlags; private final SessionTracker mSessionTracker; private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED; Loading Loading @@ -191,7 +198,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mMetricsLogger.write(new LogMaker(MetricsEvent.BOUNCER) .setType(success ? MetricsEvent.TYPE_SUCCESS : MetricsEvent.TYPE_FAILURE)); mUiEventLogger.log(success ? BouncerUiEvent.BOUNCER_PASSWORD_SUCCESS : BouncerUiEvent.BOUNCER_PASSWORD_FAILURE); : BouncerUiEvent.BOUNCER_PASSWORD_FAILURE, getSessionId()); } public void reset() { Loading Loading @@ -242,7 +249,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard FalsingManager falsingManager, UserSwitcherController userSwitcherController, FeatureFlags featureFlags, GlobalSettings globalSettings) { GlobalSettings globalSettings, SessionTracker sessionTracker) { super(view); mLockPatternUtils = lockPatternUtils; mUpdateMonitor = keyguardUpdateMonitor; Loading @@ -261,6 +269,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mUserSwitcherController = userSwitcherController; mFeatureFlags = featureFlags; mGlobalSettings = globalSettings; mSessionTracker = sessionTracker; } @Override Loading Loading @@ -456,7 +465,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard .setType(MetricsProto.MetricsEvent.TYPE_DISMISS).setSubtype(eventSubtype)); } if (uiEvent != BouncerUiEvent.UNKNOWN) { mUiEventLogger.log(uiEvent); mUiEventLogger.log(uiEvent, getSessionId()); } if (finish) { mSecurityCallback.finish(strongAuth, targetUserId); Loading Loading @@ -599,6 +608,10 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard } } private @Nullable InstanceId getSessionId() { return mSessionTracker.getSessionId(SESSION_KEYGUARD); } /** Update keyguard position based on a tapped X coordinate. */ public void updateKeyguardPosition(float x) { mView.updatePositionByTouchX(x); Loading @@ -622,6 +635,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private final GlobalSettings mGlobalSettings; private final FeatureFlags mFeatureFlags; private final UserSwitcherController mUserSwitcherController; private final SessionTracker mSessionTracker; @Inject Factory(KeyguardSecurityContainer view, Loading @@ -639,7 +653,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard FalsingManager falsingManager, UserSwitcherController userSwitcherController, FeatureFlags featureFlags, GlobalSettings globalSettings) { GlobalSettings globalSettings, SessionTracker sessionTracker) { mView = view; mAdminSecondaryLockScreenControllerFactory = adminSecondaryLockScreenControllerFactory; mLockPatternUtils = lockPatternUtils; Loading @@ -655,6 +670,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mFeatureFlags = featureFlags; mGlobalSettings = globalSettings; mUserSwitcherController = userSwitcherController; mSessionTracker = sessionTracker; } public KeyguardSecurityContainerController create( Loading @@ -664,7 +680,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mKeyguardUpdateMonitor, mKeyguardSecurityModel, mMetricsLogger, mUiEventLogger, mKeyguardStateController, securityCallback, mSecurityViewFlipperController, mConfigurationController, mFalsingCollector, mFalsingManager, mUserSwitcherController, mFeatureFlags, mGlobalSettings); mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker); } } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +18 −6 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; import static android.app.StatusBarManager.SESSION_KEYGUARD; import android.annotation.IntDef; import android.content.Context; import android.content.res.Resources; Loading @@ -28,7 +30,10 @@ import android.os.SystemClock; import android.os.Trace; import android.util.Log; import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.InstanceId; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; Loading @@ -48,6 +53,7 @@ import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationMediaManager; Loading Loading @@ -156,6 +162,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp private final DozeParameters mDozeParameters; private final KeyguardStateController mKeyguardStateController; private final NotificationShadeWindowController mNotificationShadeWindowController; private final SessionTracker mSessionTracker; private final Context mContext; private final int mWakeUpDelay; private int mMode; Loading Loading @@ -273,7 +280,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp ScreenLifecycle screenLifecycle, AuthController authController, StatusBarStateController statusBarStateController, KeyguardUnlockAnimationController keyguardUnlockAnimationController) { KeyguardUnlockAnimationController keyguardUnlockAnimationController, SessionTracker sessionTracker) { mContext = context; mPowerManager = powerManager; mShadeController = shadeController; Loading @@ -297,6 +305,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp mAuthController = authController; mStatusBarStateController = statusBarStateController; mKeyguardUnlockAnimationController = keyguardUnlockAnimationController; mSessionTracker = sessionTracker; dumpManager.registerDumpable(getClass().getName(), this); } Loading Loading @@ -376,7 +385,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp mMetricsLogger.write(new LogMaker(MetricsEvent.BIOMETRIC_AUTH) .setType(MetricsEvent.TYPE_SUCCESS).setSubtype(toSubtype(biometricSourceType))); Optional.ofNullable(BiometricUiEvent.SUCCESS_EVENT_BY_SOURCE_TYPE.get(biometricSourceType)) .ifPresent(UI_EVENT_LOGGER::log); .ifPresent(event -> UI_EVENT_LOGGER.log(event, getSessionId())); boolean unlockAllowed = mKeyguardStateController.isOccluded() Loading Loading @@ -641,7 +650,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp mMetricsLogger.write(new LogMaker(MetricsEvent.BIOMETRIC_AUTH) .setType(MetricsEvent.TYPE_FAILURE).setSubtype(toSubtype(biometricSourceType))); Optional.ofNullable(BiometricUiEvent.FAILURE_EVENT_BY_SOURCE_TYPE.get(biometricSourceType)) .ifPresent(UI_EVENT_LOGGER::log); .ifPresent(event -> UI_EVENT_LOGGER.log(event, getSessionId())); if (biometricSourceType == BiometricSourceType.FINGERPRINT && mUpdateMonitor.isUdfpsSupported()) { Loading @@ -656,7 +665,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp if (mNumConsecutiveFpFailures >= FP_ATTEMPTS_BEFORE_SHOW_BOUNCER) { startWakeAndUnlock(MODE_SHOW_BOUNCER); UI_EVENT_LOGGER.log(BiometricUiEvent.BIOMETRIC_BOUNCER_SHOWN); UI_EVENT_LOGGER.log(BiometricUiEvent.BIOMETRIC_BOUNCER_SHOWN, getSessionId()); mNumConsecutiveFpFailures = 0; } } Loading @@ -670,7 +679,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp .setType(MetricsEvent.TYPE_ERROR).setSubtype(toSubtype(biometricSourceType)) .addTaggedData(MetricsEvent.FIELD_BIOMETRIC_AUTH_ERROR, msgId)); Optional.ofNullable(BiometricUiEvent.ERROR_EVENT_BY_SOURCE_TYPE.get(biometricSourceType)) .ifPresent(UI_EVENT_LOGGER::log); .ifPresent(event -> UI_EVENT_LOGGER.log(event, getSessionId())); // if we're on the shade and we're locked out, immediately show the bouncer if (biometricSourceType == BiometricSourceType.FINGERPRINT Loading @@ -680,7 +689,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp && (mStatusBarStateController.getState() == StatusBarState.SHADE || mStatusBarStateController.getState() == StatusBarState.SHADE_LOCKED)) { startWakeAndUnlock(MODE_SHOW_BOUNCER); UI_EVENT_LOGGER.log(BiometricUiEvent.BIOMETRIC_BOUNCER_SHOWN); UI_EVENT_LOGGER.log(BiometricUiEvent.BIOMETRIC_BOUNCER_SHOWN, getSessionId()); } cleanup(); } Loading Loading @@ -786,6 +795,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp return mBiometricType; } private @Nullable InstanceId getSessionId() { return mSessionTracker.getSessionId(SESSION_KEYGUARD); } /** * Translates biometric source type for logging purpose. */ Loading
packages/SystemUI/tests/src/com/android/keyguard/KeyguardBiometricLockoutLoggerTest.kt +17 −13 Original line number Diff line number Diff line Loading @@ -20,11 +20,12 @@ import android.hardware.biometrics.BiometricSourceType import org.mockito.Mockito.verify import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.internal.logging.InstanceId import com.android.internal.logging.UiEventLogger import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_TIMEOUT import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_FOR_UNATTENDED_UPDATE import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.log.SessionTracker import org.junit.Before import org.junit.Test import org.junit.runner.RunWith Loading @@ -44,9 +45,11 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { @Mock lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor @Mock lateinit var dumpManager: DumpManager @Mock lateinit var strongAuthTracker: KeyguardUpdateMonitor.StrongAuthTracker @Mock lateinit var sessionTracker: SessionTracker @Mock lateinit var sessionId: InstanceId @Captor lateinit var updateMonitorCallbackCaptor: ArgumentCaptor<KeyguardUpdateMonitorCallback> Loading @@ -58,11 +61,12 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) whenever(keyguardUpdateMonitor.strongAuthTracker).thenReturn(strongAuthTracker) whenever(sessionTracker.getSessionId(anyInt())).thenReturn(sessionId) keyguardBiometricLockoutLogger = KeyguardBiometricLockoutLogger( mContext, uiEventLogger, keyguardUpdateMonitor, dumpManager) sessionTracker) } @Test Loading @@ -76,7 +80,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN encrypted / lockdown state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_ENCRYPTED_OR_LOCKDOWN) .PRIMARY_AUTH_REQUIRED_ENCRYPTED_OR_LOCKDOWN, sessionId) } @Test Loading @@ -93,7 +97,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_TIMEOUT) .PRIMARY_AUTH_REQUIRED_TIMEOUT, sessionId) } @Test Loading @@ -110,7 +114,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE) .PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE, sessionId) } @Test Loading @@ -128,9 +132,9 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged with all the reasons verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_TIMEOUT) .PRIMARY_AUTH_REQUIRED_TIMEOUT, sessionId) verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE) .PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE, sessionId) // WHEN onStrongAuthStateChanged is called again updateMonitorCallback.onStrongAuthStateChanged(0) Loading @@ -152,7 +156,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT) .PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT, sessionId) // WHEN face lockout is reset whenever(keyguardUpdateMonitor.isFaceLockedOut).thenReturn(false) Loading @@ -160,7 +164,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT_RESET) .PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT_RESET, sessionId) } @Test Loading @@ -176,7 +180,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT) .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT, sessionId) // WHEN fingerprint lockout is reset whenever(keyguardUpdateMonitor.isFingerprintLockedOut).thenReturn(false) Loading @@ -184,7 +188,7 @@ class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() { // THEN primary auth required state is logged verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT_RESET) .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT_RESET, sessionId) } fun captureUpdateMonitorCallback() { Loading
packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java +5 −1 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; Loading Loading @@ -120,6 +121,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { private FeatureFlags mFeatureFlags; @Mock private UserSwitcherController mUserSwitcherController; @Mock private SessionTracker mSessionTracker; private Configuration mConfiguration; private KeyguardSecurityContainerController mKeyguardSecurityContainerController; Loading Loading @@ -154,7 +157,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { mKeyguardUpdateMonitor, mKeyguardSecurityModel, mMetricsLogger, mUiEventLogger, mKeyguardStateController, mKeyguardSecurityViewFlipperController, mConfigurationController, mFalsingCollector, mFalsingManager, mUserSwitcherController, mFeatureFlags, mGlobalSettings).create(mSecurityCallback); mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker).create(mSecurityCallback); } @Test Loading