diff --git a/res/values/non_localizable_strings.xml b/res/values/non_localizable_strings.xml
index e9195c066..b11c9f12d 100644
--- a/res/values/non_localizable_strings.xml
+++ b/res/values/non_localizable_strings.xml
@@ -94,6 +94,7 @@
pref_stun_server_key
pref_ice_enable_key
pref_video_codec_vp8_key
+ pref_media_encryption_key
none
srtp
zrtp
@@ -121,8 +122,6 @@
pref_first_time_linphone_chat_storage
-
- lpconfig_sip_media_enc_key
download_bw
diff --git a/res/xml/settings.xml b/res/xml/settings.xml
index 4fb09040f..899a62c96 100644
--- a/res/xml/settings.xml
+++ b/res/xml/settings.xml
@@ -1,13 +1,13 @@
-
+
+ android:key="@string/lpconfig_sip_media_enc_key" />
diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java
index ca0dad75c..5886b941f 100644
--- a/src/org/linphone/LinphoneManager.java
+++ b/src/org/linphone/LinphoneManager.java
@@ -545,7 +545,7 @@ public class LinphoneManager implements LinphoneCoreListener {
copyAssetsFromPackage();
//traces alway start with traces enable to not missed first initialization
- boolean isDebugLogEnabled = !(mR.getBoolean(R.bool.disable_every_log)) && getPrefBoolean(R.string.pref_debug_key, mR.getBoolean(R.bool.pref_debug_default));
+ boolean isDebugLogEnabled = !(mR.getBoolean(R.bool.disable_every_log));
LinphoneCoreFactory.instance().setDebugMode(isDebugLogEnabled, getString(R.string.app_name));
// Try to get remote provisioning
@@ -567,7 +567,6 @@ public class LinphoneManager implements LinphoneCoreListener {
Log.e(e, "cannot get version name");
}
- mLc.enableIpv6(getPrefBoolean(R.string.pref_ipv6_key, false));
mLc.setZrtpSecretsCache(basePath + "/zrtp_secrets");
mLc.setRing(null);
@@ -647,17 +646,6 @@ public class LinphoneManager implements LinphoneCoreListener {
return false;
}
- void initMediaEncryption(){
- String pref = getPrefString(R.string.pref_media_encryption_key, R.string.pref_media_encryption_key_none);
- MediaEncryption me=MediaEncryption.None;
- if (pref.equals(getString(R.string.pref_media_encryption_key_srtp)))
- me = MediaEncryption.SRTP;
- else if (pref.equals(getString(R.string.pref_media_encryption_key_zrtp)))
- me = MediaEncryption.ZRTP;
- Log.i("Media encryption set to " + pref);
- mLc.setMediaEncryption(me);
- }
-
private void initFromConfTunnel(){
if (!mLc.isTunnelAvailable())
return;
@@ -827,76 +815,8 @@ public class LinphoneManager implements LinphoneCoreListener {
initialTransports = mLc.getSignalingTransportPorts();
setSignalingTransportsFromConfiguration(initialTransports);
- initMediaEncryption();
-
- mLc.setVideoPolicy(isAutoInitiateVideoCalls(), isAutoAcceptCamera());
-
- readAndSetAudioAndVideoPorts();
-
- String defaultIncomingCallTimeout = getString(R.string.pref_incoming_call_timeout_default);
- int incomingCallTimeout = tryToParseIntValue(getPrefString(R.string.pref_incoming_call_timeout_key, defaultIncomingCallTimeout), defaultIncomingCallTimeout);
- mLc.setIncomingTimeout(incomingCallTimeout);
-
- try {
- // Configure audio codecs
-// enableDisableAudioCodec("speex", 32000, 1, R.string.pref_codec_speex32_key);
- enableDisableAudioCodec("speex", 32000, 1, false);
- enableDisableAudioCodec("speex", 16000, 1, R.string.pref_codec_speex16_key);
- enableDisableAudioCodec("speex", 8000, 1, R.string.pref_codec_speex8_key);
- enableDisableAudioCodec("iLBC", 8000, 1, R.string.pref_codec_ilbc_key);
- enableDisableAudioCodec("GSM", 8000, 1, R.string.pref_codec_gsm_key);
- enableDisableAudioCodec("G722", 8000, 1, R.string.pref_codec_g722_key);
- enableDisableAudioCodec("G729", 8000, 1, R.string.pref_codec_g729_key);
- enableDisableAudioCodec("PCMU", 8000, 1, R.string.pref_codec_pcmu_key);
- enableDisableAudioCodec("PCMA", 8000, 1, R.string.pref_codec_pcma_key);
- enableDisableAudioCodec("AMR", 8000, 1, R.string.pref_codec_amr_key);
- enableDisableAudioCodec("AMR-WB", 16000, 1, R.string.pref_codec_amrwb_key);
- //enableDisableAudioCodec("SILK", 24000, 1, R.string.pref_codec_silk24_key);
- enableDisableAudioCodec("SILK", 24000, 1, false);
- enableDisableAudioCodec("SILK", 16000, 1, R.string.pref_codec_silk16_key);
- //enableDisableAudioCodec("SILK", 12000, 1, R.string.pref_codec_silk12_key);
- enableDisableAudioCodec("SILK", 12000, 1, false);
- enableDisableAudioCodec("SILK", 8000, 1, R.string.pref_codec_silk8_key);
- enableDisableAudioCodec("OPUS", 48000, 1, R.string.pref_codec_opus_key);
-
- // Configure video codecs
- for (PayloadType videoCodec : mLc.getVideoCodecs()) {
- enableDisableVideoCodecs(videoCodec);
- }
-
- boolean useEC = getPrefBoolean(R.string.pref_echo_cancellation_key, mR.getBoolean(R.bool.pref_echo_canceller_default));
- mLc.enableEchoCancellation(useEC);
- } catch (LinphoneCoreException e) {
- throw new LinphoneConfigException(getString(R.string.wrong_settings),e);
- }
- boolean isVideoEnabled = isVideoEnabled();
- mLc.enableVideo(isVideoEnabled, isVideoEnabled);
setPreferredVideoSizeFromConfiguration();
- //stun server
- String lStun = getPrefString(R.string.pref_stun_server_key, getString(R.string.default_stun));
- boolean useICE = getPrefBoolean(R.string.pref_ice_enable_key, mR.getBoolean(R.bool.pref_ice_enabled_default));
- boolean useUpnp = getPrefBoolean(R.string.pref_upnp_enable_key, mR.getBoolean(R.bool.pref_upnp_enabled_default));
-
- mLc.setStunServer(lStun);
- if (lStun!=null && lStun.length()>0 && useICE) {
- mLc.setFirewallPolicy(FirewallPolicy.UseIce);
- if (useUpnp) Log.e("Cannot have both ice and upnp enabled, disabling upnp");
- } else if (useUpnp) {
- mLc.setFirewallPolicy(FirewallPolicy.UseUpnp);
- } else if (lStun!=null && lStun.length()>0){
- mLc.setFirewallPolicy(FirewallPolicy.UseStun);
- } else {
- mLc.setFirewallPolicy(FirewallPolicy.NoFirewall);
- }
-
- mLc.setUseRfc2833ForDtmfs(getPrefBoolean(R.string.pref_rfc2833_dtmf_key, mR.getBoolean(R.bool.pref_rfc2833_dtmf_default)));
- mLc.setUseSipInfoForDtmfs(getPrefBoolean(R.string.pref_sipinfo_dtmf_key, mR.getBoolean(R.bool.pref_sipinfo_dtmf_default)));
-
- String displayName = getPrefString(R.string.pref_display_name_key, getString(R.string.pref_display_name_default));
- String username = getPrefString(R.string.pref_user_name_key, getString(R.string.pref_user_name_default));
- mLc.setPrimaryContact(displayName, username);
-
//accounts
try {
initAccounts();
diff --git a/src/org/linphone/LinphonePreferences.java b/src/org/linphone/LinphonePreferences.java
index 685e87abb..78c5870f3 100644
--- a/src/org/linphone/LinphonePreferences.java
+++ b/src/org/linphone/LinphonePreferences.java
@@ -22,6 +22,7 @@ import java.util.Map;
import org.linphone.core.LinphoneCoreFactory;
import org.linphone.core.LpConfig;
+import org.linphone.mediastream.Log;
import android.content.res.Resources;
@@ -36,7 +37,7 @@ public class LinphonePreferences {
public static final synchronized LinphonePreferences getInstance() {
if (instance == null) {
instance = new LinphonePreferences();
- instance.Load();
+ instance.load();
}
return instance;
}
@@ -81,18 +82,30 @@ public class LinphonePreferences {
return changesDict.containsKey(key);
}
- public void Load() {
- Resources res = LinphoneService.instance().getResources();
- for (String key : res.getStringArray(R.array.lpconfig_net_keys)) {
- dict.put(key, config.getString("net", key, null));
+ public void load() {
+ Log.w("Preferences loading...");
+ loadSection("sip", R.array.lpconfig_sip_keys);
+ }
+
+ private void loadSection(String section, int resourcesID) {
+ Log.w("Preferences loading for section " + section);
+ for (String key : LinphoneService.instance().getResources().getStringArray(resourcesID)) {
+ Log.w("Looking for value for key " + key);
+ String value = config.getString("sip", key, "");
+ if (value != null && value.length() > 0) {
+ Log.w("Value read for key " + key + " : " + value);
+ dict.put(key, value);
+ }
}
}
- public void Save() {
+ public void save() {
+ Log.w("Preferences saving...");
Resources res = LinphoneService.instance().getResources();
- for (String key : res.getStringArray(R.array.lpconfig_net_keys)) {
+ for (String key : res.getStringArray(R.array.lpconfig_sip_keys)) {
if (hasValueChanged(key)) {
- config.setString("net", key, getNew(key));
+ Log.w("Saving changed preference : " + getNew(key));
+ config.setString("sip", key, getNew(key));
}
}
config.sync();
diff --git a/src/org/linphone/SettingsFragment.java b/src/org/linphone/SettingsFragment.java
index 2ea1a9a6c..f93cc7813 100644
--- a/src/org/linphone/SettingsFragment.java
+++ b/src/org/linphone/SettingsFragment.java
@@ -1,14 +1,25 @@
package org.linphone;
+import java.util.ArrayList;
+import java.util.List;
+
import org.linphone.LinphoneManager.EcCalibrationListener;
+import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneCore.EcCalibratorStatus;
+import org.linphone.core.LinphoneCore.MediaEncryption;
+import org.linphone.mediastream.Log;
import org.linphone.ui.PreferencesListFragment;
import android.os.Bundle;
+import android.preference.ListPreference;
import android.preference.Preference;
+import android.preference.PreferenceCategory;
import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.PreferenceScreen;
public class SettingsFragment extends PreferencesListFragment implements EcCalibrationListener {
+ private LinphonePreferences mPrefs;
+
@Override
public void onEcCalibrationStatus(EcCalibratorStatus status, int delayMs) {
@@ -21,21 +32,98 @@ public class SettingsFragment extends PreferencesListFragment implements EcCalib
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
+ PreferenceScreen screen = getPreferenceScreen();
- final LinphonePreferences prefs = LinphonePreferences.getInstance();
- int count = getPreferenceScreen().getPreferenceCount();
- for (int i = 0; i < count; i++) {
- Preference pref = getPreferenceScreen().getPreference(i);
- if (pref.hasKey()) {
- pref.setDefaultValue(prefs.get(pref.getKey()));
- pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- prefs.set(preference.getKey(), newValue.toString());
- return true;
- }
- });
+ mPrefs = LinphonePreferences.getInstance();
+ mPrefs.load();
+
+ // Init some settings
+ initMediaEncryptionPreference((ListPreference) screen.findPreference(getString(R.string.lpconfig_sip_media_enc_key)));
+
+ // Sets default values and value change listener for each of them
+ setListenerForPreference(screen);
+ }
+
+ private void setListenerForPreference(Preference pref) {
+ // FIXME: first display doesn't match the linphonerc values
+
+ if (pref.hasKey()) {
+ Log.w("Preference key = " + pref.getKey());
+ pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ Log.w("New value for preference key " + preference.getKey() + ":" + newValue.toString());
+ mPrefs.set(preference.getKey(), newValue.toString());
+ return true;
+ }
+ });
+ } else {
+ if (pref instanceof PreferenceCategory) {
+ Log.w("Preference is a category (" + pref.getTitle() + "), let's recurse!");
+ PreferenceCategory cat = (PreferenceCategory) pref;
+ int count = cat.getPreferenceCount();
+ for (int i = 0; i < count; i++) {
+ Preference p = cat.getPreference(i);
+ setListenerForPreference(p);
+ }
+ } else if (pref instanceof PreferenceScreen) {
+ Log.w("Preference is a screen (" + pref.getTitle() + "), let's recurse!");
+ PreferenceScreen screen = (PreferenceScreen) pref;
+ int count = screen.getPreferenceCount();
+ for (int i = 0; i < count; i++) {
+ Preference p = screen.getPreference(i);
+ setListenerForPreference(p);
+ }
}
}
}
+
+ private void initMediaEncryptionPreference(ListPreference pref) {
+ LinphoneCore lc = null;
+ try {
+ lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
+ } catch (Exception e) {}
+
+ List mencEntries=new ArrayList();
+ List mencEntryValues=new ArrayList();
+ mencEntries.add(getString(R.string.media_encryption_none));
+ mencEntryValues.add(getString(R.string.pref_media_encryption_key_none));
+
+ if (lc == null || getResources().getBoolean(R.bool.disable_all_security_features_for_markets)) {
+ CharSequence[] contents = new CharSequence[mencEntries.size()];
+ mencEntries.toArray(contents);
+ pref.setEntries(contents);
+ contents = new CharSequence[mencEntryValues.size()];
+ mencEntryValues.toArray(contents);
+ pref.setEntryValues(contents);
+ return;
+ }
+
+ boolean hasZrtp = lc.mediaEncryptionSupported(MediaEncryption.ZRTP);
+ boolean hasSrtp = lc.mediaEncryptionSupported(MediaEncryption.SRTP);
+ if (!hasSrtp && !hasZrtp) {
+ pref.setEnabled(false);
+ } else {
+ if (hasSrtp){
+ mencEntries.add(getString(R.string.media_encryption_srtp));
+ mencEntryValues.add(getString(R.string.pref_media_encryption_key_srtp));
+ }
+ if (hasZrtp){
+ mencEntries.add(getString(R.string.media_encryption_zrtp));
+ mencEntryValues.add(getString(R.string.pref_media_encryption_key_zrtp));
+ }
+ CharSequence[] contents=new CharSequence[mencEntries.size()];
+ mencEntries.toArray(contents);
+ pref.setEntries(contents);
+ contents=new CharSequence[mencEntryValues.size()];
+ mencEntryValues.toArray(contents);
+ pref.setEntryValues(contents);
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ LinphonePreferences.getInstance().save();
+ super.onDestroy();
+ }
}