diff --git a/CHANGELOG.md b/CHANGELOG.md index 68ab3e47..0976e367 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # pusher-websocket-java changelog +### Version 2.4.0 - 15th July 2022 +* Add support for Subscription count events + ### Version 2.3.0 - 4th July 2022 * Added support for user sign in and server to user messages * Fixed issue with calling disconnect while the client is attempting reconnection diff --git a/README.md b/README.md index d6c2b0b8..7b959212 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ The pusher-java-client is available in Maven Central. com.pusher pusher-java-client - 2.3.0-beta + 2.4.0 ``` @@ -83,7 +83,7 @@ The pusher-java-client is available in Maven Central. ```groovy dependencies { - compile 'com.pusher:pusher-java-client:2.3.0-beta' + compile 'com.pusher:pusher-java-client:2.4.0' } ``` @@ -256,6 +256,19 @@ Channel channel = pusher.subscribe("my-channel", new ChannelEventListener() { // Other ChannelEventListener methods }); +``` +If you wish to be informed for subscription count events, use the `bind` function to listen to event type `pusher:subscription_count`: + +```java +Channel channel = pusher.subscribe("my-channel"); +channel.bind("pusher:subscription_count", new SubscriptionEventListener() { + @Override + public void onEvent(PusherEvent event) { + System.out.println("Received event with data: " + event.toString()); + System.out.println("Subscription Count is: " + channel.getCount()); + } +}); + ``` ### Private channels diff --git a/build.gradle b/build.gradle index c86ef0d1..55445088 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ def getProperty = { property -> } group = "com.pusher" -version = "2.3.0-beta" +version = "2.4.0" sourceCompatibility = "1.8" targetCompatibility = "1.8" diff --git a/src/main/java/com/pusher/client/channel/impl/BaseChannel.java b/src/main/java/com/pusher/client/channel/impl/BaseChannel.java index 07602791..12f8de32 100644 --- a/src/main/java/com/pusher/client/channel/impl/BaseChannel.java +++ b/src/main/java/com/pusher/client/channel/impl/BaseChannel.java @@ -2,7 +2,6 @@ import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; @@ -11,6 +10,7 @@ import com.google.gson.GsonBuilder; import com.pusher.client.channel.*; import com.pusher.client.channel.impl.message.SubscribeMessage; +import com.pusher.client.channel.impl.message.SubscriptionCountData; import com.pusher.client.channel.impl.message.UnsubscribeMessage; import com.pusher.client.util.Factory; @@ -18,12 +18,15 @@ public abstract class BaseChannel implements InternalChannel { protected final Gson GSON; private static final String INTERNAL_EVENT_PREFIX = "pusher_internal:"; protected static final String SUBSCRIPTION_SUCCESS_EVENT = "pusher_internal:subscription_succeeded"; + protected static final String SUBSCRIPTION_COUNT_EVENT = "pusher_internal:subscription_count"; + protected static final String PUBLIC_SUBSCRIPTION_COUNT_EVENT = "pusher:subscription_count"; private Set globalListeners = new HashSet(); private final Map> eventNameToListenerMap = new HashMap>(); protected volatile ChannelState state = ChannelState.INITIAL; private ChannelEventListener eventListener; private final Factory factory; private final Object lock = new Object(); + private Integer subscriptionCount; public BaseChannel(final Factory factory) { GsonBuilder gsonBuilder = new GsonBuilder(); @@ -37,6 +40,11 @@ public BaseChannel(final Factory factory) { @Override abstract public String getName(); + @Override + public Integer getCount() { + return subscriptionCount; + } + @Override public void bind(final String eventName, final SubscriptionEventListener listener) { validateArguments(eventName, listener); @@ -112,6 +120,8 @@ public PusherEvent prepareEvent(String event, String message) { public void onMessage(String event, String message) { if (event.equals(SUBSCRIPTION_SUCCESS_EVENT)) { updateState(ChannelState.SUBSCRIBED); + }else if (event.equals(SUBSCRIPTION_COUNT_EVENT)) { + handleSubscriptionCountEvent(message); } else { final Set listeners = getInterestedListeners(event); if (listeners != null) { @@ -184,6 +194,12 @@ private void validateArguments(final String eventName, final SubscriptionEventLi } } + private void handleSubscriptionCountEvent(final String message) { + final SubscriptionCountData subscriptionCountMessage = GSON.fromJson(message, SubscriptionCountData.class); + subscriptionCount = subscriptionCountMessage.getCount(); + onMessage(PUBLIC_SUBSCRIPTION_COUNT_EVENT, message); + } + protected Set getInterestedListeners(String event) { synchronized (lock) { Set listeners = new HashSet(); diff --git a/src/main/java/com/pusher/client/channel/impl/InternalChannel.java b/src/main/java/com/pusher/client/channel/impl/InternalChannel.java index b6d8e032..8d7116b4 100644 --- a/src/main/java/com/pusher/client/channel/impl/InternalChannel.java +++ b/src/main/java/com/pusher/client/channel/impl/InternalChannel.java @@ -11,6 +11,8 @@ public interface InternalChannel extends Channel, Comparable { String toUnsubscribeMessage(); + Integer getCount(); + PusherEvent prepareEvent(String event, String message); void onMessage(String event, String message); diff --git a/src/main/java/com/pusher/client/channel/impl/message/SubscriptionCountData.java b/src/main/java/com/pusher/client/channel/impl/message/SubscriptionCountData.java new file mode 100644 index 00000000..b5865e0b --- /dev/null +++ b/src/main/java/com/pusher/client/channel/impl/message/SubscriptionCountData.java @@ -0,0 +1,12 @@ +package com.pusher.client.channel.impl.message; + +import com.google.gson.annotations.SerializedName; + +public class SubscriptionCountData { + @SerializedName("subscription_count") + public Integer count; + + public int getCount(){ + return count; + } +}