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

Commit cfa7acdf authored by Dave Mankoff's avatar Dave Mankoff Committed by Android (Google) Code Review
Browse files

Merge "Add Tests for the BrightLineFalsingManager."

parents d63ba10d d1383504
Loading
Loading
Loading
Loading
+19 −35
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -14,44 +14,39 @@
 * limitations under the License.
 */

package com.android.systemui.classifier.brightline;
package com.android.systemui.classifier;

import static com.android.systemui.classifier.FalsingManagerProxy.FALSING_SUCCESS;
import static com.android.systemui.classifier.FalsingModule.BRIGHT_LINE_GESTURE_CLASSIFERS;

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

import androidx.annotation.NonNull;

import com.android.internal.logging.MetricsLogger;
import com.android.systemui.R;
import com.android.systemui.classifier.Classifier;
import com.android.systemui.classifier.FalsingDataProvider;
import com.android.systemui.classifier.FalsingDataProvider.SessionListener;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.TestHarness;
import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.phone.NotificationTapHelper;
import com.android.systemui.util.DeviceConfigProxy;
import com.android.systemui.util.sensors.ThresholdSensor;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Queue;
import java.util.Set;
import java.util.StringJoiner;
import java.util.stream.Collectors;

import javax.inject.Inject;
import javax.inject.Named;

/**
 * FalsingManager designed to make clear why a touch was rejected.
@@ -68,6 +63,7 @@ public class BrightLineFalsingManager implements FalsingManager {
    private final DockManager mDockManager;
    private final SingleTapClassifier mSingleTapClassifier;
    private final DoubleTapClassifier mDoubleTapClassifier;
    private final boolean mTestHarness;
    private final MetricsLogger mMetricsLogger;
    private int mIsFalseTouchCalls;
    private static final Queue<String> RECENT_INFO_LOG =
@@ -75,7 +71,7 @@ public class BrightLineFalsingManager implements FalsingManager {
    private static final Queue<DebugSwipeRecord> RECENT_SWIPES =
            new ArrayDeque<>(RECENT_SWIPE_LOG_SIZE + 1);

    private final List<FalsingClassifier> mClassifiers;
    private final Collection<FalsingClassifier> mClassifiers;

    private final SessionListener mSessionListener = new SessionListener() {
        @Override
@@ -93,29 +89,17 @@ public class BrightLineFalsingManager implements FalsingManager {

    @Inject
    public BrightLineFalsingManager(FalsingDataProvider falsingDataProvider,
            DeviceConfigProxy deviceConfigProxy, @Main Resources resources,
            ViewConfiguration viewConfiguration, DockManager dockManager) {
            DockManager dockManager, MetricsLogger metricsLogger,
            @Named(BRIGHT_LINE_GESTURE_CLASSIFERS) Set<FalsingClassifier> classifiers,
            SingleTapClassifier singleTapClassifier, DoubleTapClassifier doubleTapClassifier,
            @TestHarness boolean testHarness) {
        mDataProvider = falsingDataProvider;
        mDockManager = dockManager;

        mMetricsLogger = new MetricsLogger();
        mClassifiers = new ArrayList<>();
        DistanceClassifier distanceClassifier =
                new DistanceClassifier(mDataProvider, deviceConfigProxy);
        ProximityClassifier proximityClassifier =
                new ProximityClassifier(distanceClassifier, mDataProvider, deviceConfigProxy);
        mClassifiers.add(new PointerCountClassifier(mDataProvider));
        mClassifiers.add(new TypeClassifier(mDataProvider));
        mClassifiers.add(new DiagonalClassifier(mDataProvider, deviceConfigProxy));
        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);
        mMetricsLogger = metricsLogger;
        mClassifiers = classifiers;
        mSingleTapClassifier = singleTapClassifier;
        mDoubleTapClassifier = doubleTapClassifier;
        mTestHarness = testHarness;

        mDataProvider.addSessionListener(mSessionListener);
    }
@@ -132,7 +116,7 @@ public class BrightLineFalsingManager implements FalsingManager {
            return mPreviousResult;
        }

        mPreviousResult = !ActivityManager.isRunningInUserTestHarness()
        mPreviousResult = !mTestHarness
                && !mDataProvider.isJustUnlockedWithFace() && !mDockManager.isDocked()
                && mClassifiers.stream().anyMatch(falsingClassifier -> {
                    boolean result = falsingClassifier.isFalseTouch();
+5 −3
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

package com.android.systemui.classifier.brightline;
package com.android.systemui.classifier;

import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE;
@@ -23,11 +23,12 @@ import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE;

import android.provider.DeviceConfig;

import com.android.systemui.classifier.FalsingDataProvider;
import com.android.systemui.util.DeviceConfigProxy;

import java.util.Locale;

import javax.inject.Inject;

/**
 * False on swipes that are too close to 45 degrees.
 *
@@ -47,6 +48,7 @@ class DiagonalClassifier extends FalsingClassifier {
    private final float mHorizontalAngleRange;
    private final float mVerticalAngleRange;

    @Inject
    DiagonalClassifier(FalsingDataProvider dataProvider, DeviceConfigProxy deviceConfigProxy) {
        super(dataProvider);

+5 −3
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

package com.android.systemui.classifier.brightline;
package com.android.systemui.classifier;

import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN;
@@ -27,12 +27,13 @@ import android.provider.DeviceConfig;
import android.view.MotionEvent;
import android.view.VelocityTracker;

import com.android.systemui.classifier.FalsingDataProvider;
import com.android.systemui.util.DeviceConfigProxy;

import java.util.List;
import java.util.Locale;

import javax.inject.Inject;

/**
 * Ensure that the swipe + momentum covers a minimum distance.
 */
@@ -54,6 +55,7 @@ class DistanceClassifier extends FalsingClassifier {
    private boolean mDistanceDirty;
    private DistanceVectors mCachedDistance;

    @Inject
    DistanceClassifier(FalsingDataProvider dataProvider, DeviceConfigProxy deviceConfigProxy) {
        super(dataProvider);

+10 −4
Original line number Diff line number Diff line
@@ -14,15 +14,19 @@
 * limitations under the License.
 */

package com.android.systemui.classifier.brightline;
package com.android.systemui.classifier;

import android.view.MotionEvent;
import static com.android.systemui.classifier.FalsingModule.DOUBLE_TAP_TIMEOUT_MS;
import static com.android.systemui.classifier.FalsingModule.DOUBLE_TAP_TOUCH_SLOP;

import com.android.systemui.classifier.FalsingDataProvider;
import android.view.MotionEvent;

import java.util.List;
import java.util.Queue;

import javax.inject.Inject;
import javax.inject.Named;

/**
 * Returns a false touch if the most two recent gestures are not taps or are too far apart.
 */
@@ -34,8 +38,10 @@ public class DoubleTapClassifier extends FalsingClassifier {

    private StringBuilder mReason = new StringBuilder();

    @Inject
    DoubleTapClassifier(FalsingDataProvider dataProvider, SingleTapClassifier singleTapClassifier,
            float doubleTapSlop, long doubleTapTimeMs) {
            @Named(DOUBLE_TAP_TOUCH_SLOP) float doubleTapSlop,
            @Named(DOUBLE_TAP_TIMEOUT_MS) long doubleTapTimeMs) {
        super(dataProvider);
        mSingleTapClassifier = singleTapClassifier;
        mDoubleTapSlop = doubleTapSlop;
+2 −4
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -14,12 +14,10 @@
 * limitations under the License.
 */

package com.android.systemui.classifier.brightline;
package com.android.systemui.classifier;

import android.view.MotionEvent;

import com.android.systemui.classifier.Classifier;
import com.android.systemui.classifier.FalsingDataProvider;
import com.android.systemui.util.sensors.ProximitySensor;

import java.util.List;
Loading