Merge "Add ui event for auto confirmation attempt" into main
diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt
index 80d45bc..78b854e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt
@@ -22,8 +22,11 @@
 import androidx.constraintlayout.widget.ConstraintSet
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
+import com.android.internal.logging.UiEventLogger
 import com.android.internal.util.LatencyTracker
 import com.android.internal.widget.LockPatternUtils
+import com.android.internal.widget.LockscreenCredential
+import com.android.keyguard.KeyguardPinViewController.PinBouncerUiEvent
 import com.android.keyguard.KeyguardSecurityModel.SecurityMode
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.classifier.FalsingCollector
@@ -91,6 +94,7 @@
     @Mock lateinit var passwordTextView: PasswordTextView
     @Mock lateinit var deleteButton: NumPadButton
     @Mock lateinit var enterButton: View
+    @Mock lateinit var uiEventLogger: UiEventLogger
 
     @Captor lateinit var postureCallbackCaptor: ArgumentCaptor<DevicePostureController.Callback>
 
@@ -137,6 +141,7 @@
             postureController,
             featureFlags,
             mSelectedUserInteractor,
+            uiEventLogger
         )
     }
 
@@ -251,4 +256,21 @@
 
         verify(lockPatternUtils).getCurrentFailedPasswordAttempts(anyInt())
     }
+
+    @Test
+    fun onUserInput_autoConfirmation_attemptsUnlock() {
+        val pinViewController = constructPinViewController(mockKeyguardPinView)
+        whenever(featureFlags.isEnabled(Flags.AUTO_PIN_CONFIRMATION)).thenReturn(true)
+        whenever(lockPatternUtils.getPinLength(anyInt())).thenReturn(6)
+        whenever(lockPatternUtils.isAutoPinConfirmEnabled(anyInt())).thenReturn(true)
+        whenever(passwordTextView.text).thenReturn("000000")
+        whenever(enterButton.visibility).thenReturn(View.INVISIBLE)
+        whenever(mockKeyguardPinView.enteredCredential)
+            .thenReturn(LockscreenCredential.createPin("000000"))
+
+        pinViewController.onUserInput()
+
+        verify(uiEventLogger).log(PinBouncerUiEvent.ATTEMPT_UNLOCK_WITH_AUTO_CONFIRM_FEATURE)
+        verify(keyguardUpdateMonitor).setCredentialAttempted()
+    }
 }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java
index b309483..714fe64 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java
@@ -26,6 +26,7 @@
 import android.util.Log;
 import android.view.inputmethod.InputMethodManager;
 
+import com.android.internal.logging.UiEventLogger;
 import com.android.internal.util.LatencyTracker;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
@@ -210,6 +211,7 @@
         private final KeyguardViewController mKeyguardViewController;
         private final FeatureFlags mFeatureFlags;
         private final SelectedUserInteractor mSelectedUserInteractor;
+        private final UiEventLogger mUiEventLogger;
 
         @Inject
         public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor,
@@ -222,7 +224,8 @@
                 EmergencyButtonController.Factory emergencyButtonControllerFactory,
                 DevicePostureController devicePostureController,
                 KeyguardViewController keyguardViewController,
-                FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor) {
+                FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor,
+                UiEventLogger uiEventLogger) {
             mKeyguardUpdateMonitor = keyguardUpdateMonitor;
             mLockPatternUtils = lockPatternUtils;
             mLatencyTracker = latencyTracker;
@@ -238,6 +241,7 @@
             mKeyguardViewController = keyguardViewController;
             mFeatureFlags = featureFlags;
             mSelectedUserInteractor = selectedUserInteractor;
+            mUiEventLogger = uiEventLogger;
         }
 
         /** Create a new {@link KeyguardInputViewController}. */
@@ -265,7 +269,8 @@
                         mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
                         keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
                         mLiftToActivateListener, emergencyButtonController, mFalsingCollector,
-                        mDevicePostureController, mFeatureFlags, mSelectedUserInteractor);
+                        mDevicePostureController, mFeatureFlags, mSelectedUserInteractor,
+                        mUiEventLogger);
             } else if (keyguardInputView instanceof KeyguardSimPinView) {
                 return new KeyguardSimPinViewController((KeyguardSimPinView) keyguardInputView,
                         mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
index 947d90f..2aab1f1 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
@@ -20,6 +20,8 @@
 
 import android.view.View;
 
+import com.android.internal.logging.UiEvent;
+import com.android.internal.logging.UiEventLogger;
 import com.android.internal.util.LatencyTracker;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
@@ -44,6 +46,7 @@
     private View mOkButton = mView.findViewById(R.id.key_enter);
 
     private long mPinLength;
+    private final UiEventLogger mUiEventLogger;
 
     private boolean mDisabledAutoConfirmation;
 
@@ -56,7 +59,8 @@
             EmergencyButtonController emergencyButtonController,
             FalsingCollector falsingCollector,
             DevicePostureController postureController,
-            FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor) {
+            FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor,
+            UiEventLogger uiEventLogger) {
         super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback,
                 messageAreaControllerFactory, latencyTracker, liftToActivateListener,
                 emergencyButtonController, falsingCollector, featureFlags, selectedUserInteractor);
@@ -67,6 +71,7 @@
         view.setIsLockScreenLandscapeEnabled(mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE));
         mBackspaceKey = view.findViewById(R.id.delete_button);
         mPinLength = mLockPatternUtils.getPinLength(selectedUserInteractor.getSelectedUserId());
+        mUiEventLogger = uiEventLogger;
     }
 
     @Override
@@ -95,6 +100,7 @@
             updateAutoConfirmationState();
             if (mPasswordEntry.getText().length() == mPinLength
                     && mOkButton.getVisibility() == View.INVISIBLE) {
+                mUiEventLogger.log(PinBouncerUiEvent.ATTEMPT_UNLOCK_WITH_AUTO_CONFIRM_FEATURE);
                 verifyPasswordAndUnlock();
             }
         }
@@ -184,4 +190,21 @@
                 mSelectedUserInteractor.getSelectedUserId())
                 && mPinLength != LockPatternUtils.PIN_LENGTH_UNAVAILABLE;
     }
+
+    /** UI Events for the auto confirmation feature in*/
+    enum PinBouncerUiEvent implements UiEventLogger.UiEventEnum {
+        @UiEvent(doc = "Attempting to unlock the device with the auto confirm feature.")
+        ATTEMPT_UNLOCK_WITH_AUTO_CONFIRM_FEATURE(1547);
+
+        private final int mId;
+
+        PinBouncerUiEvent(int id) {
+            mId = id;
+        }
+
+        @Override
+        public int getId() {
+            return mId;
+        }
+    }
 }