Text to speech settings UI change.

No more separate checkboxes for each of the engines. This brings
it more in line with the voice recognition settings. The user is
shown a data warning every time he chooses a non system engine
as the default.

Change-Id: I00fcb9c9f634a9fc13ff14da8bfade79ae6727c4
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1cc955c..c1ca934 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2878,6 +2878,14 @@
     <string name="tts_engine_name_is_enabled_summary"><xliff:g id="tts_plugin_engine_name">%s</xliff:g> is enabled</string>
     <!-- On main TTS Settings screen, text preceded by the TTS engine name to indicate the engine cannot be used by the user -->
     <string name="tts_engine_name_is_disabled_summary"><xliff:g id="tts_plugin_engine_name">%s</xliff:g> is disabled</string>
+    <!-- On the main TTS settings screen, text for a divider under which
+         the engine specific settings and the "engine install data" option
+         are listed [CHAR LIMIT=30]-->
+    <string name="tts_engine_settings_section">Engine settings</string>
+    <!-- Title for a preference in the main TTS settings screen, which
+         launches the settings screen for a given TTS engine when clicked
+         [CHAR LIMIT=30]-->
+    <string name="tts_engine_settings_title">Settings for <xliff:g id="tts_engine_name">%s</xliff:g></string>
     <!-- On Pico TTS Settings screen, text to mark the section for the various languages and voices that are available -->
     <string name="pico_languages_and_voices">Languages and voices</string>
     <!-- On Pico TTS Settings screen, text to mark a voice as installed -->
diff --git a/res/xml/tts_settings.xml b/res/xml/tts_settings.xml
index c378f64..ecccc10 100644
--- a/res/xml/tts_settings.xml
+++ b/res/xml/tts_settings.xml
@@ -4,9 +4,9 @@
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
-  
+
           http://www.apache.org/licenses/LICENSE-2.0
-  
+
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -18,17 +18,11 @@
         android:title="@string/tts_settings_title">
 
         <Preference
-                android:key="tts_play_example"
-                android:persistent="false"
-                android:title="@string/tts_play_example_title" 
-                android:summary="@string/tts_play_example_summary" />
+            android:key="tts_play_example"
+            android:persistent="false"
+            android:title="@string/tts_play_example_title"
+            android:summary="@string/tts_play_example_summary" />
 
-        <CheckBoxPreference
-            android:key="toggle_use_default_tts_settings"
-            android:title="@string/use_default_tts_settings_title"
-            android:summary="@string/use_default_tts_settings_summary"
-            android:persistent="false" />
-                    
         <PreferenceCategory
             android:title="@string/tts_default_settings_section">
             <ListPreference
@@ -39,12 +33,6 @@
                 android:entries="@array/tts_engine_entries"
                 android:entryValues="@array/tts_engine_values" />
 
-            <Preference
-                android:key="tts_install_data"
-                android:persistent="false"
-                android:title="@string/tts_install_data_title" 
-                android:summary="@string/tts_install_data_summary" />
-
             <ListPreference
                 android:key="tts_default_rate"
                 android:title="@string/tts_default_rate_title"
@@ -63,8 +51,19 @@
 
         </PreferenceCategory>
 
-        <PreferenceCategory android:key="tts_engines_section"
-                android:title="@string/tts_engines_section" />
+        <PreferenceCategory android:key="tts_engine_settings_section"
+            android:title="@string/tts_engine_settings_section">
+            <Preference
+                android:key="tts_engine_settings"
+                android:persistent="false"
+                android:title="@string/tts_engine_settings_title" />
+
+            <Preference
+                android:key="tts_install_data"
+                android:persistent="false"
+                android:title="@string/tts_install_data_title"
+                android:summary="@string/tts_install_data_summary" />
+       </PreferenceCategory>
 
 
 </PreferenceScreen>
diff --git a/src/com/android/settings/TextToSpeechSettings.java b/src/com/android/settings/TextToSpeechSettings.java
index 34ce251..1f81c99 100644
--- a/src/com/android/settings/TextToSpeechSettings.java
+++ b/src/com/android/settings/TextToSpeechSettings.java
@@ -21,7 +21,6 @@
 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_VARIANT;
-import static android.provider.Settings.Secure.TTS_ENABLED_PLUGINS;
 import static android.provider.Settings.Secure.TTS_USE_DEFAULTS;
 
 import android.app.AlertDialog;
@@ -32,7 +31,6 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
-import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceClickListener;
@@ -64,7 +62,7 @@
     private static final String KEY_TTS_DEFAULT_COUNTRY = "tts_default_country";
     private static final String KEY_TTS_DEFAULT_VARIANT = "tts_default_variant";
     private static final String KEY_TTS_DEFAULT_SYNTH = "tts_default_synth";
-    private static final String KEY_TTS_ENGINES = "tts_engines_section";
+    private static final String KEY_TTS_ENGINE_SETTINGS = "tts_engine_settings";
 
     private static final String KEY_PLUGIN_ENABLED_PREFIX = "ENABLED_";
     private static final String KEY_PLUGIN_SETTINGS_PREFIX = "SETTINGS_";
@@ -76,13 +74,14 @@
 
     private static final String LOCALE_DELIMITER = "-";
 
-    private Preference         mPlayExample = null;
-    private Preference         mInstallData = null;
-    private CheckBoxPreference mUseDefaultPref = null;
-    private ListPreference     mDefaultRatePref = null;
-    private ListPreference     mDefaultLocPref = null;
-    private ListPreference     mDefaultSynthPref = null;
-    private PreferenceGroup    mEnginesGroup;
+    private Preference mPlayExample = null;
+
+    private ListPreference mDefaultRatePref = null;
+    private ListPreference mDefaultLocPref = null;
+    private ListPreference mDefaultSynthPref = null;
+
+    private Preference mInstallData = null;
+    private Preference mEngineSettings = null;
 
     private String             mDefaultLanguage = null;
     private String             mDefaultCountry = null;
@@ -127,18 +126,18 @@
         mInstallData = findPreference(KEY_TTS_INSTALL_DATA);
         mInstallData.setOnPreferenceClickListener(this);
 
-        mUseDefaultPref = (CheckBoxPreference) findPreference(KEY_TTS_USE_DEFAULT);
         mDefaultSynthPref = (ListPreference) findPreference(KEY_TTS_DEFAULT_SYNTH);
         mDefaultRatePref = (ListPreference) findPreference(KEY_TTS_DEFAULT_RATE);
         mDefaultLocPref = (ListPreference) findPreference(KEY_TTS_DEFAULT_LANG);
 
-        mEnginesGroup = (PreferenceGroup) findPreference(KEY_TTS_ENGINES);
+        mEngineSettings = (Preference) findPreference(KEY_TTS_ENGINE_SETTINGS);
+        mEngineSettings.setEnabled(false);
 
         mTts = new TextToSpeech(getActivity().getApplicationContext(), this);
         mEnginesHelper = new TtsEngines(getActivity().getApplicationContext());
 
         initDefaultSettings();
-        addEngineSpecificSettings();
+        initEngineSpecificSettings();
     }
 
     @Override
@@ -175,39 +174,27 @@
         }
     }
 
-    private void addEngineSpecificSettings() {
-        Context context = getActivity();
-        List<EngineInfo> engines = mTts.getEngines();
-        for (EngineInfo engine : engines) {
-            final String engineName = engine.name;
-            if (!engine.system) {
-                CheckBoxPreference enablePref = new CheckBoxPreference(context);
-                enablePref.setKey(KEY_PLUGIN_ENABLED_PREFIX + engineName);
-                enablePref.setTitle(engine.label);
-                enablePref.setOnPreferenceClickListener(this);
-                mEnginesGroup.addPreference(enablePref);
-            }
+    private void initEngineSpecificSettings() {
+        final String engineName = mEnginesHelper.getDefaultEngine();
+        final EngineInfo engine = mEnginesHelper.getEngineInfo(engineName);
 
-            if (engineHasSettings(engineName)) {
-                Preference pref = new Preference(context);
-                pref.setKey(KEY_PLUGIN_SETTINGS_PREFIX + engineName);
-                pref.setTitle(engine.label);
-                CharSequence settingsLabel = getResources().getString(
-                        R.string.tts_engine_name_settings, engine.label);
-                pref.setSummary(settingsLabel);
-                // TODO: Add a new API for this.
-                pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
-                            public boolean onPreferenceClick(Preference preference) {
-                                Intent i = new Intent();
-                                i.setClassName(engineName,
-                                        engineName + ".EngineSettings");
-                                startActivity(i);
-                                return true;
-                            }
-                        });
-                mEnginesGroup.addPreference(pref);
-            }
+        mEngineSettings.setTitle(getResources().getString(R.string.tts_engine_settings_title,
+                engine.label));
+
+        if (engineHasSettings(engineName)) {
+            mEngineSettings.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+                public boolean onPreferenceClick(Preference preference) {
+                    Intent i = new Intent();
+                    i.setClassName(engineName, engineName + ".EngineSettings");
+                    startActivity(i);
+                    return true;
+                }
+            });
+            mEngineSettings.setEnabled(true);
+        } else {
+            mEngineSettings.setEnabled(false);
         }
+
     }
 
     private boolean engineHasSettings(String enginePackageName) {
@@ -226,12 +213,6 @@
         // Find the default TTS values in the settings, initialize and store the
         // settings if they are not found.
 
-        // "Use Defaults"
-        int useDefault = Settings.Secure.getInt(resolver, TTS_USE_DEFAULTS,
-                TextToSpeech.Engine.USE_DEFAULTS);
-        mUseDefaultPref.setChecked(useDefault == 1);
-        mUseDefaultPref.setOnPreferenceChangeListener(this);
-
         // Default synthesis engine
         loadEngines();
         mDefaultSynthPref.setOnPreferenceChangeListener(this);
@@ -301,6 +282,7 @@
         intent.putExtra("country", mDefaultCountry);
         intent.putExtra("variant", mDefaultLocVariant);
         intent.setPackage(defaultEngine);
+
         try {
             Log.v(TAG, "Getting sample text: " + intent.toUri(0));
             startActivityForResult(intent, GET_SAMPLE_TEXT);
@@ -504,16 +486,21 @@
             Log.v(TAG, " selected is " + newIndex);
             mDemoStringIndex = newIndex > -1 ? newIndex : 0;
         } else if (KEY_TTS_DEFAULT_SYNTH.equals(preference.getKey())) {
-            String defaultEng = objValue.toString();
-            Settings.Secure.putString(getContentResolver(), TTS_DEFAULT_SYNTH, defaultEng);
-            if (mTts != null) {
-                mTts.setEngineByPackageName(defaultEng);
-                mEnableDemo = false;
-                mVoicesMissing = false;
-                updateWidgetState();
-                checkVoiceData();
+            final String name = objValue.toString();
+            final EngineInfo info = mEnginesHelper.getEngineInfo(name);
+
+            if (info.system) {
+                // For system engines, do away with the alert dialog.
+                updateDefaultEngine(name);
+                initEngineSpecificSettings();
+            } else {
+                // For all other engines, display a warning message before
+                // turning them on.
+                displayDataAlert(preference, name);
             }
-            Log.v(TAG, "The default synth is: " + objValue.toString());
+
+            // We'll deal with updating the UI ourselves.
+            return false;
         }
 
         return true;
@@ -534,42 +521,13 @@
             // quit this activity so it needs to be restarted after installation of the voice data
             finish();
             return true;
-        } else if (preference.getKey().startsWith(KEY_PLUGIN_ENABLED_PREFIX)) {
-            final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
-            if (chkPref.isChecked()) {
-                chkPref.setChecked(false);
-                AlertDialog d = (new AlertDialog.Builder(getActivity()))
-                        .setTitle(android.R.string.dialog_alert_title)
-                        .setIcon(android.R.drawable.ic_dialog_alert)
-                        .setMessage(
-                                getActivity().getString(R.string.tts_engine_security_warning,
-                                chkPref.getTitle()))
-                        .setCancelable(true)
-                        .setPositiveButton(android.R.string.ok,
-                                new DialogInterface.OnClickListener() {
-                                    public void onClick(DialogInterface dialog, int which) {
-                                        chkPref.setChecked(true);
-                                        loadEngines();
-                                    }
-                        })
-                        .setNegativeButton(android.R.string.cancel,
-                                new DialogInterface.OnClickListener() {
-                                    public void onClick(DialogInterface dialog, int which) {
-                                    }
-                        })
-                        .create();
-                d.show();
-            } else {
-                loadEngines();
-            }
-            return true;
         }
+
         return false;
     }
 
     private void updateWidgetState() {
         mPlayExample.setEnabled(mEnableDemo);
-        mUseDefaultPref.setEnabled(mEnableDemo);
         mDefaultRatePref.setEnabled(mEnableDemo);
         mDefaultLocPref.setEnabled(mEnableDemo);
 
@@ -582,14 +540,18 @@
         mDefaultLanguage = "";
         mDefaultCountry = "";
         mDefaultLocVariant = "";
-        if (tokenizer.hasMoreTokens()) {
-            mDefaultLanguage = tokenizer.nextToken().trim();
-        }
-        if (tokenizer.hasMoreTokens()) {
-            mDefaultCountry = tokenizer.nextToken().trim();
-        }
-        if (tokenizer.hasMoreTokens()) {
-            mDefaultLocVariant = tokenizer.nextToken().trim();
+
+        if (locale != null) {
+            String[] components = locale.split(LOCALE_DELIMITER);
+            if (components.length > 0) {
+                mDefaultLanguage = components[0];
+            }
+            if (components.length > 1) {
+                mDefaultCountry = components[1];
+            }
+            if (components.length > 2) {
+                mDefaultLocVariant = components[2];
+            }
         }
     }
 
@@ -683,26 +645,18 @@
 
     private void loadEngines() {
         List<EngineInfo> engines = mEnginesHelper.getEngines();
-        updateUserEnabledEngines(engines);
+        CharSequence entries[] = new CharSequence[engines.size()];
+        CharSequence values[] = new CharSequence[engines.size()];
 
-        ArrayList<CharSequence> entries = new ArrayList<CharSequence>();
-        ArrayList<CharSequence> values = new ArrayList<CharSequence>();
-        StringBuilder enabledEngines = new StringBuilder();
-
-        for (EngineInfo engine : engines) {
-            Log.v(TAG, "Engine: " + engine);
-            if (mEnginesHelper.isEngineEnabled(engine.name)) {
-                entries.add(engine.label);
-                values.add(engine.name);
-            }
+        final int count = engines.size();
+        for (int i = 0; i < count; ++i) {
+            final EngineInfo engine = engines.get(i);
+            entries[i] = engine.label;
+            values[i] = engine.name;
         }
 
-
-        CharSequence entriesArray[] = new CharSequence[entries.size()];
-        CharSequence valuesArray[] = new CharSequence[values.size()];
-
-        mDefaultSynthPref.setEntries(entries.toArray(entriesArray));
-        mDefaultSynthPref.setEntryValues(values.toArray(valuesArray));
+        mDefaultSynthPref.setEntries(entries);
+        mDefaultSynthPref.setEntryValues(values);
 
         // Set the selected engine based on the saved preference
         String selectedEngine = Settings.Secure.getString(getContentResolver(), TTS_DEFAULT_SYNTH);
@@ -716,26 +670,51 @@
         }
     }
 
-    /*
-     * Write out the list of engines enabled by the user to a
-     * shared preference.
-     */
-    private void updateUserEnabledEngines(List<EngineInfo> engines) {
-        StringBuilder enginesList = new StringBuilder();
-        for (EngineInfo engine : engines) {
-            if (isEngineUserEnabled(engine.name)) {
-                if (enginesList.length() > 0) enginesList.append(' ');
-                enginesList.append(engine.name);
+    private void displayDataAlert(Preference pref, final String key) {
+        Log.v(TAG, "Displaying data alert for :" + key);
+        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+        builder.setTitle(android.R.string.dialog_alert_title);
+        builder.setIcon(android.R.drawable.ic_dialog_alert);
+        builder.setMessage(getActivity().getString(
+                R.string.tts_engine_security_warning, pref.getTitle()));
+        builder.setCancelable(true);
+        builder.setPositiveButton(android.R.string.ok,
+                new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int which) {
+                       updateDefaultEngine(key);
+                       loadEngines();
+                       initEngineSpecificSettings();
+                    }
+                });
+        builder.setNegativeButton(android.R.string.cancel, null);
+
+        AlertDialog dialog = builder.create();
+        dialog.show();
+    }
+
+    private void updateDefaultEngine(String engine) {
+        Log.v(TAG, "Updating default synth to : " + engine);
+        if (mTts != null) {
+            try {
+                mTts.shutdown();
+                mTts = null;
+            } catch (Exception e) {
+                Log.e(TAG, "Error shutting down TTS engine" + e);
             }
         }
 
-        ContentResolver resolver = getContentResolver();
-        Settings.Secure.putString(resolver, TTS_ENABLED_PLUGINS, enginesList.toString());
-    }
+        mTts = new TextToSpeech(getActivity().getApplicationContext(), this, engine);
+        mEnableDemo = false;
+        mVoicesMissing = false;
+        updateWidgetState();
+        checkVoiceData();
 
-    private boolean isEngineUserEnabled(String engineName) {
-        String enginePref = KEY_PLUGIN_ENABLED_PREFIX + engineName;
-        return getPreferenceManager().getSharedPreferences().getBoolean(enginePref, false);
+        // Finally, persist this value to settings.
+        Settings.Secure.putString(getContentResolver(), TTS_DEFAULT_SYNTH, engine);
+        // .. and update the UI.
+        mDefaultSynthPref.setValue(engine);
+
+        Log.v(TAG, "The default synth is now: " + engine);
     }
 
 }