Get rid of current subtype and system locale cache from SubtypeSwitcher

Bug: 7675452
Change-Id: I2121f56964b6d25e8d40f5b8ec67eeae527b2117
This commit is contained in:
Tadashi G. Takaoka 2012-12-26 14:31:13 +09:00
parent 4aff3bf0ea
commit f483225397
3 changed files with 17 additions and 80 deletions

View file

@ -582,10 +582,6 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
@Override @Override
public void onConfigurationChanged(final Configuration conf) { public void onConfigurationChanged(final Configuration conf) {
// System locale has been changed. Needs to reload keyboard.
if (mSubtypeSwitcher.onConfigurationChanged(conf)) {
loadKeyboard();
}
// If orientation changed while predicting, commit the change // If orientation changed while predicting, commit the change
if (mDisplayOrientation != conf.orientation) { if (mDisplayOrientation != conf.orientation) {
mDisplayOrientation = conf.orientation; mDisplayOrientation = conf.orientation;
@ -651,7 +647,7 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
public void onCurrentInputMethodSubtypeChanged(final InputMethodSubtype subtype) { public void onCurrentInputMethodSubtypeChanged(final InputMethodSubtype subtype) {
// Note that the calling sequence of onCreate() and onCurrentInputMethodSubtypeChanged() // Note that the calling sequence of onCreate() and onCurrentInputMethodSubtypeChanged()
// is not guaranteed. It may even be called at the same time on a different thread. // is not guaranteed. It may even be called at the same time on a different thread.
mSubtypeSwitcher.updateSubtype(subtype); mSubtypeSwitcher.onSubtypeChanged(subtype);
loadKeyboard(); loadKeyboard();
} }
@ -719,15 +715,7 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
final boolean inputTypeChanged = !mCurrentSettings.isSameInputType(editorInfo); final boolean inputTypeChanged = !mCurrentSettings.isSameInputType(editorInfo);
final boolean isDifferentTextField = !restarting || inputTypeChanged; final boolean isDifferentTextField = !restarting || inputTypeChanged;
if (isDifferentTextField) { if (isDifferentTextField) {
final boolean currentSubtypeEnabled = mSubtypeSwitcher mSubtypeSwitcher.updateParametersOnStartInputView();
.updateParametersOnStartInputViewAndReturnIfCurrentSubtypeEnabled();
if (!currentSubtypeEnabled) {
// Current subtype is disabled. Needs to update subtype and keyboard.
final InputMethodSubtype newSubtype = mRichImm.getCurrentInputMethodSubtype(
mSubtypeSwitcher.getNoLanguageSubtype());
mSubtypeSwitcher.updateSubtype(newSubtype);
loadKeyboard();
}
} }
// The EditorInfo might have a flag that affects fullscreen mode. // The EditorInfo might have a flag that affects fullscreen mode.

View file

@ -20,7 +20,6 @@ import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.REQ_NET
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.inputmethodservice.InputMethodService; import android.inputmethodservice.InputMethodService;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
@ -53,9 +52,6 @@ public final class SubtypeSwitcher {
private InputMethodInfo mShortcutInputMethodInfo; private InputMethodInfo mShortcutInputMethodInfo;
private InputMethodSubtype mShortcutSubtype; private InputMethodSubtype mShortcutSubtype;
private InputMethodSubtype mNoLanguageSubtype; private InputMethodSubtype mNoLanguageSubtype;
// Note: This variable is always non-null after {@link #initialize(LatinIME)}.
private InputMethodSubtype mCurrentSubtype;
private Locale mCurrentSystemLocale;
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
private boolean mIsNetworkConnected; private boolean mIsNetworkConnected;
@ -84,7 +80,6 @@ public final class SubtypeSwitcher {
public static void init(final Context context) { public static void init(final Context context) {
SubtypeLocale.init(context); SubtypeLocale.init(context);
sInstance.initialize(context); sInstance.initialize(context);
sInstance.updateAllParameters();
} }
private SubtypeSwitcher() { private SubtypeSwitcher() {
@ -96,60 +91,28 @@ public final class SubtypeSwitcher {
mRichImm = RichInputMethodManager.getInstance(); mRichImm = RichInputMethodManager.getInstance();
mConnectivityManager = (ConnectivityManager) service.getSystemService( mConnectivityManager = (ConnectivityManager) service.getSystemService(
Context.CONNECTIVITY_SERVICE); Context.CONNECTIVITY_SERVICE);
mCurrentSystemLocale = mResources.getConfiguration().locale;
mNoLanguageSubtype = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet( mNoLanguageSubtype = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
SubtypeLocale.NO_LANGUAGE, SubtypeLocale.QWERTY); SubtypeLocale.NO_LANGUAGE, SubtypeLocale.QWERTY);
mCurrentSubtype = mRichImm.getCurrentInputMethodSubtype(mNoLanguageSubtype);
if (mNoLanguageSubtype == null) { if (mNoLanguageSubtype == null) {
throw new RuntimeException("Can't find no lanugage with QWERTY subtype"); throw new RuntimeException("Can't find no lanugage with QWERTY subtype");
} }
final NetworkInfo info = mConnectivityManager.getActiveNetworkInfo(); final NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
mIsNetworkConnected = (info != null && info.isConnected()); mIsNetworkConnected = (info != null && info.isConnected());
}
// Update all parameters stored in SubtypeSwitcher. onSubtypeChanged(getCurrentSubtype());
// Only configuration changed event is allowed to call this because this is heavy. updateParametersOnStartInputView();
private void updateAllParameters() {
mCurrentSystemLocale = mResources.getConfiguration().locale;
updateSubtype(mRichImm.getCurrentInputMethodSubtype(mNoLanguageSubtype));
updateParametersOnStartInputViewAndReturnIfCurrentSubtypeEnabled();
} }
/** /**
* Update parameters which are changed outside LatinIME. This parameters affect UI so they * Update parameters which are changed outside LatinIME. This parameters affect UI so that they
* should be updated every time onStartInputView. * should be updated every time onStartInputView is called.
*
* @return true if the current subtype is enabled.
*/ */
public boolean updateParametersOnStartInputViewAndReturnIfCurrentSubtypeEnabled() { public void updateParametersOnStartInputView() {
final boolean currentSubtypeEnabled =
updateEnabledSubtypesAndReturnIfEnabled(mCurrentSubtype);
updateShortcutIME();
return currentSubtypeEnabled;
}
/**
* Update enabled subtypes from the framework.
*
* @param subtype the subtype to be checked
* @return true if the {@code subtype} is enabled.
*/
private boolean updateEnabledSubtypesAndReturnIfEnabled(final InputMethodSubtype subtype) {
final List<InputMethodSubtype> enabledSubtypesOfThisIme = final List<InputMethodSubtype> enabledSubtypesOfThisIme =
mRichImm.getInputMethodManager().getEnabledInputMethodSubtypeList(null, true); mRichImm.getInputMethodManager().getEnabledInputMethodSubtypeList(null, true);
mNeedsToDisplayLanguage.updateEnabledSubtypeCount(enabledSubtypesOfThisIme.size()); mNeedsToDisplayLanguage.updateEnabledSubtypeCount(enabledSubtypesOfThisIme.size());
updateShortcutIME();
for (final InputMethodSubtype ims : enabledSubtypesOfThisIme) {
if (ims.equals(subtype)) {
return true;
}
}
if (DBG) {
Log.w(TAG, "Subtype: " + subtype.getLocale() + "/" + subtype.getExtraValue()
+ " was disabled");
}
return false;
} }
private void updateShortcutIME() { private void updateShortcutIME() {
@ -185,25 +148,21 @@ public final class SubtypeSwitcher {
} }
// Update the current subtype. LatinIME.onCurrentInputMethodSubtypeChanged calls this function. // Update the current subtype. LatinIME.onCurrentInputMethodSubtypeChanged calls this function.
public void updateSubtype(InputMethodSubtype newSubtype) { public void onSubtypeChanged(final InputMethodSubtype newSubtype) {
if (DBG) { if (DBG) {
Log.w(TAG, "onCurrentInputMethodSubtypeChanged: to: " Log.w(TAG, "onSubtypeChanged: " + SubtypeLocale.getSubtypeDisplayName(
+ newSubtype.getLocale() + "/" + newSubtype.getExtraValue() + ", from: " newSubtype, mResources));
+ mCurrentSubtype.getLocale() + "/" + mCurrentSubtype.getExtraValue());
} }
final Locale newLocale = SubtypeLocale.getSubtypeLocale(newSubtype); final Locale newLocale = SubtypeLocale.getSubtypeLocale(newSubtype);
final boolean sameLocale = mCurrentSystemLocale.equals(newLocale); final Locale systemLocale = mResources.getConfiguration().locale;
final boolean sameLanguage = mCurrentSystemLocale.getLanguage().equals( final boolean sameLocale = systemLocale.equals(newLocale);
newLocale.getLanguage()); final boolean sameLanguage = systemLocale.getLanguage().equals(newLocale.getLanguage());
final boolean implicitlyEnabled = final boolean implicitlyEnabled =
mRichImm.checkIfSubtypeBelongsToThisImeAndImplicitlyEnabled(newSubtype); mRichImm.checkIfSubtypeBelongsToThisImeAndImplicitlyEnabled(newSubtype);
mNeedsToDisplayLanguage.updateIsSystemLanguageSameAsInputLanguage( mNeedsToDisplayLanguage.updateIsSystemLanguageSameAsInputLanguage(
sameLocale || (sameLanguage && implicitlyEnabled)); sameLocale || (sameLanguage && implicitlyEnabled));
if (newSubtype.equals(mCurrentSubtype)) return;
mCurrentSubtype = newSubtype;
updateShortcutIME(); updateShortcutIME();
} }
@ -281,21 +240,11 @@ public final class SubtypeSwitcher {
} }
public Locale getCurrentSubtypeLocale() { public Locale getCurrentSubtypeLocale() {
return SubtypeLocale.getSubtypeLocale(mCurrentSubtype); return SubtypeLocale.getSubtypeLocale(getCurrentSubtype());
}
public boolean onConfigurationChanged(final Configuration conf) {
final Locale systemLocale = conf.locale;
final boolean systemLocaleChanged = !systemLocale.equals(mCurrentSystemLocale);
// If system configuration was changed, update all parameters.
if (systemLocaleChanged) {
updateAllParameters();
}
return systemLocaleChanged;
} }
public InputMethodSubtype getCurrentSubtype() { public InputMethodSubtype getCurrentSubtype() {
return mCurrentSubtype; return mRichImm.getCurrentInputMethodSubtype(mNoLanguageSubtype);
} }
public InputMethodSubtype getNoLanguageSubtype() { public InputMethodSubtype getNoLanguageSubtype() {

View file

@ -275,7 +275,7 @@ public class InputTestsBase extends ServiceTestCase<LatinIME> {
if (subtype == null) { if (subtype == null) {
fail("InputMethodSubtype for locale " + locale + " is not enabled"); fail("InputMethodSubtype for locale " + locale + " is not enabled");
} }
SubtypeSwitcher.getInstance().updateSubtype(subtype); SubtypeSwitcher.getInstance().onSubtypeChanged(subtype);
mLatinIME.loadKeyboard(); mLatinIME.loadKeyboard();
mKeyboard = mLatinIME.mKeyboardSwitcher.getKeyboard(); mKeyboard = mLatinIME.mKeyboardSwitcher.getKeyboard();
waitForDictionaryToBeLoaded(); waitForDictionaryToBeLoaded();