Loading packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt +22 −0 Original line number Diff line number Diff line Loading @@ -22,8 +22,11 @@ import androidx.constraintlayout.widget.ConstraintLayout 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 Loading Loading @@ -91,6 +94,7 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { @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> Loading Loading @@ -137,6 +141,7 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { postureController, featureFlags, mSelectedUserInteractor, uiEventLogger ) } Loading Loading @@ -251,4 +256,21 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { 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() } } packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java +7 −2 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.text.TextUtils; 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; Loading Loading @@ -210,6 +211,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> private final KeyguardViewController mKeyguardViewController; private final FeatureFlags mFeatureFlags; private final SelectedUserInteractor mSelectedUserInteractor; private final UiEventLogger mUiEventLogger; @Inject public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor, Loading @@ -222,7 +224,8 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> EmergencyButtonController.Factory emergencyButtonControllerFactory, DevicePostureController devicePostureController, KeyguardViewController keyguardViewController, FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor) { FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor, UiEventLogger uiEventLogger) { mKeyguardUpdateMonitor = keyguardUpdateMonitor; mLockPatternUtils = lockPatternUtils; mLatencyTracker = latencyTracker; Loading @@ -238,6 +241,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> mKeyguardViewController = keyguardViewController; mFeatureFlags = featureFlags; mSelectedUserInteractor = selectedUserInteractor; mUiEventLogger = uiEventLogger; } /** Create a new {@link KeyguardInputViewController}. */ Loading Loading @@ -265,7 +269,8 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> 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, Loading packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java +24 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ import static com.android.systemui.flags.Flags.LOCKSCREEN_ENABLE_LANDSCAPE; 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; Loading @@ -44,6 +46,7 @@ public class KeyguardPinViewController private View mOkButton = mView.findViewById(R.id.key_enter); private long mPinLength; private final UiEventLogger mUiEventLogger; private boolean mDisabledAutoConfirmation; Loading @@ -56,7 +59,8 @@ public class KeyguardPinViewController 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); Loading @@ -67,6 +71,7 @@ public class KeyguardPinViewController view.setIsLockScreenLandscapeEnabled(mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE)); mBackspaceKey = view.findViewById(R.id.delete_button); mPinLength = mLockPatternUtils.getPinLength(selectedUserInteractor.getSelectedUserId()); mUiEventLogger = uiEventLogger; } @Override Loading Loading @@ -95,6 +100,7 @@ public class KeyguardPinViewController updateAutoConfirmationState(); if (mPasswordEntry.getText().length() == mPinLength && mOkButton.getVisibility() == View.INVISIBLE) { mUiEventLogger.log(PinBouncerUiEvent.ATTEMPT_UNLOCK_WITH_AUTO_CONFIRM_FEATURE); verifyPasswordAndUnlock(); } } Loading Loading @@ -184,4 +190,21 @@ public class KeyguardPinViewController 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; } } } Loading
packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt +22 −0 Original line number Diff line number Diff line Loading @@ -22,8 +22,11 @@ import androidx.constraintlayout.widget.ConstraintLayout 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 Loading Loading @@ -91,6 +94,7 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { @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> Loading Loading @@ -137,6 +141,7 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { postureController, featureFlags, mSelectedUserInteractor, uiEventLogger ) } Loading Loading @@ -251,4 +256,21 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { 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() } }
packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java +7 −2 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.text.TextUtils; 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; Loading Loading @@ -210,6 +211,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> private final KeyguardViewController mKeyguardViewController; private final FeatureFlags mFeatureFlags; private final SelectedUserInteractor mSelectedUserInteractor; private final UiEventLogger mUiEventLogger; @Inject public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor, Loading @@ -222,7 +224,8 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> EmergencyButtonController.Factory emergencyButtonControllerFactory, DevicePostureController devicePostureController, KeyguardViewController keyguardViewController, FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor) { FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor, UiEventLogger uiEventLogger) { mKeyguardUpdateMonitor = keyguardUpdateMonitor; mLockPatternUtils = lockPatternUtils; mLatencyTracker = latencyTracker; Loading @@ -238,6 +241,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> mKeyguardViewController = keyguardViewController; mFeatureFlags = featureFlags; mSelectedUserInteractor = selectedUserInteractor; mUiEventLogger = uiEventLogger; } /** Create a new {@link KeyguardInputViewController}. */ Loading Loading @@ -265,7 +269,8 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> 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, Loading
packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java +24 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ import static com.android.systemui.flags.Flags.LOCKSCREEN_ENABLE_LANDSCAPE; 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; Loading @@ -44,6 +46,7 @@ public class KeyguardPinViewController private View mOkButton = mView.findViewById(R.id.key_enter); private long mPinLength; private final UiEventLogger mUiEventLogger; private boolean mDisabledAutoConfirmation; Loading @@ -56,7 +59,8 @@ public class KeyguardPinViewController 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); Loading @@ -67,6 +71,7 @@ public class KeyguardPinViewController view.setIsLockScreenLandscapeEnabled(mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE)); mBackspaceKey = view.findViewById(R.id.delete_button); mPinLength = mLockPatternUtils.getPinLength(selectedUserInteractor.getSelectedUserId()); mUiEventLogger = uiEventLogger; } @Override Loading Loading @@ -95,6 +100,7 @@ public class KeyguardPinViewController updateAutoConfirmationState(); if (mPasswordEntry.getText().length() == mPinLength && mOkButton.getVisibility() == View.INVISIBLE) { mUiEventLogger.log(PinBouncerUiEvent.ATTEMPT_UNLOCK_WITH_AUTO_CONFIRM_FEATURE); verifyPasswordAndUnlock(); } } Loading Loading @@ -184,4 +190,21 @@ public class KeyguardPinViewController 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; } } }