From 847c293a3e8eb5d16843a5b9daead2680e557e3a Mon Sep 17 00:00:00 2001 From: tobrun Date: Fri, 4 Jan 2019 19:57:15 +0100 Subject: [android] - avoid leaking dialog when context is being stopped --- .../mapboxsdk/maps/AttributionDialogManager.java | 9 ++++++++- .../main/java/com/mapbox/mapboxsdk/maps/MapView.java | 19 +++++++++++++++---- .../java/com/mapbox/mapboxsdk/maps/UiSettings.java | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AttributionDialogManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AttributionDialogManager.java index 8e436954c8..15ddfe644e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AttributionDialogManager.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AttributionDialogManager.java @@ -45,6 +45,7 @@ public class AttributionDialogManager implements View.OnClickListener, DialogInt @NonNull private final MapboxMap mapboxMap; private Set attributionSet; + private AlertDialog dialog; public AttributionDialogManager(@NonNull Context context, @NonNull MapboxMap mapboxMap) { this.context = context; @@ -72,7 +73,7 @@ public class AttributionDialogManager implements View.OnClickListener, DialogInt AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(R.string.mapbox_attributionsDialogTitle); builder.setAdapter(new ArrayAdapter<>(context, R.layout.mapbox_attribution_list_item, attributionTitles), this); - builder.show(); + dialog = builder.show(); } private String[] getAttributionTitles() { @@ -93,6 +94,12 @@ public class AttributionDialogManager implements View.OnClickListener, DialogInt } } + public void onStop() { + if (dialog != null && dialog.isShowing()) { + dialog.dismiss(); + } + } + private boolean isLatestEntry(int attributionKeyIndex) { return attributionKeyIndex == getAttributionTitles().length - 1; } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index 896d67483d..f5a31d2c6a 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -69,6 +69,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { private NativeMapView nativeMapView; @Nullable private MapboxMap mapboxMap; + private AttributionClickListener attributionClickListener; private MapboxMapOptions mapboxMapOptions; private MapRenderer mapRenderer; private boolean destroyed; @@ -180,7 +181,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { mapboxMap.injectLocationComponent(new LocationComponent(mapboxMap)); // inject widgets with MapboxMap - attrView.setOnClickListener(new AttributionClickListener(context, mapboxMap)); + attrView.setOnClickListener(attributionClickListener = new AttributionClickListener(context, mapboxMap)); // Ensure this view is interactable setClickable(true); @@ -379,6 +380,8 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { */ @UiThread public void onStop() { + attributionClickListener.onStop(); + if (mapboxMap != null) { // map was destroyed before it was started mapGestureDetector.cancelAnimators(); @@ -731,7 +734,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { /** - /** + /** * Set a callback that's invoked when the style has finished loading. * * @param listener The callback that's invoked when the style has finished loading @@ -1219,11 +1222,19 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { @Override public void onClick(View v) { + getDialogManager().onClick(v); + } + + public void onStop() { + getDialogManager().onStop(); + } + + private AttributionDialogManager getDialogManager() { AttributionDialogManager customDialogManager = uiSettings.getAttributionDialogManager(); if (customDialogManager != null) { - uiSettings.getAttributionDialogManager().onClick(v); + return uiSettings.getAttributionDialogManager(); } else { - defaultDialogManager.onClick(v); + return defaultDialogManager; } } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java index 4caccec80d..ab29b026f1 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java @@ -538,7 +538,7 @@ public final class UiSettings { * * @return the active manager class used for showing attribution */ - @NonNull + @Nullable public AttributionDialogManager getAttributionDialogManager() { return attributionDialogManager; } -- cgit v1.2.1