Loading core/java/android/view/inputmethod/CursorAnchorInfo.java +81 −20 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -388,7 +389,7 @@ public final class CursorAnchorInfo implements Parcelable { "required when positional parameters are specified."); } } return new CursorAnchorInfo(this); return CursorAnchorInfo.create(this); } /** Loading @@ -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; } /** Loading core/tests/coretests/src/android/view/inputmethod/CursorAnchorInfoTest.java +23 −432 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
core/java/android/view/inputmethod/CursorAnchorInfo.java +81 −20 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -388,7 +389,7 @@ public final class CursorAnchorInfo implements Parcelable { "required when positional parameters are specified."); } } return new CursorAnchorInfo(this); return CursorAnchorInfo.create(this); } /** Loading @@ -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; } /** Loading
core/tests/coretests/src/android/view/inputmethod/CursorAnchorInfoTest.java +23 −432 File changed.Preview size limit exceeded, changes collapsed. Show changes