Tweak the online bridge to not send excess online events.

It does so by having the JS tell it when online events have fired.
(cherry picked from commit 166b35bc6c5977cf547f4093690d554b57cb855a)


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/edb35b5a
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/edb35b5a
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/edb35b5a

Branch: refs/heads/2.9.x
Commit: edb35b5a6d13159c69e1fc75ddbf8a149df6498e
Parents: bb7bc33
Author: Andrew Grieve <[email protected]>
Authored: Thu Aug 15 15:55:08 2013 -0400
Committer: Andrew Grieve <[email protected]>
Committed: Tue Oct 22 15:16:07 2013 -0400

----------------------------------------------------------------------
 .../org/apache/cordova/CordovaChromeClient.java |  2 +-
 .../src/org/apache/cordova/ExposedJsApi.java    |  6 ++--
 .../apache/cordova/NativeToJsMessageQueue.java  | 29 ++++++++++++--------
 3 files changed, 22 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/edb35b5a/framework/src/org/apache/cordova/CordovaChromeClient.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CordovaChromeClient.java 
b/framework/src/org/apache/cordova/CordovaChromeClient.java
index 4d338a5..3c0abd1 100755
--- a/framework/src/org/apache/cordova/CordovaChromeClient.java
+++ b/framework/src/org/apache/cordova/CordovaChromeClient.java
@@ -234,7 +234,7 @@ public class CordovaChromeClient extends WebChromeClient {
 
         // Polling for JavaScript messages 
         else if (reqOk && defaultValue != null && 
defaultValue.equals("gap_poll:")) {
-            String r = this.appView.exposedJsApi.retrieveJsMessages();
+            String r = 
this.appView.exposedJsApi.retrieveJsMessages("1".equals(message));
             result.confirm(r == null ? "" : r);
         }
 

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/edb35b5a/framework/src/org/apache/cordova/ExposedJsApi.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/ExposedJsApi.java 
b/framework/src/org/apache/cordova/ExposedJsApi.java
index c3887cf..e2d730c 100755
--- a/framework/src/org/apache/cordova/ExposedJsApi.java
+++ b/framework/src/org/apache/cordova/ExposedJsApi.java
@@ -54,7 +54,7 @@ import org.json.JSONException;
             pluginManager.exec(service, action, callbackId, arguments);
             String ret = "";
             if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING) {
-                ret = jsMessageQueue.popAndEncode();
+                ret = jsMessageQueue.popAndEncode(false);
             }
             return ret;
         } catch (Throwable e) {
@@ -71,7 +71,7 @@ import org.json.JSONException;
     }
     
     @JavascriptInterface
-    public String retrieveJsMessages() {
-        return jsMessageQueue.popAndEncode();
+    public String retrieveJsMessages(boolean fromOnlineEvent) {
+        return jsMessageQueue.popAndEncode(fromOnlineEvent);
     }
 }

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/edb35b5a/framework/src/org/apache/cordova/NativeToJsMessageQueue.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/NativeToJsMessageQueue.java 
b/framework/src/org/apache/cordova/NativeToJsMessageQueue.java
index 8a13213..328fb33 100755
--- a/framework/src/org/apache/cordova/NativeToJsMessageQueue.java
+++ b/framework/src/org/apache/cordova/NativeToJsMessageQueue.java
@@ -138,8 +138,9 @@ public class NativeToJsMessageQueue {
      * Combines as many messages as possible, while staying under 
MAX_PAYLOAD_SIZE.
      * Returns null if the queue is empty.
      */
-    public String popAndEncode() {
+    public String popAndEncode(boolean fromOnlineEvent) {
         synchronized (this) {
+            
registeredListeners[activeListenerIndex].notifyOfFlush(fromOnlineEvent);
             if (queue.isEmpty()) {
                 return null;
             }
@@ -274,12 +275,13 @@ public class NativeToJsMessageQueue {
         return paused;
     }
 
-    private interface BridgeMode {
-        void onNativeToJsMessageAvailable();
+    private abstract class BridgeMode {
+        abstract void onNativeToJsMessageAvailable();
+        void notifyOfFlush(boolean fromOnlineEvent) {}
     }
     
     /** Uses webView.loadUrl("javascript:") to execute messages. */
-    private class LoadUrlBridgeMode implements BridgeMode {
+    private class LoadUrlBridgeMode extends BridgeMode {
         final Runnable runnable = new Runnable() {
             public void run() {
                 String js = popAndEncodeAsJs();
@@ -289,18 +291,17 @@ public class NativeToJsMessageQueue {
             }
         };
         
-        public void onNativeToJsMessageAvailable() {
+        @Override void onNativeToJsMessageAvailable() {
             cordova.getActivity().runOnUiThread(runnable);
         }
     }
 
     /** Uses online/offline events to tell the JS when to poll for messages. */
-    private class OnlineEventsBridgeMode implements BridgeMode {
-        boolean online = true;
+    private class OnlineEventsBridgeMode extends BridgeMode {
+        boolean online = false;
         final Runnable runnable = new Runnable() {
             public void run() {
                 if (!queue.isEmpty()) {
-                    online = !online;
                     webView.setNetworkAvailable(online);
                 }
             }                
@@ -308,16 +309,22 @@ public class NativeToJsMessageQueue {
         OnlineEventsBridgeMode() {
             webView.setNetworkAvailable(true);
         }
-        public void onNativeToJsMessageAvailable() {
+        @Override void onNativeToJsMessageAvailable() {
             cordova.getActivity().runOnUiThread(runnable);
         }
+        // Track when online/offline events are fired so that we don't fire 
excess events.
+        @Override void notifyOfFlush(boolean fromOnlineEvent) {
+            if (fromOnlineEvent) {
+                online = !online;
+            }
+        }
     }
     
     /**
      * Uses Java reflection to access an API that lets us eval JS.
      * Requires Android 3.2.4 or above. 
      */
-    private class PrivateApiBridgeMode implements BridgeMode {
+    private class PrivateApiBridgeMode extends BridgeMode {
        // Message added in commit:
        // 
http://omapzoom.org/?p=platform/frameworks/base.git;a=commitdiff;h=9497c5f8c4bc7c47789e5ccde01179abc31ffeb2
        // Which first appeared in 3.2.4ish.
@@ -355,7 +362,7 @@ public class NativeToJsMessageQueue {
                }
        }
        
-        public void onNativeToJsMessageAvailable() {
+        @Override void onNativeToJsMessageAvailable() {
                if (sendMessageMethod == null && !initFailed) {
                        initReflection();
                }

Reply via email to