summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2019-05-03 15:56:32 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2019-05-03 15:56:32 +0000
commit0c8199dc59bea84c3633eeefb213c0c534bf1081 (patch)
treec0f9ddfff4a47435d663e1ee64e88b07a640eb27 /core/java/android
parentd7f4983cd8b465cb7599894d82be6a5f799b0142 (diff)
parente4410a135ba4fbafa6594181eff50fe5145194b3 (diff)
Merge "Add an @hide way to adjust CursorAnchorInfo for another Matrix" into qt-dev
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/view/inputmethod/CursorAnchorInfo.java101
1 files changed, 81 insertions, 20 deletions
diff --git a/core/java/android/view/inputmethod/CursorAnchorInfo.java b/core/java/android/view/inputmethod/CursorAnchorInfo.java
index ee5b3ecc7682..21ead4c62366 100644
--- a/core/java/android/view/inputmethod/CursorAnchorInfo.java
+++ b/core/java/android/view/inputmethod/CursorAnchorInfo.java
@@ -17,6 +17,7 @@
package android.view.inputmethod;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.os.Parcel;
@@ -388,7 +389,7 @@ public final class CursorAnchorInfo implements Parcelable {
"required when positional parameters are specified.");
}
}
- return new CursorAnchorInfo(this);
+ return CursorAnchorInfo.create(this);
}
/**
@@ -412,30 +413,90 @@ public final class CursorAnchorInfo implements Parcelable {
}
}
- private CursorAnchorInfo(final Builder builder) {
- mSelectionStart = builder.mSelectionStart;
- mSelectionEnd = builder.mSelectionEnd;
- mComposingTextStart = builder.mComposingTextStart;
- mComposingText = builder.mComposingText;
- mInsertionMarkerFlags = builder.mInsertionMarkerFlags;
- mInsertionMarkerHorizontal = builder.mInsertionMarkerHorizontal;
- mInsertionMarkerTop = builder.mInsertionMarkerTop;
- mInsertionMarkerBaseline = builder.mInsertionMarkerBaseline;
- mInsertionMarkerBottom = builder.mInsertionMarkerBottom;
- mCharacterBoundsArray = builder.mCharacterBoundsArrayBuilder != null ?
- builder.mCharacterBoundsArrayBuilder.build() : null;
- mMatrixValues = new float[9];
+ private static CursorAnchorInfo create(Builder builder) {
+ final SparseRectFArray characterBoundsArray =
+ builder.mCharacterBoundsArrayBuilder != null
+ ? builder.mCharacterBoundsArrayBuilder.build()
+ : null;
+ final float[] matrixValues = new float[9];
if (builder.mMatrixInitialized) {
- System.arraycopy(builder.mMatrixValues, 0, mMatrixValues, 0, 9);
+ System.arraycopy(builder.mMatrixValues, 0, matrixValues, 0, 9);
} else {
- Matrix.IDENTITY_MATRIX.getValues(mMatrixValues);
+ Matrix.IDENTITY_MATRIX.getValues(matrixValues);
}
+ return new CursorAnchorInfo(builder.mSelectionStart, builder.mSelectionEnd,
+ builder.mComposingTextStart, builder.mComposingText, builder.mInsertionMarkerFlags,
+ builder.mInsertionMarkerHorizontal, builder.mInsertionMarkerTop,
+ builder.mInsertionMarkerBaseline, builder.mInsertionMarkerBottom,
+ characterBoundsArray, matrixValues);
+ }
+
+ private CursorAnchorInfo(int selectionStart, int selectionEnd, int composingTextStart,
+ @Nullable CharSequence composingText, int insertionMarkerFlags,
+ float insertionMarkerHorizontal, float insertionMarkerTop,
+ float insertionMarkerBaseline, float insertionMarkerBottom,
+ @Nullable SparseRectFArray characterBoundsArray, @NonNull float[] matrixValues) {
+ mSelectionStart = selectionStart;
+ mSelectionEnd = selectionEnd;
+ mComposingTextStart = composingTextStart;
+ mComposingText = composingText;
+ mInsertionMarkerFlags = insertionMarkerFlags;
+ mInsertionMarkerHorizontal = insertionMarkerHorizontal;
+ mInsertionMarkerTop = insertionMarkerTop;
+ mInsertionMarkerBaseline = insertionMarkerBaseline;
+ mInsertionMarkerBottom = insertionMarkerBottom;
+ mCharacterBoundsArray = characterBoundsArray;
+ mMatrixValues = matrixValues;
+
// To keep hash function simple, we only use some complex objects for hash.
- int hash = Objects.hashCode(mComposingText);
- hash *= 31;
- hash += Arrays.hashCode(mMatrixValues);
- mHashCode = hash;
+ int hashCode = Objects.hashCode(mComposingText);
+ hashCode *= 31;
+ hashCode += Arrays.hashCode(matrixValues);
+ mHashCode = hashCode;
+ }
+
+ /**
+ * Creates a new instance of {@link CursorAnchorInfo} by applying {@code parentMatrix} to
+ * the coordinate transformation matrix.
+ *
+ * @param original {@link CursorAnchorInfo} to be cloned from.
+ * @param parentMatrix {@link Matrix} to be applied to {@code original.getMatrix()}
+ * @return A new instance of {@link CursorAnchorInfo} whose {@link CursorAnchorInfo#getMatrix()}
+ * returns {@code parentMatrix * original.getMatrix()}.
+ * @hide
+ */
+ public static CursorAnchorInfo createForAdditionalParentMatrix(CursorAnchorInfo original,
+ @NonNull Matrix parentMatrix) {
+ return new CursorAnchorInfo(original.mSelectionStart, original.mSelectionEnd,
+ original.mComposingTextStart, original.mComposingText,
+ original.mInsertionMarkerFlags, original.mInsertionMarkerHorizontal,
+ original.mInsertionMarkerTop, original.mInsertionMarkerBaseline,
+ original.mInsertionMarkerBottom, original.mCharacterBoundsArray,
+ computeMatrixValues(parentMatrix, original));
+ }
+
+ /**
+ * Returns a float array that represents {@link Matrix} elements for
+ * {@code parentMatrix * info.getMatrix()}.
+ *
+ * @param parentMatrix {@link Matrix} to be multiplied.
+ * @param info {@link CursorAnchorInfo} to provide {@link Matrix} to be multiplied.
+ * @return {@code parentMatrix * info.getMatrix()}.
+ */
+ private static float[] computeMatrixValues(@NonNull Matrix parentMatrix,
+ @NonNull CursorAnchorInfo info) {
+ if (parentMatrix.isIdentity()) {
+ return info.mMatrixValues;
+ }
+
+ final Matrix newMatrix = new Matrix();
+ newMatrix.setValues(info.mMatrixValues);
+ newMatrix.postConcat(parentMatrix);
+
+ final float[] matrixValues = new float[9];
+ newMatrix.getValues(matrixValues);
+ return matrixValues;
}
/**