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

Commit 7d6d98ec authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android (Google) Code Review
Browse files

Merge "Cleanup keyboard theme switching code"

parents b43f2aeb 411749a4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@
    <integer name="config_keyboard_grid_height">16</integer>
    <integer name="config_double_spaces_turn_into_period_timeout">1100</integer>
    <!-- This configuration is the index of the array {@link KeyboardSwitcher.KEYBOARD_THEMES}. -->
    <string name="config_default_keyboard_theme_id" translatable="false">5</string>
    <string name="config_default_keyboard_theme_index" translatable="false">5</string>
    <integer name="config_max_more_keys_column">5</integer>
    <!--
         Configuration for KeyboardView
+6 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
<resources>
    <!-- Theme "Basic" -->
    <style name="Keyboard">
        <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
        <item name="themeId">0</item>
        <item name="touchPositionCorrectionData">@array/touch_position_correction_data_empty</item>
        <item name="rowHeight">25%p</item>
@@ -141,6 +142,7 @@
        name="Keyboard.HighContrast"
        parent="Keyboard"
    >
        <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
        <item name="themeId">1</item>
    </style>
    <style
@@ -165,6 +167,7 @@
        name="Keyboard.Stone"
        parent="Keyboard"
    >
        <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
        <item name="themeId">6</item>
        <item name="keyboardHeight">@dimen/keyboardHeight_stone</item>
        <item name="keyboardTopPadding">@fraction/keyboard_top_padding_stone</item>
@@ -216,6 +219,7 @@
        name="Keyboard.Stone.Bold"
        parent="Keyboard.Stone"
    >
        <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
        <item name="themeId">7</item>
    </style>
    <style
@@ -239,6 +243,7 @@
        name="Keyboard.Gingerbread"
        parent="Keyboard"
    >
        <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
        <item name="themeId">8</item>
        <item name="touchPositionCorrectionData">@array/touch_position_correction_data_gingerbread</item>
        <item name="horizontalGap">@fraction/key_horizontal_gap_gb</item>
@@ -281,6 +286,7 @@
        name="Keyboard.IceCreamSandwich"
        parent="Keyboard"
    >
        <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
        <item name="themeId">5</item>
        <item name="keyboardTopPadding">@fraction/keyboard_top_padding_ics</item>
        <item name="keyboardBottomPadding">@fraction/keyboard_bottom_padding_ics</item>
+1 −15
Original line number Diff line number Diff line
@@ -388,20 +388,6 @@ public class Keyboard {
        }
    }

    // TODO: Move this method to KeyboardSwitcher.
    public static String toThemeName(int themeId) {
        // This should be aligned with theme-*.xml resource files' themeId attribute.
        switch (themeId) {
        case 0: return "Basic";
        case 1: return "BasicHighContrast";
        case 5: return "IceCreamSandwich";
        case 6: return "Stone";
        case 7: return "StoneBold";
        case 8: return "GingerBread";
        default: return null;
        }
    }

   /**
     * Keyboard Building helper.
     *
+38 −26
Original line number Diff line number Diff line
@@ -43,13 +43,26 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
    private static final String TAG = KeyboardSwitcher.class.getSimpleName();

    public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20110916";
    private static final int[] KEYBOARD_THEMES = {
        R.style.KeyboardTheme,
        R.style.KeyboardTheme_HighContrast,
        R.style.KeyboardTheme_Stone,
        R.style.KeyboardTheme_Stone_Bold,
        R.style.KeyboardTheme_Gingerbread,
        R.style.KeyboardTheme_IceCreamSandwich,

    static class KeyboardTheme {
        public final String mName;
        public final int mThemeId;
        public final int mStyleId;

        public KeyboardTheme(String name, int themeId, int styleId) {
            mName = name;
            mThemeId = themeId;
            mStyleId = styleId;
        }
    }

    private static final KeyboardTheme[] KEYBOARD_THEMES = {
        new KeyboardTheme("Basic",            0, R.style.KeyboardTheme),
        new KeyboardTheme("HighContrast",     1, R.style.KeyboardTheme_HighContrast),
        new KeyboardTheme("Stone",            6, R.style.KeyboardTheme_Stone),
        new KeyboardTheme("Stne.Bold",        7, R.style.KeyboardTheme_Stone_Bold),
        new KeyboardTheme("GingerBread",      8, R.style.KeyboardTheme_Gingerbread),
        new KeyboardTheme("IceCreamSandwich", 5, R.style.KeyboardTheme_IceCreamSandwich),
    };

    private SubtypeSwitcher mSubtypeSwitcher;
@@ -69,7 +82,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
     * what user actually typed. */
    private boolean mIsAutoCorrectionActive;

    private int mThemeIndex = -1;
    private KeyboardTheme mKeyboardTheme = KEYBOARD_THEMES[0];
    private Context mThemeContext;

    private static final KeyboardSwitcher sInstance = new KeyboardSwitcher();
@@ -92,29 +105,30 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
        mPrefs = prefs;
        mSubtypeSwitcher = SubtypeSwitcher.getInstance();
        mState = new KeyboardState(this);
        setContextThemeWrapper(ims, getKeyboardThemeIndex(ims, prefs));
        setContextThemeWrapper(ims, getKeyboardTheme(ims, prefs));
        mForceNonDistinctMultitouch = prefs.getBoolean(
                DebugSettings.FORCE_NON_DISTINCT_MULTITOUCH_KEY, false);
    }

    private static int getKeyboardThemeIndex(Context context, SharedPreferences prefs) {
        final String defaultThemeId = context.getString(R.string.config_default_keyboard_theme_id);
        final String themeId = prefs.getString(PREF_KEYBOARD_LAYOUT, defaultThemeId);
    private static KeyboardTheme getKeyboardTheme(Context context, SharedPreferences prefs) {
        final String defaultIndex = context.getString(R.string.config_default_keyboard_theme_index);
        final String themeIndex = prefs.getString(PREF_KEYBOARD_LAYOUT, defaultIndex);
        try {
            final int themeIndex = Integer.valueOf(themeId);
            if (themeIndex >= 0 && themeIndex < KEYBOARD_THEMES.length)
                return themeIndex;
            final int index = Integer.valueOf(themeIndex);
            if (index >= 0 && index < KEYBOARD_THEMES.length) {
                return KEYBOARD_THEMES[index];
            }
        } catch (NumberFormatException e) {
            // Format error, keyboard theme is default to 0.
        }
        Log.w(TAG, "Illegal keyboard theme in preference: " + themeId + ", default to 0");
        return 0;
        Log.w(TAG, "Illegal keyboard theme in preference: " + themeIndex + ", default to 0");
        return KEYBOARD_THEMES[0];
    }

    private void setContextThemeWrapper(Context context, int themeIndex) {
        if (mThemeIndex != themeIndex) {
            mThemeIndex = themeIndex;
            mThemeContext = new ContextThemeWrapper(context, KEYBOARD_THEMES[themeIndex]);
    private void setContextThemeWrapper(Context context, KeyboardTheme keyboardTheme) {
        if (mKeyboardTheme.mThemeId != keyboardTheme.mThemeId) {
            mKeyboardTheme = keyboardTheme;
            mThemeContext = new ContextThemeWrapper(context, keyboardTheme.mStyleId);
            KeyboardSet.clearKeyboardCache();
        }
    }
@@ -347,18 +361,16 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
        boolean tryGC = true;
        for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
            try {
                setContextThemeWrapper(mInputMethodService, mThemeIndex);
                setContextThemeWrapper(mInputMethodService, mKeyboardTheme);
                mCurrentInputView = (InputView)LayoutInflater.from(mThemeContext).inflate(
                        R.layout.input_view, null);
                tryGC = false;
            } catch (OutOfMemoryError e) {
                Log.w(TAG, "load keyboard failed: " + e);
                tryGC = Utils.GCUtils.getInstance().tryGCOrWait(
                        Keyboard.toThemeName(mThemeIndex), e);
                tryGC = Utils.GCUtils.getInstance().tryGCOrWait(mKeyboardTheme.mName, e);
            } catch (InflateException e) {
                Log.w(TAG, "load keyboard failed: " + e);
                tryGC = Utils.GCUtils.getInstance().tryGCOrWait(
                        Keyboard.toThemeName(mThemeIndex), e);
                tryGC = Utils.GCUtils.getInstance().tryGCOrWait(mKeyboardTheme.mName, e);
            }
        }