Disable falsing when resting on a Dock.

Fix typo: Classifer -> Classifier.

Use Executor instead of Handler in falsing related code.

Show a dump of BrightLingFalsing related information.

Bug: 139785197
Test: atest SystemUITests && manual.
Change-Id: I3be68cb9f27ccfb5a686947cc85aae74f21f099c
This commit is contained in:
Dave Mankoff
2019-12-18 12:18:00 -05:00
parent fbe8eca9ed
commit 9febfeb097
20 changed files with 107 additions and 73 deletions

View File

@@ -251,6 +251,11 @@ public class CarBatteryController extends BroadcastReceiver implements BatteryCo
// TODO: Car demo mode.
}
@Override
public boolean isPluggedIn() {
return true;
}
@Override
public boolean isPowerSave() {
// Power save is not valid for the car, so always return false.

View File

@@ -30,7 +30,7 @@ import java.io.PrintWriter;
*/
@ProvidesInterface(version = FalsingManager.VERSION)
public interface FalsingManager {
int VERSION = 2;
int VERSION = 3;
void onSucccessfulUnlock();
@@ -48,7 +48,7 @@ public interface FalsingManager {
void setNotificationExpanded();
boolean isClassiferEnabled();
boolean isClassifierEnabled();
void onQsDown();

View File

@@ -694,7 +694,7 @@ public class SwipeHelper implements Gefingerpoken {
public boolean isFalseGesture(MotionEvent ev) {
boolean falsingDetected = mCallback.isAntiFalsingNeeded();
if (mFalsingManager.isClassiferEnabled()) {
if (mFalsingManager.isClassifierEnabled()) {
falsingDetected = falsingDetected && mFalsingManager.isFalseTouch();
} else {
falsingDetected = falsingDetected && !mTouchAboveFalsingThreshold;

View File

@@ -90,7 +90,7 @@ public class FalsingManagerFake implements FalsingManager {
}
@Override
public boolean isClassiferEnabled() {
public boolean isClassifierEnabled() {
return mIsClassiferEnabled;
}

View File

@@ -213,7 +213,7 @@ public class FalsingManagerImpl implements FalsingManager {
private void onSessionStart() {
if (FalsingLog.ENABLED) {
FalsingLog.i("onSessionStart", "classifierEnabled=" + isClassiferEnabled());
FalsingLog.i("onSessionStart", "classifierEnabled=" + isClassifierEnabled());
clearPendingWtf();
}
mBouncerOn = false;
@@ -246,7 +246,7 @@ public class FalsingManagerImpl implements FalsingManager {
}
}
public boolean isClassiferEnabled() {
public boolean isClassifierEnabled() {
return mHumanInteractionClassifier.isEnabled();
}
@@ -544,7 +544,7 @@ public class FalsingManagerImpl implements FalsingManager {
public void dump(PrintWriter pw) {
pw.println("FALSING MANAGER");
pw.print("classifierEnabled="); pw.println(isClassiferEnabled() ? 1 : 0);
pw.print("classifierEnabled="); pw.println(isClassifierEnabled() ? 1 : 0);
pw.print("mSessionActive="); pw.println(mSessionActive ? 1 : 0);
pw.print("mBouncerOn="); pw.println(mSessionActive ? 1 : 0);
pw.print("mState="); pw.println(StatusBarState.toShortString(mState));

View File

@@ -21,8 +21,8 @@ import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHT
import android.content.Context;
import android.hardware.SensorManager;
import android.net.Uri;
import android.os.Handler;
import android.provider.DeviceConfig;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import com.android.internal.annotations.VisibleForTesting;
@@ -32,6 +32,7 @@ import com.android.systemui.classifier.brightline.BrightLineFalsingManager;
import com.android.systemui.classifier.brightline.FalsingDataProvider;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.FalsingPlugin;
import com.android.systemui.plugins.PluginListener;
@@ -56,19 +57,22 @@ public class FalsingManagerProxy implements FalsingManager {
private static final String PROXIMITY_SENSOR_TAG = "FalsingManager";
private final ProximitySensor mProximitySensor;
private final DisplayMetrics mDisplayMetrics;
private FalsingManager mInternalFalsingManager;
private DeviceConfig.OnPropertiesChangedListener mDeviceConfigListener;
private final DeviceConfigProxy mDeviceConfig;
private boolean mBrightlineEnabled;
private final DockManager mDockManager;
private Executor mUiBgExecutor;
@Inject
FalsingManagerProxy(Context context, PluginManager pluginManager,
@Main Handler handler,
ProximitySensor proximitySensor,
DeviceConfigProxy deviceConfig,
FalsingManagerProxy(Context context, PluginManager pluginManager, @Main Executor executor,
DisplayMetrics displayMetrics, ProximitySensor proximitySensor,
DeviceConfigProxy deviceConfig, DockManager dockManager,
@UiBackground Executor uiBgExecutor) {
mDisplayMetrics = displayMetrics;
mProximitySensor = proximitySensor;
mDockManager = dockManager;
mUiBgExecutor = uiBgExecutor;
mProximitySensor.setTag(PROXIMITY_SENSOR_TAG);
mProximitySensor.setSensorDelay(SensorManager.SENSOR_DELAY_GAME);
@@ -78,7 +82,7 @@ public class FalsingManagerProxy implements FalsingManager {
setupFalsingManager(context);
mDeviceConfig.addOnPropertiesChangedListener(
DeviceConfig.NAMESPACE_SYSTEMUI,
handler::post,
executor,
mDeviceConfigListener
);
@@ -125,10 +129,11 @@ public class FalsingManagerProxy implements FalsingManager {
mInternalFalsingManager = new FalsingManagerImpl(context, mUiBgExecutor);
} else {
mInternalFalsingManager = new BrightLineFalsingManager(
new FalsingDataProvider(context.getResources().getDisplayMetrics()),
new FalsingDataProvider(mDisplayMetrics),
Dependency.get(KeyguardUpdateMonitor.class),
mProximitySensor,
mDeviceConfig
mDeviceConfig,
mDockManager
);
}
}
@@ -182,8 +187,8 @@ public class FalsingManagerProxy implements FalsingManager {
}
@Override
public boolean isClassiferEnabled() {
return mInternalFalsingManager.isClassiferEnabled();
public boolean isClassifierEnabled() {
return mInternalFalsingManager.isClassifierEnabled();
}
@Override

View File

@@ -25,17 +25,21 @@ import android.util.Log;
import android.view.MotionEvent;
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.classifier.Classifier;
import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.util.DeviceConfigProxy;
import com.android.systemui.util.sensors.ProximitySensor;
import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Queue;
/**
* FalsingManager designed to make clear why a touch was rejected.
@@ -44,16 +48,20 @@ public class BrightLineFalsingManager implements FalsingManager {
static final boolean DEBUG = false;
private static final String TAG = "FalsingManager";
private static final int RECENT_INFO_LOG_SIZE = 20;
private final FalsingDataProvider mDataProvider;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final ProximitySensor mProximitySensor;
private final DockManager mDockManager;
private boolean mSessionStarted;
private 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 final List<FalsingClassifier> mClassifiers;
@@ -71,14 +79,14 @@ public class BrightLineFalsingManager implements FalsingManager {
}
};
public BrightLineFalsingManager(
FalsingDataProvider falsingDataProvider,
KeyguardUpdateMonitor keyguardUpdateMonitor,
ProximitySensor proximitySensor,
DeviceConfigProxy deviceConfigProxy) {
public BrightLineFalsingManager(FalsingDataProvider falsingDataProvider,
KeyguardUpdateMonitor keyguardUpdateMonitor, ProximitySensor proximitySensor,
DeviceConfigProxy deviceConfigProxy,
DockManager dockManager) {
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mDataProvider = falsingDataProvider;
mProximitySensor = proximitySensor;
mDockManager = dockManager;
mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateCallback);
mMetricsLogger = new MetricsLogger();
@@ -134,29 +142,30 @@ public class BrightLineFalsingManager implements FalsingManager {
}
@Override
public boolean isClassiferEnabled() {
public boolean isClassifierEnabled() {
return true;
}
@Override
public boolean isFalseTouch() {
boolean r = !mJustUnlockedWithFace && mClassifiers.stream().anyMatch(falsingClassifier -> {
boolean result = falsingClassifier.isFalseTouch();
if (result) {
logInfo(String.format(
(Locale) null,
"{classifier=%s, interactionType=%d}",
falsingClassifier.getClass().getName(),
mDataProvider.getInteractionType()));
String reason = falsingClassifier.getReason();
if (reason != null) {
logInfo(reason);
}
} else {
logDebug(falsingClassifier.getClass().getName() + ": false");
}
return result;
});
boolean r = !mJustUnlockedWithFace && !mDockManager.isDocked()
&& mClassifiers.stream().anyMatch(falsingClassifier -> {
boolean result = falsingClassifier.isFalseTouch();
if (result) {
logInfo(String.format(
(Locale) null,
"{classifier=%s, interactionType=%d}",
falsingClassifier.getClass().getName(),
mDataProvider.getInteractionType()));
String reason = falsingClassifier.getReason();
if (reason != null) {
logInfo(reason);
}
} else {
logDebug(falsingClassifier.getClass().getName() + ": false");
}
return result;
});
logDebug("Is false touch? " + r);
@@ -336,7 +345,18 @@ public class BrightLineFalsingManager implements FalsingManager {
}
@Override
public void dump(PrintWriter printWriter) {
public void dump(PrintWriter pw) {
IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
ipw.println("BRIGHTLINE FALSING MANAGER");
ipw.print("classifierEnabled="); pw.println(isClassifierEnabled() ? 1 : 0);
ipw.print("mJustUnlockedWithFace="); pw.println(mJustUnlockedWithFace ? 1 : 0);
ipw.print("isDocked="); pw.println(mDockManager.isDocked() ? 1 : 0);
ipw.println();
ipw.println("Recent falsing info:");
ipw.increaseIndent();
for (String msg : RECENT_INFO_LOG) {
ipw.println(msg);
}
}
@Override
@@ -357,6 +377,10 @@ public class BrightLineFalsingManager implements FalsingManager {
static void logInfo(String msg) {
Log.i(TAG, msg);
RECENT_INFO_LOG.add(msg);
while (RECENT_INFO_LOG.size() > RECENT_INFO_LOG_SIZE) {
RECENT_INFO_LOG.remove();
}
}
static void logError(String msg) {

View File

@@ -1299,7 +1299,7 @@ public class NotificationPanelView extends PanelView implements
if (!needsAntiFalsing()) {
return false;
}
if (mFalsingManager.isClassiferEnabled()) {
if (mFalsingManager.isClassifierEnabled()) {
return mFalsingManager.isFalseTouch();
}
return !mQsTouchAboveFalsingThreshold;

View File

@@ -710,7 +710,7 @@ public abstract class PanelView extends FrameLayout {
if (!mStatusBar.isFalsingThresholdNeeded()) {
return false;
}
if (mFalsingManager.isClassiferEnabled()) {
if (mFalsingManager.isClassifierEnabled()) {
return mFalsingManager.isFalseTouch();
}
if (!mTouchAboveFalsingThreshold) {

View File

@@ -37,6 +37,11 @@ public interface BatteryController extends DemoMode, Dumpable,
*/
void setPowerSaveMode(boolean powerSave);
/**
* Returns {@code true} if the device is currently plugged in.
*/
boolean isPluggedIn();
/**
* Returns {@code true} if the device is currently in power save mode.
*/

View File

@@ -192,6 +192,11 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
}
}
@Override
public boolean isPluggedIn() {
return mPluggedIn;
}
@Override
public boolean isPowerSave() {
return mPowerSave;

View File

@@ -21,16 +21,17 @@ import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHT
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertThat;
import android.os.Handler;
import android.provider.DeviceConfig;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.DisplayMetrics;
import androidx.test.filters.SmallTest;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.classifier.brightline.BrightLineFalsingManager;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManagerFake;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.util.DeviceConfigProxy;
import com.android.systemui.util.DeviceConfigProxyFake;
@@ -47,24 +48,22 @@ import org.mockito.MockitoAnnotations;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class FalsingManagerProxyTest extends SysuiTestCase {
@Mock(stubOnly = true)
PluginManager mPluginManager;
@Mock(stubOnly = true)
ProximitySensor mProximitySensor;
private Handler mHandler;
private FalsingManagerProxy mProxy;
private DeviceConfigProxy mDeviceConfig;
private TestableLooper mTestableLooper;
private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
private FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock());
private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
private DockManager mDockManager = new DockManagerFake();
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
mTestableLooper = TestableLooper.get(this);
mHandler = new Handler(mTestableLooper.getLooper());
mDeviceConfig = new DeviceConfigProxyFake();
mDeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_MANAGER_ENABLED, "false", false);
@@ -79,8 +78,8 @@ public class FalsingManagerProxyTest extends SysuiTestCase {
@Test
public void test_brightLineFalsingManagerDisabled() {
mProxy = new FalsingManagerProxy(getContext(), mPluginManager, mHandler, mProximitySensor,
mDeviceConfig, mUiBgExecutor);
mProxy = new FalsingManagerProxy(getContext(), mPluginManager, mExecutor, mDisplayMetrics,
mProximitySensor, mDeviceConfig, mDockManager, mUiBgExecutor);
assertThat(mProxy.getInternalFalsingManager(), instanceOf(FalsingManagerImpl.class));
}
@@ -88,27 +87,27 @@ public class FalsingManagerProxyTest extends SysuiTestCase {
public void test_brightLineFalsingManagerEnabled() throws InterruptedException {
mDeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_MANAGER_ENABLED, "true", false);
mTestableLooper.processAllMessages();
mProxy = new FalsingManagerProxy(getContext(), mPluginManager, mHandler, mProximitySensor,
mDeviceConfig, mUiBgExecutor);
mExecutor.runAllReady();
mProxy = new FalsingManagerProxy(getContext(), mPluginManager, mExecutor, mDisplayMetrics,
mProximitySensor, mDeviceConfig, mDockManager, mUiBgExecutor);
assertThat(mProxy.getInternalFalsingManager(), instanceOf(BrightLineFalsingManager.class));
}
@Test
public void test_brightLineFalsingManagerToggled() throws InterruptedException {
mProxy = new FalsingManagerProxy(getContext(), mPluginManager, mHandler, mProximitySensor,
mDeviceConfig, mUiBgExecutor);
mProxy = new FalsingManagerProxy(getContext(), mPluginManager, mExecutor, mDisplayMetrics,
mProximitySensor, mDeviceConfig, mDockManager, mUiBgExecutor);
assertThat(mProxy.getInternalFalsingManager(), instanceOf(FalsingManagerImpl.class));
mDeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_MANAGER_ENABLED, "true", false);
mTestableLooper.processAllMessages();
mExecutor.runAllReady();
assertThat(mProxy.getInternalFalsingManager(),
instanceOf(BrightLineFalsingManager.class));
mDeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_MANAGER_ENABLED, "false", false);
mTestableLooper.processAllMessages();
mExecutor.runAllReady();
assertThat(mProxy.getInternalFalsingManager(), instanceOf(FalsingManagerImpl.class));
}
}

View File

@@ -24,7 +24,6 @@ import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import androidx.test.filters.SmallTest;
@@ -39,7 +38,6 @@ import org.mockito.MockitoAnnotations;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class DiagonalClassifierTest extends ClassifierTest {
// Next variable is not actually five, but is very close. 5 degrees is currently the value

View File

@@ -20,7 +20,6 @@ import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import androidx.test.filters.SmallTest;
@@ -33,7 +32,6 @@ import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class DistanceClassifierTest extends ClassifierTest {
private FalsingDataProvider mDataProvider;

View File

@@ -21,7 +21,6 @@ import static org.hamcrest.Matchers.closeTo;
import static org.junit.Assert.assertThat;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
@@ -36,7 +35,6 @@ import java.util.List;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class FalsingDataProviderTest extends ClassifierTest {
private FalsingDataProvider mDataProvider;

View File

@@ -22,7 +22,6 @@ import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.MotionEvent;
import androidx.test.filters.SmallTest;
@@ -34,7 +33,6 @@ import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class PointerCountClassifierTest extends ClassifierTest {
private FalsingClassifier mClassifier;

View File

@@ -24,7 +24,6 @@ import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.MotionEvent;
import androidx.test.filters.SmallTest;
@@ -41,7 +40,6 @@ import org.mockito.MockitoAnnotations;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class ProximityClassifierTest extends ClassifierTest {
private static final long NS_PER_MS = 1000000;

View File

@@ -30,7 +30,6 @@ import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import androidx.test.filters.SmallTest;
@@ -42,7 +41,6 @@ import org.mockito.MockitoAnnotations;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class TypeClassifierTest extends ClassifierTest {
@Mock

View File

@@ -20,7 +20,6 @@ import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import androidx.test.filters.SmallTest;
@@ -35,7 +34,6 @@ import java.util.Random;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class ZigZagClassifierTest extends ClassifierTest {
private FalsingClassifier mClassifier;

View File

@@ -44,6 +44,11 @@ public class FakeBatteryController extends BaseLeakChecker<BatteryStateChangeCal
}
@Override
public boolean isPluggedIn() {
return false;
}
@Override
public boolean isPowerSave() {
return false;