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

Commit ad205b2e authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Protect simultaneously modifying gesture preview data

Bug: 8556775
Change-Id: I83272e3adbfc0c9cc14f9e8b479e926aabf4fa2a
parent 262d5bd9
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import com.android.inputmethod.latin.ResizableIntArray;
final class GesturePreviewTrail {
    private static final int DEFAULT_CAPACITY = GestureStrokeWithPreviewPoints.PREVIEW_CAPACITY;

    // These three {@link ResizableIntArray}s should be synchronized by {@link #mEventTimes}.
    private final ResizableIntArray mXCoordinates = new ResizableIntArray(DEFAULT_CAPACITY);
    private final ResizableIntArray mYCoordinates = new ResizableIntArray(DEFAULT_CAPACITY);
    private final ResizableIntArray mEventTimes = new ResizableIntArray(DEFAULT_CAPACITY);
@@ -90,6 +91,12 @@ final class GesturePreviewTrail {
    }

    public void addStroke(final GestureStrokeWithPreviewPoints stroke, final long downTime) {
        synchronized (mEventTimes) {
            addStrokeLocked(stroke, downTime);
        }
    }

    private void addStrokeLocked(final GestureStrokeWithPreviewPoints stroke, final long downTime) {
            final int trailSize = mEventTimes.getLength();
        stroke.appendPreviewStroke(mEventTimes, mXCoordinates, mYCoordinates);
        if (mEventTimes.getLength() == trailSize) {
@@ -169,6 +176,13 @@ final class GesturePreviewTrail {
     */
    public boolean drawGestureTrail(final Canvas canvas, final Paint paint,
            final Rect outBoundsRect, final Params params) {
        synchronized (mEventTimes) {
            return drawGestureTrailLocked(canvas, paint, outBoundsRect, params);
        }
    }

    private boolean drawGestureTrailLocked(final Canvas canvas, final Paint paint,
            final Rect outBoundsRect, final Params params) {
        // Initialize bounds rectangle.
        outBoundsRect.setEmpty();
        final int trailSize = mEventTimes.getLength();