Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e767115 authored by Satoshi Kataoka's avatar Satoshi Kataoka Committed by Android (Google) Code Review
Browse files

Merge "Don't update the text services locale in the main thread" into jb-mr1-dev

parents 524dcb7e 1eac6b7b
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -217,6 +217,12 @@ public final class TextServicesManager {
    public SpellCheckerSubtype getCurrentSpellCheckerSubtype(
    public SpellCheckerSubtype getCurrentSpellCheckerSubtype(
            boolean allowImplicitlySelectedSubtype) {
            boolean allowImplicitlySelectedSubtype) {
        try {
        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.
            // Passing null as a locale until we support multiple enabled spell checker subtypes.
            return sService.getCurrentSpellCheckerSubtype(null, allowImplicitlySelectedSubtype);
            return sService.getCurrentSpellCheckerSubtype(null, allowImplicitlySelectedSubtype);
        } catch (RemoteException e) {
        } catch (RemoteException e) {
+36 −1
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@ import android.graphics.RectF;
import android.graphics.Typeface;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable;
import android.inputmethodservice.ExtractEditText;
import android.inputmethodservice.ExtractEditText;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler;
import android.os.Message;
import android.os.Message;
@@ -132,6 +133,7 @@ import java.io.IOException;
import java.lang.ref.WeakReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Locale;
import java.util.Locale;
import java.util.concurrent.locks.ReentrantLock;


/**
/**
 * Displays text to the user and optionally allows them to edit it.  A TextView
 * 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 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
    // 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.
    // a link is pressed). These highlight-related fields do not go in mEditor.
    int mHighlightColor = 0x6633B5E5;
    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.
     * 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
     * @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,
     * in this TextView, based on the current spell checker settings,
     * the current IME's locale, or the system default locale.
     * the current IME's locale, or the system default locale.
     * @hide
     * @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() {
    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();
        Locale locale = Locale.getDefault();
        final TextServicesManager textServicesManager = (TextServicesManager)
        final TextServicesManager textServicesManager = (TextServicesManager)
                mContext.getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
                mContext.getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
@@ -7689,7 +7724,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        if (subtype != null) {
        if (subtype != null) {
            locale = SpellCheckerSubtype.constructLocaleFromString(subtype.getLocale());
            locale = SpellCheckerSubtype.constructLocaleFromString(subtype.getLocale());
        }
        }
        return locale;
        mCurrentTextServicesLocaleCache = locale;
    }
    }


    void onLocaleChanged() {
    void onLocaleChanged() {