diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java index 9c79ffcbd..a7e30ed39 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java @@ -53,22 +53,35 @@ public class InfoWindow { mIsVisible = false; mView = new WeakReference<>(view); - // default behavior: close it when clicking on the tooltip: - view.setOnTouchListener(new View.OnTouchListener() { + view.setOnClickListener(new View.OnClickListener() { @Override - public boolean onTouch(View v, MotionEvent e) { - if (e.getAction() == MotionEvent.ACTION_UP) { + public void onClick(View v) { + MapboxMap mapboxMap = mMapboxMap.get(); + if (mapboxMap != null) { + MapboxMap.OnInfoWindowClickListener onInfoWindowClickListener = mapboxMap.getOnInfoWindowClickListener(); boolean handledDefaultClick = false; - MapboxMap.OnInfoWindowClickListener onInfoWindowClickListener = - mMapboxMap.get().getOnInfoWindowClickListener(); if (onInfoWindowClickListener != null) { handledDefaultClick = onInfoWindowClickListener.onMarkerClick(getBoundMarker()); } if (!handledDefaultClick) { + // default behavior: close it when clicking on the tooltip: close(); } } + } + }); + + view.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + MapboxMap mapboxMap = mMapboxMap.get(); + if (mapboxMap != null) { + MapboxMap.OnInfoWindowLongClickListener listener = mapboxMap.getOnInfoWindowLongClickListener(); + if (listener != null) { + listener.onInfoWindowLongClick(getBoundMarker()); + } + } return true; } }); 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 757a9bc3d..a86b2b97c 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 @@ -54,6 +54,7 @@ public class MapboxMap { private MapboxMap.OnMapLongClickListener mOnMapLongClickListener; private MapboxMap.OnMarkerClickListener mOnMarkerClickListener; private MapboxMap.OnInfoWindowClickListener mOnInfoWindowClickListener; + private MapboxMap.OnInfoWindowLongClickListener mOnInfoWindowLongClickListener; private MapboxMap.OnFlingListener mOnFlingListener; private MapboxMap.OnScrollListener mOnScrollListener; private MapboxMap.OnMyLocationTrackingModeChangeListener mOnMyLocationTrackingModeChangeListener; @@ -849,6 +850,25 @@ public class MapboxMap { return mOnInfoWindowClickListener; } + /** + * Sets a callback that's invoked when a marker's info window is long pressed. + * + * @param listener The callback that's invoked when a marker's info window is long pressed. To unset the callback, use null. + */ + @UiThread + public void setOnInfoWindowLongClickListener(@Nullable OnInfoWindowLongClickListener listener) { + mOnInfoWindowLongClickListener = listener; + } + + /** + * Return the InfoWindow long click listener + * + * @return Current active InfoWindow long Click Listener + */ + public OnInfoWindowLongClickListener getOnInfoWindowLongClickListener() { + return mOnInfoWindowLongClickListener; + } + // // User location // @@ -1133,6 +1153,21 @@ public class MapboxMap { boolean onMarkerClick(@NonNull Marker marker); } + /** + * Callback interface for when the user long presses on a marker's info window. + * + * @see MapboxMap#setOnInfoWindowClickListener(OnInfoWindowClickListener) + */ + public interface OnInfoWindowLongClickListener { + + /** + * Called when the user makes a long-press gesture on the marker's info window. + * + * @param marker The marker were the info window is attached to + */ + void onInfoWindowLongClick(Marker marker); + } + /** * Interface definition for a callback to be invoked when an info window will be shown. * diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowActivity.java index e34bff9ee..7f05a6a5c 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowActivity.java @@ -6,6 +6,7 @@ import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.MenuItem; +import android.widget.Toast; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.annotations.Marker; @@ -46,19 +47,15 @@ public class InfoWindowActivity extends AppCompatActivity { mapboxMap.addMarker(new MarkerOptions() .title("Intersection") .snippet("H St NW with 15th St NW") - .icon(IconFactory.getInstance(InfoWindowActivity.this) - .fromAsset("london-underground-24.png")) .position(new LatLng(38.9002073, -77.03364419))); mapboxMap.addMarker(new MarkerOptions() .title("White House") .snippet("The official residence and principal workplace of the President of the United States, located at 1600 Pennsylvania Avenue NW in Washington, D.C. It has been the residence of every U.S. president since John Adams in 1800.") - .icon(IconFactory.getInstance(InfoWindowActivity.this).fromAsset("town-hall-24.png")) .position(new LatLng(38.897705003219784, -77.03655168667463))); mapboxMap.addMarker(new MarkerOptions().title("Intersection") .snippet("E St NW with 17th St NW") - .icon(IconFactory.getInstance(InfoWindowActivity.this).fromAsset("commercial-24.png")) .position(new LatLng(38.8954236, -77.0394623))); final DecimalFormat formatter = new DecimalFormat("#.#####"); @@ -78,6 +75,25 @@ public class InfoWindowActivity extends AppCompatActivity { .position(point)); } }); + + + mapboxMap.setOnInfoWindowClickListener(new MapboxMap.OnInfoWindowClickListener() { + @Override + public boolean onMarkerClick(@NonNull Marker marker) { + Toast.makeText(getApplicationContext(), "OnClick: " + marker.getTitle(), Toast.LENGTH_LONG).show(); + // return false to close the info window + // return true to leave the info window open + return false; + } + }); + + mapboxMap.setOnInfoWindowLongClickListener(new MapboxMap.OnInfoWindowLongClickListener() { + @Override + public void onInfoWindowLongClick(Marker marker) { + Toast.makeText(getApplicationContext(),"OnLongClick: "+marker.getTitle(),Toast.LENGTH_LONG).show(); + } + }); + } }); }