diff --git a/library/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.java b/library/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.java index afc34c56c..6ec39e1ad 100644 --- a/library/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.java +++ b/library/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.java @@ -427,6 +427,7 @@ public void setMapZoom(float zoom) { } @SuppressLint("NewApi") + @Override public void run() { if (!shouldRender(immutableOf(DefaultAdvancedMarkersClusterRenderer.this.mClusters), immutableOf(clusters))) { mCallback.run(); @@ -641,13 +642,16 @@ private MarkerModifier() { */ public void add(boolean priority, CreateMarkerTask c) { lock.lock(); - sendEmptyMessage(BLANK); - if (priority) { - mOnScreenCreateMarkerTasks.add(c); - } else { - mCreateMarkerTasks.add(c); + try { + sendEmptyMessage(BLANK); + if (priority) { + mOnScreenCreateMarkerTasks.add(c); + } else { + mCreateMarkerTasks.add(c); + } + } finally { + lock.unlock(); } - lock.unlock(); } /** @@ -658,13 +662,16 @@ public void add(boolean priority, CreateMarkerTask c) { */ public void remove(boolean priority, Marker m) { lock.lock(); - sendEmptyMessage(BLANK); - if (priority) { - mOnScreenRemoveMarkerTasks.add(m); - } else { - mRemoveMarkerTasks.add(m); + try { + sendEmptyMessage(BLANK); + if (priority) { + mOnScreenRemoveMarkerTasks.add(m); + } else { + mRemoveMarkerTasks.add(m); + } + } finally { + lock.unlock(); } - lock.unlock(); } /** @@ -676,8 +683,11 @@ public void remove(boolean priority, Marker m) { */ public void animate(MarkerWithPosition marker, LatLng from, LatLng to) { lock.lock(); - mAnimationTasks.add(new AnimationTask(marker, from, to)); - lock.unlock(); + try { + mAnimationTasks.add(new AnimationTask(marker, from, to)); + } finally { + lock.unlock(); + } } /** @@ -690,10 +700,13 @@ public void animate(MarkerWithPosition marker, LatLng from, LatLng to) { */ public void animateThenRemove(MarkerWithPosition marker, LatLng from, LatLng to) { lock.lock(); - AnimationTask animationTask = new AnimationTask(marker, from, to); - animationTask.removeOnAnimationComplete(mClusterManager.getMarkerManager()); - mAnimationTasks.add(animationTask); - lock.unlock(); + try { + AnimationTask animationTask = new AnimationTask(marker, from, to); + animationTask.removeOnAnimationComplete(mClusterManager.getMarkerManager()); + mAnimationTasks.add(animationTask); + } finally { + lock.unlock(); + } } @Override @@ -757,8 +770,8 @@ private void removeMarker(Marker m) { * @return true if there is still work to be processed. */ public boolean isBusy() { + lock.lock(); try { - lock.lock(); return !(mCreateMarkerTasks.isEmpty() && mOnScreenCreateMarkerTasks.isEmpty() && mOnScreenRemoveMarkerTasks.isEmpty() && mRemoveMarkerTasks.isEmpty() && mAnimationTasks.isEmpty() diff --git a/library/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.java b/library/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.java index 09fb6080b..441c7f423 100644 --- a/library/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.java +++ b/library/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.java @@ -418,6 +418,7 @@ public void setMapZoom(float zoom) { } @SuppressLint("NewApi") + @Override public void run() { if (!shouldRender(immutableOf(DefaultClusterRenderer.this.mClusters), immutableOf(clusters))) { mCallback.run(); @@ -632,13 +633,16 @@ private MarkerModifier() { */ public void add(boolean priority, CreateMarkerTask c) { lock.lock(); - sendEmptyMessage(BLANK); - if (priority) { - mOnScreenCreateMarkerTasks.add(c); - } else { - mCreateMarkerTasks.add(c); + try { + sendEmptyMessage(BLANK); + if (priority) { + mOnScreenCreateMarkerTasks.add(c); + } else { + mCreateMarkerTasks.add(c); + } + } finally { + lock.unlock(); } - lock.unlock(); } /** @@ -649,13 +653,16 @@ public void add(boolean priority, CreateMarkerTask c) { */ public void remove(boolean priority, Marker m) { lock.lock(); - sendEmptyMessage(BLANK); - if (priority) { - mOnScreenRemoveMarkerTasks.add(m); - } else { - mRemoveMarkerTasks.add(m); + try { + sendEmptyMessage(BLANK); + if (priority) { + mOnScreenRemoveMarkerTasks.add(m); + } else { + mRemoveMarkerTasks.add(m); + } + } finally { + lock.unlock(); } - lock.unlock(); } /** @@ -667,8 +674,11 @@ public void remove(boolean priority, Marker m) { */ public void animate(MarkerWithPosition marker, LatLng from, LatLng to) { lock.lock(); - mAnimationTasks.add(new AnimationTask(marker, from, to)); - lock.unlock(); + try { + mAnimationTasks.add(new AnimationTask(marker, from, to)); + } finally { + lock.unlock(); + } } /** @@ -681,10 +691,13 @@ public void animate(MarkerWithPosition marker, LatLng from, LatLng to) { */ public void animateThenRemove(MarkerWithPosition marker, LatLng from, LatLng to) { lock.lock(); - AnimationTask animationTask = new AnimationTask(marker, from, to); - animationTask.removeOnAnimationComplete(mClusterManager.getMarkerManager()); - mAnimationTasks.add(animationTask); - lock.unlock(); + try { + AnimationTask animationTask = new AnimationTask(marker, from, to); + animationTask.removeOnAnimationComplete(mClusterManager.getMarkerManager()); + mAnimationTasks.add(animationTask); + } finally { + lock.unlock(); + } } @Override @@ -748,8 +761,8 @@ private void removeMarker(Marker m) { * @return true if there is still work to be processed. */ public boolean isBusy() { + lock.lock(); try { - lock.lock(); return !(mCreateMarkerTasks.isEmpty() && mOnScreenCreateMarkerTasks.isEmpty() && mOnScreenRemoveMarkerTasks.isEmpty() && mRemoveMarkerTasks.isEmpty() && mAnimationTasks.isEmpty() diff --git a/library/src/main/java/com/google/maps/android/data/geojson/GeoJsonLayer.java b/library/src/main/java/com/google/maps/android/data/geojson/GeoJsonLayer.java index 1ee4b88fd..ab6b95105 100644 --- a/library/src/main/java/com/google/maps/android/data/geojson/GeoJsonLayer.java +++ b/library/src/main/java/com/google/maps/android/data/geojson/GeoJsonLayer.java @@ -172,6 +172,8 @@ public void addLayerToMap() { * * @return iterable of Feature elements */ + @Override + @SuppressWarnings("unchecked") public Iterable getFeatures() { return (Iterable) super.getFeatures(); } diff --git a/library/src/main/java/com/google/maps/android/data/kml/KmlContainerParser.java b/library/src/main/java/com/google/maps/android/data/kml/KmlContainerParser.java index 00bf44159..472eb31eb 100644 --- a/library/src/main/java/com/google/maps/android/data/kml/KmlContainerParser.java +++ b/library/src/main/java/com/google/maps/android/data/kml/KmlContainerParser.java @@ -80,7 +80,7 @@ private static KmlContainer assignPropertiesToContainer(XmlPullParser parser) String containerId = null; HashMap containerProperties = new HashMap(); HashMap containerStyles = new HashMap(); - HashMap containerPlacemarks = new HashMap<>(); + HashMap containerPlacemarks = new HashMap<>(); ArrayList nestedContainers = new ArrayList(); HashMap containerStyleMaps = new HashMap(); HashMap containerGroundOverlays @@ -105,7 +105,7 @@ private static KmlContainer assignPropertiesToContainer(XmlPullParser parser) } else if (parser.getName().equals(STYLE)) { setContainerStyle(parser, containerStyles); } else if (parser.getName().equals(PLACEMARK)) { - setContainerPlacemark(parser, (HashMap) containerPlacemarks); + setContainerPlacemark(parser, containerPlacemarks); } else if (parser.getName().equals(EXTENDED_DATA)) { setExtendedDataProperties(parser, containerProperties); } else if (parser.getName().equals(GROUND_OVERLAY)) { @@ -116,7 +116,7 @@ private static KmlContainer assignPropertiesToContainer(XmlPullParser parser) eventType = parser.next(); } - return new KmlContainer(containerProperties, containerStyles, (HashMap) containerPlacemarks, + return new KmlContainer(containerProperties, containerStyles, containerPlacemarks, containerStyleMaps, nestedContainers, containerGroundOverlays, containerId); } diff --git a/library/src/main/java/com/google/maps/android/data/kml/KmlLayer.java b/library/src/main/java/com/google/maps/android/data/kml/KmlLayer.java index d76f45481..dfeb13bf6 100644 --- a/library/src/main/java/com/google/maps/android/data/kml/KmlLayer.java +++ b/library/src/main/java/com/google/maps/android/data/kml/KmlLayer.java @@ -25,10 +25,10 @@ import com.google.android.gms.maps.GoogleMap; import com.google.maps.android.collections.GroundOverlayManager; -import com.google.maps.android.data.Layer; import com.google.maps.android.collections.MarkerManager; import com.google.maps.android.collections.PolygonManager; import com.google.maps.android.collections.PolylineManager; +import com.google.maps.android.data.Layer; import com.google.maps.android.data.Renderer; import org.xmlpull.v1.XmlPullParser; @@ -39,6 +39,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.HashMap; +import java.util.Locale; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -337,7 +338,7 @@ public KmlLayer(GoogleMap map, if (entryCount > maxKmzEntryCount) { throw new IOException("Zip bomb detected! Max number of entries exceeded: " + maxKmzEntryCount); } - if (parser == null && entry.getName().toLowerCase().endsWith(".kml")) { + if (parser == null && entry.getName().toLowerCase(Locale.ROOT).endsWith(".kml")) { parser = parseKml(countingStream); } else { Bitmap bitmap = BitmapFactory.decodeStream(countingStream); @@ -474,6 +475,7 @@ public Iterable getPlacemarks() { * * @return true if there is at least 1 container within the KmlLayer, false otherwise */ + @Override public boolean hasContainers() { return super.hasContainers(); } @@ -483,6 +485,7 @@ public boolean hasContainers() { * * @return iterable of KmlContainerInterface objects */ + @Override public Iterable getContainers() { return super.getContainers(); } @@ -492,6 +495,7 @@ public Iterable getContainers() { * * @return iterable of KmlGroundOverlay objects */ + @Override public Iterable getGroundOverlays() { return super.getGroundOverlays(); } diff --git a/library/src/main/java/com/google/maps/android/data/kml/KmlRenderer.java b/library/src/main/java/com/google/maps/android/data/kml/KmlRenderer.java index e63667a3c..4180d0799 100644 --- a/library/src/main/java/com/google/maps/android/data/kml/KmlRenderer.java +++ b/library/src/main/java/com/google/maps/android/data/kml/KmlRenderer.java @@ -204,6 +204,7 @@ public void addLayerToMap() { * * @param map map to place placemark, container, style and ground overlays on */ + @Override public void setMap(GoogleMap map) { removeLayerFromMap(); super.setMap(map); @@ -499,6 +500,7 @@ private void downloadGroundOverlays() { private void addGroundOverlayToMap(String groundOverlayUrl, HashMap groundOverlays, boolean containerVisibility) { BitmapDescriptor groundOverlayBitmap = getCachedGroundOverlayImage(groundOverlayUrl); + HashMap groundOverlaysToUpdate = new HashMap<>(); for (KmlGroundOverlay kmlGroundOverlay : groundOverlays.keySet()) { if (kmlGroundOverlay.getImageUrl().equals(groundOverlayUrl)) { GroundOverlayOptions groundOverlayOptions = kmlGroundOverlay.getGroundOverlayOptions() @@ -507,9 +509,10 @@ private void addGroundOverlayToMap(String groundOverlayUrl, if (!containerVisibility) { mapGroundOverlay.setVisible(false); } - groundOverlays.put(kmlGroundOverlay, mapGroundOverlay); + groundOverlaysToUpdate.put(kmlGroundOverlay, mapGroundOverlay); } } + groundOverlays.putAll(groundOverlaysToUpdate); } /**