Loading packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java +37 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ import java.io.PrintWriter; */ @ProvidesInterface(version = FalsingManager.VERSION) public interface FalsingManager { int VERSION = 5; int VERSION = 6; void onSuccessfulUnlock(); Loading @@ -45,6 +45,42 @@ public interface FalsingManager { /** Returns true if the gesture should be rejected. */ boolean isFalseTouch(int interactionType); /** * Returns true if the FalsingManager thinks the last gesure was not a valid tap. * * Accepts one parameter, robustCheck, that distinctly changes behavior. When set to false, * this method simply looks at the last gesture and returns whether it is a tap or not, (as * opposed to a swipe or other non-tap gesture). When set to true, a more thorough analysis * is performed that can include historical interactions and other contextual cues to see * if the tap looks accidental. * * Set robustCheck to true if you want to validate a tap for launching an action, like opening * a notification. Set to false if you simply want to know if the last gesture looked like a * tap. */ boolean isFalseTap(boolean robustCheck); /** * Returns true if the last two gestures do not look like a double tap. * * Only works on data that has already been reported to the FalsingManager. Be sure that * {@link #onTouchEvent(MotionEvent, int, int)} has already been called for all of the * taps you want considered. * * This looks at the last two gestures on the screen, ensuring that they meet the following * criteria: * * a) There are at least two gestures. * b) The last two gestures look like taps. * c) The last two gestures look like a double tap taken together. * * This method is _not_ context aware. That is to say, if two taps occur on two neighboring * views, but are otherwise close to one another, this will report a successful double tap. * It is up to the caller to decide * @return */ boolean isFalseDoubleTap(); void onNotificatonStopDraggingDown(); void setNotificationExpanded(); Loading packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java +25 −0 Original line number Diff line number Diff line Loading @@ -29,10 +29,13 @@ import java.io.PrintWriter; */ public class FalsingManagerFake implements FalsingManager { private boolean mIsFalseTouch; private boolean mIsFalseTap; private boolean mIsFalseDoubleTap; private boolean mIsUnlockingDisabled; private boolean mIsClassiferEnabled; private boolean mShouldEnforceBouncer; private boolean mIsReportingEnabled; private boolean mIsFalseRobustTap; @Override public void onSuccessfulUnlock() { Loading Loading @@ -74,6 +77,28 @@ public class FalsingManagerFake implements FalsingManager { return mIsFalseTouch; } public void setFalseRobustTap(boolean falseRobustTap) { mIsFalseRobustTap = falseRobustTap; } public void setFalseTap(boolean falseTap) { mIsFalseTap = falseTap; } public void setFalseDoubleTap(boolean falseDoubleTap) { mIsFalseDoubleTap = falseDoubleTap; } @Override public boolean isFalseTap(boolean robustCheck) { return robustCheck ? mIsFalseRobustTap : mIsFalseTap; } @Override public boolean isFalseDoubleTap() { return mIsFalseDoubleTap; } @Override public void onNotificatonStopDraggingDown() { Loading packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java +10 −0 Original line number Diff line number Diff line Loading @@ -328,6 +328,16 @@ public class FalsingManagerImpl implements FalsingManager { return isFalse; } @Override public boolean isFalseTap(boolean robustCheck) { return true; } @Override public boolean isFalseDoubleTap() { return false; } private void clearPendingWtf() { if (mPendingWtf != null) { mHandler.removeCallbacks(mPendingWtf); Loading packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java +21 −0 Original line number Diff line number Diff line Loading @@ -19,10 +19,12 @@ package com.android.systemui.classifier; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_MANAGER_ENABLED; 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; Loading Loading @@ -61,6 +63,8 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable { private static final String PROXIMITY_SENSOR_TAG = "FalsingManager"; private final ProximitySensor mProximitySensor; private final Resources mResources; private final ViewConfiguration mViewConfiguration; private final FalsingDataProvider mFalsingDataProvider; private FalsingManager mInternalFalsingManager; private DeviceConfig.OnPropertiesChangedListener mDeviceConfigListener; Loading @@ -79,12 +83,16 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable { DumpManager dumpManager, @UiBackground Executor uiBgExecutor, StatusBarStateController statusBarStateController, @Main Resources resources, ViewConfiguration viewConfiguration, FalsingDataProvider falsingDataProvider) { mProximitySensor = proximitySensor; mDockManager = dockManager; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mUiBgExecutor = uiBgExecutor; mStatusBarStateController = statusBarStateController; mResources = resources; mViewConfiguration = viewConfiguration; mFalsingDataProvider = falsingDataProvider; mProximitySensor.setTag(PROXIMITY_SENSOR_TAG); mProximitySensor.setDelay(SensorManager.SENSOR_DELAY_GAME); Loading Loading @@ -147,6 +155,8 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable { mKeyguardUpdateMonitor, mProximitySensor, mDeviceConfig, mResources, mViewConfiguration, mDockManager, mStatusBarStateController ); Loading Loading @@ -191,6 +201,17 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable { return mInternalFalsingManager.isFalseTouch(interactionType); } @Override public boolean isFalseTap(boolean robustCheck) { return mInternalFalsingManager.isFalseTap(robustCheck); } @Override public boolean isFalseDoubleTap() { return mInternalFalsingManager.isFalseDoubleTap(); } @Override public void onNotificatonStopDraggingDown() { mInternalFalsingManager.onNotificatonStartDraggingDown(); Loading packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java +46 −2 Original line number Diff line number Diff line Loading @@ -20,21 +20,26 @@ import static com.android.systemui.classifier.FalsingManagerImpl.FALSING_REMAIN_ import static com.android.systemui.classifier.FalsingManagerImpl.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.Log; import android.view.MotionEvent; import android.view.ViewConfiguration; import com.android.internal.logging.MetricsLogger; import com.android.internal.util.IndentingPrintWriter; 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.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; Loading Loading @@ -64,6 +69,8 @@ public class BrightLineFalsingManager implements FalsingManager { 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 int mIsFalseTouchCalls; Loading Loading @@ -106,8 +113,9 @@ public class BrightLineFalsingManager implements FalsingManager { public BrightLineFalsingManager(FalsingDataProvider falsingDataProvider, KeyguardUpdateMonitor keyguardUpdateMonitor, ProximitySensor proximitySensor, DeviceConfigProxy deviceConfigProxy, DockManager dockManager, StatusBarStateController statusBarStateController) { DeviceConfigProxy deviceConfigProxy, @Main Resources resources, ViewConfiguration viewConfiguration, DockManager dockManager, StatusBarStateController statusBarStateController) { mKeyguardUpdateMonitor = keyguardUpdateMonitor; mDataProvider = falsingDataProvider; mProximitySensor = proximitySensor; Loading @@ -129,6 +137,12 @@ public class BrightLineFalsingManager implements FalsingManager { mClassifiers.add(distanceClassifier); mClassifiers.add(proximityClassifier); mClassifiers.add(new ZigZagClassifier(mDataProvider, deviceConfigProxy)); mSingleTapClassifier = new SingleTapClassifier( mDataProvider, viewConfiguration.getScaledTouchSlop()); mDoubleTapClassifier = new DoubleTapClassifier(mDataProvider, mSingleTapClassifier, resources.getDimension(R.dimen.double_tap_slop), NotificationTapHelper.DOUBLE_TAP_TIMEOUT_MS); } private void registerSensors() { Loading Loading @@ -236,6 +250,36 @@ public class BrightLineFalsingManager implements FalsingManager { return mPreviousResult; } @Override public boolean isFalseTap(boolean robustCheck) { if (!mSingleTapClassifier.isTap(mDataProvider.getRecentMotionEvents())) { logInfo(String.format( (Locale) null, "{classifier=%s}", mSingleTapClassifier.getClass().getName())); String reason = mSingleTapClassifier.getReason(); if (reason != null) { logInfo(reason); } return true; } // TODO(b/172655679): we always reject single-taps when doing a robust check for now. return robustCheck; } @Override public boolean isFalseDoubleTap() { boolean result = mDoubleTapClassifier.isFalseTouch(); if (result) { logInfo(String.format( (Locale) null, "{classifier=%s}", mDoubleTapClassifier.getClass().getName())); String reason = mDoubleTapClassifier.getReason(); if (reason != null) { logInfo(reason); } } return result; } @Override 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 Loading Loading
packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java +37 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ import java.io.PrintWriter; */ @ProvidesInterface(version = FalsingManager.VERSION) public interface FalsingManager { int VERSION = 5; int VERSION = 6; void onSuccessfulUnlock(); Loading @@ -45,6 +45,42 @@ public interface FalsingManager { /** Returns true if the gesture should be rejected. */ boolean isFalseTouch(int interactionType); /** * Returns true if the FalsingManager thinks the last gesure was not a valid tap. * * Accepts one parameter, robustCheck, that distinctly changes behavior. When set to false, * this method simply looks at the last gesture and returns whether it is a tap or not, (as * opposed to a swipe or other non-tap gesture). When set to true, a more thorough analysis * is performed that can include historical interactions and other contextual cues to see * if the tap looks accidental. * * Set robustCheck to true if you want to validate a tap for launching an action, like opening * a notification. Set to false if you simply want to know if the last gesture looked like a * tap. */ boolean isFalseTap(boolean robustCheck); /** * Returns true if the last two gestures do not look like a double tap. * * Only works on data that has already been reported to the FalsingManager. Be sure that * {@link #onTouchEvent(MotionEvent, int, int)} has already been called for all of the * taps you want considered. * * This looks at the last two gestures on the screen, ensuring that they meet the following * criteria: * * a) There are at least two gestures. * b) The last two gestures look like taps. * c) The last two gestures look like a double tap taken together. * * This method is _not_ context aware. That is to say, if two taps occur on two neighboring * views, but are otherwise close to one another, this will report a successful double tap. * It is up to the caller to decide * @return */ boolean isFalseDoubleTap(); void onNotificatonStopDraggingDown(); void setNotificationExpanded(); Loading
packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java +25 −0 Original line number Diff line number Diff line Loading @@ -29,10 +29,13 @@ import java.io.PrintWriter; */ public class FalsingManagerFake implements FalsingManager { private boolean mIsFalseTouch; private boolean mIsFalseTap; private boolean mIsFalseDoubleTap; private boolean mIsUnlockingDisabled; private boolean mIsClassiferEnabled; private boolean mShouldEnforceBouncer; private boolean mIsReportingEnabled; private boolean mIsFalseRobustTap; @Override public void onSuccessfulUnlock() { Loading Loading @@ -74,6 +77,28 @@ public class FalsingManagerFake implements FalsingManager { return mIsFalseTouch; } public void setFalseRobustTap(boolean falseRobustTap) { mIsFalseRobustTap = falseRobustTap; } public void setFalseTap(boolean falseTap) { mIsFalseTap = falseTap; } public void setFalseDoubleTap(boolean falseDoubleTap) { mIsFalseDoubleTap = falseDoubleTap; } @Override public boolean isFalseTap(boolean robustCheck) { return robustCheck ? mIsFalseRobustTap : mIsFalseTap; } @Override public boolean isFalseDoubleTap() { return mIsFalseDoubleTap; } @Override public void onNotificatonStopDraggingDown() { Loading
packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java +10 −0 Original line number Diff line number Diff line Loading @@ -328,6 +328,16 @@ public class FalsingManagerImpl implements FalsingManager { return isFalse; } @Override public boolean isFalseTap(boolean robustCheck) { return true; } @Override public boolean isFalseDoubleTap() { return false; } private void clearPendingWtf() { if (mPendingWtf != null) { mHandler.removeCallbacks(mPendingWtf); Loading
packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java +21 −0 Original line number Diff line number Diff line Loading @@ -19,10 +19,12 @@ package com.android.systemui.classifier; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_MANAGER_ENABLED; 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; Loading Loading @@ -61,6 +63,8 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable { private static final String PROXIMITY_SENSOR_TAG = "FalsingManager"; private final ProximitySensor mProximitySensor; private final Resources mResources; private final ViewConfiguration mViewConfiguration; private final FalsingDataProvider mFalsingDataProvider; private FalsingManager mInternalFalsingManager; private DeviceConfig.OnPropertiesChangedListener mDeviceConfigListener; Loading @@ -79,12 +83,16 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable { DumpManager dumpManager, @UiBackground Executor uiBgExecutor, StatusBarStateController statusBarStateController, @Main Resources resources, ViewConfiguration viewConfiguration, FalsingDataProvider falsingDataProvider) { mProximitySensor = proximitySensor; mDockManager = dockManager; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mUiBgExecutor = uiBgExecutor; mStatusBarStateController = statusBarStateController; mResources = resources; mViewConfiguration = viewConfiguration; mFalsingDataProvider = falsingDataProvider; mProximitySensor.setTag(PROXIMITY_SENSOR_TAG); mProximitySensor.setDelay(SensorManager.SENSOR_DELAY_GAME); Loading Loading @@ -147,6 +155,8 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable { mKeyguardUpdateMonitor, mProximitySensor, mDeviceConfig, mResources, mViewConfiguration, mDockManager, mStatusBarStateController ); Loading Loading @@ -191,6 +201,17 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable { return mInternalFalsingManager.isFalseTouch(interactionType); } @Override public boolean isFalseTap(boolean robustCheck) { return mInternalFalsingManager.isFalseTap(robustCheck); } @Override public boolean isFalseDoubleTap() { return mInternalFalsingManager.isFalseDoubleTap(); } @Override public void onNotificatonStopDraggingDown() { mInternalFalsingManager.onNotificatonStartDraggingDown(); Loading
packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java +46 −2 Original line number Diff line number Diff line Loading @@ -20,21 +20,26 @@ import static com.android.systemui.classifier.FalsingManagerImpl.FALSING_REMAIN_ import static com.android.systemui.classifier.FalsingManagerImpl.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.Log; import android.view.MotionEvent; import android.view.ViewConfiguration; import com.android.internal.logging.MetricsLogger; import com.android.internal.util.IndentingPrintWriter; 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.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; Loading Loading @@ -64,6 +69,8 @@ public class BrightLineFalsingManager implements FalsingManager { 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 int mIsFalseTouchCalls; Loading Loading @@ -106,8 +113,9 @@ public class BrightLineFalsingManager implements FalsingManager { public BrightLineFalsingManager(FalsingDataProvider falsingDataProvider, KeyguardUpdateMonitor keyguardUpdateMonitor, ProximitySensor proximitySensor, DeviceConfigProxy deviceConfigProxy, DockManager dockManager, StatusBarStateController statusBarStateController) { DeviceConfigProxy deviceConfigProxy, @Main Resources resources, ViewConfiguration viewConfiguration, DockManager dockManager, StatusBarStateController statusBarStateController) { mKeyguardUpdateMonitor = keyguardUpdateMonitor; mDataProvider = falsingDataProvider; mProximitySensor = proximitySensor; Loading @@ -129,6 +137,12 @@ public class BrightLineFalsingManager implements FalsingManager { mClassifiers.add(distanceClassifier); mClassifiers.add(proximityClassifier); mClassifiers.add(new ZigZagClassifier(mDataProvider, deviceConfigProxy)); mSingleTapClassifier = new SingleTapClassifier( mDataProvider, viewConfiguration.getScaledTouchSlop()); mDoubleTapClassifier = new DoubleTapClassifier(mDataProvider, mSingleTapClassifier, resources.getDimension(R.dimen.double_tap_slop), NotificationTapHelper.DOUBLE_TAP_TIMEOUT_MS); } private void registerSensors() { Loading Loading @@ -236,6 +250,36 @@ public class BrightLineFalsingManager implements FalsingManager { return mPreviousResult; } @Override public boolean isFalseTap(boolean robustCheck) { if (!mSingleTapClassifier.isTap(mDataProvider.getRecentMotionEvents())) { logInfo(String.format( (Locale) null, "{classifier=%s}", mSingleTapClassifier.getClass().getName())); String reason = mSingleTapClassifier.getReason(); if (reason != null) { logInfo(reason); } return true; } // TODO(b/172655679): we always reject single-taps when doing a robust check for now. return robustCheck; } @Override public boolean isFalseDoubleTap() { boolean result = mDoubleTapClassifier.isFalseTouch(); if (result) { logInfo(String.format( (Locale) null, "{classifier=%s}", mDoubleTapClassifier.getClass().getName())); String reason = mDoubleTapClassifier.getReason(); if (reason != null) { logInfo(reason); } } return result; } @Override 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 Loading