Skip to content

Commit 0e17a46

Browse files
committed
Add AndroidServerEventsClient with async APIs for all ServerEventsClient sync APIs
1 parent 56051de commit 0e17a46

File tree

4 files changed

+244
-37
lines changed

4 files changed

+244
-37
lines changed
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
package net.servicestack.android;
2+
3+
import net.servicestack.client.AsyncError;
4+
import net.servicestack.client.AsyncResult;
5+
import net.servicestack.client.AsyncResultVoid;
6+
import net.servicestack.client.AsyncSuccess;
7+
import net.servicestack.client.AsyncSuccessVoid;
8+
import net.servicestack.client.sse.GetEventSubscribers;
9+
import net.servicestack.client.sse.ServerEventUser;
10+
import net.servicestack.client.sse.ServerEventsClient;
11+
import net.servicestack.client.sse.UpdateEventSubscriber;
12+
import net.servicestack.client.sse.UpdateEventSubscriberResponse;
13+
import net.servicestack.func.Func;
14+
15+
import java.util.ArrayList;
16+
import java.util.HashMap;
17+
import java.util.List;
18+
19+
/**
20+
* Created by mythz on 2/15/2017.
21+
*/
22+
23+
public class AndroidServerEventsClient extends ServerEventsClient {
24+
public AndroidServerEventsClient(String baseUri, String... channels) {
25+
super(baseUri, channels);
26+
this.serviceClient = new AndroidServiceClient(this.baseUri);
27+
}
28+
29+
public AndroidServerEventsClient(String baseUrl, String channel) {
30+
this(baseUrl, new String[]{ channel });
31+
}
32+
33+
public AndroidServerEventsClient(String baseUrl) {
34+
this(baseUrl, new String[]{});
35+
}
36+
37+
public AndroidServiceClient getAndroidClient(){
38+
return (AndroidServiceClient) this.serviceClient;
39+
}
40+
41+
public void getChannelSubscribersAsync(final AsyncResult<List<ServerEventUser>> asyncResult){
42+
this.getAndroidClient().getAsync(
43+
new GetEventSubscribers().setChannels(Func.toList(this.getChannels())),
44+
new AsyncResult<ArrayList<HashMap<String,String>>>(){
45+
@Override
46+
public void success(ArrayList<HashMap<String,String>> response) {
47+
asyncResult.success(toServerEventUser(response));
48+
}
49+
@Override
50+
public void error(Exception ex) {
51+
asyncResult.error(ex);
52+
}
53+
@Override
54+
public void complete() {
55+
asyncResult.complete();
56+
}
57+
}
58+
);
59+
}
60+
61+
public void getChannelSubscribersAsync(AsyncSuccess<List<ServerEventUser>> success){
62+
getChannelSubscribersAsync(AsyncUtils.createAsyncResult(success, null));
63+
}
64+
65+
public void getChannelSubscribersAsync(AsyncSuccess<List<ServerEventUser>> success, AsyncError error){
66+
getChannelSubscribersAsync(AsyncUtils.createAsyncResult(success, error));
67+
}
68+
69+
public void updateSubscriberAsync(final UpdateEventSubscriber request, final AsyncResultVoid asyncResult){
70+
if (request.getId() == null)
71+
request.setId(connectionInfo.getId());
72+
73+
getAndroidClient().postAsync(request, new AsyncResult<UpdateEventSubscriberResponse>() {
74+
@Override
75+
public void success(UpdateEventSubscriberResponse response) {
76+
asyncResult.success();
77+
update(
78+
Func.toArray(request.getSubscribeChannels(), String.class),
79+
Func.toArray(request.getUnsubscribeChannels(), String.class));
80+
}
81+
@Override
82+
public void error(Exception ex) {
83+
asyncResult.error(ex);
84+
}
85+
@Override
86+
public void complete() {
87+
asyncResult.complete();
88+
}
89+
});
90+
}
91+
92+
public void updateSubscriberAsync(final UpdateEventSubscriber request, final AsyncSuccessVoid success){
93+
updateSubscriberAsync(request, AsyncUtils.createAsyncResult(success, null));
94+
}
95+
96+
public void updateSubscriberAsync(final UpdateEventSubscriber request, final AsyncSuccessVoid success, AsyncError error){
97+
updateSubscriberAsync(request, AsyncUtils.createAsyncResult(success, error));
98+
}
99+
100+
public void subscribeToChannelsAsync(final String[] channels, final AsyncResultVoid asyncResult)
101+
{
102+
getAndroidClient().postAsync(new UpdateEventSubscriber()
103+
.setId(connectionInfo.getId())
104+
.setSubscribeChannels(Func.toList(channels)),
105+
new AsyncResult<UpdateEventSubscriberResponse>() {
106+
@Override
107+
public void success(UpdateEventSubscriberResponse response) {
108+
asyncResult.success();
109+
update(channels, null);
110+
}
111+
@Override
112+
public void error(Exception ex) {
113+
asyncResult.error(ex);
114+
}
115+
@Override
116+
public void complete() {
117+
asyncResult.complete();
118+
}
119+
});
120+
}
121+
122+
public void subscribeToChannelsAsync(final String[] channels, final AsyncSuccess success){
123+
subscribeToChannelsAsync(channels, AsyncUtils.createAsyncResult(success, null));
124+
}
125+
126+
public void subscribeToChannelsAsync(final String[] channels, final AsyncSuccess success, final AsyncError error){
127+
subscribeToChannelsAsync(channels, AsyncUtils.createAsyncResult(success, error));
128+
}
129+
130+
public void unSubscribeFromChannelsAsync(final String[] channels, final AsyncResultVoid asyncResult)
131+
{
132+
getAndroidClient().postAsync(new UpdateEventSubscriber()
133+
.setId(connectionInfo.getId())
134+
.setUnsubscribeChannels(Func.toList(channels)),
135+
new AsyncResult<UpdateEventSubscriberResponse>() {
136+
@Override
137+
public void success(UpdateEventSubscriberResponse response) {
138+
asyncResult.success();
139+
update(null, channels);
140+
}
141+
@Override
142+
public void error(Exception ex) {
143+
asyncResult.error(ex);
144+
}
145+
@Override
146+
public void complete() {
147+
asyncResult.complete();
148+
}
149+
});
150+
}
151+
152+
public void unSubscribeFromChannelsAsync(final String[] channels, final AsyncSuccess success){
153+
unSubscribeFromChannelsAsync(channels, AsyncUtils.createAsyncResult(success, null));
154+
}
155+
156+
public void unSubscribeFromChannelsAsync(final String[] channels, final AsyncSuccess success, final AsyncError error){
157+
unSubscribeFromChannelsAsync(channels, AsyncUtils.createAsyncResult(success, error));
158+
}
159+
}

src/AndroidClient/android/src/main/java/net/servicestack/android/AsyncUtils.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
import android.graphics.Bitmap;
44
import android.os.AsyncTask;
55

6+
import net.servicestack.client.AsyncError;
67
import net.servicestack.client.AsyncResult;
8+
import net.servicestack.client.AsyncResultVoid;
9+
import net.servicestack.client.AsyncSuccess;
10+
import net.servicestack.client.AsyncSuccessVoid;
711

812
import java.net.HttpURLConnection;
913
import java.net.URL;
@@ -14,7 +18,43 @@
1418

1519
public class AsyncUtils {
1620

17-
public static void readBitmap(final String url, final AsyncResult<Bitmap> asyncResult){
21+
public static <T> AsyncResult<T> createAsyncResult(final AsyncSuccess<T> success, final AsyncError error){
22+
return new AsyncResult<T>() {
23+
@Override
24+
public void success(T response) {
25+
success.success(response);
26+
}
27+
@Override
28+
public void error(Exception ex) {
29+
if (error != null)
30+
error.error(ex);
31+
}
32+
};
33+
}
34+
35+
public static AsyncResultVoid createAsyncResult(final AsyncSuccessVoid success, final AsyncError error){
36+
return new AsyncResultVoid() {
37+
@Override
38+
public void success() {
39+
success.success();
40+
}
41+
@Override
42+
public void error(Exception ex) {
43+
if (error != null)
44+
error.error(ex);
45+
}
46+
};
47+
}
48+
49+
public static void readBitmap(final String url, final AsyncSuccess<Bitmap> success){
50+
readBitmap(url, createAsyncResult(success, null));
51+
}
52+
53+
public static void readBitmap(final String url, final AsyncSuccess<Bitmap> success, AsyncError error){
54+
readBitmap(url, createAsyncResult(success, error));
55+
}
56+
57+
private static void readBitmap(final String url, final AsyncResult<Bitmap> asyncResult){
1858
new AsyncTask<String, Void, Bitmap>(){
1959

2060
@Override

src/AndroidClient/android/src/main/java/net/servicestack/client/sse/ServerEventsClient.java

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,28 +40,28 @@
4040
*/
4141

4242
public class ServerEventsClient implements Closeable {
43-
private String baseUri;
44-
private String[] channels;
45-
private String eventStreamPath;
46-
private String eventStreamUri;
47-
private JsonServiceClient serviceClient;
48-
private IResolver resolver;
43+
protected String baseUri;
44+
protected String[] channels;
45+
protected String eventStreamPath;
46+
protected String eventStreamUri;
47+
protected JsonServiceClient serviceClient;
48+
protected IResolver resolver;
4949

50-
private Map<String,ServerEventCallback> handlers;
51-
private Map<String,ServerEventCallback> namedReceivers;
50+
protected Map<String,ServerEventCallback> handlers;
51+
protected Map<String,ServerEventCallback> namedReceivers;
5252

53-
private ServerEventConnectCallback onConnect;
54-
private ServerEventMessageCallback onMessage;
55-
private ServerEventMessageCallback onCommand;
56-
private ServerEventMessageCallback onHeartbeat;
57-
private ExceptionCallback onException;
58-
private HttpRequestFilter heartbeatRequestFilter;
53+
protected ServerEventConnectCallback onConnect;
54+
protected ServerEventMessageCallback onMessage;
55+
protected ServerEventMessageCallback onCommand;
56+
protected ServerEventMessageCallback onHeartbeat;
57+
protected ExceptionCallback onException;
58+
protected HttpRequestFilter heartbeatRequestFilter;
5959

60-
private ServerEventConnect connectionInfo;
60+
protected ServerEventConnect connectionInfo;
6161

62-
private Date lastPulseAt;
63-
private Thread bgThread;
64-
private final AtomicBoolean stopped = new AtomicBoolean(false);
62+
protected Date lastPulseAt;
63+
protected Thread bgThread;
64+
protected final AtomicBoolean stopped = new AtomicBoolean(false);
6565

6666
static int BufferSize = 1024 * 64;
6767
static int DefaultHeartbeatMs = 10 * 1000;
@@ -689,6 +689,10 @@ public List<ServerEventUser> getChannelSubscribers(){
689689
ArrayList<HashMap<String,String>> response = this.serviceClient.get(
690690
new GetEventSubscribers().setChannels(Func.toList(this.getChannels())));
691691

692+
return toServerEventUser(response);
693+
}
694+
695+
protected ArrayList<ServerEventUser> toServerEventUser(ArrayList<HashMap<String, String>> response) {
692696
return Func.map(response, new Function<HashMap<String, String>, ServerEventUser>() {
693697
@Override
694698
public ServerEventUser apply(HashMap<String, String> map) {

src/AndroidClient/client/src/main/java/net/servicestack/client/sse/ServerEventsClient.java

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,28 +40,28 @@
4040
*/
4141

4242
public class ServerEventsClient implements Closeable {
43-
private String baseUri;
44-
private String[] channels;
45-
private String eventStreamPath;
46-
private String eventStreamUri;
47-
private JsonServiceClient serviceClient;
48-
private IResolver resolver;
43+
protected String baseUri;
44+
protected String[] channels;
45+
protected String eventStreamPath;
46+
protected String eventStreamUri;
47+
protected JsonServiceClient serviceClient;
48+
protected IResolver resolver;
4949

50-
private Map<String,ServerEventCallback> handlers;
51-
private Map<String,ServerEventCallback> namedReceivers;
50+
protected Map<String,ServerEventCallback> handlers;
51+
protected Map<String,ServerEventCallback> namedReceivers;
5252

53-
private ServerEventConnectCallback onConnect;
54-
private ServerEventMessageCallback onMessage;
55-
private ServerEventMessageCallback onCommand;
56-
private ServerEventMessageCallback onHeartbeat;
57-
private ExceptionCallback onException;
58-
private HttpRequestFilter heartbeatRequestFilter;
53+
protected ServerEventConnectCallback onConnect;
54+
protected ServerEventMessageCallback onMessage;
55+
protected ServerEventMessageCallback onCommand;
56+
protected ServerEventMessageCallback onHeartbeat;
57+
protected ExceptionCallback onException;
58+
protected HttpRequestFilter heartbeatRequestFilter;
5959

60-
private ServerEventConnect connectionInfo;
60+
protected ServerEventConnect connectionInfo;
6161

62-
private Date lastPulseAt;
63-
private Thread bgThread;
64-
private final AtomicBoolean stopped = new AtomicBoolean(false);
62+
protected Date lastPulseAt;
63+
protected Thread bgThread;
64+
protected final AtomicBoolean stopped = new AtomicBoolean(false);
6565

6666
static int BufferSize = 1024 * 64;
6767
static int DefaultHeartbeatMs = 10 * 1000;
@@ -689,6 +689,10 @@ public List<ServerEventUser> getChannelSubscribers(){
689689
ArrayList<HashMap<String,String>> response = this.serviceClient.get(
690690
new GetEventSubscribers().setChannels(Func.toList(this.getChannels())));
691691

692+
return toServerEventUser(response);
693+
}
694+
695+
protected ArrayList<ServerEventUser> toServerEventUser(ArrayList<HashMap<String, String>> response) {
692696
return Func.map(response, new Function<HashMap<String, String>, ServerEventUser>() {
693697
@Override
694698
public ServerEventUser apply(HashMap<String, String> map) {

0 commit comments

Comments
 (0)