summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/IconManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/IconManager.java')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/IconManager.java52
1 files changed, 16 insertions, 36 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/IconManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/IconManager.java
index affbf48267..18eecfd9c3 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/IconManager.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/IconManager.java
@@ -1,17 +1,16 @@
package com.mapbox.mapboxsdk.maps;
import android.graphics.Bitmap;
-import android.os.Build;
import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.annotations.Icon;
import com.mapbox.mapboxsdk.annotations.IconFactory;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.annotations.MarkerView;
+import com.mapbox.mapboxsdk.exceptions.IconBitmapChangedException;
-import java.util.HashMap;
+import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
/**
* Responsible for managing icons added to the Map.
@@ -26,14 +25,15 @@ import java.util.Map;
*/
class IconManager {
- private final Map<Icon, Integer> iconMap = new HashMap<>();
-
private NativeMapView nativeMapView;
+ private List<Icon> icons;
+
private int highestIconWidth;
private int highestIconHeight;
IconManager(NativeMapView nativeMapView) {
this.nativeMapView = nativeMapView;
+ this.icons = new ArrayList<>();
// load transparent icon for MarkerView to trace actual markers, see #6352
loadIcon(IconFactory.recreate(IconFactory.ICON_MARKERVIEW_ID, IconFactory.ICON_MARKERVIEW_BITMAP));
}
@@ -83,13 +83,13 @@ class IconManager {
}
private void addIcon(Icon icon, boolean addIconToMap) {
- if (!iconMap.keySet().contains(icon)) {
- iconMap.put(icon, 1);
+ if (!icons.contains(icon)) {
+ icons.add(icon);
if (addIconToMap) {
loadIcon(icon);
}
} else {
- iconMap.put(icon, iconMap.get(icon) + 1);
+ validateIconChanged(icon);
}
}
@@ -121,11 +121,18 @@ class IconManager {
}
void reloadIcons() {
- for (Icon icon : iconMap.keySet()) {
+ for (Icon icon : icons) {
loadIcon(icon);
}
}
+ private void validateIconChanged(Icon icon) {
+ Icon oldIcon = icons.get(icons.indexOf(icon));
+ if (!oldIcon.getBitmap().sameAs(icon.getBitmap())) {
+ throw new IconBitmapChangedException();
+ }
+ }
+
void ensureIconLoaded(Marker marker, MapboxMap mapboxMap) {
Icon icon = marker.getIcon();
if (icon == null) {
@@ -142,31 +149,4 @@ class IconManager {
marker.setTopOffsetPixels(getTopOffsetPixelsForIcon(icon));
}
}
-
- public void iconCleanup(Icon icon) {
- int refCounter = iconMap.get(icon) - 1;
- if (refCounter == 0) {
- remove(icon);
- } else {
- updateIconRefCounter(icon, refCounter);
- }
- }
-
- private void remove(Icon icon) {
- nativeMapView.removeAnnotationIcon(icon.getId());
- iconMap.remove(icon);
- if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- recycleBitmap(icon.getBitmap());
- }
- }
-
- private void updateIconRefCounter(Icon icon, int refCounter) {
- iconMap.put(icon, refCounter);
- }
-
- private void recycleBitmap(Bitmap bitmap) {
- if (!bitmap.isRecycled()) {
- bitmap.recycle();
- }
- }
}