diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/core/BUCK b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/core/BUCK index 5f87d7e94d9..e6d69615549 100644 --- a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/core/BUCK +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/core/BUCK @@ -20,6 +20,7 @@ rn_android_library( react_native_integration_tests_target("java/com/facebook/react/testing/rule:rule"), react_native_target("java/com/facebook/react:react"), react_native_target("java/com/facebook/react/bridge:bridge"), + react_native_target("java/com/facebook/react/common:common"), react_native_target("java/com/facebook/react/shell:shell"), react_native_target("java/com/facebook/react/uimanager:uimanager"), ]) + ([ diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/core/ReactInstanceManagerTest.java b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/core/ReactInstanceManagerTest.java new file mode 100644 index 00000000000..0d1a2735e29 --- /dev/null +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/core/ReactInstanceManagerTest.java @@ -0,0 +1,46 @@ +package com.facebook.react.tests.core; + +import android.app.Activity; +import android.support.test.annotation.UiThreadTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.ReactRootView; +import com.facebook.react.common.LifecycleState; +import com.facebook.react.shell.MainReactPackage; +import com.facebook.react.testing.ReactTestHelper; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class ReactInstanceManagerTest { + + private ReactInstanceManager mReactInstanceManager; + private ReactRootView mReactRootView; + + @Rule public ActivityTestRule mActivityRule = new ActivityTestRule<>(Activity.class); + + @Before + public void setup() { + Activity activity = mActivityRule.getActivity(); + mReactRootView = new ReactRootView(activity); + mReactInstanceManager = + ReactTestHelper.getReactTestFactory() + .getReactInstanceManagerBuilder() + .setApplication(activity.getApplication()) + .setBundleAssetName("AndroidTestBundle.js") + .setInitialLifecycleState(LifecycleState.BEFORE_CREATE) + .addPackage(new MainReactPackage()) + .build(); + } + + @Test + @UiThreadTest + public void testMountUnmount() { + mReactInstanceManager.onHostResume(mActivityRule.getActivity()); + mReactRootView.startReactApplication(mReactInstanceManager, "ViewLayoutTestApp"); + mReactRootView.unmountReactApplication(); + } +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index 003311483f3..8773bf83f2f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -738,8 +738,9 @@ public class ReactInstanceManager { @ThreadConfined(UI) public void detachRootView(ReactRootView rootView) { UiThreadUtil.assertOnUiThread(); - if (mAttachedRootViews.remove(rootView)) { + if (mAttachedRootViews.contains(rootView)) { ReactContext currentContext = getCurrentReactContext(); + mAttachedRootViews.remove(rootView); if (currentContext != null && currentContext.hasActiveCatalystInstance()) { detachViewFromInstance(rootView, currentContext.getCatalystInstance()); } @@ -977,22 +978,22 @@ public class ReactInstanceManager { Systrace.beginSection(TRACE_TAG_REACT_JAVA_BRIDGE, "setupReactContext"); synchronized (mReactContextLock) { mCurrentReactContext = Assertions.assertNotNull(reactContext); - } - CatalystInstance catalystInstance = - Assertions.assertNotNull(reactContext.getCatalystInstance()); + CatalystInstance catalystInstance = + Assertions.assertNotNull(reactContext.getCatalystInstance()); - catalystInstance.initialize(); - mDevSupportManager.onNewReactContextCreated(reactContext); - mMemoryPressureRouter.addMemoryPressureListener(catalystInstance); - moveReactContextToCurrentLifecycleState(); + catalystInstance.initialize(); + mDevSupportManager.onNewReactContextCreated(reactContext); + mMemoryPressureRouter.addMemoryPressureListener(catalystInstance); + moveReactContextToCurrentLifecycleState(); - ReactMarker.logMarker(ATTACH_MEASURED_ROOT_VIEWS_START); - synchronized (mAttachedRootViews) { - for (ReactRootView rootView : mAttachedRootViews) { - attachRootViewToInstance(rootView); + ReactMarker.logMarker(ATTACH_MEASURED_ROOT_VIEWS_START); + synchronized (mAttachedRootViews) { + for (ReactRootView rootView : mAttachedRootViews) { + attachRootViewToInstance(rootView); + } } + ReactMarker.logMarker(ATTACH_MEASURED_ROOT_VIEWS_END); } - ReactMarker.logMarker(ATTACH_MEASURED_ROOT_VIEWS_END); ReactInstanceEventListener[] listeners = new ReactInstanceEventListener[mReactInstanceEventListeners.size()];