* #36392: ringtone activable in settings
This commit also activates the DTMF route type (SIP or RTP)
diff --git a/src/org/sflphone/fragments/AdvancedAccountFragment.java b/src/org/sflphone/fragments/AdvancedAccountFragment.java
index 6600f47..5581b03 100644
--- a/src/org/sflphone/fragments/AdvancedAccountFragment.java
+++ b/src/org/sflphone/fragments/AdvancedAccountFragment.java
@@ -23,8 +23,6 @@
 
     private static final String TAG = AdvancedAccountFragment.class.getSimpleName();
 
-    private boolean isDifferent = false;
-
     private Callbacks mCallbacks = sDummyCallbacks;
     private static Callbacks sDummyCallbacks = new Callbacks() {
 
@@ -141,13 +139,13 @@
                     findPreference("Account.publishedPort").setEnabled(!(Boolean) newValue);
                     findPreference("Account.publishedAddress").setEnabled(!(Boolean) newValue);
                 }
-                mCallbacks.getAccount().notifyObservers();
             } else {
                 preference.setSummary((CharSequence) newValue);
                 Log.i(TAG, "Changing" + preference.getKey() + " value:" + newValue);
                 mCallbacks.getAccount().getAdvancedDetails().setDetailString(preference.getKey(), ((CharSequence) newValue).toString());
-                mCallbacks.getAccount().notifyObservers();
             }
+
+            mCallbacks.getAccount().notifyObservers();
             return true;
         }
     };
diff --git a/src/org/sflphone/fragments/AudioManagementFragment.java b/src/org/sflphone/fragments/AudioManagementFragment.java
index 8539ba5..25b1c4e 100644
--- a/src/org/sflphone/fragments/AudioManagementFragment.java
+++ b/src/org/sflphone/fragments/AudioManagementFragment.java
@@ -35,6 +35,8 @@
 import java.util.ArrayList;
 
 import org.sflphone.R;
+import org.sflphone.account.AccountDetail;
+import org.sflphone.model.Account;
 import org.sflphone.model.Codec;
 import org.sflphone.service.ISipService;
 import org.sflphone.views.dragsortlv.DragSortListView;
@@ -43,12 +45,15 @@
 import android.content.Context;
 import android.os.Bundle;
 import android.os.RemoteException;
+import android.preference.CheckBoxPreference;
 import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.PreferenceFragment;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
 import android.view.View.MeasureSpec;
+import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.BaseAdapter;
@@ -73,7 +78,7 @@
         }
 
         @Override
-        public String getAccountID() {
+        public Account getAccount() {
             return null;
         }
 
@@ -83,7 +88,7 @@
 
         public ISipService getService();
 
-        public String getAccountID();
+        public Account getAccount();
 
     }
 
@@ -96,7 +101,7 @@
 
         mCallbacks = (Callbacks) activity;
         try {
-            codecs = (ArrayList<Codec>) mCallbacks.getService().getAudioCodecList(mCallbacks.getAccountID());
+            codecs = (ArrayList<Codec>) mCallbacks.getService().getAudioCodecList(mCallbacks.getAccount().getAccountID());
             mCallbacks.getService().getRingtoneList();
         } catch (RemoteException e) {
             e.printStackTrace();
@@ -117,7 +122,7 @@
                 listAdapter.remove(item);
                 listAdapter.insert(item, to);
                 try {
-                    mCallbacks.getService().setActiveCodecList(getActiveCodecList(), mCallbacks.getAccountID());
+                    mCallbacks.getService().setActiveCodecList(getActiveCodecList(), mCallbacks.getAccount().getAccountID());
                 } catch (RemoteException e) {
                     e.printStackTrace();
                 }
@@ -125,6 +130,8 @@
         }
     };
 
+    private ListView mPrefsList;
+
     public ArrayList<String> getActiveCodecList() {
         ArrayList<String> results = new ArrayList<String>();
         for (int i = 0; i < listAdapter.getCount(); ++i) {
@@ -139,6 +146,8 @@
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         super.onCreateView(inflater, container, savedInstanceState);
         View rootView = LayoutInflater.from(getActivity()).inflate(R.layout.frag_audio_mgmt, null);
+
+        mPrefsList = (ListView) rootView.findViewById(android.R.id.list);
         mCodecList = (DragSortListView) rootView.findViewById(R.id.dndlistview);
         mCodecList.setAdapter(listAdapter);
         mCodecList.setDropListener(onDrop);
@@ -149,7 +158,7 @@
                 listAdapter.getItem(pos).toggleState();
                 listAdapter.notifyDataSetChanged();
                 try {
-                    mCallbacks.getService().setActiveCodecList(getActiveCodecList(), mCallbacks.getAccountID());
+                    mCallbacks.getService().setActiveCodecList(getActiveCodecList(), mCallbacks.getAccount().getAccountID());
                 } catch (RemoteException e) {
                     e.printStackTrace();
                 }
@@ -163,11 +172,13 @@
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         final LinearLayout holder = (LinearLayout) getView().findViewById(R.id.lv_holder);
+        final LinearLayout holder_prefs = (LinearLayout) getView().findViewById(R.id.lv_holder_prefs);
         holder.post(new Runnable() {
 
             @Override
             public void run() {
                 setListViewHeight(mCodecList, holder);
+                setListViewHeight(mPrefsList, holder_prefs);
             }
         });
 
@@ -185,20 +196,18 @@
         int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
 
         for (int i = 0; i < listAdapter.getCount(); i++) {
-
-            if (i == 0) {
-                View listItem = listAdapter.getView(i, null, listView);
-                listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
-                firstHeight = listItem.getMeasuredHeight();
-            }
+            View listItem = listAdapter.getView(i, null, listView);
+            listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
+            firstHeight = listItem.getMeasuredHeight();
             totalHeight += firstHeight;
         }
 
-        // totalHeight -= iv.getMeasuredHeight();
+        totalHeight += getView().findViewById(R.id.list_header_title).getMeasuredHeight();
+        Log.w(TAG, "totalHeight:" + totalHeight);
 
         LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) llMain.getLayoutParams();
 
-        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
+        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount()));
         llMain.setLayoutParams(params);
         getView().requestLayout();
     }
@@ -210,15 +219,81 @@
         addPreferencesFromResource(R.xml.account_audio_prefs);
         listAdapter = new CodecAdapter(getActivity());
         listAdapter.setDataset(codecs);
+
+        setPreferenceDetails(mCallbacks.getAccount().getAdvancedDetails());
+        addPreferenceListener(mCallbacks.getAccount().getAdvancedDetails(), changeAudioPreferenceListener);
     }
 
-    Preference.OnPreferenceChangeListener changePreferenceListener = new Preference.OnPreferenceChangeListener() {
+    Preference.OnPreferenceChangeListener changeAudioPreferenceListener = new Preference.OnPreferenceChangeListener() {
+        @Override
         public boolean onPreferenceChange(Preference preference, Object newValue) {
-            preference.setSummary((CharSequence) newValue);
+            if (preference instanceof CheckBoxPreference) {
+                mCallbacks.getAccount().getAdvancedDetails().setDetailString(preference.getKey(), ((Boolean) newValue).toString());
+            } else {
+                preference.setSummary((CharSequence) newValue);
+                Log.i(TAG, "Changing" + preference.getKey() + " value:" + newValue);
+                mCallbacks.getAccount().getAdvancedDetails().setDetailString(preference.getKey(), ((CharSequence) newValue).toString());
+            }
+            mCallbacks.getAccount().notifyObservers();
+
             return true;
         }
     };
 
+    Preference.OnPreferenceChangeListener changePreferenceListener = new Preference.OnPreferenceChangeListener() {
+        public boolean onPreferenceChange(Preference preference, Object newValue) {
+
+            if (preference instanceof CheckBoxPreference) {
+                mCallbacks.getAccount().getAdvancedDetails().setDetailString(preference.getKey(), ((Boolean) newValue).toString());
+            } else {
+                preference.setSummary((CharSequence) newValue);
+                Log.i(TAG, "Changing" + preference.getKey() + " value:" + newValue);
+                mCallbacks.getAccount().getAdvancedDetails().setDetailString(preference.getKey(), ((CharSequence) newValue).toString());
+
+            }
+
+            mCallbacks.getAccount().notifyObservers();
+            return true;
+        }
+    };
+
+    private void setPreferenceDetails(AccountDetail details) {
+        for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
+            Log.i(TAG, "setPreferenceDetails: pref " + p.mKey + " value " + p.mValue);
+            Preference pref = findPreference(p.mKey);
+            if (pref != null) {
+                if (!p.isTwoState) {
+                    if (p.mKey.contentEquals("Account.dtmfType")){
+                        pref.setDefaultValue(p.mValue.contentEquals("overrtp") ? "RTP" : "SIP");
+                        pref.setSummary(p.mValue);
+                    } else {
+                        pref.setSummary(p.mValue);
+                    }
+                    
+                } else {
+                    ((CheckBoxPreference) pref).setChecked(p.mValue.contentEquals("true"));
+                }
+
+            } else {
+                Log.w(TAG, "pref not found");
+            }
+        }
+    }
+
+    private void addPreferenceListener(AccountDetail details, OnPreferenceChangeListener listener) {
+        for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
+            Log.i(TAG, "addPreferenceListener: pref " + p.mKey + p.mValue);
+            Preference pref = findPreference(p.mKey);
+            if (pref != null) {
+
+                pref.setOnPreferenceChangeListener(listener);
+
+            } else {
+                Log.w(TAG, "addPreferenceListener: pref not found");
+            }
+        }
+    }
+
     public static class CodecAdapter extends BaseAdapter {
 
         ArrayList<Codec> items;