diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index d10d04bc0..58e7e3db8 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -149,6 +149,7 @@ public class LinphoneManager implements LinphoneCoreListener { private static boolean sExited; private String contactParams; private boolean mAudioFocused; + private boolean isNetworkReachable; private WakeLock mIncallWakeLock; @@ -886,19 +887,42 @@ public class LinphoneManager implements LinphoneCoreListener { initAccounts(); //init network state - NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo(); - SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(mServiceContext); - boolean wifiOnly = pref.getBoolean(getString(R.string.pref_wifi_only_key), mR.getBoolean(R.bool.pref_wifi_only_default)); - boolean isConnected = false; - if (networkInfo != null) { - isConnected = networkInfo.getState() == NetworkInfo.State.CONNECTED && (networkInfo.getTypeName().equals("WIFI") || (networkInfo.getTypeName().equals("mobile") && !wifiOnly)); - } - mLc.setNetworkReachable(isConnected); + updateNetworkReachability(); } catch (LinphoneCoreException e) { throw new LinphoneConfigException(getString(R.string.wrong_settings),e); } } + public void updateNetworkReachability() { + ConnectivityManager cm = (ConnectivityManager) mServiceContext.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo eventInfo = cm.getActiveNetworkInfo(); + + if (eventInfo == null || eventInfo.getState() == NetworkInfo.State.DISCONNECTED) { + Log.i("No connectivity: setting network unreachable"); + if (isNetworkReachable) { + isNetworkReachable = false; + mLc.setNetworkReachable(isNetworkReachable); + } + } else if (eventInfo.getState() == NetworkInfo.State.CONNECTED){ + manageTunnelServer(eventInfo); + SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(mServiceContext); + boolean wifiOnly = pref.getBoolean(getString(R.string.pref_wifi_only_key), mR.getBoolean(R.bool.pref_wifi_only_default)); + if ((eventInfo.getTypeName().equals("WIFI")) || (!eventInfo.getTypeName().equals("WIFI") && !wifiOnly)) { + if (!isNetworkReachable) { + isNetworkReachable = true; + mLc.setNetworkReachable(isNetworkReachable); + Log.i(eventInfo.getTypeName()," connected: setting network reachable (network = " + eventInfo.getTypeName() + ")"); + } + } else { + if (isNetworkReachable) { + isNetworkReachable = false; + mLc.setNetworkReachable(isNetworkReachable); + Log.i(eventInfo.getTypeName()," connected: wifi only activated, setting network unreachable (network = " + eventInfo.getTypeName() + ")"); + } + } + } + } + private void setSignalingTransportsFromConfiguration(Transports t) { Transports ports = new Transports(t); boolean useRandomPort = getPrefBoolean(R.string.pref_transport_use_random_ports_key, mR.getBoolean(R.bool.pref_transport_use_random_ports_default)); @@ -1042,22 +1066,7 @@ public class LinphoneManager implements LinphoneCoreListener { */ public void connectivityChanged(ConnectivityManager cm, boolean noConnectivity) { NetworkInfo eventInfo = cm.getActiveNetworkInfo(); - - if (noConnectivity || eventInfo == null || eventInfo.getState() == NetworkInfo.State.DISCONNECTED) { - Log.i("No connectivity: setting network unreachable"); - mLc.setNetworkReachable(false); - } else if (eventInfo.getState() == NetworkInfo.State.CONNECTED){ - manageTunnelServer(eventInfo); - SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(mServiceContext); - boolean wifiOnly = pref.getBoolean(getString(R.string.pref_wifi_only_key), mR.getBoolean(R.bool.pref_wifi_only_default)); - if (eventInfo.getTypeName().equals("WIFI") || (eventInfo.getTypeName().equals("mobile") && !wifiOnly)) { - mLc.setNetworkReachable(true); - Log.i(eventInfo.getTypeName()," connected: setting network reachable"); - } else { - mLc.setNetworkReachable(false); - Log.i(eventInfo.getTypeName()," connected: wifi only activated, setting network unreachable"); - } - } + updateNetworkReachability(); if (connectivityListener != null) { connectivityListener.onConnectivityChanged(mServiceContext, eventInfo, cm); diff --git a/src/org/linphone/PreferencesFragment.java b/src/org/linphone/PreferencesFragment.java index 89360de57..d2ad9f4f9 100644 --- a/src/org/linphone/PreferencesFragment.java +++ b/src/org/linphone/PreferencesFragment.java @@ -50,8 +50,6 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; import android.os.Bundle; import android.os.Handler; import android.preference.CheckBoxPreference; @@ -233,16 +231,7 @@ public class PreferencesFragment extends PreferencesListFragment implements EcCa wifiOnly.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - boolean isSettingActivated = (Boolean) newValue; - - ConnectivityManager cm = (ConnectivityManager) LinphoneActivity.instance().getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo eventInfo = cm.getActiveNetworkInfo(); - - LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); - if (eventInfo != null && eventInfo.getTypeName() != null && eventInfo.getTypeName().equals("mobile") && lc != null) { - lc.setNetworkReachable(!isSettingActivated); - } - + LinphoneManager.getInstance().updateNetworkReachability(); return true; } });