Search in sources :

Example 11 with SpellCheckerSubtype

use of android.view.textservice.SpellCheckerSubtype in project platform_frameworks_base by android.

the class TextView method updateTextServicesLocaleLocked.

private void updateTextServicesLocaleLocked() {
    final TextServicesManager textServicesManager = (TextServicesManager) mContext.getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
    final SpellCheckerSubtype subtype = textServicesManager.getCurrentSpellCheckerSubtype(true);
    final Locale locale;
    if (subtype != null) {
        locale = subtype.getLocaleObject();
    } else {
        locale = null;
    }
    mCurrentSpellCheckerLocaleCache = locale;
}
Also used : SpellCheckerSubtype(android.view.textservice.SpellCheckerSubtype) Locale(java.util.Locale) TextServicesManager(android.view.textservice.TextServicesManager)

Example 12 with SpellCheckerSubtype

use of android.view.textservice.SpellCheckerSubtype in project android_frameworks_base by ParanoidAndroid.

the class TextView method updateTextServicesLocaleLocked.

private void updateTextServicesLocaleLocked() {
    final TextServicesManager textServicesManager = (TextServicesManager) mContext.getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
    final SpellCheckerSubtype subtype = textServicesManager.getCurrentSpellCheckerSubtype(true);
    final Locale locale;
    if (subtype != null) {
        locale = SpellCheckerSubtype.constructLocaleFromString(subtype.getLocale());
    } else {
        locale = null;
    }
    mCurrentSpellCheckerLocaleCache = locale;
}
Also used : SpellCheckerSubtype(android.view.textservice.SpellCheckerSubtype) Locale(java.util.Locale) TextServicesManager(android.view.textservice.TextServicesManager)

Example 13 with SpellCheckerSubtype

use of android.view.textservice.SpellCheckerSubtype in project platform_frameworks_base by android.

the class TextServicesManagerService method getCurrentSpellCheckerSubtype.

// TODO: Respect allowImplicitlySelectedSubtype
// TODO: Save SpellCheckerSubtype by supported languages by looking at "locale".
@Override
public SpellCheckerSubtype getCurrentSpellCheckerSubtype(String locale, boolean allowImplicitlySelectedSubtype) {
    // TODO: Make this work even for non-current users?
    if (!calledFromValidUser()) {
        return null;
    }
    final int subtypeHashCode;
    final SpellCheckerInfo sci;
    final Locale systemLocale;
    synchronized (mSpellCheckerMap) {
        subtypeHashCode = mSettings.getSelectedSpellCheckerSubtype(SpellCheckerSubtype.SUBTYPE_ID_NONE);
        if (DBG) {
            Slog.w(TAG, "getCurrentSpellCheckerSubtype: " + subtypeHashCode);
        }
        sci = getCurrentSpellChecker(null);
        systemLocale = mContext.getResources().getConfiguration().locale;
    }
    if (sci == null || sci.getSubtypeCount() == 0) {
        if (DBG) {
            Slog.w(TAG, "Subtype not found.");
        }
        return null;
    }
    if (subtypeHashCode == SpellCheckerSubtype.SUBTYPE_ID_NONE && !allowImplicitlySelectedSubtype) {
        return null;
    }
    String candidateLocale = null;
    if (subtypeHashCode == 0) {
        // Spell checker language settings == "auto"
        final InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
        if (imm != null) {
            final InputMethodSubtype currentInputMethodSubtype = imm.getCurrentInputMethodSubtype();
            if (currentInputMethodSubtype != null) {
                final String localeString = currentInputMethodSubtype.getLocale();
                if (!TextUtils.isEmpty(localeString)) {
                    // 1. Use keyboard locale if available in the spell checker
                    candidateLocale = localeString;
                }
            }
        }
        if (candidateLocale == null) {
            // 2. Use System locale if available in the spell checker
            candidateLocale = systemLocale.toString();
        }
    }
    SpellCheckerSubtype candidate = null;
    for (int i = 0; i < sci.getSubtypeCount(); ++i) {
        final SpellCheckerSubtype scs = sci.getSubtypeAt(i);
        if (subtypeHashCode == 0) {
            final String scsLocale = scs.getLocale();
            if (candidateLocale.equals(scsLocale)) {
                return scs;
            } else if (candidate == null) {
                if (candidateLocale.length() >= 2 && scsLocale.length() >= 2 && candidateLocale.startsWith(scsLocale)) {
                    // Fall back to the applicable language
                    candidate = scs;
                }
            }
        } else if (scs.hashCode() == subtypeHashCode) {
            if (DBG) {
                Slog.w(TAG, "Return subtype " + scs.hashCode() + ", input= " + locale + ", " + scs.getLocale());
            }
            // 3. Use the user specified spell check language
            return scs;
        }
    }
    // spell check languages
    return candidate;
}
Also used : Locale(java.util.Locale) SpellCheckerSubtype(android.view.textservice.SpellCheckerSubtype) InputMethodSubtype(android.view.inputmethod.InputMethodSubtype) InputMethodManager(android.view.inputmethod.InputMethodManager) SpellCheckerInfo(android.view.textservice.SpellCheckerInfo)

Example 14 with SpellCheckerSubtype

use of android.view.textservice.SpellCheckerSubtype in project android_frameworks_base by DirtyUnicorns.

the class TextServicesManagerService method findAvailSpellCheckerLocked.

private SpellCheckerInfo findAvailSpellCheckerLocked(String prefPackage) {
    final int spellCheckersCount = mSpellCheckerList.size();
    if (spellCheckersCount == 0) {
        Slog.w(TAG, "no available spell checker services found");
        return null;
    }
    if (prefPackage != null) {
        for (int i = 0; i < spellCheckersCount; ++i) {
            final SpellCheckerInfo sci = mSpellCheckerList.get(i);
            if (prefPackage.equals(sci.getPackageName())) {
                if (DBG) {
                    Slog.d(TAG, "findAvailSpellCheckerLocked: " + sci.getPackageName());
                }
                return sci;
            }
        }
    }
    // Look up a spell checker based on the system locale.
    // TODO: Still there is a room to improve in the following logic: e.g., check if the package
    // is pre-installed or not.
    final Locale systemLocal = mContext.getResources().getConfiguration().locale;
    final ArrayList<Locale> suitableLocales = InputMethodUtils.getSuitableLocalesForSpellChecker(systemLocal);
    if (DBG) {
        Slog.w(TAG, "findAvailSpellCheckerLocked suitableLocales=" + Arrays.toString(suitableLocales.toArray(new Locale[suitableLocales.size()])));
    }
    final int localeCount = suitableLocales.size();
    for (int localeIndex = 0; localeIndex < localeCount; ++localeIndex) {
        final Locale locale = suitableLocales.get(localeIndex);
        for (int spellCheckersIndex = 0; spellCheckersIndex < spellCheckersCount; ++spellCheckersIndex) {
            final SpellCheckerInfo info = mSpellCheckerList.get(spellCheckersIndex);
            final int subtypeCount = info.getSubtypeCount();
            for (int subtypeIndex = 0; subtypeIndex < subtypeCount; ++subtypeIndex) {
                final SpellCheckerSubtype subtype = info.getSubtypeAt(subtypeIndex);
                final Locale subtypeLocale = InputMethodUtils.constructLocaleFromString(subtype.getLocale());
                if (locale.equals(subtypeLocale)) {
                    // returning the first found one.
                    return info;
                }
            }
        }
    }
    if (spellCheckersCount > 1) {
        Slog.w(TAG, "more than one spell checker service found, picking first");
    }
    return mSpellCheckerList.get(0);
}
Also used : Locale(java.util.Locale) SpellCheckerSubtype(android.view.textservice.SpellCheckerSubtype) SpellCheckerInfo(android.view.textservice.SpellCheckerInfo)

Example 15 with SpellCheckerSubtype

use of android.view.textservice.SpellCheckerSubtype in project android_frameworks_base by DirtyUnicorns.

the class TextServicesManagerService method getCurrentSpellCheckerSubtype.

// TODO: Respect allowImplicitlySelectedSubtype
// TODO: Save SpellCheckerSubtype by supported languages by looking at "locale".
@Override
public SpellCheckerSubtype getCurrentSpellCheckerSubtype(String locale, boolean allowImplicitlySelectedSubtype) {
    // TODO: Make this work even for non-current users?
    if (!calledFromValidUser()) {
        return null;
    }
    final int subtypeHashCode;
    final SpellCheckerInfo sci;
    final Locale systemLocale;
    synchronized (mSpellCheckerMap) {
        subtypeHashCode = mSettings.getSelectedSpellCheckerSubtype(SpellCheckerSubtype.SUBTYPE_ID_NONE);
        if (DBG) {
            Slog.w(TAG, "getCurrentSpellCheckerSubtype: " + subtypeHashCode);
        }
        sci = getCurrentSpellChecker(null);
        systemLocale = mContext.getResources().getConfiguration().locale;
    }
    if (sci == null || sci.getSubtypeCount() == 0) {
        if (DBG) {
            Slog.w(TAG, "Subtype not found.");
        }
        return null;
    }
    if (subtypeHashCode == SpellCheckerSubtype.SUBTYPE_ID_NONE && !allowImplicitlySelectedSubtype) {
        return null;
    }
    String candidateLocale = null;
    if (subtypeHashCode == 0) {
        // Spell checker language settings == "auto"
        final InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
        if (imm != null) {
            final InputMethodSubtype currentInputMethodSubtype = imm.getCurrentInputMethodSubtype();
            if (currentInputMethodSubtype != null) {
                final String localeString = currentInputMethodSubtype.getLocale();
                if (!TextUtils.isEmpty(localeString)) {
                    // 1. Use keyboard locale if available in the spell checker
                    candidateLocale = localeString;
                }
            }
        }
        if (candidateLocale == null) {
            // 2. Use System locale if available in the spell checker
            candidateLocale = systemLocale.toString();
        }
    }
    SpellCheckerSubtype candidate = null;
    for (int i = 0; i < sci.getSubtypeCount(); ++i) {
        final SpellCheckerSubtype scs = sci.getSubtypeAt(i);
        if (subtypeHashCode == 0) {
            final String scsLocale = scs.getLocale();
            if (candidateLocale.equals(scsLocale)) {
                return scs;
            } else if (candidate == null) {
                if (candidateLocale.length() >= 2 && scsLocale.length() >= 2 && candidateLocale.startsWith(scsLocale)) {
                    // Fall back to the applicable language
                    candidate = scs;
                }
            }
        } else if (scs.hashCode() == subtypeHashCode) {
            if (DBG) {
                Slog.w(TAG, "Return subtype " + scs.hashCode() + ", input= " + locale + ", " + scs.getLocale());
            }
            // 3. Use the user specified spell check language
            return scs;
        }
    }
    // spell check languages
    return candidate;
}
Also used : Locale(java.util.Locale) SpellCheckerSubtype(android.view.textservice.SpellCheckerSubtype) InputMethodSubtype(android.view.inputmethod.InputMethodSubtype) InputMethodManager(android.view.inputmethod.InputMethodManager) SpellCheckerInfo(android.view.textservice.SpellCheckerInfo)

Aggregations

SpellCheckerSubtype (android.view.textservice.SpellCheckerSubtype)20 Locale (java.util.Locale)16 SpellCheckerInfo (android.view.textservice.SpellCheckerInfo)13 InputMethodManager (android.view.inputmethod.InputMethodManager)6 InputMethodSubtype (android.view.inputmethod.InputMethodSubtype)6 TextServicesManager (android.view.textservice.TextServicesManager)6 AlertDialog (android.app.AlertDialog)1 DialogInterface (android.content.DialogInterface)1 Preference (android.support.v7.preference.Preference)1 PreferenceScreen (android.support.v7.preference.PreferenceScreen)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1