mirror of
https://github.com/apache/cordova-android.git
synced 2025-01-31 17:32:51 +08:00
Got the bridge to work with Crosswalk
This commit is contained in:
parent
35ec24c3f0
commit
04a792a8c2
76
framework/src/org/apache/cordova/AndroidExposedJsApi.java
Executable file
76
framework/src/org/apache/cordova/AndroidExposedJsApi.java
Executable file
@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.cordova;
|
||||||
|
|
||||||
|
import android.webkit.JavascriptInterface;
|
||||||
|
import org.apache.cordova.PluginManager;
|
||||||
|
import org.json.JSONException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains APIs that the JS can call. All functions in here should also have
|
||||||
|
* an equivalent entry in CordovaChromeClient.java, and be added to
|
||||||
|
* cordova-js/lib/android/plugin/android/promptbasednativeapi.js
|
||||||
|
*/
|
||||||
|
public /* package */ class AndroidExposedJsApi implements ExposedJsApi {
|
||||||
|
|
||||||
|
private PluginManager pluginManager;
|
||||||
|
private NativeToJsMessageQueue jsMessageQueue;
|
||||||
|
|
||||||
|
public AndroidExposedJsApi(PluginManager pluginManager, NativeToJsMessageQueue jsMessageQueue) {
|
||||||
|
this.pluginManager = pluginManager;
|
||||||
|
this.jsMessageQueue = jsMessageQueue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public String exec(String service, String action, String callbackId, String arguments) throws JSONException {
|
||||||
|
// If the arguments weren't received, send a message back to JS. It will switch bridge modes and try again. See CB-2666.
|
||||||
|
// We send a message meant specifically for this case. It starts with "@" so no other message can be encoded into the same string.
|
||||||
|
if (arguments == null) {
|
||||||
|
return "@Null arguments.";
|
||||||
|
}
|
||||||
|
|
||||||
|
jsMessageQueue.setPaused(true);
|
||||||
|
try {
|
||||||
|
// Tell the resourceApi what thread the JS is running on.
|
||||||
|
CordovaResourceApi.jsThread = Thread.currentThread();
|
||||||
|
|
||||||
|
pluginManager.exec(service, action, callbackId, arguments);
|
||||||
|
String ret = "";
|
||||||
|
if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING) {
|
||||||
|
ret = jsMessageQueue.popAndEncode(false);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return "";
|
||||||
|
} finally {
|
||||||
|
jsMessageQueue.setPaused(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public void setNativeToJsBridgeMode(int value) {
|
||||||
|
jsMessageQueue.setBridgeMode(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public String retrieveJsMessages(boolean fromOnlineEvent) {
|
||||||
|
return jsMessageQueue.popAndEncode(fromOnlineEvent);
|
||||||
|
}
|
||||||
|
}
|
@ -343,7 +343,7 @@ public class AndroidWebView extends WebView implements CordovaWebView {
|
|||||||
|
|
||||||
pluginManager = new PluginManager(this, this.cordova);
|
pluginManager = new PluginManager(this, this.cordova);
|
||||||
jsMessageQueue = new NativeToJsMessageQueue(this, cordova);
|
jsMessageQueue = new NativeToJsMessageQueue(this, cordova);
|
||||||
exposedJsApi = new ExposedJsApi(pluginManager, jsMessageQueue);
|
exposedJsApi = new AndroidExposedJsApi(pluginManager, jsMessageQueue);
|
||||||
resourceApi = new CordovaResourceApi(this.getContext(), pluginManager);
|
resourceApi = new CordovaResourceApi(this.getContext(), pluginManager);
|
||||||
exposeJsInterface();
|
exposeJsInterface();
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@ public class CordovaResourceApi {
|
|||||||
// Creating this is light-weight.
|
// Creating this is light-weight.
|
||||||
private static OkHttpClient httpClient = new OkHttpClient();
|
private static OkHttpClient httpClient = new OkHttpClient();
|
||||||
|
|
||||||
static Thread jsThread;
|
public static Thread jsThread;
|
||||||
|
|
||||||
private final AssetManager assetManager;
|
private final AssetManager assetManager;
|
||||||
private final ContentResolver contentResolver;
|
private final ContentResolver contentResolver;
|
||||||
|
75
framework/src/org/apache/cordova/ExposedJsApi.java
Executable file → Normal file
75
framework/src/org/apache/cordova/ExposedJsApi.java
Executable file → Normal file
@ -1,76 +1,17 @@
|
|||||||
/*
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
*/
|
|
||||||
package org.apache.cordova;
|
package org.apache.cordova;
|
||||||
|
|
||||||
import android.webkit.JavascriptInterface;
|
|
||||||
import org.apache.cordova.PluginManager;
|
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
|
|
||||||
/**
|
import android.webkit.JavascriptInterface;
|
||||||
* Contains APIs that the JS can call. All functions in here should also have
|
|
||||||
* an equivalent entry in CordovaChromeClient.java, and be added to
|
/*
|
||||||
* cordova-js/lib/android/plugin/android/promptbasednativeapi.js
|
* Any exposed Javascript API MUST implement these three things!
|
||||||
*/
|
*/
|
||||||
public /* package */ class ExposedJsApi {
|
|
||||||
|
|
||||||
private PluginManager pluginManager;
|
public interface ExposedJsApi {
|
||||||
private NativeToJsMessageQueue jsMessageQueue;
|
|
||||||
|
|
||||||
public ExposedJsApi(PluginManager pluginManager, NativeToJsMessageQueue jsMessageQueue) {
|
|
||||||
this.pluginManager = pluginManager;
|
|
||||||
this.jsMessageQueue = jsMessageQueue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@JavascriptInterface
|
@JavascriptInterface
|
||||||
public String exec(String service, String action, String callbackId, String arguments) throws JSONException {
|
public String exec(String service, String action, String callbackId, String arguments) throws JSONException;
|
||||||
// If the arguments weren't received, send a message back to JS. It will switch bridge modes and try again. See CB-2666.
|
public void setNativeToJsBridgeMode(int value);
|
||||||
// We send a message meant specifically for this case. It starts with "@" so no other message can be encoded into the same string.
|
public String retrieveJsMessages(boolean fromOnlineEvent);
|
||||||
if (arguments == null) {
|
|
||||||
return "@Null arguments.";
|
|
||||||
}
|
|
||||||
|
|
||||||
jsMessageQueue.setPaused(true);
|
|
||||||
try {
|
|
||||||
// Tell the resourceApi what thread the JS is running on.
|
|
||||||
CordovaResourceApi.jsThread = Thread.currentThread();
|
|
||||||
|
|
||||||
pluginManager.exec(service, action, callbackId, arguments);
|
|
||||||
String ret = "";
|
|
||||||
if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING) {
|
|
||||||
ret = jsMessageQueue.popAndEncode(false);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
} catch (Throwable e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return "";
|
|
||||||
} finally {
|
|
||||||
jsMessageQueue.setPaused(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@JavascriptInterface
|
|
||||||
public void setNativeToJsBridgeMode(int value) {
|
|
||||||
jsMessageQueue.setBridgeMode(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@JavascriptInterface
|
|
||||||
public String retrieveJsMessages(boolean fromOnlineEvent) {
|
|
||||||
return jsMessageQueue.popAndEncode(fromOnlineEvent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ public class NativeToJsMessageQueue {
|
|||||||
|
|
||||||
// Disable sending back native->JS messages during an exec() when the active
|
// Disable sending back native->JS messages during an exec() when the active
|
||||||
// exec() is asynchronous. Set this to true when running bridge benchmarks.
|
// exec() is asynchronous. Set this to true when running bridge benchmarks.
|
||||||
static final boolean DISABLE_EXEC_CHAINING = false;
|
public static final boolean DISABLE_EXEC_CHAINING = false;
|
||||||
|
|
||||||
// Arbitrarily chosen upper limit for how much data to send to JS in one shot.
|
// Arbitrarily chosen upper limit for how much data to send to JS in one shot.
|
||||||
// This currently only chops up on message boundaries. It may be useful
|
// This currently only chops up on message boundaries. It may be useful
|
||||||
|
@ -117,7 +117,7 @@ public class XWalkCordovaWebView extends XWalkView implements CordovaWebView {
|
|||||||
private long lastMenuEventTime = 0;
|
private long lastMenuEventTime = 0;
|
||||||
|
|
||||||
NativeToJsMessageQueue jsMessageQueue;
|
NativeToJsMessageQueue jsMessageQueue;
|
||||||
ExposedJsApi exposedJsApi;
|
XwalkExposedJsApi exposedJsApi;
|
||||||
|
|
||||||
/** custom view created by the browser (a video player for example) */
|
/** custom view created by the browser (a video player for example) */
|
||||||
private View mCustomView;
|
private View mCustomView;
|
||||||
@ -319,7 +319,7 @@ public class XWalkCordovaWebView extends XWalkView implements CordovaWebView {
|
|||||||
extensionManager = new XWalkExtensionManager(this.cordova.getActivity(), this.cordova.getActivity());
|
extensionManager = new XWalkExtensionManager(this.cordova.getActivity(), this.cordova.getActivity());
|
||||||
extensionManager.loadExtensions();
|
extensionManager.loadExtensions();
|
||||||
jsMessageQueue = new NativeToJsMessageQueue(this, cordova);
|
jsMessageQueue = new NativeToJsMessageQueue(this, cordova);
|
||||||
exposedJsApi = new ExposedJsApi(pluginManager, jsMessageQueue);
|
exposedJsApi = new XwalkExposedJsApi(pluginManager, jsMessageQueue);
|
||||||
resourceApi = new CordovaResourceApi(this.getContext(), pluginManager);
|
resourceApi = new CordovaResourceApi(this.getContext(), pluginManager);
|
||||||
exposeJsInterface();
|
exposeJsInterface();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user