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

Commit 3ebab3f7 authored by Justin Ghan's avatar Justin Ghan
Browse files

TextView implementation of insert gesture

Bug: 240435922
Test: atest android.widget.cts.TextViewHandwritingGestureTest
Change-Id: I3c7eb06925081bd5e699999c69437ef8bb929741
parent 8b5d4bd9
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ import android.graphics.Insets;
import android.graphics.Paint;
import android.graphics.Paint.FontMetricsInt;
import android.graphics.Path;
import android.graphics.PointF;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.RectF;
@@ -193,6 +194,7 @@ import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.HandwritingGesture;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InsertGesture;
import android.view.inputmethod.SelectGesture;
import android.view.inspector.InspectableProperty;
import android.view.inspector.InspectableProperty.EnumEntry;
@@ -9311,6 +9313,31 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        return 0;
    }
    /** @hide */
    public int performHandwritingInsertGesture(@NonNull InsertGesture gesture) {
        PointF point = gesture.getInsertionPoint();
        // The coordinates provided are screen coordinates - transform to content coordinates.
        int[] screenToViewport = getLocationOnScreen();
        point.offset(
                -(screenToViewport[0] + viewportToContentHorizontalOffset()),
                -(screenToViewport[1] + viewportToContentVerticalOffset()));
        int line = mLayout.getLineForVertical((int) point.y);
        if (point.y < mLayout.getLineTop(line)
                || point.y > mLayout.getLineBottomWithoutSpacing(line)) {
            return handleGestureFailure(gesture);
        }
        if (point.x < mLayout.getLineLeft(line) || point.x > mLayout.getLineRight(line)) {
            return handleGestureFailure(gesture);
        }
        int offset = mLayout.getOffsetForHorizontal(line, point.x);
        String textToInsert = gesture.getTextToInsert();
        getEditableText().insert(offset, textToInsert);
        Selection.setSelection(getEditableText(), offset + textToInsert.length());
        // TODO: Insert extra spaces if necessary.
        return 0;
    }
    private int handleGestureFailure(HandwritingGesture gesture) {
        if (!TextUtils.isEmpty(gesture.getFallbackText())) {
            getEditableText()
+3 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.HandwritingGesture;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InsertGesture;
import android.view.inputmethod.SelectGesture;
import android.widget.TextView;

@@ -274,6 +275,8 @@ public final class EditableInputConnection extends BaseInputConnection
            result = mTextView.performHandwritingSelectGesture((SelectGesture) gesture);
        } else if (gesture instanceof DeleteGesture) {
            result = mTextView.performHandwritingDeleteGesture((DeleteGesture) gesture);
        } else if (gesture instanceof InsertGesture) {
            result = mTextView.performHandwritingInsertGesture((InsertGesture) gesture);
        } else {
            result = 0;
        }