Update the Text-To-Speech settings screen to allow listening to a TTS
example after checking that the data required by the TTS engine is
properly installed.
Removed use of local constants for the the default TTS values, use
the values defined in TextToSpeech.Engine instead.
diff --git a/src/com/android/settings/TextToSpeechSettings.java b/src/com/android/settings/TextToSpeechSettings.java
index 79a841b..ca58afd 100644
--- a/src/com/android/settings/TextToSpeechSettings.java
+++ b/src/com/android/settings/TextToSpeechSettings.java
@@ -22,44 +22,89 @@
 import static android.provider.Settings.Secure.TTS_DEFAULT_LANG;
 
 import android.content.ContentResolver;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.os.Bundle;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.CheckBoxPreference;
 import android.provider.Settings;
+import android.speech.tts.TextToSpeech;
 import android.util.Log;
 
+import java.util.List;
+
 public class TextToSpeechSettings extends PreferenceActivity implements
-        Preference.OnPreferenceChangeListener {
+        Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener,
+        TextToSpeech.OnInitListener {
 
     private static final String TAG = "TextToSpeechSettings";
-    
-    /** If there is no setting in the provider, use this. */
-    private static final int FALLBACK_TTS_DEFAULT_RATE = 100; // 1x
-    private static final int FALLBACK_TTS_DEFAULT_PITCH = 100;// 1x
-    private static final int FALLBACK_TTS_USE_DEFAULTS = 1;
-    private static final String FALLBACK_TTS_DEFAULT_LANG = "en-rUS";
 
-    private static final String KEY_TTS_USE_DEFAULT =
-            "toggle_use_default_tts_settings";
+    private static final String KEY_TTS_PLAY_EXAMPLE = "tts_play_example";
+    private static final String KEY_TTS_USE_DEFAULT = "toggle_use_default_tts_settings";
     private static final String KEY_TTS_DEFAULT_RATE = "tts_default_rate";
     private static final String KEY_TTS_DEFAULT_PITCH = "tts_default_pitch";
     private static final String KEY_TTS_DEFAULT_LANG = "tts_default_lang";
-    
+
+    // TODO move this to android.speech.tts.TextToSpeech.Engine
+    private static final String FALLBACK_TTS_DEFAULT_SYNTH = "com.svox.pico";
+
+    private Preference         mPlayExample = null;
     private CheckBoxPreference mUseDefaultPref = null;
     private ListPreference     mDefaultRatePref = null;
     private ListPreference     mDefaultPitchPref = null;
     private ListPreference     mDefaultLangPref = null;
-    
-    
+    private String             mDefaultEng = "";
+
+    private boolean mEnableDemo = false;
+
+    private TextToSpeech mTts = null;
+
+    /**
+     * Request code (arbitrary value) for voice data check through
+     * startActivityForResult.
+     */
+    private static final int VOICE_DATA_INTEGRITY_CHECK = 1977;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         addPreferencesFromResource(R.xml.tts_settings);
-        
+
+        initDemo();
         initDefaultSettings();
+
+        checkVoiceData();
+    }
+    
+    
+    @Override
+    protected void onResume() {
+        super.onResume();
+        // whenever we return to this screen, we don't know the state of the
+        // system, so we have to recheck that we can play the demo, or it must be disabled.
+        mEnableDemo = false;
+        initDemo();
+    }
+
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (mTts != null) {
+            mTts.shutdown();
+        }
+    }
+
+
+    private void initDemo() {
+        mPlayExample = findPreference(KEY_TTS_PLAY_EXAMPLE);
+        mPlayExample.setEnabled(mEnableDemo);
+        mPlayExample.setOnPreferenceClickListener(this);
     }
 
 
@@ -71,30 +116,33 @@
             (CheckBoxPreference) findPreference(KEY_TTS_USE_DEFAULT);
         mUseDefaultPref.setChecked(Settings.Secure.getInt(resolver,
                 TTS_USE_DEFAULTS,
-                FALLBACK_TTS_USE_DEFAULTS) == 1 ? true : false);
+                TextToSpeech.Engine.FALLBACK_TTS_USE_DEFAULTS) == 1 ? true : false);
         mUseDefaultPref.setOnPreferenceChangeListener(this);
 
+        // Default engine
+        mDefaultEng = FALLBACK_TTS_DEFAULT_SYNTH;
+
         // Default rate
         mDefaultRatePref =
             (ListPreference) findPreference(KEY_TTS_DEFAULT_RATE);
         mDefaultRatePref.setValue(String.valueOf(Settings.Secure.getInt(
-                resolver, TTS_DEFAULT_RATE, FALLBACK_TTS_DEFAULT_RATE)));
+                resolver, TTS_DEFAULT_RATE, TextToSpeech.Engine.FALLBACK_TTS_DEFAULT_RATE)));
         mDefaultRatePref.setOnPreferenceChangeListener(this);
 
         // Default pitch
         mDefaultPitchPref =
             (ListPreference) findPreference(KEY_TTS_DEFAULT_PITCH);
         mDefaultPitchPref.setValue(String.valueOf(Settings.Secure.getInt(
-                resolver, TTS_DEFAULT_PITCH, FALLBACK_TTS_DEFAULT_PITCH)));
+                resolver, TTS_DEFAULT_PITCH, TextToSpeech.Engine.FALLBACK_TTS_DEFAULT_PITCH)));
         mDefaultPitchPref.setOnPreferenceChangeListener(this);
-        
+
         // Default language
         mDefaultLangPref =
                 (ListPreference) findPreference(KEY_TTS_DEFAULT_LANG);
         String defaultLang = String.valueOf(Settings.Secure.getString(resolver, 
                 TTS_DEFAULT_LANG));
         if (defaultLang.compareTo("null") == 0) {
-            mDefaultLangPref.setValue(FALLBACK_TTS_DEFAULT_LANG);
+            mDefaultLangPref.setValue(TextToSpeech.Engine.FALLBACK_TTS_DEFAULT_LANG);
             Log.i(TAG, "TTS initDefaultSettings() default lang null ");
         } else {
             mDefaultLangPref.setValue(defaultLang);
@@ -104,6 +152,55 @@
     }
 
 
+    private void checkVoiceData() {
+        PackageManager pm = getPackageManager();
+        Intent intent = new Intent();
+        intent.setAction("android.intent.action.CHECK_TTS_DATA");
+        List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
+        // query only the package that matches that of the default engine
+        for (int i = 0; i < resolveInfos.size(); i++) {
+            ActivityInfo currentActivityInfo = resolveInfos.get(i).activityInfo;
+            if (mDefaultEng.equals(currentActivityInfo.packageName)) {
+                intent.setClassName(mDefaultEng, currentActivityInfo.name);
+                this.startActivityForResult(intent, VOICE_DATA_INTEGRITY_CHECK);
+            }
+        }
+    }
+
+
+    /**
+     * Called when the TTS engine is initialized.
+     */
+    public void onInit(int status) {
+        if (status == TextToSpeech.TTS_SUCCESS) {
+            Log.v(TAG, "TTS engine for settings screen initialized.");
+            mEnableDemo = true;
+        } else {
+            Log.v(TAG, "TTS engine for settings screen failed to initialize successfully.");
+            mEnableDemo = false;
+        }
+        mPlayExample.setEnabled(mEnableDemo);
+    }
+
+
+    /**
+     * Called when voice data integrity check returns
+     */
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode == VOICE_DATA_INTEGRITY_CHECK) {
+            if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
+                Log.v(TAG, "Voice data check passed");
+                if (mTts == null) {
+                    mTts = new TextToSpeech(this, this);
+                }
+            } else {
+                Log.v(TAG, "Voice data check failed");
+
+            }
+        }
+    }
+
+
     public boolean onPreferenceChange(Preference preference, Object objValue) {
         if (KEY_TTS_USE_DEFAULT.equals(preference.getKey())) {
             // "Use Defaults"
@@ -131,7 +228,7 @@
             } catch (NumberFormatException e) {
                 Log.e(TAG, "could not persist default TTS pitch setting", e);
             }
-        }else if (KEY_TTS_DEFAULT_LANG.equals(preference.getKey())) {
+        } else if (KEY_TTS_DEFAULT_LANG.equals(preference.getKey())) {
             // Default language
             String value = (String) objValue;
             Settings.Secure.putString(getContentResolver(),
@@ -142,4 +239,16 @@
         return true;
     }
     
+
+    public boolean onPreferenceClick(Preference preference) {
+        if (preference == mPlayExample) {
+            if (mTts != null) {
+                mTts.speak(getResources().getString(R.string.tts_demo),
+                        TextToSpeech.TTS_QUEUE_FLUSH, null);
+            }
+            return true;
+        }
+        return false;
+    }
+
 }