From 85a57bc143d2d5808e6fa8506922c2a8096f493d Mon Sep 17 00:00:00 2001 From: Taran Singh Date: Wed, 31 Aug 2022 00:10:31 +0000 Subject: [PATCH] Introduce Scribe Select/DeleteRangeGesture Add new APIs for select and delete with two rectangles. Test: atest InputConnectionEndToEndTest Test: atest StylusHandwritingest Bug: 239783077 Change-Id: Ia7240d3eaac8610c774c3a4aad074a4b84b71521 --- core/api/current.txt | 38 +++ .../IRemoteInputConnectionInvoker.java | 10 + .../view/inputmethod/DeleteGesture.java | 4 +- .../view/inputmethod/DeleteRangeGesture.aidl | 19 ++ .../view/inputmethod/DeleteRangeGesture.java | 243 +++++++++++++++++ .../android/view/inputmethod/EditorInfo.java | 4 + .../view/inputmethod/HandwritingGesture.java | 19 +- .../view/inputmethod/SelectGesture.java | 4 +- .../view/inputmethod/SelectRangeGesture.aidl | 19 ++ .../view/inputmethod/SelectRangeGesture.java | 249 ++++++++++++++++++ .../inputmethod/IRemoteInputConnection.aidl | 8 + .../inputmethod/InputMethodDebug.java | 7 +- .../RemoteInputConnectionImpl.java | 18 ++ .../delete_range_gesture_rects.png | Bin 0 -> 32318 bytes .../select_range_gesture_rects.png | Bin 0 -> 35546 bytes 15 files changed, 637 insertions(+), 5 deletions(-) create mode 100644 core/java/android/view/inputmethod/DeleteRangeGesture.aidl create mode 100644 core/java/android/view/inputmethod/DeleteRangeGesture.java create mode 100644 core/java/android/view/inputmethod/SelectRangeGesture.aidl create mode 100644 core/java/android/view/inputmethod/SelectRangeGesture.java create mode 100644 docs/html/reference/images/input_method/stylus_handwriting/delete_range_gesture_rects.png create mode 100644 docs/html/reference/images/input_method/stylus_handwriting/select_range_gesture_rects.png diff --git a/core/api/current.txt b/core/api/current.txt index 4d25ad7d8b37f..23e0b1d65dfe3 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -53061,6 +53061,24 @@ package android.view.inputmethod { method @NonNull public android.view.inputmethod.DeleteGesture.Builder setGranularity(int); } + public final class DeleteRangeGesture extends android.view.inputmethod.HandwritingGesture implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public android.graphics.RectF getDeletionEndArea(); + method @NonNull public android.graphics.RectF getDeletionStartArea(); + method public int getGranularity(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public static final class DeleteRangeGesture.Builder { + ctor public DeleteRangeGesture.Builder(); + method @NonNull public android.view.inputmethod.DeleteRangeGesture build(); + method @NonNull public android.view.inputmethod.DeleteRangeGesture.Builder setDeletionEndArea(@NonNull android.graphics.RectF); + method @NonNull public android.view.inputmethod.DeleteRangeGesture.Builder setDeletionStartArea(@NonNull android.graphics.RectF); + method @NonNull public android.view.inputmethod.DeleteRangeGesture.Builder setFallbackText(@Nullable String); + method @NonNull public android.view.inputmethod.DeleteRangeGesture.Builder setGranularity(int); + } + public final class EditorBoundsInfo implements android.os.Parcelable { method public int describeContents(); method @Nullable public android.graphics.RectF getEditorBounds(); @@ -53160,11 +53178,13 @@ package android.view.inputmethod { public abstract class HandwritingGesture { method @Nullable public String getFallbackText(); field public static final int GESTURE_TYPE_DELETE = 4; // 0x4 + field public static final int GESTURE_TYPE_DELETE_RANGE = 64; // 0x40 field public static final int GESTURE_TYPE_INSERT = 2; // 0x2 field public static final int GESTURE_TYPE_JOIN_OR_SPLIT = 16; // 0x10 field public static final int GESTURE_TYPE_NONE = 0; // 0x0 field public static final int GESTURE_TYPE_REMOVE_SPACE = 8; // 0x8 field public static final int GESTURE_TYPE_SELECT = 1; // 0x1 + field public static final int GESTURE_TYPE_SELECT_RANGE = 32; // 0x20 field public static final int GRANULARITY_CHARACTER = 2; // 0x2 field public static final int GRANULARITY_WORD = 1; // 0x1 } @@ -53549,6 +53569,24 @@ package android.view.inputmethod { method @NonNull public android.view.inputmethod.SelectGesture.Builder setSelectionArea(@NonNull android.graphics.RectF); } + public final class SelectRangeGesture extends android.view.inputmethod.HandwritingGesture implements android.os.Parcelable { + method public int describeContents(); + method public int getGranularity(); + method @NonNull public android.graphics.RectF getSelectionEndArea(); + method @NonNull public android.graphics.RectF getSelectionStartArea(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public static final class SelectRangeGesture.Builder { + ctor public SelectRangeGesture.Builder(); + method @NonNull public android.view.inputmethod.SelectRangeGesture build(); + method @NonNull public android.view.inputmethod.SelectRangeGesture.Builder setFallbackText(@Nullable String); + method @NonNull public android.view.inputmethod.SelectRangeGesture.Builder setGranularity(int); + method @NonNull public android.view.inputmethod.SelectRangeGesture.Builder setSelectionEndArea(@NonNull android.graphics.RectF); + method @NonNull public android.view.inputmethod.SelectRangeGesture.Builder setSelectionStartArea(@NonNull android.graphics.RectF); + } + public final class SurroundingText implements android.os.Parcelable { ctor public SurroundingText(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0xffffffff) int); method public int describeContents(); diff --git a/core/java/android/inputmethodservice/IRemoteInputConnectionInvoker.java b/core/java/android/inputmethodservice/IRemoteInputConnectionInvoker.java index 5ce38e9a279ad..6f758de63c95e 100644 --- a/core/java/android/inputmethodservice/IRemoteInputConnectionInvoker.java +++ b/core/java/android/inputmethodservice/IRemoteInputConnectionInvoker.java @@ -27,6 +27,7 @@ import android.view.KeyEvent; import android.view.inputmethod.CompletionInfo; import android.view.inputmethod.CorrectionInfo; import android.view.inputmethod.DeleteGesture; +import android.view.inputmethod.DeleteRangeGesture; import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.HandwritingGesture; @@ -36,6 +37,7 @@ import android.view.inputmethod.InsertGesture; import android.view.inputmethod.JoinOrSplitGesture; import android.view.inputmethod.RemoveSpaceGesture; import android.view.inputmethod.SelectGesture; +import android.view.inputmethod.SelectRangeGesture; import android.view.inputmethod.SurroundingText; import android.view.inputmethod.TextAttribute; @@ -636,7 +638,9 @@ final class IRemoteInputConnectionInvoker { /** * Invokes one of {@link IRemoteInputConnection#performHandwritingSelectGesture}, + * {@link IRemoteInputConnection#performHandwritingSelectRangeGesture}, * {@link IRemoteInputConnection#performHandwritingDeleteGesture}, + * {@link IRemoteInputConnection#performHandwritingDeleteRangeGesture}, * {@link IRemoteInputConnection#performHandwritingInsertGesture}, * {@link IRemoteInputConnection#performHandwritingRemoveSpaceGesture}, * {@link IRemoteInputConnection#performHandwritingJoinOrSplitGesture}. @@ -655,12 +659,18 @@ final class IRemoteInputConnectionInvoker { if (gesture instanceof SelectGesture) { mConnection.performHandwritingSelectGesture( createHeader(), (SelectGesture) gesture, resultReceiver); + } else if (gesture instanceof SelectRangeGesture) { + mConnection.performHandwritingSelectRangeGesture( + createHeader(), (SelectRangeGesture) gesture, resultReceiver); } else if (gesture instanceof InsertGesture) { mConnection.performHandwritingInsertGesture( createHeader(), (InsertGesture) gesture, resultReceiver); } else if (gesture instanceof DeleteGesture) { mConnection.performHandwritingDeleteGesture( createHeader(), (DeleteGesture) gesture, resultReceiver); + } else if (gesture instanceof DeleteRangeGesture) { + mConnection.performHandwritingDeleteRangeGesture( + createHeader(), (DeleteRangeGesture) gesture, resultReceiver); } else if (gesture instanceof RemoveSpaceGesture) { mConnection.performHandwritingRemoveSpaceGesture( createHeader(), (RemoveSpaceGesture) gesture, resultReceiver); diff --git a/core/java/android/view/inputmethod/DeleteGesture.java b/core/java/android/view/inputmethod/DeleteGesture.java index 9fadabfee512e..c88158f3b39ab 100644 --- a/core/java/android/view/inputmethod/DeleteGesture.java +++ b/core/java/android/view/inputmethod/DeleteGesture.java @@ -27,9 +27,11 @@ import android.widget.TextView; import java.util.Objects; /** - * A sub-class of {@link HandwritingGesture} for deleting an area of text. + * A sub-class of {@link HandwritingGesture} for deleting an area of text using single rectangle. * This class holds the information required for deletion of text in * toolkit widgets like {@link TextView}. + *

Note: This deletes all text within the given area. To delete a range between + * two areas, use {@link DeleteRangeGesture}.

*/ public final class DeleteGesture extends HandwritingGesture implements Parcelable { diff --git a/core/java/android/view/inputmethod/DeleteRangeGesture.aidl b/core/java/android/view/inputmethod/DeleteRangeGesture.aidl new file mode 100644 index 0000000000000..0ae889974fc7c --- /dev/null +++ b/core/java/android/view/inputmethod/DeleteRangeGesture.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view.inputmethod; + +parcelable DeleteRangeGesture; \ No newline at end of file diff --git a/core/java/android/view/inputmethod/DeleteRangeGesture.java b/core/java/android/view/inputmethod/DeleteRangeGesture.java new file mode 100644 index 0000000000000..53b42092c1812 --- /dev/null +++ b/core/java/android/view/inputmethod/DeleteRangeGesture.java @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view.inputmethod; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SuppressLint; +import android.graphics.RectF; +import android.os.Parcel; +import android.os.Parcelable; +import android.widget.TextView; + +import java.util.Objects; + +/** + * A subclass of {@link HandwritingGesture} for deleting a range of text by defining start and end + * rectangles. This can be useful when the range cannot be defined with a single rectangle. + * This class holds the information required for deletion of text in + * toolkit widgets like {@link TextView}. + *

Note: this deletes text within a range between two given areas. To delete all text + * within a single area, use {@link DeleteGesture}.

+ */ +public final class DeleteRangeGesture extends HandwritingGesture implements Parcelable { + + private @Granularity int mGranularity; + private RectF mStartArea; + private RectF mEndArea; + + private DeleteRangeGesture( + int granularity, RectF startArea, RectF endArea, String fallbackText) { + mType = GESTURE_TYPE_DELETE_RANGE; + mStartArea = startArea; + mEndArea = endArea; + mGranularity = granularity; + mFallbackText = fallbackText; + } + + private DeleteRangeGesture(@NonNull Parcel source) { + mType = GESTURE_TYPE_DELETE_RANGE; + mFallbackText = source.readString8(); + mGranularity = source.readInt(); + mStartArea = source.readTypedObject(RectF.CREATOR); + mEndArea = source.readTypedObject(RectF.CREATOR); + } + + /** + * Returns Granular level on which text should be operated. + * @see #GRANULARITY_CHARACTER + * @see #GRANULARITY_WORD + */ + @Granularity + public int getGranularity() { + return mGranularity; + } + + /** + * Returns the Deletion start area {@link RectF} in screen coordinates. + * + * Getter for deletion area set with {@link Builder#setDeletionStartArea(RectF)}. + */ + @NonNull + public RectF getDeletionStartArea() { + return mStartArea; + } + + /** + * Returns the Deletion end area {@link RectF} in screen coordinates. + * + * Getter for deletion area set with {@link Builder#setDeletionEndArea(RectF)}. + */ + @NonNull + public RectF getDeletionEndArea() { + return mEndArea; + } + + /** + * Builder for {@link DeleteRangeGesture}. This class is not designed to be thread-safe. + */ + public static final class Builder { + private int mGranularity; + private RectF mStartArea; + private RectF mEndArea; + private String mFallbackText; + + /** + * Define text deletion granularity. Intersecting words/characters will be + * included in the operation. + * @param granularity {@link HandwritingGesture#GRANULARITY_WORD} or + * {@link HandwritingGesture#GRANULARITY_CHARACTER}. + * @return {@link Builder}. + */ + @NonNull + @SuppressLint("MissingGetterMatchingBuilder") + public Builder setGranularity(@Granularity int granularity) { + mGranularity = granularity; + return this; + } + + /** + * Set rectangular single/multiline start of text deletion area intersecting with text. + * + * The resulting deletion is performed from the start of first word/character in the start + * rectangle to the end of the last word/character in the end rectangle + * {@link #setDeletionEndArea(RectF)}. + *
+ * Deletion strategy using two rectangles + *
+ * + * Intersection is determined using + * {@link #setGranularity(int)}. e.g. {@link HandwritingGesture#GRANULARITY_WORD} includes + * all the words with their width/height center included in the deletion rectangle. + * @param startArea {@link RectF} (in screen coordinates) for start of deletion. This + * rectangle belongs to first line where deletion should start. + */ + @NonNull + @SuppressLint("MissingGetterMatchingBuilder") + public Builder setDeletionStartArea(@NonNull RectF startArea) { + mStartArea = startArea; + return this; + } + + /** + * Set rectangular single/multiline end of text deletion area intersecting with text. + * + * The resulting deletion is performed from the start of first word/character in the start + * rectangle {@link #setDeletionStartArea(RectF)} to the end of the last word/character in + * the end rectangle. + *
+ * Deletion strategy using two rectangles + * + * Intersection is determined using + * {@link #setGranularity(int)}. e.g. {@link HandwritingGesture#GRANULARITY_WORD} includes + * all the words with their width/height center included in the deletion rectangle. + * @param endArea {@link RectF} (in screen coordinates) for start of deletion. This + * rectangle belongs to the last line where deletion should end. + */ + @NonNull + @SuppressLint("MissingGetterMatchingBuilder") + public Builder setDeletionEndArea(@NonNull RectF endArea) { + mEndArea = endArea; + return this; + } + + /** + * Set fallback text that will be committed at current cursor position if there is no + * applicable text beneath the area of gesture. + * @param fallbackText text to set + */ + @NonNull + public Builder setFallbackText(@Nullable String fallbackText) { + mFallbackText = fallbackText; + return this; + } + + /** + * @return {@link DeleteRangeGesture} using parameters in this + * {@link DeleteRangeGesture.Builder}. + * @throws IllegalArgumentException if one or more positional parameters are not specified. + */ + @NonNull + public DeleteRangeGesture build() { + if (mStartArea == null || mStartArea.isEmpty() || mEndArea == null + || mEndArea.isEmpty()) { + throw new IllegalArgumentException("Deletion area must be set."); + } + if (mGranularity <= GRANULARITY_UNDEFINED) { + throw new IllegalArgumentException("Deletion granularity must be set."); + } + return new DeleteRangeGesture(mGranularity, mStartArea, mEndArea, mFallbackText); + } + } + + /** + * Used to make this class parcelable. + */ + @NonNull + public static final Creator CREATOR = + new Creator() { + @Override + public DeleteRangeGesture createFromParcel(Parcel source) { + return new DeleteRangeGesture(source); + } + + @Override + public DeleteRangeGesture[] newArray(int size) { + return new DeleteRangeGesture[size]; + } + }; + + @Override + public int hashCode() { + return Objects.hash(mGranularity, mStartArea, mEndArea, mFallbackText); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof DeleteRangeGesture)) return false; + + DeleteRangeGesture that = (DeleteRangeGesture) o; + + if (mGranularity != that.mGranularity) return false; + if (!Objects.equals(mFallbackText, that.mFallbackText)) return false; + if (!Objects.equals(mStartArea, that.mStartArea)) return false; + return Objects.equals(mEndArea, that.mEndArea); + } + + @Override + public int describeContents() { + return 0; + } + + /** + * Used to package this object into a {@link Parcel}. + * + * @param dest The {@link Parcel} to be written. + * @param flags The flags used for parceling. + */ + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeString8(mFallbackText); + dest.writeInt(mGranularity); + dest.writeTypedObject(mStartArea, flags); + dest.writeTypedObject(mEndArea, flags); + } +} diff --git a/core/java/android/view/inputmethod/EditorInfo.java b/core/java/android/view/inputmethod/EditorInfo.java index c3b32c9f1d546..4a79ba62de696 100644 --- a/core/java/android/view/inputmethod/EditorInfo.java +++ b/core/java/android/view/inputmethod/EditorInfo.java @@ -557,10 +557,14 @@ public class EditorInfo implements InputType, Parcelable { Objects.requireNonNull(gesture); if (gesture.equals(SelectGesture.class)) { supportedTypes |= HandwritingGesture.GESTURE_TYPE_SELECT; + } else if (gesture.equals(SelectRangeGesture.class)) { + supportedTypes |= HandwritingGesture.GESTURE_TYPE_SELECT_RANGE; } else if (gesture.equals(InsertGesture.class)) { supportedTypes |= HandwritingGesture.GESTURE_TYPE_INSERT; } else if (gesture.equals(DeleteGesture.class)) { supportedTypes |= HandwritingGesture.GESTURE_TYPE_DELETE; + } else if (gesture.equals(DeleteRangeGesture.class)) { + supportedTypes |= HandwritingGesture.GESTURE_TYPE_DELETE_RANGE; } else if (gesture.equals(RemoveSpaceGesture.class)) { supportedTypes |= HandwritingGesture.GESTURE_TYPE_REMOVE_SPACE; } else if (gesture.equals(JoinOrSplitGesture.class)) { diff --git a/core/java/android/view/inputmethod/HandwritingGesture.java b/core/java/android/view/inputmethod/HandwritingGesture.java index 494aaaa32f576..07b1e1f0468eb 100644 --- a/core/java/android/view/inputmethod/HandwritingGesture.java +++ b/core/java/android/view/inputmethod/HandwritingGesture.java @@ -25,6 +25,7 @@ import android.view.MotionEvent; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.List; import java.util.concurrent.Executor; import java.util.function.IntConsumer; @@ -105,6 +106,16 @@ public abstract class HandwritingGesture { /** Gesture of type {@link JoinOrSplitGesture} to join or split text. */ public static final int GESTURE_TYPE_JOIN_OR_SPLIT = 1 << 4; + /** + * Gesture of type {@link SelectRangeGesture} to select range of text. + */ + public static final int GESTURE_TYPE_SELECT_RANGE = 1 << 5; + + /** + * Gesture of type {@link DeleteRangeGesture} to delete range of text. + */ + public static final int GESTURE_TYPE_DELETE_RANGE = 1 << 6; + /** * Type of gesture like {@link #GESTURE_TYPE_SELECT}, {@link #GESTURE_TYPE_INSERT}, * or {@link #GESTURE_TYPE_DELETE}. @@ -112,8 +123,10 @@ public abstract class HandwritingGesture { @IntDef(prefix = {"GESTURE_TYPE_"}, value = { GESTURE_TYPE_NONE, GESTURE_TYPE_SELECT, + GESTURE_TYPE_SELECT_RANGE, GESTURE_TYPE_INSERT, GESTURE_TYPE_DELETE, + GESTURE_TYPE_DELETE_RANGE, GESTURE_TYPE_REMOVE_SPACE, GESTURE_TYPE_JOIN_OR_SPLIT}) @Retention(RetentionPolicy.SOURCE) @@ -123,13 +136,15 @@ public abstract class HandwritingGesture { * Flags which can be any combination of {@link #GESTURE_TYPE_SELECT}, * {@link #GESTURE_TYPE_INSERT}, or {@link #GESTURE_TYPE_DELETE}. * {@link GestureTypeFlags} can be used by editors to declare what gestures are supported - * and report them in {@link EditorInfo#setSupportedHandwritingGestureTypes(int)}. + * and report them in {@link EditorInfo#setSupportedHandwritingGestures(List)}. * @hide */ @IntDef(flag = true, prefix = {"GESTURE_TYPE_"}, value = { GESTURE_TYPE_SELECT, + GESTURE_TYPE_SELECT_RANGE, GESTURE_TYPE_INSERT, GESTURE_TYPE_DELETE, + GESTURE_TYPE_DELETE_RANGE, GESTURE_TYPE_REMOVE_SPACE, GESTURE_TYPE_JOIN_OR_SPLIT}) @Retention(RetentionPolicy.SOURCE) @@ -140,7 +155,7 @@ public abstract class HandwritingGesture { /** * Returns the gesture type {@link GestureType}. * {@link GestureType} can be used by editors to declare what gestures are supported and report - * them in {@link EditorInfo#setSupportedHandwritingGestureTypes(int)}. + * them in {@link EditorInfo#setSupportedHandwritingGestures(List)}. * @hide */ @TestApi diff --git a/core/java/android/view/inputmethod/SelectGesture.java b/core/java/android/view/inputmethod/SelectGesture.java index 2f02e66d4295c..6dc4ed2956690 100644 --- a/core/java/android/view/inputmethod/SelectGesture.java +++ b/core/java/android/view/inputmethod/SelectGesture.java @@ -27,9 +27,11 @@ import android.widget.TextView; import java.util.Objects; /** - * A sub-class of {@link HandwritingGesture} for selecting an area of text. + * A sub-class of {@link HandwritingGesture} for selecting an area of text using single rectangle. * This class holds the information required for selection of text in * toolkit widgets like {@link TextView}. + *

Note: This selects all text within the given area. To select a range between + * two areas, use {@link SelectRangeGesture}.

*/ public final class SelectGesture extends HandwritingGesture implements Parcelable { diff --git a/core/java/android/view/inputmethod/SelectRangeGesture.aidl b/core/java/android/view/inputmethod/SelectRangeGesture.aidl new file mode 100644 index 0000000000000..a7bce0adddf01 --- /dev/null +++ b/core/java/android/view/inputmethod/SelectRangeGesture.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view.inputmethod; + +parcelable SelectRangeGesture; \ No newline at end of file diff --git a/core/java/android/view/inputmethod/SelectRangeGesture.java b/core/java/android/view/inputmethod/SelectRangeGesture.java new file mode 100644 index 0000000000000..7cb60023bd31f --- /dev/null +++ b/core/java/android/view/inputmethod/SelectRangeGesture.java @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view.inputmethod; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SuppressLint; +import android.graphics.RectF; +import android.os.Parcel; +import android.os.Parcelable; +import android.widget.TextView; + +import java.util.Objects; + +/** + * A subclass of {@link HandwritingGesture} for selecting a range of text by defining start and end + * rectangles. This can be useful when the range cannot be defined with a single rectangle. + * This class holds the information required for selection of text in + * toolkit widgets like {@link TextView}. + *

Note: this selects text within a range between two given areas. To select all text + * within a single area, use {@link SelectGesture}

+ */ +public final class SelectRangeGesture extends HandwritingGesture implements Parcelable { + + private @Granularity int mGranularity; + private RectF mStartArea; + private RectF mEndArea; + + private SelectRangeGesture( + int granularity, RectF startArea, RectF endArea, String fallbackText) { + mType = GESTURE_TYPE_SELECT_RANGE; + mStartArea = startArea; + mEndArea = endArea; + mGranularity = granularity; + mFallbackText = fallbackText; + } + + private SelectRangeGesture(@NonNull Parcel source) { + mType = GESTURE_TYPE_SELECT_RANGE; + mFallbackText = source.readString8(); + mGranularity = source.readInt(); + mStartArea = source.readTypedObject(RectF.CREATOR); + mEndArea = source.readTypedObject(RectF.CREATOR); + } + + /** + * Returns Granular level on which text should be operated. + * @see #GRANULARITY_CHARACTER + * @see #GRANULARITY_WORD + */ + @Granularity + public int getGranularity() { + return mGranularity; + } + + /** + * Returns the Selection start area {@link RectF} in screen coordinates. + * + * Getter for selection area set with {@link Builder#setSelectionStartArea(RectF)}. + */ + @NonNull + public RectF getSelectionStartArea() { + return mStartArea; + } + + /** + * Returns the Selection end area {@link RectF} in screen coordinates. + * + * Getter for selection area set with {@link Builder#setSelectionEndArea(RectF)}. + */ + @NonNull + public RectF getSelectionEndArea() { + return mEndArea; + } + + + /** + * Builder for {@link SelectRangeGesture}. This class is not designed to be thread-safe. + */ + public static final class Builder { + private int mGranularity; + private RectF mStartArea; + private RectF mEndArea; + private String mFallbackText; + + /** + * Define text selection granularity. Intersecting words/characters will be + * included in the operation. + * @param granularity {@link HandwritingGesture#GRANULARITY_WORD} or + * {@link HandwritingGesture#GRANULARITY_CHARACTER}. + * @return {@link Builder}. + */ + @NonNull + @SuppressLint("MissingGetterMatchingBuilder") + public Builder setGranularity(@HandwritingGesture.Granularity int granularity) { + mGranularity = granularity; + return this; + } + + /** + * Set rectangular single/multiline start of text selection area intersecting with text. + * + * The resulting selection is performed from the start of first word/character in the start + * rectangle to the end of the last word/character in the end rectangle + * {@link #setSelectionEndArea(RectF)}. + *
+ * Selection strategy using two rectangles + *
+ * + * Intersection is determined using + * {@link #setGranularity(int)}. e.g. {@link HandwritingGesture#GRANULARITY_WORD} includes + * all the words with their width/height center included in the selection rectangle. + * @param startArea {@link RectF} (in screen coordinates) for start of selection. This + * rectangle belongs to first line where selection should start. + */ + @NonNull + @SuppressLint("MissingGetterMatchingBuilder") + public Builder setSelectionStartArea(@NonNull RectF startArea) { + mStartArea = startArea; + return this; + } + + /** + * Set rectangular single/multiline end of text selection area intersecting with text. + * + * The resulting selection is performed from the start of first word/character in the start + * rectangle {@link #setSelectionStartArea(RectF)} to the end of the last word/character in + * the end rectangle. + *
+ * Selection strategy using two rectangles + *
+ * + * The selection includes the first word/character in the rectangle, the last + * word/character in the rectangle, and everything in between even if it's not in the + * rectangle. + * + * Intersection is determined using + * {@link #setGranularity(int)}. e.g. {@link HandwritingGesture#GRANULARITY_WORD} includes + * all the words with their width/height center included in the selection rectangle. + * @param endArea {@link RectF} (in screen coordinates) for start of selection. This + * rectangle belongs to the last line where selection should end. + */ + @NonNull + @SuppressLint("MissingGetterMatchingBuilder") + public Builder setSelectionEndArea(@NonNull RectF endArea) { + mEndArea = endArea; + return this; + } + + /** + * Set fallback text that will be committed at current cursor position if there is no + * applicable text beneath the area of gesture. + * @param fallbackText text to set + */ + @NonNull + public Builder setFallbackText(@Nullable String fallbackText) { + mFallbackText = fallbackText; + return this; + } + + /** + * @return {@link SelectRangeGesture} using parameters in this + * {@link SelectRangeGesture.Builder}. + * @throws IllegalArgumentException if one or more positional parameters are not specified. + */ + @NonNull + public SelectRangeGesture build() { + if (mStartArea == null || mStartArea.isEmpty() || mEndArea == null + || mEndArea.isEmpty()) { + throw new IllegalArgumentException("Selection area must be set."); + } + if (mGranularity <= GRANULARITY_UNDEFINED) { + throw new IllegalArgumentException("Selection granularity must be set."); + } + return new SelectRangeGesture(mGranularity, mStartArea, mEndArea, mFallbackText); + } + } + + /** + * Used to make this class parcelable. + */ + @NonNull + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + @Override + public SelectRangeGesture createFromParcel(Parcel source) { + return new SelectRangeGesture(source); + } + + @Override + public SelectRangeGesture[] newArray(int size) { + return new SelectRangeGesture[size]; + } + }; + + @Override + public int hashCode() { + return Objects.hash(mGranularity, mStartArea, mEndArea, mFallbackText); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof SelectRangeGesture)) return false; + + SelectRangeGesture that = (SelectRangeGesture) o; + + if (mGranularity != that.mGranularity) return false; + if (!Objects.equals(mFallbackText, that.mFallbackText)) return false; + if (!Objects.equals(mStartArea, that.mStartArea)) return false; + return Objects.equals(mEndArea, that.mEndArea); + } + + @Override + public int describeContents() { + return 0; + } + + /** + * Used to package this object into a {@link Parcel}. + * + * @param dest The {@link Parcel} to be written. + * @param flags The flags used for parceling. + */ + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeString8(mFallbackText); + dest.writeInt(mGranularity); + dest.writeTypedObject(mStartArea, flags); + dest.writeTypedObject(mEndArea, flags); + } +} diff --git a/core/java/com/android/internal/inputmethod/IRemoteInputConnection.aidl b/core/java/com/android/internal/inputmethod/IRemoteInputConnection.aidl index f456e85adff44..17f9b7dea0459 100644 --- a/core/java/com/android/internal/inputmethod/IRemoteInputConnection.aidl +++ b/core/java/com/android/internal/inputmethod/IRemoteInputConnection.aidl @@ -22,12 +22,14 @@ import android.view.KeyEvent; import android.view.inputmethod.CompletionInfo; import android.view.inputmethod.CorrectionInfo; import android.view.inputmethod.DeleteGesture; +import android.view.inputmethod.DeleteRangeGesture; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputContentInfo; import android.view.inputmethod.InsertGesture; import android.view.inputmethod.JoinOrSplitGesture; import android.view.inputmethod.RemoveSpaceGesture; import android.view.inputmethod.SelectGesture; +import android.view.inputmethod.SelectRangeGesture; import android.view.inputmethod.TextAttribute; import com.android.internal.infra.AndroidFuture; @@ -95,12 +97,18 @@ import com.android.internal.inputmethod.InputConnectionCommandHeader; void performHandwritingSelectGesture(in InputConnectionCommandHeader header, in SelectGesture gesture, in ResultReceiver resultReceiver); + void performHandwritingSelectRangeGesture(in InputConnectionCommandHeader header, + in SelectRangeGesture gesture, in ResultReceiver resultReceiver); + void performHandwritingInsertGesture(in InputConnectionCommandHeader header, in InsertGesture gesture, in ResultReceiver resultReceiver); void performHandwritingDeleteGesture(in InputConnectionCommandHeader header, in DeleteGesture gesture, in ResultReceiver resultReceiver); + void performHandwritingDeleteRangeGesture(in InputConnectionCommandHeader header, + in DeleteRangeGesture gesture, in ResultReceiver resultReceiver); + void performHandwritingRemoveSpaceGesture(in InputConnectionCommandHeader header, in RemoveSpaceGesture gesture, in ResultReceiver resultReceiver); diff --git a/core/java/com/android/internal/inputmethod/InputMethodDebug.java b/core/java/com/android/internal/inputmethod/InputMethodDebug.java index bbf0a764d9e4e..7f3144bb58943 100644 --- a/core/java/com/android/internal/inputmethod/InputMethodDebug.java +++ b/core/java/com/android/internal/inputmethod/InputMethodDebug.java @@ -272,19 +272,24 @@ public final class InputMethodDebug { if ((gestureTypeFlags & HandwritingGesture.GESTURE_TYPE_SELECT) != 0) { joiner.add("SELECT"); } + if ((gestureTypeFlags & HandwritingGesture.GESTURE_TYPE_SELECT_RANGE) != 0) { + joiner.add("SELECT_RANGE"); + } if ((gestureTypeFlags & HandwritingGesture.GESTURE_TYPE_INSERT) != 0) { joiner.add("INSERT"); } if ((gestureTypeFlags & HandwritingGesture.GESTURE_TYPE_DELETE) != 0) { joiner.add("DELETE"); } + if ((gestureTypeFlags & HandwritingGesture.GESTURE_TYPE_DELETE_RANGE) != 0) { + joiner.add("DELETE_RANGE"); + } if ((gestureTypeFlags & HandwritingGesture.GESTURE_TYPE_REMOVE_SPACE) != 0) { joiner.add("REMOVE_SPACE"); } if ((gestureTypeFlags & HandwritingGesture.GESTURE_TYPE_JOIN_OR_SPLIT) != 0) { joiner.add("JOIN_OR_SPLIT"); } - return joiner.setEmptyValue("(none)").toString(); } diff --git a/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java b/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java index 6a7028d31edbc..713e913abce10 100644 --- a/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java +++ b/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java @@ -41,6 +41,7 @@ import android.view.ViewRootImpl; import android.view.inputmethod.CompletionInfo; import android.view.inputmethod.CorrectionInfo; import android.view.inputmethod.DeleteGesture; +import android.view.inputmethod.DeleteRangeGesture; import android.view.inputmethod.DumpableInputConnection; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.HandwritingGesture; @@ -51,6 +52,7 @@ import android.view.inputmethod.InsertGesture; import android.view.inputmethod.JoinOrSplitGesture; import android.view.inputmethod.RemoveSpaceGesture; import android.view.inputmethod.SelectGesture; +import android.view.inputmethod.SelectRangeGesture; import android.view.inputmethod.TextAttribute; import android.view.inputmethod.TextSnapshot; @@ -983,6 +985,14 @@ public final class RemoteInputConnectionImpl extends IRemoteInputConnection.Stub performHandwritingGestureInternal(header, gesture, resultReceiver); } + @Dispatching(cancellable = true) + @Override + public void performHandwritingSelectRangeGesture( + InputConnectionCommandHeader header, SelectRangeGesture gesture, + ResultReceiver resultReceiver) { + performHandwritingGestureInternal(header, gesture, resultReceiver); + } + @Dispatching(cancellable = true) @Override public void performHandwritingInsertGesture( @@ -999,6 +1009,14 @@ public final class RemoteInputConnectionImpl extends IRemoteInputConnection.Stub performHandwritingGestureInternal(header, gesture, resultReceiver); } + @Dispatching(cancellable = true) + @Override + public void performHandwritingDeleteRangeGesture( + InputConnectionCommandHeader header, DeleteRangeGesture gesture, + ResultReceiver resultReceiver) { + performHandwritingGestureInternal(header, gesture, resultReceiver); + } + @Dispatching(cancellable = true) @Override public void performHandwritingRemoveSpaceGesture( diff --git a/docs/html/reference/images/input_method/stylus_handwriting/delete_range_gesture_rects.png b/docs/html/reference/images/input_method/stylus_handwriting/delete_range_gesture_rects.png new file mode 100644 index 0000000000000000000000000000000000000000..185582017ed63aeba4ff5185fd4b4e56dad47bb1 GIT binary patch literal 32318 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 Y2FfAlH*I99=y&>9L-#?M+S51x3$BSBsQ>@~ literal 0 HcmV?d00001