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;
+ }
+}