diff --git a/res/xml/account_preferences.xml b/res/xml/account_preferences.xml index 042e9241f..187e482fa 100644 --- a/res/xml/account_preferences.xml +++ b/res/xml/account_preferences.xml @@ -28,6 +28,10 @@ android:title="@string/pref_advanced" android:key="@string/pref_advanced_key"> + + - - entries = new ArrayList(); + List values = new ArrayList(); + entries.add(getString(R.string.pref_transport_udp)); + values.add(getString(R.string.pref_transport_udp_key)); + entries.add(getString(R.string.pref_transport_tcp)); + values.add(getString(R.string.pref_transport_tcp_key)); + + if (!getResources().getBoolean(R.bool.disable_all_security_features_for_markets)) { + entries.add(getString(R.string.pref_transport_tls)); + values.add(getString(R.string.pref_transport_tls_key)); + } + setListPreferenceValues(pref, entries, values); + + pref.setSummary(mPrefs.getAccountTransportString(n)); + pref.setDefaultValue(mPrefs.getAccountTransportKey(n)); + } + + private static void setListPreferenceValues(ListPreference pref, List entries, List values) { + CharSequence[] contents = new CharSequence[entries.size()]; + entries.toArray(contents); + pref.setEntries(contents); + contents = new CharSequence[values.size()]; + values.toArray(contents); + pref.setEntryValues(contents); + } } diff --git a/src/org/linphone/LinphonePreferences.java b/src/org/linphone/LinphonePreferences.java index 98a53a9c0..0c1e0af9e 100644 --- a/src/org/linphone/LinphonePreferences.java +++ b/src/org/linphone/LinphonePreferences.java @@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneAuthInfo; import org.linphone.core.LinphoneCore; +import org.linphone.core.LinphoneAddress.TransportType; import org.linphone.core.LinphoneCore.FirewallPolicy; import org.linphone.core.LinphoneCore.MediaEncryption; import org.linphone.core.LinphoneCore.RegistrationState; @@ -154,6 +155,7 @@ public class LinphonePreferences { private boolean tempOutboundProxy; private String tempContactsParams; private String tempExpire; + private TransportType tempTransport; /** * Creates a new account using values previously set using setNew* functions @@ -163,9 +165,15 @@ public class LinphonePreferences { String identity = "sip:" + tempUsername + "@" + tempDomain; String proxy = "sip:"; proxy += tempProxy == null ? tempDomain : tempProxy; + LinphoneAddress proxyAddr = LinphoneCoreFactory.instance().createLinphoneAddress(proxy); String route = tempOutboundProxy ? tempProxy : null; - LinphoneProxyConfig prxCfg = LinphoneCoreFactory.instance().createProxyConfig(identity, proxy, route, true); + if (tempTransport == null) { + tempTransport = TransportType.LinphoneTransportUdp; + } + proxyAddr.setTransport(tempTransport); + + LinphoneProxyConfig prxCfg = LinphoneCoreFactory.instance().createProxyConfig(identity, proxyAddr.asStringUriOnly(), route, true); if (tempContactsParams != null) prxCfg.setContactUriParameters(tempContactsParams); if (tempExpire != null) { @@ -190,6 +198,80 @@ public class LinphonePreferences { tempOutboundProxy = false; tempContactsParams = null; tempExpire = null; + tempTransport = null; + } + + public void setNewAccountTransport(TransportType transport) { + tempTransport = transport; + } + + public void setAccountTransport(int n, String transport) { + LinphoneProxyConfig proxyConfig = getProxyConfig(n); + + if (proxyConfig != null && transport != null) { + LinphoneAddress proxyAddr; + try { + proxyAddr = LinphoneCoreFactory.instance().createLinphoneAddress(proxyConfig.getProxy()); + + if (transport.equals(getString(R.string.pref_transport_udp_key))) { + proxyAddr.setTransport(TransportType.LinphoneTransportUdp); + } else if (transport.equals(getString(R.string.pref_transport_tcp_key))) { + proxyAddr.setTransport(TransportType.LinphoneTransportTcp); + } else if (transport.equals(getString(R.string.pref_transport_tls_key))) { + proxyAddr.setTransport(TransportType.LinphoneTransportTls); + } + + LinphoneProxyConfig prxCfg = getProxyConfig(n); + prxCfg.setProxy(proxyAddr.asStringUriOnly()); + prxCfg.done(); + + if (isAccountOutboundProxySet(n)) { + setAccountOutboundProxyEnabled(n, true); + } + } catch (LinphoneCoreException e) { + e.printStackTrace(); + } + } + } + + public TransportType getAccountTransport(int n) { + TransportType transport = null; + LinphoneProxyConfig proxyConfig = getProxyConfig(n); + + if (proxyConfig != null) { + LinphoneAddress proxyAddr; + try { + proxyAddr = LinphoneCoreFactory.instance().createLinphoneAddress(proxyConfig.getProxy()); + transport = proxyAddr.getTransport(); + } catch (LinphoneCoreException e) { + e.printStackTrace(); + } + } + + return transport; + } + + public String getAccountTransportKey(int n) { + TransportType transport = getAccountTransport(n); + String key = getString(R.string.pref_transport_udp_key); + + if (transport != null && transport == TransportType.LinphoneTransportTcp) + key = getString(R.string.pref_transport_tcp_key); + else if (transport != null && transport == TransportType.LinphoneTransportTls) + key = getString(R.string.pref_transport_tls_key); + + return key; + } + + public String getAccountTransportString(int n) { + TransportType transport = getAccountTransport(n); + + if (transport != null && transport == TransportType.LinphoneTransportTcp) + return getString(R.string.pref_transport_tcp); + else if (transport != null && transport == TransportType.LinphoneTransportTls) + return getString(R.string.pref_transport_tls); + + return getString(R.string.pref_transport_udp); } public void setNewAccountUsername(String username) { @@ -278,14 +360,21 @@ public class LinphonePreferences { if (proxy == null || proxy.length() <= 0) { proxy = getAccountDomain(n); } + if (!proxy.contains("sip:")) { proxy = "sip:" + proxy; } try { + LinphoneAddress proxyAddr = LinphoneCoreFactory.instance().createLinphoneAddress(proxy); + if (!proxy.contains("transport=")) { + proxyAddr.setTransport(getAccountTransport(n)); + } + LinphoneProxyConfig prxCfg = getProxyConfig(n); - prxCfg.setProxy(proxy); + prxCfg.setProxy(proxyAddr.asStringUriOnly()); prxCfg.done(); + if (isAccountOutboundProxySet(n)) { setAccountOutboundProxyEnabled(n, true); } @@ -296,9 +385,6 @@ public class LinphonePreferences { public String getAccountProxy(int n) { String proxy = getProxyConfig(n).getProxy(); - if (proxy != null && proxy.startsWith("sip:")) { - proxy = proxy.substring(4); - } return proxy; } @@ -311,9 +397,6 @@ public class LinphonePreferences { LinphoneProxyConfig prxCfg = getProxyConfig(n); if (enabled) { String route = prxCfg.getProxy(); - if (!route.contains("sip:")) { - route = "sip:" + route; - } prxCfg.setRoute(route); } else { prxCfg.setRoute(null); @@ -568,14 +651,6 @@ public class LinphonePreferences { } } - public boolean isUpnpEnabled() { - return getLc().upnpAvailable() && getLc().getFirewallPolicy() == FirewallPolicy.UseUpnp; - } - - public boolean isIceEnabled() { - return getLc().getFirewallPolicy() == FirewallPolicy.UseIce; - } - public void useRandomPort(boolean enabled) { useRandomPort(enabled, true); } @@ -586,92 +661,39 @@ public class LinphonePreferences { if (enabled) { setSipPort(LINPHONE_CORE_RANDOM_PORT); } else { - if (getTransport().equals(getString(R.string.pref_transport_tls))) - setSipPort(5061); - else - setSipPort(5060); + setSipPort(5060); } } } - + public boolean isUsingRandomPort() { return getConfig().getBool("app", "random_port", true); } - + public String getSipPort() { Transports transports = getLc().getSignalingTransportPorts(); int port; if (transports.udp > 0) port = transports.udp; - else if (transports.tcp > 0) - port = transports.tcp; else - port = transports.tls; + port = transports.tcp; return String.valueOf(port); } - + public void setSipPort(int port) { Transports transports = getLc().getSignalingTransportPorts(); - if (transports.udp > 0) - transports.udp = port; - else if (transports.tcp > 0) - transports.tcp = port; - else - transports.tls = port; + transports.udp = port; + transports.tcp = port; + transports.tls = LINPHONE_CORE_RANDOM_PORT; getLc().setSignalingTransportPorts(transports); } - - public String getTransportKey() { - Transports transports = getLc().getSignalingTransportPorts(); - String transport = getString(R.string.pref_transport_udp_key); - if (transports.tcp > 0) - transport = getString(R.string.pref_transport_tcp_key); - else if (transports.tls > 0) - transport = getString(R.string.pref_transport_tls_key); - return transport; + + public boolean isUpnpEnabled() { + return getLc().upnpAvailable() && getLc().getFirewallPolicy() == FirewallPolicy.UseUpnp; } - public String getTransport() { - Transports transports = getLc().getSignalingTransportPorts(); - String transport = getString(R.string.pref_transport_udp); - if (transports.tcp > 0) - transport = getString(R.string.pref_transport_tcp); - else if (transports.tls > 0) - transport = getString(R.string.pref_transport_tls); - return transport; - } - - public void setTransport(String transportKey) { - if (transportKey == null) - return; - - Transports transports = getLc().getSignalingTransportPorts(); - if (transports.udp > 0) { - if (transportKey.equals(getString(R.string.pref_transport_tcp_key))) { - transports.tcp = transports.udp; - transports.udp = transports.tls; - } else if (transportKey.equals(getString(R.string.pref_transport_tls_key))) { - transports.tls = transports.udp; - transports.udp = transports.tcp; - } - } else if (transports.tcp > 0) { - if (transportKey.equals(getString(R.string.pref_transport_udp_key))) { - transports.udp = transports.tcp; - transports.tcp = transports.tls; - } else if (transportKey.equals(getString(R.string.pref_transport_tls_key))) { - transports.tls = transports.tcp; - transports.tcp = transports.udp; - } - } else if (transports.tls > 0) { - if (transportKey.equals(getString(R.string.pref_transport_udp_key))) { - transports.udp = transports.tls; - transports.tls = transports.tcp; - } else if (transportKey.equals(getString(R.string.pref_transport_tcp_key))) { - transports.tcp = transports.tls; - transports.tls = transports.udp; - } - } - getLc().setSignalingTransportPorts(transports); + public boolean isIceEnabled() { + return getLc().getFirewallPolicy() == FirewallPolicy.UseIce; } public MediaEncryption getMediaEncryption() { diff --git a/src/org/linphone/SettingsFragment.java b/src/org/linphone/SettingsFragment.java index 554882320..fd34df775 100644 --- a/src/org/linphone/SettingsFragment.java +++ b/src/org/linphone/SettingsFragment.java @@ -377,30 +377,6 @@ public class SettingsFragment extends PreferencesListFragment implements EcCalib key = getString(R.string.pref_media_encryption_key_zrtp); pref.setDefaultValue(key); } - - private void initializeTransportPreferences(ListPreference pref) { - List entries = new ArrayList(); - List values = new ArrayList(); - entries.add(getString(R.string.pref_transport_udp)); - values.add(getString(R.string.pref_transport_udp_key)); - entries.add(getString(R.string.pref_transport_tcp)); - values.add(getString(R.string.pref_transport_tcp_key)); - - if (!getResources().getBoolean(R.bool.disable_all_security_features_for_markets)) { - entries.add(getString(R.string.pref_transport_tls)); - values.add(getString(R.string.pref_transport_tls_key)); - } - setListPreferenceValues(pref, entries, values); - - String value = mPrefs.getTransport(); - pref.setSummary(value); - String key = getString(R.string.pref_transport_udp_key); - if (value.equals(getString(R.string.pref_transport_tcp))) - key = getString(R.string.pref_transport_tcp_key); - else if (value.equals(getString(R.string.pref_transport_tls))) - key = getString(R.string.pref_transport_tls_key); - pref.setDefaultValue(key); - } private void initializePreferredVideoSizePreferences(ListPreference pref) { List entries = new ArrayList(); @@ -631,8 +607,7 @@ public class SettingsFragment extends PreferencesListFragment implements EcCalib private void initNetworkSettings() { initMediaEncryptionPreference((ListPreference) findPreference(getString(R.string.pref_media_encryption_key))); - initializeTransportPreferences((ListPreference) findPreference(getString(R.string.pref_transport_key))); - + ((CheckBoxPreference) findPreference(getString(R.string.pref_wifi_only_key))).setChecked(mPrefs.isWifiOnlyEnabled()); // Disable UPnP if ICE si enabled, or disable ICE if UPnP is enabled @@ -731,15 +706,6 @@ public class SettingsFragment extends PreferencesListFragment implements EcCalib } }); - findPreference(getString(R.string.pref_transport_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - mPrefs.setTransport(newValue.toString()); - preference.setSummary(mPrefs.getTransport()); - return true; - } - }); - findPreference(getString(R.string.pref_media_encryption_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { diff --git a/src/org/linphone/setup/SetupActivity.java b/src/org/linphone/setup/SetupActivity.java index 92649780a..9fe6c2ee3 100644 --- a/src/org/linphone/setup/SetupActivity.java +++ b/src/org/linphone/setup/SetupActivity.java @@ -21,6 +21,7 @@ import org.linphone.LinphoneManager; import org.linphone.LinphonePreferences; import org.linphone.LinphoneSimpleListener.LinphoneOnRegistrationStateChangedListener; import org.linphone.R; +import org.linphone.core.LinphoneAddress.TransportType; import org.linphone.core.LinphoneCore.RegistrationState; import org.linphone.core.LinphoneCoreException; @@ -291,11 +292,11 @@ public class SetupActivity extends FragmentActivity implements OnClickListener { if (isMainAccountLinphoneDotOrg && useLinphoneDotOrgCustomPorts) { if (getResources().getBoolean(R.bool.disable_all_security_features_for_markets)) { mPrefs.setNewAccountProxy(domain + ":5228"); - mPrefs.setTransport(getString(R.string.pref_transport_tcp_key)); + mPrefs.setNewAccountTransport(TransportType.LinphoneTransportTcp); } else { mPrefs.setNewAccountProxy(domain + ":5223"); - mPrefs.setTransport(getString(R.string.pref_transport_tls_key)); + mPrefs.setNewAccountTransport(TransportType.LinphoneTransportTls); } mPrefs.setNewAccountExpires("604800"); diff --git a/submodules/linphone b/submodules/linphone index 3e8765620..7bfd12788 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 3e876562027c51f61e3fe32f37bc66075e0b7854 +Subproject commit 7bfd12788a1753f17a2a054152addfc8d465ebc9