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

Commit 8848abd1 authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Add ability to ignore gestures in FalsingManager

This gives other parts of the system the ability to temporarily
override the falsing manager, telling it to ignore a given gesture.

The intent is to give other parts of the system a chance to include
their own falsing information (such as whether a button was tapped or
not), giving the FalsingManager more context about what is going on.

As of right now, their is no way to feedback this context-aware
falsing information back to the FalsingManager. An API for this is
still being explored.

Bug: 172655679
Test: atest SystemUITests && manual
Change-Id: I87ee94a2386622ebff7580346325ae07e3bb5f5d
parent 246e9240
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -23,10 +23,16 @@ import android.widget.LinearLayout;

import androidx.annotation.Nullable;

import com.android.systemui.Gefingerpoken;

import java.util.ArrayList;
import java.util.List;

/**
 * A Base class for all Keyguard password/pattern/pin related inputs.
 */
public abstract class KeyguardInputView extends LinearLayout {
    private final List<Gefingerpoken> mMotionEventListener = new ArrayList<>();

    public KeyguardInputView(Context context) {
        super(context);
@@ -52,4 +58,25 @@ public abstract class KeyguardInputView extends LinearLayout {
    boolean startDisappearAnimation(Runnable finishRunnable) {
        return false;
    }

    void addMotionEventListener(Gefingerpoken listener) {
        mMotionEventListener.add(listener);
    }

    void removeMotionEventListener(Gefingerpoken listener) {
        mMotionEventListener.remove(listener);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return mMotionEventListener.stream().anyMatch(listener -> listener.onTouchEvent(event))
                || super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return mMotionEventListener.stream().anyMatch(
                listener -> listener.onInterceptTouchEvent(event))
                || super.onInterceptTouchEvent(event);
    }
}
+7 −4
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.util.ViewController;
import com.android.systemui.util.concurrency.DelayableExecutor;
@@ -155,6 +156,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
        private final Resources mResources;
        private LiftToActivateListener mLiftToActivateListener;
        private TelephonyManager mTelephonyManager;
        private final FalsingCollector mFalsingCollector;

        @Inject
        public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor,
@@ -163,7 +165,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
                KeyguardMessageAreaController.Factory messageAreaControllerFactory,
                InputMethodManager inputMethodManager, @Main DelayableExecutor mainExecutor,
                @Main Resources resources, LiftToActivateListener liftToActivateListener,
                TelephonyManager telephonyManager) {
                TelephonyManager telephonyManager, FalsingCollector falsingCollector) {
            mKeyguardUpdateMonitor = keyguardUpdateMonitor;
            mLockPatternUtils = lockPatternUtils;
            mLatencyTracker = latencyTracker;
@@ -173,6 +175,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
            mResources = resources;
            mLiftToActivateListener = liftToActivateListener;
            mTelephonyManager = telephonyManager;
            mFalsingCollector = falsingCollector;
        }

        /** Create a new {@link KeyguardInputViewController}. */
@@ -191,17 +194,17 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
                return new KeyguardPinViewController((KeyguardPINView) keyguardInputView,
                        mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
                        keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
                        mLiftToActivateListener);
                        mLiftToActivateListener, mFalsingCollector);
            } else if (keyguardInputView instanceof KeyguardSimPinView) {
                return new KeyguardSimPinViewController((KeyguardSimPinView) keyguardInputView,
                        mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
                        keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
                        mLiftToActivateListener, mTelephonyManager);
                        mLiftToActivateListener, mTelephonyManager, mFalsingCollector);
            } else if (keyguardInputView instanceof KeyguardSimPukView) {
                return new KeyguardSimPukViewController((KeyguardSimPukView) keyguardInputView,
                        mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
                        keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
                        mLiftToActivateListener, mTelephonyManager);
                        mLiftToActivateListener, mTelephonyManager, mFalsingCollector);
            }

            throw new RuntimeException("Unable to find controller for " + keyguardInputView);
+24 −4
Original line number Diff line number Diff line
@@ -25,12 +25,15 @@ import android.view.View.OnTouchListener;
import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingCollector;

public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinBasedInputView>
        extends KeyguardAbsKeyInputViewController<T> {

    private final LiftToActivateListener mLiftToActivateListener;
    private final FalsingCollector mFalsingCollector;
    protected PasswordTextView mPasswordEntry;

    private final OnKeyListener mOnKeyListener = (v, keyCode, event) -> {
@@ -40,13 +43,26 @@ public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinB
        return false;
    };

    private final OnTouchListener mOnTouchListener = (v, event) -> {
    private final OnTouchListener mActionButtonTouchListener = (v, event) -> {
        if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
            mView.doHapticKeyClick();
        }
        return false;
    };

    private final Gefingerpoken mGlobalTouchListener = new Gefingerpoken() {
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            mFalsingCollector.avoidGesture();
            return false;
        }

        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            return false;
        }
    };

    protected KeyguardPinBasedInputViewController(T view,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            SecurityMode securityMode,
@@ -54,10 +70,12 @@ public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinB
            KeyguardSecurityCallback keyguardSecurityCallback,
            KeyguardMessageAreaController.Factory messageAreaControllerFactory,
            LatencyTracker latencyTracker,
            LiftToActivateListener liftToActivateListener) {
            LiftToActivateListener liftToActivateListener,
            FalsingCollector falsingCollector) {
        super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback,
                messageAreaControllerFactory, latencyTracker);
        mLiftToActivateListener = liftToActivateListener;
        mFalsingCollector = falsingCollector;
        mPasswordEntry = mView.findViewById(mView.getPasswordTextViewId());
    }

@@ -65,11 +83,13 @@ public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinB
    protected void onViewAttached() {
        super.onViewAttached();

        mView.addMotionEventListener(mGlobalTouchListener);

        mPasswordEntry.setOnKeyListener(mOnKeyListener);
        mPasswordEntry.setUserActivityListener(this::onUserInput);

        View deleteButton = mView.findViewById(R.id.delete_button);
        deleteButton.setOnTouchListener(mOnTouchListener);
        deleteButton.setOnTouchListener(mActionButtonTouchListener);
        deleteButton.setOnClickListener(v -> {
            // check for time-based lockouts
            if (mPasswordEntry.isEnabled()) {
@@ -87,7 +107,7 @@ public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinB

        View okButton = mView.findViewById(R.id.key_enter);
        if (okButton != null) {
            okButton.setOnTouchListener(mOnTouchListener);
            okButton.setOnTouchListener(mActionButtonTouchListener);
            okButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
+5 −3
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingCollector;

public class KeyguardPinViewController
        extends KeyguardPinBasedInputViewController<KeyguardPINView> {
@@ -32,10 +33,11 @@ public class KeyguardPinViewController
            SecurityMode securityMode, LockPatternUtils lockPatternUtils,
            KeyguardSecurityCallback keyguardSecurityCallback,
            KeyguardMessageAreaController.Factory messageAreaControllerFactory,
            LatencyTracker latencyTracker,
            LiftToActivateListener liftToActivateListener) {
            LatencyTracker latencyTracker, LiftToActivateListener liftToActivateListener,
            FalsingCollector falsingCollector) {
        super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback,
                messageAreaControllerFactory, latencyTracker, liftToActivateListener);
                messageAreaControllerFactory, latencyTracker, liftToActivateListener,
                falsingCollector);
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
    }

+5 −4
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingCollector;

public class KeyguardSimPinViewController
        extends KeyguardPinBasedInputViewController<KeyguardSimPinView> {
@@ -76,11 +77,11 @@ public class KeyguardSimPinViewController
            SecurityMode securityMode, LockPatternUtils lockPatternUtils,
            KeyguardSecurityCallback keyguardSecurityCallback,
            KeyguardMessageAreaController.Factory messageAreaControllerFactory,
            LatencyTracker latencyTracker,
            LiftToActivateListener liftToActivateListener,
            TelephonyManager telephonyManager) {
            LatencyTracker latencyTracker, LiftToActivateListener liftToActivateListener,
            TelephonyManager telephonyManager, FalsingCollector falsingCollector) {
        super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback,
                messageAreaControllerFactory, latencyTracker, liftToActivateListener);
                messageAreaControllerFactory, latencyTracker, liftToActivateListener,
                falsingCollector);
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mTelephonyManager = telephonyManager;
        mSimImageView = mView.findViewById(R.id.keyguard_sim);
Loading