38
38
private WebSocketClient webSocketClient ;
39
39
private int requestIdCount = 1 ;
40
40
private boolean userInitiatedDisconnect = false ;
41
+ private boolean hasReceivedConnected = false ;
41
42
42
43
/* package */ ParseLiveQueryClientImpl () {
43
44
this (getDefaultUri ());
@@ -88,8 +89,7 @@ public <T extends ParseObject> SubscriptionHandling<T> subscribe(ParseQuery<T> q
88
89
Subscription <T > subscription = new Subscription <>(requestId , query );
89
90
subscriptions .append (requestId , subscription );
90
91
91
- // TODO: differentiate between state=CONNECTED, vs received op=connected response
92
- if (inAnyState (WebSocketClient .State .CONNECTED )) {
92
+ if (isConnected ()) {
93
93
sendSubscription (subscription );
94
94
} else if (userInitiatedDisconnect ) {
95
95
Log .w (LOG_TAG , "Warning: The client was explicitly disconnected! You must explicitly call .reconnect() in order to process your subscriptions." );
@@ -151,18 +151,21 @@ public void reconnect() {
151
151
webSocketClient .close ();
152
152
}
153
153
154
+ userInitiatedDisconnect = false ;
155
+ hasReceivedConnected = false ;
154
156
webSocketClient = webSocketClientFactory .createInstance (webSocketClientCallback , uri );
155
157
webSocketClient .open ();
156
- userInitiatedDisconnect = false ;
157
158
}
158
159
159
160
@ Override
160
161
public void disconnect () {
161
162
if (webSocketClient != null ) {
162
- userInitiatedDisconnect = true ;
163
163
webSocketClient .close ();
164
164
webSocketClient = null ;
165
165
}
166
+
167
+ userInitiatedDisconnect = true ;
168
+ hasReceivedConnected = false ;
166
169
}
167
170
168
171
@ Override
@@ -186,6 +189,10 @@ private WebSocketClient.State getWebSocketState() {
186
189
return state == null ? WebSocketClient .State .NONE : state ;
187
190
}
188
191
192
+ private boolean isConnected () {
193
+ return hasReceivedConnected && inAnyState (WebSocketClient .State .CONNECTED );
194
+ }
195
+
189
196
private boolean inAnyState (WebSocketClient .State ... states ) {
190
197
return Arrays .asList (states ).contains (getWebSocketState ());
191
198
}
@@ -220,6 +227,7 @@ private void parseMessage(String message) throws LiveQueryException {
220
227
221
228
switch (rawOperation ) {
222
229
case "connected" :
230
+ hasReceivedConnected = true ;
223
231
dispatchConnected ();
224
232
Log .v (LOG_TAG , "Connected, sending pending subscription" );
225
233
for (int i = 0 ; i < subscriptions .size (); i ++) {
@@ -371,6 +379,7 @@ private WebSocketClient.WebSocketClientCallback getWebSocketClientCallback() {
371
379
return new WebSocketClient .WebSocketClientCallback () {
372
380
@ Override
373
381
public void onOpen () {
382
+ hasReceivedConnected = false ;
374
383
Log .v (LOG_TAG , "Socket opened" );
375
384
ParseUser .getCurrentSessionTokenAsync ().onSuccessTask (new Continuation <String , Task <Void >>() {
376
385
@ Override
@@ -406,12 +415,14 @@ public Void then(Task<Void> task) {
406
415
@ Override
407
416
public void onClose () {
408
417
Log .v (LOG_TAG , "Socket onClose" );
418
+ hasReceivedConnected = false ;
409
419
dispatchDisconnected ();
410
420
}
411
421
412
422
@ Override
413
423
public void onError (Throwable exception ) {
414
424
Log .e (LOG_TAG , "Socket onError" , exception );
425
+ hasReceivedConnected = false ;
415
426
dispatchSocketError (exception );
416
427
}
417
428
0 commit comments