[android] Abstract JS->Native API calls into an interface.

setNativeToJsBridgeMode() and poll() can now use the JS interface
exported via addJavascriptInterface if it's available.


Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/commit/898933d5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/tree/898933d5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/diff/898933d5

Branch: refs/heads/master
Commit: 898933d5ee3d6b45335cd944864718aad5a597e0
Parents: 951136b
Author: Andrew Grieve <agri...@chromium.org>
Authored: Thu Sep 6 11:32:09 2012 -0400
Committer: Andrew Grieve <agri...@chromium.org>
Committed: Tue Sep 18 10:46:48 2012 -0400

----------------------------------------------------------------------
 lib/android/exec.js                                |   16 +++++++-------
 lib/android/plugin/android/nativeapiprovider.js    |   13 ++++++++++++
 lib/android/plugin/android/polling.js              |    3 +-
 lib/android/plugin/android/promptbasednativeapi.js |   16 +++++++++++++++
 4 files changed, 39 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/898933d5/lib/android/exec.js
----------------------------------------------------------------------
diff --git a/lib/android/exec.js b/lib/android/exec.js
index b9d3ad5..3a836fe 100644
--- a/lib/android/exec.js
+++ b/lib/android/exec.js
@@ -36,6 +36,7 @@
 var cordova = require('cordova'),
     callback = require('cordova/plugin/android/callback'),
     polling = require('cordova/plugin/android/polling'),
+    nativeApiProvider = require('cordova/plugin/android/nativeapiprovider'),
     jsToNativeBridgeMode,
     nativeToJsBridgeMode,
     jsToNativeModes = {
@@ -47,7 +48,7 @@ var cordova = require('cordova'),
         LOCATION_CHANGE: 2
     },
     nativeToJsModes = {
-        // Polls for messages using the prompt() bridge.
+        // Polls for messages using the JS->Native bridge.
         POLLING: 0,
         // Does an XHR to a local server, which will send back messages. This 
is
         // broken on ICS when a proxy server is configured.
@@ -87,12 +88,10 @@ function androidExec(success, fail, service, action, args) {
 
       if (jsToNativeBridgeMode == jsToNativeModes.LOCATION_CHANGE) {
           window.location = 'http://cdv_exec/' + service + '#' + action + '#' 
+ callbackId + '#' + argsJson;
-      } else if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT) {
+      } else {
           // Explicit cast to string is required on Android 2.1 to convert from
           // a Java string to a JS string.
-          result = '' + _cordovaExec.exec(service, action, callbackId, 
argsJson);
-      } else {
-          result = prompt(argsJson, "gap:"+JSON.stringify([service, action, 
callbackId, true]));
+          result = '' + nativeApiProvider.get().exec(service, action, 
callbackId, argsJson);
       }
 
       // If a result was returned
@@ -178,10 +177,11 @@ androidExec.jsToNativeModes = jsToNativeModes;
 androidExec.nativeToJsModes = nativeToJsModes;
 
 androidExec.setJsToNativeBridgeMode = function(mode) {
-    if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaExec) {
-        console.log('Falling back on PROMPT mode since _cordovaExec is 
missing.');
+    if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) {
+        console.log('Falling back on PROMPT mode since _cordovaNative is 
missing.');
         mode = jsToNativeModes.PROMPT;
     }
+    nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT);
     jsToNativeBridgeMode = mode;
 };
 
@@ -197,7 +197,7 @@ androidExec.setNativeToJsBridgeMode = function(mode) {
 
     nativeToJsBridgeMode = mode;
     // Tell the native side to switch modes.
-    prompt(mode, "gap_bridge_mode:");
+    nativeApiProvider.get().setNativeToJsBridgeMode(mode);
 
     if (mode == nativeToJsModes.POLLING) {
         polling.start();

http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/898933d5/lib/android/plugin/android/nativeapiprovider.js
----------------------------------------------------------------------
diff --git a/lib/android/plugin/android/nativeapiprovider.js 
b/lib/android/plugin/android/nativeapiprovider.js
new file mode 100644
index 0000000..43ae53d
--- /dev/null
+++ b/lib/android/plugin/android/nativeapiprovider.js
@@ -0,0 +1,13 @@
+/**
+ * Exports the ExposedJsApi.java object if available, otherwise exports the 
PromptBasedNativeApi.
+ */
+
+var nativeApi = this._cordovaNative || 
require('cordova/plugin/android/promptbasednativeapi');
+var currentApi = nativeApi;
+
+module.exports = {
+    get: function() { return currentApi },
+    setPreferPrompt: function(value) {
+        currentApi = value ? 
require('cordova/plugin/android/promptbasednativeapi') : nativeApi;
+    }
+};

http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/898933d5/lib/android/plugin/android/polling.js
----------------------------------------------------------------------
diff --git a/lib/android/plugin/android/polling.js 
b/lib/android/plugin/android/polling.js
index 95bca07..b3b99bb 100644
--- a/lib/android/plugin/android/polling.js
+++ b/lib/android/plugin/android/polling.js
@@ -20,11 +20,12 @@
 */
 
 var cordova = require('cordova'),
+    nativeApiProvider = require('cordova/plugin/android/nativeapiprovider'),
     POLL_INTERVAL = 50,
     enabled = false;
 
 function pollOnce() {
-    var msg = prompt("", "gap_poll:");
+    var msg = nativeApiProvider.get().retrieveJsMessages();
     if (msg) {
         try {
             eval(""+msg);

http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/898933d5/lib/android/plugin/android/promptbasednativeapi.js
----------------------------------------------------------------------
diff --git a/lib/android/plugin/android/promptbasednativeapi.js 
b/lib/android/plugin/android/promptbasednativeapi.js
new file mode 100644
index 0000000..e89084d
--- /dev/null
+++ b/lib/android/plugin/android/promptbasednativeapi.js
@@ -0,0 +1,16 @@
+/**
+ * Implements the API of ExposedJsApi.java, but uses prompt() to communicate.
+ * This is used only on the 2.3 simulator, where addJavascriptInterface() is 
broken.
+ */
+
+module.exports = {
+    exec: function(service, action, callbackId, argsJson) {
+        return prompt(argsJson, 'gap:'+JSON.stringify([service, action, 
callbackId]));
+    },
+    setNativeToJsBridgeMode: function(value) {
+        prompt(value, 'gap_bridge_mode:');
+    },
+    retrieveJsMessages: function() {
+        return prompt('', 'gap_poll:');
+    }
+};

Reply via email to