From 3ebab3f7c287230742c50c84087676366a228623 Mon Sep 17 00:00:00 2001 From: Justin Ghan Date: Thu, 11 Aug 2022 14:22:52 -0700 Subject: [PATCH] TextView implementation of insert gesture Bug: 240435922 Test: atest android.widget.cts.TextViewHandwritingGestureTest Change-Id: I3c7eb06925081bd5e699999c69437ef8bb929741 --- core/java/android/widget/TextView.java | 27 +++++++++++++++++++ .../inputmethod/EditableInputConnection.java | 3 +++ 2 files changed, 30 insertions(+) diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 8419d8adb3296..28b83b2068bae 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -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() diff --git a/core/java/com/android/internal/inputmethod/EditableInputConnection.java b/core/java/com/android/internal/inputmethod/EditableInputConnection.java index 5393db8335cfa..9211926c51e2e 100644 --- a/core/java/com/android/internal/inputmethod/EditableInputConnection.java +++ b/core/java/com/android/internal/inputmethod/EditableInputConnection.java @@ -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; }