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

Commit 3b76389b authored by Juan Sebastian Martinez's avatar Juan Sebastian Martinez Committed by Android (Google) Code Review
Browse files

Merge "Using the BouncerHapticPlayer for bouncer haptics." into main

parents 613f3871 7da89747
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -34,9 +34,11 @@ import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.haptics.msdl.bouncerHapticPlayer
import com.android.systemui.keyboard.data.repository.FakeKeyboardRepository
import com.android.systemui.res.R
import com.android.systemui.statusbar.policy.DevicePostureController
import com.android.systemui.testKosmos
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.mockito.mock
@@ -86,6 +88,7 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() {
    @Mock private lateinit var postureController: DevicePostureController
    @Mock private lateinit var mUserActivityNotifier: UserActivityNotifier
    @Captor private lateinit var keyListenerArgumentCaptor: ArgumentCaptor<View.OnKeyListener>
    private val kosmos = testKosmos()

    private lateinit var keyguardPasswordViewController: KeyguardPasswordViewController

@@ -132,8 +135,8 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() {
                fakeFeatureFlags,
                mSelectedUserInteractor,
                keyguardKeyboardInteractor,
                null,
                mUserActivityNotifier
                kosmos.bouncerHapticPlayer,
                mUserActivityNotifier,
            )
    }

@@ -194,7 +197,7 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() {
            keyListenerArgumentCaptor.value.onKey(
                keyguardPasswordView,
                KeyEvent.KEYCODE_SPACE,
                KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SPACE)
                KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SPACE),
            )

        assertFalse("Unlock attempted.", eventHandled)
@@ -213,7 +216,7 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() {
            keyListenerArgumentCaptor.value.onKey(
                keyguardPasswordView,
                KeyEvent.KEYCODE_ENTER,
                KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER)
                KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER),
            )

        assertTrue("Unlock not attempted.", eventHandled)
+3 −3
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.classifier.FalsingCollectorFake
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.haptics.msdl.msdlPlayer
import com.android.systemui.haptics.msdl.bouncerHapticPlayer
import com.android.systemui.res.R
import com.android.systemui.statusbar.policy.DevicePostureController
import com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_HALF_OPENED
@@ -92,7 +92,7 @@ class KeyguardPatternViewControllerTest : SysuiTestCase() {
    @Captor lateinit var postureCallbackCaptor: ArgumentCaptor<DevicePostureController.Callback>

    private val kosmos = testKosmos()
    private val msdlPlayer = kosmos.msdlPlayer
    private val bouncerHapticHelper = kosmos.bouncerHapticPlayer

    @Before
    fun setup() {
@@ -118,7 +118,7 @@ class KeyguardPatternViewControllerTest : SysuiTestCase() {
                mPostureController,
                fakeFeatureFlags,
                mSelectedUserInteractor,
                msdlPlayer,
                bouncerHapticHelper,
            )
        mKeyguardPatternView.onAttachedToWindow()
    }
+7 −1
Original line number Diff line number Diff line
@@ -34,10 +34,12 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.keyguard.domain.interactor.KeyguardKeyboardInteractor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.classifier.FalsingCollectorFake;
import com.android.systemui.flags.FakeFeatureFlags;
import com.android.systemui.keyboard.data.repository.FakeKeyboardRepository;
import com.android.systemui.kosmos.KosmosJavaAdapter;
import com.android.systemui.res.R;
import com.android.systemui.user.domain.interactor.SelectedUserInteractor;

@@ -93,6 +95,9 @@ public class KeyguardPinBasedInputViewControllerTest extends SysuiTestCase {

    private KeyguardPinBasedInputViewController mKeyguardPinViewController;

    private KosmosJavaAdapter mKosmosJavaAdapter = new KosmosJavaAdapter(this);
    private BouncerHapticPlayer mBouncerHapticPlayer = mKosmosJavaAdapter.getBouncerHapticHelper();

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
@@ -119,7 +124,8 @@ public class KeyguardPinBasedInputViewControllerTest extends SysuiTestCase {
                mKeyguardUpdateMonitor, mSecurityMode, mLockPatternUtils, mKeyguardSecurityCallback,
                mKeyguardMessageAreaControllerFactory, mLatencyTracker, mLiftToactivateListener,
                mEmergencyButtonController, mFalsingCollector, featureFlags,
                mSelectedUserInteractor, keyguardKeyboardInteractor, null, mUserActivityNotifier) {
                mSelectedUserInteractor, keyguardKeyboardInteractor, mBouncerHapticPlayer,
                mUserActivityNotifier) {
            @Override
            public void onResume(int reason) {
                super.onResume(reason);
+10 −24
Original line number Diff line number Diff line
@@ -19,10 +19,8 @@ package com.android.keyguard;
import static com.android.internal.util.LatencyTracker.ACTION_CHECK_CREDENTIAL;
import static com.android.internal.util.LatencyTracker.ACTION_CHECK_CREDENTIAL_UNLOCKED;
import static com.android.keyguard.KeyguardAbsKeyInputView.MINIMUM_PASSWORD_LENGTH_BEFORE_REPORT;
import static com.android.systemui.Flags.msdlFeedback;
import static com.android.systemui.Flags.notifyPasswordTextViewUserActivityInBackground;

import android.annotation.Nullable;
import android.content.res.ColorStateList;
import android.os.AsyncTask;
import android.os.CountDownTimer;
@@ -37,15 +35,13 @@ import com.android.internal.widget.LockscreenCredential;
import com.android.keyguard.EmergencyButtonController.EmergencyButtonCallback;
import com.android.keyguard.KeyguardAbsKeyInputView.KeyDownListener;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer;
import com.android.systemui.classifier.FalsingClassifier;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.res.R;
import com.android.systemui.user.domain.interactor.SelectedUserInteractor;

import com.google.android.msdl.data.model.MSDLToken;
import com.google.android.msdl.domain.MSDLPlayer;

import java.util.HashMap;
import java.util.Map;

@@ -62,8 +58,6 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey
    protected AsyncTask<?, ?, ?> mPendingLockCheck;
    protected boolean mResumed;
    protected boolean mLockedOut;
    @Nullable
    protected MSDLPlayer mMSDLPlayer;

    private final KeyDownListener mKeyDownListener = (keyCode, keyEvent) -> {
        // Fingerprint sensor sends a KeyEvent.KEYCODE_UNKNOWN.
@@ -91,16 +85,16 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey
            LatencyTracker latencyTracker, FalsingCollector falsingCollector,
            EmergencyButtonController emergencyButtonController,
            FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor,
            @Nullable MSDLPlayer msdlPlayer,
            BouncerHapticPlayer bouncerHapticPlayer,
            UserActivityNotifier userActivityNotifier) {
        super(view, securityMode, keyguardSecurityCallback, emergencyButtonController,
                messageAreaControllerFactory, featureFlags, selectedUserInteractor);
                messageAreaControllerFactory, featureFlags, selectedUserInteractor,
                bouncerHapticPlayer);
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mLockPatternUtils = lockPatternUtils;
        mLatencyTracker = latencyTracker;
        mFalsingCollector = falsingCollector;
        mEmergencyButtonController = emergencyButtonController;
        mMSDLPlayer = msdlPlayer;
        mUserActivityNotifier = userActivityNotifier;
    }

@@ -191,7 +185,9 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey
    void onPasswordChecked(int userId, boolean matched, int timeoutMs, boolean isValidPassword) {
        boolean dismissKeyguard = mSelectedUserInteractor.getSelectedUserId() == userId;
        if (matched) {
            playAuthenticationHaptics(/* unlock= */true);
            mBouncerHapticPlayer.playAuthenticationFeedback(
                    /* authenticationSucceeded = */true
            );
            getKeyguardSecurityCallback().reportUnlockAttempt(userId, true, 0);
            if (dismissKeyguard) {
                mDismissing = true;
@@ -199,7 +195,9 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey
                getKeyguardSecurityCallback().dismiss(true, userId, getSecurityMode());
            }
        } else {
            playAuthenticationHaptics(/* unlock= */false);
            mBouncerHapticPlayer.playAuthenticationFeedback(
                    /* authenticationSucceeded = */false
            );
            mView.resetPasswordText(true /* animate */, false /* announce deletion if no match */);
            if (isValidPassword) {
                getKeyguardSecurityCallback().reportUnlockAttempt(userId, false, timeoutMs);
@@ -216,18 +214,6 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey
        }
    }

    private void playAuthenticationHaptics(boolean unlock) {
        if (!msdlFeedback() || mMSDLPlayer == null) return;

        MSDLToken token;
        if (unlock) {
            token = MSDLToken.UNLOCK;
        } else {
            token = MSDLToken.FAILURE;
        }
        mMSDLPlayer.playToken(token, mAuthInteractionProperties);
    }

    protected void startErrorAnimation() { /* no-op */ }

    protected void verifyPasswordAndUnlock() {
+13 −14
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.systemui.Flags;
import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor;
import com.android.systemui.bouncer.ui.BouncerMessageView;
import com.android.systemui.bouncer.ui.binder.BouncerMessageViewBinder;
import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.flags.FeatureFlags;
@@ -45,9 +46,6 @@ import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
import com.android.systemui.util.ViewController;
import com.android.systemui.util.concurrency.DelayableExecutor;

import com.google.android.msdl.domain.InteractionProperties;
import com.google.android.msdl.domain.MSDLPlayer;

import javax.inject.Inject;

/** Controller for a {@link KeyguardSecurityView}. */
@@ -66,21 +64,22 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
    private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() {};
    private final FeatureFlags mFeatureFlags;
    protected final SelectedUserInteractor mSelectedUserInteractor;
    protected final InteractionProperties mAuthInteractionProperties =
            new AuthInteractionProperties();
    protected final BouncerHapticPlayer mBouncerHapticPlayer;

    protected KeyguardInputViewController(T view, SecurityMode securityMode,
            KeyguardSecurityCallback keyguardSecurityCallback,
            EmergencyButtonController emergencyButtonController,
            @Nullable KeyguardMessageAreaController.Factory messageAreaControllerFactory,
            FeatureFlags featureFlags,
            SelectedUserInteractor selectedUserInteractor) {
            SelectedUserInteractor selectedUserInteractor,
            BouncerHapticPlayer bouncerHapticPlayer) {
        super(view);
        mSecurityMode = securityMode;
        mKeyguardSecurityCallback = keyguardSecurityCallback;
        mEmergencyButtonController = emergencyButtonController;
        mFeatureFlags = featureFlags;
        mSelectedUserInteractor = selectedUserInteractor;
        mBouncerHapticPlayer = bouncerHapticPlayer;
        if (messageAreaControllerFactory != null) {
            try {
                BouncerKeyguardMessageArea kma = view.requireViewById(R.id.bouncer_message_area);
@@ -219,7 +218,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
        private final SelectedUserInteractor mSelectedUserInteractor;
        private final UiEventLogger mUiEventLogger;
        private final KeyguardKeyboardInteractor mKeyguardKeyboardInteractor;
        private final MSDLPlayer mMSDLPlayer;
        private final BouncerHapticPlayer mBouncerHapticPlayer;
        private final UserActivityNotifier mUserActivityNotifier;

        @Inject
@@ -236,7 +235,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
                FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor,
                UiEventLogger uiEventLogger,
                KeyguardKeyboardInteractor keyguardKeyboardInteractor,
                MSDLPlayer msdlPlayer,
                BouncerHapticPlayer bouncerHapticPlayer,
                UserActivityNotifier userActivityNotifier) {
            mKeyguardUpdateMonitor = keyguardUpdateMonitor;
            mLockPatternUtils = lockPatternUtils;
@@ -255,7 +254,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
            mSelectedUserInteractor = selectedUserInteractor;
            mUiEventLogger = uiEventLogger;
            mKeyguardKeyboardInteractor = keyguardKeyboardInteractor;
            mMSDLPlayer = msdlPlayer;
            mBouncerHapticPlayer = bouncerHapticPlayer;
            mUserActivityNotifier = userActivityNotifier;
        }

@@ -272,7 +271,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
                        keyguardSecurityCallback, mLatencyTracker, mFalsingCollector,
                        emergencyButtonController, mMessageAreaControllerFactory,
                        mDevicePostureController, mFeatureFlags, mSelectedUserInteractor,
                        mMSDLPlayer);
                        mBouncerHapticPlayer);
            } else if (keyguardInputView instanceof KeyguardPasswordView) {
                return new KeyguardPasswordViewController((KeyguardPasswordView) keyguardInputView,
                        mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
@@ -280,14 +279,14 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
                        mInputMethodManager, emergencyButtonController, mMainExecutor, mResources,
                        mFalsingCollector, mKeyguardViewController,
                        mDevicePostureController, mFeatureFlags, mSelectedUserInteractor,
                        mKeyguardKeyboardInteractor, mMSDLPlayer, mUserActivityNotifier);
                        mKeyguardKeyboardInteractor, mBouncerHapticPlayer, mUserActivityNotifier);
            } else if (keyguardInputView instanceof KeyguardPINView) {
                return new KeyguardPinViewController((KeyguardPINView) keyguardInputView,
                        mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
                        keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
                        mLiftToActivateListener, emergencyButtonController, mFalsingCollector,
                        mDevicePostureController, mFeatureFlags, mSelectedUserInteractor,
                        mUiEventLogger, mKeyguardKeyboardInteractor, mMSDLPlayer,
                        mUiEventLogger, mKeyguardKeyboardInteractor, mBouncerHapticPlayer,
                        mUserActivityNotifier);
            } else if (keyguardInputView instanceof KeyguardSimPinView) {
                return new KeyguardSimPinViewController((KeyguardSimPinView) keyguardInputView,
@@ -295,14 +294,14 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
                        keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
                        mLiftToActivateListener, mTelephonyManager, mFalsingCollector,
                        emergencyButtonController, mFeatureFlags, mSelectedUserInteractor,
                        mKeyguardKeyboardInteractor, mMSDLPlayer, mUserActivityNotifier);
                        mKeyguardKeyboardInteractor, mBouncerHapticPlayer, mUserActivityNotifier);
            } else if (keyguardInputView instanceof KeyguardSimPukView) {
                return new KeyguardSimPukViewController((KeyguardSimPukView) keyguardInputView,
                        mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
                        keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
                        mLiftToActivateListener, mTelephonyManager, mFalsingCollector,
                        emergencyButtonController, mFeatureFlags, mSelectedUserInteractor,
                        mKeyguardKeyboardInteractor, mMSDLPlayer, mUserActivityNotifier
                        mKeyguardKeyboardInteractor, mBouncerHapticPlayer, mUserActivityNotifier
                );
            }

Loading