TextView implementation of insert gesture

Bug: 240435922
Test: atest android.widget.cts.TextViewHandwritingGestureTest
Change-Id: I3c7eb06925081bd5e699999c69437ef8bb929741
This commit is contained in:
Justin Ghan
2022-08-11 14:22:52 -07:00
parent 8b5d4bd91e
commit 3ebab3f7c2
2 changed files with 30 additions and 0 deletions

View File

@@ -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()

View File

@@ -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;
}