diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java index 48dff5fc9a7bee..23534b2a23d755 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java @@ -25,6 +25,7 @@ import com.facebook.react.packagerconnection.FileIoHandler; import com.facebook.react.packagerconnection.JSPackagerClient; import com.facebook.react.packagerconnection.NotificationOnlyHandler; +import com.facebook.react.packagerconnection.ReconnectingWebSocket.ConnectionCallback; import com.facebook.react.packagerconnection.RequestHandler; import com.facebook.react.packagerconnection.RequestOnlyHandler; import com.facebook.react.packagerconnection.Responder; @@ -92,6 +93,8 @@ public interface OnServerContentChangeListener { } public interface PackagerCommandListener { + void onPackagerConnected(); + void onPackagerDisconnected(); void onPackagerReloadCommand(); void onPackagerDevMenuCommand(); void onCaptureHeapCommand(final Responder responder); @@ -163,10 +166,24 @@ public void onRequest(@Nullable Object params, Responder responder) { }); handlers.putAll(new FileIoHandler().handlers()); + ConnectionCallback onPackagerConnectedCallback = + new ConnectionCallback() { + @Override + public void onConnected() { + commandListener.onPackagerConnected(); + } + + @Override + public void onDisconnected() { + commandListener.onPackagerDisconnected(); + } + }; + mPackagerClient = new JSPackagerClient( clientId, mSettings.getPackagerConnectionSettings(), - handlers); + handlers, + onPackagerConnectedCallback); mPackagerClient.init(); return null; diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java index d00be1f2bb34d0..b91b3185f5f9ab 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java @@ -723,6 +723,16 @@ public void isPackagerRunning(PackagerStatusCallback callback) { return mLastErrorStack; } + @Override + public void onPackagerConnected() { + // No-op + } + + @Override + public void onPackagerDisconnected() { + // No-op + } + @Override public void onPackagerReloadCommand() { // Disable debugger to resume the JsVM & avoid thread locks while reloading diff --git a/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/JSPackagerClient.java b/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/JSPackagerClient.java index 0248973d83d28c..efa8fbc111296d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/JSPackagerClient.java +++ b/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/JSPackagerClient.java @@ -9,6 +9,7 @@ package com.facebook.react.packagerconnection; import java.util.Map; +import javax.annotation.Nullable; import android.net.Uri; @@ -63,6 +64,13 @@ public void error(Object error) { private Map mRequestHandlers; public JSPackagerClient(String clientId, PackagerConnectionSettings settings, Map requestHandlers) { + this(clientId, settings, requestHandlers, null); + } + + public JSPackagerClient( + String clientId, PackagerConnectionSettings settings, + Map requestHandlers, + @Nullable ReconnectingWebSocket.ConnectionCallback connectionCallback) { super(); Uri.Builder builder = new Uri.Builder(); @@ -74,7 +82,7 @@ public JSPackagerClient(String clientId, PackagerConnectionSettings settings, Ma .appendQueryParameter("clientid", clientId); String url = builder.build().toString(); - mWebSocket = new ReconnectingWebSocket(url, this, null); + mWebSocket = new ReconnectingWebSocket(url, this, connectionCallback); mRequestHandlers = requestHandlers; } diff --git a/ReactAndroid/src/test/java/com/facebook/react/packagerconnection/JSPackagerClientTest.java b/ReactAndroid/src/test/java/com/facebook/react/packagerconnection/JSPackagerClientTest.java index 41bc84647026b3..9a2de1dbea1846 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/packagerconnection/JSPackagerClientTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/packagerconnection/JSPackagerClientTest.java @@ -9,6 +9,8 @@ package com.facebook.react.packagerconnection; +import com.facebook.react.packagerconnection.ReconnectingWebSocket.ConnectionCallback; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -120,4 +122,20 @@ public void test_onMessage_WrongVersion_ShouldNotTriggerCallback() throws IOExce verify(handler, never()).onNotification(any()); verify(handler, never()).onRequest(any(), any(Responder.class)); } + + @Test + public void test_onDisconnection_ShouldTriggerDisconnectionCallback() throws IOException { + ConnectionCallback connectionHandler = mock(ConnectionCallback.class); + RequestHandler handler = mock(RequestHandler.class); + final JSPackagerClient client = + new JSPackagerClient("test_client", mSettings, new HashMap(), connectionHandler); + + client.close(); + + verify(connectionHandler, never()).onConnected(); + verify(connectionHandler, times(1)).onDisconnected(); + + verify(handler, never()).onNotification(any()); + verify(handler, never()).onRequest(any(), any(Responder.class)); + } }