diff options
author | Satoshi Kataoka <satok@google.com> | 2012-10-09 17:34:04 +0900 |
---|---|---|
committer | Satoshi Kataoka <satok@google.com> | 2012-10-12 00:58:24 +0900 |
commit | 1eac6b7b0554eb126d113e49009208a1da5f23d9 (patch) | |
tree | c0bc06c376ef5758bcc94344f3205d02f93879b4 | |
parent | e1f4ebf559f7ddbfe19ea9a1823a62f3d8b80d71 (diff) | |
download | frameworks_base-1eac6b7b0554eb126d113e49009208a1da5f23d9.zip frameworks_base-1eac6b7b0554eb126d113e49009208a1da5f23d9.tar.gz frameworks_base-1eac6b7b0554eb126d113e49009208a1da5f23d9.tar.bz2 |
Don't update the text services locale in the main thread
This is a revised version of I9f8a81d3c9261a6cfc00292b9f5cb06053b9112d
Bug: 6761326
Change-Id: I43a0a65df6e4b6941bd0dca548c4af20b7e5bf58
-rw-r--r-- | core/java/android/view/textservice/TextServicesManager.java | 6 | ||||
-rw-r--r-- | core/java/android/widget/TextView.java | 37 |
2 files changed, 42 insertions, 1 deletions
diff --git a/core/java/android/view/textservice/TextServicesManager.java b/core/java/android/view/textservice/TextServicesManager.java index 81b36db..e0e19b9 100644 --- a/core/java/android/view/textservice/TextServicesManager.java +++ b/core/java/android/view/textservice/TextServicesManager.java @@ -217,6 +217,12 @@ public final class TextServicesManager { public SpellCheckerSubtype getCurrentSpellCheckerSubtype( boolean allowImplicitlySelectedSubtype) { try { + if (sService == null) { + // TODO: This is a workaround. Needs to investigate why sService could be null + // here. + Log.e(TAG, "sService is null."); + return null; + } // Passing null as a locale until we support multiple enabled spell checker subtypes. return sService.getCurrentSpellCheckerSubtype(null, allowImplicitlySelectedSubtype); } catch (RemoteException e) { diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 410a0ca..958b669 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -33,6 +33,7 @@ import android.graphics.RectF; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.inputmethodservice.ExtractEditText; +import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -132,6 +133,7 @@ import java.io.IOException; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Locale; +import java.util.concurrent.locks.ReentrantLock; /** * Displays text to the user and optionally allows them to edit it. A TextView @@ -378,6 +380,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private InputFilter[] mFilters = NO_FILTERS; + private volatile Locale mCurrentTextServicesLocaleCache; + private final ReentrantLock mCurrentTextServicesLocaleLock = new ReentrantLock(); + // It is possible to have a selection even when mEditor is null (programmatically set, like when // a link is pressed). These highlight-related fields do not go in mEditor. int mHighlightColor = 0x6633B5E5; @@ -7675,13 +7680,43 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener /** * This is a temporary method. Future versions may support multi-locale text. + * Caveat: This method may not return the latest text services locale, but this should be + * acceptable and it's more important to make this method asynchronous. * * @return The locale that should be used for a word iterator and a spell checker * in this TextView, based on the current spell checker settings, * the current IME's locale, or the system default locale. * @hide */ + // TODO: Support multi-locale + // TODO: Update the text services locale immediately after the keyboard locale is switched + // by catching intent of keyboard switch event public Locale getTextServicesLocale() { + if (mCurrentTextServicesLocaleCache == null) { + // If there is no cached text services locale, just return the default locale. + mCurrentTextServicesLocaleCache = Locale.getDefault(); + } + // Start fetching the text services locale asynchronously. + updateTextServicesLocaleAsync(); + return mCurrentTextServicesLocaleCache; + } + + private void updateTextServicesLocaleAsync() { + AsyncTask.execute(new Runnable() { + @Override + public void run() { + if (mCurrentTextServicesLocaleLock.tryLock()) { + try { + updateTextServicesLocaleLocked(); + } finally { + mCurrentTextServicesLocaleLock.unlock(); + } + } + } + }); + } + + private void updateTextServicesLocaleLocked() { Locale locale = Locale.getDefault(); final TextServicesManager textServicesManager = (TextServicesManager) mContext.getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE); @@ -7689,7 +7724,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (subtype != null) { locale = SpellCheckerSubtype.constructLocaleFromString(subtype.getLocale()); } - return locale; + mCurrentTextServicesLocaleCache = locale; } void onLocaleChanged() { |