am 377b21e9: Merge change 9502 into donut

Merge commit '377b21e9f531e3fec1a5849453f886b5462e4144'

* commit '377b21e9f531e3fec1a5849453f886b5462e4144':
  Fix bug 2025765.
diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java
index 1b99d32..70960b5 100755
--- a/packages/TtsService/src/android/tts/TtsService.java
+++ b/packages/TtsService/src/android/tts/TtsService.java
@@ -142,6 +142,8 @@
     private final ReentrantLock synthesizerLock = new ReentrantLock();
 
     private static SynthProxy sNativeSynth = null;
+    private static Boolean sIsKillingSynth = true;
+
     @Override
     public void onCreate() {
         super.onCreate();
@@ -152,6 +154,7 @@
         String soLibPath = "/system/lib/libttspico.so";
         if (sNativeSynth == null) {
             sNativeSynth = new SynthProxy(soLibPath);
+            sIsKillingSynth = false;
         }
 
         mSelf = this;
@@ -172,6 +175,9 @@
     @Override
     public void onDestroy() {
         super.onDestroy();
+
+        sIsKillingSynth = true;
+        Log.i("TtsService", "TtsService.onDestroy()");
         // Don't hog the media player
         cleanUpPlayer();
 
@@ -180,6 +186,7 @@
 
         // Unregister all callbacks.
         mCallbacks.kill();
+        //Log.i("TtsService", "TtsService.onDestroy() ended");
     }
 
 
@@ -243,6 +250,9 @@
 
 
     private int setSpeechRate(String callingApp, int rate) {
+        if (sIsKillingSynth) {
+            return TextToSpeech.ERROR;
+        }
         if (isDefaultEnforced()) {
             return sNativeSynth.setSpeechRate(getDefaultRate());
         } else {
@@ -252,23 +262,37 @@
 
 
     private int setPitch(String callingApp, int pitch) {
+        if (sIsKillingSynth) {
+            return TextToSpeech.ERROR;
+        }
         return sNativeSynth.setPitch(pitch);
     }
 
 
     private int isLanguageAvailable(String lang, String country, String variant) {
+        if (sIsKillingSynth) {
+            return TextToSpeech.LANG_NOT_SUPPORTED;
+        }
         //Log.v("TtsService", "TtsService.isLanguageAvailable(" + lang + ", " + country + ", " +variant+")");
         return sNativeSynth.isLanguageAvailable(lang, country, variant);
     }
 
 
     private String[] getLanguage() {
+        if (sIsKillingSynth) {
+            Log.v("TtsService", "killing synth:: aborting getLanguage()");
+            return null;
+        }
         return sNativeSynth.getLanguage();
     }
 
 
     private int setLanguage(String callingApp, String lang, String country, String variant) {
         Log.v("TtsService", "TtsService.setLanguage(" + lang + ", " + country + ", " + variant + ")");
+        if (sIsKillingSynth) {
+            Log.v("TtsService", "killing synth:: aborting setLanguage()");
+            return TextToSpeech.ERROR;
+        }
         if (isDefaultEnforced()) {
             return sNativeSynth.setLanguage(getDefaultLanguage(), getDefaultCountry(),
                     getDefaultLocVariant());
@@ -402,7 +426,12 @@
                 }
                 if ((mCurrentSpeechItem != null) &&
                      mCurrentSpeechItem.mCallingApp.equals(callingApp)) {
-                    result = sNativeSynth.stop();
+                    if (sIsKillingSynth) {
+                        Log.v("TtsService", "killing synth:: aborting stop()");
+                        result = TextToSpeech.ERROR;
+                    } else {
+                        result = sNativeSynth.stop();
+                    }
                     mKillList.put(mCurrentSpeechItem, true);
                     if (mPlayer != null) {
                         try {
@@ -451,7 +480,12 @@
                 if ((mCurrentSpeechItem != null) &&
                     ((mCurrentSpeechItem.mType != SpeechItem.TEXT_TO_FILE) ||
                       mCurrentSpeechItem.mCallingApp.equals(callingApp))) {
-                    result = sNativeSynth.stop();
+                    if (sIsKillingSynth) {
+                        Log.v("TtsService", "killing synth:: aborting stop()");
+                        result = TextToSpeech.ERROR;
+                    } else {
+                        result = sNativeSynth.stop();
+                    }
                     mKillList.put(mCurrentSpeechItem, true);
                     if (mPlayer != null) {
                         try {
@@ -591,7 +625,9 @@
                         if (speechRate.length() > 0){
                             setSpeechRate("", Integer.parseInt(speechRate));
                         }
-                        sNativeSynth.speak(speechItem.mText, streamType);
+                        if (!sIsKillingSynth) {
+                            sNativeSynth.speak(speechItem.mText, streamType);
+                        }
                     }
                 } catch (InterruptedException e) {
                     Log.e("TtsService", "TTS speakInternalOnly(): tryLock interrupted");
@@ -660,7 +696,9 @@
                         if (speechRate.length() > 0){
                             setSpeechRate("", Integer.parseInt(speechRate));
                         }
-                        sNativeSynth.synthesizeToFile(speechItem.mText, speechItem.mFilename);
+                        if (!sIsKillingSynth) {
+                            sNativeSynth.synthesizeToFile(speechItem.mText, speechItem.mFilename);
+                        }
                     }
                 } catch (InterruptedException e) {
                     Log.e("TtsService", "TTS synthToFileInternalOnly(): tryLock interrupted");