Merge "Avoid falsing when the phone is unlocked." into sc-dev
This commit is contained in:
@@ -31,6 +31,7 @@ import com.android.systemui.classifier.FalsingDataProvider.SessionListener;
|
||||
import com.android.systemui.dagger.qualifiers.TestHarness;
|
||||
import com.android.systemui.dock.DockManager;
|
||||
import com.android.systemui.plugins.FalsingManager;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.util.sensors.ThresholdSensor;
|
||||
|
||||
import java.io.FileDescriptor;
|
||||
@@ -67,6 +68,7 @@ public class BrightLineFalsingManager implements FalsingManager {
|
||||
private final SingleTapClassifier mSingleTapClassifier;
|
||||
private final DoubleTapClassifier mDoubleTapClassifier;
|
||||
private final HistoryTracker mHistoryTracker;
|
||||
private final KeyguardStateController mKeyguardStateController;
|
||||
private final boolean mTestHarness;
|
||||
private final MetricsLogger mMetricsLogger;
|
||||
private int mIsFalseTouchCalls;
|
||||
@@ -113,7 +115,8 @@ public class BrightLineFalsingManager implements FalsingManager {
|
||||
DockManager dockManager, MetricsLogger metricsLogger,
|
||||
@Named(BRIGHT_LINE_GESTURE_CLASSIFERS) Set<FalsingClassifier> classifiers,
|
||||
SingleTapClassifier singleTapClassifier, DoubleTapClassifier doubleTapClassifier,
|
||||
HistoryTracker historyTracker, @TestHarness boolean testHarness) {
|
||||
HistoryTracker historyTracker, KeyguardStateController keyguardStateController,
|
||||
@TestHarness boolean testHarness) {
|
||||
mDataProvider = falsingDataProvider;
|
||||
mDockManager = dockManager;
|
||||
mMetricsLogger = metricsLogger;
|
||||
@@ -121,6 +124,7 @@ public class BrightLineFalsingManager implements FalsingManager {
|
||||
mSingleTapClassifier = singleTapClassifier;
|
||||
mDoubleTapClassifier = doubleTapClassifier;
|
||||
mHistoryTracker = historyTracker;
|
||||
mKeyguardStateController = keyguardStateController;
|
||||
mTestHarness = testHarness;
|
||||
|
||||
mDataProvider.addSessionListener(mSessionListener);
|
||||
@@ -134,6 +138,10 @@ public class BrightLineFalsingManager implements FalsingManager {
|
||||
|
||||
@Override
|
||||
public boolean isFalseTouch(@Classifier.InteractionType int interactionType) {
|
||||
if (skipFalsing()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean result;
|
||||
|
||||
mDataProvider.setInteractionType(interactionType);
|
||||
@@ -195,6 +203,10 @@ public class BrightLineFalsingManager implements FalsingManager {
|
||||
|
||||
@Override
|
||||
public boolean isFalseTap(boolean robustCheck, double falsePenalty) {
|
||||
if (skipFalsing()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
FalsingClassifier.Result singleTapResult =
|
||||
mSingleTapClassifier.isTap(mDataProvider.getRecentMotionEvents());
|
||||
mPriorResults = Collections.singleton(singleTapResult);
|
||||
@@ -233,6 +245,10 @@ public class BrightLineFalsingManager implements FalsingManager {
|
||||
|
||||
@Override
|
||||
public boolean isFalseDoubleTap() {
|
||||
if (skipFalsing()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
FalsingClassifier.Result result = mDoubleTapClassifier.classifyGesture();
|
||||
mPriorResults = Collections.singleton(result);
|
||||
if (result.isFalse()) {
|
||||
@@ -246,6 +262,10 @@ public class BrightLineFalsingManager implements FalsingManager {
|
||||
return result.isFalse();
|
||||
}
|
||||
|
||||
private boolean skipFalsing() {
|
||||
return !mKeyguardStateController.isShowing();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
|
||||
// TODO: some of these classifiers might allow us to abort early, meaning we don't have to
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.android.systemui.dagger.SysUISingleton;
|
||||
import com.android.systemui.plugins.FalsingManager;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.StatusBarState;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.util.sensors.ProximitySensor;
|
||||
import com.android.systemui.util.sensors.ThresholdSensor;
|
||||
import com.android.systemui.util.time.SystemClock;
|
||||
@@ -48,6 +49,7 @@ class FalsingCollectorImpl implements FalsingCollector {
|
||||
private final HistoryTracker mHistoryTracker;
|
||||
private final ProximitySensor mProximitySensor;
|
||||
private final StatusBarStateController mStatusBarStateController;
|
||||
private final KeyguardStateController mKeyguardStateController;
|
||||
private final SystemClock mSystemClock;
|
||||
|
||||
private int mState;
|
||||
@@ -87,13 +89,14 @@ class FalsingCollectorImpl implements FalsingCollector {
|
||||
FalsingCollectorImpl(FalsingDataProvider falsingDataProvider, FalsingManager falsingManager,
|
||||
KeyguardUpdateMonitor keyguardUpdateMonitor, HistoryTracker historyTracker,
|
||||
ProximitySensor proximitySensor, StatusBarStateController statusBarStateController,
|
||||
SystemClock systemClock) {
|
||||
KeyguardStateController keyguardStateController, SystemClock systemClock) {
|
||||
mFalsingDataProvider = falsingDataProvider;
|
||||
mFalsingManager = falsingManager;
|
||||
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
|
||||
mHistoryTracker = historyTracker;
|
||||
mProximitySensor = proximitySensor;
|
||||
mStatusBarStateController = statusBarStateController;
|
||||
mKeyguardStateController = keyguardStateController;
|
||||
mSystemClock = systemClock;
|
||||
|
||||
|
||||
@@ -255,6 +258,10 @@ class FalsingCollectorImpl implements FalsingCollector {
|
||||
|
||||
@Override
|
||||
public void onTouchEvent(MotionEvent ev) {
|
||||
if (!mKeyguardStateController.isShowing()) {
|
||||
avoidGesture();
|
||||
return;
|
||||
}
|
||||
// We delay processing down events to see if another component wants to process them.
|
||||
// If #avoidGesture is called after a MotionEvent.ACTION_DOWN, all following motion events
|
||||
// will be ignored by the collector until another MotionEvent.ACTION_DOWN is passed in.
|
||||
@@ -276,8 +283,8 @@ class FalsingCollectorImpl implements FalsingCollector {
|
||||
|
||||
@Override
|
||||
public void avoidGesture() {
|
||||
mAvoidGesture = true;
|
||||
if (mPendingDownEvent != null) {
|
||||
mAvoidGesture = true;
|
||||
mPendingDownEvent.recycle();
|
||||
mPendingDownEvent = null;
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ import com.android.internal.logging.testing.FakeMetricsLogger;
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.classifier.FalsingDataProvider.GestureCompleteListener;
|
||||
import com.android.systemui.dock.DockManagerFake;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.util.concurrency.FakeExecutor;
|
||||
import com.android.systemui.util.time.FakeSystemClock;
|
||||
|
||||
@@ -71,7 +72,10 @@ public class BrightLineClassifierTest extends SysuiTestCase {
|
||||
private FalsingClassifier mClassifierB;
|
||||
private final List<MotionEvent> mMotionEventList = new ArrayList<>();
|
||||
@Mock
|
||||
private HistoryTracker mHistoryTracker;;
|
||||
private HistoryTracker mHistoryTracker;
|
||||
@Mock
|
||||
private KeyguardStateController mKeyguardStateController;
|
||||
|
||||
private final FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
|
||||
|
||||
private final FalsingClassifier.Result mFalsedResult = FalsingClassifier.Result.falsed(1, "");
|
||||
@@ -88,9 +92,10 @@ public class BrightLineClassifierTest extends SysuiTestCase {
|
||||
mClassifiers.add(mClassifierA);
|
||||
mClassifiers.add(mClassifierB);
|
||||
when(mFalsingDataProvider.getRecentMotionEvents()).thenReturn(mMotionEventList);
|
||||
when(mKeyguardStateController.isShowing()).thenReturn(true);
|
||||
mBrightLineFalsingManager = new BrightLineFalsingManager(mFalsingDataProvider, mDockManager,
|
||||
mMetricsLogger, mClassifiers, mSingleTapClassfier, mDoubleTapClassifier,
|
||||
mHistoryTracker, false);
|
||||
mHistoryTracker, mKeyguardStateController, false);
|
||||
|
||||
|
||||
ArgumentCaptor<GestureCompleteListener> gestureCompleteListenerCaptor =
|
||||
@@ -120,7 +125,7 @@ public class BrightLineClassifierTest extends SysuiTestCase {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsFalseTouch_ClassffiersPass() {
|
||||
public void testIsFalseTouch_ClassifiersPass() {
|
||||
assertThat(mBrightLineFalsingManager.isFalseTouch(0)).isFalse();
|
||||
}
|
||||
|
||||
@@ -233,4 +238,18 @@ public class BrightLineClassifierTest extends SysuiTestCase {
|
||||
|
||||
assertThat(mFakeExecutor.numPending()).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoFalsingUnlocked() {
|
||||
when(mKeyguardStateController.isShowing()).thenReturn(false);
|
||||
|
||||
when(mClassifierA.classifyGesture(anyDouble(), anyDouble())).thenReturn(mFalsedResult);
|
||||
assertThat(mBrightLineFalsingManager.isFalseTouch(0)).isFalse();
|
||||
|
||||
when(mSingleTapClassfier.isTap(mMotionEventList)).thenReturn(mFalsedResult);
|
||||
assertThat(mBrightLineFalsingManager.isFalseTap(false, 0)).isFalse();
|
||||
|
||||
when(mDoubleTapClassifier.classifyGesture()).thenReturn(mFalsedResult);
|
||||
assertThat(mBrightLineFalsingManager.isFalseDoubleTap()).isFalse();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.StatusBarState;
|
||||
import com.android.systemui.statusbar.SysuiStatusBarStateController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.util.sensors.ProximitySensor;
|
||||
import com.android.systemui.util.sensors.ThresholdSensor;
|
||||
import com.android.systemui.util.time.FakeSystemClock;
|
||||
@@ -62,16 +63,19 @@ public class FalsingCollectorImplTest extends SysuiTestCase {
|
||||
private ProximitySensor mProximitySensor;
|
||||
@Mock
|
||||
private SysuiStatusBarStateController mStatusBarStateController;
|
||||
@Mock
|
||||
private KeyguardStateController mKeyguardStateController;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD);
|
||||
when(mKeyguardStateController.isShowing()).thenReturn(true);
|
||||
|
||||
mFalsingCollector = new FalsingCollectorImpl(mFalsingDataProvider, mFalsingManager,
|
||||
mKeyguardUpdateMonitor, mHistoryTracker, mProximitySensor,
|
||||
mStatusBarStateController, new FakeSystemClock());
|
||||
mStatusBarStateController, mKeyguardStateController, new FakeSystemClock());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -159,4 +163,20 @@ public class FalsingCollectorImplTest extends SysuiTestCase {
|
||||
mFalsingCollector.onTouchEvent(up);
|
||||
verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAvoidUnlocked() {
|
||||
MotionEvent down = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
|
||||
MotionEvent up = MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, 0, 0, 0);
|
||||
|
||||
when(mKeyguardStateController.isShowing()).thenReturn(false);
|
||||
|
||||
// Nothing passed initially
|
||||
mFalsingCollector.onTouchEvent(down);
|
||||
verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
|
||||
|
||||
// Up event would normally flush the up event.
|
||||
mFalsingCollector.onTouchEvent(up);
|
||||
verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user