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

Commit 2adfe95d authored by Rohan Shah's avatar Rohan Shah
Browse files

Filter out detached views from touch

Views that are detached shouldn't get touch events/start getting
animated (They can't be animated).

Added filter to stream to remove these views from consideration for the
nearest touch frame algo.

Test: Visually + unit test
Bug: 65146195
Change-Id: I74df495a7c02d3d46cd6784f0950c48b5311819e
parent ede3344e
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -95,8 +95,12 @@ public class NearestTouchFrame extends FrameLayout {
    }

    private View findNearestChild(MotionEvent event) {
        return mClickableChildren.stream().map(v -> new Pair<>(distance(v, event), v))
                .min(Comparator.comparingInt(f -> f.first)).get().second;
        return mClickableChildren
                .stream()
                .filter(v -> v.isAttachedToWindow())
                .map(v -> new Pair<>(distance(v, event), v))
                .min(Comparator.comparingInt(f -> f.first))
                .get().second;
    }

    private int distance(View v, MotionEvent event) {
+20 −0
Original line number Diff line number Diff line
@@ -88,6 +88,25 @@ public class NearestTouchFrameTest extends SysuiTestCase {
        ev.recycle();
    }


    @Test
    public void testNearestView_DetachedViewsExcluded() {
        View left = mockViewAt(0, 0, 10, 10);
        when(left.isAttachedToWindow()).thenReturn(false);
        View right = mockViewAt(20, 0, 10, 10);

        mNearestTouchFrame.addView(left);
        mNearestTouchFrame.addView(right);
        mNearestTouchFrame.onMeasure(0, 0);

        // Would go to left view if attached, but goes to right instead as left should be detached.
        MotionEvent ev = MotionEvent.obtain(0, 0, 0,
                12 /* x */, 5 /* y */, 0);
        mNearestTouchFrame.onTouchEvent(ev);
        verify(right).onTouchEvent(eq(ev));
        ev.recycle();
    }

    @Test
    public void testHorizontalSelection_Left() {
        View left = mockViewAt(0, 0, 10, 10);
@@ -161,6 +180,7 @@ public class NearestTouchFrameTest extends SysuiTestCase {
            return null;
        }).when(v).getLocationInWindow(any());
        when(v.isClickable()).thenReturn(true);
        when(v.isAttachedToWindow()).thenReturn(true);

        // Stupid final methods.
        v.setLeft(0);