Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a5f3576 authored by Jean Chalard's avatar Jean Chalard Committed by The Android Automerger
Browse files

Performance fix for multiple language subtypes

The code would iterate all enabled subtypes each time
getCurrentSubtype() is called, which is really quite frequent.

Bug: 11230254
Change-Id: I91feb36de6eca84967e848fc585aae04b350be89
parent bb4ca891
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ public class AdditionalFeaturesSettingUtils {
        // do nothing.
    }

    public static RichInputMethodSubtype getRichInputMethodSubtype(
    public static RichInputMethodSubtype createRichInputMethodSubtype(
            @Nonnull final RichInputMethodManager imm,
            @Nonnull final InputMethodSubtype subtype) {
        return new RichInputMethodSubtype(subtype);
+2 −2
Original line number Diff line number Diff line
@@ -568,6 +568,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        // TODO: Resolve mutual dependencies of {@link #loadSettings()} and
        // {@link #resetDictionaryFacilitatorIfNecessary()}.
        loadSettings();
        mSubtypeSwitcher.onSubtypeChanged(mRichImm.getCurrentRawSubtype());
        resetDictionaryFacilitatorIfNecessary();

        // Register to receive ringer mode change and network state change.
@@ -843,8 +844,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
    public void onCurrentInputMethodSubtypeChanged(final InputMethodSubtype subtype) {
        // 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.
        final RichInputMethodSubtype richSubtype = new RichInputMethodSubtype(subtype);
        mSubtypeSwitcher.onSubtypeChanged(richSubtype);
        mSubtypeSwitcher.onSubtypeChanged(subtype);
        mInputLogic.onSubtypeChanged(SubtypeLocaleUtils.getCombiningRulesExtraValue(subtype),
                mSettings.getCurrent());
        loadKeyboard();
+7 −7
Original line number Diff line number Diff line
@@ -299,13 +299,13 @@ public class RichInputMethodManager {
        return INDEX_NOT_FOUND;
    }

    public RichInputMethodSubtype getCurrentInputMethodSubtype(
            final RichInputMethodSubtype defaultSubtype) {
        final InputMethodSubtype currentSubtype = mImmWrapper.mImm.getCurrentInputMethodSubtype();
        if (currentSubtype == null) {
            return defaultSubtype;
    public InputMethodSubtype getCurrentRawSubtype() {
        return mImmWrapper.mImm.getCurrentInputMethodSubtype();
    }
        return AdditionalFeaturesSettingUtils.getRichInputMethodSubtype(this, currentSubtype);

    public RichInputMethodSubtype createCurrentRichInputMethodSubtype(
            final InputMethodSubtype rawSubtype) {
        return AdditionalFeaturesSettingUtils.createRichInputMethodSubtype(this, rawSubtype);
    }

    public boolean hasMultipleEnabledIMEsOrSubtypes(final boolean shouldIncludeAuxiliarySubtypes) {
+10 −7
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ public final class SubtypeSwitcher {
            new LanguageOnSpacebarHelper();
    private InputMethodInfo mShortcutInputMethodInfo;
    private InputMethodSubtype mShortcutSubtype;
    private RichInputMethodSubtype mCurrentRichInputMethodSubtype;
    private RichInputMethodSubtype mNoLanguageSubtype;
    private RichInputMethodSubtype mEmojiSubtype;
    private boolean mIsNetworkConnected;
@@ -117,7 +118,7 @@ public final class SubtypeSwitcher {
        final NetworkInfo info = connectivityManager.getActiveNetworkInfo();
        mIsNetworkConnected = (info != null && info.isConnected());

        onSubtypeChanged(getCurrentSubtype());
        onSubtypeChanged(mRichImm.getCurrentRawSubtype());
        updateParametersOnStartInputView();
    }

@@ -165,12 +166,14 @@ public final class SubtypeSwitcher {
    }

    // Update the current subtype. LatinIME.onCurrentInputMethodSubtypeChanged calls this function.
    public void onSubtypeChanged(final RichInputMethodSubtype newSubtype) {
    public void onSubtypeChanged(final InputMethodSubtype newSubtype) {
        final RichInputMethodSubtype richSubtype =
                mRichImm.createCurrentRichInputMethodSubtype(newSubtype);
        if (DBG) {
            Log.w(TAG, "onSubtypeChanged: " + newSubtype.getNameForLogging());
            Log.w(TAG, "onSubtypeChanged: " + richSubtype.getNameForLogging());
        }

        final Locale[] newLocales = newSubtype.getLocales();
        mCurrentRichInputMethodSubtype = richSubtype;
        final Locale[] newLocales = richSubtype.getLocales();
        if (newLocales.length > 1) {
            // In multi-locales mode, the system language is never the same as the input language
            // because there is no single input language.
@@ -181,7 +184,7 @@ public final class SubtypeSwitcher {
            final boolean sameLocale = systemLocale.equals(newLocale);
            final boolean sameLanguage = systemLocale.getLanguage().equals(newLocale.getLanguage());
            final boolean implicitlyEnabled = mRichImm
                    .checkIfSubtypeBelongsToThisImeAndImplicitlyEnabled(newSubtype.getRawSubtype());
                    .checkIfSubtypeBelongsToThisImeAndImplicitlyEnabled(newSubtype);
            mLanguageOnSpacebarHelper.updateIsSystemLanguageSameAsInputLanguage(
                    sameLocale || (sameLanguage && implicitlyEnabled));
        }
@@ -301,7 +304,7 @@ public final class SubtypeSwitcher {
        if (null != sForcedSubtypeForTesting) {
            return sForcedSubtypeForTesting;
        }
        return mRichImm.getCurrentInputMethodSubtype(getNoLanguageSubtype());
        return mCurrentRichInputMethodSubtype;
    }

    public RichInputMethodSubtype getNoLanguageSubtype() {