From a2f8c9c75b4fa2d0ce787d8b75bf7f161d6699fc Mon Sep 17 00:00:00 2001 From: Andrew Grieve Date: Wed, 26 Feb 2014 20:23:07 -0500 Subject: [PATCH] CB-6047 Fix online sometimes getting in a bad state on page transitions. The online bridge toggles between on & off. Turns out that starting with Android 4.3, navigation resets the online state, so the code had a 50/50 chance of being caught in the wrong state. We now forcefully reset the online state on page transitions. --- .../org/apache/cordova/NativeToJsMessageQueue.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/framework/src/org/apache/cordova/NativeToJsMessageQueue.java b/framework/src/org/apache/cordova/NativeToJsMessageQueue.java index dddc022b..5ee74f53 100755 --- a/framework/src/org/apache/cordova/NativeToJsMessageQueue.java +++ b/framework/src/org/apache/cordova/NativeToJsMessageQueue.java @@ -102,7 +102,8 @@ public class NativeToJsMessageQueue { synchronized (this) { activeListenerIndex = value; BridgeMode activeListener = registeredListeners[value]; - if (!paused && !queue.isEmpty() && activeListener != null) { + activeListener.reset(); + if (!paused && !queue.isEmpty()) { activeListener.onNativeToJsMessageAvailable(); } } @@ -117,6 +118,7 @@ public class NativeToJsMessageQueue { synchronized (this) { queue.clear(); setBridgeMode(DEFAULT_BRIDGE_MODE); + registeredListeners[activeListenerIndex].reset(); } } @@ -249,7 +251,7 @@ public class NativeToJsMessageQueue { private void enqueueMessage(JsMessage message) { synchronized (this) { queue.add(message); - if (!paused && registeredListeners[activeListenerIndex] != null) { + if (!paused) { registeredListeners[activeListenerIndex].onNativeToJsMessageAvailable(); } } @@ -264,7 +266,7 @@ public class NativeToJsMessageQueue { paused = value; if (!value) { synchronized (this) { - if (!queue.isEmpty() && registeredListeners[activeListenerIndex] != null) { + if (!queue.isEmpty()) { registeredListeners[activeListenerIndex].onNativeToJsMessageAvailable(); } } @@ -278,6 +280,7 @@ public class NativeToJsMessageQueue { private abstract class BridgeMode { abstract void onNativeToJsMessageAvailable(); void notifyOfFlush(boolean fromOnlineEvent) {} + void reset() {} } /** Uses JS polls for messages on a timer.. */ @@ -304,7 +307,7 @@ public class NativeToJsMessageQueue { /** Uses online/offline events to tell the JS when to poll for messages. */ private class OnlineEventsBridgeMode extends BridgeMode { - boolean online = false; + private boolean online; final Runnable runnable = new Runnable() { public void run() { if (!queue.isEmpty()) { @@ -312,7 +315,8 @@ public class NativeToJsMessageQueue { } } }; - OnlineEventsBridgeMode() { + @Override void reset() { + online = false; webView.setNetworkAvailable(true); } @Override void onNativeToJsMessageAvailable() {