From 0b613298f681c0030e5e082b0a74ab95b9d9e8d6 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Thu, 8 Apr 2021 13:29:02 -0400 Subject: [PATCH] Register side swipes on the QS with the FalsingManager. Fixes: 184843242 Test: manual && atest SystemUITests Change-Id: I6141996e1fdb385d2578a4e56eb1df7e7b5bd6bc --- .../systemui/classifier/Classifier.java | 4 +- .../classifier/DistanceClassifier.java | 3 +- .../classifier/ProximityClassifier.java | 3 +- .../systemui/classifier/TypeClassifier.java | 4 ++ .../systemui/qs/QSPanelController.java | 20 ++++++++- .../classifier/DistanceClassifierTest.java | 8 ++++ .../classifier/TypeClassifierTest.java | 43 +++++++++++++++++++ .../systemui/qs/QSPanelControllerTest.java | 4 +- 8 files changed, 84 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java b/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java index 6a012ebdd1e7a..6f70672dbb54e 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java @@ -42,6 +42,7 @@ public abstract class Classifier { public static final int QS_COLLAPSE = 12; public static final int UDFPS_AUTHENTICATION = 13; public static final int DISABLED_UDFPS_AFFORDANCE = 14; + public static final int QS_SWIPE = 15; @IntDef({ QUICK_SETTINGS, @@ -59,7 +60,8 @@ public abstract class Classifier { QS_COLLAPSE, BRIGHTNESS_SLIDER, UDFPS_AUTHENTICATION, - DISABLED_UDFPS_AFFORDANCE + DISABLED_UDFPS_AFFORDANCE, + QS_SWIPE }) @Retention(RetentionPolicy.SOURCE) public @interface InteractionType {} diff --git a/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java index a4e1637e0de06..229801074246b 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java @@ -155,7 +155,8 @@ class DistanceClassifier extends FalsingClassifier { || interactionType == SHADE_DRAG || interactionType == QS_COLLAPSE || interactionType == Classifier.UDFPS_AUTHENTICATION - || interactionType == Classifier.DISABLED_UDFPS_AFFORDANCE) { + || interactionType == Classifier.DISABLED_UDFPS_AFFORDANCE + || interactionType == Classifier.QS_SWIPE) { return Result.passed(0); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java index 3bc24c734a606..72d4303dc0efd 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java @@ -19,6 +19,7 @@ package com.android.systemui.classifier; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD; import static com.android.systemui.classifier.Classifier.BRIGHTNESS_SLIDER; import static com.android.systemui.classifier.Classifier.QS_COLLAPSE; +import static com.android.systemui.classifier.Classifier.QS_SWIPE; import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS; import android.provider.DeviceConfig; @@ -118,7 +119,7 @@ class ProximityClassifier extends FalsingClassifier { @Classifier.InteractionType int interactionType, double historyBelief, double historyConfidence) { if (interactionType == QUICK_SETTINGS || interactionType == BRIGHTNESS_SLIDER - || interactionType == QS_COLLAPSE) { + || interactionType == QS_COLLAPSE || interactionType == QS_SWIPE) { return Result.passed(0); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java index 1042516ebecfc..c2ad7e6387d66 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java @@ -24,6 +24,7 @@ import static com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS; import static com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN; import static com.android.systemui.classifier.Classifier.PULSE_EXPAND; import static com.android.systemui.classifier.Classifier.QS_COLLAPSE; +import static com.android.systemui.classifier.Classifier.QS_SWIPE; import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS; import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE; import static com.android.systemui.classifier.Classifier.SHADE_DRAG; @@ -85,6 +86,9 @@ public class TypeClassifier extends FalsingClassifier { case QS_COLLAPSE: wrongDirection = !vertical || !up; break; + case QS_SWIPE: + wrongDirection = vertical; + break; default: wrongDirection = true; break; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index 5b6b5dfd123db..93ccfc7288e78 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -16,12 +16,14 @@ package com.android.systemui.qs; +import static com.android.systemui.classifier.Classifier.QS_SWIPE; import static com.android.systemui.media.dagger.MediaModule.QS_PANEL; import static com.android.systemui.qs.QSPanel.QS_SHOW_BRIGHTNESS; import static com.android.systemui.qs.dagger.QSFragmentModule.QS_USING_MEDIA_PLAYER; import android.annotation.NonNull; import android.content.res.Configuration; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -31,6 +33,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.dump.DumpManager; import com.android.systemui.media.MediaHierarchyManager; import com.android.systemui.media.MediaHost; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.customize.QSCustomizerController; @@ -58,6 +61,7 @@ public class QSPanelController extends QSPanelControllerBase { private final TunerService mTunerService; private final QSCustomizerController mQsCustomizerController; private final QSTileRevealController.Factory mQsTileRevealControllerFactory; + private final FalsingManager mFalsingManager; private final BrightnessController mBrightnessController; private final BrightnessSlider.Factory mBrightnessSliderFactory; private final BrightnessSlider mBrightnessSlider; @@ -81,6 +85,16 @@ public class QSPanelController extends QSPanelControllerBase { private final BrightnessMirrorController.BrightnessMirrorListener mBrightnessMirrorListener = mirror -> updateBrightnessMirror(); + private View.OnTouchListener mTileLayoutTouchListener = new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (event.getActionMasked() == MotionEvent.ACTION_UP) { + mFalsingManager.isFalseTouch(QS_SWIPE); + } + return false; + } + }; + @Inject QSPanelController(QSPanel view, QSSecurityFooter qsSecurityFooter, TunerService tunerService, QSTileHost qstileHost, QSCustomizerController qsCustomizerController, @@ -89,7 +103,7 @@ public class QSPanelController extends QSPanelControllerBase { QSTileRevealController.Factory qsTileRevealControllerFactory, DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory, - BrightnessSlider.Factory brightnessSliderFactory, + BrightnessSlider.Factory brightnessSliderFactory, FalsingManager falsingManager, FeatureFlags featureFlags) { super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, uiEventLogger, qsLogger, dumpManager, featureFlags); @@ -97,6 +111,7 @@ public class QSPanelController extends QSPanelControllerBase { mTunerService = tunerService; mQsCustomizerController = qsCustomizerController; mQsTileRevealControllerFactory = qsTileRevealControllerFactory; + mFalsingManager = falsingManager; mQsSecurityFooter.setHostEnvironment(qstileHost); mBrightnessSliderFactory = brightnessSliderFactory; @@ -133,6 +148,9 @@ public class QSPanelController extends QSPanelControllerBase { if (mBrightnessMirrorController != null) { mBrightnessMirrorController.addCallback(mBrightnessMirrorListener); } + + ((PagedTileLayout) mView.createRegularTileLayout()) + .setOnTouchListener(mTileLayoutTouchListener); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/DistanceClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/DistanceClassifierTest.java index c9124194839f2..8e00d10a7d396 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/DistanceClassifierTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/DistanceClassifierTest.java @@ -17,6 +17,7 @@ package com.android.systemui.classifier; import static com.android.systemui.classifier.Classifier.BRIGHTNESS_SLIDER; +import static com.android.systemui.classifier.Classifier.QS_SWIPE; import static com.google.common.truth.Truth.assertThat; @@ -103,4 +104,11 @@ public class DistanceClassifierTest extends ClassifierTest { assertThat(mClassifier.classifyGesture(BRIGHTNESS_SLIDER, 0.5, 1).isFalse()) .isFalse(); } + + @Test + public void testPass_QsSwipeAlwaysPasses() { + mClassifier.onTouchEvent(appendDownEvent(1, 1)); + assertThat(mClassifier.classifyGesture(QS_SWIPE, 0.5, 1).isFalse()) + .isFalse(); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/TypeClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/TypeClassifierTest.java index 32537b45fd02a..1d61e29cad351 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/TypeClassifierTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/TypeClassifierTest.java @@ -22,6 +22,7 @@ import static com.android.systemui.classifier.Classifier.LEFT_AFFORDANCE; import static com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS; import static com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN; import static com.android.systemui.classifier.Classifier.PULSE_EXPAND; +import static com.android.systemui.classifier.Classifier.QS_SWIPE; import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS; import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE; import static com.android.systemui.classifier.Classifier.UNLOCK; @@ -320,4 +321,46 @@ public class TypeClassifierTest extends ClassifierTest { when(mDataProvider.isRight()).thenReturn(true); assertThat(mClassifier.classifyGesture(BRIGHTNESS_SLIDER, 0.5, 0).isFalse()).isTrue(); } + + @Test + public void testPass_QsSwipe() { + when(mDataProvider.isVertical()).thenReturn(false); + + when(mDataProvider.isUp()).thenReturn(false); // up and right should cause no effect. + when(mDataProvider.isRight()).thenReturn(false); + assertThat(mClassifier.classifyGesture(QS_SWIPE, 0.5, 0).isFalse()).isFalse(); + + when(mDataProvider.isUp()).thenReturn(true); + when(mDataProvider.isRight()).thenReturn(false); + assertThat(mClassifier.classifyGesture(QS_SWIPE, 0.5, 0).isFalse()).isFalse(); + + when(mDataProvider.isUp()).thenReturn(false); + when(mDataProvider.isRight()).thenReturn(true); + assertThat(mClassifier.classifyGesture(QS_SWIPE, 0.5, 0).isFalse()).isFalse(); + + when(mDataProvider.isUp()).thenReturn(true); + when(mDataProvider.isRight()).thenReturn(true); + assertThat(mClassifier.classifyGesture(QS_SWIPE, 0.5, 0).isFalse()).isFalse(); + } + + @Test + public void testFalse_QsSwipe() { + when(mDataProvider.isVertical()).thenReturn(true); + + when(mDataProvider.isUp()).thenReturn(false); // up and right should cause no effect. + when(mDataProvider.isRight()).thenReturn(false); + assertThat(mClassifier.classifyGesture(QS_SWIPE, 0.5, 0).isFalse()).isTrue(); + + when(mDataProvider.isUp()).thenReturn(true); + when(mDataProvider.isRight()).thenReturn(false); + assertThat(mClassifier.classifyGesture(QS_SWIPE, 0.5, 0).isFalse()).isTrue(); + + when(mDataProvider.isUp()).thenReturn(false); + when(mDataProvider.isRight()).thenReturn(true); + assertThat(mClassifier.classifyGesture(QS_SWIPE, 0.5, 0).isFalse()).isTrue(); + + when(mDataProvider.isUp()).thenReturn(true); + when(mDataProvider.isRight()).thenReturn(true); + assertThat(mClassifier.classifyGesture(QS_SWIPE, 0.5, 0).isFalse()).isTrue(); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java index bacc4930815be..53eae8c46d2fe 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java @@ -32,6 +32,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.testing.UiEventLoggerFake; import com.android.systemui.SysuiTestCase; +import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.dump.DumpManager; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.qs.QSTileView; @@ -94,6 +95,7 @@ public class QSPanelControllerTest extends SysuiTestCase { QSTileView mQSTileView; @Mock PagedTileLayout mPagedTileLayout; + FalsingManagerFake mFalsingManager = new FalsingManagerFake(); @Mock FeatureFlags mFeatureFlags; @@ -121,7 +123,7 @@ public class QSPanelControllerTest extends SysuiTestCase { mQSTileHost, mQSCustomizerController, true, mMediaHost, mQSTileRevealControllerFactory, mDumpManager, mMetricsLogger, mUiEventLogger, mQSLogger, mBrightnessControllerFactory, mToggleSliderViewControllerFactory, - mFeatureFlags + mFalsingManager, mFeatureFlags ); mController.init();