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

Commit f3cd2bb3 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Fix IllegalStateException when setting input view

This is followup change of I95f379b9.

Bug: 4175031
Change-Id: Ibf3e3bd2524c9543ec6193cb6e59529b2c4df3b1
parent bde078fe
Loading
Loading
Loading
Loading
+40 −41
Original line number Diff line number Diff line
@@ -56,7 +56,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
    private SubtypeSwitcher mSubtypeSwitcher;
    private SharedPreferences mPrefs;

    private View mInputView;
    private LatinKeyboardView mKeyboardView;
    private LatinIME mInputMethodService;

@@ -101,7 +100,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
    // Default is SETTINGS_KEY_MODE_AUTO.
    private static final int DEFAULT_SETTINGS_KEY_MODE = SETTINGS_KEY_MODE_AUTO;

    private int mLayoutId;
    private int mThemeIndex;
    private int mKeyboardWidth;

    private static final KeyboardSwitcher sInstance = new KeyboardSwitcher();
@@ -122,11 +121,11 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
        try {
            sConfigDefaultKeyboardThemeId = ims.getString(
                    R.string.config_default_keyboard_theme_id);
            sInstance.mLayoutId = Integer.valueOf(
            sInstance.mThemeIndex = Integer.valueOf(
                    prefs.getString(PREF_KEYBOARD_LAYOUT, sConfigDefaultKeyboardThemeId));
        } catch (NumberFormatException e) {
            sConfigDefaultKeyboardThemeId = "0";
            sInstance.mLayoutId = 0;
            sInstance.mThemeIndex = 0;
        }
        prefs.registerOnSharedPreferenceChangeListener(sInstance);
    }
@@ -711,49 +710,51 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
    }

    public View onCreateInputView() {
        createInputViewInternal(mLayoutId, true);
        return mInputView;
        return createInputView(mThemeIndex, true);
    }

    private void createInputViewInternal(int newLayout, boolean forceReset) {
        int layoutId = newLayout;
        if (mLayoutId != layoutId || mKeyboardView == null || forceReset) {
    // Instance variable only for {@link #createInputView(int, boolean)}.
    private View mCurrentInputView;

    private View createInputView(final int newThemeIndex, final boolean forceRecreate) {
        if (mCurrentInputView != null && mThemeIndex == newThemeIndex && !forceRecreate)
            return mCurrentInputView;

        if (mKeyboardView != null) {
            mKeyboardView.closing();
        }
            if (KEYBOARD_THEMES.length <= layoutId) {
                layoutId = Integer.valueOf(sConfigDefaultKeyboardThemeId);
            }
        final int themeIndex = (newThemeIndex < KEYBOARD_THEMES.length) ? newThemeIndex
                : Integer.valueOf(sConfigDefaultKeyboardThemeId);

        Utils.GCUtils.getInstance().reset();
        boolean tryGC = true;
        for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
            try {
                    mInputView = LayoutInflater.from(mInputMethodService).inflate(
                            KEYBOARD_THEMES[layoutId], null);
                mCurrentInputView = LayoutInflater.from(mInputMethodService).inflate(
                        KEYBOARD_THEMES[themeIndex], null);
                tryGC = false;
            } catch (OutOfMemoryError e) {
                Log.w(TAG, "load keyboard failed: " + e);
                    tryGC = Utils.GCUtils.getInstance().tryGCOrWait(
                            mLayoutId + "," + layoutId, e);
                tryGC = Utils.GCUtils.getInstance().tryGCOrWait(mThemeIndex + "," + themeIndex, e);
            } catch (InflateException e) {
                Log.w(TAG, "load keyboard failed: " + e);
                    tryGC = Utils.GCUtils.getInstance().tryGCOrWait(
                            mLayoutId + "," + layoutId, e);
                tryGC = Utils.GCUtils.getInstance().tryGCOrWait(mThemeIndex + "," + themeIndex, e);
            }
        }
            mKeyboardView = (LatinKeyboardView)mInputView.findViewById(R.id.latin_keyboard_view);

        mKeyboardView = (LatinKeyboardView) mCurrentInputView.findViewById(
                R.id.latin_keyboard_view);
        mKeyboardView.setOnKeyboardActionListener(mInputMethodService);
            mLayoutId = layoutId;
        }
        mThemeIndex = themeIndex;
        return mCurrentInputView;
    }

    private void postSetInputView() {
    private void postSetInputView(final View newInputView) {
        mInputMethodService.mHandler.post(new Runnable() {
            @Override
            public void run() {
                if (mKeyboardView != null) {
                    mInputMethodService.setInputView(mKeyboardView);
                if (newInputView != null) {
                    mInputMethodService.setInputView(newInputView);
                }
                mInputMethodService.updateInputViewShown();
            }
@@ -765,13 +766,11 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
        if (PREF_KEYBOARD_LAYOUT.equals(key)) {
            final int layoutId = Integer.valueOf(
                    sharedPreferences.getString(key, sConfigDefaultKeyboardThemeId));
            createInputViewInternal(layoutId, false);
            postSetInputView();
            postSetInputView(createInputView(layoutId, false));
        } else if (Settings.PREF_SETTINGS_KEY.equals(key)) {
            mSettingsKeyEnabledInSettings = getSettingsKeyMode(sharedPreferences,
                    mInputMethodService);
            createInputViewInternal(mLayoutId, true);
            postSetInputView();
            postSetInputView(createInputView(mThemeIndex, true));
        }
    }