From 42170ff4fd6a96573846097b98e49e66270dbe4e Mon Sep 17 00:00:00 2001 From: "m.cappello" Date: Fri, 21 Feb 2020 10:46:25 +0100 Subject: [PATCH] Now when call resetBindAll always force bindProcessToNetwork(null) without network connection connected. Events such network receiver and network callback are correctly managed and unregistered before register new events. This fix try to avoid double invoking of the same event and cause problems when connecting to a network with bindAll parameter set to TRUE and subsequently disconnected. --- src/android/wifiwizard2/WifiWizard2.java | 38 ++++++++++++++++++------ 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/android/wifiwizard2/WifiWizard2.java b/src/android/wifiwizard2/WifiWizard2.java index df8f2df..bdbecae 100644 --- a/src/android/wifiwizard2/WifiWizard2.java +++ b/src/android/wifiwizard2/WifiWizard2.java @@ -1681,6 +1681,12 @@ private void registerBindALL(int netID){ if( API_VERSION > 21 ){ Log.d(TAG, "registerBindALL: registering net changed receiver"); desired = new AP(netID,null,null); + + try { + // Unregister net changed receiver -- should only be registered in API versions > 21 + cordova.getActivity().getApplicationContext().unregisterReceiver(networkChangedReceiver); + } catch (Exception e) {} + cordova.getActivity().getApplicationContext().registerReceiver(networkChangedReceiver, NETWORK_STATE_CHANGED_FILTER); } else { Log.d(TAG, "registerBindALL: API older than 21, bindall ignored."); @@ -1695,11 +1701,15 @@ private void registerBindALL(int netID){ * being routed through Wifi. */ private void maybeResetBindALL(){ + maybeResetBindALL(false); + } + + private void maybeResetBindALL(boolean forceReset){ Log.d(TAG, "maybeResetBindALL"); // desired should have a value if receiver is registered - if( desired != null ){ + if( desired!=null || forceReset ){ if( API_VERSION > 21 ){ @@ -1710,13 +1720,6 @@ private void maybeResetBindALL(){ } - // Lollipop OS or newer - if ( API_VERSION >= 23 ) { - connectivityManager.bindProcessToNetwork(null); - } else if( API_VERSION >= 21 && API_VERSION < 23 ){ - connectivityManager.setProcessDefaultNetwork(null); - } - if ( API_VERSION > 21 && networkCallback != null) { try { @@ -1725,6 +1728,13 @@ private void maybeResetBindALL(){ } catch (Exception e) {} } + // Lollipop OS or newer + if ( API_VERSION >= 23 ) { + connectivityManager.bindProcessToNetwork(null); + } else if( API_VERSION >= 21 && API_VERSION < 23 ){ + connectivityManager.setProcessDefaultNetwork(null); + } + networkCallback = null; previous = null; desired = null; @@ -1742,7 +1752,7 @@ private void resetBindAll(CallbackContext callbackContext) { Log.d(TAG, "WifiWizard2: resetBindALL"); try { - maybeResetBindALL(); + maybeResetBindALL(true); callbackContext.success("Successfully reset BindALL"); } catch (Exception e) { Log.e(TAG, "InterruptedException error.", e); @@ -1804,6 +1814,11 @@ public void onAvailable(Network network) { } }; + try { + // Same behavior as releaseNetworkRequest + connectivityManager.unregisterNetworkCallback(networkCallback); // Added in API 21 + } catch (Exception e) {} + connectivityManager.requestNetwork(request, networkCallback); // Only lollipop (API 21 && 22) use setProcessDefaultNetwork, API < 21 already does this by default @@ -1824,6 +1839,11 @@ public void onAvailable(Network network) { } }; + try { + // Same behavior as releaseNetworkRequest + connectivityManager.unregisterNetworkCallback(networkCallback); // Added in API 21 + } catch (Exception e) {} + connectivityManager.requestNetwork(request, networkCallback); } else {