TextView implementation of insert gesture
Bug: 240435922 Test: atest android.widget.cts.TextViewHandwritingGestureTest Change-Id: I3c7eb06925081bd5e699999c69437ef8bb929741
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user