From 86433dfd849b964d3f503a73d24a7bbf5d73f2e8 Mon Sep 17 00:00:00 2001 From: Tobrun Date: Thu, 20 Apr 2017 16:18:35 +0200 Subject: [PATCH] Harden telemetry event dispatch (#8767) * [android] - harden telemetry event dispatch * fixup --- platform/android/CHANGELOG.md | 1 + .../mapboxsdk/maps/MapGestureDetector.java | 32 ++++++------- .../com/mapbox/mapboxsdk/maps/MapView.java | 3 +- .../mapboxsdk/maps/MapboxEventWrapper.java | 48 +++++++++++++++++++ 4 files changed, 66 insertions(+), 18 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxEventWrapper.java diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index e94303fb1..bcf16bb62 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -19,6 +19,7 @@ Mapbox welcomes participation and contributions from everyone. If you'd like to * Custom location source [#8710](https://github.com/mapbox/mapbox-gl-native/pull/8710) * Expose source layer identifier [#8709](https://github.com/mapbox/mapbox-gl-native/pull/8709). * Ensure surface is created after display and context [#8759](https://github.com/mapbox/mapbox-gl-native/pull/8759) +* Harden telemetry event dispatch [#8767](https://github.com/mapbox/mapbox-gl-native/pull/8767) ## 5.0.2 - April 3, 2017 diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java index 85f6dc7e0..dca833bbf 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java @@ -153,9 +153,9 @@ final class MapGestureDetector { && uiSettings.isZoomGesturesEnabled(); if (twoTap) { // Confirmed 2nd Finger Down - MapboxTelemetry.getInstance().pushEvent(MapboxEvent.buildMapClickEvent( + MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent( getLocationFromGesture(event.getX(), event.getY()), - MapboxEvent.GESTURE_TWO_FINGER_SINGLETAP, transform.getZoom())); + MapboxEvent.GESTURE_TWO_FINGER_SINGLETAP, transform)); } break; @@ -184,8 +184,8 @@ final class MapGestureDetector { // Scroll / Pan Has Stopped if (scrollInProgress) { - MapboxTelemetry.getInstance().pushEvent(MapboxEvent.buildMapDragEndEvent( - getLocationFromGesture(event.getX(), event.getY()), transform.getZoom())); + MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapDragEndEvent( + getLocationFromGesture(event.getX(), event.getY()), transform)); scrollInProgress = false; } @@ -284,9 +284,9 @@ final class MapGestureDetector { break; } - MapboxTelemetry.getInstance().pushEvent(MapboxEvent.buildMapClickEvent( + MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent( getLocationFromGesture(e.getX(), e.getY()), - MapboxEvent.GESTURE_DOUBLETAP, transform.getZoom())); + MapboxEvent.GESTURE_DOUBLETAP, transform)); return true; } @@ -315,9 +315,9 @@ final class MapGestureDetector { } } - MapboxTelemetry.getInstance().pushEvent(MapboxEvent.buildMapClickEvent( + MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent( getLocationFromGesture(motionEvent.getX(), motionEvent.getY()), - MapboxEvent.GESTURE_SINGLETAP, transform.getZoom())); + MapboxEvent.GESTURE_SINGLETAP, transform)); return true; } @@ -377,9 +377,9 @@ final class MapGestureDetector { public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (!scrollInProgress) { scrollInProgress = true; - MapboxTelemetry.getInstance().pushEvent(MapboxEvent.buildMapClickEvent( + MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent( getLocationFromGesture(e1.getX(), e1.getY()), - MapboxEvent.GESTURE_PAN_START, transform.getZoom())); + MapboxEvent.GESTURE_PAN_START, transform)); } if (!trackingSettings.isScrollGestureCurrentlyEnabled()) { return false; @@ -421,9 +421,9 @@ final class MapGestureDetector { scaleGestureOccurred = true; beginTime = detector.getEventTime(); - MapboxTelemetry.getInstance().pushEvent(MapboxEvent.buildMapClickEvent( + MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent( getLocationFromGesture(detector.getFocusX(), detector.getFocusY()), - MapboxEvent.GESTURE_PINCH_START, transform.getZoom())); + MapboxEvent.GESTURE_PINCH_START, transform)); return true; } @@ -513,9 +513,9 @@ final class MapGestureDetector { } beginTime = detector.getEventTime(); - MapboxTelemetry.getInstance().pushEvent(MapboxEvent.buildMapClickEvent( + MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent( getLocationFromGesture(detector.getFocusX(), detector.getFocusY()), - MapboxEvent.GESTURE_ROTATION_START, transform.getZoom())); + MapboxEvent.GESTURE_ROTATION_START, transform)); return true; } @@ -594,9 +594,9 @@ final class MapGestureDetector { } beginTime = detector.getEventTime(); - MapboxTelemetry.getInstance().pushEvent(MapboxEvent.buildMapClickEvent( + MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent( getLocationFromGesture(detector.getFocusX(), detector.getFocusY()), - MapboxEvent.GESTURE_PITCH_START, transform.getZoom())); + MapboxEvent.GESTURE_PITCH_START, transform)); return true; } 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 fc7042f38..872802292 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 @@ -36,7 +36,6 @@ import com.mapbox.mapboxsdk.maps.widgets.CompassView; import com.mapbox.mapboxsdk.maps.widgets.MyLocationView; import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings; import com.mapbox.mapboxsdk.net.ConnectivityReceiver; -import com.mapbox.services.android.telemetry.MapboxEvent; import com.mapbox.services.android.telemetry.MapboxTelemetry; import java.lang.annotation.Retention; @@ -188,7 +187,7 @@ public class MapView extends FrameLayout { @UiThread public void onCreate(@Nullable Bundle savedInstanceState) { if (savedInstanceState == null) { - MapboxTelemetry.getInstance().pushEvent(MapboxEvent.buildMapLoadEvent()); + MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapLoadEvent()); } else if (savedInstanceState.getBoolean(MapboxConstants.STATE_HAS_SAVED_STATE)) { mapboxMap.onRestoreInstanceState(savedInstanceState); } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxEventWrapper.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxEventWrapper.java new file mode 100644 index 000000000..97734de49 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxEventWrapper.java @@ -0,0 +1,48 @@ +package com.mapbox.mapboxsdk.maps; + +import android.location.Location; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import com.mapbox.services.android.telemetry.MapboxEvent; + +import java.util.Hashtable; + +/** + * Wrapper class for MapboxEvent + *

+ * Provides facility methods to use Transform and handle the case that the zoom, required for a telemetry event, + * isn't available yet. + *

+ */ +class MapboxEventWrapper { + + @Nullable + static Hashtable buildMapClickEvent( + @NonNull Location location, @NonNull String gestureId, Transform transform) { + try { + return MapboxEvent.buildMapClickEvent(location, gestureId, transform.getZoom()); + } catch (NullPointerException exception) { + // Map/Transform is not ready yet #8650 + // returning null is valid, event is ignored. + return null; + } + } + + @Nullable + static Hashtable buildMapDragEndEvent( + @NonNull Location location, Transform transform) { + try { + return MapboxEvent.buildMapDragEndEvent(location, transform.getZoom()); + } catch (NullPointerException exception) { + // Map/Transform is not ready yet #8650 + // returning null is valid, event is ignored. + return null; + } + } + + @Nullable + static Hashtable buildMapLoadEvent() { + return MapboxEvent.buildMapLoadEvent(); + } +}