From 68e2af55d65d2e61fbf8096eccaa2e4ca02b6c5a Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Mon, 28 Nov 2011 17:10:04 +0000 Subject: [PATCH] Fix TTS instantiation from webview accessibility handlers. The TTS instantiated from here shouldn't clobber any existing TTS objects opened within the same package context. Ideally, the TTS API should work fine with multiple TTS object instances within the same package context but making that happen correctly is a larger change. bug:5659758 Change-Id: Ia1f63c61b9f12ac92ff42a427a004d414e42a759 --- .../java/android/speech/tts/TextToSpeech.java | 20 ++++++++++++++++++- .../speech/tts/TextToSpeechService.java | 6 +++--- core/java/android/webkit/WebView.java | 11 ++++++++-- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java index 38699eaad44fa..a220615c00796 100755 --- a/core/java/android/speech/tts/TextToSpeech.java +++ b/core/java/android/speech/tts/TextToSpeech.java @@ -490,6 +490,7 @@ public class TextToSpeech { private final Map mUtterances; private final Bundle mParams = new Bundle(); private final TtsEngines mEnginesHelper; + private final String mPackageName; private volatile String mCurrentEngine = null; /** @@ -518,19 +519,36 @@ public class TextToSpeech { * @param engine Package name of the TTS engine to use. */ public TextToSpeech(Context context, OnInitListener listener, String engine) { + this(context, listener, engine, null); + } + + /** + * Used by the framework to instantiate TextToSpeech objects with a supplied + * package name, instead of using {@link android.content.Context#getPackageName()} + * + * @hide + */ + public TextToSpeech(Context context, OnInitListener listener, String engine, + String packageName) { mContext = context; mInitListener = listener; mRequestedEngine = engine; mEarcons = new HashMap(); mUtterances = new HashMap(); + mUtteranceProgressListener = null; mEnginesHelper = new TtsEngines(mContext); + if (packageName != null) { + mPackageName = packageName; + } else { + mPackageName = mContext.getPackageName(); + } initTts(); } private String getPackageName() { - return mContext.getPackageName(); + return mPackageName; } private R runActionNoReconnect(Action action, R errorResult, String method) { diff --git a/core/java/android/speech/tts/TextToSpeechService.java b/core/java/android/speech/tts/TextToSpeechService.java index f82a659c6c771..aee678a2ffaa3 100644 --- a/core/java/android/speech/tts/TextToSpeechService.java +++ b/core/java/android/speech/tts/TextToSpeechService.java @@ -450,7 +450,7 @@ public abstract class TextToSpeechService extends Service { @Override public void dispatchOnDone() { final String utteranceId = getUtteranceId(); - if (!TextUtils.isEmpty(utteranceId)) { + if (utteranceId != null) { mCallbacks.dispatchOnDone(getCallingApp(), utteranceId); } } @@ -458,7 +458,7 @@ public abstract class TextToSpeechService extends Service { @Override public void dispatchOnStart() { final String utteranceId = getUtteranceId(); - if (!TextUtils.isEmpty(utteranceId)) { + if (utteranceId != null) { mCallbacks.dispatchOnStart(getCallingApp(), utteranceId); } } @@ -466,7 +466,7 @@ public abstract class TextToSpeechService extends Service { @Override public void dispatchOnError() { final String utteranceId = getUtteranceId(); - if (!TextUtils.isEmpty(utteranceId)) { + if (utteranceId != null) { mCallbacks.dispatchOnError(getCallingApp(), utteranceId); } } diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 877c9ea64b23c..15c8f9234d82e 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -1306,8 +1306,15 @@ public class WebView extends AbsoluteLayout if (AccessibilityManager.getInstance(mContext).isEnabled() && getSettings().getJavaScriptEnabled()) { // exposing the TTS for now ... - mTextToSpeech = new TextToSpeech(getContext(), null); - addJavascriptInterface(mTextToSpeech, ALIAS_ACCESSIBILITY_JS_INTERFACE); + final Context ctx = getContext(); + if (ctx != null) { + final String packageName = ctx.getPackageName(); + if (packageName != null) { + mTextToSpeech = new TextToSpeech(getContext(), null, null, + packageName + ".**webview**"); + addJavascriptInterface(mTextToSpeech, ALIAS_ACCESSIBILITY_JS_INTERFACE); + } + } } }