diff --git a/ParseLiveQuery/src/main/java/com/parse/OkHttp3SocketClientFactory.java b/ParseLiveQuery/src/main/java/com/parse/OkHttp3SocketClientFactory.java index 6268b3d..71c7c28 100644 --- a/ParseLiveQuery/src/main/java/com/parse/OkHttp3SocketClientFactory.java +++ b/ParseLiveQuery/src/main/java/com/parse/OkHttp3SocketClientFactory.java @@ -29,7 +29,7 @@ public WebSocketClient createInstance(WebSocketClient.WebSocketClientCallback we return new OkHttp3WebSocketClient(mClient, webSocketClientCallback, hostUrl); } - class OkHttp3WebSocketClient implements WebSocketClient { + static class OkHttp3WebSocketClient implements WebSocketClient { private static final String LOG_TAG = "OkHttpWebSocketClient"; @@ -38,7 +38,7 @@ class OkHttp3WebSocketClient implements WebSocketClient { private State state = State.NONE; private final OkHttpClient client; private final String url; - private final int STATUS_CODE = 200; + private final int STATUS_CODE = 1000; private final String CLOSING_MSG = "User invoked close"; private final WebSocketListener handler = new WebSocketListener() { diff --git a/ParseLiveQuery/src/main/java/com/parse/ParseLiveQueryClientCallbacks.java b/ParseLiveQuery/src/main/java/com/parse/ParseLiveQueryClientCallbacks.java index 881e09c..c8275fa 100644 --- a/ParseLiveQuery/src/main/java/com/parse/ParseLiveQueryClientCallbacks.java +++ b/ParseLiveQuery/src/main/java/com/parse/ParseLiveQueryClientCallbacks.java @@ -3,7 +3,7 @@ public interface ParseLiveQueryClientCallbacks { void onLiveQueryClientConnected(ParseLiveQueryClient client); - void onLiveQueryClientDisconnected(ParseLiveQueryClient client); + void onLiveQueryClientDisconnected(ParseLiveQueryClient client, boolean userInitiated); void onLiveQueryError(ParseLiveQueryClient client, LiveQueryException reason); diff --git a/ParseLiveQuery/src/main/java/com/parse/ParseLiveQueryClientImpl.java b/ParseLiveQuery/src/main/java/com/parse/ParseLiveQueryClientImpl.java index 9f7f0a2..b007ad6 100644 --- a/ParseLiveQuery/src/main/java/com/parse/ParseLiveQueryClientImpl.java +++ b/ParseLiveQuery/src/main/java/com/parse/ParseLiveQueryClientImpl.java @@ -138,8 +138,8 @@ public Void then(Task task) throws Exception { @Override public void disconnect() { if (webSocketClient != null) { - disconnectAsync(); userInitiatedDisconnect = true; + disconnectAsync(); } } @@ -254,7 +254,7 @@ private void dispatchConnected() { private void dispatchDisconnected() { for (ParseLiveQueryClientCallbacks callback : mCallbacks) { - callback.onLiveQueryClientDisconnected(this); + callback.onLiveQueryClientDisconnected(this, userInitiatedDisconnect); } } @@ -266,9 +266,13 @@ private void dispatchServerError(LiveQueryException exc) { } private void dispatchSocketError(Throwable reason) { + userInitiatedDisconnect = false; + for (ParseLiveQueryClientCallbacks callback : mCallbacks) { callback.onSocketError(this, reason); } + + dispatchDisconnected(); } private void handleSubscribedEvent(JSONObject jsonObject) throws JSONException { diff --git a/ParseLiveQuery/src/test/java/com/parse/TestParseLiveQueryClient.java b/ParseLiveQuery/src/test/java/com/parse/TestParseLiveQueryClient.java index 74dfdd1..cf73f3f 100644 --- a/ParseLiveQuery/src/test/java/com/parse/TestParseLiveQueryClient.java +++ b/ParseLiveQuery/src/test/java/com/parse/TestParseLiveQueryClient.java @@ -400,13 +400,29 @@ public void testDisconnectOnBackgroundThread() throws Exception { } @Test - public void testCallbackNotifiedOnDisconnect() throws Exception { + public void testCallbackNotifiedOnUnexpectedDisconnect() throws Exception { LoggingCallbacks callbacks = new LoggingCallbacks(); parseLiveQueryClient.registerListener(callbacks); callbacks.transcript.assertNoEventsSoFar(); + // Unexpected close from the server: webSocketClientCallback.onClose(); - callbacks.transcript.assertEventsSoFar("onLiveQueryClientDisconnected"); + callbacks.transcript.assertEventsSoFar("onLiveQueryClientDisconnected: false"); + } + + @Test + public void testCallbackNotifiedOnExpectedDisconnect() throws Exception { + LoggingCallbacks callbacks = new LoggingCallbacks(); + parseLiveQueryClient.registerListener(callbacks); + callbacks.transcript.assertNoEventsSoFar(); + + parseLiveQueryClient.disconnect(); + verify(webSocketClient, times(1)).close(); + + callbacks.transcript.assertNoEventsSoFar(); + // the client is a mock, so it won't actually invoke the callback automatically + webSocketClientCallback.onClose(); + callbacks.transcript.assertEventsSoFar("onLiveQueryClientDisconnected: true"); } @Test @@ -426,7 +442,8 @@ public void testCallbackNotifiedOnSocketError() throws Exception { callbacks.transcript.assertNoEventsSoFar(); webSocketClientCallback.onError(new IOException("bad things happened")); - callbacks.transcript.assertEventsSoFar("onSocketError: java.io.IOException: bad things happened"); + callbacks.transcript.assertEventsSoFar("onSocketError: java.io.IOException: bad things happened", + "onLiveQueryClientDisconnected: false"); } @Test @@ -548,8 +565,8 @@ public void onLiveQueryClientConnected(ParseLiveQueryClient client) { } @Override - public void onLiveQueryClientDisconnected(ParseLiveQueryClient client) { - transcript.add("onLiveQueryClientDisconnected"); + public void onLiveQueryClientDisconnected(ParseLiveQueryClient client, boolean userInitiated) { + transcript.add("onLiveQueryClientDisconnected: " + userInitiated); } @Override