diff options
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.java | 52 |
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(); - } - } } |