Restart LatinIME service when keyboard theme is changed

Bug: 6023947
Change-Id: I779da32708fca7333aff74929cc98173246ee685
main
Tadashi G. Takaoka 2012-03-08 15:07:00 +09:00
parent 77541fc92e
commit 3e2d385810
3 changed files with 9 additions and 36 deletions

View File

@ -388,6 +388,7 @@ public class Keyboard {
} }
} }
// TODO: Move this method to KeyboardSwitcher.
public static String toThemeName(int themeId) { public static String toThemeName(int themeId) {
// This should be aligned with theme-*.xml resource files' themeId attribute. // This should be aligned with theme-*.xml resource files' themeId attribute.
switch (themeId) { switch (themeId) {

View File

@ -39,8 +39,7 @@ import com.android.inputmethod.latin.SettingsValues;
import com.android.inputmethod.latin.SubtypeSwitcher; import com.android.inputmethod.latin.SubtypeSwitcher;
import com.android.inputmethod.latin.Utils; import com.android.inputmethod.latin.Utils;
public class KeyboardSwitcher implements KeyboardState.SwitchActions, public class KeyboardSwitcher implements KeyboardState.SwitchActions {
SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = KeyboardSwitcher.class.getSimpleName(); private static final String TAG = KeyboardSwitcher.class.getSimpleName();
public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20110916"; public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20110916";
@ -94,7 +93,6 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions,
mSubtypeSwitcher = SubtypeSwitcher.getInstance(); mSubtypeSwitcher = SubtypeSwitcher.getInstance();
mState = new KeyboardState(this); mState = new KeyboardState(this);
setContextThemeWrapper(ims, getKeyboardThemeIndex(ims, prefs)); setContextThemeWrapper(ims, getKeyboardThemeIndex(ims, prefs));
prefs.registerOnSharedPreferenceChangeListener(this);
mForceNonDistinctMultitouch = prefs.getBoolean( mForceNonDistinctMultitouch = prefs.getBoolean(
DebugSettings.FORCE_NON_DISTINCT_MULTITOUCH_KEY, false); DebugSettings.FORCE_NON_DISTINCT_MULTITOUCH_KEY, false);
} }
@ -341,34 +339,26 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions,
} }
public View onCreateInputView() { public View onCreateInputView() {
return createInputView(mThemeIndex, true);
}
private View createInputView(final int newThemeIndex, final boolean forceRecreate) {
if (mCurrentInputView != null && mThemeIndex == newThemeIndex && !forceRecreate)
return mCurrentInputView;
if (mKeyboardView != null) { if (mKeyboardView != null) {
mKeyboardView.closing(); mKeyboardView.closing();
} }
final int oldThemeIndex = mThemeIndex;
Utils.GCUtils.getInstance().reset(); Utils.GCUtils.getInstance().reset();
boolean tryGC = true; boolean tryGC = true;
for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
try { try {
setContextThemeWrapper(mInputMethodService, newThemeIndex); setContextThemeWrapper(mInputMethodService, mThemeIndex);
mCurrentInputView = (InputView)LayoutInflater.from(mThemeContext).inflate( mCurrentInputView = (InputView)LayoutInflater.from(mThemeContext).inflate(
R.layout.input_view, null); R.layout.input_view, null);
tryGC = false; tryGC = false;
} catch (OutOfMemoryError e) { } catch (OutOfMemoryError e) {
Log.w(TAG, "load keyboard failed: " + e); Log.w(TAG, "load keyboard failed: " + e);
tryGC = Utils.GCUtils.getInstance().tryGCOrWait( tryGC = Utils.GCUtils.getInstance().tryGCOrWait(
oldThemeIndex + "," + newThemeIndex, e); Keyboard.toThemeName(mThemeIndex), e);
} catch (InflateException e) { } catch (InflateException e) {
Log.w(TAG, "load keyboard failed: " + e); Log.w(TAG, "load keyboard failed: " + e);
tryGC = Utils.GCUtils.getInstance().tryGCOrWait( tryGC = Utils.GCUtils.getInstance().tryGCOrWait(
oldThemeIndex + "," + newThemeIndex, e); Keyboard.toThemeName(mThemeIndex), e);
} }
} }
@ -385,27 +375,6 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions,
return mCurrentInputView; return mCurrentInputView;
} }
private void postSetInputView(final View newInputView) {
final LatinIME latinIme = mInputMethodService;
latinIme.mHandler.post(new Runnable() {
@Override
public void run() {
if (newInputView != null) {
latinIme.setInputView(newInputView);
}
latinIme.updateInputViewShown();
}
});
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (PREF_KEYBOARD_LAYOUT.equals(key)) {
final int themeIndex = getKeyboardThemeIndex(mInputMethodService, sharedPreferences);
postSetInputView(createInputView(themeIndex, false));
}
}
public void onNetworkStateChanged() { public void onNetworkStateChanged() {
if (mKeyboardView != null) { if (mKeyboardView != null) {
mKeyboardView.updateShortcutKey(SubtypeSwitcher.getInstance().isShortcutImeReady()); mKeyboardView.updateShortcutKey(SubtypeSwitcher.getInstance().isShortcutImeReady());

View File

@ -25,6 +25,8 @@ import android.preference.CheckBoxPreference;
import android.preference.PreferenceActivity; import android.preference.PreferenceActivity;
import android.util.Log; import android.util.Log;
import com.android.inputmethod.keyboard.KeyboardSwitcher;
public class DebugSettings extends PreferenceActivity public class DebugSettings extends PreferenceActivity
implements SharedPreferences.OnSharedPreferenceChangeListener { implements SharedPreferences.OnSharedPreferenceChangeListener {
@ -61,7 +63,8 @@ public class DebugSettings extends PreferenceActivity
updateDebugMode(); updateDebugMode();
mServiceNeedsRestart = true; mServiceNeedsRestart = true;
} }
} else if (key.equals(FORCE_NON_DISTINCT_MULTITOUCH_KEY)) { } else if (key.equals(FORCE_NON_DISTINCT_MULTITOUCH_KEY)
|| key.equals(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT)) {
mServiceNeedsRestart = true; mServiceNeedsRestart = true;
} }
} }