diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardBiometricLockoutLogger.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardBiometricLockoutLogger.kt index 214b284ac4b96..43cd764f0110a 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardBiometricLockoutLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardBiometricLockoutLogger.kt @@ -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 @@ -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 @@ -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 @@ -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) @@ -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 } @@ -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 } @@ -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) { pw.println(" mFingerprintLockedOut=$fingerprintLockedOut") pw.println(" mFaceLockedOut=$faceLockedOut") diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index 49a8022356191..57997d8efd6f4 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -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; @@ -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; @@ -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; @@ -86,6 +92,7 @@ public class KeyguardSecurityContainerController extends ViewController UI_EVENT_LOGGER.log(event, getSessionId())); boolean unlockAllowed = mKeyguardStateController.isOccluded() @@ -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()) { @@ -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; } } @@ -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 @@ -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(); } @@ -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. */ diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardBiometricLockoutLoggerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardBiometricLockoutLoggerTest.kt index 6bc65054d8301..aa671d1e37904 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardBiometricLockoutLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardBiometricLockoutLoggerTest.kt @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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) @@ -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) @@ -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 @@ -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) @@ -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() { diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java index 599e5474c564e..a819a7a0f8156 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java @@ -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; @@ -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; @@ -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 diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index 5ca1f21eb0217..8c7d22dde0b79 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -46,6 +46,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.NotificationMediaManager; import com.android.systemui.statusbar.NotificationShadeWindowController; @@ -107,6 +108,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { private StatusBarStateController mStatusBarStateController; @Mock private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; + @Mock + private SessionTracker mSessionTracker; private BiometricUnlockController mBiometricUnlockController; @Before @@ -129,7 +132,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mUpdateMonitor, res.getResources(), mKeyguardBypassController, mDozeParameters, mMetricsLogger, mDumpManager, mPowerManager, mNotificationMediaManager, mWakefulnessLifecycle, mScreenLifecycle, - mAuthController, mStatusBarStateController, mKeyguardUnlockAnimationController); + mAuthController, mStatusBarStateController, mKeyguardUnlockAnimationController, + mSessionTracker); mBiometricUnlockController.setKeyguardViewController(mStatusBarKeyguardViewManager); mBiometricUnlockController.setBiometricModeListener(mBiometricModeListener); }