Remove CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED boolean

Bug: 6129704
Change-Id: I7643e656c6e7656eff339cc301dd32f34dee83a4
main
Tadashi G. Takaoka 2012-04-02 21:25:01 +09:00
parent b1904ec235
commit 19457316c1
6 changed files with 14 additions and 184 deletions

View File

@ -21,9 +21,6 @@
<PreferenceCategory <PreferenceCategory
android:title="@string/general_category" android:title="@string/general_category"
android:key="general_settings"> android:key="general_settings">
<PreferenceScreen
android:key="subtype_settings"
android:title="@string/language_selection_title" />
<CheckBoxPreference <CheckBoxPreference
android:key="auto_cap" android:key="auto_cap"
android:title="@string/auto_cap" android:title="@string/auto_cap"

View File

@ -35,23 +35,16 @@ public class CompatUtils {
public static Intent getInputLanguageSelectionIntent(String inputMethodId, public static Intent getInputLanguageSelectionIntent(String inputMethodId,
int flagsForSubtypeSettings) { int flagsForSubtypeSettings) {
final String action; // Refer to android.provider.Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS
Intent intent; final String action = INPUT_METHOD_SUBTYPE_SETTINGS;
if (InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED final Intent intent = new Intent(action);
/* android.os.Build.VERSION_CODES.HONEYCOMB */ if (!TextUtils.isEmpty(inputMethodId)) {
&& android.os.Build.VERSION.SDK_INT >= 11) { intent.putExtra(EXTRA_INPUT_METHOD_ID, inputMethodId);
// Refer to android.provider.Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS
action = INPUT_METHOD_SUBTYPE_SETTINGS;
intent = new Intent(action);
if (!TextUtils.isEmpty(inputMethodId)) {
intent.putExtra(EXTRA_INPUT_METHOD_ID, inputMethodId);
}
if (flagsForSubtypeSettings > 0) {
intent.setFlags(flagsForSubtypeSettings);
}
return intent;
} }
throw new RuntimeException("Language selection doesn't supported on this platform"); if (flagsForSubtypeSettings > 0) {
intent.setFlags(flagsForSubtypeSettings);
}
return intent;
} }
public static Class<?> getClass(String className) { public static Class<?> getClass(String className) {

View File

@ -17,23 +17,15 @@
package com.android.inputmethod.compat; package com.android.inputmethod.compat;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.IBinder; import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import com.android.inputmethod.latin.SubtypeSwitcher;
import com.android.inputmethod.latin.SubtypeUtils;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
// TODO: Override this class with the concrete implementation if we need to take care of the // TODO: Override this class with the concrete implementation if we need to take care of the
@ -61,18 +53,7 @@ public class InputMethodManagerCompatWrapper {
private static final InputMethodManagerCompatWrapper sInstance = private static final InputMethodManagerCompatWrapper sInstance =
new InputMethodManagerCompatWrapper(); new InputMethodManagerCompatWrapper();
// For the compatibility, IMM will create dummy subtypes if subtypes are not found.
// This is required to be false if the current behavior is broken. For now, it's ok to be true.
public static final boolean FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES =
!InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED;
private static final String VOICE_MODE = "voice";
private static final String KEYBOARD_MODE = "keyboard";
private InputMethodServiceCompatWrapper mService;
private InputMethodManager mImm; private InputMethodManager mImm;
private PackageManager mPackageManager;
private ApplicationInfo mApplicationInfo;
private String mLatinImePackageName;
public static InputMethodManagerCompatWrapper getInstance() { public static InputMethodManagerCompatWrapper getInstance() {
if (sInstance.mImm == null) if (sInstance.mImm == null)
@ -81,12 +62,8 @@ public class InputMethodManagerCompatWrapper {
} }
public static void init(InputMethodServiceCompatWrapper service) { public static void init(InputMethodServiceCompatWrapper service) {
sInstance.mService = service;
sInstance.mImm = (InputMethodManager) service.getSystemService( sInstance.mImm = (InputMethodManager) service.getSystemService(
Context.INPUT_METHOD_SERVICE); Context.INPUT_METHOD_SERVICE);
sInstance.mLatinImePackageName = service.getPackageName();
sInstance.mPackageManager = service.getPackageManager();
sInstance.mApplicationInfo = service.getApplicationInfo();
} }
public InputMethodSubtypeCompatWrapper getCurrentInputMethodSubtype() { public InputMethodSubtypeCompatWrapper getCurrentInputMethodSubtype() {
@ -104,67 +81,18 @@ public class InputMethodManagerCompatWrapper {
Object retval = CompatUtils.invoke(mImm, null, METHOD_getEnabledInputMethodSubtypeList, Object retval = CompatUtils.invoke(mImm, null, METHOD_getEnabledInputMethodSubtypeList,
imi, allowsImplicitlySelectedSubtypes); imi, allowsImplicitlySelectedSubtypes);
if (retval == null || !(retval instanceof List<?>) || ((List<?>)retval).isEmpty()) { if (retval == null || !(retval instanceof List<?>) || ((List<?>)retval).isEmpty()) {
if (!FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES) { // Returns an empty list
// Returns an empty list return Collections.emptyList();
return Collections.emptyList();
}
// Creates dummy subtypes
@SuppressWarnings("unused")
List<InputMethodSubtypeCompatWrapper> subtypeList =
new ArrayList<InputMethodSubtypeCompatWrapper>();
InputMethodSubtypeCompatWrapper keyboardSubtype = getLastResortSubtype(KEYBOARD_MODE);
InputMethodSubtypeCompatWrapper voiceSubtype = getLastResortSubtype(VOICE_MODE);
if (keyboardSubtype != null) {
subtypeList.add(keyboardSubtype);
}
if (voiceSubtype != null) {
subtypeList.add(voiceSubtype);
}
return subtypeList;
} }
return CompatUtils.copyInputMethodSubtypeListToWrapper(retval); return CompatUtils.copyInputMethodSubtypeListToWrapper(retval);
} }
private InputMethodInfo getLatinImeInputMethodInfo() {
if (TextUtils.isEmpty(mLatinImePackageName))
return null;
return SubtypeUtils.getInputMethodInfo(mLatinImePackageName);
}
private static InputMethodSubtypeCompatWrapper getLastResortSubtype(String mode) {
if (VOICE_MODE.equals(mode) && !FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES)
return null;
Locale inputLocale = SubtypeSwitcher.getInstance().getInputLocale();
if (inputLocale == null)
return null;
return new InputMethodSubtypeCompatWrapper(0, 0, inputLocale.toString(), mode, "");
}
public Map<InputMethodInfo, List<InputMethodSubtypeCompatWrapper>> public Map<InputMethodInfo, List<InputMethodSubtypeCompatWrapper>>
getShortcutInputMethodsAndSubtypes() { getShortcutInputMethodsAndSubtypes() {
Object retval = CompatUtils.invoke(mImm, null, METHOD_getShortcutInputMethodsAndSubtypes); Object retval = CompatUtils.invoke(mImm, null, METHOD_getShortcutInputMethodsAndSubtypes);
if (retval == null || !(retval instanceof Map<?, ?>) || ((Map<?, ?>)retval).isEmpty()) { if (retval == null || !(retval instanceof Map<?, ?>) || ((Map<?, ?>)retval).isEmpty()) {
if (!FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES) { // Returns an empty map
// Returns an empty map return Collections.emptyMap();
return Collections.emptyMap();
}
// Creates dummy subtypes
@SuppressWarnings("unused")
InputMethodInfo imi = getLatinImeInputMethodInfo();
InputMethodSubtypeCompatWrapper voiceSubtype = getLastResortSubtype(VOICE_MODE);
if (imi != null && voiceSubtype != null) {
Map<InputMethodInfo, List<InputMethodSubtypeCompatWrapper>>
shortcutMap =
new HashMap<InputMethodInfo,
List<InputMethodSubtypeCompatWrapper>>();
List<InputMethodSubtypeCompatWrapper> subtypeList =
new ArrayList<InputMethodSubtypeCompatWrapper>();
subtypeList.add(voiceSubtype);
shortcutMap.put(imi, subtypeList);
return shortcutMap;
} else {
return Collections.emptyMap();
}
} }
Map<InputMethodInfo, List<InputMethodSubtypeCompatWrapper>> shortcutMap = Map<InputMethodInfo, List<InputMethodSubtypeCompatWrapper>> shortcutMap =
new HashMap<InputMethodInfo, List<InputMethodSubtypeCompatWrapper>>(); new HashMap<InputMethodInfo, List<InputMethodSubtypeCompatWrapper>>();

View File

@ -27,15 +27,6 @@ import com.android.inputmethod.keyboard.KeyboardSwitcher;
import com.android.inputmethod.latin.SubtypeSwitcher; import com.android.inputmethod.latin.SubtypeSwitcher;
public class InputMethodServiceCompatWrapper extends InputMethodService { public class InputMethodServiceCompatWrapper extends InputMethodService {
// CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED needs to be false if the API level is 10
// or previous. Note that InputMethodSubtype was added in the API level 11.
// For the API level 11 or later, LatinIME should override onCurrentInputMethodSubtypeChanged().
// For the API level 10 or previous, we handle the "subtype changed" events by ourselves
// without having support from framework -- onCurrentInputMethodSubtypeChanged().
public static final boolean CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED = true;
private InputMethodManagerCompatWrapper mImm;
// For compatibility of {@link InputMethodManager#showInputMethodPicker}. // For compatibility of {@link InputMethodManager#showInputMethodPicker}.
// TODO: Move this variable back to LatinIME when this compatibility wrapper is removed. // TODO: Move this variable back to LatinIME when this compatibility wrapper is removed.
protected AlertDialog mOptionsDialog; protected AlertDialog mOptionsDialog;
@ -62,32 +53,6 @@ public class InputMethodServiceCompatWrapper extends InputMethodService {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
mImm = InputMethodManagerCompatWrapper.getInstance();
}
// When the API level is 10 or previous, notifyOnCurrentInputMethodSubtypeChanged should
// handle the event the current subtype was changed. LatinIME calls
// notifyOnCurrentInputMethodSubtypeChanged every time LatinIME
// changes the current subtype.
// This call is required to let LatinIME itself know a subtype changed
// event when the API level is 10 or previous.
@SuppressWarnings("unused")
public void notifyOnCurrentInputMethodSubtypeChanged(
InputMethodSubtypeCompatWrapper newSubtype) {
// Do nothing when the API level is 11 or later
// and FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES is not true
if (CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED && !InputMethodManagerCompatWrapper.
FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES) {
return;
}
final InputMethodSubtypeCompatWrapper subtype = (newSubtype == null)
? mImm.getCurrentInputMethodSubtype()
: newSubtype;
if (subtype != null) {
if (!InputMethodManagerCompatWrapper.FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES
&& !subtype.isDummy()) return;
SubtypeSwitcher.getInstance().updateSubtype(subtype);
}
} }
////////////////////////////////////// //////////////////////////////////////
@ -95,8 +60,6 @@ public class InputMethodServiceCompatWrapper extends InputMethodService {
////////////////////////////////////// //////////////////////////////////////
@Override @Override
public void onCurrentInputMethodSubtypeChanged(InputMethodSubtype subtype) { public void onCurrentInputMethodSubtypeChanged(InputMethodSubtype subtype) {
// Do nothing when the API level is 10 or previous
if (!CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED) return;
SubtypeSwitcher.getInstance().updateSubtype( SubtypeSwitcher.getInstance().updateSubtype(
new InputMethodSubtypeCompatWrapper(subtype)); new InputMethodSubtypeCompatWrapper(subtype));
} }

View File

@ -18,7 +18,6 @@ package com.android.inputmethod.latin;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog;
import android.app.Fragment; import android.app.Fragment;
import android.app.backup.BackupManager; import android.app.backup.BackupManager;
import android.content.Context; import android.content.Context;
@ -34,31 +33,20 @@ import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener; import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceGroup; import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.SeekBar; import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView; import android.widget.TextView;
import com.android.inputmethod.compat.CompatUtils;
import com.android.inputmethod.compat.InputMethodServiceCompatWrapper;
import com.android.inputmethod.latin.VibratorUtils;
import com.android.inputmethod.latin.define.ProductionFlag; import com.android.inputmethod.latin.define.ProductionFlag;
import com.android.inputmethodcommon.InputMethodSettingsActivity; import com.android.inputmethodcommon.InputMethodSettingsActivity;
import java.util.Locale;
public class Settings extends InputMethodSettingsActivity public class Settings extends InputMethodSettingsActivity
implements SharedPreferences.OnSharedPreferenceChangeListener, OnPreferenceClickListener { implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = Settings.class.getSimpleName();
public static final boolean ENABLE_EXPERIMENTAL_SETTINGS = false; public static final boolean ENABLE_EXPERIMENTAL_SETTINGS = false;
// In the same order as xml/prefs.xml // In the same order as xml/prefs.xml
public static final String PREF_GENERAL_SETTINGS = "general_settings"; public static final String PREF_GENERAL_SETTINGS = "general_settings";
public static final String PREF_SUBTYPES_SETTINGS = "subtype_settings";
public static final String PREF_AUTO_CAP = "auto_cap"; public static final String PREF_AUTO_CAP = "auto_cap";
public static final String PREF_VIBRATE_ON = "vibrate_on"; public static final String PREF_VIBRATE_ON = "vibrate_on";
public static final String PREF_SOUND_ON = "sound_on"; public static final String PREF_SOUND_ON = "sound_on";
@ -90,7 +78,6 @@ public class Settings extends InputMethodSettingsActivity
public static final String PREF_SELECTED_LANGUAGES = "selected_languages"; public static final String PREF_SELECTED_LANGUAGES = "selected_languages";
public static final String PREF_DEBUG_SETTINGS = "debug_settings"; public static final String PREF_DEBUG_SETTINGS = "debug_settings";
private PreferenceScreen mInputLanguageSelection;
private PreferenceScreen mKeypressVibrationDurationSettingsPref; private PreferenceScreen mKeypressVibrationDurationSettingsPref;
private PreferenceScreen mKeypressSoundVolumeSettingsPref; private PreferenceScreen mKeypressSoundVolumeSettingsPref;
private ListPreference mVoicePreference; private ListPreference mVoicePreference;
@ -102,14 +89,10 @@ public class Settings extends InputMethodSettingsActivity
// Prediction: use bigrams to predict the next word when there is no input for it yet // Prediction: use bigrams to predict the next word when there is no input for it yet
private CheckBoxPreference mBigramPrediction; private CheckBoxPreference mBigramPrediction;
private Preference mDebugSettingsPreference; private Preference mDebugSettingsPreference;
private boolean mVoiceOn;
private AlertDialog mDialog;
private TextView mKeypressVibrationDurationSettingsTextView; private TextView mKeypressVibrationDurationSettingsTextView;
private TextView mKeypressSoundVolumeSettingsTextView; private TextView mKeypressSoundVolumeSettingsTextView;
private String mVoiceModeOff;
private void ensureConsistencyOfAutoCorrectionSettings() { private void ensureConsistencyOfAutoCorrectionSettings() {
final String autoCorrectionOff = getResources().getString( final String autoCorrectionOff = getResources().getString(
R.string.auto_correction_threshold_mode_index_off); R.string.auto_correction_threshold_mode_index_off);
@ -140,18 +123,12 @@ public class Settings extends InputMethodSettingsActivity
final Context context = getActivityInternal(); final Context context = getActivityInternal();
addPreferencesFromResource(R.xml.prefs); addPreferencesFromResource(R.xml.prefs);
mInputLanguageSelection = (PreferenceScreen) findPreference(PREF_SUBTYPES_SETTINGS);
mInputLanguageSelection.setOnPreferenceClickListener(this);
mVoicePreference = (ListPreference) findPreference(PREF_VOICE_MODE); mVoicePreference = (ListPreference) findPreference(PREF_VOICE_MODE);
mShowCorrectionSuggestionsPreference = mShowCorrectionSuggestionsPreference =
(ListPreference) findPreference(PREF_SHOW_SUGGESTIONS_SETTING); (ListPreference) findPreference(PREF_SHOW_SUGGESTIONS_SETTING);
SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
prefs.registerOnSharedPreferenceChangeListener(this); prefs.registerOnSharedPreferenceChangeListener(this);
mVoiceModeOff = getString(R.string.voice_mode_off);
mVoiceOn = !(prefs.getString(PREF_VOICE_MODE, mVoiceModeOff)
.equals(mVoiceModeOff));
mAutoCorrectionThresholdPreference = mAutoCorrectionThresholdPreference =
(ListPreference) findPreference(PREF_AUTO_CORRECTION_THRESHOLD); (ListPreference) findPreference(PREF_AUTO_CORRECTION_THRESHOLD);
mBigramSuggestion = (CheckBoxPreference) findPreference(PREF_BIGRAM_SUGGESTION); mBigramSuggestion = (CheckBoxPreference) findPreference(PREF_BIGRAM_SUGGESTION);
@ -183,10 +160,6 @@ public class Settings extends InputMethodSettingsActivity
generalSettings.removePreference(findPreference(PREF_VIBRATE_ON)); generalSettings.removePreference(findPreference(PREF_VIBRATE_ON));
} }
if (InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED) {
generalSettings.removePreference(findPreference(PREF_SUBTYPES_SETTINGS));
}
final boolean showPopupOption = res.getBoolean( final boolean showPopupOption = res.getBoolean(
R.bool.config_enable_show_popup_on_keypress_option); R.bool.config_enable_show_popup_on_keypress_option);
if (!showPopupOption) { if (!showPopupOption) {
@ -318,25 +291,12 @@ public class Settings extends InputMethodSettingsActivity
!SettingsValues.isLanguageSwitchKeySupressed(prefs)); !SettingsValues.isLanguageSwitchKeySupressed(prefs));
} }
ensureConsistencyOfAutoCorrectionSettings(); ensureConsistencyOfAutoCorrectionSettings();
mVoiceOn = !(prefs.getString(PREF_VOICE_MODE, mVoiceModeOff)
.equals(mVoiceModeOff));
updateVoiceModeSummary(); updateVoiceModeSummary();
updateShowCorrectionSuggestionsSummary(); updateShowCorrectionSuggestionsSummary();
updateKeyPreviewPopupDelaySummary(); updateKeyPreviewPopupDelaySummary();
refreshEnablingsOfKeypressSoundAndVibrationSettings(prefs, getResources()); refreshEnablingsOfKeypressSoundAndVibrationSettings(prefs, getResources());
} }
@Override
public boolean onPreferenceClick(Preference pref) {
if (pref == mInputLanguageSelection) {
final String imeId = SubtypeUtils.getInputMethodId(
getActivityInternal().getApplicationInfo().packageName);
startActivity(CompatUtils.getInputLanguageSelectionIntent(imeId, 0));
return true;
}
return false;
}
private void updateShowCorrectionSuggestionsSummary() { private void updateShowCorrectionSuggestionsSummary() {
mShowCorrectionSuggestionsPreference.setSummary( mShowCorrectionSuggestionsPreference.setSummary(
getResources().getStringArray(R.array.prefs_suggestion_visibilities) getResources().getStringArray(R.array.prefs_suggestion_visibilities)

View File

@ -300,17 +300,6 @@ public class SubtypeSwitcher {
mImm.setInputMethodAndSubtype(token, imiId, subtype); mImm.setInputMethodAndSubtype(token, imiId, subtype);
return null; return null;
} }
@Override
protected void onPostExecute(Void result) {
// Calls in this method need to be done in the same thread as the thread which
// called switchToShortcutIME().
// Notify an event that the current subtype was changed. This event will be
// handled if "onCurrentInputMethodSubtypeChanged" can't be implemented
// when the API level is 10 or previous.
mService.notifyOnCurrentInputMethodSubtypeChanged(subtype);
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} }