Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6941ec9e authored by Aaron Liu's avatar Aaron Liu
Browse files

Add ui event for auto confirmation attempt

We want to keep track of how many unique users are using the auto
confirmation feature. We will add this event tracking here so that we
can perform this measurement.

See go/bouncer-auto-confirmation-event

Test: check aster dashboard
Bug: 313941957
Flag: NONE
Change-Id: I0fa14b4fd1ef6812034d023766e966c566229e91
parent 91edb435
Loading
Loading
Loading
Loading
+22 −0
Original line number Original line Diff line number Diff line
@@ -22,8 +22,11 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.constraintlayout.widget.ConstraintSet
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.internal.logging.UiEventLogger
import com.android.internal.util.LatencyTracker
import com.android.internal.util.LatencyTracker
import com.android.internal.widget.LockPatternUtils
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.keyguard.KeyguardSecurityModel.SecurityMode
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.classifier.FalsingCollector
@@ -91,6 +94,7 @@ class KeyguardPinViewControllerTest : SysuiTestCase() {
    @Mock lateinit var passwordTextView: PasswordTextView
    @Mock lateinit var passwordTextView: PasswordTextView
    @Mock lateinit var deleteButton: NumPadButton
    @Mock lateinit var deleteButton: NumPadButton
    @Mock lateinit var enterButton: View
    @Mock lateinit var enterButton: View
    @Mock lateinit var uiEventLogger: UiEventLogger


    @Captor lateinit var postureCallbackCaptor: ArgumentCaptor<DevicePostureController.Callback>
    @Captor lateinit var postureCallbackCaptor: ArgumentCaptor<DevicePostureController.Callback>


@@ -137,6 +141,7 @@ class KeyguardPinViewControllerTest : SysuiTestCase() {
            postureController,
            postureController,
            featureFlags,
            featureFlags,
            mSelectedUserInteractor,
            mSelectedUserInteractor,
            uiEventLogger
        )
        )
    }
    }


@@ -251,4 +256,21 @@ class KeyguardPinViewControllerTest : SysuiTestCase() {


        verify(lockPatternUtils).getCurrentFailedPasswordAttempts(anyInt())
        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()
    }
}
}
+7 −2
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@ import android.text.TextUtils;
import android.util.Log;
import android.util.Log;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodManager;


import com.android.internal.logging.UiEventLogger;
import com.android.internal.util.LatencyTracker;
import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
@@ -210,6 +211,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
        private final KeyguardViewController mKeyguardViewController;
        private final KeyguardViewController mKeyguardViewController;
        private final FeatureFlags mFeatureFlags;
        private final FeatureFlags mFeatureFlags;
        private final SelectedUserInteractor mSelectedUserInteractor;
        private final SelectedUserInteractor mSelectedUserInteractor;
        private final UiEventLogger mUiEventLogger;


        @Inject
        @Inject
        public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor,
        public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor,
@@ -222,7 +224,8 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
                EmergencyButtonController.Factory emergencyButtonControllerFactory,
                EmergencyButtonController.Factory emergencyButtonControllerFactory,
                DevicePostureController devicePostureController,
                DevicePostureController devicePostureController,
                KeyguardViewController keyguardViewController,
                KeyguardViewController keyguardViewController,
                FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor) {
                FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor,
                UiEventLogger uiEventLogger) {
            mKeyguardUpdateMonitor = keyguardUpdateMonitor;
            mKeyguardUpdateMonitor = keyguardUpdateMonitor;
            mLockPatternUtils = lockPatternUtils;
            mLockPatternUtils = lockPatternUtils;
            mLatencyTracker = latencyTracker;
            mLatencyTracker = latencyTracker;
@@ -238,6 +241,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
            mKeyguardViewController = keyguardViewController;
            mKeyguardViewController = keyguardViewController;
            mFeatureFlags = featureFlags;
            mFeatureFlags = featureFlags;
            mSelectedUserInteractor = selectedUserInteractor;
            mSelectedUserInteractor = selectedUserInteractor;
            mUiEventLogger = uiEventLogger;
        }
        }


        /** Create a new {@link KeyguardInputViewController}. */
        /** Create a new {@link KeyguardInputViewController}. */
@@ -265,7 +269,8 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
                        mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
                        mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
                        keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
                        keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
                        mLiftToActivateListener, emergencyButtonController, mFalsingCollector,
                        mLiftToActivateListener, emergencyButtonController, mFalsingCollector,
                        mDevicePostureController, mFeatureFlags, mSelectedUserInteractor);
                        mDevicePostureController, mFeatureFlags, mSelectedUserInteractor,
                        mUiEventLogger);
            } else if (keyguardInputView instanceof KeyguardSimPinView) {
            } else if (keyguardInputView instanceof KeyguardSimPinView) {
                return new KeyguardSimPinViewController((KeyguardSimPinView) keyguardInputView,
                return new KeyguardSimPinViewController((KeyguardSimPinView) keyguardInputView,
                        mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
                        mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
+24 −1
Original line number Original line Diff line number Diff line
@@ -20,6 +20,8 @@ import static com.android.systemui.flags.Flags.LOCKSCREEN_ENABLE_LANDSCAPE;


import android.view.View;
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.util.LatencyTracker;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
@@ -44,6 +46,7 @@ public class KeyguardPinViewController
    private View mOkButton = mView.findViewById(R.id.key_enter);
    private View mOkButton = mView.findViewById(R.id.key_enter);


    private long mPinLength;
    private long mPinLength;
    private final UiEventLogger mUiEventLogger;


    private boolean mDisabledAutoConfirmation;
    private boolean mDisabledAutoConfirmation;


@@ -56,7 +59,8 @@ public class KeyguardPinViewController
            EmergencyButtonController emergencyButtonController,
            EmergencyButtonController emergencyButtonController,
            FalsingCollector falsingCollector,
            FalsingCollector falsingCollector,
            DevicePostureController postureController,
            DevicePostureController postureController,
            FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor) {
            FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor,
            UiEventLogger uiEventLogger) {
        super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback,
        super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback,
                messageAreaControllerFactory, latencyTracker, liftToActivateListener,
                messageAreaControllerFactory, latencyTracker, liftToActivateListener,
                emergencyButtonController, falsingCollector, featureFlags, selectedUserInteractor);
                emergencyButtonController, falsingCollector, featureFlags, selectedUserInteractor);
@@ -67,6 +71,7 @@ public class KeyguardPinViewController
        view.setIsLockScreenLandscapeEnabled(mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE));
        view.setIsLockScreenLandscapeEnabled(mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE));
        mBackspaceKey = view.findViewById(R.id.delete_button);
        mBackspaceKey = view.findViewById(R.id.delete_button);
        mPinLength = mLockPatternUtils.getPinLength(selectedUserInteractor.getSelectedUserId());
        mPinLength = mLockPatternUtils.getPinLength(selectedUserInteractor.getSelectedUserId());
        mUiEventLogger = uiEventLogger;
    }
    }


    @Override
    @Override
@@ -95,6 +100,7 @@ public class KeyguardPinViewController
            updateAutoConfirmationState();
            updateAutoConfirmationState();
            if (mPasswordEntry.getText().length() == mPinLength
            if (mPasswordEntry.getText().length() == mPinLength
                    && mOkButton.getVisibility() == View.INVISIBLE) {
                    && mOkButton.getVisibility() == View.INVISIBLE) {
                mUiEventLogger.log(PinBouncerUiEvent.ATTEMPT_UNLOCK_WITH_AUTO_CONFIRM_FEATURE);
                verifyPasswordAndUnlock();
                verifyPasswordAndUnlock();
            }
            }
        }
        }
@@ -184,4 +190,21 @@ public class KeyguardPinViewController
                mSelectedUserInteractor.getSelectedUserId())
                mSelectedUserInteractor.getSelectedUserId())
                && mPinLength != LockPatternUtils.PIN_LENGTH_UNAVAILABLE;
                && 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;
        }
    }
}
}