#15466: Add audio volume seekbar in audio preferences
diff --git a/src/com/savoirfairelinux/sflphone/client/PrefManagementFragment.java b/src/com/savoirfairelinux/sflphone/client/PrefManagementFragment.java
index b65ac18..4cd3578 100644
--- a/src/com/savoirfairelinux/sflphone/client/PrefManagementFragment.java
+++ b/src/com/savoirfairelinux/sflphone/client/PrefManagementFragment.java
@@ -32,6 +32,9 @@
 package com.savoirfairelinux.sflphone.client;
 
 import android.app.Activity;
+import android.content.Context;
+import android.graphics.Typeface;
+import android.preference.EditTextPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceCategory;
@@ -39,9 +42,15 @@
 import android.preference.PreferenceScreen;
 import android.os.Bundle;
 import android.util.Log;
+import android.util.AttributeSet;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
 import android.widget.ListView;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
 
 import com.savoirfairelinux.sflphone.R;
 
@@ -58,7 +67,7 @@
         setPreferenceScreen(getAudioPreferenceScreen()); 
     }
 
-    Preference.OnPreferenceChangeListener changeListListener = new Preference.OnPreferenceChangeListener() {
+    Preference.OnPreferenceChangeListener changePreferenceListener = new Preference.OnPreferenceChangeListener() {
         public boolean onPreferenceChange(Preference preference, Object newValue) {
             preference.setSummary(CURRENT_VALUE + (CharSequence)newValue);
             return true;
@@ -75,6 +84,7 @@
         audioPrefCat.setTitle(R.string.audio_preferences);
         root.addPreference(audioPrefCat);
 
+        // Codec List
         ListPreference codecListPref = new ListPreference(currentContext);
         codecListPref.setEntries(R.array.audio_codec_list);
         codecListPref.setEntryValues(R.array.audio_codec_list_value);
@@ -82,9 +92,148 @@
         codecListPref.setPersistent(false);
         codecListPref.setTitle(R.string.title_audio_codec_list);
         codecListPref.setSummary(CURRENT_VALUE + "PCMU");
-        codecListPref.setOnPreferenceChangeListener(changeListListener);
+        codecListPref.setOnPreferenceChangeListener(changePreferenceListener);
         audioPrefCat.addPreference(codecListPref);
 
+        // Ringtone
+        EditTextPreference audioRingtonePref = new EditTextPreference(currentContext);
+        audioRingtonePref.setDialogTitle(R.string.dialogtitle_audio_ringtone_field);
+        audioRingtonePref.setPersistent(false);
+        audioRingtonePref.setTitle(R.string.title_audio_ringtone_field);
+        audioRingtonePref.setSummary(CURRENT_VALUE + "path/to/ringtone");
+        audioRingtonePref.setOnPreferenceChangeListener(changePreferenceListener);
+        audioPrefCat.addPreference(audioRingtonePref);
+
+        // Speaker volume seekbar
+        SeekBarPreference speakerSeekBarPref = new SeekBarPreference(currentContext);
+        speakerSeekBarPref.setPersistent(false);
+        speakerSeekBarPref.setTitle("Speaker Volume");
+        speakerSeekBarPref.setSummary("Set the volume for speaker");
+        audioPrefCat.addPreference(speakerSeekBarPref);
+
+        // Capture volume seekbar
+        SeekBarPreference captureSeekBarPref = new SeekBarPreference(currentContext);
+        captureSeekBarPref.setPersistent(false);
+        captureSeekBarPref.setTitle("Capture Volume");
+        captureSeekBarPref.setSummary("Set the volume for microphone");
+        audioPrefCat.addPreference(captureSeekBarPref);
+
+        // Ringtone volume seekbar
+        SeekBarPreference ringtoneSeekBarPref = new SeekBarPreference(currentContext);
+        ringtoneSeekBarPref.setPersistent(false);
+        ringtoneSeekBarPref.setTitle("Ringtone Volume");
+        ringtoneSeekBarPref.setSummary("Set the volume for ringtone");
+        audioPrefCat.addPreference(ringtoneSeekBarPref);
+
         return root;
     }
+
+    public class SeekBarPreference extends Preference implements OnSeekBarChangeListener
+    {
+        public int MAXIMUM = 100;
+        public int INTERVAL = 5;
+        private float oldValue = 25;
+        private TextView Indicator;
+
+        public SeekBarPreference(Context context)
+        {
+            super(context);
+        }
+
+        public SeekBarPreference(Context context, AttributeSet attrs)
+        {
+            super(context, attrs);
+        }
+
+        public SeekBarPreference(Context context, AttributeSet attrs, int defStyle)
+        {
+           super(context, attrs, defStyle);
+        }
+
+        @Override
+        protected View onCreateView(ViewGroup parent)
+        {
+            float scale = getContext().getResources().getDisplayMetrics().density;
+
+            RelativeLayout layout = new RelativeLayout(getContext());
+
+            RelativeLayout.LayoutParams textParams = new RelativeLayout.LayoutParams(
+                RelativeLayout.LayoutParams.WRAP_CONTENT,
+                RelativeLayout.LayoutParams.WRAP_CONTENT);
+
+            RelativeLayout.LayoutParams sbarParams = new RelativeLayout.LayoutParams(
+                Math.round(scale * 160),
+                RelativeLayout.LayoutParams.WRAP_CONTENT);
+
+            RelativeLayout.LayoutParams indParams = new RelativeLayout.LayoutParams(
+                RelativeLayout.LayoutParams.WRAP_CONTENT,
+                RelativeLayout.LayoutParams.WRAP_CONTENT);
+
+            TextView preferenceText = new TextView(getContext());
+            preferenceText.setId(0);
+            preferenceText.setText(getTitle());
+            preferenceText.setTextSize(18);
+            preferenceText.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD);
+
+            SeekBar sbar = new SeekBar(getContext());
+            sbar.setId(1);
+            sbar.setMax(MAXIMUM);
+            sbar.setProgress((int)this.oldValue);
+            sbar.setOnSeekBarChangeListener(this);
+
+            this.Indicator = new TextView(getContext());
+            this.Indicator.setTextSize(12);
+            this.Indicator.setTypeface(Typeface.MONOSPACE, Typeface.ITALIC); 
+            this.Indicator.setText("" + sbar.getProgress());
+
+            textParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
+            sbarParams.addRule(RelativeLayout.RIGHT_OF, preferenceText.getId());
+            indParams.setMargins(Math.round(20*scale), 0, 0, 0);
+            indParams.addRule(RelativeLayout.RIGHT_OF, sbar.getId());
+
+            preferenceText.setLayoutParams(textParams);
+            sbar.setLayoutParams(sbarParams);
+            this.Indicator.setLayoutParams(indParams);
+            layout.addView(preferenceText);
+            layout.addView(this.Indicator);
+            layout.addView(sbar);
+            layout.setId(android.R.id.widget_frame);
+
+            return layout;
+        }
+
+        @Override
+        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
+        {
+            progress = Math.round(((float) progress)/INTERVAL) * INTERVAL;
+
+            if(!callChangeListener(progress)) {
+                seekBar.setProgress((int) this.oldValue);
+                return;
+            }
+
+            seekBar.setProgress(progress);
+            this.oldValue = progress;
+            this.Indicator.setText("" + progress);
+            updatePreference(progress);
+
+            notifyChanged(); 
+        }
+
+        @Override
+        public void onStartTrackingTouch(SeekBar seekBar) 
+        {
+        }
+
+        @Override
+        public void onStopTrackingTouch(SeekBar seekBar)
+        {
+        }
+
+        private void updatePreference(int newValue) {
+            // SharedPreference.Editor editor = getEditor();
+            // editor.putInt(getKey(), newValue);
+            // editor.commit();
+        }
+    }
 }