From 44363d4826638b1c3b5c6ce9e1eda178cf71f32b Mon Sep 17 00:00:00 2001 From: paczos Date: Wed, 13 Dec 2017 17:54:20 +0100 Subject: [android] added map touch listeners api based on lists --- .../mapbox/mapboxsdk/maps/MapGestureDetector.java | 58 ++++++++++ .../java/com/mapbox/mapboxsdk/maps/MapView.java | 48 +++++++- .../java/com/mapbox/mapboxsdk/maps/MapboxMap.java | 126 +++++++++++++++++++-- 3 files changed, 220 insertions(+), 12 deletions(-) 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 9d7d980ae3..2c95c09485 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 @@ -26,6 +26,8 @@ import com.mapbox.services.android.telemetry.MapboxTelemetry; import com.mapbox.services.android.telemetry.utils.MathUtils; import com.mapbox.services.android.telemetry.utils.TelemetryUtils; +import java.util.concurrent.CopyOnWriteArrayList; + import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE; /** @@ -53,6 +55,11 @@ final class MapGestureDetector { private MapboxMap.OnFlingListener onFlingListener; private MapboxMap.OnScrollListener onScrollListener; + private final CopyOnWriteArrayList onMapClickListenerList = new CopyOnWriteArrayList<>(); + private final CopyOnWriteArrayList onMapLongClickListenerList = new CopyOnWriteArrayList<>(); + private final CopyOnWriteArrayList onFlingListenerList = new CopyOnWriteArrayList<>(); + private final CopyOnWriteArrayList onScrollListenerList = new CopyOnWriteArrayList<>(); + private PointF focalPoint; private boolean twoTap; @@ -359,6 +366,10 @@ final class MapGestureDetector { if (onMapClickListener != null) { onMapClickListener.onMapClick(projection.fromScreenLocation(tapPoint)); } + + for (MapboxMap.OnMapClickListener listener : onMapClickListenerList) { + listener.onMapClick(projection.fromScreenLocation(tapPoint)); + } } MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent( @@ -374,6 +385,13 @@ final class MapGestureDetector { onMapLongClickListener.onMapLongClick( projection.fromScreenLocation(new PointF(motionEvent.getX(), motionEvent.getY()))); } + + if (!quickZoom) { + for (MapboxMap.OnMapLongClickListener listener : onMapLongClickListenerList) { + listener.onMapLongClick( + projection.fromScreenLocation(new PointF(motionEvent.getX(), motionEvent.getY()))); + } + } } @Override @@ -415,6 +433,10 @@ final class MapGestureDetector { if (onFlingListener != null) { onFlingListener.onFling(); } + + for (MapboxMap.OnFlingListener listener : onFlingListenerList) { + listener.onFling(); + } return true; } @@ -452,6 +474,10 @@ final class MapGestureDetector { if (onScrollListener != null) { onScrollListener.onScroll(); } + + for (MapboxMap.OnScrollListener listener : onScrollListenerList) { + listener.onScroll(); + } return true; } } @@ -844,4 +870,36 @@ final class MapGestureDetector { void setOnScrollListener(MapboxMap.OnScrollListener onScrollListener) { this.onScrollListener = onScrollListener; } + + void addOnMapClickListener(MapboxMap.OnMapClickListener onMapClickListener) { + onMapClickListenerList.add(onMapClickListener); + } + + void removeOnMapClickListener(MapboxMap.OnMapClickListener onMapClickListener) { + onMapClickListenerList.remove(onMapClickListener); + } + + void addOnMapLongClickListener(MapboxMap.OnMapLongClickListener onMapLongClickListener) { + onMapLongClickListenerList.add(onMapLongClickListener); + } + + void removeOnMapLongClickListener(MapboxMap.OnMapLongClickListener onMapLongClickListener) { + onMapLongClickListenerList.remove(onMapLongClickListener); + } + + void addOnFlingListener(MapboxMap.OnFlingListener onFlingListener) { + onFlingListenerList.add(onFlingListener); + } + + void removeOnFlingListener(MapboxMap.OnFlingListener onFlingListener) { + onFlingListenerList.remove(onFlingListener); + } + + void addOnScrollListener(MapboxMap.OnScrollListener onScrollListener) { + onScrollListenerList.add(onScrollListener); + } + + void removeOnScrollListener(MapboxMap.OnScrollListener onScrollListener) { + onScrollListenerList.remove(onScrollListener); + } } 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 c9bfbeb80a..11ec6eaaac 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 @@ -908,24 +908,64 @@ public class MapView extends FrameLayout { private class RegisterTouchListener implements MapboxMap.OnRegisterTouchListener { @Override - public void onRegisterMapClickListener(MapboxMap.OnMapClickListener listener) { + public void onSetMapClickListener(MapboxMap.OnMapClickListener listener) { mapGestureDetector.setOnMapClickListener(listener); } @Override - public void onRegisterMapLongClickListener(MapboxMap.OnMapLongClickListener listener) { + public void onAddMapClickListener(MapboxMap.OnMapClickListener listener) { + mapGestureDetector.addOnMapClickListener(listener); + } + + @Override + public void onRemoveMapClickListener(MapboxMap.OnMapClickListener listener) { + mapGestureDetector.removeOnMapClickListener(listener); + } + + @Override + public void onSetMapLongClickListener(MapboxMap.OnMapLongClickListener listener) { mapGestureDetector.setOnMapLongClickListener(listener); } @Override - public void onRegisterScrollListener(MapboxMap.OnScrollListener listener) { + public void onAddMapLongClickListener(MapboxMap.OnMapLongClickListener listener) { + mapGestureDetector.addOnMapLongClickListener(listener); + } + + @Override + public void onRemoveMapLongClickListener(MapboxMap.OnMapLongClickListener listener) { + mapGestureDetector.removeOnMapLongClickListener(listener); + } + + @Override + public void onSetScrollListener(MapboxMap.OnScrollListener listener) { mapGestureDetector.setOnScrollListener(listener); } @Override - public void onRegisterFlingListener(MapboxMap.OnFlingListener listener) { + public void onAddScrollListener(MapboxMap.OnScrollListener listener) { + mapGestureDetector.addOnScrollListener(listener); + } + + @Override + public void onRemoveScrollListener(MapboxMap.OnScrollListener listener) { + mapGestureDetector.removeOnScrollListener(listener); + } + + @Override + public void onSetFlingListener(MapboxMap.OnFlingListener listener) { mapGestureDetector.setOnFlingListener(listener); } + + @Override + public void onAddFlingListener(MapboxMap.OnFlingListener listener) { + mapGestureDetector.addOnFlingListener(listener); + } + + @Override + public void onRemoveFlingListener(MapboxMap.OnFlingListener listener) { + mapGestureDetector.removeOnFlingListener(listener); + } } private static class MapZoomControllerListener implements ZoomButtonsController.OnZoomListener { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index 6bf8342efb..e6818ca436 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -1902,9 +1902,34 @@ public final class MapboxMap { * * @param listener The callback that's invoked when the map is scrolled. * To unset the callback, use null. + * + * @deprecated Use {@link #addOnScrollListener(OnScrollListener)} instead. */ + @Deprecated public void setOnScrollListener(@Nullable OnScrollListener listener) { - onRegisterTouchListener.onRegisterScrollListener(listener); + onRegisterTouchListener.onSetScrollListener(listener); + } + + /** + * Adds a callback that's invoked when the map is scrolled. + * + * @param listener The callback that's invoked when the map is scrolled. + * To unset the callback, use null. + * + */ + public void addOnScrollListener(@Nullable OnScrollListener listener) { + onRegisterTouchListener.onAddScrollListener(listener); + } + + /** + * Removes a callback that's invoked when the map is scrolled. + * + * @param listener The callback that's invoked when the map is scrolled. + * To unset the callback, use null. + * + */ + public void removeOnScrollListener(@Nullable OnScrollListener listener) { + onRegisterTouchListener.onRemoveScrollListener(listener); } /** @@ -1912,9 +1937,32 @@ public final class MapboxMap { * * @param listener The callback that's invoked when the map is flinged. * To unset the callback, use null. + * + * @deprecated Use {@link #addOnFlingListener(OnFlingListener)} instead. */ + @Deprecated public void setOnFlingListener(@Nullable OnFlingListener listener) { - onRegisterTouchListener.onRegisterFlingListener(listener); + onRegisterTouchListener.onSetFlingListener(listener); + } + + /** + * Adds a callback that's invoked when the map is flinged. + * + * @param listener The callback that's invoked when the map is flinged. + * To unset the callback, use null. + */ + public void addOnFlingListener(@Nullable OnFlingListener listener) { + onRegisterTouchListener.onAddFlingListener(listener); + } + + /** + * Removes a callback that's invoked when the map is flinged. + * + * @param listener The callback that's invoked when the map is flinged. + * To unset the callback, use null. + */ + public void removeOnFlingListener(@Nullable OnFlingListener listener) { + onRegisterTouchListener.onRemoveFlingListener(listener); } /** @@ -1922,9 +1970,32 @@ public final class MapboxMap { * * @param listener The callback that's invoked when the user clicks on the map view. * To unset the callback, use null. + * + * @deprecated Use {@link #addOnMapClickListener(OnMapClickListener)} instead. */ + @Deprecated public void setOnMapClickListener(@Nullable OnMapClickListener listener) { - onRegisterTouchListener.onRegisterMapClickListener(listener); + onRegisterTouchListener.onSetMapClickListener(listener); + } + + /** + * Adds a callback that's invoked when the user clicks on the map view. + * + * @param listener The callback that's invoked when the user clicks on the map view. + * To unset the callback, use null. + */ + public void addOnMapClickListener(@Nullable OnMapClickListener listener) { + onRegisterTouchListener.onAddMapClickListener(listener); + } + + /** + * Removes a callback that's invoked when the user clicks on the map view. + * + * @param listener The callback that's invoked when the user clicks on the map view. + * To unset the callback, use null. + */ + public void removeOnMapClickListener(@Nullable OnMapClickListener listener) { + onRegisterTouchListener.onRemoveMapClickListener(listener); } /** @@ -1932,9 +2003,32 @@ public final class MapboxMap { * * @param listener The callback that's invoked when the user long clicks on the map view. * To unset the callback, use null. + * + * @deprecated Use {@link #addOnMapLongClickListener(OnMapLongClickListener)} instead. */ + @Deprecated public void setOnMapLongClickListener(@Nullable OnMapLongClickListener listener) { - onRegisterTouchListener.onRegisterMapLongClickListener(listener); + onRegisterTouchListener.onSetMapLongClickListener(listener); + } + + /** + * Adds a callback that's invoked when the user long clicks on the map view. + * + * @param listener The callback that's invoked when the user long clicks on the map view. + * To unset the callback, use null. + */ + public void addOnMapLongClickListener(@Nullable OnMapLongClickListener listener) { + onRegisterTouchListener.onAddMapLongClickListener(listener); + } + + /** + * Removes a callback that's invoked when the user long clicks on the map view. + * + * @param listener The callback that's invoked when the user long clicks on the map view. + * To unset the callback, use null. + */ + public void removeOnMapLongClickListener(@Nullable OnMapLongClickListener listener) { + onRegisterTouchListener.onRemoveMapLongClickListener(listener); } /** @@ -2304,13 +2398,29 @@ public final class MapboxMap { * related to touch and click events. */ interface OnRegisterTouchListener { - void onRegisterMapClickListener(OnMapClickListener listener); + void onSetMapClickListener(OnMapClickListener listener); + + void onAddMapClickListener(OnMapClickListener listener); + + void onRemoveMapClickListener(OnMapClickListener listener); + + void onSetMapLongClickListener(OnMapLongClickListener listener); + + void onAddMapLongClickListener(OnMapLongClickListener listener); + + void onRemoveMapLongClickListener(OnMapLongClickListener listener); + + void onSetScrollListener(OnScrollListener listener); + + void onAddScrollListener(OnScrollListener listener); + + void onRemoveScrollListener(OnScrollListener listener); - void onRegisterMapLongClickListener(OnMapLongClickListener listener); + void onSetFlingListener(OnFlingListener listener); - void onRegisterScrollListener(OnScrollListener listener); + void onAddFlingListener(OnFlingListener listener); - void onRegisterFlingListener(OnFlingListener listener); + void onRemoveFlingListener(OnFlingListener listener); } /** -- cgit v1.2.1