From 23639f71b1deec968e9cd6555d68b73475c93062 Mon Sep 17 00:00:00 2001 From: Tobrun Van Nuland Date: Wed, 19 Apr 2017 11:53:34 +0200 Subject: [PATCH 1/2] [android] - harden telemetry event dispatch --- .../mapboxsdk/maps/MapGestureDetector.java | 32 ++++++------- .../com/mapbox/mapboxsdk/maps/MapView.java | 3 +- .../mapboxsdk/maps/MapboxEventWrapper.java | 48 +++++++++++++++++++ .../com/mapbox/mapboxsdk/maps/Transform.java | 3 ++ 4 files changed, 68 insertions(+), 18 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxEventWrapper.java 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 85f6dc7e0ec..dca833bbf48 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 @@ boolean onTouchEvent(@NonNull MotionEvent event) { && 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 @@ boolean onTouchEvent(@NonNull MotionEvent event) { // 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 @@ public boolean onDoubleTapEvent(MotionEvent e) { 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 @@ public boolean onSingleTapConfirmed(MotionEvent motionEvent) { } } - 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 @@ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float ve 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 @@ public boolean onScaleBegin(ScaleGestureDetector detector) { 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 @@ public boolean onRotateBegin(RotateGestureDetector detector) { } 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 @@ public boolean onShoveBegin(ShoveGestureDetector detector) { } 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 fc7042f3862..872802292c4 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.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 @@ private void initialise(@NonNull final Context context, @NonNull final MapboxMap @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 00000000000..97734de4933 --- /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(); + } +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java index 6bccf6204bd..7b9da3dc662 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java @@ -168,6 +168,9 @@ void setOnCameraChangeListener(@Nullable MapboxMap.OnCameraChangeListener listen // Zoom in or out double getZoom() { + if (cameraPosition == null) { + invalidateCameraPosition(); + } return cameraPosition.zoom; } From 1d41a0fab23587f1ebbbcb8d4cfd662188ce552b Mon Sep 17 00:00:00 2001 From: Tobrun Van Nuland Date: Wed, 19 Apr 2017 12:06:00 +0200 Subject: [PATCH 2/2] fixup --- platform/android/CHANGELOG.md | 1 + .../src/main/java/com/mapbox/mapboxsdk/maps/Transform.java | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index 8dcdcb296d3..b60ae71938d 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -18,6 +18,7 @@ Mapbox welcomes participation and contributions from everyone. If you'd like to * Polygon holes [#8557](https://github.com/mapbox/mapbox-gl-native/pull/8557) and [#8722](https://github.com/mapbox/mapbox-gl-native/pull/8722) * Custom location source [#8710](https://github.com/mapbox/mapbox-gl-native/pull/8710) * 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/Transform.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java index 7b9da3dc662..6bccf6204bd 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java @@ -168,9 +168,6 @@ void setOnCameraChangeListener(@Nullable MapboxMap.OnCameraChangeListener listen // Zoom in or out double getZoom() { - if (cameraPosition == null) { - invalidateCameraPosition(); - } return cameraPosition.zoom; }