Do not return stale subtypes

Bug: 6294329
Change-Id: I3f0713f94c291298dfd447d1b65bd7c6d2858492
This commit is contained in:
satok
2012-05-08 16:52:08 +09:00
parent 05f5236f60
commit fdf419e81d

View File

@ -2619,7 +2619,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return getSubtypeIdFromHashCode(imi, subtypeId);
}
private int getSubtypeIdFromHashCode(InputMethodInfo imi, int subtypeHashCode) {
private static boolean isValidSubtypeId(InputMethodInfo imi, int subtypeHashCode) {
return getSubtypeIdFromHashCode(imi, subtypeHashCode) != NOT_A_SUBTYPE_ID;
}
private static int getSubtypeIdFromHashCode(InputMethodInfo imi, int subtypeHashCode) {
if (imi != null) {
final int subtypeCount = imi.getSubtypeCount();
for (int i = 0; i < subtypeCount; ++i) {
@ -2844,6 +2848,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
*/
@Override
public InputMethodSubtype getCurrentInputMethodSubtype() {
if (mCurMethodId == null) {
return null;
}
boolean subtypeIsSelected = false;
try {
subtypeIsSelected = Settings.Secure.getInt(mContext.getContentResolver(),
@ -2851,36 +2858,35 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
} catch (SettingNotFoundException e) {
}
synchronized (mMethodMap) {
if (!subtypeIsSelected || mCurrentSubtype == null) {
String lastInputMethodId = Settings.Secure.getString(
mContext.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
int subtypeId = getSelectedInputMethodSubtypeId(lastInputMethodId);
final InputMethodInfo imi = mMethodMap.get(mCurMethodId);
if (imi == null || imi.getSubtypeCount() == 0) {
return null;
}
if (!subtypeIsSelected || mCurrentSubtype == null
|| !isValidSubtypeId(imi, mCurrentSubtype.hashCode())) {
int subtypeId = getSelectedInputMethodSubtypeId(mCurMethodId);
if (subtypeId == NOT_A_SUBTYPE_ID) {
InputMethodInfo imi = mMethodMap.get(lastInputMethodId);
if (imi != null) {
// If there are no selected subtypes, the framework will try to find
// the most applicable subtype from explicitly or implicitly enabled
// subtypes.
List<InputMethodSubtype> explicitlyOrImplicitlyEnabledSubtypes =
getEnabledInputMethodSubtypeList(imi, true);
// If there is only one explicitly or implicitly enabled subtype,
// just returns it.
if (explicitlyOrImplicitlyEnabledSubtypes.size() == 1) {
mCurrentSubtype = explicitlyOrImplicitlyEnabledSubtypes.get(0);
} else if (explicitlyOrImplicitlyEnabledSubtypes.size() > 1) {
// If there are no selected subtypes, the framework will try to find
// the most applicable subtype from explicitly or implicitly enabled
// subtypes.
List<InputMethodSubtype> explicitlyOrImplicitlyEnabledSubtypes =
getEnabledInputMethodSubtypeList(imi, true);
// If there is only one explicitly or implicitly enabled subtype,
// just returns it.
if (explicitlyOrImplicitlyEnabledSubtypes.size() == 1) {
mCurrentSubtype = explicitlyOrImplicitlyEnabledSubtypes.get(0);
} else if (explicitlyOrImplicitlyEnabledSubtypes.size() > 1) {
mCurrentSubtype = findLastResortApplicableSubtypeLocked(
mRes, explicitlyOrImplicitlyEnabledSubtypes,
SUBTYPE_MODE_KEYBOARD, null, true);
if (mCurrentSubtype == null) {
mCurrentSubtype = findLastResortApplicableSubtypeLocked(
mRes, explicitlyOrImplicitlyEnabledSubtypes,
SUBTYPE_MODE_KEYBOARD, null, true);
if (mCurrentSubtype == null) {
mCurrentSubtype = findLastResortApplicableSubtypeLocked(
mRes, explicitlyOrImplicitlyEnabledSubtypes, null, null,
true);
}
mRes, explicitlyOrImplicitlyEnabledSubtypes, null, null,
true);
}
}
} else {
mCurrentSubtype =
getSubtypes(mMethodMap.get(lastInputMethodId)).get(subtypeId);
mCurrentSubtype = getSubtypes(imi).get(subtypeId);
}
}
return mCurrentSubtype;
@ -2979,7 +2985,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
final int N = imList.size();
final int currentSubtypeId = subtype != null
? mImms.getSubtypeIdFromHashCode(imi, subtype.hashCode())
? getSubtypeIdFromHashCode(imi, subtype.hashCode())
: NOT_A_SUBTYPE_ID;
for (int i = 0; i < N; ++i) {
final ImeSubtypeListItem isli = imList.get(i);
@ -3356,10 +3362,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
for (Pair<String, ArrayList<String>> enabledIme: enabledImes) {
if (enabledIme.first.equals(imeId)) {
final ArrayList<String> explicitlyEnabledSubtypes = enabledIme.second;
final InputMethodInfo imi = mMethodMap.get(imeId);
if (explicitlyEnabledSubtypes.size() == 0) {
// If there are no explicitly enabled subtypes, applicable subtypes are
// enabled implicitly.
InputMethodInfo imi = mMethodMap.get(imeId);
// If IME is enabled and no subtypes are enabled, applicable subtypes
// are enabled implicitly, so needs to treat them to be enabled.
if (imi != null && imi.getSubtypeCount() > 0) {
@ -3379,7 +3385,17 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
for (String s: explicitlyEnabledSubtypes) {
if (s.equals(subtypeHashCode)) {
// If both imeId and subtypeId are enabled, return subtypeId.
return s;
try {
final int hashCode = Integer.valueOf(subtypeHashCode);
// Check whether the subtype id is valid or not
if (isValidSubtypeId(imi, hashCode)) {
return s;
} else {
return NOT_A_SUBTYPE_ID_STR;
}
} catch (NumberFormatException e) {
return NOT_A_SUBTYPE_ID_STR;
}
}
}
}