diff --git a/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java b/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java index 39151e258e..074269c2d0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java +++ b/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java @@ -23,6 +23,7 @@ import com.facebook.react.modules.core.ExceptionsManagerModule; import com.facebook.react.modules.core.Timing; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.modules.core.HeadlessJsTaskSupportModule; +import com.facebook.react.modules.debug.DevSettingsModule; import com.facebook.react.modules.debug.SourceCodeModule; import com.facebook.react.modules.deviceinfo.DeviceInfoModule; import com.facebook.react.modules.systeminfo.AndroidInfoModule; @@ -49,6 +50,7 @@ import static com.facebook.react.bridge.ReactMarkerConstants.*; AndroidInfoModule.class, DeviceEventManagerModule.class, DeviceInfoModule.class, + DevSettingsModule.class, ExceptionsManagerModule.class, HeadlessJsTaskSupportModule.class, SourceCodeModule.class, @@ -93,6 +95,7 @@ import static com.facebook.react.bridge.ReactMarkerConstants.*; AndroidInfoModule.class, DeviceEventManagerModule.class, DeviceInfoModule.class, + DevSettingsModule.class, ExceptionsManagerModule.class, HeadlessJsTaskSupportModule.class, SourceCodeModule.class, @@ -138,6 +141,8 @@ import static com.facebook.react.bridge.ReactMarkerConstants.*; return new AndroidInfoModule(reactContext); case DeviceEventManagerModule.NAME: return new DeviceEventManagerModule(reactContext, mHardwareBackBtnHandler); + case DevSettingsModule.NAME: + return new DevSettingsModule(mReactInstanceManager.getDevSupportManager()); case ExceptionsManagerModule.NAME: return new ExceptionsManagerModule(mReactInstanceManager.getDevSupportManager()); case HeadlessJsTaskSupportModule.NAME: 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 b3643e77b7..7443b4e3d2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java @@ -1040,6 +1040,90 @@ public class DevSupportManagerImpl implements mDevServerHelper.closeInspectorConnection(); } + @Override + public void setHotModuleReplacementEnabled(final boolean isHotModuleReplacementEnabled) { + if (!mIsDevSupportEnabled) { + return; + } + + UiThreadUtil.runOnUiThread( + new Runnable() { + @Override + public void run() { + mDevSettings.setHotModuleReplacementEnabled(isHotModuleReplacementEnabled); + handleReloadJS(); + } + } + ); + } + + @Override + public void setRemoteJSDebugEnabled(final boolean isRemoteJSDebugEnabled) { + if (!mIsDevSupportEnabled) { + return; + } + + UiThreadUtil.runOnUiThread( + new Runnable() { + @Override + public void run() { + mDevSettings.setRemoteJSDebugEnabled(isRemoteJSDebugEnabled); + handleReloadJS(); + } + } + ); + } + + @Override + public void setReloadOnJSChangeEnabled(final boolean isReloadOnJSChangeEnabled) { + if (!mIsDevSupportEnabled) { + return; + } + + UiThreadUtil.runOnUiThread( + new Runnable() { + @Override + public void run() { + mDevSettings.setReloadOnJSChangeEnabled(isReloadOnJSChangeEnabled); + handleReloadJS(); + } + } + ); + } + + @Override + public void setFpsDebugEnabled(final boolean isFpsDebugEnabled) { + if (!mIsDevSupportEnabled) { + return; + } + + UiThreadUtil.runOnUiThread( + new Runnable() { + @Override + public void run() { + mDevSettings.setFpsDebugEnabled(isFpsDebugEnabled); + } + } + ); + } + + @Override + public void toggleElementInspector() { + if (!mIsDevSupportEnabled) { + return; + } + + UiThreadUtil.runOnUiThread( + new Runnable() { + @Override + public void run() { + mDevSettings.setElementInspectorEnabled(!mDevSettings.isElementInspectorEnabled()); + mReactInstanceManagerHelper.toggleElementInspector(); + } + } + ); + } + private void reload() { UiThreadUtil.assertOnUiThread(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DisabledDevSupportManager.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DisabledDevSupportManager.java index daa11f0ee6..f57c32ba8f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DisabledDevSupportManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DisabledDevSupportManager.java @@ -78,6 +78,31 @@ public class DisabledDevSupportManager implements DevSupportManager { } + @Override + public void setHotModuleReplacementEnabled(boolean isHotModuleReplacementEnabled) { + + } + + @Override + public void setRemoteJSDebugEnabled(boolean isRemoteJSDebugEnabled) { + + } + + @Override + public void setReloadOnJSChangeEnabled(boolean isReloadOnJSChangeEnabled) { + + } + + @Override + public void setFpsDebugEnabled(boolean isFpsDebugEnabled) { + + } + + @Override + public void toggleElementInspector() { + + } + @Override public boolean getDevSupportEnabled() { return false; @@ -162,7 +187,7 @@ public class DisabledDevSupportManager implements DevSupportManager { @Override public void registerErrorCustomizer(ErrorCustomizer errorCustomizer) { - + } @Override diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.java index fbd777ea52..6fb3775da7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.java @@ -45,6 +45,11 @@ public interface DevSupportManager extends NativeModuleCallExceptionHandler { void handleReloadJS(); void reloadJSFromServer(final String bundleURL); void isPackagerRunning(PackagerStatusCallback callback); + void setHotModuleReplacementEnabled(final boolean isHotModuleReplacementEnabled); + void setRemoteJSDebugEnabled(final boolean isRemoteJSDebugEnabled); + void setReloadOnJSChangeEnabled(final boolean isReloadOnJSChangeEnabled); + void setFpsDebugEnabled(final boolean isFpsDebugEnabled); + void toggleElementInspector(); @Nullable File downloadBundleResourceFromUrlSync( final String resourceURL, final File outputFile); diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/BUCK b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/BUCK index fdead3b975..36fde2d199 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/BUCK @@ -12,6 +12,7 @@ rn_android_library( react_native_dep("third-party/java/jsr-305:jsr-305"), 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/devsupport:interfaces"), react_native_target("java/com/facebook/react/module/annotations:annotations"), react_native_target("java/com/facebook/react/modules/core:core"), react_native_target("java/com/facebook/react/modules/debug:interfaces"), diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java new file mode 100644 index 0000000000..3f067c62b0 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java @@ -0,0 +1,72 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.modules.debug; + +import com.facebook.react.bridge.BaseJavaModule; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.devsupport.interfaces.DevSupportManager; +import com.facebook.react.module.annotations.ReactModule; +import com.facebook.react.bridge.UiThreadUtil; + +/** + * Module that exposes the URL to the source code map (used for exception stack trace parsing) to JS + */ +@ReactModule(name = DevSettingsModule.NAME) +public class DevSettingsModule extends BaseJavaModule { + + public static final String NAME = "DevSettings"; + + private final DevSupportManager mDevSupportManager; + + public DevSettingsModule(DevSupportManager devSupportManager) { + mDevSupportManager = devSupportManager; + } + + @Override + public String getName() { + return NAME; + } + + @ReactMethod + public void reload() { + if (mDevSupportManager.getDevSupportEnabled()) { + UiThreadUtil.runOnUiThread(new Runnable() { + @Override + public void run() { + mDevSupportManager.handleReloadJS(); + } + }); + } + } + + @ReactMethod + public void setHotLoadingEnabled(boolean isHotLoadingEnabled) { + mDevSupportManager.setHotModuleReplacementEnabled(isHotLoadingEnabled); + } + + @ReactMethod + public void setIsDebuggingRemotely(boolean isDebugginRemotelyEnabled) { + mDevSupportManager.setRemoteJSDebugEnabled(isDebugginRemotelyEnabled); + } + + @ReactMethod + public void setLiveReloadEnabled(boolean isLiveReloadEnabled) { + mDevSupportManager.setReloadOnJSChangeEnabled(isLiveReloadEnabled); + } + + @ReactMethod + public void setProfilingEnabled(boolean isProfilingEnabled) { + mDevSupportManager.setFpsDebugEnabled(isProfilingEnabled); + } + + @ReactMethod + public void toggleElementInspector() { + mDevSupportManager.toggleElementInspector(); + } +}