Skip to content
Snippets Groups Projects
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
No related branches found
No related tags found
No related merge requests found
...@@ -37,6 +37,7 @@ import com.android.inputmethod.latin.ResizableIntArray; ...@@ -37,6 +37,7 @@ import com.android.inputmethod.latin.ResizableIntArray;
final class GesturePreviewTrail { final class GesturePreviewTrail {
private static final int DEFAULT_CAPACITY = GestureStrokeWithPreviewPoints.PREVIEW_CAPACITY; 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 mXCoordinates = new ResizableIntArray(DEFAULT_CAPACITY);
private final ResizableIntArray mYCoordinates = new ResizableIntArray(DEFAULT_CAPACITY); private final ResizableIntArray mYCoordinates = new ResizableIntArray(DEFAULT_CAPACITY);
private final ResizableIntArray mEventTimes = new ResizableIntArray(DEFAULT_CAPACITY); private final ResizableIntArray mEventTimes = new ResizableIntArray(DEFAULT_CAPACITY);
...@@ -90,7 +91,13 @@ final class GesturePreviewTrail { ...@@ -90,7 +91,13 @@ final class GesturePreviewTrail {
} }
public void addStroke(final GestureStrokeWithPreviewPoints stroke, final long downTime) { public void addStroke(final GestureStrokeWithPreviewPoints stroke, final long downTime) {
final int trailSize = mEventTimes.getLength(); synchronized (mEventTimes) {
addStrokeLocked(stroke, downTime);
}
}
private void addStrokeLocked(final GestureStrokeWithPreviewPoints stroke, final long downTime) {
final int trailSize = mEventTimes.getLength();
stroke.appendPreviewStroke(mEventTimes, mXCoordinates, mYCoordinates); stroke.appendPreviewStroke(mEventTimes, mXCoordinates, mYCoordinates);
if (mEventTimes.getLength() == trailSize) { if (mEventTimes.getLength() == trailSize) {
return; return;
...@@ -169,6 +176,13 @@ final class GesturePreviewTrail { ...@@ -169,6 +176,13 @@ final class GesturePreviewTrail {
*/ */
public boolean drawGestureTrail(final Canvas canvas, final Paint paint, public boolean drawGestureTrail(final Canvas canvas, final Paint paint,
final Rect outBoundsRect, final Params params) { 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. // Initialize bounds rectangle.
outBoundsRect.setEmpty(); outBoundsRect.setEmpty();
final int trailSize = mEventTimes.getLength(); final int trailSize = mEventTimes.getLength();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment