From f8b6e1f7da5cfa2e3dc88f9b643f766230f6ea50 Mon Sep 17 00:00:00 2001 From: Tobrun Date: Tue, 29 Mar 2016 09:16:02 +0200 Subject: [PATCH] [android] #4487 - ArraysInOfBoundsException fix for addMarkers --- .../com/mapbox/mapboxsdk/maps/MapboxMap.java | 51 +++++++++++-------- .../mapbox/mapboxsdk/maps/MapboxMapTest.java | 17 +++++++ 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index 9ab883c13..3fd9a2af5 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -610,29 +610,36 @@ public class MapboxMap { public List addMarkers(@NonNull List markerOptionsList) { int count = markerOptionsList.size(); List markers = new ArrayList<>(count); - MarkerOptions markerOptions; - Marker marker; - for (int i = 0; i < count; i++) { - markerOptions = markerOptionsList.get(i); - marker = prepareMarker(markerOptions); - markers.add(marker); - } - - long[] ids = mMapView.addMarkers(markers); - long id = 0; - Marker m; - - for (int i = 0; i < markers.size(); i++) { - m = markers.get(i); - m.setMapboxMap(this); - if (ids != null) { - id = ids[i]; - } else { - //unit test - id++; + if (count > 0) { + MarkerOptions markerOptions; + Marker marker; + for (int i = 0; i < count; i++) { + markerOptions = markerOptionsList.get(i); + marker = prepareMarker(markerOptions); + markers.add(marker); + } + + if (markers.size() > 0) { + long[] ids = mMapView.addMarkers(markers); + + // if unittests or markers are correctly added to map + if (ids == null || ids.length == markers.size()) { + long id = 0; + Marker m; + for (int i = 0; i < markers.size(); i++) { + m = markers.get(i); + m.setMapboxMap(this); + if (ids != null) { + id = ids[i]; + } else { + //unit test + id++; + } + m.setId(id); + mAnnotations.put(id, m); + } + } } - m.setId(id); - mAnnotations.put(id, m); } return markers; } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java b/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java index 9e06a46aa..2032cfe90 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java @@ -534,6 +534,23 @@ public class MapboxMapTest { assertTrue(mMapboxMap.getMarkers().contains(markerOptions2.getMarker())); } + @Test + public void testAddMarkersEmpty() { + List markerList = new ArrayList<>(); + mMapboxMap.addMarkers(markerList); + assertEquals("Markers size should be 0", 0, mMapboxMap.getMarkers().size()); + } + + @Test + public void testAddMarkersSingleMarker() { + List markerList = new ArrayList<>(); + MarkerOptions markerOptions = new MarkerOptions().title("a"); + markerList.add(markerOptions); + mMapboxMap.addMarkers(markerList); + assertEquals("Markers size should be 1", 1, mMapboxMap.getMarkers().size()); + assertTrue(mMapboxMap.getMarkers().contains(markerOptions.getMarker())); + } + @Test public void testAddPolygon() { PolygonOptions polygonOptions = new PolygonOptions().add(new LatLng());