Add a seekbar to change text-to-speech rate and a switch to enable
higher speech rates.

Change-Id: I75cfc2af4e293dc45c93a44e5c2af73d1dae9b7c
diff --git a/res/xml/tts_settings.xml b/res/xml/tts_settings.xml
index 3e5e097..dbdf469 100644
--- a/res/xml/tts_settings.xml
+++ b/res/xml/tts_settings.xml
@@ -24,13 +24,16 @@
 
     <PreferenceCategory android:key="tts_general_section"
          android:title="@string/tts_general_section_title">
-        <ListPreference
+        <com.android.settings.SeekBarPreference
             android:key="tts_default_rate"
             android:title="@string/tts_default_rate_title"
             android:summary="@string/tts_default_rate_summary"
             android:persistent="false"
-            android:entries="@array/tts_rate_entries"
-            android:entryValues="@array/tts_rate_values" />
+            android:defaultValue="50"
+            android:max="400" />
+        <SwitchPreference
+            android:key="tts_default_higher_speech_rate_enabled"
+            android:title="Higher speech rate" />
     </PreferenceCategory>
 
     <Preference android:key="tts_play_example"
diff --git a/src/com/android/settings/tts/TextToSpeechSettings.java b/src/com/android/settings/tts/TextToSpeechSettings.java
index 2d30ecf..be10dd3 100644
--- a/src/com/android/settings/tts/TextToSpeechSettings.java
+++ b/src/com/android/settings/tts/TextToSpeechSettings.java
@@ -26,7 +26,7 @@
 import android.speech.tts.TextToSpeech.EngineInfo;
 import android.speech.tts.TtsEngines;
 import android.speech.tts.UtteranceProgressListener;
-import android.support.v7.preference.ListPreference;
+import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceCategory;
 import android.text.TextUtils;
@@ -35,6 +35,7 @@
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
+import com.android.settings.SeekBarPreference;
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.tts.TtsEnginePreference.RadioButtonGroupState;
@@ -49,6 +50,7 @@
 
 import static android.provider.Settings.Secure.TTS_DEFAULT_RATE;
 import static android.provider.Settings.Secure.TTS_DEFAULT_SYNTH;
+import static android.provider.Settings.Secure.TTS_DEFAULT_HIGHER_SPEECH_RATE_ENABLED;
 
 public class TextToSpeechSettings extends SettingsPreferenceFragment implements
         Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener,
@@ -63,6 +65,10 @@
     /** Preference key for the TTS rate selection dialog. */
     private static final String KEY_DEFAULT_RATE = "tts_default_rate";
 
+    /** Preference key for the TTS advanced speech rate switch. */
+    private static final String KEY_HIGHER_RATE_SWITCH =
+        "tts_default_higher_speech_rate_enabled";
+
     /** Preference key for the TTS status field. */
     private static final String KEY_STATUS = "tts_status";
 
@@ -78,14 +84,26 @@
     private static final int GET_SAMPLE_TEXT = 1983;
     private static final int VOICE_DATA_INTEGRITY_CHECK = 1977;
 
+    /**
+     * Maximum speech rate values.
+     */
+    private static final int MAX_SPEECH_RATE = 400;
+    private static final int MAX_HIGHER_SPEECH_RATE = 600;
+
     private PreferenceCategory mEnginePreferenceCategory;
-    private ListPreference mDefaultRatePref;
+    private SeekBarPreference mDefaultRatePref;
+    private SwitchPreference mHigherRateSwitchPref;
     private Preference mPlayExample;
     private Preference mEngineStatus;
 
     private int mDefaultRate = TextToSpeech.Engine.DEFAULT_RATE;
 
     /**
+     * Whether higher speech rate is enabled.
+     */
+    private boolean mHigherRateSwitch = false;
+
+    /**
      * The currently selected engine.
      */
     private String mCurrentEngine;
@@ -161,7 +179,8 @@
 
         mEnginePreferenceCategory = (PreferenceCategory) findPreference(
                 KEY_ENGINE_PREFERENCE_SECTION);
-        mDefaultRatePref = (ListPreference) findPreference(KEY_DEFAULT_RATE);
+        mDefaultRatePref = (SeekBarPreference) findPreference(KEY_DEFAULT_RATE);
+        mHigherRateSwitchPref = (SwitchPreference) findPreference(KEY_HIGHER_RATE_SWITCH);
 
         mEngineStatus = findPreference(KEY_STATUS);
         updateEngineStatus(R.string.tts_status_checking);
@@ -223,13 +242,25 @@
         // Set up the default rate.
         try {
             mDefaultRate = android.provider.Settings.Secure.getInt(resolver, TTS_DEFAULT_RATE);
+            mHigherRateSwitch = android.provider.Settings.Secure.getInt(resolver,
+                    TTS_DEFAULT_HIGHER_SPEECH_RATE_ENABLED) == 1;
         } catch (SettingNotFoundException e) {
             // Default rate setting not found, initialize it
             mDefaultRate = TextToSpeech.Engine.DEFAULT_RATE;
+            mHigherRateSwitch = false;
         }
-        mDefaultRatePref.setValue(String.valueOf(mDefaultRate));
+        mDefaultRatePref.setProgress(mDefaultRate);
         mDefaultRatePref.setOnPreferenceChangeListener(this);
 
+        mHigherRateSwitchPref.setChecked(mHigherRateSwitch);
+        mHigherRateSwitchPref.setOnPreferenceChangeListener(this);
+
+        if (mHigherRateSwitch) {
+            mDefaultRatePref.setMax(MAX_HIGHER_SPEECH_RATE);
+        } else {
+            mDefaultRatePref.setMax(MAX_SPEECH_RATE);
+        }
+
         mCurrentEngine = mTts.getCurrentEngine();
 
         SettingsActivity activity = null;
@@ -447,7 +478,7 @@
     public boolean onPreferenceChange(Preference preference, Object objValue) {
         if (KEY_DEFAULT_RATE.equals(preference.getKey())) {
             // Default rate
-            mDefaultRate = Integer.parseInt((String) objValue);
+            mDefaultRate = ((Integer) objValue).intValue();
             try {
                 android.provider.Settings.Secure.putInt(getContentResolver(),
                         TTS_DEFAULT_RATE, mDefaultRate);
@@ -458,8 +489,21 @@
             } catch (NumberFormatException e) {
                 Log.e(TAG, "could not persist default TTS rate setting", e);
             }
+        } else if (KEY_HIGHER_RATE_SWITCH.equals(preference.getKey())) {
+            // Adjust range of speech rate depending on switch setting.
+            mHigherRateSwitch = ((Boolean) objValue).booleanValue();
+            try {
+              android.provider.Settings.Secure.putInt(getContentResolver(),
+                  TTS_DEFAULT_HIGHER_SPEECH_RATE_ENABLED, mHigherRateSwitch ? 1 : 0);
+              if (mHigherRateSwitch) {
+                mDefaultRatePref.setMax(MAX_HIGHER_SPEECH_RATE);
+              } else {
+                mDefaultRatePref.setMax(MAX_SPEECH_RATE);
+              }
+            } catch (NumberFormatException e) {
+              Log.e(TAG, "could not persist default higher speech rate setting", e);
+            }
         }
-
         return true;
     }