Merge "Allow BrightLineFalsingManager settings to be experimented with via Phenotype." into qt-dev

This commit is contained in:
Dave Mankoff
2019-07-24 19:09:02 +00:00
committed by Android (Google) Code Review
5 changed files with 201 additions and 23 deletions

View File

@@ -186,6 +186,89 @@ public final class SystemUiDeviceConfigFlags {
*/ */
public static final String BRIGHTLINE_FALSING_MANAGER_ENABLED = public static final String BRIGHTLINE_FALSING_MANAGER_ENABLED =
"brightline_falsing_manager_enabled"; "brightline_falsing_manager_enabled";
/**
* (float) Maximum fraction of the screen required to qualify as a real swipe.
*/
public static final String BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE =
"brightline_falsing_distance_screen_fraction_max_distance";
/**
* (float) Multiplier for swipe velocity to convert it to pixels for a fling.
*/
public static final String BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE =
"brightline_falsing_distance_velcoity_to_distance";
/**
* (float) How far, in inches, must a fling travel horizontally to qualify as intentional.
*/
public static final String BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN =
"brightline_falsing_distance_horizontal_fling_threshold_in";
/**
* (float) Maximum fraction of the screen required to qualify as a real swipe.
*/
public static final String BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN =
"brightline_falsing_distance_vertical_fling_threshold_in";
/**
* (float) How far, in inches, must a continuous swipe travel horizontally to be intentional.
*/
public static final String BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN =
"brightline_falsing_distance_horizontal_swipe_threshold_in";
/**
* (float) How far, in inches, must a continuous swipe travel vertically to be intentional.
*/
public static final String BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN =
"brightline_falsing_distance_horizontal_swipe_threshold_in";
/**
* (float) Percentage of swipe with the proximity sensor covered that triggers a higher
* swipe distance requirement.
*/
public static final String BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD =
"brightline_falsing_proximity_percent_covered_threshold";
/**
* (float) Angle, in radians, that a swipe can vary from horizontal and sill be intentional.
*/
public static final String BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE =
"brightline_falsing_diagonal_horizontal_angle_range";
/**
* (float) Angle, in radians, that a swipe can vary from vertical and sill be intentional.
*/
public static final String BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE =
"brightline_falsing_diagonal_horizontal_angle_range";
/**
* (float) Distance, in inches, that a swipe is allowed to vary in the horizontal direction for
* horizontal swipes.
*/
public static final String BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE =
"brightline_falsing_zigzag_x_primary_deviance";
/**
* (float) Distance, in inches, that a swipe is allowed to vary in the vertical direction for
* vertical swipes.
*/
public static final String BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE =
"brightline_falsing_zigzag_y_primary_deviance";
/**
* (float) Distance, in inches, that a swipe is allowed to vary in the horizontal direction for
* horizontal swipes.
*/
public static final String BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE =
"brightline_falsing_zigzag_x_secondary_deviance";
/**
* (float) Distance, in inches, that a swipe is allowed to vary in the vertical direction for
* vertical swipes.
*/
public static final String BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE =
"brightline_falsing_zigzag_y_secondary_deviance";
private SystemUiDeviceConfigFlags() { } private SystemUiDeviceConfigFlags() { }
} }

View File

@@ -16,9 +16,13 @@
package com.android.systemui.classifier.brightline; package com.android.systemui.classifier.brightline;
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;
import static com.android.systemui.classifier.Classifier.LEFT_AFFORDANCE; import static com.android.systemui.classifier.Classifier.LEFT_AFFORDANCE;
import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE; import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE;
import android.provider.DeviceConfig;
/** /**
* False on swipes that are too close to 45 degrees. * False on swipes that are too close to 45 degrees.
* *
@@ -35,8 +39,20 @@ class DiagonalClassifier extends FalsingClassifier {
private static final float ONE_HUNDRED_EIGHTY_DEG = (float) (Math.PI); private static final float ONE_HUNDRED_EIGHTY_DEG = (float) (Math.PI);
private static final float THREE_HUNDRED_SIXTY_DEG = (float) (2 * Math.PI); private static final float THREE_HUNDRED_SIXTY_DEG = (float) (2 * Math.PI);
private final float mHorizontalAngleRange;
private final float mVerticalAngleRange;
DiagonalClassifier(FalsingDataProvider dataProvider) { DiagonalClassifier(FalsingDataProvider dataProvider) {
super(dataProvider); super(dataProvider);
mHorizontalAngleRange = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE,
HORIZONTAL_ANGLE_RANGE);
mVerticalAngleRange = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE,
VERTICAL_ANGLE_RANGE);
} }
@Override @Override
@@ -52,11 +68,11 @@ class DiagonalClassifier extends FalsingClassifier {
return false; return false;
} }
float minAngle = DIAGONAL - HORIZONTAL_ANGLE_RANGE; float minAngle = DIAGONAL - mHorizontalAngleRange;
float maxAngle = DIAGONAL + HORIZONTAL_ANGLE_RANGE; float maxAngle = DIAGONAL + mHorizontalAngleRange;
if (isVertical()) { if (isVertical()) {
minAngle = DIAGONAL - VERTICAL_ANGLE_RANGE; minAngle = DIAGONAL - mVerticalAngleRange;
maxAngle = DIAGONAL + VERTICAL_ANGLE_RANGE; maxAngle = DIAGONAL + mVerticalAngleRange;
} }
return angleBetween(angle, minAngle, maxAngle) return angleBetween(angle, minAngle, maxAngle)

View File

@@ -16,6 +16,14 @@
package com.android.systemui.classifier.brightline; package com.android.systemui.classifier.brightline;
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;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN;
import android.provider.DeviceConfig;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.VelocityTracker; import android.view.VelocityTracker;
@@ -31,12 +39,13 @@ class DistanceClassifier extends FalsingClassifier {
private static final float HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN = 3; private static final float HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN = 3;
private static final float VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN = 3; private static final float VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN = 3;
private static final float VELOCITY_TO_DISTANCE = 80f; private static final float VELOCITY_TO_DISTANCE = 80f;
private static final float SCREEN_FRACTION_MIN_DISTANCE = 0.8f; private static final float SCREEN_FRACTION_MAX_DISTANCE = 0.8f;
private final float mVerticalFlingThresholdPx; private final float mVerticalFlingThresholdPx;
private final float mHorizontalFlingThresholdPx; private final float mHorizontalFlingThresholdPx;
private final float mVerticalSwipeThresholdPx; private final float mVerticalSwipeThresholdPx;
private final float mHorizontalSwipeThresholdPx; private final float mHorizontalSwipeThresholdPx;
private final float mVelocityToDistanceMultiplier;
private boolean mDistanceDirty; private boolean mDistanceDirty;
private DistanceVectors mCachedDistance; private DistanceVectors mCachedDistance;
@@ -44,18 +53,48 @@ class DistanceClassifier extends FalsingClassifier {
DistanceClassifier(FalsingDataProvider dataProvider) { DistanceClassifier(FalsingDataProvider dataProvider) {
super(dataProvider); super(dataProvider);
mVelocityToDistanceMultiplier = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE,
VELOCITY_TO_DISTANCE);
float horizontalFlingThresholdIn = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN,
HORIZONTAL_FLING_THRESHOLD_DISTANCE_IN);
float verticalFlingThresholdIn = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN,
VERTICAL_FLING_THRESHOLD_DISTANCE_IN);
float horizontalSwipeThresholdIn = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN,
HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN);
float verticalSwipeThresholdIn = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN,
VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN);
float screenFractionMaxDistance = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE,
SCREEN_FRACTION_MAX_DISTANCE);
mHorizontalFlingThresholdPx = Math mHorizontalFlingThresholdPx = Math
.min(getWidthPixels() * SCREEN_FRACTION_MIN_DISTANCE, .min(getWidthPixels() * screenFractionMaxDistance,
HORIZONTAL_FLING_THRESHOLD_DISTANCE_IN * getXdpi()); horizontalFlingThresholdIn * getXdpi());
mVerticalFlingThresholdPx = Math mVerticalFlingThresholdPx = Math
.min(getHeightPixels() * SCREEN_FRACTION_MIN_DISTANCE, .min(getHeightPixels() * screenFractionMaxDistance,
VERTICAL_FLING_THRESHOLD_DISTANCE_IN * getYdpi()); verticalFlingThresholdIn * getYdpi());
mHorizontalSwipeThresholdPx = Math mHorizontalSwipeThresholdPx = Math
.min(getWidthPixels() * SCREEN_FRACTION_MIN_DISTANCE, .min(getWidthPixels() * screenFractionMaxDistance,
HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN * getXdpi()); horizontalSwipeThresholdIn * getXdpi());
mVerticalSwipeThresholdPx = Math mVerticalSwipeThresholdPx = Math
.min(getHeightPixels() * SCREEN_FRACTION_MIN_DISTANCE, .min(getHeightPixels() * screenFractionMaxDistance,
VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN * getYdpi()); verticalSwipeThresholdIn * getYdpi());
mDistanceDirty = true; mDistanceDirty = true;
} }
@@ -139,18 +178,18 @@ class DistanceClassifier extends FalsingClassifier {
} }
boolean getPassedFlingThreshold() { boolean getPassedFlingThreshold() {
float dX = this.mDx + this.mVx * VELOCITY_TO_DISTANCE; float dX = this.mDx + this.mVx * mVelocityToDistanceMultiplier;
float dY = this.mDy + this.mVy * VELOCITY_TO_DISTANCE; float dY = this.mDy + this.mVy * mVelocityToDistanceMultiplier;
if (isHorizontal()) { if (isHorizontal()) {
logDebug("Horizontal swipe and fling distance: " + this.mDx + ", " logDebug("Horizontal swipe and fling distance: " + this.mDx + ", "
+ this.mVx * VELOCITY_TO_DISTANCE); + this.mVx * mVelocityToDistanceMultiplier);
logDebug("Threshold: " + mHorizontalFlingThresholdPx); logDebug("Threshold: " + mHorizontalFlingThresholdPx);
return Math.abs(dX) >= mHorizontalFlingThresholdPx; return Math.abs(dX) >= mHorizontalFlingThresholdPx;
} }
logDebug("Vertical swipe and fling distance: " + this.mDy + ", " logDebug("Vertical swipe and fling distance: " + this.mDy + ", "
+ this.mVy * VELOCITY_TO_DISTANCE); + this.mVy * mVelocityToDistanceMultiplier);
logDebug("Threshold: " + mVerticalFlingThresholdPx); logDebug("Threshold: " + mVerticalFlingThresholdPx);
return Math.abs(dY) >= mVerticalFlingThresholdPx; return Math.abs(dY) >= mVerticalFlingThresholdPx;
} }

View File

@@ -16,10 +16,12 @@
package com.android.systemui.classifier.brightline; package com.android.systemui.classifier.brightline;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD;
import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS; import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS;
import android.hardware.Sensor; import android.hardware.Sensor;
import android.hardware.SensorEvent; import android.hardware.SensorEvent;
import android.provider.DeviceConfig;
import android.view.MotionEvent; import android.view.MotionEvent;
@@ -31,8 +33,9 @@ import android.view.MotionEvent;
*/ */
class ProximityClassifier extends FalsingClassifier { class ProximityClassifier extends FalsingClassifier {
private static final double PERCENT_COVERED_THRESHOLD = 0.1; private static final float PERCENT_COVERED_THRESHOLD = 0.1f;
private final DistanceClassifier mDistanceClassifier; private final DistanceClassifier mDistanceClassifier;
private final float mPercentCoveredThreshold;
private boolean mNear; private boolean mNear;
private long mGestureStartTimeNs; private long mGestureStartTimeNs;
@@ -44,6 +47,11 @@ class ProximityClassifier extends FalsingClassifier {
FalsingDataProvider dataProvider) { FalsingDataProvider dataProvider) {
super(dataProvider); super(dataProvider);
this.mDistanceClassifier = distanceClassifier; this.mDistanceClassifier = distanceClassifier;
mPercentCoveredThreshold = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD,
PERCENT_COVERED_THRESHOLD);
} }
@Override @Override
@@ -107,7 +115,7 @@ class ProximityClassifier extends FalsingClassifier {
logInfo("Percent of gesture in proximity: " + mPercentNear); logInfo("Percent of gesture in proximity: " + mPercentNear);
if (mPercentNear > PERCENT_COVERED_THRESHOLD) { if (mPercentNear > mPercentCoveredThreshold) {
return !mDistanceClassifier.isLongSwipe(); return !mDistanceClassifier.isLongSwipe();
} }

View File

@@ -16,7 +16,13 @@
package com.android.systemui.classifier.brightline; package com.android.systemui.classifier.brightline;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE;
import android.graphics.Point; import android.graphics.Point;
import android.provider.DeviceConfig;
import android.view.MotionEvent; import android.view.MotionEvent;
import java.util.ArrayList; import java.util.ArrayList;
@@ -37,8 +43,34 @@ class ZigZagClassifier extends FalsingClassifier {
private static final float MAX_X_SECONDARY_DEVIANCE = .3f; private static final float MAX_X_SECONDARY_DEVIANCE = .3f;
private static final float MAX_Y_SECONDARY_DEVIANCE = .3f; private static final float MAX_Y_SECONDARY_DEVIANCE = .3f;
private final float mMaxXPrimaryDeviance;
private final float mMaxYPrimaryDeviance;
private final float mMaxXSecondaryDeviance;
private final float mMaxYSecondaryDeviance;
ZigZagClassifier(FalsingDataProvider dataProvider) { ZigZagClassifier(FalsingDataProvider dataProvider) {
super(dataProvider); super(dataProvider);
mMaxXPrimaryDeviance = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE,
MAX_X_PRIMARY_DEVIANCE);
mMaxYPrimaryDeviance = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE,
MAX_Y_PRIMARY_DEVIANCE);
mMaxXSecondaryDeviance = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE,
MAX_X_SECONDARY_DEVIANCE);
mMaxYSecondaryDeviance = DeviceConfig.getFloat(
DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE,
MAX_Y_SECONDARY_DEVIANCE);
} }
@Override @Override
@@ -98,11 +130,11 @@ class ZigZagClassifier extends FalsingClassifier {
float maxXDeviance; float maxXDeviance;
float maxYDeviance; float maxYDeviance;
if (actualDx > actualDy) { if (actualDx > actualDy) {
maxXDeviance = MAX_X_PRIMARY_DEVIANCE * totalDistanceIn * getXdpi(); maxXDeviance = mMaxXPrimaryDeviance * totalDistanceIn * getXdpi();
maxYDeviance = MAX_Y_SECONDARY_DEVIANCE * totalDistanceIn * getYdpi(); maxYDeviance = mMaxYSecondaryDeviance * totalDistanceIn * getYdpi();
} else { } else {
maxXDeviance = MAX_X_SECONDARY_DEVIANCE * totalDistanceIn * getXdpi(); maxXDeviance = mMaxXSecondaryDeviance * totalDistanceIn * getXdpi();
maxYDeviance = MAX_Y_PRIMARY_DEVIANCE * totalDistanceIn * getYdpi(); maxYDeviance = mMaxYPrimaryDeviance * totalDistanceIn * getYdpi();
} }
logDebug("Straightness Deviance: (" + devianceX + "," + devianceY + ") vs " logDebug("Straightness Deviance: (" + devianceX + "," + devianceY + ") vs "