Skip to content

Commit 7df35cd

Browse files
committed
Fix concurrent modification exception for detectors
1 parent 60bcff9 commit 7df35cd

3 files changed

Lines changed: 31 additions & 7 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Changelog for the Mapbox Gestures for Android
22

3+
## Main
4+
* Fix concurrent modification exception for detectors
5+
36
## 0.9.1 - November 27, 2023
47
Minor release with internal fixes for publishing library
58

library/src/main/java/com/mapbox/android/gestures/AndroidGesturesManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.Arrays;
1313
import java.util.List;
1414
import java.util.Set;
15+
import java.util.concurrent.CopyOnWriteArrayList;
1516

1617
/**
1718
* Entry point for all of the detectors. Set listener for gestures you'd like to be notified about
@@ -58,7 +59,7 @@ public class AndroidGesturesManager {
5859
public static final int GESTURE_TYPE_QUICK_SCALE = 15;
5960

6061
private final List<Set<Integer>> mutuallyExclusiveGestures = new ArrayList<>();
61-
private final List<BaseGesture> detectors = new ArrayList<>();
62+
private final List<BaseGesture> detectors = new CopyOnWriteArrayList<>();
6263

6364
private final StandardGestureDetector standardGestureDetector;
6465
private final StandardScaleGestureDetector standardScaleGestureDetector;

library/src/test/java/com/mapbox/android/gestures/AndroidGesturesManagerTest.java

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
package com.mapbox.android.gestures;
22

3+
import static junit.framework.Assert.assertEquals;
4+
import static junit.framework.Assert.assertNotNull;
5+
import static org.junit.Assert.assertTrue;
6+
7+
import android.view.MotionEvent;
8+
39
import org.junit.Before;
410
import org.junit.Test;
511
import org.junit.runner.RunWith;
@@ -11,9 +17,6 @@
1117
import java.util.List;
1218
import java.util.Set;
1319

14-
import static junit.framework.Assert.assertEquals;
15-
import static junit.framework.Assert.assertNotNull;
16-
1720
@RunWith(RobolectricTestRunner.class)
1821
public class AndroidGesturesManagerTest {
1922
private AndroidGesturesManager androidGesturesManager;
@@ -44,9 +47,9 @@ public void setUp() throws Exception {
4447
mutuallyExclusivesList.add(set3);
4548

4649
androidGesturesManager =
47-
new AndroidGesturesManager(
48-
RuntimeEnvironment.application.getApplicationContext(),
49-
mutuallyExclusivesList, true);
50+
new AndroidGesturesManager(
51+
RuntimeEnvironment.application.getApplicationContext(),
52+
mutuallyExclusivesList, true);
5053
}
5154

5255
@Test
@@ -69,4 +72,21 @@ public void setMutuallyExclusivesTest() throws Exception {
6972
androidGesturesManager.setMutuallyExclusiveGestures(mutuallyExclusivesList);
7073
assertEquals(androidGesturesManager.getMutuallyExclusiveGestures(), mutuallyExclusivesList);
7174
}
75+
76+
@Test
77+
public void onSingleTapModifyDetectorsTest() {
78+
final StandardGestureDetector standardGestureDetector = new StandardGestureDetector(RuntimeEnvironment.getApplication().getApplicationContext(), androidGesturesManager);
79+
80+
androidGesturesManager.setStandardGestureListener(new StandardGestureDetector.SimpleStandardOnGestureListener() {
81+
@Override
82+
public boolean onDown(MotionEvent e) {
83+
androidGesturesManager.getDetectors().add(standardGestureDetector);
84+
return true;
85+
}
86+
});
87+
88+
MotionEvent downEvent = TestUtils.INSTANCE.getMotionEvent(MotionEvent.ACTION_DOWN, 0, 0, null);
89+
androidGesturesManager.onTouchEvent(downEvent);
90+
assertTrue(androidGesturesManager.getDetectors().contains(standardGestureDetector));
91+
}
7292
}

0 commit comments

Comments
 (0)