Support language bar swich for InputMethodSubtype

Change-Id: Ie49f0c1c7aea135331dc1d4a635197b3f4a96e93
This commit is contained in:
satok 2011-04-08 19:57:13 +09:00
parent 47d2ef69d3
commit 88fc9d4418
7 changed files with 275 additions and 129 deletions

View file

@ -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;
@ -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;
@ -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() {
}
@ -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()) {
@ -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());
}

View file

@ -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;

View file

@ -0,0 +1,73 @@
/*
* 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);
}
}

View file

@ -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;
@ -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;
@ -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) {
@ -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;
}
@ -159,7 +179,7 @@ public class LanguageSwitcher {
* Returns the system locale.
* @return the system locale
*/
public Locale getSystemLocale() {
private Locale getSystemLocale() {
return mSystemLocale;
}
@ -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, ""));
}
}

View file

@ -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);

View file

@ -23,6 +23,7 @@ import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
import com.android.inputmethod.compat.InputMethodServiceCompatWrapper;
import com.android.inputmethod.compat.InputTypeCompatUtils;
import com.android.inputmethod.compat.VibratorCompatWrapper;
import com.android.inputmethod.deprecated.LanguageSwitcherProxy;
import com.android.inputmethod.deprecated.VoiceProxy;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardActionListener;
@ -379,6 +380,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
SubtypeSwitcher.init(this, prefs);
KeyboardSwitcher.init(this, prefs);
AccessibilityUtils.init(this, prefs);
LanguageSwitcherProxy.init(this, prefs);
super.onCreate();
@ -516,6 +518,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
super.onConfigurationChanged(conf);
mVoiceProxy.onConfigurationChanged(conf);
mConfigurationChanging = false;
// This will work only when the subtype is not supported.
LanguageSwitcherProxy.onConfigurationChanged(conf);
}
@Override
@ -1155,10 +1160,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
onSettingsKeyLongPressed();
break;
case Keyboard.CODE_NEXT_LANGUAGE:
toggleLanguage(false, true);
toggleLanguage(true);
break;
case Keyboard.CODE_PREV_LANGUAGE:
toggleLanguage(false, false);
toggleLanguage(false);
break;
case Keyboard.CODE_CAPSLOCK:
switcher.toggleCapsLock();
@ -1930,17 +1935,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
return mWord.isFirstCharCapitalized();
}
// Notify that language or mode have been changed and toggleLanguage will update KeyboaredID
// Notify that language or mode have been changed and toggleLanguage will update KeyboardID
// according to new language or mode.
public void onRefreshKeyboard() {
toggleLanguage(true, true);
}
// "reset" and "next" are used only for USE_SPACEBAR_LANGUAGE_SWITCHER.
private void toggleLanguage(boolean reset, boolean next) {
if (mSubtypeSwitcher.useSpacebarLanguageSwitcher()) {
mSubtypeSwitcher.toggleLanguage(reset, next);
}
// Reload keyboard because the current language has been changed.
mKeyboardSwitcher.loadKeyboard(getCurrentInputEditorInfo(),
mSubtypeSwitcher.isShortcutImeEnabled() && mVoiceProxy.isVoiceButtonEnabled(),
@ -1949,6 +1946,14 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mKeyboardSwitcher.updateShiftState();
}
// "reset" and "next" are used only for USE_SPACEBAR_LANGUAGE_SWITCHER.
private void toggleLanguage(boolean next) {
if (mSubtypeSwitcher.useSpacebarLanguageSwitcher()) {
mSubtypeSwitcher.toggleLanguage(next);
}
onRefreshKeyboard();// no need??
}
@Override
public void onSwipeDown() {
if (mConfigSwipeDownDismissKeyboardEnabled)
@ -2134,7 +2139,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
updateCorrectionMode();
updateAutoTextEnabled();
updateSuggestionVisibility(prefs);
SubtypeSwitcher.getInstance().loadSettings();
// This will work only when the subtype is not supported.
LanguageSwitcherProxy.loadSettings();
}
/**

View file

@ -57,7 +57,6 @@ public class SubtypeSwitcher {
private static final SubtypeSwitcher sInstance = new SubtypeSwitcher();
private /* final */ LatinIME mService;
private /* final */ SharedPreferences mPrefs;
private /* final */ InputMethodManagerCompatWrapper mImm;
private /* final */ Resources mResources;
private /* final */ ConnectivityManager mConnectivityManager;
@ -66,6 +65,7 @@ public class SubtypeSwitcher {
mEnabledKeyboardSubtypesOfCurrentInputMethod =
new ArrayList<InputMethodSubtypeCompatWrapper>();
private final ArrayList<String> mEnabledLanguagesOfCurrentInputMethod = new ArrayList<String>();
private final LanguageBarInfo mLanguageBarInfo = new LanguageBarInfo();
/*-----------------------------------------------------------*/
// Variants which should be changed only by reload functions.
@ -78,6 +78,7 @@ public class SubtypeSwitcher {
private Locale mSystemLocale;
private Locale mInputLocale;
private String mInputLocaleStr;
private String mInputMethodId;
private VoiceProxy.VoiceInputWrapper mVoiceInputWrapper;
/*-----------------------------------------------------------*/
@ -100,7 +101,6 @@ public class SubtypeSwitcher {
private void initialize(LatinIME service, SharedPreferences prefs) {
mService = service;
mPrefs = prefs;
mResources = service.getResources();
mImm = InputMethodManagerCompatWrapper.getInstance(service);
mConnectivityManager = (ConnectivityManager) service.getSystemService(
@ -114,13 +114,12 @@ public class SubtypeSwitcher {
mAllEnabledSubtypesOfCurrentInputMethod = null;
// TODO: Voice input should be created here
mVoiceInputWrapper = null;
mConfigUseSpacebarLanguageSwitcher = mResources.getBoolean(
mConfigUseSpacebarLanguageSwitcher = service.getResources().getBoolean(
R.bool.config_use_spacebar_language_switcher);
if (mConfigUseSpacebarLanguageSwitcher)
initLanguageSwitcher(service);
final NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
mIsNetworkConnected = (info != null && info.isConnected());
mInputMethodId = Utils.getInputMethodId(mImm, service.getPackageName());
}
// Update all parameters stored in SubtypeSwitcher.
@ -134,11 +133,7 @@ public class SubtypeSwitcher {
// Update parameters which are changed outside LatinIME. This parameters affect UI so they
// should be updated every time onStartInputview.
public void updateParametersOnStartInputView() {
if (mConfigUseSpacebarLanguageSwitcher) {
updateForSpacebarLanguageSwitch();
} else {
updateEnabledSubtypes();
}
updateEnabledSubtypes();
updateShortcutIME();
}
@ -150,7 +145,7 @@ public class SubtypeSwitcher {
null, true);
mEnabledLanguagesOfCurrentInputMethod.clear();
mEnabledKeyboardSubtypesOfCurrentInputMethod.clear();
for (InputMethodSubtypeCompatWrapper ims: mAllEnabledSubtypesOfCurrentInputMethod) {
for (InputMethodSubtypeCompatWrapper ims : mAllEnabledSubtypesOfCurrentInputMethod) {
final String locale = ims.getLocale();
final String mode = ims.getMode();
mLocaleSplitter.setString(locale);
@ -172,6 +167,10 @@ public class SubtypeSwitcher {
Log.w(TAG, "Last subtype was disabled. Update to the current one.");
}
updateSubtype(mImm.getCurrentInputMethodSubtype());
} else {
// mLanguageBarInfo.update() will be called in updateSubtype so there is no need
// to call this in the if-clause above.
mLanguageBarInfo.update();
}
}
@ -269,6 +268,7 @@ public class SubtypeSwitcher {
mVoiceInputWrapper.reset();
}
}
mLanguageBarInfo.update();
}
// Update the current input locale from Locale string.
@ -303,12 +303,21 @@ public class SubtypeSwitcher {
////////////////////////////
public void switchToShortcutIME() {
final IBinder token = mService.getWindow().getWindow().getAttributes().token;
if (token == null || mShortcutInputMethodInfo == null) {
if (mShortcutInputMethodInfo == null) {
return;
}
final String imiId = mShortcutInputMethodInfo.getId();
final InputMethodSubtypeCompatWrapper subtype = mShortcutSubtype;
switchToTargetIME(imiId, subtype);
}
private void switchToTargetIME(
final String imiId, final InputMethodSubtypeCompatWrapper subtype) {
final IBinder token = mService.getWindow().getWindow().getAttributes().token;
if (token == null) {
return;
}
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
@ -412,11 +421,7 @@ public class SubtypeSwitcher {
//////////////////////////////////
public int getEnabledKeyboardLocaleCount() {
if (mConfigUseSpacebarLanguageSwitcher) {
return mLanguageSwitcher.getLocaleCount();
} else {
return mEnabledKeyboardSubtypesOfCurrentInputMethod.size();
}
return mEnabledKeyboardSubtypesOfCurrentInputMethod.size();
}
public boolean useSpacebarLanguageSwitcher() {
@ -428,74 +433,37 @@ public class SubtypeSwitcher {
}
public Locale getInputLocale() {
if (mConfigUseSpacebarLanguageSwitcher) {
return mLanguageSwitcher.getInputLocale();
} else {
return mInputLocale;
}
return mInputLocale;
}
public String getInputLocaleStr() {
if (mConfigUseSpacebarLanguageSwitcher) {
String inputLanguage = null;
inputLanguage = mLanguageSwitcher.getInputLanguage();
// Should return system locale if there is no Language available.
if (inputLanguage == null) {
inputLanguage = getSystemLocale().getLanguage();
}
return inputLanguage;
} else {
return mInputLocaleStr;
}
return mInputLocaleStr;
}
public String[] getEnabledLanguages() {
if (mConfigUseSpacebarLanguageSwitcher) {
return mLanguageSwitcher.getEnabledLanguages();
} else {
int enabledLanguageCount = mEnabledLanguagesOfCurrentInputMethod.size();
// Workaround for explicitly specifying the voice language
if (enabledLanguageCount == 1) {
mEnabledLanguagesOfCurrentInputMethod.add(
mEnabledLanguagesOfCurrentInputMethod.get(0));
++enabledLanguageCount;
}
return mEnabledLanguagesOfCurrentInputMethod.toArray(
new String[enabledLanguageCount]);
int enabledLanguageCount = mEnabledLanguagesOfCurrentInputMethod.size();
// Workaround for explicitly specifying the voice language
if (enabledLanguageCount == 1) {
mEnabledLanguagesOfCurrentInputMethod.add(mEnabledLanguagesOfCurrentInputMethod
.get(0));
++enabledLanguageCount;
}
return mEnabledLanguagesOfCurrentInputMethod.toArray(new String[enabledLanguageCount]);
}
public Locale getSystemLocale() {
if (mConfigUseSpacebarLanguageSwitcher) {
return mLanguageSwitcher.getSystemLocale();
} else {
return mSystemLocale;
}
return mSystemLocale;
}
public boolean isSystemLanguageSameAsInputLanguage() {
if (mConfigUseSpacebarLanguageSwitcher) {
return getSystemLocale().getLanguage().equalsIgnoreCase(
getInputLocaleStr().substring(0, 2));
} else {
return mIsSystemLanguageSameAsInputLanguage;
}
return mIsSystemLanguageSameAsInputLanguage;
}
public void onConfigurationChanged(Configuration conf) {
final Locale systemLocale = conf.locale;
// If system configuration was changed, update all parameters.
if (!TextUtils.equals(systemLocale.toString(), mSystemLocale.toString())) {
if (mConfigUseSpacebarLanguageSwitcher) {
// If the system locale changes and is different from the saved
// locale (mSystemLocale), then reload the input locale list from the
// latin ime settings (shared prefs) and reset the input locale
// to the first one.
mLanguageSwitcher.loadLocales(mPrefs);
mLanguageSwitcher.setSystemLocale(systemLocale);
} else {
updateAllParameters();
}
updateAllParameters();
}
}
@ -554,7 +522,70 @@ public class SubtypeSwitcher {
// Spacebar Language Switch support //
//////////////////////////////////////
private LanguageSwitcher mLanguageSwitcher;
private class LanguageBarInfo {
private int mCurrentKeyboardSubtypeIndex;
private InputMethodSubtypeCompatWrapper mNextKeyboardSubtype;
private InputMethodSubtypeCompatWrapper mPreviousKeyboardSubtype;
private String mNextLanguage;
private String mPreviousLanguage;
public LanguageBarInfo() {
update();
}
private String getNextLanguage() {
return mNextLanguage;
}
private String getPreviousLanguage() {
return mPreviousLanguage;
}
public InputMethodSubtypeCompatWrapper getNextKeyboardSubtype() {
return mNextKeyboardSubtype;
}
public InputMethodSubtypeCompatWrapper getPreviousKeyboardSubtype() {
return mPreviousKeyboardSubtype;
}
public void update() {
if (!mConfigUseSpacebarLanguageSwitcher
|| mEnabledKeyboardSubtypesOfCurrentInputMethod == null
|| mEnabledKeyboardSubtypesOfCurrentInputMethod.size() == 0) return;
mCurrentKeyboardSubtypeIndex = getCurrentIndex();
mNextKeyboardSubtype = getNextKeyboardSubtypeInternal(mCurrentKeyboardSubtypeIndex);
Locale locale = new Locale(mNextKeyboardSubtype.getLocale());
mNextLanguage = getDisplayLanguage(locale);
mPreviousKeyboardSubtype = getPreviousKeyboardSubtypeInternal(
mCurrentKeyboardSubtypeIndex);
locale = new Locale(mPreviousKeyboardSubtype.getLocale());
mPreviousLanguage = getDisplayLanguage(locale);
}
private int normalize(int index) {
final int N = mEnabledKeyboardSubtypesOfCurrentInputMethod.size();
final int ret = index % N;
return ret < 0 ? ret + N : ret;
}
private int getCurrentIndex() {
final int N = mEnabledKeyboardSubtypesOfCurrentInputMethod.size();
for (int i = 0; i < N; ++i) {
if (mEnabledKeyboardSubtypesOfCurrentInputMethod.get(i).equals(mCurrentSubtype)) {
return i;
}
}
return 0;
}
private InputMethodSubtypeCompatWrapper getNextKeyboardSubtypeInternal(int index) {
return mEnabledKeyboardSubtypesOfCurrentInputMethod.get(normalize(index + 1));
}
private InputMethodSubtypeCompatWrapper getPreviousKeyboardSubtypeInternal(int index) {
return mEnabledKeyboardSubtypesOfCurrentInputMethod.get(normalize(index - 1));
}
}
public static String getFullDisplayName(Locale locale, boolean returnsNameInThisLocale) {
if (returnsNameInThisLocale) {
@ -579,32 +610,16 @@ public class SubtypeSwitcher {
return Character.toUpperCase(s.charAt(0)) + s.substring(1);
}
private void updateForSpacebarLanguageSwitch() {
// We need to update mNeedsToDisplayLanguage in onStartInputView because
// getEnabledKeyboardLocaleCount could have been changed.
mNeedsToDisplayLanguage = !(getEnabledKeyboardLocaleCount() <= 1
&& getSystemLocale().getLanguage().equalsIgnoreCase(
getInputLocale().getLanguage()));
}
public String getInputLanguageName() {
return getDisplayLanguage(getInputLocale());
}
public String getNextInputLanguageName() {
if (mConfigUseSpacebarLanguageSwitcher) {
return getDisplayLanguage(mLanguageSwitcher.getNextInputLocale());
} else {
return "";
}
return mLanguageBarInfo.getNextLanguage();
}
public String getPreviousInputLanguageName() {
if (mConfigUseSpacebarLanguageSwitcher) {
return getDisplayLanguage(mLanguageSwitcher.getPrevInputLocale());
} else {
return "";
}
return mLanguageBarInfo.getPreviousLanguage();
}
/////////////////////////////
@ -644,31 +659,23 @@ public class SubtypeSwitcher {
return voiceInputSupportedLocales.contains(locale);
}
public void loadSettings() {
if (mConfigUseSpacebarLanguageSwitcher) {
mLanguageSwitcher.loadLocales(mPrefs);
}
private void changeToNextSubtype() {
final InputMethodSubtypeCompatWrapper subtype =
mLanguageBarInfo.getNextKeyboardSubtype();
switchToTargetIME(mInputMethodId, subtype);
}
public void toggleLanguage(boolean reset, boolean next) {
if (mConfigUseSpacebarLanguageSwitcher) {
if (reset) {
mLanguageSwitcher.reset();
} else {
if (next) {
mLanguageSwitcher.next();
} else {
mLanguageSwitcher.prev();
}
}
mLanguageSwitcher.persist(mPrefs);
}
private void changeToPreviousSubtype() {
final InputMethodSubtypeCompatWrapper subtype =
mLanguageBarInfo.getPreviousKeyboardSubtype();
switchToTargetIME(mInputMethodId, subtype);
}
private void initLanguageSwitcher(LatinIME service) {
final Configuration conf = service.getResources().getConfiguration();
mLanguageSwitcher = new LanguageSwitcher(service);
mLanguageSwitcher.loadLocales(mPrefs);
mLanguageSwitcher.setSystemLocale(conf.locale);
public void toggleLanguage(boolean next) {
if (next) {
changeToNextSubtype();
} else {
changeToPreviousSubtype();
}
}
}