aboutsummaryrefslogtreecommitdiffstats
path: root/java/src
diff options
context:
space:
mode:
authorTadashi G. Takaoka <takaoka@google.com>2013-04-10 09:34:59 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-04-10 09:34:59 +0000
commit1e256f5888805eff3f1a2db88ea1d60c622689a2 (patch)
treeb74f1ee805cf68043effabe12c01ea70b1138930 /java/src
parent4f43076370dd2fb6243f28ee932d6c593c49ee43 (diff)
parentad205b2e3f43ab374fe7a573abdcdd45832d0e4b (diff)
downloadlatinime-1e256f5888805eff3f1a2db88ea1d60c622689a2.tar.gz
latinime-1e256f5888805eff3f1a2db88ea1d60c622689a2.tar.xz
latinime-1e256f5888805eff3f1a2db88ea1d60c622689a2.zip
Merge "Protect simultaneously modifying gesture preview data"
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java16
1 files changed, 15 insertions, 1 deletions
diff --git a/java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java b/java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java
index e3e6d39e4..f682b518f 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java
@@ -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,7 +91,13 @@ final class GesturePreviewTrail {
}
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);
if (mEventTimes.getLength() == trailSize) {
return;
@@ -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();