package com.reactnativenavigation.react;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.JavaJSExecutor;
import com.facebook.react.devsupport.ReactInstanceDevCommandsHandler;
import com.reactnativenavigation.utils.ReflectionUtils;
class JsDevReloadListenerReplacer {
private final ReactInstanceManager reactInstanceManager;
private final Listener listener;
interface Listener {
void onJsDevReload();
}
JsDevReloadListenerReplacer(ReactInstanceManager reactInstanceManager, Listener listener) {
this.reactInstanceManager = reactInstanceManager;
this.listener = listener;
}
void replace() {
ReactInstanceDevCommandsHandler originalHandler = getOriginalHandler();
DevCommandsHandlerProxy proxy = new DevCommandsHandlerProxy(originalHandler, listener);
replaceInReactInstanceManager(proxy);
replaceInDevSupportManager(proxy);
}
private void replaceInDevSupportManager(DevCommandsHandlerProxy proxy) {
Object devSupportManager = ReflectionUtils.getDeclaredField(reactInstanceManager, "mDevSupportManager");
ReflectionUtils.setField(devSupportManager, "mReactInstanceCommandsHandler", proxy);
}
private ReactInstanceDevCommandsHandler getOriginalHandler() {
return (ReactInstanceDevCommandsHandler) ReflectionUtils.getDeclaredField(reactInstanceManager, "mDevInterface");
}
private void replaceInReactInstanceManager(DevCommandsHandlerProxy proxy) {
ReflectionUtils.setField(reactInstanceManager, "mDevInterface", proxy);
}
private static class DevCommandsHandlerProxy implements ReactInstanceDevCommandsHandler {
private ReactInstanceDevCommandsHandler originalReactHandler;
private final Listener listener;
DevCommandsHandlerProxy(ReactInstanceDevCommandsHandler originalReactHandler, Listener listener) {
this.originalReactHandler = originalReactHandler;
this.listener = listener;
}
@Override
public void onReloadWithJSDebugger(JavaJSExecutor.Factory proxyExecutorFactory) {
listener.onJsDevReload();
originalReactHandler.onReloadWithJSDebugger(proxyExecutorFactory);
}
@Override
public void onJSBundleLoadedFromServer() {
listener.onJsDevReload();
originalReactHandler.onJSBundleLoadedFromServer();
}
@Override
public void toggleElementInspector() {
originalReactHandler.toggleElementInspector();
}
}
}