Loading java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java +29 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.inputmethod.compat; import com.android.inputmethod.deprecated.LanguageSwitcherProxy; import com.android.inputmethod.latin.LatinIME; import com.android.inputmethod.latin.SubtypeSwitcher; import com.android.inputmethod.latin.Utils; Loading Loading @@ -56,6 +57,14 @@ public class InputMethodManagerCompatWrapper { private static final InputMethodManagerCompatWrapper sInstance = new InputMethodManagerCompatWrapper(); public static final boolean SUBTYPE_SUPPORTED; static { // This static initializer guarantees that METHOD_getShortcutInputMethodsAndSubtypes is // already instantiated. SUBTYPE_SUPPORTED = METHOD_getShortcutInputMethodsAndSubtypes != null; } // For the compatibility, IMM will create dummy subtypes if subtypes are not found. // This is required to be false if the current behavior is broken. For now, it's ok to be true. private static final boolean ALLOW_DUMMY_SUBTYPE = true; Loading @@ -64,7 +73,9 @@ public class InputMethodManagerCompatWrapper { private static final String KEYBOARD_MODE = "keyboard"; private InputMethodManager mImm; private LanguageSwitcherProxy mLanguageSwitcherProxy; private String mLatinImePackageName; private InputMethodManagerCompatWrapper() { } Loading @@ -81,15 +92,29 @@ public class InputMethodManagerCompatWrapper { if (context instanceof LatinIME) { mLatinImePackageName = context.getPackageName(); } mLanguageSwitcherProxy = LanguageSwitcherProxy.getInstance(); } public InputMethodSubtypeCompatWrapper getCurrentInputMethodSubtype() { if (!SUBTYPE_SUPPORTED) { return new InputMethodSubtypeCompatWrapper( 0, 0, mLanguageSwitcherProxy.getInputLocale().toString(), KEYBOARD_MODE, ""); } Object o = CompatUtils.invoke(mImm, null, METHOD_getCurrentInputMethodSubtype); return new InputMethodSubtypeCompatWrapper(o); } public List<InputMethodSubtypeCompatWrapper> getEnabledInputMethodSubtypeList( InputMethodInfoCompatWrapper imi, boolean allowsImplicitlySelectedSubtypes) { if (!SUBTYPE_SUPPORTED) { String[] languages = mLanguageSwitcherProxy.getEnabledLanguages(); List<InputMethodSubtypeCompatWrapper> subtypeList = new ArrayList<InputMethodSubtypeCompatWrapper>(); for (String lang: languages) { subtypeList.add(new InputMethodSubtypeCompatWrapper(0, 0, lang, KEYBOARD_MODE, "")); } return subtypeList; } Object retval = CompatUtils.invoke(mImm, null, METHOD_getEnabledInputMethodSubtypeList, (imi != null ? imi.getInputMethodInfo() : null), allowsImplicitlySelectedSubtypes); if (retval == null || !(retval instanceof List) || ((List<?>)retval).isEmpty()) { Loading Loading @@ -170,6 +195,10 @@ public class InputMethodManagerCompatWrapper { public void setInputMethodAndSubtype( IBinder token, String id, InputMethodSubtypeCompatWrapper subtype) { if (!SUBTYPE_SUPPORTED) { mLanguageSwitcherProxy.setLocale(subtype.getLocale()); return; } CompatUtils.invoke(mImm, null, METHOD_setInputMethodAndSubtype, token, id, subtype.getOriginalObject()); } Loading java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java +0 −3 Original line number Diff line number Diff line Loading @@ -58,9 +58,6 @@ public final class InputMethodSubtypeCompatWrapper extends AbstractCompatWrapper public InputMethodSubtypeCompatWrapper(Object subtype) { super((CLASS_InputMethodSubtype != null && CLASS_InputMethodSubtype.isInstance(subtype)) ? subtype : null); if (DBG) { Log.d(TAG, "CreateInputMethodSubtypeCompatWrapper"); } mDummyNameResId = 0; mDummyIconResId = 0; mDummyLocale = DEFAULT_LOCALE; Loading java/src/com/android/inputmethod/deprecated/LanguageSwitcherProxy.java 0 → 100644 +73 −0 Original line number Diff line number Diff line /* * Copyright (C) 2011 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.android.inputmethod.deprecated; import com.android.inputmethod.compat.InputMethodManagerCompatWrapper; import com.android.inputmethod.deprecated.languageswitcher.LanguageSwitcher; import com.android.inputmethod.latin.LatinIME; import android.content.SharedPreferences; import android.content.res.Configuration; import java.util.Locale; // This class is used only when the IME doesn't use method.xml for language switching. public class LanguageSwitcherProxy { private static final LanguageSwitcherProxy sInstance = new LanguageSwitcherProxy(); private LanguageSwitcher mLanguageSwitcher; private SharedPreferences mPrefs; public static LanguageSwitcherProxy getInstance() { if (InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) return null; return sInstance; } public static void init(LatinIME service, SharedPreferences prefs) { if (InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) return; final Configuration conf = service.getResources().getConfiguration(); sInstance.mLanguageSwitcher = new LanguageSwitcher(service); sInstance.mLanguageSwitcher.loadLocales(prefs, conf.locale); sInstance.mPrefs = prefs; } public static void onConfigurationChanged(Configuration conf) { if (InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) return; sInstance.mLanguageSwitcher.onConfigurationChanged(conf, sInstance.mPrefs); } public static void loadSettings() { if (InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) return; sInstance.mLanguageSwitcher.loadLocales(sInstance.mPrefs, null); } public int getLocaleCount() { return mLanguageSwitcher.getLocaleCount(); } public String[] getEnabledLanguages() { return mLanguageSwitcher.getEnabledLanguages(); } public Locale getInputLocale() { return mLanguageSwitcher.getInputLocale(); } public void setLocale(String localeStr) { mLanguageSwitcher.setLocale(localeStr); mLanguageSwitcher.persist(mPrefs); } } java/src/com/android/inputmethod/latin/LanguageSwitcher.java→java/src/com/android/inputmethod/deprecated/languageswitcher/LanguageSwitcher.java +38 −5 Original line number Diff line number Diff line Loading @@ -14,10 +14,16 @@ * the License. */ package com.android.inputmethod.latin; package com.android.inputmethod.deprecated.languageswitcher; import com.android.inputmethod.compat.InputMethodSubtypeCompatWrapper; import com.android.inputmethod.latin.LatinIME; import com.android.inputmethod.latin.Settings; import com.android.inputmethod.latin.SharedPreferencesCompat; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.res.Configuration; import android.text.TextUtils; import java.util.ArrayList; Loading @@ -29,6 +35,8 @@ import java.util.Locale; */ public class LanguageSwitcher { private static final String KEYBOARD_MODE = "keyboard"; private final ArrayList<Locale> mLocales = new ArrayList<Locale>(); private final LatinIME mIme; private String[] mSelectedLanguageArray; Loading @@ -46,12 +54,24 @@ public class LanguageSwitcher { return mLocales.size(); } public void onConfigurationChanged(Configuration conf, SharedPreferences prefs) { final Locale newLocale = conf.locale; if (!getSystemLocale().toString().equals(newLocale.toString())) { loadLocales(prefs, newLocale); } } /** * Loads the currently selected input languages from shared preferences. * @param sp * @param sp shared preference for getting the current input language and enabled languages * @param systemLocale the current system locale, stored for changing the current input language * based on the system current system locale. * @return whether there was any change */ public boolean loadLocales(SharedPreferences sp) { public boolean loadLocales(SharedPreferences sp, Locale systemLocale) { if (systemLocale != null) { setSystemLocale(systemLocale); } String selectedLanguages = sp.getString(Settings.PREF_SELECTED_LANGUAGES, null); String currentLanguage = sp.getString(Settings.PREF_INPUT_LANGUAGE, null); if (selectedLanguages == null || selectedLanguages.length() < 1) { Loading Loading @@ -151,7 +171,7 @@ public class LanguageSwitcher { * Sets the system locale (display UI) used for comparing with the input language. * @param locale the locale of the system */ public void setSystemLocale(Locale locale) { private void setSystemLocale(Locale locale) { mSystemLocale = locale; } Loading @@ -159,7 +179,7 @@ public class LanguageSwitcher { * Returns the system locale. * @return the system locale */ public Locale getSystemLocale() { private Locale getSystemLocale() { return mSystemLocale; } Loading @@ -185,9 +205,22 @@ public class LanguageSwitcher { mCurrentIndex = prevLocaleIndex(); } public void setLocale(String localeStr) { final int N = mLocales.size(); for (int i = 0; i < N; ++i) { if (mLocales.get(i).toString().equals(localeStr)) { mCurrentIndex = i; } } } public void persist(SharedPreferences prefs) { Editor editor = prefs.edit(); editor.putString(Settings.PREF_INPUT_LANGUAGE, getInputLanguage()); SharedPreferencesCompat.apply(editor); // When the current language is changed, the event for this change should be handled // internally as a subtype switching. mIme.notifyOnCurrentInputMethodSubtypeChanged(new InputMethodSubtypeCompatWrapper( 0, 0, getInputLocale().toString(), KEYBOARD_MODE, "")); } } java/src/com/android/inputmethod/keyboard/LatinKeyboard.java +1 −1 Original line number Diff line number Diff line Loading @@ -271,7 +271,7 @@ public class LatinKeyboard extends Keyboard { canvas.drawText(language, width / 2, baseline - descent, paint); // Put arrows that are already layed out on either side of the text if (SubtypeSwitcher.getInstance().useSpacebarLanguageSwitcher() if (subtypeSwitcher.useSpacebarLanguageSwitcher() && subtypeSwitcher.getEnabledKeyboardLocaleCount() > 1) { mButtonArrowLeftIcon.draw(canvas); mButtonArrowRightIcon.draw(canvas); Loading Loading
java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java +29 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.inputmethod.compat; import com.android.inputmethod.deprecated.LanguageSwitcherProxy; import com.android.inputmethod.latin.LatinIME; import com.android.inputmethod.latin.SubtypeSwitcher; import com.android.inputmethod.latin.Utils; Loading Loading @@ -56,6 +57,14 @@ public class InputMethodManagerCompatWrapper { private static final InputMethodManagerCompatWrapper sInstance = new InputMethodManagerCompatWrapper(); public static final boolean SUBTYPE_SUPPORTED; static { // This static initializer guarantees that METHOD_getShortcutInputMethodsAndSubtypes is // already instantiated. SUBTYPE_SUPPORTED = METHOD_getShortcutInputMethodsAndSubtypes != null; } // For the compatibility, IMM will create dummy subtypes if subtypes are not found. // This is required to be false if the current behavior is broken. For now, it's ok to be true. private static final boolean ALLOW_DUMMY_SUBTYPE = true; Loading @@ -64,7 +73,9 @@ public class InputMethodManagerCompatWrapper { private static final String KEYBOARD_MODE = "keyboard"; private InputMethodManager mImm; private LanguageSwitcherProxy mLanguageSwitcherProxy; private String mLatinImePackageName; private InputMethodManagerCompatWrapper() { } Loading @@ -81,15 +92,29 @@ public class InputMethodManagerCompatWrapper { if (context instanceof LatinIME) { mLatinImePackageName = context.getPackageName(); } mLanguageSwitcherProxy = LanguageSwitcherProxy.getInstance(); } public InputMethodSubtypeCompatWrapper getCurrentInputMethodSubtype() { if (!SUBTYPE_SUPPORTED) { return new InputMethodSubtypeCompatWrapper( 0, 0, mLanguageSwitcherProxy.getInputLocale().toString(), KEYBOARD_MODE, ""); } Object o = CompatUtils.invoke(mImm, null, METHOD_getCurrentInputMethodSubtype); return new InputMethodSubtypeCompatWrapper(o); } public List<InputMethodSubtypeCompatWrapper> getEnabledInputMethodSubtypeList( InputMethodInfoCompatWrapper imi, boolean allowsImplicitlySelectedSubtypes) { if (!SUBTYPE_SUPPORTED) { String[] languages = mLanguageSwitcherProxy.getEnabledLanguages(); List<InputMethodSubtypeCompatWrapper> subtypeList = new ArrayList<InputMethodSubtypeCompatWrapper>(); for (String lang: languages) { subtypeList.add(new InputMethodSubtypeCompatWrapper(0, 0, lang, KEYBOARD_MODE, "")); } return subtypeList; } Object retval = CompatUtils.invoke(mImm, null, METHOD_getEnabledInputMethodSubtypeList, (imi != null ? imi.getInputMethodInfo() : null), allowsImplicitlySelectedSubtypes); if (retval == null || !(retval instanceof List) || ((List<?>)retval).isEmpty()) { Loading Loading @@ -170,6 +195,10 @@ public class InputMethodManagerCompatWrapper { public void setInputMethodAndSubtype( IBinder token, String id, InputMethodSubtypeCompatWrapper subtype) { if (!SUBTYPE_SUPPORTED) { mLanguageSwitcherProxy.setLocale(subtype.getLocale()); return; } CompatUtils.invoke(mImm, null, METHOD_setInputMethodAndSubtype, token, id, subtype.getOriginalObject()); } Loading
java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java +0 −3 Original line number Diff line number Diff line Loading @@ -58,9 +58,6 @@ public final class InputMethodSubtypeCompatWrapper extends AbstractCompatWrapper public InputMethodSubtypeCompatWrapper(Object subtype) { super((CLASS_InputMethodSubtype != null && CLASS_InputMethodSubtype.isInstance(subtype)) ? subtype : null); if (DBG) { Log.d(TAG, "CreateInputMethodSubtypeCompatWrapper"); } mDummyNameResId = 0; mDummyIconResId = 0; mDummyLocale = DEFAULT_LOCALE; Loading
java/src/com/android/inputmethod/deprecated/LanguageSwitcherProxy.java 0 → 100644 +73 −0 Original line number Diff line number Diff line /* * Copyright (C) 2011 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.android.inputmethod.deprecated; import com.android.inputmethod.compat.InputMethodManagerCompatWrapper; import com.android.inputmethod.deprecated.languageswitcher.LanguageSwitcher; import com.android.inputmethod.latin.LatinIME; import android.content.SharedPreferences; import android.content.res.Configuration; import java.util.Locale; // This class is used only when the IME doesn't use method.xml for language switching. public class LanguageSwitcherProxy { private static final LanguageSwitcherProxy sInstance = new LanguageSwitcherProxy(); private LanguageSwitcher mLanguageSwitcher; private SharedPreferences mPrefs; public static LanguageSwitcherProxy getInstance() { if (InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) return null; return sInstance; } public static void init(LatinIME service, SharedPreferences prefs) { if (InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) return; final Configuration conf = service.getResources().getConfiguration(); sInstance.mLanguageSwitcher = new LanguageSwitcher(service); sInstance.mLanguageSwitcher.loadLocales(prefs, conf.locale); sInstance.mPrefs = prefs; } public static void onConfigurationChanged(Configuration conf) { if (InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) return; sInstance.mLanguageSwitcher.onConfigurationChanged(conf, sInstance.mPrefs); } public static void loadSettings() { if (InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) return; sInstance.mLanguageSwitcher.loadLocales(sInstance.mPrefs, null); } public int getLocaleCount() { return mLanguageSwitcher.getLocaleCount(); } public String[] getEnabledLanguages() { return mLanguageSwitcher.getEnabledLanguages(); } public Locale getInputLocale() { return mLanguageSwitcher.getInputLocale(); } public void setLocale(String localeStr) { mLanguageSwitcher.setLocale(localeStr); mLanguageSwitcher.persist(mPrefs); } }
java/src/com/android/inputmethod/latin/LanguageSwitcher.java→java/src/com/android/inputmethod/deprecated/languageswitcher/LanguageSwitcher.java +38 −5 Original line number Diff line number Diff line Loading @@ -14,10 +14,16 @@ * the License. */ package com.android.inputmethod.latin; package com.android.inputmethod.deprecated.languageswitcher; import com.android.inputmethod.compat.InputMethodSubtypeCompatWrapper; import com.android.inputmethod.latin.LatinIME; import com.android.inputmethod.latin.Settings; import com.android.inputmethod.latin.SharedPreferencesCompat; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.res.Configuration; import android.text.TextUtils; import java.util.ArrayList; Loading @@ -29,6 +35,8 @@ import java.util.Locale; */ public class LanguageSwitcher { private static final String KEYBOARD_MODE = "keyboard"; private final ArrayList<Locale> mLocales = new ArrayList<Locale>(); private final LatinIME mIme; private String[] mSelectedLanguageArray; Loading @@ -46,12 +54,24 @@ public class LanguageSwitcher { return mLocales.size(); } public void onConfigurationChanged(Configuration conf, SharedPreferences prefs) { final Locale newLocale = conf.locale; if (!getSystemLocale().toString().equals(newLocale.toString())) { loadLocales(prefs, newLocale); } } /** * Loads the currently selected input languages from shared preferences. * @param sp * @param sp shared preference for getting the current input language and enabled languages * @param systemLocale the current system locale, stored for changing the current input language * based on the system current system locale. * @return whether there was any change */ public boolean loadLocales(SharedPreferences sp) { public boolean loadLocales(SharedPreferences sp, Locale systemLocale) { if (systemLocale != null) { setSystemLocale(systemLocale); } String selectedLanguages = sp.getString(Settings.PREF_SELECTED_LANGUAGES, null); String currentLanguage = sp.getString(Settings.PREF_INPUT_LANGUAGE, null); if (selectedLanguages == null || selectedLanguages.length() < 1) { Loading Loading @@ -151,7 +171,7 @@ public class LanguageSwitcher { * Sets the system locale (display UI) used for comparing with the input language. * @param locale the locale of the system */ public void setSystemLocale(Locale locale) { private void setSystemLocale(Locale locale) { mSystemLocale = locale; } Loading @@ -159,7 +179,7 @@ public class LanguageSwitcher { * Returns the system locale. * @return the system locale */ public Locale getSystemLocale() { private Locale getSystemLocale() { return mSystemLocale; } Loading @@ -185,9 +205,22 @@ public class LanguageSwitcher { mCurrentIndex = prevLocaleIndex(); } public void setLocale(String localeStr) { final int N = mLocales.size(); for (int i = 0; i < N; ++i) { if (mLocales.get(i).toString().equals(localeStr)) { mCurrentIndex = i; } } } public void persist(SharedPreferences prefs) { Editor editor = prefs.edit(); editor.putString(Settings.PREF_INPUT_LANGUAGE, getInputLanguage()); SharedPreferencesCompat.apply(editor); // When the current language is changed, the event for this change should be handled // internally as a subtype switching. mIme.notifyOnCurrentInputMethodSubtypeChanged(new InputMethodSubtypeCompatWrapper( 0, 0, getInputLocale().toString(), KEYBOARD_MODE, "")); } }
java/src/com/android/inputmethod/keyboard/LatinKeyboard.java +1 −1 Original line number Diff line number Diff line Loading @@ -271,7 +271,7 @@ public class LatinKeyboard extends Keyboard { canvas.drawText(language, width / 2, baseline - descent, paint); // Put arrows that are already layed out on either side of the text if (SubtypeSwitcher.getInstance().useSpacebarLanguageSwitcher() if (subtypeSwitcher.useSpacebarLanguageSwitcher() && subtypeSwitcher.getEnabledKeyboardLocaleCount() > 1) { mButtonArrowLeftIcon.draw(canvas); mButtonArrowRightIcon.draw(canvas); Loading