You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by an...@apache.org on 2012/08/24 23:57:39 UTC

[39/50] [abbrv] js commit: [android] Implement online events based Native->JS bridge.

[android] Implement online events based Native->JS bridge.


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/0d43c0b6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/tree/0d43c0b6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/diff/0d43c0b6

Branch: refs/heads/master
Commit: 0d43c0b62078b4909f4d5c718903bd14aac0b8ab
Parents: e472851
Author: Andrew Grieve <ag...@chromium.org>
Authored: Tue Aug 21 14:09:40 2012 -0400
Committer: Anis Kadri <an...@gmail.com>
Committed: Fri Aug 24 13:49:59 2012 -0700

----------------------------------------------------------------------
 lib/android/exec.js                   |   24 ++++++++++++++++++++++--
 lib/android/plugin/android/polling.js |   27 +++++++++++++++++----------
 2 files changed, 39 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/0d43c0b6/lib/android/exec.js
----------------------------------------------------------------------
diff --git a/lib/android/exec.js b/lib/android/exec.js
index 43bcd5f..4c300c5 100644
--- a/lib/android/exec.js
+++ b/lib/android/exec.js
@@ -23,10 +23,18 @@ var cordova = require('cordova'),
         LOCATION_CHANGE: 2  // Not yet implemented
     },
     nativeToJsModes = {
+        // Polls for messages using the prompt() 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.
         HANGING_GET: 1,
-        LOAD_URL: 2,  // Not yet implemented
-        ONLINE_EVENT: 3,  // Not yet implemented
+        // For LOAD_URL to be viable, it would need to have a work-around for
+        // the bug where the soft-keyboard gets dismissed when a message is sent.
+        LOAD_URL: 2,
+        // For the ONLINE_EVENT to be viable, it would need to intercept all event
+        // listeners (both through addEventListener and window.ononline) as well
+        // as set the navigator property itself.
+        ONLINE_EVENT: 3,
         PRIVATE_API: 4  // Not yet implemented
     };
 
@@ -105,6 +113,10 @@ function androidExec(success, fail, service, action, args) {
     }
 };
 
+function onOnLineEvent(e) {
+    while (polling.pollOnce());
+}
+
 androidExec.jsToNativeModes = jsToNativeModes;
 androidExec.nativeToJsModes = nativeToJsModes;
 
@@ -124,14 +136,22 @@ androidExec.setNativeToJsBridgeMode = function(mode) {
         polling.stop();
     } else if (nativeToJsBridgeMode == nativeToJsModes.HANGING_GET) {
         callback.stop();
+    } else if (nativeToJsBridgeMode == nativeToJsModes.ONLINE_EVENT) {
+        window.removeEventListener('online', onOnLineEvent, false);
+        window.removeEventListener('offline', onOnLineEvent, false);
     }
+
     nativeToJsBridgeMode = mode;
     // Tell the native side to switch modes.
     prompt(mode, "gap_bridge_mode:");
+
     if (mode == nativeToJsModes.POLLING) {
         polling.start();
     } else if (mode == nativeToJsModes.HANGING_GET) {
         callback.start();
+    } else if (mode == nativeToJsModes.ONLINE_EVENT) {
+        window.addEventListener('online', onOnLineEvent, false);
+        window.addEventListener('offline', onOnLineEvent, false);
     }
 };
 

http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/0d43c0b6/lib/android/plugin/android/polling.js
----------------------------------------------------------------------
diff --git a/lib/android/plugin/android/polling.js b/lib/android/plugin/android/polling.js
index 406dc62..71b7c37 100644
--- a/lib/android/plugin/android/polling.js
+++ b/lib/android/plugin/android/polling.js
@@ -1,12 +1,8 @@
 var cordova = require('cordova'),
-    period = 50,
+    POLL_INTERVAL = 50,
     enabled = false;
 
-
-function doPoll() {
-    if (!enabled) {
-        return;
-    }
+function pollOnce() {
     var msg = prompt("", "gap_poll:");
     if (msg) {
         try {
@@ -16,10 +12,20 @@ function doPoll() {
             console.log("JSCallbackPolling: Message from Server: " + msg);
             console.log("JSCallbackPolling Error: "+e);
         }
-        setTimeout(doPoll, 1);
-    } else {
-        setTimeout(doPoll, period);
+        return true;
     }
+    return false;
+}
+
+function doPoll() {
+    if (!enabled) {
+        return;
+    }
+    var nextDelay = POLL_INTERVAL;
+    if (pollOnce()) {
+        nextDelay = 0;
+    }
+    setTimeout(doPoll, nextDelay);
 }
 
 module.exports = {
@@ -29,6 +35,7 @@ module.exports = {
     },
     stop: function() {
         enabled = false;
-    }
+    },
+    pollOnce: pollOnce
 };