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

Commit 95c6057d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add Tap falsing to the FalsingManager."

parents 7bb2a03b 040ffe7b
Loading
Loading
Loading
Loading
+37 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ import java.io.PrintWriter;
 */
@ProvidesInterface(version = FalsingManager.VERSION)
public interface FalsingManager {
    int VERSION = 5;
    int VERSION = 6;

    void onSuccessfulUnlock();

@@ -45,6 +45,42 @@ public interface FalsingManager {
    /** Returns true if the gesture should be rejected. */
    boolean isFalseTouch(int interactionType);

    /**
     * Returns true if the FalsingManager thinks the last gesure was not a valid tap.
     *
     * Accepts one parameter, robustCheck, that distinctly changes behavior. When set to false,
     * this method simply looks at the last gesture and returns whether it is a tap or not, (as
     * opposed to a swipe or other non-tap gesture). When set to true, a more thorough analysis
     * is performed that can include historical interactions and other contextual cues to see
     * if the tap looks accidental.
     *
     * Set robustCheck to true if you want to validate a tap for launching an action, like opening
     * a notification. Set to false if you simply want to know if the last gesture looked like a
     * tap.
     */
    boolean isFalseTap(boolean robustCheck);

    /**
     * Returns true if the last two gestures do not look like a double tap.
     *
     * Only works on data that has already been reported to the FalsingManager. Be sure that
     * {@link #onTouchEvent(MotionEvent, int, int)} has already been called for all of the
     * taps you want considered.
     *
     * This looks at the last two gestures on the screen, ensuring that they meet the following
     * criteria:
     *
     *   a) There are at least two gestures.
     *   b) The last two gestures look like taps.
     *   c) The last two gestures look like a double tap taken together.
     *
     *   This method is _not_ context aware. That is to say, if two taps occur on two neighboring
     *   views, but are otherwise close to one another, this will report a successful double tap.
     *   It is up to the caller to decide
     * @return
     */
    boolean isFalseDoubleTap();

    void onNotificatonStopDraggingDown();

    void setNotificationExpanded();
+25 −0
Original line number Diff line number Diff line
@@ -29,10 +29,13 @@ import java.io.PrintWriter;
 */
public class FalsingManagerFake implements FalsingManager {
    private boolean mIsFalseTouch;
    private boolean mIsFalseTap;
    private boolean mIsFalseDoubleTap;
    private boolean mIsUnlockingDisabled;
    private boolean mIsClassiferEnabled;
    private boolean mShouldEnforceBouncer;
    private boolean mIsReportingEnabled;
    private boolean mIsFalseRobustTap;

    @Override
    public void onSuccessfulUnlock() {
@@ -74,6 +77,28 @@ public class FalsingManagerFake implements FalsingManager {
        return mIsFalseTouch;
    }

    public void setFalseRobustTap(boolean falseRobustTap) {
        mIsFalseRobustTap = falseRobustTap;
    }

    public void setFalseTap(boolean falseTap) {
        mIsFalseTap = falseTap;
    }

    public void setFalseDoubleTap(boolean falseDoubleTap) {
        mIsFalseDoubleTap = falseDoubleTap;
    }

    @Override
    public boolean isFalseTap(boolean robustCheck) {
        return robustCheck ? mIsFalseRobustTap : mIsFalseTap;
    }

    @Override
    public boolean isFalseDoubleTap() {
        return mIsFalseDoubleTap;
    }

    @Override
    public void onNotificatonStopDraggingDown() {

+10 −0
Original line number Diff line number Diff line
@@ -328,6 +328,16 @@ public class FalsingManagerImpl implements FalsingManager {
        return isFalse;
    }

    @Override
    public boolean isFalseTap(boolean robustCheck) {
        return true;
    }

    @Override
    public boolean isFalseDoubleTap() {
        return false;
    }

    private void clearPendingWtf() {
        if (mPendingWtf != null) {
            mHandler.removeCallbacks(mPendingWtf);
+21 −0
Original line number Diff line number Diff line
@@ -19,10 +19,12 @@ package com.android.systemui.classifier;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_MANAGER_ENABLED;

import android.content.Context;
import android.content.res.Resources;
import android.hardware.SensorManager;
import android.net.Uri;
import android.provider.DeviceConfig;
import android.view.MotionEvent;
import android.view.ViewConfiguration;

import androidx.annotation.NonNull;

@@ -61,6 +63,8 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable {
    private static final String PROXIMITY_SENSOR_TAG = "FalsingManager";

    private final ProximitySensor mProximitySensor;
    private final Resources mResources;
    private final ViewConfiguration mViewConfiguration;
    private final FalsingDataProvider mFalsingDataProvider;
    private FalsingManager mInternalFalsingManager;
    private DeviceConfig.OnPropertiesChangedListener mDeviceConfigListener;
@@ -79,12 +83,16 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable {
            DumpManager dumpManager,
            @UiBackground Executor uiBgExecutor,
            StatusBarStateController statusBarStateController,
            @Main Resources resources,
            ViewConfiguration viewConfiguration,
            FalsingDataProvider falsingDataProvider) {
        mProximitySensor = proximitySensor;
        mDockManager = dockManager;
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mUiBgExecutor = uiBgExecutor;
        mStatusBarStateController = statusBarStateController;
        mResources = resources;
        mViewConfiguration = viewConfiguration;
        mFalsingDataProvider = falsingDataProvider;
        mProximitySensor.setTag(PROXIMITY_SENSOR_TAG);
        mProximitySensor.setDelay(SensorManager.SENSOR_DELAY_GAME);
@@ -147,6 +155,8 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable {
                    mKeyguardUpdateMonitor,
                    mProximitySensor,
                    mDeviceConfig,
                    mResources,
                    mViewConfiguration,
                    mDockManager,
                    mStatusBarStateController
            );
@@ -191,6 +201,17 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable {
        return mInternalFalsingManager.isFalseTouch(interactionType);
    }


    @Override
    public boolean isFalseTap(boolean robustCheck) {
        return mInternalFalsingManager.isFalseTap(robustCheck);
    }

    @Override
    public boolean isFalseDoubleTap() {
        return mInternalFalsingManager.isFalseDoubleTap();
    }

    @Override
    public void onNotificatonStopDraggingDown() {
        mInternalFalsingManager.onNotificatonStartDraggingDown();
+46 −2
Original line number Diff line number Diff line
@@ -20,21 +20,26 @@ import static com.android.systemui.classifier.FalsingManagerImpl.FALSING_REMAIN_
import static com.android.systemui.classifier.FalsingManagerImpl.FALSING_SUCCESS;

import android.app.ActivityManager;
import android.content.res.Resources;
import android.hardware.biometrics.BiometricSourceType;
import android.net.Uri;
import android.os.Build;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ViewConfiguration;

import com.android.internal.logging.MetricsLogger;
import com.android.internal.util.IndentingPrintWriter;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.R;
import com.android.systemui.classifier.Classifier;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.NotificationTapHelper;
import com.android.systemui.util.DeviceConfigProxy;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.sensors.ThresholdSensor;
@@ -64,6 +69,8 @@ public class BrightLineFalsingManager implements FalsingManager {
    private final ProximitySensor mProximitySensor;
    private final DockManager mDockManager;
    private final StatusBarStateController mStatusBarStateController;
    private final SingleTapClassifier mSingleTapClassifier;
    private final DoubleTapClassifier mDoubleTapClassifier;
    private boolean mSessionStarted;
    private MetricsLogger mMetricsLogger;
    private int mIsFalseTouchCalls;
@@ -106,8 +113,9 @@ public class BrightLineFalsingManager implements FalsingManager {

    public BrightLineFalsingManager(FalsingDataProvider falsingDataProvider,
            KeyguardUpdateMonitor keyguardUpdateMonitor, ProximitySensor proximitySensor,
            DeviceConfigProxy deviceConfigProxy,
            DockManager dockManager, StatusBarStateController statusBarStateController) {
            DeviceConfigProxy deviceConfigProxy, @Main Resources resources,
            ViewConfiguration viewConfiguration, DockManager dockManager,
            StatusBarStateController statusBarStateController) {
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mDataProvider = falsingDataProvider;
        mProximitySensor = proximitySensor;
@@ -129,6 +137,12 @@ public class BrightLineFalsingManager implements FalsingManager {
        mClassifiers.add(distanceClassifier);
        mClassifiers.add(proximityClassifier);
        mClassifiers.add(new ZigZagClassifier(mDataProvider, deviceConfigProxy));

        mSingleTapClassifier = new SingleTapClassifier(
                mDataProvider, viewConfiguration.getScaledTouchSlop());
        mDoubleTapClassifier = new DoubleTapClassifier(mDataProvider, mSingleTapClassifier,
                resources.getDimension(R.dimen.double_tap_slop),
                NotificationTapHelper.DOUBLE_TAP_TIMEOUT_MS);
    }

    private void registerSensors() {
@@ -236,6 +250,36 @@ public class BrightLineFalsingManager implements FalsingManager {
        return mPreviousResult;
    }

    @Override
    public boolean isFalseTap(boolean robustCheck) {
        if (!mSingleTapClassifier.isTap(mDataProvider.getRecentMotionEvents())) {
            logInfo(String.format(
                    (Locale) null, "{classifier=%s}", mSingleTapClassifier.getClass().getName()));
            String reason = mSingleTapClassifier.getReason();
            if (reason != null) {
                logInfo(reason);
            }
            return true;
        }

        // TODO(b/172655679): we always reject single-taps when doing a robust check for now.
        return robustCheck;
    }

    @Override
    public boolean isFalseDoubleTap() {
        boolean result = mDoubleTapClassifier.isFalseTouch();
        if (result) {
            logInfo(String.format(
                    (Locale) null, "{classifier=%s}", mDoubleTapClassifier.getClass().getName()));
            String reason = mDoubleTapClassifier.getReason();
            if (reason != null) {
                logInfo(reason);
            }
        }
        return result;
    }

    @Override
    public void onTouchEvent(MotionEvent motionEvent, int width, int height) {
        // TODO: some of these classifiers might allow us to abort early, meaning we don't have to
Loading