Refactor parts of FalsingManager into FalsingCollector

This CL separates out the two roles of the FalsingManager. It
introduces the FalsingCollector, used by SystemUI to report events
that may be interesting to Falsing, such as touch events, sensor
events, and general user actions.

The FalsingManager, meanwhile, continues to support the methods

This helps breakup the monolithic FalsingManger into more manageable
pieces, reducing the API surface area of FalsingManager significantly.

Bug: 172655679
Test: atest SystemUITests && manual
Change-Id: I92f8e3747f5c4a04eaa64e1a8b626c2a07c480aa
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index 014d73f..2ea0c22 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -33,6 +33,13 @@
     srcs: ["src/com/android/systemui/EventLogTags.logtags"],
 }
 
+java_library {
+    name: "SystemUI-sensors",
+    srcs: [
+        "src/com/android/systemui/util/sensors/ThresholdSensor.java",
+    ]
+}
+
 android_library {
     name: "SystemUI-core",
     srcs: [
diff --git a/packages/SystemUI/plugin/Android.bp b/packages/SystemUI/plugin/Android.bp
index df5561a..ab4f800 100644
--- a/packages/SystemUI/plugin/Android.bp
+++ b/packages/SystemUI/plugin/Android.bp
@@ -19,7 +19,8 @@
     srcs: ["src/**/*.java"],
 
     static_libs: [
-        "PluginCoreLib"
+        "PluginCoreLib",
+        "SystemUI-sensors",
     ],
 
 }
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java
index 0f94bca..6e86f26 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java
@@ -20,6 +20,7 @@
 import android.view.MotionEvent;
 
 import com.android.systemui.plugins.annotations.ProvidesInterface;
+import com.android.systemui.util.sensors.ThresholdSensor;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -35,12 +36,6 @@
 
     void onSuccessfulUnlock();
 
-    void onNotificationActive();
-
-    void setShowingAod(boolean showingAod);
-
-    void onNotificatonStartDraggingDown();
-
     boolean isUnlockingDisabled();
 
     /** Returns true if the gesture should be rejected. */
@@ -82,66 +77,21 @@
      */
     boolean isFalseDoubleTap();
 
-    void onNotificatonStopDraggingDown();
-
-    void setNotificationExpanded();
-
     boolean isClassifierEnabled();
 
-    void onQsDown();
-
-    void setQsExpanded(boolean expanded);
-
     boolean shouldEnforceBouncer();
 
-    void onTrackingStarted(boolean secure);
-
-    void onTrackingStopped();
-
-    void onLeftAffordanceOn();
-
-    void onCameraOn();
-
-    void onAffordanceSwipingStarted(boolean rightCorner);
-
-    void onAffordanceSwipingAborted();
-
-    void onStartExpandingFromPulse();
-
-    void onExpansionFromPulseStopped();
-
     Uri reportRejectedTouch();
 
-    void onScreenOnFromTouch();
-
     boolean isReportingEnabled();
 
-    void onUnlockHintStarted();
-
-    void onCameraHintStarted();
-
-    void onLeftAffordanceHintStarted();
-
-    void onScreenTurningOn();
-
-    void onScreenOff();
-
-    void onNotificationStopDismissing();
-
-    void onNotificationDismissed();
-
-    void onNotificationStartDismissing();
-
-    void onNotificationDoubleTap(boolean accepted, float dx, float dy);
-
-    void onBouncerShown();
-
-    void onBouncerHidden();
-
     void onTouchEvent(MotionEvent ev, int width, int height);
 
     /** From com.android.systemui.Dumpable. */
     void dump(FileDescriptor fd, PrintWriter pw, String[] args);
 
     void cleanup();
+
+    /** Call to report a ProximityEvent to the FalsingManager. */
+    void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent);
 }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java
new file mode 100644
index 0000000..c05ce93
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java
@@ -0,0 +1,121 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.classifier;
+
+import android.view.MotionEvent;
+
+/**
+ * Defines a class that can be used to ingest system events for later processing.
+ */
+public interface FalsingCollector {
+    /** */
+    void onSuccessfulUnlock();
+
+    /** */
+    void onNotificationActive();
+
+    /** */
+    void setShowingAod(boolean showingAod);
+
+    /** */
+    void onNotificationStartDraggingDown();
+
+    /** */
+    void onNotificationStopDraggingDown();
+
+    /** */
+    void setNotificationExpanded();
+
+    /** */
+    void onQsDown();
+
+    /** */
+    void setQsExpanded(boolean expanded);
+
+    /** */
+    boolean shouldEnforceBouncer();
+
+    /** */
+    void onTrackingStarted(boolean secure);
+
+    /** */
+    void onTrackingStopped();
+
+    /** */
+    void onLeftAffordanceOn();
+
+    /** */
+    void onCameraOn();
+
+    /** */
+    void onAffordanceSwipingStarted(boolean rightCorner);
+
+    /** */
+    void onAffordanceSwipingAborted();
+
+    /** */
+    void onStartExpandingFromPulse();
+
+    /** */
+    void onExpansionFromPulseStopped();
+
+    /** */
+    void onScreenOnFromTouch();
+
+    /** */
+    boolean isReportingEnabled();
+
+    /** */
+    void onUnlockHintStarted();
+
+    /** */
+    void onCameraHintStarted();
+
+    /** */
+    void onLeftAffordanceHintStarted();
+
+    /** */
+    void onScreenTurningOn();
+
+    /** */
+    void onScreenOff();
+
+    /** */
+    void onNotificationStopDismissing();
+
+    /** */
+    void onNotificationDismissed();
+
+    /** */
+    void onNotificationStartDismissing();
+
+    /** */
+    void onNotificationDoubleTap(boolean accepted, float dx, float dy);
+
+    /** */
+    void onBouncerShown();
+
+    /** */
+    void onBouncerHidden();
+
+    /** */
+    void onTouchEvent(MotionEvent ev, int width, int height);
+
+    /** */
+    void cleanup();
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java
new file mode 100644
index 0000000..a569111
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java
@@ -0,0 +1,152 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.classifier;
+
+import android.view.MotionEvent;
+
+/** */
+public class FalsingCollectorFake implements FalsingCollector {
+    @Override
+    public void onSuccessfulUnlock() {
+    }
+
+    @Override
+    public void onNotificationActive() {
+    }
+
+    @Override
+    public void setShowingAod(boolean showingAod) {
+    }
+
+    @Override
+    public void onNotificationStartDraggingDown() {
+    }
+
+    @Override
+    public void onNotificationStopDraggingDown() {
+    }
+
+    @Override
+    public void setNotificationExpanded() {
+    }
+
+    @Override
+    public void onQsDown() {
+    }
+
+    @Override
+    public void setQsExpanded(boolean expanded) {
+    }
+
+    @Override
+    public boolean shouldEnforceBouncer() {
+        return false;
+    }
+
+    @Override
+    public void onTrackingStarted(boolean secure) {
+    }
+
+    @Override
+    public void onTrackingStopped() {
+    }
+
+    @Override
+    public void onLeftAffordanceOn() {
+    }
+
+    @Override
+    public void onCameraOn() {
+    }
+
+    @Override
+    public void onAffordanceSwipingStarted(boolean rightCorner) {
+    }
+
+    @Override
+    public void onAffordanceSwipingAborted() {
+    }
+
+    @Override
+    public void onStartExpandingFromPulse() {
+    }
+
+    @Override
+    public void onExpansionFromPulseStopped() {
+    }
+
+    @Override
+    public void onScreenOnFromTouch() {
+    }
+
+    @Override
+    public boolean isReportingEnabled() {
+        return false;
+    }
+
+    @Override
+    public void onUnlockHintStarted() {
+    }
+
+    @Override
+    public void onCameraHintStarted() {
+    }
+
+    @Override
+    public void onLeftAffordanceHintStarted() {
+    }
+
+    @Override
+    public void onScreenTurningOn() {
+    }
+
+    @Override
+    public void onScreenOff() {
+    }
+
+    @Override
+    public void onNotificationStopDismissing() {
+    }
+
+    @Override
+    public void onNotificationDismissed() {
+    }
+
+    @Override
+    public void onNotificationStartDismissing() {
+    }
+
+    @Override
+    public void onNotificationDoubleTap(boolean accepted, float dx, float dy) {
+    }
+
+    @Override
+    public void onBouncerShown() {
+    }
+
+    @Override
+    public void onBouncerHidden() {
+    }
+
+    @Override
+    public void onTouchEvent(MotionEvent ev, int width, int height) {
+    }
+
+    @Override
+    public void cleanup() {
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
new file mode 100644
index 0000000..3547392
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
@@ -0,0 +1,321 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.classifier;
+
+import android.hardware.SensorManager;
+import android.hardware.biometrics.BiometricSourceType;
+import android.util.Log;
+import android.view.MotionEvent;
+
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
+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.util.sensors.ProximitySensor;
+import com.android.systemui.util.sensors.ThresholdSensor;
+
+import javax.inject.Inject;
+
+@SysUISingleton
+class FalsingCollectorImpl implements FalsingCollector {
+
+    private static final boolean DEBUG = false;
+    private static final String TAG = "FalsingManager";
+    private static final String PROXIMITY_SENSOR_TAG = "FalsingManager";
+
+    private final FalsingDataProvider mFalsingDataProvider;
+    private final FalsingManager mFalsingManager;
+    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+    private final ProximitySensor mProximitySensor;
+    private final StatusBarStateController mStatusBarStateController;
+
+    private int mState;
+    private boolean mShowingAod;
+    private boolean mScreenOn;
+    private boolean mSessionStarted;
+
+    private final ThresholdSensor.Listener mSensorEventListener = this::onProximityEvent;
+
+    private final StatusBarStateController.StateListener mStatusBarStateListener =
+            new StatusBarStateController.StateListener() {
+                @Override
+                public void onStateChanged(int newState) {
+                    logDebug("StatusBarState=" + StatusBarState.toShortString(newState));
+                    mState = newState;
+                    updateSessionActive();
+                }
+            };
+
+
+    private final KeyguardUpdateMonitorCallback mKeyguardUpdateCallback =
+            new KeyguardUpdateMonitorCallback() {
+                @Override
+                public void onBiometricAuthenticated(int userId,
+                        BiometricSourceType biometricSourceType,
+                        boolean isStrongBiometric) {
+                    if (userId == KeyguardUpdateMonitor.getCurrentUser()
+                            && biometricSourceType == BiometricSourceType.FACE) {
+                        mFalsingDataProvider.setJustUnlockedWithFace(true);
+                    }
+                }
+            };
+
+    @Inject
+    FalsingCollectorImpl(FalsingDataProvider falsingDataProvider, FalsingManager falsingManager,
+            KeyguardUpdateMonitor keyguardUpdateMonitor,
+            ProximitySensor proximitySensor, StatusBarStateController statusBarStateController) {
+        mFalsingDataProvider = falsingDataProvider;
+        mFalsingManager = falsingManager;
+        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
+        mProximitySensor = proximitySensor;
+        mStatusBarStateController = statusBarStateController;
+
+
+        mProximitySensor.setTag(PROXIMITY_SENSOR_TAG);
+        mProximitySensor.setDelay(SensorManager.SENSOR_DELAY_GAME);
+
+        mStatusBarStateController.addCallback(mStatusBarStateListener);
+        mState = mStatusBarStateController.getState();
+
+        mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateCallback);
+    }
+
+    @Override
+    public void onSuccessfulUnlock() {
+        mFalsingManager.onSuccessfulUnlock();
+        sessionEnd();
+    }
+
+    @Override
+    public void onNotificationActive() {
+    }
+
+    @Override
+    public void setShowingAod(boolean showingAod) {
+        mShowingAod = showingAod;
+        updateSessionActive();
+    }
+
+    @Override
+    public void onNotificationStartDraggingDown() {
+        updateInteractionType(Classifier.NOTIFICATION_DRAG_DOWN);
+    }
+
+    @Override
+    public void onNotificationStopDraggingDown() {
+    }
+
+    @Override
+    public void setNotificationExpanded() {
+    }
+
+    @Override
+    public void onQsDown() {
+        updateInteractionType(Classifier.QUICK_SETTINGS);
+    }
+
+    @Override
+    public void setQsExpanded(boolean expanded) {
+        if (expanded) {
+            unregisterSensors();
+        } else if (mSessionStarted) {
+            registerSensors();
+        }
+    }
+
+    @Override
+    public boolean shouldEnforceBouncer() {
+        return false;
+    }
+
+    @Override
+    public void onTrackingStarted(boolean secure) {
+        updateInteractionType(secure ? Classifier.BOUNCER_UNLOCK : Classifier.UNLOCK);
+    }
+
+    @Override
+    public void onTrackingStopped() {
+    }
+
+    @Override
+    public void onLeftAffordanceOn() {
+    }
+
+    @Override
+    public void onCameraOn() {
+    }
+
+    @Override
+    public void onAffordanceSwipingStarted(boolean rightCorner) {
+        updateInteractionType(
+                rightCorner ? Classifier.RIGHT_AFFORDANCE : Classifier.LEFT_AFFORDANCE);
+    }
+
+    @Override
+    public void onAffordanceSwipingAborted() {
+    }
+
+    @Override
+    public void onStartExpandingFromPulse() {
+        updateInteractionType(Classifier.PULSE_EXPAND);
+    }
+
+    @Override
+    public void onExpansionFromPulseStopped() {
+    }
+
+    @Override
+    public void onScreenOnFromTouch() {
+        onScreenTurningOn();
+    }
+
+    @Override
+    public boolean isReportingEnabled() {
+        return false;
+    }
+
+    @Override
+    public void onUnlockHintStarted() {
+    }
+
+    @Override
+    public void onCameraHintStarted() {
+    }
+
+    @Override
+    public void onLeftAffordanceHintStarted() {
+    }
+
+    @Override
+    public void onScreenTurningOn() {
+        mScreenOn = true;
+        updateSessionActive();
+    }
+
+    @Override
+    public void onScreenOff() {
+        mScreenOn = false;
+        updateSessionActive();
+    }
+
+    @Override
+    public void onNotificationStopDismissing() {
+    }
+
+    @Override
+    public void onNotificationDismissed() {
+    }
+
+    @Override
+    public void onNotificationStartDismissing() {
+        updateInteractionType(Classifier.NOTIFICATION_DISMISS);
+    }
+
+    @Override
+    public void onNotificationDoubleTap(boolean accepted, float dx, float dy) {
+    }
+
+    @Override
+    public void onBouncerShown() {
+        unregisterSensors();
+    }
+
+    @Override
+    public void onBouncerHidden() {
+        if (mSessionStarted) {
+            registerSensors();
+        }
+    }
+
+    @Override
+    public void onTouchEvent(MotionEvent ev, int width, int height) {
+        mFalsingDataProvider.onMotionEvent(ev);
+        mFalsingManager.onTouchEvent(ev, width, height);
+    }
+
+    @Override
+    public void cleanup() {
+        unregisterSensors();
+        mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateCallback);
+        mStatusBarStateController.removeCallback(mStatusBarStateListener);
+    }
+
+    private void updateInteractionType(@Classifier.InteractionType int type) {
+        logDebug("InteractionType: " + type);
+        mFalsingDataProvider.setInteractionType(type);
+    }
+
+    private boolean shouldSessionBeActive() {
+        return mScreenOn && (mState == StatusBarState.KEYGUARD) && !mShowingAod;
+    }
+
+    private void updateSessionActive() {
+        if (shouldSessionBeActive()) {
+            sessionStart();
+        } else {
+            sessionEnd();
+        }
+    }
+
+    private void sessionStart() {
+        if (!mSessionStarted && shouldSessionBeActive()) {
+            logDebug("Starting Session");
+            mSessionStarted = true;
+            mFalsingDataProvider.setJustUnlockedWithFace(false);
+            registerSensors();
+            mFalsingDataProvider.onSessionStarted();
+        }
+    }
+
+    private void sessionEnd() {
+        if (mSessionStarted) {
+            logDebug("Ending Session");
+            mSessionStarted = false;
+            unregisterSensors();
+            mFalsingDataProvider.onSessionEnd();
+        }
+    }
+
+    private void registerSensors() {
+        if (!mFalsingDataProvider.isWirelessCharging()) {
+            mProximitySensor.register(mSensorEventListener);
+        }
+    }
+
+    private void unregisterSensors() {
+        mProximitySensor.unregister(mSensorEventListener);
+    }
+
+    private void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
+        // TODO: some of these classifiers might allow us to abort early, meaning we don't have to
+        // make these calls.
+        mFalsingManager.onProximityEvent(proximityEvent);
+    }
+
+
+    static void logDebug(String msg) {
+        logDebug(msg, null);
+    }
+
+    static void logDebug(String msg, Throwable throwable) {
+        if (DEBUG) {
+            Log.d(TAG, msg, throwable);
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java
similarity index 72%
rename from packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java
rename to packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java
index 4681f97..b29871c 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java
@@ -1,5 +1,5 @@
 /*
- * 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,14 +14,17 @@
  * limitations under the License.
  */
 
-package com.android.systemui.classifier.brightline;
+package com.android.systemui.classifier;
 
 import android.util.DisplayMetrics;
 import android.view.MotionEvent;
 import android.view.MotionEvent.PointerCoords;
 import android.view.MotionEvent.PointerProperties;
 
-import com.android.systemui.classifier.Classifier;
+import com.android.systemui.classifier.brightline.BrightLineFalsingManager;
+import com.android.systemui.classifier.brightline.FalsingClassifier;
+import com.android.systemui.classifier.brightline.TimeLimitedMotionEventBuffer;
+import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.statusbar.policy.BatteryController;
 import com.android.systemui.util.time.SystemClock;
 
@@ -36,6 +39,7 @@
 /**
  * Acts as a cache and utility class for FalsingClassifiers.
  */
+@SysUISingleton
 public class FalsingDataProvider {
 
     private static final long MOTION_EVENT_AGE_MS = 1000;
@@ -48,6 +52,7 @@
     private final SystemClock mSystemClock;
     private final float mXdpi;
     private final float mYdpi;
+    private final List<SessionListener> mSessionListeners = new ArrayList<>();
 
     private @Classifier.InteractionType int mInteractionType;
     private final Deque<TimeLimitedMotionEventBuffer> mExtendedMotionEvents = new LinkedList<>();
@@ -57,9 +62,9 @@
     private boolean mDirty = true;
 
     private float mAngle = 0;
-    private MotionEvent mFirstActualMotionEvent;
     private MotionEvent mFirstRecentMotionEvent;
     private MotionEvent mLastMotionEvent;
+    private boolean mJustUnlockedWithFace;
 
     @Inject
     public FalsingDataProvider(DisplayMetrics displayMetrics, BatteryController batteryController,
@@ -76,10 +81,6 @@
     }
 
     void onMotionEvent(MotionEvent motionEvent) {
-        if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) {
-            mFirstActualMotionEvent = motionEvent;
-        }
-
         List<MotionEvent> motionEvents = unpackMotionEvent(motionEvent);
         FalsingClassifier.logDebug("Unpacked into: " + motionEvents.size());
         if (BrightLineFalsingManager.DEBUG) {
@@ -103,29 +104,29 @@
     }
 
     /** Returns screen width in pixels. */
-    int getWidthPixels() {
+    public int getWidthPixels() {
         return mWidthPixels;
     }
 
     /** Returns screen height in pixels. */
-    int getHeightPixels() {
+    public int getHeightPixels() {
         return mHeightPixels;
     }
 
-    float getXdpi() {
+    public float getXdpi() {
         return mXdpi;
     }
 
-    float getYdpi() {
+    public float getYdpi() {
         return mYdpi;
     }
 
-    List<MotionEvent> getRecentMotionEvents() {
+    public List<MotionEvent> getRecentMotionEvents() {
         return mRecentMotionEvents;
     }
 
     /** Returns recent gestures, exclusive of the most recent gesture. Newer gestures come first. */
-    Queue<? extends List<MotionEvent>> getHistoricalMotionEvents() {
+    public Queue<? extends List<MotionEvent>> getHistoricalMotionEvents() {
         long nowMs = mSystemClock.uptimeMillis();
 
         mExtendedMotionEvents.removeIf(
@@ -137,31 +138,38 @@
     /**
      * interactionType is defined by {@link com.android.systemui.classifier.Classifier}.
      */
-    final void setInteractionType(@Classifier.InteractionType int interactionType) {
+    public final void setInteractionType(@Classifier.InteractionType int interactionType) {
         if (mInteractionType != interactionType) {
             mInteractionType = interactionType;
             mDirty = true;
         }
     }
 
+    /**
+     * Returns true if new data has been supplied since the last time this class has been accessed.
+     */
     public boolean isDirty() {
         return mDirty;
     }
 
-    final int getInteractionType() {
+    /** Return the interaction type that is being compared against for falsing. */
+    public  final int getInteractionType() {
         return mInteractionType;
     }
 
-    MotionEvent getFirstActualMotionEvent() {
-        return mFirstActualMotionEvent;
-    }
-
-    MotionEvent getFirstRecentMotionEvent() {
+    /**
+     * Get the first recorded {@link MotionEvent} of the most recent gesture.
+     *
+     * Note that MotionEvents are not kept forever. As a gesture gets longer in duration, older
+     * MotionEvents may expire and be ejected.
+     */
+    public MotionEvent getFirstRecentMotionEvent() {
         recalculateData();
         return mFirstRecentMotionEvent;
     }
 
-    MotionEvent getLastMotionEvent() {
+    /** Get the last recorded {@link MotionEvent}. */
+    public MotionEvent getLastMotionEvent() {
         recalculateData();
         return mLastMotionEvent;
     }
@@ -171,12 +179,13 @@
      *
      * The angle will be in radians, always be between 0 and 2*PI, inclusive.
      */
-    float getAngle() {
+    public float getAngle() {
         recalculateData();
         return mAngle;
     }
 
-    boolean isHorizontal() {
+    /** Returns if the most recent gesture is more horizontal than vertical. */
+    public boolean isHorizontal() {
         recalculateData();
         if (mRecentMotionEvents.isEmpty()) {
             return false;
@@ -186,7 +195,13 @@
                 .abs(mFirstRecentMotionEvent.getY() - mLastMotionEvent.getY());
     }
 
-    boolean isRight() {
+    /**
+     * Is the most recent gesture more right than left.
+     *
+     * This does not mean the gesture is mostly horizontal. Simply that it ended at least one pixel
+     * to the right of where it started. See also {@link #isHorizontal()}.
+     */
+    public boolean isRight() {
         recalculateData();
         if (mRecentMotionEvents.isEmpty()) {
             return false;
@@ -195,11 +210,18 @@
         return mLastMotionEvent.getX() > mFirstRecentMotionEvent.getX();
     }
 
-    boolean isVertical() {
+    /** Returns if the most recent gesture is more vertical than horizontal. */
+    public boolean isVertical() {
         return !isHorizontal();
     }
 
-    boolean isUp() {
+    /**
+     * Is the most recent gesture more up than down.
+     *
+     * This does not mean the gesture is mostly vertical. Simply that it ended at least one pixel
+     * higher than it started. See also {@link #isVertical()}.
+     */
+    public boolean isUp() {
         recalculateData();
         if (mRecentMotionEvents.isEmpty()) {
             return false;
@@ -209,7 +231,7 @@
     }
 
     /** Returns true if phone is being charged without a cable. */
-    boolean isWirelessCharging() {
+    public boolean isWirelessCharging() {
         return mBatteryController.isWirelessCharging();
     }
 
@@ -292,9 +314,21 @@
         return motionEvents;
     }
 
-    void onSessionEnd() {
-        mFirstActualMotionEvent = null;
+    /** Register a {@link SessionListener}. */
+    public void addSessionListener(SessionListener listener) {
+        mSessionListeners.add(listener);
+    }
 
+    /** Unregister a {@link SessionListener}. */
+    public void removeSessionListener(SessionListener listener) {
+        mSessionListeners.remove(listener);
+    }
+
+    void onSessionStarted() {
+        mSessionListeners.forEach(SessionListener::onSessionStarted);
+    }
+
+    void onSessionEnd() {
         for (MotionEvent ev : mRecentMotionEvents) {
             ev.recycle();
         }
@@ -302,5 +336,24 @@
         mRecentMotionEvents.clear();
 
         mDirty = true;
+
+        mSessionListeners.forEach(SessionListener::onSessionEnded);
+    }
+
+    public boolean isJustUnlockedWithFace() {
+        return mJustUnlockedWithFace;
+    }
+
+    public void setJustUnlockedWithFace(boolean justUnlockedWithFace) {
+        mJustUnlockedWithFace = justUnlockedWithFace;
+    }
+
+    /** Implement to be alerted abotu the beginning and ending of falsing tracking. */
+    public interface SessionListener {
+        /** Called when the lock screen is shown and falsing-tracking begins. */
+        void onSessionStarted();
+
+        /** Called when the lock screen exits and falsing-tracking ends. */
+        void onSessionEnded();
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java
index 1214843..32d27bc 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java
@@ -21,6 +21,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.util.sensors.ThresholdSensor;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -43,21 +44,6 @@
 
     }
 
-    @Override
-    public void onNotificationActive() {
-
-    }
-
-    @Override
-    public void setShowingAod(boolean showingAod) {
-
-    }
-
-    @Override
-    public void onNotificatonStartDraggingDown() {
-
-    }
-
     @VisibleForTesting
     public void setIsUnlockingDisabled(boolean isUnlockingDisabled) {
         mIsUnlockingDisabled = isUnlockingDisabled;
@@ -100,16 +86,6 @@
         return mIsFalseDoubleTap;
     }
 
-    @Override
-    public void onNotificatonStopDraggingDown() {
-
-    }
-
-    @Override
-    public void setNotificationExpanded() {
-
-    }
-
     @VisibleForTesting
     public void setIsClassiferEnabled(boolean isClassiferEnabled) {
         mIsClassiferEnabled = isClassiferEnabled;
@@ -121,76 +97,15 @@
     }
 
     @Override
-    public void onQsDown() {
-
-    }
-
-    @Override
-    public void setQsExpanded(boolean expanded) {
-
-    }
-
-    @VisibleForTesting
-    public void setShouldEnforceBouncer(boolean shouldEnforceBouncer) {
-        mShouldEnforceBouncer = shouldEnforceBouncer;
-    }
-
-    @Override
     public boolean shouldEnforceBouncer() {
         return mShouldEnforceBouncer;
     }
 
     @Override
-    public void onTrackingStarted(boolean secure) {
-
-    }
-
-    @Override
-    public void onTrackingStopped() {
-
-    }
-
-    @Override
-    public void onLeftAffordanceOn() {
-
-    }
-
-    @Override
-    public void onCameraOn() {
-
-    }
-
-    @Override
-    public void onAffordanceSwipingStarted(boolean rightCorner) {
-
-    }
-
-    @Override
-    public void onAffordanceSwipingAborted() {
-
-    }
-
-    @Override
-    public void onStartExpandingFromPulse() {
-
-    }
-
-    @Override
-    public void onExpansionFromPulseStopped() {
-
-    }
-
-    @Override
     public Uri reportRejectedTouch() {
         return null;
     }
 
-    @Override
-    public void onScreenOnFromTouch() {
-
-    }
-
-
     @VisibleForTesting
     public void setIsReportingEnabled(boolean isReportingEnabled) {
         mIsReportingEnabled = isReportingEnabled;
@@ -202,61 +117,6 @@
     }
 
     @Override
-    public void onUnlockHintStarted() {
-
-    }
-
-    @Override
-    public void onCameraHintStarted() {
-
-    }
-
-    @Override
-    public void onLeftAffordanceHintStarted() {
-
-    }
-
-    @Override
-    public void onScreenTurningOn() {
-
-    }
-
-    @Override
-    public void onScreenOff() {
-
-    }
-
-    @Override
-    public void onNotificationStopDismissing() {
-
-    }
-
-    @Override
-    public void onNotificationDismissed() {
-
-    }
-
-    @Override
-    public void onNotificationStartDismissing() {
-
-    }
-
-    @Override
-    public void onNotificationDoubleTap(boolean accepted, float dx, float dy) {
-
-    }
-
-    @Override
-    public void onBouncerShown() {
-
-    }
-
-    @Override
-    public void onBouncerHidden() {
-
-    }
-
-    @Override
     public void onTouchEvent(MotionEvent ev, int width, int height) {
 
     }
@@ -268,4 +128,9 @@
     @Override
     public void cleanup() {
     }
+
+    @Override
+    public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
+
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
index 814fff9..7462941 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
@@ -17,37 +17,30 @@
 package com.android.systemui.classifier;
 
 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;
 
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.systemui.Dumpable;
 import com.android.systemui.classifier.brightline.BrightLineFalsingManager;
-import com.android.systemui.classifier.brightline.FalsingDataProvider;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.dock.DockManager;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.FalsingPlugin;
 import com.android.systemui.plugins.PluginListener;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.shared.plugins.PluginManager;
 import com.android.systemui.util.DeviceConfigProxy;
-import com.android.systemui.util.sensors.ProximitySensor;
+import com.android.systemui.util.sensors.ThresholdSensor;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.concurrent.Executor;
 
 import javax.inject.Inject;
+import javax.inject.Provider;
 
 /**
  * Simple passthrough implementation of {@link FalsingManager} allowing plugins to swap in.
@@ -57,21 +50,14 @@
 @SysUISingleton
 public class FalsingManagerProxy implements FalsingManager, Dumpable {
 
-    private static final String PROXIMITY_SENSOR_TAG = "FalsingManager";
     private static final String DUMPABLE_TAG = "FalsingManager";
     public static final String FALSING_REMAIN_LOCKED = "falsing_failure_after_attempts";
     public static final String FALSING_SUCCESS = "falsing_success_after_attempts";
 
     private final PluginManager mPluginManager;
-    private final ProximitySensor mProximitySensor;
-    private final Resources mResources;
-    private final ViewConfiguration mViewConfiguration;
-    private final FalsingDataProvider mFalsingDataProvider;
     private final DeviceConfigProxy mDeviceConfig;
-    private final DockManager mDockManager;
-    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+    private final Provider<BrightLineFalsingManager> mBrightLineFalsingManagerProvider;
     private final DumpManager mDumpManager;
-    private final StatusBarStateController mStatusBarStateController;
     final PluginListener<FalsingPlugin> mPluginListener;
 
     private FalsingManager mInternalFalsingManager;
@@ -81,31 +67,15 @@
 
     @Inject
     FalsingManagerProxy(PluginManager pluginManager, @Main Executor executor,
-            ProximitySensor proximitySensor,
-            DeviceConfigProxy deviceConfig, DockManager dockManager,
-            KeyguardUpdateMonitor keyguardUpdateMonitor,
-            DumpManager dumpManager,
-            StatusBarStateController statusBarStateController,
-            @Main Resources resources,
-            ViewConfiguration viewConfiguration,
-            FalsingDataProvider falsingDataProvider) {
+            DeviceConfigProxy deviceConfig, DumpManager dumpManager,
+            Provider<BrightLineFalsingManager> brightLineFalsingManagerProvider) {
         mPluginManager = pluginManager;
-        mProximitySensor = proximitySensor;
-        mDockManager = dockManager;
-        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mDumpManager = dumpManager;
-        mStatusBarStateController = statusBarStateController;
-        mResources = resources;
-        mViewConfiguration = viewConfiguration;
-        mFalsingDataProvider = falsingDataProvider;
-        mProximitySensor.setTag(PROXIMITY_SENSOR_TAG);
-        mProximitySensor.setDelay(SensorManager.SENSOR_DELAY_GAME);
         mDeviceConfig = deviceConfig;
+        mBrightLineFalsingManagerProvider = brightLineFalsingManagerProvider;
         setupFalsingManager();
         mDeviceConfig.addOnPropertiesChangedListener(
-                DeviceConfig.NAMESPACE_SYSTEMUI,
-                executor,
-                mDeviceConfigListener
+                DeviceConfig.NAMESPACE_SYSTEMUI, executor, mDeviceConfigListener
         );
 
         mPluginListener = new PluginListener<FalsingPlugin>() {
@@ -144,24 +114,7 @@
         if (mInternalFalsingManager != null) {
             mInternalFalsingManager.cleanup();
         }
-        mInternalFalsingManager = new BrightLineFalsingManager(
-                mFalsingDataProvider,
-                mKeyguardUpdateMonitor,
-                mProximitySensor,
-                mDeviceConfig,
-                mResources,
-                mViewConfiguration,
-                mDockManager,
-                mStatusBarStateController
-        );
-    }
-
-    /**
-     * Returns the FalsingManager implementation in use.
-     */
-    @VisibleForTesting
-    FalsingManager getInternalFalsingManager() {
-        return mInternalFalsingManager;
+        mInternalFalsingManager = mBrightLineFalsingManagerProvider.get();
     }
 
     @Override
@@ -170,21 +123,6 @@
     }
 
     @Override
-    public void onNotificationActive() {
-        mInternalFalsingManager.onNotificationActive();
-    }
-
-    @Override
-    public void setShowingAod(boolean showingAod) {
-        mInternalFalsingManager.setShowingAod(showingAod);
-    }
-
-    @Override
-    public void onNotificatonStartDraggingDown() {
-        mInternalFalsingManager.onNotificatonStartDraggingDown();
-    }
-
-    @Override
     public boolean isUnlockingDisabled() {
         return mInternalFalsingManager.isUnlockingDisabled();
     }
@@ -194,7 +132,6 @@
         return mInternalFalsingManager.isFalseTouch(interactionType);
     }
 
-
     @Override
     public boolean isFalseTap(boolean robustCheck) {
         return mInternalFalsingManager.isFalseTap(robustCheck);
@@ -206,151 +143,36 @@
     }
 
     @Override
-    public void onNotificatonStopDraggingDown() {
-        mInternalFalsingManager.onNotificatonStartDraggingDown();
-    }
-
-    @Override
-    public void setNotificationExpanded() {
-        mInternalFalsingManager.setNotificationExpanded();
-    }
-
-    @Override
     public boolean isClassifierEnabled() {
         return mInternalFalsingManager.isClassifierEnabled();
     }
 
     @Override
-    public void onQsDown() {
-        mInternalFalsingManager.onQsDown();
-    }
-
-    @Override
-    public void setQsExpanded(boolean expanded) {
-        mInternalFalsingManager.setQsExpanded(expanded);
-    }
-
-    @Override
     public boolean shouldEnforceBouncer() {
         return mInternalFalsingManager.shouldEnforceBouncer();
     }
 
     @Override
-    public void onTrackingStarted(boolean secure) {
-        mInternalFalsingManager.onTrackingStarted(secure);
-    }
-
-    @Override
-    public void onTrackingStopped() {
-        mInternalFalsingManager.onTrackingStopped();
-    }
-
-    @Override
-    public void onLeftAffordanceOn() {
-        mInternalFalsingManager.onLeftAffordanceOn();
-    }
-
-    @Override
-    public void onCameraOn() {
-        mInternalFalsingManager.onCameraOn();
-    }
-
-    @Override
-    public void onAffordanceSwipingStarted(boolean rightCorner) {
-        mInternalFalsingManager.onAffordanceSwipingStarted(rightCorner);
-    }
-
-    @Override
-    public void onAffordanceSwipingAborted() {
-        mInternalFalsingManager.onAffordanceSwipingAborted();
-    }
-
-    @Override
-    public void onStartExpandingFromPulse() {
-        mInternalFalsingManager.onStartExpandingFromPulse();
-    }
-
-    @Override
-    public void onExpansionFromPulseStopped() {
-        mInternalFalsingManager.onExpansionFromPulseStopped();
-    }
-
-    @Override
     public Uri reportRejectedTouch() {
         return mInternalFalsingManager.reportRejectedTouch();
     }
 
     @Override
-    public void onScreenOnFromTouch() {
-        mInternalFalsingManager.onScreenOnFromTouch();
-    }
-
-    @Override
     public boolean isReportingEnabled() {
         return mInternalFalsingManager.isReportingEnabled();
     }
 
     @Override
-    public void onUnlockHintStarted() {
-        mInternalFalsingManager.onUnlockHintStarted();
-    }
-
-    @Override
-    public void onCameraHintStarted() {
-        mInternalFalsingManager.onCameraHintStarted();
-    }
-
-    @Override
-    public void onLeftAffordanceHintStarted() {
-        mInternalFalsingManager.onLeftAffordanceHintStarted();
-    }
-
-    @Override
-    public void onScreenTurningOn() {
-        mInternalFalsingManager.onScreenTurningOn();
-    }
-
-    @Override
-    public void onScreenOff() {
-        mInternalFalsingManager.onScreenOff();
-    }
-
-    @Override
-    public void onNotificationStopDismissing() {
-        mInternalFalsingManager.onNotificationStopDismissing();
-    }
-
-    @Override
-    public void onNotificationDismissed() {
-        mInternalFalsingManager.onNotificationDismissed();
-    }
-
-    @Override
-    public void onNotificationStartDismissing() {
-        mInternalFalsingManager.onNotificationStartDismissing();
-    }
-
-    @Override
-    public void onNotificationDoubleTap(boolean accepted, float dx, float dy) {
-        mInternalFalsingManager.onNotificationDoubleTap(accepted, dx, dy);
-    }
-
-    @Override
-    public void onBouncerShown() {
-        mInternalFalsingManager.onBouncerShown();
-    }
-
-    @Override
-    public void onBouncerHidden() {
-        mInternalFalsingManager.onBouncerHidden();
-    }
-
-    @Override
     public void onTouchEvent(MotionEvent ev, int width, int height) {
         mInternalFalsingManager.onTouchEvent(ev, width, height);
     }
 
     @Override
+    public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
+        mInternalFalsingManager.onProximityEvent(proximityEvent);
+    }
+
+    @Override
     public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
         mInternalFalsingManager.dump(fd, pw, args);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingModule.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingModule.java
new file mode 100644
index 0000000..937bcba
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingModule.java
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.classifier;
+
+import com.android.systemui.dagger.SysUISingleton;
+
+import dagger.Binds;
+import dagger.Module;
+
+/** Dagger Module for Falsing. */
+@Module
+public interface FalsingModule {
+    /** */
+    @Binds
+    @SysUISingleton
+    FalsingCollector bindsFalsingCollector(FalsingCollectorImpl impl);
+}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java
index 334102d..f6b8b4c 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java
@@ -16,12 +16,10 @@
 
 package com.android.systemui.classifier.brightline;
 
-import static com.android.systemui.classifier.FalsingManagerProxy.FALSING_REMAIN_LOCKED;
 import static com.android.systemui.classifier.FalsingManagerProxy.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.IndentingPrintWriter;
@@ -32,18 +30,15 @@
 import androidx.annotation.NonNull;
 
 import com.android.internal.logging.MetricsLogger;
-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.classifier.FalsingDataProvider;
+import com.android.systemui.classifier.FalsingDataProvider.SessionListener;
 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;
 
 import java.io.FileDescriptor;
@@ -56,30 +51,25 @@
 import java.util.StringJoiner;
 import java.util.stream.Collectors;
 
+import javax.inject.Inject;
+
 /**
  * FalsingManager designed to make clear why a touch was rejected.
  */
 public class BrightLineFalsingManager implements FalsingManager {
 
     private static final String TAG = "FalsingManager";
-    static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
     private static final int RECENT_INFO_LOG_SIZE = 40;
     private static final int RECENT_SWIPE_LOG_SIZE = 20;
 
     private final FalsingDataProvider mDataProvider;
-    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
-    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 final MetricsLogger mMetricsLogger;
     private int mIsFalseTouchCalls;
-    private boolean mShowingAod;
-    private boolean mScreenOn;
-    private boolean mJustUnlockedWithFace;
     private static final Queue<String> RECENT_INFO_LOG =
             new ArrayDeque<>(RECENT_INFO_LOG_SIZE + 1);
     private static final Queue<DebugSwipeRecord> RECENT_SWIPES =
@@ -87,46 +77,26 @@
 
     private final List<FalsingClassifier> mClassifiers;
 
-    private ThresholdSensor.Listener mSensorEventListener = this::onProximityEvent;
-
-    private final KeyguardUpdateMonitorCallback mKeyguardUpdateCallback =
-            new KeyguardUpdateMonitorCallback() {
-                @Override
-                public void onBiometricAuthenticated(int userId,
-                        BiometricSourceType biometricSourceType,
-                        boolean isStrongBiometric) {
-                    if (userId == KeyguardUpdateMonitor.getCurrentUser()
-                            && biometricSourceType == BiometricSourceType.FACE) {
-                        mJustUnlockedWithFace = true;
-                    }
-                }
-            };
-    private boolean mPreviousResult = false;
-
-    private StatusBarStateController.StateListener mStatusBarStateListener =
-            new StatusBarStateController.StateListener() {
+    private final SessionListener mSessionListener = new SessionListener() {
         @Override
-        public void onStateChanged(int newState) {
-            logDebug("StatusBarState=" + StatusBarState.toShortString(newState));
-            mState = newState;
-            updateSessionActive();
+        public void onSessionEnded() {
+            mClassifiers.forEach(FalsingClassifier::onSessionEnded);
+        }
+
+        @Override
+        public void onSessionStarted() {
+            mClassifiers.forEach(FalsingClassifier::onSessionStarted);
         }
     };
-    private int mState;
 
+    private boolean mPreviousResult = false;
+
+    @Inject
     public BrightLineFalsingManager(FalsingDataProvider falsingDataProvider,
-            KeyguardUpdateMonitor keyguardUpdateMonitor, ProximitySensor proximitySensor,
             DeviceConfigProxy deviceConfigProxy, @Main Resources resources,
-            ViewConfiguration viewConfiguration, DockManager dockManager,
-            StatusBarStateController statusBarStateController) {
-        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
+            ViewConfiguration viewConfiguration, DockManager dockManager) {
         mDataProvider = falsingDataProvider;
-        mProximitySensor = proximitySensor;
         mDockManager = dockManager;
-        mStatusBarStateController = statusBarStateController;
-        mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateCallback);
-        mStatusBarStateController.addCallback(mStatusBarStateListener);
-        mState = mStatusBarStateController.getState();
 
         mMetricsLogger = new MetricsLogger();
         mClassifiers = new ArrayList<>();
@@ -146,58 +116,8 @@
         mDoubleTapClassifier = new DoubleTapClassifier(mDataProvider, mSingleTapClassifier,
                 resources.getDimension(R.dimen.double_tap_slop),
                 NotificationTapHelper.DOUBLE_TAP_TIMEOUT_MS);
-    }
 
-    private void registerSensors() {
-        if (!mDataProvider.isWirelessCharging()) {
-            mProximitySensor.register(mSensorEventListener);
-        }
-    }
-
-    private void unregisterSensors() {
-        mProximitySensor.unregister(mSensorEventListener);
-    }
-
-    private void sessionStart() {
-        if (!mSessionStarted && shouldSessionBeActive()) {
-            logDebug("Starting Session");
-            mSessionStarted = true;
-            mJustUnlockedWithFace = false;
-            registerSensors();
-            mClassifiers.forEach(FalsingClassifier::onSessionStarted);
-        }
-    }
-
-    private void sessionEnd() {
-        if (mSessionStarted) {
-            logDebug("Ending Session");
-            mSessionStarted = false;
-            unregisterSensors();
-            mDataProvider.onSessionEnd();
-            mClassifiers.forEach(FalsingClassifier::onSessionEnded);
-            if (mIsFalseTouchCalls != 0) {
-                mMetricsLogger.histogram(FALSING_REMAIN_LOCKED, mIsFalseTouchCalls);
-                mIsFalseTouchCalls = 0;
-            }
-        }
-    }
-
-
-    private void updateSessionActive() {
-        if (shouldSessionBeActive()) {
-            sessionStart();
-        } else {
-            sessionEnd();
-        }
-    }
-
-    private boolean shouldSessionBeActive() {
-        return mScreenOn && (mState == StatusBarState.KEYGUARD) && !mShowingAod;
-    }
-
-    private void updateInteractionType(@Classifier.InteractionType int type) {
-        logDebug("InteractionType: " + type);
-        mDataProvider.setInteractionType(type);
+        mDataProvider.addSessionListener(mSessionListener);
     }
 
     @Override
@@ -212,8 +132,9 @@
             return mPreviousResult;
         }
 
-        mPreviousResult = !ActivityManager.isRunningInUserTestHarness() && !mJustUnlockedWithFace
-                && !mDockManager.isDocked() && mClassifiers.stream().anyMatch(falsingClassifier -> {
+        mPreviousResult = !ActivityManager.isRunningInUserTestHarness()
+                && !mDataProvider.isJustUnlockedWithFace() && !mDockManager.isDocked()
+                && mClassifiers.stream().anyMatch(falsingClassifier -> {
                     boolean result = falsingClassifier.isFalseTouch();
                     if (result) {
                         logInfo(String.format(
@@ -245,9 +166,8 @@
                                     (int) (motionEvent.getEventTime() - motionEvent.getDownTime())))
                             .collect(Collectors.toList())));
             while (RECENT_SWIPES.size() > RECENT_INFO_LOG_SIZE) {
-                DebugSwipeRecord record = RECENT_SWIPES.remove();
+                RECENT_SWIPES.remove();
             }
-
         }
 
         return mPreviousResult;
@@ -287,11 +207,11 @@
     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
         // make these calls.
-        mDataProvider.onMotionEvent(motionEvent);
         mClassifiers.forEach((classifier) -> classifier.onTouchEvent(motionEvent));
     }
 
-    private void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
+    @Override
+    public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
         // TODO: some of these classifiers might allow us to abort early, meaning we don't have to
         // make these calls.
         mClassifiers.forEach((classifier) -> classifier.onProximityEvent(proximityEvent));
@@ -303,22 +223,6 @@
             mMetricsLogger.histogram(FALSING_SUCCESS, mIsFalseTouchCalls);
             mIsFalseTouchCalls = 0;
         }
-        sessionEnd();
-    }
-
-    @Override
-    public void onNotificationActive() {
-    }
-
-    @Override
-    public void setShowingAod(boolean showingAod) {
-        mShowingAod = showingAod;
-        updateSessionActive();
-    }
-
-    @Override
-    public void onNotificatonStartDraggingDown() {
-        updateInteractionType(Classifier.NOTIFICATION_DRAG_DOWN);
     }
 
     @Override
@@ -326,147 +230,29 @@
         return false;
     }
 
-
-    @Override
-    public void onNotificatonStopDraggingDown() {
-    }
-
-    @Override
-    public void setNotificationExpanded() {
-    }
-
-    @Override
-    public void onQsDown() {
-        updateInteractionType(Classifier.QUICK_SETTINGS);
-    }
-
-    @Override
-    public void setQsExpanded(boolean expanded) {
-        if (expanded) {
-            unregisterSensors();
-        } else if (mSessionStarted) {
-            registerSensors();
-        }
-    }
-
     @Override
     public boolean shouldEnforceBouncer() {
         return false;
     }
 
     @Override
-    public void onTrackingStarted(boolean secure) {
-        updateInteractionType(secure ? Classifier.BOUNCER_UNLOCK : Classifier.UNLOCK);
-    }
-
-    @Override
-    public void onTrackingStopped() {
-    }
-
-    @Override
-    public void onLeftAffordanceOn() {
-    }
-
-    @Override
-    public void onCameraOn() {
-    }
-
-    @Override
-    public void onAffordanceSwipingStarted(boolean rightCorner) {
-        updateInteractionType(
-                rightCorner ? Classifier.RIGHT_AFFORDANCE : Classifier.LEFT_AFFORDANCE);
-    }
-
-    @Override
-    public void onAffordanceSwipingAborted() {
-    }
-
-    @Override
-    public void onStartExpandingFromPulse() {
-        updateInteractionType(Classifier.PULSE_EXPAND);
-    }
-
-    @Override
-    public void onExpansionFromPulseStopped() {
-    }
-
-    @Override
     public Uri reportRejectedTouch() {
         return null;
     }
 
     @Override
-    public void onScreenOnFromTouch() {
-        onScreenTurningOn();
-    }
-
-    @Override
     public boolean isReportingEnabled() {
         return false;
     }
 
     @Override
-    public void onUnlockHintStarted() {
-    }
-
-    @Override
-    public void onCameraHintStarted() {
-    }
-
-    @Override
-    public void onLeftAffordanceHintStarted() {
-    }
-
-    @Override
-    public void onScreenTurningOn() {
-        mScreenOn = true;
-        updateSessionActive();
-    }
-
-    @Override
-    public void onScreenOff() {
-        mScreenOn = false;
-        updateSessionActive();
-    }
-
-
-    @Override
-    public void onNotificationStopDismissing() {
-    }
-
-    @Override
-    public void onNotificationDismissed() {
-    }
-
-    @Override
-    public void onNotificationStartDismissing() {
-        updateInteractionType(Classifier.NOTIFICATION_DISMISS);
-    }
-
-    @Override
-    public void onNotificationDoubleTap(boolean b, float v, float v1) {
-    }
-
-    @Override
-    public void onBouncerShown() {
-        unregisterSensors();
-    }
-
-    @Override
-    public void onBouncerHidden() {
-        if (mSessionStarted) {
-            registerSensors();
-        }
-    }
-
-    @Override
     public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
         IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
         ipw.println("BRIGHTLINE FALSING MANAGER");
         ipw.print("classifierEnabled=");
         ipw.println(isClassifierEnabled() ? 1 : 0);
         ipw.print("mJustUnlockedWithFace=");
-        ipw.println(mJustUnlockedWithFace ? 1 : 0);
+        ipw.println(mDataProvider.isJustUnlockedWithFace() ? 1 : 0);
         ipw.print("isDocked=");
         ipw.println(mDockManager.isDocked() ? 1 : 0);
         ipw.print("width=");
@@ -496,9 +282,7 @@
 
     @Override
     public void cleanup() {
-        unregisterSensors();
-        mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateCallback);
-        mStatusBarStateController.removeCallback(mStatusBarStateListener);
+        mDataProvider.removeSessionListener(mSessionListener);
     }
 
     static void logDebug(String msg) {
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java
index 520e0a1..a73ccf5 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java
@@ -23,6 +23,7 @@
 
 import android.provider.DeviceConfig;
 
+import com.android.systemui.classifier.FalsingDataProvider;
 import com.android.systemui.util.DeviceConfigProxy;
 
 import java.util.Locale;
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java
index 0329183..893d435 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java
@@ -27,6 +27,7 @@
 import android.view.MotionEvent;
 import android.view.VelocityTracker;
 
+import com.android.systemui.classifier.FalsingDataProvider;
 import com.android.systemui.util.DeviceConfigProxy;
 
 import java.util.List;
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DoubleTapClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DoubleTapClassifier.java
index d3af1c3..a27ea61 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DoubleTapClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DoubleTapClassifier.java
@@ -18,6 +18,8 @@
 
 import android.view.MotionEvent;
 
+import com.android.systemui.classifier.FalsingDataProvider;
+
 import java.util.List;
 import java.util.Queue;
 
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingClassifier.java
index ed417b3..568dc43 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingClassifier.java
@@ -19,6 +19,7 @@
 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;
@@ -27,7 +28,7 @@
 /**
  * Base class for rules that determine False touches.
  */
-abstract class FalsingClassifier {
+public abstract class FalsingClassifier {
     private final FalsingDataProvider mDataProvider;
 
     FalsingClassifier(FalsingDataProvider dataProvider) {
@@ -126,15 +127,18 @@
      */
     abstract String getReason();
 
-    static void logDebug(String msg) {
+    /** */
+    public static void logDebug(String msg) {
         BrightLineFalsingManager.logDebug(msg);
     }
 
-    static void logInfo(String msg) {
+    /** */
+    public static void logInfo(String msg) {
         BrightLineFalsingManager.logInfo(msg);
     }
 
-    static void logError(String msg) {
+    /** */
+    public static void logError(String msg) {
         BrightLineFalsingManager.logError(msg);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/PointerCountClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/PointerCountClassifier.java
index b726c3e..dd5d8a8 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/PointerCountClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/PointerCountClassifier.java
@@ -21,6 +21,8 @@
 
 import android.view.MotionEvent;
 
+import com.android.systemui.classifier.FalsingDataProvider;
+
 import java.util.Locale;
 
 /**
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java
index b128678..3551c24 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java
@@ -22,6 +22,7 @@
 import android.provider.DeviceConfig;
 import android.view.MotionEvent;
 
+import com.android.systemui.classifier.FalsingDataProvider;
 import com.android.systemui.util.DeviceConfigProxy;
 import com.android.systemui.util.sensors.ProximitySensor;
 
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/SingleTapClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/SingleTapClassifier.java
index 47708f4..8c76481 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/SingleTapClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/SingleTapClassifier.java
@@ -18,6 +18,8 @@
 
 import android.view.MotionEvent;
 
+import com.android.systemui.classifier.FalsingDataProvider;
+
 import java.util.List;
 
 /**
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/TimeLimitedMotionEventBuffer.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/TimeLimitedMotionEventBuffer.java
index 92aa7c5..7430a1e 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/TimeLimitedMotionEventBuffer.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/TimeLimitedMotionEventBuffer.java
@@ -36,7 +36,7 @@
     private final LinkedList<MotionEvent> mMotionEvents;
     private final long mMaxAgeMs;
 
-    TimeLimitedMotionEventBuffer(long maxAgeMs) {
+    public TimeLimitedMotionEventBuffer(long maxAgeMs) {
         super();
         mMaxAgeMs = maxAgeMs;
         mMotionEvents = new LinkedList<>();
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/TypeClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/TypeClassifier.java
index 5f1b37a..f62871f 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/TypeClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/TypeClassifier.java
@@ -26,6 +26,8 @@
 import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE;
 import static com.android.systemui.classifier.Classifier.UNLOCK;
 
+import com.android.systemui.classifier.FalsingDataProvider;
+
 /**
  * Ensure that the swipe direction generally matches that of the interaction type.
  */
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java
index a796f3c..9ca77d3 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java
@@ -25,6 +25,7 @@
 import android.provider.DeviceConfig;
 import android.view.MotionEvent;
 
+import com.android.systemui.classifier.FalsingDataProvider;
 import com.android.systemui.util.DeviceConfigProxy;
 
 import java.util.ArrayList;
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
index 780bb5b..4d69700 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
@@ -27,6 +27,7 @@
 import com.android.systemui.BootCompleteCacheImpl;
 import com.android.systemui.appops.dagger.AppOpsModule;
 import com.android.systemui.assist.AssistModule;
+import com.android.systemui.classifier.FalsingModule;
 import com.android.systemui.controls.dagger.ControlsModule;
 import com.android.systemui.demomode.dagger.DemoModeModule;
 import com.android.systemui.doze.dagger.DozeComponent;
@@ -89,6 +90,7 @@
             AssistModule.class,
             ControlsModule.class,
             DemoModeModule.class,
+            FalsingModule.class,
             LogModule.class,
             PeopleHubModule.class,
             PowerModule.class,
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFalsingManagerAdapter.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFalsingManagerAdapter.java
index 94b8ba3..ef696a8 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeFalsingManagerAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFalsingManagerAdapter.java
@@ -16,8 +16,8 @@
 
 package com.android.systemui.doze;
 
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.doze.dagger.DozeScope;
-import com.android.systemui.plugins.FalsingManager;
 
 import javax.inject.Inject;
 
@@ -27,16 +27,16 @@
 @DozeScope
 public class DozeFalsingManagerAdapter implements DozeMachine.Part {
 
-    private final FalsingManager mFalsingManager;
+    private final FalsingCollector mFalsingCollector;
 
     @Inject
-    public DozeFalsingManagerAdapter(FalsingManager falsingManager) {
-        mFalsingManager = falsingManager;
+    public DozeFalsingManagerAdapter(FalsingCollector falsingCollector) {
+        mFalsingCollector = falsingCollector;
     }
 
     @Override
     public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) {
-        mFalsingManager.setShowingAod(isAodMode(newState));
+        mFalsingCollector.setShowingAod(isAodMode(newState));
     }
 
     private boolean isAodMode(DozeMachine.State state) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 4c68312..7b2659f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -86,11 +86,11 @@
 import com.android.systemui.R;
 import com.android.systemui.SystemUI;
 import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.dagger.qualifiers.UiBackground;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.keyguard.dagger.KeyguardModule;
 import com.android.systemui.navigationbar.NavigationModeController;
-import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.shared.system.QuickStepContract;
 import com.android.systemui.statusbar.phone.BiometricUnlockController;
 import com.android.systemui.statusbar.phone.KeyguardBypassController;
@@ -220,7 +220,7 @@
     private boolean mBootSendUserPresent;
     private boolean mShuttingDown;
     private boolean mDozing;
-    private final FalsingManager mFalsingManager;
+    private final FalsingCollector mFalsingCollector;
 
     /** High level access to the power manager for WakeLocks */
     private final PowerManager mPM;
@@ -712,7 +712,7 @@
      */
     public KeyguardViewMediator(
             Context context,
-            FalsingManager falsingManager,
+            FalsingCollector falsingCollector,
             LockPatternUtils lockPatternUtils,
             BroadcastDispatcher broadcastDispatcher,
             Lazy<KeyguardViewController> statusBarKeyguardViewManagerLazy,
@@ -724,7 +724,7 @@
             NavigationModeController navigationModeController,
             KeyguardDisplayManager keyguardDisplayManager) {
         super(context);
-        mFalsingManager = falsingManager;
+        mFalsingCollector = falsingCollector;
         mLockPatternUtils = lockPatternUtils;
         mBroadcastDispatcher = broadcastDispatcher;
         mKeyguardViewControllerLazy = statusBarKeyguardViewManagerLazy;
@@ -1670,7 +1670,7 @@
                             "KeyguardViewMediator#handleMessage START_KEYGUARD_EXIT_ANIM");
                     StartKeyguardExitAnimParams params = (StartKeyguardExitAnimParams) msg.obj;
                     handleStartKeyguardExitAnimation(params.startTime, params.fadeoutDuration);
-                    mFalsingManager.onSuccessfulUnlock();
+                    mFalsingCollector.onSuccessfulUnlock();
                     Trace.endSection();
                     break;
                 case KEYGUARD_DONE_PENDING_TIMEOUT:
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
index e50fd6a..d7b5eea 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
@@ -31,6 +31,8 @@
 import com.android.keyguard.KeyguardViewController;
 import com.android.keyguard.dagger.KeyguardStatusViewComponent;
 import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.classifier.FalsingCollector;
+import com.android.systemui.classifier.FalsingModule;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.dagger.qualifiers.UiBackground;
@@ -39,7 +41,6 @@
 import com.android.systemui.keyguard.FaceAuthScreenBrightnessController;
 import com.android.systemui.keyguard.KeyguardViewMediator;
 import com.android.systemui.navigationbar.NavigationModeController;
-import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.statusbar.NotificationShadeWindowController;
 import com.android.systemui.statusbar.phone.KeyguardLiftController;
@@ -59,7 +60,8 @@
 /**
  * Dagger Module providing {@link StatusBar}.
  */
-@Module(subcomponents = {KeyguardStatusViewComponent.class})
+@Module(subcomponents = {KeyguardStatusViewComponent.class},
+        includes = {FalsingModule.class})
 public class KeyguardModule {
     /**
      * Provides our instance of KeyguardViewMediator which is considered optional.
@@ -68,7 +70,7 @@
     @SysUISingleton
     public static KeyguardViewMediator newKeyguardViewMediator(
             Context context,
-            FalsingManager falsingManager,
+            FalsingCollector falsingCollector,
             LockPatternUtils lockPatternUtils,
             BroadcastDispatcher broadcastDispatcher,
             Lazy<KeyguardViewController> statusBarKeyguardViewManagerLazy,
@@ -83,7 +85,7 @@
             KeyguardDisplayManager keyguardDisplayManager) {
         return new KeyguardViewMediator(
                 context,
-                falsingManager,
+                falsingCollector,
                 lockPatternUtils,
                 broadcastDispatcher,
                 statusBarKeyguardViewManagerLazy,
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
index 5eb6687f..9353526 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
@@ -12,6 +12,7 @@
 import android.widget.LinearLayout
 import androidx.annotation.VisibleForTesting
 import com.android.systemui.R
+import com.android.systemui.classifier.FalsingCollector
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.plugins.ActivityStarter
@@ -44,6 +45,7 @@
     @Main executor: DelayableExecutor,
     private val mediaManager: MediaDataManager,
     configurationController: ConfigurationController,
+    falsingCollector: FalsingCollector,
     falsingManager: FalsingManager
 ) {
     /**
@@ -156,7 +158,7 @@
         pageIndicator = mediaFrame.requireViewById(R.id.media_page_indicator)
         mediaCarouselScrollHandler = MediaCarouselScrollHandler(mediaCarousel, pageIndicator,
                 executor, mediaManager::onSwipeToDismiss, this::updatePageIndicatorLocation,
-                this::closeGuts, falsingManager)
+                this::closeGuts, falsingCollector, falsingManager)
         isRtl = context.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL
         inflateSettingsButton()
         mediaContent = mediaCarousel.requireViewById(R.id.media_carousel)
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt
index cb14f31..bb6fbfa 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt
@@ -31,6 +31,7 @@
 import com.android.systemui.qs.PageIndicator
 import com.android.systemui.R
 import com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS
+import com.android.systemui.classifier.FalsingCollector
 import com.android.systemui.plugins.FalsingManager
 import com.android.wm.shell.animation.PhysicsAnimator
 import com.android.systemui.util.concurrency.DelayableExecutor
@@ -58,6 +59,7 @@
     private val dismissCallback: () -> Unit,
     private var translationChangedListener: () -> Unit,
     private val closeGuts: () -> Unit,
+    private val falsingCollector: FalsingCollector,
     private val falsingManager: FalsingManager
 ) {
     /**
@@ -162,7 +164,7 @@
 
         override fun onDown(e: MotionEvent?): Boolean {
             if (falsingProtectionNeeded) {
-                falsingManager.onNotificationStartDismissing()
+                falsingCollector.onNotificationStartDismissing()
             }
             return false
         }
@@ -258,7 +260,7 @@
     private fun onTouch(motionEvent: MotionEvent): Boolean {
         val isUp = motionEvent.action == MotionEvent.ACTION_UP
         if (isUp && falsingProtectionNeeded) {
-            falsingManager.onNotificationStopDismissing()
+            falsingCollector.onNotificationStopDismissing()
         }
         if (gestureDetector.onTouchEvent(motionEvent)) {
             if (isUp) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
index e61e05a..7ef88bb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
@@ -31,6 +31,7 @@
 import com.android.systemui.Gefingerpoken;
 import com.android.systemui.Interpolators;
 import com.android.systemui.R;
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.statusbar.notification.row.ExpandableView;
 
@@ -46,6 +47,7 @@
     private static final int SPRING_BACK_ANIMATION_LENGTH_MS = 375;
 
     private int mMinDragDistance;
+    private final FalsingManager mFalsingManager;
     private ExpandHelper.Callback mCallback;
     private float mInitialTouchX;
     private float mInitialTouchY;
@@ -58,20 +60,21 @@
     private boolean mDraggedFarEnough;
     private ExpandableView mStartingChild;
     private float mLastHeight;
-    private FalsingManager mFalsingManager;
+    private FalsingCollector mFalsingCollector;
 
     public DragDownHelper(Context context, View host, ExpandHelper.Callback callback,
-            DragDownCallback dragDownCallback,
-            FalsingManager falsingManager) {
+            DragDownCallback dragDownCallback, FalsingManager falsingManager,
+            FalsingCollector falsingCollector) {
         mMinDragDistance = context.getResources().getDimensionPixelSize(
                 R.dimen.keyguard_drag_down_min_distance);
+        mFalsingManager = falsingManager;
         final ViewConfiguration configuration = ViewConfiguration.get(context);
         mTouchSlop = configuration.getScaledTouchSlop();
         mSlopMultiplier = configuration.getScaledAmbiguousGestureMultiplier();
         mCallback = callback;
         mDragDownCallback = dragDownCallback;
         mHost = host;
-        mFalsingManager = falsingManager;
+        mFalsingCollector = falsingCollector;
     }
 
     @Override
@@ -96,7 +99,7 @@
                         ? mTouchSlop * mSlopMultiplier
                         : mTouchSlop;
                 if (h > touchSlop && h > Math.abs(x - mInitialTouchX)) {
-                    mFalsingManager.onNotificatonStartDraggingDown();
+                    mFalsingCollector.onNotificationStartDraggingDown();
                     mDraggingDown = true;
                     captureStartingChild(mInitialTouchX, mInitialTouchY);
                     mInitialTouchY = y;
@@ -229,7 +232,7 @@
     }
 
     private void stopDragging() {
-        mFalsingManager.onNotificatonStopDraggingDown();
+        mFalsingCollector.onNotificationStopDraggingDown();
         if (mStartingChild != null) {
             cancelExpansion(mStartingChild);
             mStartingChild = null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
index 6fa3633..b7343f6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
@@ -31,6 +31,7 @@
 import com.android.systemui.Interpolators
 import com.android.systemui.R
 import com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN
+import com.android.systemui.classifier.FalsingCollector
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.plugins.FalsingManager
 import com.android.systemui.plugins.statusbar.StatusBarStateController
@@ -57,7 +58,8 @@
     private val headsUpManager: HeadsUpManagerPhone,
     private val roundnessManager: NotificationRoundnessManager,
     private val statusBarStateController: StatusBarStateController,
-    private val falsingManager: FalsingManager
+    private val falsingManager: FalsingManager,
+    private val falsingCollector: FalsingCollector
 ) : Gefingerpoken {
     companion object {
         private val RUBBERBAND_FACTOR_STATIC = 0.25f
@@ -148,7 +150,7 @@
             MotionEvent.ACTION_MOVE -> {
                 val h = y - mInitialTouchY
                 if (h > mTouchSlop && h > Math.abs(x - mInitialTouchX)) {
-                    falsingManager.onStartExpandingFromPulse()
+                    falsingCollector.onStartExpandingFromPulse()
                     isExpanding = true
                     captureStartingChild(mInitialTouchX, mInitialTouchY)
                     mInitialTouchY = y
@@ -301,7 +303,7 @@
 
     private fun cancelExpansion() {
         isExpanding = false
-        falsingManager.onExpansionFromPulseStopped()
+        falsingCollector.onExpansionFromPulseStopped()
         if (mStartingChild != null) {
             reset(mStartingChild!!)
             mStartingChild = null
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewController.java
index 0b79387..50bbc38 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewController.java
@@ -22,6 +22,7 @@
 import android.view.accessibility.AccessibilityManager;
 
 import com.android.systemui.Gefingerpoken;
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.statusbar.phone.NotificationTapHelper;
 import com.android.systemui.util.ViewController;
@@ -36,6 +37,7 @@
     private final ExpandableOutlineViewController mExpandableOutlineViewController;
     private final AccessibilityManager mAccessibilityManager;
     private final FalsingManager mFalsingManager;
+    private final FalsingCollector mFalsingCollector;
     private final NotificationTapHelper mNotificationTapHelper;
     private final TouchHandler mTouchHandler = new TouchHandler();
 
@@ -45,17 +47,19 @@
     public ActivatableNotificationViewController(ActivatableNotificationView view,
             NotificationTapHelper.Factory notificationTapHelpFactory,
             ExpandableOutlineViewController expandableOutlineViewController,
-            AccessibilityManager accessibilityManager, FalsingManager falsingManager) {
+            AccessibilityManager accessibilityManager, FalsingManager falsingManager,
+            FalsingCollector falsingCollector) {
         super(view);
         mExpandableOutlineViewController = expandableOutlineViewController;
         mAccessibilityManager = accessibilityManager;
         mFalsingManager = falsingManager;
+        mFalsingCollector = falsingCollector;
 
         mNotificationTapHelper = notificationTapHelpFactory.create(
                 (active) -> {
                     if (active) {
                         mView.makeActive();
-                        mFalsingManager.onNotificationActive();
+                        mFalsingCollector.onNotificationActive();
                     } else {
                         mView.makeInactive(true /* animate */);
                     }
@@ -64,7 +68,7 @@
         mView.setOnActivatedListener(new ActivatableNotificationView.OnActivatedListener() {
             @Override
             public void onActivated(ActivatableNotificationView view) {
-                mFalsingManager.onNotificationActive();
+                mFalsingCollector.onNotificationActive();
             }
 
             @Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index ea39064..948980c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -43,7 +43,6 @@
 import android.os.AsyncTask;
 import android.os.Build;
 import android.os.Bundle;
-import android.provider.Settings;
 import android.service.notification.StatusBarNotification;
 import android.util.ArraySet;
 import android.util.AttributeSet;
@@ -74,7 +73,7 @@
 import com.android.systemui.Dependency;
 import com.android.systemui.Interpolators;
 import com.android.systemui.R;
-import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.plugins.PluginListener;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem;
@@ -213,7 +212,7 @@
     private NotificationGuts mGuts;
     private NotificationEntry mEntry;
     private String mAppName;
-    private FalsingManager mFalsingManager;
+    private FalsingCollector mFalsingCollector;
 
     /**
      * Whether or not the notification is using the heads up view and should peek from the top.
@@ -1580,7 +1579,7 @@
             OnExpandClickListener onExpandClickListener,
             NotificationMediaManager notificationMediaManager,
             CoordinateOnClickListener onFeedbackClickListener,
-            FalsingManager falsingManager,
+            FalsingCollector falsingCollector,
             StatusBarStateController statusBarStateController,
             PeopleNotificationIdentifier peopleNotificationIdentifier,
             OnUserInteractionCallback onUserInteractionCallback,
@@ -1605,7 +1604,7 @@
         mOnExpandClickListener = onExpandClickListener;
         mMediaManager = notificationMediaManager;
         setOnFeedbackClickListener(onFeedbackClickListener);
-        mFalsingManager = falsingManager;
+        mFalsingCollector = falsingCollector;
         mStatusBarStateController = statusBarStateController;
 
         mPeopleNotificationIdentifier = peopleNotificationIdentifier;
@@ -2172,7 +2171,7 @@
      * @param allowChildExpansion whether a call to this method allows expanding children
      */
     public void setUserExpanded(boolean userExpanded, boolean allowChildExpansion) {
-        mFalsingManager.setNotificationExpanded();
+        mFalsingCollector.setNotificationExpanded();
         if (mIsSummaryWithChildren && !shouldShowPublic() && allowChildExpansion
                 && !mChildrenContainer.showingAsLowPriority()) {
             final boolean wasExpanded = mGroupExpansionManager.isGroupExpanded(mEntry);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java
index cb2af54..0d0e97e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java
@@ -25,7 +25,7 @@
 
 import androidx.annotation.NonNull;
 
-import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.shared.plugins.PluginManager;
@@ -78,7 +78,7 @@
     private final ExpandableNotificationRow.CoordinateOnClickListener mOnFeedbackClickListener;
     private final NotificationGutsManager mNotificationGutsManager;
     private final OnUserInteractionCallback mOnUserInteractionCallback;
-    private final FalsingManager mFalsingManager;
+    private final FalsingCollector mFalsingCollector;
     private final boolean mAllowLongPress;
     private final PeopleNotificationIdentifier mPeopleNotificationIdentifier;
     private final Optional<BubblesManager> mBubblesManagerOptional;
@@ -104,7 +104,7 @@
             NotificationGutsManager notificationGutsManager,
             @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress,
             OnUserInteractionCallback onUserInteractionCallback,
-            FalsingManager falsingManager,
+            FalsingCollector falsingCollector,
             PeopleNotificationIdentifier peopleNotificationIdentifier,
             Optional<BubblesManager> bubblesManagerOptional) {
         mView = view;
@@ -127,7 +127,7 @@
         mOnUserInteractionCallback = onUserInteractionCallback;
         mOnFeedbackClickListener = mNotificationGutsManager::openGuts;
         mAllowLongPress = allowLongPress;
-        mFalsingManager = falsingManager;
+        mFalsingCollector = falsingCollector;
         mPeopleNotificationIdentifier = peopleNotificationIdentifier;
         mBubblesManagerOptional = bubblesManagerOptional;
     }
@@ -150,7 +150,7 @@
                 mOnExpandClickListener,
                 mMediaManager,
                 mOnFeedbackClickListener,
-                mFalsingManager,
+                mFalsingCollector,
                 mStatusBarStateController,
                 mPeopleNotificationIdentifier,
                 mOnUserInteractionCallback,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index 006d8da..9d4665a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -60,10 +60,10 @@
 import com.android.systemui.Gefingerpoken;
 import com.android.systemui.R;
 import com.android.systemui.SwipeHelper;
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.media.KeyguardMediaController;
-import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEventListener;
 import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
@@ -143,7 +143,7 @@
     private final ConfigurationController mConfigurationController;
     private final ZenModeController mZenModeController;
     private final MetricsLogger mMetricsLogger;
-    private final FalsingManager mFalsingManager;
+    private final FalsingCollector mFalsingCollector;
     private final Resources mResources;
     private final NotificationSwipeHelper.Builder mNotificationSwipeHelperBuilder;
     private final ScrimController mScrimController;
@@ -361,7 +361,7 @@
 
                 @Override
                 public void onDragCancelled(View v) {
-                    mFalsingManager.onNotificationStopDismissing();
+                    mFalsingCollector.onNotificationStopDismissing();
                 }
 
                 /**
@@ -405,8 +405,8 @@
                     }
 
                     mView.addSwipedOutView(view);
-                    mFalsingManager.onNotificationDismissed();
-                    if (mFalsingManager.shouldEnforceBouncer()) {
+                    mFalsingCollector.onNotificationDismissed();
+                    if (mFalsingCollector.shouldEnforceBouncer()) {
                         mStatusBar.executeRunnableDismissingKeyguard(
                                 null,
                                 null /* cancelAction */,
@@ -448,7 +448,7 @@
 
                 @Override
                 public void onBeginDrag(View v) {
-                    mFalsingManager.onNotificationStartDismissing();
+                    mFalsingCollector.onNotificationStartDismissing();
                     mView.onSwipeBegin();
                 }
 
@@ -550,7 +550,7 @@
             SysuiColorExtractor colorExtractor,
             NotificationLockscreenUserManager lockscreenUserManager,
             MetricsLogger metricsLogger,
-            FalsingManager falsingManager,
+            FalsingCollector falsingCollector,
             @Main Resources resources,
             NotificationSwipeHelper.Builder notificationSwipeHelperBuilder,
             StatusBar statusBar,
@@ -584,7 +584,7 @@
         mColorExtractor = colorExtractor;
         mLockscreenUserManager = lockscreenUserManager;
         mMetricsLogger = metricsLogger;
-        mFalsingManager = falsingManager;
+        mFalsingCollector = falsingCollector;
         mResources = resources;
         mNotificationSwipeHelperBuilder = notificationSwipeHelperBuilder;
         mStatusBar = statusBar;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index 80cb289..9854f54 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -39,9 +39,9 @@
 import com.android.keyguard.ViewMediatorCallback;
 import com.android.keyguard.dagger.KeyguardBouncerComponent;
 import com.android.systemui.DejankUtils;
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.dagger.qualifiers.RootView;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
-import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.shared.system.SysUiStatsLog;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 
@@ -65,7 +65,7 @@
     protected final Context mContext;
     protected final ViewMediatorCallback mCallback;
     protected final ViewGroup mContainer;
-    private final FalsingManager mFalsingManager;
+    private final FalsingCollector mFalsingCollector;
     private final DismissCallbackRegistry mDismissCallbackRegistry;
     private final Handler mHandler;
     private final List<BouncerExpansionCallback> mExpansionCallbacks = new ArrayList<>();
@@ -100,7 +100,7 @@
 
     private KeyguardBouncer(Context context, ViewMediatorCallback callback,
             ViewGroup container,
-            DismissCallbackRegistry dismissCallbackRegistry, FalsingManager falsingManager,
+            DismissCallbackRegistry dismissCallbackRegistry, FalsingCollector falsingCollector,
             BouncerExpansionCallback expansionCallback,
             KeyguardStateController keyguardStateController,
             KeyguardUpdateMonitor keyguardUpdateMonitor,
@@ -111,7 +111,7 @@
         mCallback = callback;
         mContainer = container;
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
-        mFalsingManager = falsingManager;
+        mFalsingCollector = falsingCollector;
         mDismissCallbackRegistry = dismissCallbackRegistry;
         mHandler = handler;
         mKeyguardStateController = keyguardStateController;
@@ -203,7 +203,7 @@
      * will never be notified and its internal state will be out of sync.
      */
     private void onFullyShown() {
-        mFalsingManager.onBouncerShown();
+        mFalsingCollector.onBouncerShown();
         if (mKeyguardViewController == null) {
             Log.wtf(TAG, "onFullyShown when view was null");
         } else {
@@ -223,7 +223,7 @@
         if (mRoot != null) {
             mRoot.setVisibility(View.INVISIBLE);
         }
-        mFalsingManager.onBouncerHidden();
+        mFalsingCollector.onBouncerHidden();
         DejankUtils.postAfterTraversal(mResetRunnable);
     }
 
@@ -290,7 +290,7 @@
             mDismissCallbackRegistry.notifyDismissCancelled();
         }
         mIsScrimmed = false;
-        mFalsingManager.onBouncerHidden();
+        mFalsingCollector.onBouncerHidden();
         mCallback.onBouncerVisiblityChanged(false /* shown */);
         cancelShowRunnable();
         if (mKeyguardViewController != null) {
@@ -327,7 +327,7 @@
     public void reset() {
         cancelShowRunnable();
         inflateView();
-        mFalsingManager.onBouncerHidden();
+        mFalsingCollector.onBouncerHidden();
     }
 
     public void onScreenTurnedOff() {
@@ -541,7 +541,7 @@
         private final Context mContext;
         private final ViewMediatorCallback mCallback;
         private final DismissCallbackRegistry mDismissCallbackRegistry;
-        private final FalsingManager mFalsingManager;
+        private final FalsingCollector mFalsingCollector;
         private final KeyguardStateController mKeyguardStateController;
         private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
         private final KeyguardBypassController mKeyguardBypassController;
@@ -551,7 +551,7 @@
 
         @Inject
         public Factory(Context context, ViewMediatorCallback callback,
-                DismissCallbackRegistry dismissCallbackRegistry, FalsingManager falsingManager,
+                DismissCallbackRegistry dismissCallbackRegistry, FalsingCollector falsingCollector,
                 KeyguardStateController keyguardStateController,
                 KeyguardUpdateMonitor keyguardUpdateMonitor,
                 KeyguardBypassController keyguardBypassController, Handler handler,
@@ -560,7 +560,7 @@
             mContext = context;
             mCallback = callback;
             mDismissCallbackRegistry = dismissCallbackRegistry;
-            mFalsingManager = falsingManager;
+            mFalsingCollector = falsingCollector;
             mKeyguardStateController = keyguardStateController;
             mKeyguardUpdateMonitor = keyguardUpdateMonitor;
             mKeyguardBypassController = keyguardBypassController;
@@ -572,7 +572,7 @@
         public KeyguardBouncer create(@RootView ViewGroup container,
                 BouncerExpansionCallback expansionCallback) {
             return new KeyguardBouncer(mContext, mCallback, container,
-                    mDismissCallbackRegistry, mFalsingManager, expansionCallback,
+                    mDismissCallbackRegistry, mFalsingCollector, expansionCallback,
                     mKeyguardStateController, mKeyguardUpdateMonitor,
                     mKeyguardBypassController, mHandler, mKeyguardSecurityModel,
                     mKeyguardBouncerComponentFactory);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index c936e82..0845c29 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -79,6 +79,7 @@
 import com.android.systemui.R;
 import com.android.systemui.biometrics.AuthController;
 import com.android.systemui.classifier.Classifier;
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.dagger.qualifiers.DisplayId;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.doze.DozeLog;
@@ -364,7 +365,8 @@
     private boolean mHeadsUpAnimatingAway;
     private boolean mLaunchingAffordance;
     private boolean mAffordanceHasPreview;
-    private FalsingManager mFalsingManager;
+    private final FalsingManager mFalsingManager;
+    private final FalsingCollector mFalsingCollector;
     private String mLastCameraLaunchSource = KeyguardBottomAreaView.CAMERA_LAUNCH_SOURCE_AFFORDANCE;
 
     private Runnable mHeadsUpExistenceChangedRunnable = () -> {
@@ -502,7 +504,7 @@
             NotificationWakeUpCoordinator coordinator, PulseExpansionHandler pulseExpansionHandler,
             DynamicPrivacyController dynamicPrivacyController,
             KeyguardBypassController bypassController, FalsingManager falsingManager,
-            ShadeController shadeController,
+            FalsingCollector falsingCollector, ShadeController shadeController,
             NotificationLockscreenUserManager notificationLockscreenUserManager,
             NotificationEntryManager notificationEntryManager,
             KeyguardStateController keyguardStateController,
@@ -543,6 +545,7 @@
         mView.setWillNotDraw(!DEBUG);
         mInjectionInflationController = injectionInflationController;
         mFalsingManager = falsingManager;
+        mFalsingCollector = falsingCollector;
         mPowerManager = powerManager;
         mWakeUpCoordinator = coordinator;
         mAccessibilityManager = accessibilityManager;
@@ -1424,7 +1427,7 @@
     private void handleQsDown(MotionEvent event) {
         if (event.getActionMasked() == MotionEvent.ACTION_DOWN && shouldQuickSettingsIntercept(
                 event.getX(), event.getY(), -1)) {
-            mFalsingManager.onQsDown();
+            mFalsingCollector.onQsDown();
             mQsTracking = true;
             onQsExpansionStarted();
             mInitialHeightOnTouch = mQsExpansionHeight;
@@ -1604,7 +1607,7 @@
             mQsExpanded = expanded;
             updateQsState();
             requestPanelHeightUpdate();
-            mFalsingManager.setQsExpanded(expanded);
+            mFalsingCollector.setQsExpanded(expanded);
             mStatusBar.setQsExpanded(expanded);
             mNotificationContainerParent.setQsExpanded(expanded);
             mPulseExpansionHandler.setQsExpanded(expanded);
@@ -1741,7 +1744,7 @@
         }
 
         if (!mFalsingManager.isUnlockingDisabled() && mQsFullyExpanded
-                && mFalsingManager.shouldEnforceBouncer()) {
+                && mFalsingCollector.shouldEnforceBouncer()) {
             mStatusBar.executeRunnableDismissingKeyguard(null, null /* cancelAction */,
                     false /* dismissShade */, true /* afterKeyguardGone */, false /* deferred */);
         }
@@ -2402,7 +2405,7 @@
 
     @Override
     protected void onTrackingStarted() {
-        mFalsingManager.onTrackingStarted(!mKeyguardStateController.canDismissLockScreen());
+        mFalsingCollector.onTrackingStarted(!mKeyguardStateController.canDismissLockScreen());
         super.onTrackingStarted();
         if (mQsFullyExpanded) {
             mQsExpandImmediate = true;
@@ -2416,7 +2419,7 @@
 
     @Override
     protected void onTrackingStopped(boolean expand) {
-        mFalsingManager.onTrackingStopped();
+        mFalsingCollector.onTrackingStopped();
         super.onTrackingStopped(expand);
         if (expand) {
             mNotificationStackScrollLayoutController.setOverScrolledPixels(0.0f, true /* onTop */,
@@ -3363,8 +3366,8 @@
             if (start) {
                 mLockscreenGestureLogger.write(MetricsEvent.ACTION_LS_DIALER, lengthDp, velocityDp);
                 mLockscreenGestureLogger.log(LockscreenUiEvent.LOCKSCREEN_DIALER);
-                mFalsingManager.onLeftAffordanceOn();
-                if (mFalsingManager.shouldEnforceBouncer()) {
+                mFalsingCollector.onLeftAffordanceOn();
+                if (mFalsingCollector.shouldEnforceBouncer()) {
                     mStatusBar.executeRunnableDismissingKeyguard(
                             () -> mKeyguardBottomArea.launchLeftAffordance(), null,
                             true /* dismissShade */, false /* afterKeyguardGone */,
@@ -3379,8 +3382,8 @@
                             MetricsEvent.ACTION_LS_CAMERA, lengthDp, velocityDp);
                     mLockscreenGestureLogger.log(LockscreenUiEvent.LOCKSCREEN_CAMERA);
                 }
-                mFalsingManager.onCameraOn();
-                if (mFalsingManager.shouldEnforceBouncer()) {
+                mFalsingCollector.onCameraOn();
+                if (mFalsingCollector.shouldEnforceBouncer()) {
                     mStatusBar.executeRunnableDismissingKeyguard(
                             () -> mKeyguardBottomArea.launchCamera(mLastCameraLaunchSource), null,
                             true /* dismissShade */, false /* afterKeyguardGone */,
@@ -3411,7 +3414,7 @@
 
         @Override
         public void onSwipingStarted(boolean rightIcon) {
-            mFalsingManager.onAffordanceSwipingStarted(rightIcon);
+            mFalsingCollector.onAffordanceSwipingStarted(rightIcon);
             boolean
                     camera =
                     mView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? !rightIcon
@@ -3426,7 +3429,7 @@
 
         @Override
         public void onSwipingAborted() {
-            mFalsingManager.onAffordanceSwipingAborted();
+            mFalsingCollector.onAffordanceSwipingAborted();
             mKeyguardBottomArea.unbindCameraPrewarmService(false /* launched */);
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
index 3db3ab5..ba4fbb8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
@@ -36,6 +36,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.systemui.ExpandHelper;
 import com.android.systemui.R;
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.dock.DockManager;
 import com.android.systemui.doze.DozeLog;
 import com.android.systemui.plugins.FalsingManager;
@@ -73,6 +74,7 @@
     private final KeyguardBypassController mBypassController;
     private final PluginManager mPluginManager;
     private final FalsingManager mFalsingManager;
+    private final FalsingCollector mFalsingCollector;
     private final TunerService mTunerService;
     private final NotificationLockscreenUserManager mNotificationLockscreenUserManager;
     private final NotificationEntryManager mNotificationEntryManager;
@@ -118,6 +120,7 @@
             DynamicPrivacyController dynamicPrivacyController,
             KeyguardBypassController bypassController,
             FalsingManager falsingManager,
+            FalsingCollector falsingCollector,
             PluginManager pluginManager,
             TunerService tunerService,
             NotificationLockscreenUserManager notificationLockscreenUserManager,
@@ -140,6 +143,7 @@
         mDynamicPrivacyController = dynamicPrivacyController;
         mBypassController = bypassController;
         mFalsingManager = falsingManager;
+        mFalsingCollector = falsingCollector;
         mPluginManager = pluginManager;
         mTunerService = tunerService;
         mNotificationLockscreenUserManager = notificationLockscreenUserManager;
@@ -234,7 +238,7 @@
                 if (mTouchCancelled || mExpandAnimationRunning || mExpandAnimationPending) {
                     return false;
                 }
-                mFalsingManager.onTouchEvent(ev, mView.getWidth(), mView.getHeight());
+                mFalsingCollector.onTouchEvent(ev, mView.getWidth(), mView.getHeight());
                 mGestureDetector.onTouchEvent(ev);
                 if (mBrightnessMirror != null
                         && mBrightnessMirror.getVisibility() == View.VISIBLE) {
@@ -394,7 +398,7 @@
         setDragDownHelper(
                 new DragDownHelper(
                         mView.getContext(), mView, expandHelperCallback,
-                        dragDownCallback, mFalsingManager));
+                        dragDownCallback, mFalsingManager, mFalsingCollector));
 
         mDepthController.setRoot(mView);
         mNotificationPanelViewController.addExpansionListener(mDepthController);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index e6ac7dc..c8c5a63 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -147,6 +147,7 @@
 import com.android.systemui.assist.AssistManager;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.charging.WirelessChargingAnimation;
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.dagger.qualifiers.UiBackground;
 import com.android.systemui.demomode.DemoMode;
@@ -384,6 +385,7 @@
     private final StatusBarTouchableRegionManager mStatusBarTouchableRegionManager;
     private final DynamicPrivacyController mDynamicPrivacyController;
     private final BypassHeadsUpNotifier mBypassHeadsUpNotifier;
+    private final FalsingCollector mFalsingCollector;
     private final FalsingManager mFalsingManager;
     private final BroadcastDispatcher mBroadcastDispatcher;
     private final ConfigurationController mConfigurationController;
@@ -692,6 +694,7 @@
             DynamicPrivacyController dynamicPrivacyController,
             BypassHeadsUpNotifier bypassHeadsUpNotifier,
             FalsingManager falsingManager,
+            FalsingCollector falsingCollector,
             BroadcastDispatcher broadcastDispatcher,
             RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler,
             NotificationGutsManager notificationGutsManager,
@@ -772,6 +775,7 @@
         mStatusBarTouchableRegionManager = statusBarTouchableRegionManager;
         mDynamicPrivacyController = dynamicPrivacyController;
         mBypassHeadsUpNotifier = bypassHeadsUpNotifier;
+        mFalsingCollector = falsingCollector;
         mFalsingManager = falsingManager;
         mBroadcastDispatcher = broadcastDispatcher;
         mRemoteInputQuickSettingsDisabler = remoteInputQuickSettingsDisabler;
@@ -1389,7 +1393,7 @@
             where.getLocationInWindow(mTmpInt2);
             mWakeUpTouchLocation = new PointF(mTmpInt2[0] + where.getWidth() / 2,
                     mTmpInt2[1] + where.getHeight() / 2);
-            mFalsingManager.onScreenOnFromTouch();
+            mFalsingCollector.onScreenOnFromTouch();
         }
     }
 
@@ -1648,7 +1652,7 @@
             return;
         }
         mReportRejectedTouch.setVisibility(mState == StatusBarState.KEYGUARD && !mDozing
-                && mFalsingManager.isReportingEnabled() ? View.VISIBLE : View.INVISIBLE);
+                && mFalsingCollector.isReportingEnabled() ? View.VISIBLE : View.INVISIBLE);
     }
 
     /**
@@ -3685,7 +3689,7 @@
     }
 
     public void onUnlockHintStarted() {
-        mFalsingManager.onUnlockHintStarted();
+        mFalsingCollector.onUnlockHintStarted();
         mKeyguardIndicationController.showTransientIndication(R.string.keyguard_unlock);
     }
 
@@ -3695,17 +3699,17 @@
     }
 
     public void onCameraHintStarted() {
-        mFalsingManager.onCameraHintStarted();
+        mFalsingCollector.onCameraHintStarted();
         mKeyguardIndicationController.showTransientIndication(R.string.camera_hint);
     }
 
     public void onVoiceAssistHintStarted() {
-        mFalsingManager.onLeftAffordanceHintStarted();
+        mFalsingCollector.onLeftAffordanceHintStarted();
         mKeyguardIndicationController.showTransientIndication(R.string.voice_hint);
     }
 
     public void onPhoneHintStarted() {
-        mFalsingManager.onLeftAffordanceHintStarted();
+        mFalsingCollector.onLeftAffordanceHintStarted();
         mKeyguardIndicationController.showTransientIndication(R.string.phone_hint);
     }
 
@@ -3756,7 +3760,7 @@
         boolean fullShadeNeedsBouncer = !mLockscreenUserManager.
                 userAllowsPrivateNotificationsInPublic(mLockscreenUserManager.getCurrentUserId())
                 || !mLockscreenUserManager.shouldShowLockscreenNotifications()
-                || mFalsingManager.shouldEnforceBouncer();
+                || mFalsingCollector.shouldEnforceBouncer();
         if (mKeyguardBypassController.getBypassEnabled()) {
             fullShadeNeedsBouncer = false;
         }
@@ -3888,7 +3892,7 @@
     final ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() {
         @Override
         public void onScreenTurningOn() {
-            mFalsingManager.onScreenTurningOn();
+            mFalsingCollector.onScreenTurningOn();
             mNotificationPanelViewController.onScreenTurningOn();
         }
 
@@ -3899,7 +3903,7 @@
 
         @Override
         public void onScreenTurnedOff() {
-            mFalsingManager.onScreenOff();
+            mFalsingCollector.onScreenOff();
             mScrimController.onScreenTurnedOff();
             updateIsKeyguard();
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
index f6631ce..2aa3f37 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
@@ -31,6 +31,7 @@
 import com.android.systemui.InitController;
 import com.android.systemui.assist.AssistManager;
 import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.UiBackground;
@@ -136,6 +137,7 @@
             DynamicPrivacyController dynamicPrivacyController,
             BypassHeadsUpNotifier bypassHeadsUpNotifier,
             FalsingManager falsingManager,
+            FalsingCollector falsingCollector,
             BroadcastDispatcher broadcastDispatcher,
             RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler,
             NotificationGutsManager notificationGutsManager,
@@ -216,6 +218,7 @@
                 dynamicPrivacyController,
                 bypassHeadsUpNotifier,
                 falsingManager,
+                falsingCollector,
                 broadcastDispatcher,
                 remoteInputQuickSettingsDisabler,
                 notificationGutsManager,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/ClassifierTest.java
similarity index 82%
rename from packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ClassifierTest.java
rename to packages/SystemUI/tests/src/com/android/systemui/classifier/ClassifierTest.java
index 69d39fa..472ed7a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ClassifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/ClassifierTest.java
@@ -1,5 +1,5 @@
 /*
- * 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.systemui.classifier.Classifier.UNLOCK;
 
@@ -55,7 +55,7 @@
         resetDataProvider();
     }
 
-    FalsingDataProvider getDataProvider() {
+    protected FalsingDataProvider getDataProvider() {
         return mDataProvider;
     }
 
@@ -63,15 +63,15 @@
         return mFakeBatteryController;
     }
 
-    void setOffsetX(float offsetX) {
+    protected void setOffsetX(float offsetX) {
         mOffsetX = offsetX;
     }
 
-    void setOffsetY(float offsetY) {
+    protected void setOffsetY(float offsetY) {
         mOffsetY = offsetY;
     }
 
-    void resetDataProvider() {
+    protected void resetDataProvider() {
         for (MotionEvent motionEvent : mMotionEvents) {
             motionEvent.recycle();
         }
@@ -81,28 +81,28 @@
         mDataProvider.onSessionEnd();
     }
 
-    MotionEvent appendDownEvent(float x, float y) {
+    protected MotionEvent appendDownEvent(float x, float y) {
         return appendMotionEvent(MotionEvent.ACTION_DOWN, x, y);
     }
 
-    MotionEvent appendDownEvent(float x, float y, long eventTime) {
+    protected MotionEvent appendDownEvent(float x, float y, long eventTime) {
         return appendMotionEvent(MotionEvent.ACTION_DOWN, x, y, eventTime);
     }
 
-    MotionEvent appendMoveEvent(float x, float y) {
+    protected MotionEvent appendMoveEvent(float x, float y) {
         return appendMotionEvent(MotionEvent.ACTION_MOVE, x, y);
     }
 
-    MotionEvent appendMoveEvent(float x, float y, long eventTime) {
+    protected MotionEvent appendMoveEvent(float x, float y, long eventTime) {
         return appendMotionEvent(MotionEvent.ACTION_MOVE, x, y, eventTime);
     }
 
 
-    MotionEvent appendUpEvent(float x, float y) {
+    protected MotionEvent appendUpEvent(float x, float y) {
         return appendMotionEvent(MotionEvent.ACTION_UP, x, y);
     }
 
-    MotionEvent appendUpEvent(float x, float y, long eventTime) {
+    protected MotionEvent appendUpEvent(float x, float y, long eventTime) {
         return appendMotionEvent(MotionEvent.ACTION_UP, x, y, eventTime);
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
new file mode 100644
index 0000000..af5e789
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
@@ -0,0 +1,123 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.classifier;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.testing.AndroidTestingRunner;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.keyguard.KeyguardUpdateMonitor;
+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.util.sensors.ProximitySensor;
+import com.android.systemui.util.sensors.ThresholdSensor;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+public class FalsingCollectorImplTest extends SysuiTestCase {
+
+    private FalsingCollectorImpl mFalsingCollector;
+    @Mock
+    private FalsingDataProvider mFalsingDataProvider;
+    private final FalsingManagerFake mFalsingManager = new FalsingManagerFake();
+    @Mock
+    private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+    @Mock
+    private ProximitySensor mProximitySensor;
+    @Mock
+    private SysuiStatusBarStateController mStatusBarStateController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD);
+
+        mFalsingCollector = new FalsingCollectorImpl(mFalsingDataProvider, mFalsingManager,
+                mKeyguardUpdateMonitor, mProximitySensor, mStatusBarStateController);
+    }
+
+
+    @Test
+    public void testRegisterSensor() {
+        mFalsingCollector.onScreenTurningOn();
+        verify(mProximitySensor).register(any(ThresholdSensor.Listener.class));
+    }
+
+    @Test
+    public void testNoProximityWhenWirelessCharging() {
+        when(mFalsingDataProvider.isWirelessCharging()).thenReturn(true);
+        mFalsingCollector.onScreenTurningOn();
+        verify(mProximitySensor, never()).register(any(ThresholdSensor.Listener.class));
+    }
+
+    @Test
+    public void testUnregisterSensor() {
+        mFalsingCollector.onScreenTurningOn();
+        reset(mProximitySensor);
+        mFalsingCollector.onScreenOff();
+        verify(mProximitySensor).unregister(any(ThresholdSensor.Listener.class));
+    }
+
+    @Test
+    public void testUnregisterSensor_QS() {
+        mFalsingCollector.onScreenTurningOn();
+        reset(mProximitySensor);
+        mFalsingCollector.setQsExpanded(true);
+        verify(mProximitySensor).unregister(any(ThresholdSensor.Listener.class));
+        mFalsingCollector.setQsExpanded(false);
+        verify(mProximitySensor).register(any(ThresholdSensor.Listener.class));
+    }
+
+    @Test
+    public void testUnregisterSensor_Bouncer() {
+        mFalsingCollector.onScreenTurningOn();
+        reset(mProximitySensor);
+        mFalsingCollector.onBouncerShown();
+        verify(mProximitySensor).unregister(any(ThresholdSensor.Listener.class));
+        mFalsingCollector.onBouncerHidden();
+        verify(mProximitySensor).register(any(ThresholdSensor.Listener.class));
+    }
+
+    @Test
+    public void testUnregisterSensor_StateTransition() {
+
+        ArgumentCaptor<StatusBarStateController.StateListener> stateListenerArgumentCaptor =
+                ArgumentCaptor.forClass(StatusBarStateController.StateListener.class);
+        verify(mStatusBarStateController).addCallback(stateListenerArgumentCaptor.capture());
+
+        mFalsingCollector.onScreenTurningOn();
+        reset(mProximitySensor);
+        stateListenerArgumentCaptor.getValue().onStateChanged(StatusBarState.SHADE);
+        verify(mProximitySensor).unregister(any(ThresholdSensor.Listener.class));
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/FalsingDataProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java
similarity index 94%
rename from packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/FalsingDataProviderTest.java
rename to packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java
index be38f4419..be0cc97 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/FalsingDataProviderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java
@@ -1,5 +1,5 @@
 /*
- * 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 org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.Matchers.closeTo;
@@ -112,13 +112,6 @@
         assertThat(motionEventList.get(1).getX(), is(6f));
         assertThat(motionEventList.get(0).getY(), is(7f));
         assertThat(motionEventList.get(1).getY(), is(5f));
-
-        // The first, real event should still be a, however.
-        MotionEvent firstRealMotionEvent = mDataProvider.getFirstActualMotionEvent();
-        assertThat(firstRealMotionEvent.getActionMasked(), is(MotionEvent.ACTION_DOWN));
-        assertThat(firstRealMotionEvent.getEventTime(), is(1L));
-        assertThat(firstRealMotionEvent.getX(), is(2f));
-        assertThat(firstRealMotionEvent.getY(), is(9f));
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/BrightLineFalsingManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/BrightLineFalsingManagerTest.java
deleted file mode 100644
index 30dddc0..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/BrightLineFalsingManagerTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * 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.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.classifier.brightline;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.res.Resources;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.util.DisplayMetrics;
-import android.view.ViewConfiguration;
-
-import com.android.internal.logging.testing.UiEventLoggerFake;
-import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.systemui.R;
-import com.android.systemui.dock.DockManager;
-import com.android.systemui.dock.DockManagerFake;
-import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.statusbar.StatusBarStateControllerImpl;
-import com.android.systemui.statusbar.SysuiStatusBarStateController;
-import com.android.systemui.util.DeviceConfigProxy;
-import com.android.systemui.util.DeviceConfigProxyFake;
-import com.android.systemui.util.sensors.ProximitySensor;
-import com.android.systemui.util.sensors.ThresholdSensor;
-import com.android.systemui.util.time.FakeSystemClock;
-import com.android.systemui.utils.leaks.FakeBatteryController;
-import com.android.systemui.utils.leaks.LeakCheckedTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-public class BrightLineFalsingManagerTest extends LeakCheckedTest {
-
-
-    @Mock
-    private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
-    @Mock
-    private ProximitySensor mProximitySensor;
-    @Mock
-    private Resources mResources;
-    @Mock
-    private ViewConfiguration mViewConfiguration;
-    private SysuiStatusBarStateController mStatusBarStateController;
-    private FalsingDataProvider mFalsingDataProvider;
-    private FakeBatteryController mFakeBatteryController;
-
-    private BrightLineFalsingManager mFalsingManager;
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-        mFakeBatteryController = new FakeBatteryController(getLeakCheck());
-        DisplayMetrics dm = new DisplayMetrics();
-        dm.xdpi = 100;
-        dm.ydpi = 100;
-        dm.widthPixels = 100;
-        dm.heightPixels = 100;
-        mFalsingDataProvider = new FalsingDataProvider(dm, mFakeBatteryController,
-                new FakeSystemClock());
-        DeviceConfigProxy deviceConfigProxy = new DeviceConfigProxyFake();
-        DockManager dockManager = new DockManagerFake();
-        mStatusBarStateController = new StatusBarStateControllerImpl(new UiEventLoggerFake());
-        mStatusBarStateController.setState(StatusBarState.KEYGUARD);
-        when(mResources.getDimension(R.dimen.double_tap_slop)).thenReturn(1f);
-        when(mViewConfiguration.getScaledTouchSlop()).thenReturn(1);
-        mFalsingManager = new BrightLineFalsingManager(mFalsingDataProvider,
-                mKeyguardUpdateMonitor, mProximitySensor, deviceConfigProxy, mResources,
-                mViewConfiguration, dockManager, mStatusBarStateController);
-    }
-
-    @Test
-    public void testRegisterSensor() {
-        mFalsingManager.onScreenTurningOn();
-        verify(mProximitySensor).register(any(ThresholdSensor.Listener.class));
-    }
-
-    @Test
-    public void testNoProximityWhenWirelessCharging() {
-        mFakeBatteryController.setWirelessCharging(true);
-        mFalsingManager.onScreenTurningOn();
-        verify(mProximitySensor, never()).register(any(ThresholdSensor.Listener.class));
-    }
-
-    @Test
-    public void testUnregisterSensor() {
-        mFalsingManager.onScreenTurningOn();
-        reset(mProximitySensor);
-        mFalsingManager.onScreenOff();
-        verify(mProximitySensor).unregister(any(ThresholdSensor.Listener.class));
-    }
-
-    @Test
-    public void testUnregisterSensor_QS() {
-        mFalsingManager.onScreenTurningOn();
-        reset(mProximitySensor);
-        mFalsingManager.setQsExpanded(true);
-        verify(mProximitySensor).unregister(any(ThresholdSensor.Listener.class));
-        mFalsingManager.setQsExpanded(false);
-        verify(mProximitySensor).register(any(ThresholdSensor.Listener.class));
-    }
-
-    @Test
-    public void testUnregisterSensor_Bouncer() {
-        mFalsingManager.onScreenTurningOn();
-        reset(mProximitySensor);
-        mFalsingManager.onBouncerShown();
-        verify(mProximitySensor).unregister(any(ThresholdSensor.Listener.class));
-        mFalsingManager.onBouncerHidden();
-        verify(mProximitySensor).register(any(ThresholdSensor.Listener.class));
-    }
-
-    @Test
-    public void testUnregisterSensor_StateTransition() {
-        mFalsingManager.onScreenTurningOn();
-        reset(mProximitySensor);
-        mStatusBarStateController.setState(StatusBarState.SHADE);
-        verify(mProximitySensor).unregister(any(ThresholdSensor.Listener.class));
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/DiagonalClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/DiagonalClassifierTest.java
index e88ff2d..714d658 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/DiagonalClassifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/DiagonalClassifierTest.java
@@ -27,6 +27,8 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.systemui.classifier.ClassifierTest;
+import com.android.systemui.classifier.FalsingDataProvider;
 import com.android.systemui.util.DeviceConfigProxyFake;
 
 import org.junit.After;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/DistanceClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/DistanceClassifierTest.java
index e5ab9be..d66c7a9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/DistanceClassifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/DistanceClassifierTest.java
@@ -23,6 +23,8 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.systemui.classifier.ClassifierTest;
+import com.android.systemui.classifier.FalsingDataProvider;
 import com.android.systemui.util.DeviceConfigProxyFake;
 
 import org.junit.After;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/DoubleTapClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/DoubleTapClassifierTest.java
index 9f3a1e4..288ab0a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/DoubleTapClassifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/DoubleTapClassifierTest.java
@@ -27,6 +27,9 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.systemui.classifier.ClassifierTest;
+import com.android.systemui.classifier.FalsingDataProvider;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/PointerCountClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/PointerCountClassifierTest.java
index 4f8e7c8..b512f0d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/PointerCountClassifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/PointerCountClassifierTest.java
@@ -26,6 +26,8 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.systemui.classifier.ClassifierTest;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ProximityClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ProximityClassifierTest.java
index 3cebf0d..c2e290f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ProximityClassifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ProximityClassifierTest.java
@@ -28,6 +28,8 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.systemui.classifier.ClassifierTest;
+import com.android.systemui.classifier.FalsingDataProvider;
 import com.android.systemui.util.DeviceConfigProxyFake;
 import com.android.systemui.util.sensors.ProximitySensor;
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/SingleTapClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/SingleTapClassifierTest.java
index 642b077..d67f2b8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/SingleTapClassifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/SingleTapClassifierTest.java
@@ -25,6 +25,9 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.systemui.classifier.ClassifierTest;
+import com.android.systemui.classifier.FalsingDataProvider;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/TypeClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/TypeClassifierTest.java
index 4346e7d..5f3b84c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/TypeClassifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/TypeClassifierTest.java
@@ -33,6 +33,9 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.systemui.classifier.ClassifierTest;
+import com.android.systemui.classifier.FalsingDataProvider;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ZigZagClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ZigZagClassifierTest.java
index a8cce00..e49262f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ZigZagClassifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ZigZagClassifierTest.java
@@ -23,6 +23,7 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.systemui.classifier.ClassifierTest;
 import com.android.systemui.util.DeviceConfigProxyFake;
 
 import org.junit.After;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
index f6d6f562..67d0295 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
@@ -41,7 +41,7 @@
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.classifier.FalsingManagerFake;
+import com.android.systemui.classifier.FalsingCollectorFake;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.navigationbar.NavigationModeController;
 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -76,18 +76,18 @@
     private DeviceConfigProxy mDeviceConfig = new DeviceConfigProxyFake();
     private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
 
-    private FalsingManagerFake mFalsingManager;
+    private FalsingCollectorFake mFalsingCollector;
 
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-        mFalsingManager = new FalsingManagerFake();
+        mFalsingCollector = new FalsingCollectorFake();
 
         when(mLockPatternUtils.getDevicePolicyManager()).thenReturn(mDevicePolicyManager);
         when(mPowerManager.newWakeLock(anyInt(), any())).thenReturn(mock(WakeLock.class));
 
         mViewMediator = new KeyguardViewMediator(
-                mContext, mFalsingManager, mLockPatternUtils, mBroadcastDispatcher,
+                mContext, mFalsingCollector, mLockPatternUtils, mBroadcastDispatcher,
                 () -> mStatusBarKeyguardViewManager,
                 mDismissCallbackRegistry, mUpdateMonitor, mDumpManager, mUiBgExecutor,
                 mPowerManager, mTrustManager, mDeviceConfig, mNavigationModeController,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java
index dbaf5c4..ababebd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java
@@ -44,9 +44,9 @@
 import com.android.internal.util.NotificationMessagingUtil;
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.classifier.FalsingCollectorFake;
 import com.android.systemui.media.MediaFeatureFlag;
 import com.android.systemui.media.dialog.MediaOutputDialogFactory;
-import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.shared.plugins.PluginManager;
 import com.android.systemui.statusbar.FeatureFlags;
@@ -129,7 +129,6 @@
     @Mock(answer = Answers.RETURNS_SELF)
     private ExpandableNotificationRowComponent.Builder mExpandableNotificationRowComponentBuilder;
     @Mock private ExpandableNotificationRowComponent mExpandableNotificationRowComponent;
-    @Mock private FalsingManager mFalsingManager;
     @Mock private KeyguardBypassController mKeyguardBypassController;
     @Mock private StatusBarStateController mStatusBarStateController;
 
@@ -244,7 +243,7 @@
                                 mGutsManager,
                                 true,
                                 null,
-                                mFalsingManager,
+                                new FalsingCollectorFake(),
                                 mPeopleNotificationIdentifier,
                                 Optional.of(mock(BubblesManager.class))
                         ));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
index baae8fd..7470a13 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
@@ -45,9 +45,9 @@
 
 import com.android.systemui.R;
 import com.android.systemui.TestableDependency;
+import com.android.systemui.classifier.FalsingCollectorFake;
 import com.android.systemui.media.MediaFeatureFlag;
 import com.android.systemui.media.dialog.MediaOutputDialogFactory;
-import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.statusbar.NotificationMediaManager;
 import com.android.systemui.statusbar.NotificationRemoteInputManager;
@@ -428,7 +428,7 @@
                 mock(OnExpandClickListener.class),
                 mock(NotificationMediaManager.class),
                 mock(ExpandableNotificationRow.CoordinateOnClickListener.class),
-                mock(FalsingManager.class),
+                new FalsingCollectorFake(),
                 mStatusBarStateController,
                 mPeopleNotificationIdentifier,
                 mock(OnUserInteractionCallback.class),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollerControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollerControllerTest.java
index 01d49c2..3c4fde8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollerControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollerControllerTest.java
@@ -42,9 +42,9 @@
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.classifier.FalsingCollectorFake;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.media.KeyguardMediaController;
-import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEventListener;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -106,7 +106,6 @@
     @Mock private SysuiColorExtractor mColorExtractor;
     @Mock private NotificationLockscreenUserManager mNotificationLockscreenUserManager;
     @Mock private MetricsLogger mMetricsLogger;
-    @Mock private FalsingManager mFalsingManager;
     @Mock private Resources mResources;
     @Mock(answer = Answers.RETURNS_SELF)
     private NotificationSwipeHelper.Builder mNotificationSwipeHelperBuilder;
@@ -160,7 +159,7 @@
                 mColorExtractor,
                 mNotificationLockscreenUserManager,
                 mMetricsLogger,
-                mFalsingManager,
+                new FalsingCollectorFake(),
                 mResources,
                 mNotificationSwipeHelperBuilder,
                 mStatusBar,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
index 1b05ad7..bc014ec 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
@@ -50,9 +50,9 @@
 import com.android.keyguard.dagger.KeyguardBouncerComponent;
 import com.android.systemui.DejankUtils;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
 import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
-import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 
 import org.junit.Assert;
@@ -72,7 +72,7 @@
 public class KeyguardBouncerTest extends SysuiTestCase {
 
     @Mock
-    private FalsingManager mFalsingManager;
+    private FalsingCollector mFalsingCollector;
     @Mock
     private ViewMediatorCallback mViewMediatorCallback;
     @Mock
@@ -128,7 +128,7 @@
 
         final ViewGroup container = new FrameLayout(getContext());
         mBouncer = new KeyguardBouncer.Factory(getContext(), mViewMediatorCallback,
-                mDismissCallbackRegistry, mFalsingManager,
+                mDismissCallbackRegistry, mFalsingCollector,
                 mKeyguardStateController, mKeyguardUpdateMonitor,
                 mKeyguardBypassController, mHandler, mKeyguardSecurityModel,
                 mKeyguardBouncerComponentFactory)
@@ -143,10 +143,10 @@
     @Test
     public void testShow_notifiesFalsingManager() {
         mBouncer.show(true);
-        verify(mFalsingManager).onBouncerShown();
+        verify(mFalsingCollector).onBouncerShown();
 
         mBouncer.show(true, false);
-        verifyNoMoreInteractions(mFalsingManager);
+        verifyNoMoreInteractions(mFalsingCollector);
     }
 
     /**
@@ -212,11 +212,11 @@
         mBouncer.setExpansion(0.5f);
 
         mBouncer.setExpansion(KeyguardBouncer.EXPANSION_HIDDEN);
-        verify(mFalsingManager).onBouncerHidden();
+        verify(mFalsingCollector).onBouncerHidden();
         verify(mExpansionCallback).onFullyHidden();
 
         mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE);
-        verify(mFalsingManager).onBouncerShown();
+        verify(mFalsingCollector).onBouncerShown();
         verify(mExpansionCallback).onFullyShown();
 
         verify(mExpansionCallback, never()).onStartingToHide();
@@ -239,7 +239,7 @@
     @Test
     public void testHide_notifiesFalsingManager() {
         mBouncer.hide(false);
-        verify(mFalsingManager).onBouncerHidden();
+        verify(mFalsingCollector).onBouncerHidden();
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
index 4841b3b..3d582e7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
@@ -60,10 +60,10 @@
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.biometrics.AuthController;
+import com.android.systemui.classifier.FalsingCollectorFake;
 import com.android.systemui.classifier.FalsingManagerFake;
 import com.android.systemui.doze.DozeLog;
 import com.android.systemui.media.MediaHierarchyManager;
-import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.qs.QSDetailDisplayer;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.KeyguardAffordanceView;
@@ -132,8 +132,6 @@
     @Mock
     private KeyguardUpdateMonitor mUpdateMonitor;
     @Mock
-    private FalsingManager mFalsingManager;
-    @Mock
     private KeyguardBypassController mKeyguardBypassController;
     @Mock
     private DozeParameters mDozeParameters;
@@ -252,7 +250,7 @@
                 mKeyguardBypassController, mHeadsUpManager,
                 mock(NotificationRoundnessManager.class),
                 mStatusBarStateController,
-                new FalsingManagerFake());
+                new FalsingManagerFake(), new FalsingCollectorFake());
         when(mKeyguardStatusViewComponentFactory.build(any()))
                 .thenReturn(mKeyguardStatusViewComponent);
         when(mKeyguardStatusViewComponent.getKeyguardClockSwitchController())
@@ -263,7 +261,7 @@
                 mResources,
                 mInjectionInflationController,
                 coordinator, expansionHandler, mDynamicPrivacyController, mKeyguardBypassController,
-                mFalsingManager, mShadeController,
+                new FalsingManagerFake(), new FalsingCollectorFake(), mShadeController,
                 mNotificationLockscreenUserManager, mNotificationEntryManager,
                 mKeyguardStateController, mStatusBarStateController, mDozeLog,
                 mDozeParameters, mCommandQueue, mVibratorHelper,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
index 25af584..e0fa9bab 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
@@ -30,6 +30,7 @@
 import com.android.systemui.R;
 import com.android.systemui.SystemUIFactory;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.classifier.FalsingCollectorFake;
 import com.android.systemui.classifier.FalsingManagerFake;
 import com.android.systemui.dock.DockManager;
 import com.android.systemui.doze.DozeLog;
@@ -111,6 +112,7 @@
                 mDynamicPrivacyController,
                 mBypassController,
                 new FalsingManagerFake(),
+                new FalsingCollectorFake(),
                 mPluginManager,
                 mTunerService,
                 mNotificationLockScreenUserManager,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index 710122d..5416f75 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -83,6 +83,7 @@
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.assist.AssistManager;
 import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.classifier.FalsingCollectorFake;
 import com.android.systemui.classifier.FalsingManagerFake;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.demomode.DemoModeController;
@@ -356,6 +357,7 @@
                 mDynamicPrivacyController,
                 mBypassHeadsUpNotifier,
                 new FalsingManagerFake(),
+                new FalsingCollectorFake(),
                 mBroadcastDispatcher,
                 new RemoteInputQuickSettingsDisabler(
                         mContext,