55import net .servicestack .client .AsyncResultVoid ;
66import net .servicestack .client .AsyncSuccess ;
77import net .servicestack .client .AsyncSuccessVoid ;
8+ import net .servicestack .client .Log ;
9+ import net .servicestack .client .sse .EventStream ;
810import net .servicestack .client .sse .GetEventSubscribers ;
911import net .servicestack .client .sse .ServerEventUser ;
1012import net .servicestack .client .sse .ServerEventsClient ;
1113import net .servicestack .client .sse .UpdateEventSubscriber ;
1214import net .servicestack .client .sse .UpdateEventSubscriberResponse ;
1315import net .servicestack .func .Func ;
1416
17+ import java .io .BufferedInputStream ;
18+ import java .io .IOException ;
19+ import java .io .InputStream ;
20+ import java .io .InterruptedIOException ;
21+ import java .lang .reflect .Field ;
22+ import java .net .HttpURLConnection ;
23+ import java .net .SocketException ;
24+ import java .net .URL ;
1525import java .util .ArrayList ;
1626import java .util .HashMap ;
1727import java .util .List ;
1828
29+ import okhttp3 .Call ;
30+ import okhttp3 .Callback ;
31+ import okhttp3 .OkHttpClient ;
32+ import okhttp3 .Request ;
33+ import okhttp3 .Response ;
34+ import okhttp3 .ResponseBody ;
35+ import okio .BufferedSource ;
36+
1937/**
2038 * Created by mythz on 2/15/2017.
2139 */
@@ -38,6 +56,73 @@ public AndroidServiceClient getAndroidClient(){
3856 return (AndroidServiceClient ) this .serviceClient ;
3957 }
4058
59+ @ Override
60+ protected EventStream createEventStream () {
61+ return new AndroidEventStream (this );
62+ }
63+
64+ public static final OkHttpClient client = new OkHttpClient ();
65+
66+ class AndroidEventStream extends EventStream
67+ {
68+ public AndroidEventStream (ServerEventsClient client ) {
69+ super (client );
70+ }
71+
72+ Call call ;
73+
74+ @ Override
75+ protected InputStream getInputStream (URL streamUri ) throws IOException {
76+
77+ Request request = new Request .Builder ()
78+ .url (streamUri )
79+ .build ();
80+
81+ call = client .newCall (request );
82+ Response response = call .execute ();
83+
84+ return new BufferedInputStream (response .body ().byteStream ());
85+ }
86+
87+ @ Override
88+ public void close () {
89+ if (call == null ) return ;
90+ call .cancel ();
91+ }
92+
93+ @ Override
94+ protected int readFromStream (InputStream inputStream , byte [] buffer ) throws IOException , InterruptedException {
95+ int len ;
96+
97+ //Simulates a bgThread.interrupt() so EventStream.run() exits gracefully
98+
99+ try {
100+ len = inputStream .read (buffer );
101+ } catch (SocketException e ){
102+ if (call .isCanceled ()){
103+ throw new InterruptedException ();
104+ }
105+ throw e ;
106+ }
107+ if (call .isCanceled ()){
108+ throw new InterruptedException ();
109+ }
110+ return len ;
111+ }
112+ }
113+
114+ @ Override
115+ protected synchronized void interruptBackgroundThread () {
116+ if (bgThread != null ){
117+ bgEventStream .close ();
118+ try {
119+ bgThread .join (1000 );
120+ } catch (InterruptedException ignore ) {}
121+ bgThread = null ;
122+ bgEventStream = null ;
123+ }
124+ }
125+
41126 public void getChannelSubscribersAsync (final AsyncResult <List <ServerEventUser >> asyncResult ){
42127 this .getAndroidClient ().getAsync (
43128 new GetEventSubscribers ().setChannels (Func .toList (this .getChannels ())),
0 commit comments