Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd42bdbb authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Add TypeClassifier to the BrightLineFalsingManager.

This matches an existing falsing classifier that ensure
the general direction of a swipe matches the intended action
(i.e. dismissing a notification should be side to side.)

Bug: 111394067
Test: atest SystemUITests
Change-Id: I861ff0443df6051561991808a760250a68b588fd
parent 7abe135f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -64,8 +64,8 @@ public class BrightLineFalsingManager implements FalsingManager {
        mDataProvider = falsingDataProvider;
        mSensorManager = sensorManager;
        mClassifiers = new ArrayList<>();

        mClassifiers.add(new PointerCountClassifier(mDataProvider));
        mClassifiers.add(new TypeClassifier(mDataProvider));
    }

    private void registerSensors() {
+61 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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 com.android.systemui.classifier.Classifier.BOUNCER_UNLOCK;
import static com.android.systemui.classifier.Classifier.LEFT_AFFORDANCE;
import static com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS;
import static com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN;
import static com.android.systemui.classifier.Classifier.PULSE_EXPAND;
import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS;
import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE;
import static com.android.systemui.classifier.Classifier.UNLOCK;

/**
 * Ensure that the swipe direction generally matches that of the interaction type.
 */
public class TypeClassifier extends FalsingClassifier {
    TypeClassifier(FalsingDataProvider dataProvider) {
        super(dataProvider);
    }

    @Override
    public boolean isFalseTouch() {
        boolean vertical = isVertical();
        boolean up = isUp();
        boolean right = isRight();

        switch (getInteractionType()) {
            case QUICK_SETTINGS:
            case PULSE_EXPAND:
            case NOTIFICATION_DRAG_DOWN:
                return !vertical || up;
            case NOTIFICATION_DISMISS:
                return vertical;
            case UNLOCK:
            case BOUNCER_UNLOCK:
                return !vertical || !up;
            case LEFT_AFFORDANCE:  // Swiping from the bottom left corner for camera or similar.
                return !right || !up;
            case RIGHT_AFFORDANCE:  // Swiping from the bottom right corner for camera or similar.
                return right || !up;
            default:
                return true;
        }
    }
}
+307 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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 com.android.systemui.classifier.Classifier.BOUNCER_UNLOCK;
import static com.android.systemui.classifier.Classifier.LEFT_AFFORDANCE;
import static com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS;
import static com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN;
import static com.android.systemui.classifier.Classifier.PULSE_EXPAND;
import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS;
import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE;
import static com.android.systemui.classifier.Classifier.UNLOCK;

import static org.hamcrest.CoreMatchers.is;
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;

import com.android.systemui.SysuiTestCase;

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 TypeClassifierTest extends SysuiTestCase {

    @Mock
    private FalsingDataProvider mDataProvider;

    private FalsingClassifier mClassifier;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mClassifier = new TypeClassifier(mDataProvider);
    }

    @Test
    public void testPass_QuickSettings() {
        when(mDataProvider.getInteractionType()).thenReturn(QUICK_SETTINGS);
        when(mDataProvider.isVertical()).thenReturn(true);
        when(mDataProvider.isUp()).thenReturn(false);

        when(mDataProvider.isRight()).thenReturn(false);  // right should cause no effect.
        assertThat(mClassifier.isFalseTouch(), is(false));

        when(mDataProvider.isRight()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(false));
    }

    @Test
    public void testFalse_QuickSettings() {
        when(mDataProvider.getInteractionType()).thenReturn(QUICK_SETTINGS);

        when(mDataProvider.isVertical()).thenReturn(false);
        when(mDataProvider.isUp()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isVertical()).thenReturn(true);
        when(mDataProvider.isUp()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(true));
    }

    @Test
    public void testPass_PulseExpand() {
        when(mDataProvider.getInteractionType()).thenReturn(PULSE_EXPAND);
        when(mDataProvider.isVertical()).thenReturn(true);
        when(mDataProvider.isUp()).thenReturn(false);

        when(mDataProvider.isRight()).thenReturn(false);  // right should cause no effect.
        assertThat(mClassifier.isFalseTouch(), is(false));

        when(mDataProvider.isRight()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(false));
    }

    @Test
    public void testFalse_PulseExpand() {
        when(mDataProvider.getInteractionType()).thenReturn(PULSE_EXPAND);

        when(mDataProvider.isVertical()).thenReturn(false);
        when(mDataProvider.isUp()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isVertical()).thenReturn(true);
        when(mDataProvider.isUp()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(true));
    }

    @Test
    public void testPass_NotificationDragDown() {
        when(mDataProvider.getInteractionType()).thenReturn(NOTIFICATION_DRAG_DOWN);
        when(mDataProvider.isVertical()).thenReturn(true);
        when(mDataProvider.isUp()).thenReturn(false);

        when(mDataProvider.isRight()).thenReturn(false);  // right should cause no effect.
        assertThat(mClassifier.isFalseTouch(), is(false));

        when(mDataProvider.isRight()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(false));
    }

    @Test
    public void testFalse_NotificationDragDown() {
        when(mDataProvider.getInteractionType()).thenReturn(NOTIFICATION_DRAG_DOWN);

        when(mDataProvider.isVertical()).thenReturn(false);
        when(mDataProvider.isUp()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isVertical()).thenReturn(true);
        when(mDataProvider.isUp()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(true));
    }

    @Test
    public void testPass_NotificationDismiss() {
        when(mDataProvider.getInteractionType()).thenReturn(NOTIFICATION_DISMISS);
        when(mDataProvider.isVertical()).thenReturn(false);

        when(mDataProvider.isUp()).thenReturn(false);  // up and right should cause no effect.
        when(mDataProvider.isRight()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(false));

        when(mDataProvider.isUp()).thenReturn(true);
        when(mDataProvider.isRight()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(false));

        when(mDataProvider.isUp()).thenReturn(false);
        when(mDataProvider.isRight()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(false));

        when(mDataProvider.isUp()).thenReturn(true);
        when(mDataProvider.isRight()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(false));
    }

    @Test
    public void testFalse_NotificationDismiss() {
        when(mDataProvider.getInteractionType()).thenReturn(NOTIFICATION_DISMISS);
        when(mDataProvider.isVertical()).thenReturn(true);

        when(mDataProvider.isUp()).thenReturn(false);  // up and right should cause no effect.
        when(mDataProvider.isRight()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isUp()).thenReturn(true);
        when(mDataProvider.isRight()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isUp()).thenReturn(false);
        when(mDataProvider.isRight()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isUp()).thenReturn(true);
        when(mDataProvider.isRight()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(true));
    }


    @Test
    public void testPass_Unlock() {
        when(mDataProvider.getInteractionType()).thenReturn(UNLOCK);
        when(mDataProvider.isVertical()).thenReturn(true);
        when(mDataProvider.isUp()).thenReturn(true);


        when(mDataProvider.isRight()).thenReturn(false);  // right should cause no effect.
        assertThat(mClassifier.isFalseTouch(), is(false));

        when(mDataProvider.isRight()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(false));
    }

    @Test
    public void testFalse_Unlock() {
        when(mDataProvider.getInteractionType()).thenReturn(UNLOCK);

        when(mDataProvider.isVertical()).thenReturn(false);
        when(mDataProvider.isUp()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isVertical()).thenReturn(true);
        when(mDataProvider.isUp()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isVertical()).thenReturn(false);
        when(mDataProvider.isUp()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(true));
    }

    @Test
    public void testPass_BouncerUnlock() {
        when(mDataProvider.getInteractionType()).thenReturn(BOUNCER_UNLOCK);
        when(mDataProvider.isVertical()).thenReturn(true);
        when(mDataProvider.isUp()).thenReturn(true);


        when(mDataProvider.isRight()).thenReturn(false);  // right should cause no effect.
        assertThat(mClassifier.isFalseTouch(), is(false));

        when(mDataProvider.isRight()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(false));
    }

    @Test
    public void testFalse_BouncerUnlock() {
        when(mDataProvider.getInteractionType()).thenReturn(BOUNCER_UNLOCK);

        when(mDataProvider.isVertical()).thenReturn(false);
        when(mDataProvider.isUp()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isVertical()).thenReturn(true);
        when(mDataProvider.isUp()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isVertical()).thenReturn(false);
        when(mDataProvider.isUp()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(true));
    }

    @Test
    public void testPass_LeftAffordance() {
        when(mDataProvider.getInteractionType()).thenReturn(LEFT_AFFORDANCE);
        when(mDataProvider.isUp()).thenReturn(true);
        when(mDataProvider.isRight()).thenReturn(true);


        when(mDataProvider.isVertical()).thenReturn(false);  // vertical should cause no effect.
        assertThat(mClassifier.isFalseTouch(), is(false));

        when(mDataProvider.isVertical()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(false));
    }

    @Test
    public void testFalse_LeftAffordance() {
        when(mDataProvider.getInteractionType()).thenReturn(LEFT_AFFORDANCE);

        when(mDataProvider.isRight()).thenReturn(false);
        when(mDataProvider.isUp()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isRight()).thenReturn(true);
        when(mDataProvider.isUp()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isRight()).thenReturn(false);
        when(mDataProvider.isUp()).thenReturn(false);
        assertThat(mClassifier.isFalseTouch(), is(true));
    }

    @Test
    public void testPass_RightAffordance() {
        when(mDataProvider.getInteractionType()).thenReturn(RIGHT_AFFORDANCE);
        when(mDataProvider.isUp()).thenReturn(true);
        when(mDataProvider.isRight()).thenReturn(false);


        when(mDataProvider.isVertical()).thenReturn(false);  // vertical should cause no effect.
        assertThat(mClassifier.isFalseTouch(), is(false));

        when(mDataProvider.isVertical()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(false));
    }

    @Test
    public void testFalse_RightAffordance() {
        when(mDataProvider.getInteractionType()).thenReturn(RIGHT_AFFORDANCE);

        when(mDataProvider.isUp()).thenReturn(true);
        when(mDataProvider.isRight()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isUp()).thenReturn(false);
        when(mDataProvider.isRight()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(true));

        when(mDataProvider.isUp()).thenReturn(false);
        when(mDataProvider.isRight()).thenReturn(true);
        assertThat(mClassifier.isFalseTouch(), is(true));
    }
}