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/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);
     }
 
 }