Merge "Update string for Ic0d5f862"
diff --git a/java/res/xml-da-xlarge/kbd_qwerty.xml b/java/res/xml-da-xlarge/kbd_qwerty.xml
new file mode 100644
index 0000000..3170b08
--- /dev/null
+++ b/java/res/xml-da-xlarge/kbd_qwerty.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** 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.
+*/
+-->
+
+<!--
+    Danish Keyboard Layout
+
+    Just a copy of the Norwegian layout, with æ/ø switched.
+-->
+
+<Keyboard
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="@dimen/key_bottom_gap"
+    latin:keyHeight="@dimen/key_height"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
+</Keyboard>
diff --git a/java/res/xml-nb-xlarge/kbd_qwerty.xml b/java/res/xml-nb-xlarge/kbd_qwerty.xml
new file mode 100644
index 0000000..b137b58
--- /dev/null
+++ b/java/res/xml-nb-xlarge/kbd_qwerty.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** 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.
+*/
+-->
+
+<!--
+    Norwegian Keyboard Layout
+
+    Just a copy of the Swedish layout, with ä/æ and ö/ø switched.
+-->
+
+<Keyboard
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="@dimen/key_bottom_gap"
+    latin:keyHeight="@dimen/key_height"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
+</Keyboard>
diff --git a/java/res/xml-ru-xlarge/kbd_qwerty.xml b/java/res/xml-ru-xlarge/kbd_qwerty.xml
new file mode 100644
index 0000000..fef0421
--- /dev/null
+++ b/java/res/xml-ru-xlarge/kbd_qwerty.xml
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** 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.
+*/
+-->
+
+<Keyboard
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyWidth="9.091%p"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="@dimen/key_bottom_gap"
+    latin:keyHeight="@dimen/key_height"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_key_styles" />
+    <!-- This row is intentionally not marked as a top row -->
+    <Row
+        latin:keyWidth="7.520%p"
+    >
+        <Key
+            latin:keyStyle="tabKeyStyle"
+            latin:keyLabelOption="alignLeft"
+            latin:keyWidth="7.949%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="й"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="1" />
+        <Key
+            latin:keyLabel="ц"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="2" />
+        <Key
+            latin:keyLabel="у"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="3" />
+        <Key
+            latin:keyLabel="к"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="4" />
+        <Key
+            latin:keyLabel="е"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_cyrillic_e" />
+        <Key
+            latin:keyLabel="н"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="6" />
+        <Key
+            latin:keyLabel="г"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="7" />
+        <Key
+            latin:keyLabel="ш"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="8" />
+        <Key
+            latin:keyLabel="щ"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="9" />
+        <Key
+            latin:keyLabel="з"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="0" />
+        <Key
+            latin:keyLabel="х" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyWidth="9.331%p"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <Row
+        latin:keyWidth="7.520%p"
+    >
+        <Key
+            latin:keyStyle="toSymbolKeyStyle"
+            latin:keyLabelOption="alignLeft"
+            latin:keyWidth="7.949%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="ф" />
+        <Key
+            latin:keyLabel="ы" />
+        <Key
+            latin:keyLabel="в" />
+        <Key
+            latin:keyLabel="а" />
+        <Key
+            latin:keyLabel="п" />
+        <Key
+            latin:keyLabel="р" />
+        <Key
+            latin:keyLabel="о" />
+        <Key
+            latin:keyLabel="л" />
+        <Key
+            latin:keyLabel="д" />
+        <Key
+            latin:keyLabel="ж" />
+        <Key
+            latin:keyLabel="э" />
+        <Key
+            latin:keyStyle="returnKeyStyle"
+            latin:keyWidth="9.331%p"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <Row
+        latin:keyWidth="8.042%p"
+    >
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="15.192%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="я" />
+        <Key
+            latin:keyLabel="ч" />
+        <Key
+            latin:keyLabel="с" />
+        <Key
+            latin:keyLabel="м" />
+        <Key
+            latin:keyLabel="и" />
+        <Key
+            latin:keyLabel="т" />
+        <Key
+            latin:keyLabel="ь"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" />
+        <Key
+            latin:keyLabel="б" />
+        <Key
+            latin:keyLabel="ю" />
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="12.530%p"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</Keyboard>
diff --git a/java/res/xml-sr-xlarge/kbd_qwerty.xml b/java/res/xml-sr-xlarge/kbd_qwerty.xml
new file mode 100644
index 0000000..297d726
--- /dev/null
+++ b/java/res/xml-sr-xlarge/kbd_qwerty.xml
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** 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.
+*/
+-->
+
+<!-- Serbian keyboard layout, based on the X11 layout for Serbian -->
+<Keyboard
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyWidth="9.09%p"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="@dimen/key_bottom_gap"
+    latin:keyHeight="@dimen/key_height"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_key_styles" />
+    <!-- This row is intentionally not marked as a top row -->
+    <Row
+        latin:keyWidth="7.520%p"
+    >
+        <Key
+            latin:keyStyle="tabKeyStyle"
+            latin:keyLabelOption="alignLeft"
+            latin:keyWidth="7.949%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="љ"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="1" />
+        <Key
+            latin:keyLabel="њ"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="2" />
+        <Key
+            latin:keyLabel="е"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="3" />
+        <Key
+            latin:keyLabel="р"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="4" />
+        <Key
+            latin:keyLabel="т"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="5" />
+        <Key
+            latin:keyLabel="з"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="6" />
+        <Key
+            latin:keyLabel="у"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="7" />
+        <Key
+            latin:keyLabel="и"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="8" />
+        <Key
+            latin:keyLabel="о"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="9" />
+        <Key
+            latin:keyLabel="п"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="0" />
+        <Key
+            latin:keyLabel="ш" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyWidth="9.331%p"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <Row
+        latin:keyWidth="7.520%p"
+    >
+        <Key
+            latin:keyStyle="toSymbolKeyStyle"
+            latin:keyLabelOption="alignLeft"
+            latin:keyWidth="7.949%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="а" />
+        <Key
+            latin:keyLabel="с" />
+        <Key
+            latin:keyLabel="д" />
+        <Key
+            latin:keyLabel="ф" />
+        <Key
+            latin:keyLabel="г" />
+        <Key
+            latin:keyLabel="х" />
+        <Key
+            latin:keyLabel="ј" />
+        <Key
+            latin:keyLabel="к" />
+        <Key
+            latin:keyLabel="л" />
+        <Key
+            latin:keyLabel="ч" />
+        <Key
+            latin:keyLabel="ћ" />
+        <Key
+            latin:keyStyle="returnKeyStyle"
+            latin:keyWidth="9.331%p"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <Row
+        latin:keyWidth="7.520%p"
+    >
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="12.400%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="ђ" />
+        <Key
+            latin:keyLabel="ж" />
+        <Key
+            latin:keyLabel="џ" />
+        <Key
+            latin:keyLabel="ц" />
+        <Key
+            latin:keyLabel="в" />
+        <Key
+            latin:keyLabel="б" />
+        <Key
+            latin:keyLabel="н" />
+        <Key
+            latin:keyLabel="м" />
+        <Key
+            latin:keyLabel=","
+            latin:manualTemporaryUpperCaseCode="33"
+            latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="!" />
+        <Key
+            latin:keyLabel="."
+            latin:manualTemporaryUpperCaseCode="63"
+            latin:keyHintIcon="@drawable/key_hint_question_holo"
+            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="\?" />
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="12.400%p"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</Keyboard>
diff --git a/java/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml
index 77e7647..279b040 100644
--- a/java/res/xml-sr/kbd_qwerty.xml
+++ b/java/res/xml-sr/kbd_qwerty.xml
@@ -86,7 +86,9 @@
             latin:keyLabel="ш"
             latin:keyEdgeFlags="right" />
     </Row>
-    <Row>
+    <Row
+        latin:keyWidth="8.333%p"
+    >
         <Key
             latin:keyLabel="а"
             latin:keyEdgeFlags="left" />
diff --git a/java/res/xml-sv-xlarge/kbd_qwerty.xml b/java/res/xml-sv-xlarge/kbd_qwerty.xml
new file mode 100644
index 0000000..80d9453
--- /dev/null
+++ b/java/res/xml-sv-xlarge/kbd_qwerty.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** 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.
+*/
+-->
+
+<!--
+    Swedish Keyboard Layout
+
+    Key positioning: Svensk standard SS 66 22 41
+    Foreign letters: Svenska skrivregler (2:a uppl.) §302
+    Local additions: ۧ
+-->
+
+<Keyboard
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="@dimen/key_bottom_gap"
+    latin:keyHeight="@dimen/key_height"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml b/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml
new file mode 100644
index 0000000..c56d4f4
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** 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.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_key_styles" />
+    <Row
+        latin:keyWidth="7.520%p"
+    >
+        <Key
+            latin:keyStyle="tabKeyStyle"
+            latin:keyLabelOption="alignLeft"
+            latin:keyWidth="7.949%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="q"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_q" />
+        <Key
+            latin:keyLabel="w"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_w" />
+        <Key
+            latin:keyLabel="e"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_e" />
+        <Key
+            latin:keyLabel="r"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_r" />
+        <Key
+            latin:keyLabel="t"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_t" />
+        <Key
+            latin:keyLabel="y"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_y" />
+        <Key
+            latin:keyLabel="u"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_u" />
+        <Key
+            latin:keyLabel="i"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_i" />
+        <Key
+            latin:keyLabel="o"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_o" />
+        <Key
+            latin:keyLabel="p"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_p" />
+        <Key
+            latin:keyLabel="å" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyWidth="9.331%p"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <Row
+        latin:keyWidth="7.520%p"
+    >
+        <Key
+            latin:keyStyle="toSymbolKeyStyle"
+            latin:keyLabelOption="alignLeft"
+            latin:keyWidth="7.949%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="a"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_a" />
+        <Key
+            latin:keyLabel="s"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_s" />
+        <Key
+            latin:keyLabel="d"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_d" />
+        <Key
+            latin:keyLabel="f" />
+        <Key
+            latin:keyLabel="g"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_g" />
+        <Key
+            latin:keyLabel="h" />
+        <Key
+            latin:keyLabel="j" />
+        <Key
+            latin:keyLabel="k" />
+        <Key
+            latin:keyLabel="l"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_l" />
+        <Key
+            latin:keyLabel="@string/keylabel_for_scandinavia_row2_10"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_scandinavia_row2_10" />
+        <Key
+            latin:keyLabel="@string/keylabel_for_scandinavia_row2_11"
+            latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" />
+        <Key
+            latin:keyStyle="returnKeyStyle"
+            latin:keyWidth="9.331%p"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_row3" />
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index af1575f..00b6f0a 100644
--- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -296,7 +296,6 @@
         final SoftReference<LatinKeyboard> ref = mKeyboardCache.get(id);
         LatinKeyboard keyboard = (ref == null) ? null : ref.get();
         if (keyboard == null) {
-            final Resources res = mInputMethodService.getResources();
             final Locale savedLocale =  mSubtypeSwitcher.changeSystemLocale(
                     mSubtypeSwitcher.getInputLocale());
 
@@ -668,11 +667,12 @@
         return mInputView;
     }
 
-    public void loadKeyboardView() {
-        loadKeyboardViewInternal(mLayoutId, true);
+    public LatinKeyboardView onCreateInputView() {
+        createInputViewInternal(mLayoutId, true);
+        return mInputView;
     }
 
-    private void loadKeyboardViewInternal(int newLayout, boolean forceReset) {
+    private void createInputViewInternal(int newLayout, boolean forceReset) {
         if (mLayoutId != newLayout || mInputView == null || forceReset) {
             if (mInputView != null) {
                 mInputView.closing();
@@ -701,24 +701,31 @@
             mInputView.setOnKeyboardActionListener(mInputMethodService);
             mLayoutId = newLayout;
         }
-        // TODO: Not to post if this function was called from loadKeyboardView
+    }
+
+    private void postSetInputView() {
         mInputMethodService.mHandler.post(new Runnable() {
+            @Override
             public void run() {
                 if (mInputView != null) {
                     mInputMethodService.setInputView(mInputView);
                 }
                 mInputMethodService.updateInputViewShown();
-            }});
+            }
+        });
     }
 
+    @Override
     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
         if (PREF_KEYBOARD_LAYOUT.equals(key)) {
             final int layoutId = Integer.valueOf(
                     sharedPreferences.getString(key, DEFAULT_LAYOUT_ID));
-            loadKeyboardViewInternal(layoutId, false);
+            createInputViewInternal(layoutId, false);
+            postSetInputView();
         } else if (LatinIMESettings.PREF_SETTINGS_KEY.equals(key)) {
             mHasSettingsKey = getSettingsKeyMode(sharedPreferences, mInputMethodService);
-            loadKeyboardViewInternal(mLayoutId, true);
+            createInputViewInternal(mLayoutId, true);
+            postSetInputView();
         }
     }
 
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 4ef19e8..36c77ef 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -464,7 +464,8 @@
     @Override
     public void onConfigurationChanged(Configuration conf) {
         mSubtypeSwitcher.onConfigurationChanged(conf);
-        onKeyboardLanguageChanged();
+        if (mSubtypeSwitcher.isKeyboardMode())
+            onKeyboardLanguageChanged();
         updateAutoTextEnabled();
 
         // If orientation changed while predicting, commit the change
@@ -489,8 +490,7 @@
 
     @Override
     public View onCreateInputView() {
-        mKeyboardSwitcher.loadKeyboardView();
-        return mKeyboardSwitcher.getInputView();
+        return mKeyboardSwitcher.onCreateInputView();
     }
 
     @Override
@@ -524,7 +524,7 @@
             return;
         }
 
-        SubtypeSwitcher.getInstance().updateParametersOnStartInputView();
+        mSubtypeSwitcher.updateParametersOnStartInputView();
 
         if (mRefreshKeyboardRequired) {
             mRefreshKeyboardRequired = false;
@@ -614,9 +614,12 @@
         mJustAddedAutoSpace = false;
 
         loadSettings(attribute);
-        switcher.loadKeyboard(mode, attribute.imeOptions, mVoiceConnector.isVoiceButtonEnabled(),
-                mVoiceConnector.isVoiceButtonOnPrimary());
-        switcher.updateShiftState();
+        if (mSubtypeSwitcher.isKeyboardMode()) {
+            switcher.loadKeyboard(mode, attribute.imeOptions,
+                    mVoiceConnector.isVoiceButtonEnabled(),
+                    mVoiceConnector.isVoiceButtonOnPrimary());
+            switcher.updateShiftState();
+        }
 
         setCandidatesViewShownInternal(isCandidateStripVisible(),
                 false /* needsInputViewShown */ );
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
index 0e739e2..103443e 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -39,7 +39,7 @@
     // We may or may not draw the current language on space bar regardless of this flag.
     public static final boolean USE_SPACEBAR_LANGUAGE_SWITCHER = false;
     private static final boolean DBG = false;
-    private static final String TAG = "InputMethodSubtypeSwitcher";
+    private static final String TAG = "SubtypeSwitcher";
 
     private static final char LOCALE_SEPARATER = '_';
     private static final String KEYBOARD_MODE = "keyboard";
@@ -153,9 +153,9 @@
         final String newLocale;
         final String newMode;
         if (newSubtype == null) {
-            // Normally, newSubtype shouldn't be null. But just in case if newSubtype was null,
+            // Normally, newSubtype shouldn't be null. But just in case newSubtype was null,
             // fallback to the default locale and mode.
-            Log.e(TAG, "Couldn't get the current subtype.");
+            Log.w(TAG, "Couldn't get the current subtype.");
             newLocale = "en_US";
             newMode =KEYBOARD_MODE;
         } else {
@@ -345,14 +345,11 @@
 
     public boolean setVoiceInput(VoiceInput vi) {
         if (mVoiceInput == null && vi != null) {
-            // TODO: Remove requirements to construct KeyboardSwitcher
-            // when IME was enabled with Voice mode
             mVoiceInput = vi;
             if (isVoiceMode()) {
                 if (DBG) {
                     Log.d(TAG, "Set and call voice input.");
                 }
-                mService.onKeyboardLanguageChanged();
                 mService.onKey(LatinKeyboardView.KEYCODE_VOICE, null, 0, 0);
                 return true;
             }