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

Commit 99b55fa6 authored by Nikita Dubrovsky's avatar Nikita Dubrovsky
Browse files

Fix NPE in InsertionPointCursorController.onTouchEvent

Calls to SelectionModifierCursorController must be guarded by
hasSelectionController() because it's possible to have a TextView
with an Editor but no selection controller if the TextView is
configured to have non-selectable text.

Bug: 147366705
Bug: 145535274
Bug: 143852764
Test: Manual and unit test
  atest FrameworksCoreTests:EditorCursorDragTest
Change-Id: I7fdec754e6fa51561b08fab024ea672c43f2c8f5
parent 1f78b11b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -5737,7 +5737,7 @@ public class Editor {
        private boolean mIsDraggingCursor;

        public void onTouchEvent(MotionEvent event) {
            if (getSelectionController().isCursorBeingModified()) {
            if (hasSelectionController() && getSelectionController().isCursorBeingModified()) {
                return;
            }
            switch (event.getActionMasked()) {
+18 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ public class EditorCursorDragTest {
        mOriginalFlagValue = Editor.FLAG_ENABLE_CURSOR_DRAG;
        Editor.FLAG_ENABLE_CURSOR_DRAG = true;
    }

    @After
    public void after() throws Throwable {
        Editor.FLAG_ENABLE_CURSOR_DRAG = mOriginalFlagValue;
@@ -356,6 +357,23 @@ public class EditorCursorDragTest {
        assertFalse(editor.getSelectionController().isCursorBeingModified());
    }

    @Test // Reproduces b/147366705
    public void testCursorDrag_nonSelectableTextView() throws Throwable {
        String text = "Hello world!";
        TextView tv = mActivity.findViewById(R.id.nonselectable_textview);
        tv.setText(text);
        Editor editor = tv.getEditorForTesting();

        // Simulate a tap. No error should be thrown.
        long event1Time = 1001;
        MotionEvent event1 = downEvent(event1Time, event1Time, 20f, 30f);
        mInstrumentation.runOnMainSync(() -> editor.onTouchEvent(event1));

        // Swipe left to right. No error should be thrown.
        onView(withId(R.id.nonselectable_textview)).perform(
                dragOnText(text.indexOf("llo"), text.indexOf("!")));
    }

    private static MotionEvent downEvent(long downTime, long eventTime, float x, float y) {
        return MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, x, y, 0);
    }