establish bridge on WebView instance creation

This commit is contained in:
Hunter Medney
2016-09-14 12:51:45 -04:00
parent 6e037bf371
commit 62713668f2
@@ -2,98 +2,72 @@ package com.github.alinz.reactnativewebviewbridge;
import android.webkit.WebView;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.views.webview.ReactWebViewManager;
import com.facebook.react.views.webview.WebViewConfig;
import java.util.ArrayList;
import java.util.Map;
import javax.annotation.Nullable;
public class WebViewBridgeManager extends ReactWebViewManager {
private static final String REACT_CLASS = "RCTWebViewBridge";
private static final String REACT_CLASS = "RCTWebViewBridge";
public static final int COMMAND_INJECT_BRIDGE_SCRIPT = 100;
public static final int COMMAND_SEND_TO_BRIDGE = 101;
public static final int COMMAND_SEND_TO_BRIDGE = 101;
private boolean initializedBridge;
public WebViewBridgeManager() {
super();
initializedBridge = false;
}
public WebViewBridgeManager(WebViewConfig webViewConfig) {
super(webViewConfig);
initializedBridge = false;
}
@Override
public String getName() {
return REACT_CLASS;
}
@Override
public @Nullable Map<String, Integer> getCommandsMap() {
Map<String, Integer> commandsMap = super.getCommandsMap();
commandsMap.put("injectBridgeScript", COMMAND_INJECT_BRIDGE_SCRIPT);
commandsMap.put("sendToBridge", COMMAND_SEND_TO_BRIDGE);
return commandsMap;
}
@Override
public void receiveCommand(WebView root, int commandId, @Nullable ReadableArray args) {
super.receiveCommand(root, commandId, args);
switch (commandId) {
case COMMAND_INJECT_BRIDGE_SCRIPT:
injectBridgeScript(root);
break;
case COMMAND_SEND_TO_BRIDGE:
sendToBridge(root, args.getString(0));
break;
default:
//do nothing!!!!
}
}
private void sendToBridge(WebView root, String message) {
//root.loadUrl("javascript:(function() {\n" + script + ";\n})();");
String script = "WebViewBridge.onMessage('" + message + "');";
WebViewBridgeManager.evaluateJavascript(root, script);
}
private void injectBridgeScript(WebView root) {
//this code needs to be called once per context
if (!initializedBridge) {
root.addJavascriptInterface(new JavascriptBridge((ReactContext) root.getContext()), "WebViewBridgeAndroid");
initializedBridge = true;
root.reload();
@Override
public String getName() {
return REACT_CLASS;
}
// this code needs to be executed everytime a url changes.
WebViewBridgeManager.evaluateJavascript(root, ""
+ "(function() {"
+ "if (window.WebViewBridge) return;"
+ "var customEvent = document.createEvent('Event');"
+ "var WebViewBridge = {"
+ "send: function(message) { WebViewBridgeAndroid.send(message); },"
+ "onMessage: function() {}"
+ "};"
+ "window.WebViewBridge = WebViewBridge;"
+ "customEvent.initEvent('WebViewBridge', true, true);"
+ "document.dispatchEvent(customEvent);"
+ "}());");
}
private ArrayList<Integer> webViewsWithBridgeScript = new ArrayList<Integer>();
static private void evaluateJavascript(WebView root, String javascript) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
root.evaluateJavascript(javascript, null);
} else {
root.loadUrl("javascript:" + javascript);
@Override
public
@Nullable
Map<String, Integer> getCommandsMap() {
Map<String, Integer> commandsMap = super.getCommandsMap();
commandsMap.put("sendToBridge", COMMAND_SEND_TO_BRIDGE);
return commandsMap;
}
}
}
@Override
protected WebView createViewInstance(ThemedReactContext reactContext) {
WebView root = super.createViewInstance(reactContext);
root.getSettings().setAllowFileAccessFromFileURLs(true);
root.getSettings().setAllowUniversalAccessFromFileURLs(true);
root.addJavascriptInterface(new JavascriptBridge(root), "WebViewBridge");
return root;
}
@Override
public void receiveCommand(WebView root, int commandId, @Nullable ReadableArray args) {
super.receiveCommand(root, commandId, args);
// if (true) return;
switch (commandId) {
case COMMAND_SEND_TO_BRIDGE:
sendToBridge(root, args.getString(0));
break;
default:
//do nothing!!!!
}
}
private void sendToBridge(WebView root, String message) {
//root.loadUrl("javascript:(function() {\n" + script + ";\n})();");
String script = "WebViewBridge.onMessage('" + message + "');";
WebViewBridgeManager.evaluateJavascript(root, script);
}
static private void evaluateJavascript(WebView root, String javascript) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
root.evaluateJavascript(javascript, null);
} else {
root.loadUrl("javascript:" + javascript);
}
}
}