summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java34
1 files changed, 33 insertions, 1 deletions
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 ea0665d372..96018bb4c0 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
@@ -1,5 +1,7 @@
package com.mapbox.mapboxsdk.maps;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.MutableLiveData;
import android.arch.lifecycle.ViewModel;
import android.content.Context;
@@ -17,6 +19,12 @@ import com.mapbox.mapboxsdk.R;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.utils.ColorUtils;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import timber.log.Timber;
+
/**
* Settings for the user interface of a MapboxMap. To obtain this interface, call getUiSettings().
*/
@@ -997,8 +1005,32 @@ public final class UiSettings extends ViewModel {
* Method used to cleanup resources that might leak during configuration change,
* like deprecated {@link #setAttributionDialogManager(AttributionDialogManager)} or {@link #getWidth()}.
*/
- void onMapDestroy() {
+ void onMapDestroy(@NonNull Context context) {
setAttributionDialogManager(null);
projection = null;
+ clearObservers((LifecycleOwner) context);
+ }
+
+ private void clearObservers(@NonNull LifecycleOwner lifecycleOwner) {
+ try {
+ Field[] fields = this.getClass().getDeclaredFields();
+ Method method = LiveData.class.getDeclaredMethod("removeObservers", LifecycleOwner.class);
+ for (Field field : fields) {
+ Class type = field.getType();
+ if (type == MutableLiveData.class) {
+ Object value = field.get(this);
+ method.invoke(value, lifecycleOwner);
+ }
+ }
+ } catch (NoSuchMethodException ex) {
+ Timber.e("Unable to clear %s observers, %s.", this.getClass(), ex.getClass().getSimpleName());
+ ex.printStackTrace();
+ } catch (IllegalAccessException ex) {
+ Timber.e("Unable to clear %s observers, %s.", this.getClass(), ex.getClass().getSimpleName());
+ ex.printStackTrace();
+ } catch (InvocationTargetException ex) {
+ Timber.e("Unable to clear %s observers, %s.", this.getClass(), ex.getClass().getSimpleName());
+ ex.printStackTrace();
+ }
}
}