Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c8199dc authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add an @hide way to adjust CursorAnchorInfo for another Matrix" into qt-dev

parents d7f4983c e4410a13
Loading
Loading
Loading
Loading
+81 −20
Original line number Diff line number Diff line
@@ -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;
    }

    /**
+23 −432

File changed.

Preview size limit exceeded, changes collapsed.