diff --git a/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java b/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java index 83492a5..e782fe8 100644 --- a/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java +++ b/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java @@ -48,6 +48,7 @@ public class ClusterManager implements GoogleMap.OnCamera * * @param the type of an item managed by {@link ClusterManager}. */ + @Deprecated public interface Callbacks { /** * Called when a marker representing a cluster has been clicked. @@ -70,6 +71,40 @@ public interface Callbacks { boolean onClusterItemClick(@NonNull T clusterItem); } + /** + * Defines a signature for a method that is called when a cluster is clicked. + * + * @param the type of an item managed by {@link ClusterManager}. + */ + public interface ClusterClickCallback { + /** + * Called when a marker representing a cluster has been clicked. + * + * @param cluster the cluster that has been clicked + * @return true if the listener has consumed the event (i.e., the default behavior should not occur); + * false otherwise (i.e., the default behavior should occur). The default behavior is for the camera + * to move to the marker and an info window to appear. + */ + boolean onClick(@NonNull Cluster cluster); + } + + /** + * Defines a signature for a method that is called when a cluster item is clicked. + * + * @param the type of an item managed by {@link ClusterManager}. + */ + public interface ClusterItemClickCallback { + /** + * Called when a marker representing a cluster item has been clicked. + * + * @param clusterItem the cluster item that has been clicked + * @return true if the listener has consumed the event (i.e., the default behavior should not occur); + * false otherwise (i.e., the default behavior should occur). The default behavior is for the camera + * to move to the marker and an info window to appear. + */ + boolean onClick(@NonNull T clusterItem); + } + /** * Creates a new cluster manager using the default icon generator. * To customize marker icons, set a custom icon generator using @@ -100,8 +135,45 @@ public void setIconGenerator(@NonNull IconGenerator iconGenerator) { * @param callbacks the callback that's invoked when a cluster or an individual item is clicked. * To unset the callback, use null. */ - public void setCallbacks(@Nullable Callbacks callbacks) { - mRenderer.setCallbacks(callbacks); + @Deprecated + public void setCallbacks(@Nullable final Callbacks callbacks) { + if (callbacks == null) { + mRenderer.setClusterClickCallback(null); + mRenderer.setClusterItemClickCallback(null); + } else { + mRenderer.setClusterClickCallback(new ClusterClickCallback() { + @Override + public boolean onClick(@NonNull Cluster cluster) { + return callbacks.onClusterClick(cluster); + } + }); + mRenderer.setClusterItemClickCallback(new ClusterItemClickCallback() { + @Override + public boolean onClick(@NonNull T clusterItem) { + return callbacks.onClusterItemClick(clusterItem); + } + }); + } + } + + /** + * Sets a callback that's invoked when a cluster is clicked. + * + * @param callback the callback that's invoked when a cluster is clicked. + * To unset the callback, use null. + */ + public void setClusterClickCallback(@Nullable ClusterClickCallback callback) { + mRenderer.setClusterClickCallback(callback); + } + + /** + * Sets a callback that's invoked when a cluster item is clicked. + * + * @param callback the callback that's invoked when an individual item is clicked. + * To unset the callback, use null. + */ + public void setClusterItemClickCallback(@Nullable ClusterItemClickCallback callback) { + mRenderer.setClusterItemClickCallback(callback); } /** diff --git a/library/src/main/java/net/sharewire/googlemapsclustering/ClusterRenderer.java b/library/src/main/java/net/sharewire/googlemapsclustering/ClusterRenderer.java index b7876d3..4372f9d 100644 --- a/library/src/main/java/net/sharewire/googlemapsclustering/ClusterRenderer.java +++ b/library/src/main/java/net/sharewire/googlemapsclustering/ClusterRenderer.java @@ -36,7 +36,8 @@ class ClusterRenderer implements GoogleMap.OnMarkerClickL private IconGenerator mIconGenerator; - private ClusterManager.Callbacks mCallbacks; + private ClusterManager.ClusterClickCallback mClusterClickCallback; + private ClusterManager.ClusterItemClickCallback mClusterItemClickCallback; ClusterRenderer(@NonNull Context context, @NonNull GoogleMap googleMap) { mGoogleMap = googleMap; @@ -53,20 +54,22 @@ public boolean onMarkerClick(Marker marker) { //noinspection ConstantConditions List clusterItems = cluster.getItems(); - if (mCallbacks != null) { - if (clusterItems.size() > 1) { - return mCallbacks.onClusterClick(cluster); - } else { - return mCallbacks.onClusterItemClick(clusterItems.get(0)); - } + if (clusterItems.size() > 1 && mClusterClickCallback != null) { + return mClusterClickCallback.onClick(cluster); + } else if (mClusterItemClickCallback != null) { + return mClusterItemClickCallback.onClick(clusterItems.get(0)); } } return false; } - void setCallbacks(@Nullable ClusterManager.Callbacks listener) { - mCallbacks = listener; + void setClusterClickCallback(@Nullable ClusterManager.ClusterClickCallback listener) { + mClusterClickCallback = listener; + } + + void setClusterItemClickCallback(@Nullable ClusterManager.ClusterItemClickCallback listener) { + mClusterItemClickCallback = listener; } void setIconGenerator(@NonNull IconGenerator iconGenerator) { diff --git a/sample/src/main/java/com/sharewire/googlemapsclustering/sample/MapsActivity.java b/sample/src/main/java/com/sharewire/googlemapsclustering/sample/MapsActivity.java index aa1acb8..9f4feb2 100644 --- a/sample/src/main/java/com/sharewire/googlemapsclustering/sample/MapsActivity.java +++ b/sample/src/main/java/com/sharewire/googlemapsclustering/sample/MapsActivity.java @@ -44,15 +44,16 @@ public void onMapLoaded() { }); ClusterManager clusterManager = new ClusterManager<>(this, googleMap); - clusterManager.setCallbacks(new ClusterManager.Callbacks() { + clusterManager.setClusterClickCallback(new ClusterManager.ClusterClickCallback() { @Override - public boolean onClusterClick(@NonNull Cluster cluster) { + public boolean onClick(@NonNull Cluster cluster) { Log.d(TAG, "onClusterClick"); return false; } - + }); + clusterManager.setClusterItemClickCallback(new ClusterManager.ClusterItemClickCallback() { @Override - public boolean onClusterItemClick(@NonNull SampleClusterItem clusterItem) { + public boolean onClick(@NonNull SampleClusterItem clusterItem) { Log.d(TAG, "onClusterItemClick"); return false; }