From b387954a92eb6f15b7f49d5b946745f492a26363 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 26 Aug 2011 17:35:27 +0900 Subject: Support system locale as the locale of the spell checkers Bug: 5212035 Change-Id: I18d27e54b936cc7f4d6cc3c7100bce57f77f8f9f --- .../view/textservice/TextServicesManager.java | 33 ++++++++++++++++---- .../android/server/TextServicesManagerService.java | 35 ++++++++++++++-------- 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/core/java/android/view/textservice/TextServicesManager.java b/core/java/android/view/textservice/TextServicesManager.java index 3e376da8e54b..adfb0dfd4653 100644 --- a/core/java/android/view/textservice/TextServicesManager.java +++ b/core/java/android/view/textservice/TextServicesManager.java @@ -72,27 +72,48 @@ public final class TextServicesManager { * languages in settings will be returned. * @return the spell checker session of the spell checker */ - // TODO: Add a method to get enabled spell checkers. - // TODO: Handle referToSpellCheckerLanguageSettings public SpellCheckerSession newSpellCheckerSession(Bundle bundle, Locale locale, SpellCheckerSessionListener listener, boolean referToSpellCheckerLanguageSettings) { if (listener == null) { throw new NullPointerException(); } - // TODO: set a proper locale instead of the dummy locale - final String localeString = locale == null ? "en" : locale.toString(); final SpellCheckerInfo sci; try { - sci = sService.getCurrentSpellChecker(localeString); + sci = sService.getCurrentSpellChecker(null); } catch (RemoteException e) { return null; } if (sci == null) { return null; } + SpellCheckerSubtype subtypeInUse = null; + if (referToSpellCheckerLanguageSettings) { + subtypeInUse = getCurrentSpellCheckerSubtype(true); + if (subtypeInUse == null) { + return null; + } + if (locale != null) { + final String subtypeLocale = subtypeInUse.getLocale(); + final String inputLocale = locale.toString(); + if (subtypeLocale.length() < 2 || inputLocale.length() < 2 + || !subtypeLocale.substring(0, 2).equals(inputLocale.substring(0, 2))) { + return null; + } + } + } else { + for (int i = 0; i < sci.getSubtypeCount(); ++i) { + final SpellCheckerSubtype subtype = sci.getSubtypeAt(i); + if (subtype.getLocale().equals(locale)) { + subtypeInUse = subtype; + } + } + } + if (subtypeInUse == null) { + return null; + } final SpellCheckerSession session = new SpellCheckerSession(sci, sService, listener); try { - sService.getSpellCheckerService(sci.getId(), localeString, + sService.getSpellCheckerService(sci.getId(), subtypeInUse.getLocale(), session.getTextServicesSessionListener(), session.getSpellCheckerSessionListener(), bundle); } catch (RemoteException e) { diff --git a/services/java/com/android/server/TextServicesManagerService.java b/services/java/com/android/server/TextServicesManagerService.java index c65f2990cddc..e27c11f70446 100644 --- a/services/java/com/android/server/TextServicesManagerService.java +++ b/services/java/com/android/server/TextServicesManagerService.java @@ -210,29 +210,40 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } return null; } - if (TextUtils.isEmpty(subtypeHashCodeStr)) { - if (DBG) { - Slog.w(TAG, "Return first subtype in " + sci.getId()); - } - return null; + final int hashCode; + if (!TextUtils.isEmpty(subtypeHashCodeStr)) { + hashCode = Integer.valueOf(subtypeHashCodeStr); + } else { + hashCode = 0; } - final int hashCode = Integer.valueOf(subtypeHashCodeStr); - if (hashCode == 0) { + if (hashCode == 0 && !allowImplicitlySelectedSubtype) { return null; } + final String systemLocale = + mContext.getResources().getConfiguration().locale.toString(); + SpellCheckerSubtype candidate = null; for (int i = 0; i < sci.getSubtypeCount(); ++i) { final SpellCheckerSubtype scs = sci.getSubtypeAt(i); - if (scs.hashCode() == hashCode) { + if (hashCode == 0) { + if (systemLocale.equals(locale)) { + return scs; + } else if (candidate == null) { + final String scsLocale = scs.getLocale(); + if (systemLocale.length() >= 2 + && scsLocale.length() >= 2 + && systemLocale.substring(0, 2).equals( + scsLocale.substring(0, 2))) { + candidate = scs; + } + } + } else if (scs.hashCode() == hashCode) { if (DBG) { Slog.w(TAG, "Return subtype " + scs.hashCode()); } return scs; } } - if (DBG) { - Slog.w(TAG, "Return first subtype in " + sci.getId()); - } - return null; + return candidate; } } -- cgit v1.2.3-59-g8ed1b