Merge \"Quick workaround for a performance regression in IME APIs.\" into nyc-dev

am: 6fe4865e85

Change-Id: Id039d1dd681483c1d86349ee7e765b2f1f4fa95f
This commit is contained in:
Yohei Yukawa
2016-06-14 22:47:28 +00:00
committed by android-build-merger

View File

@@ -41,6 +41,7 @@ import android.view.inputmethod.InputMethodSubtype;
import android.view.textservice.SpellCheckerInfo;
import android.view.textservice.TextServicesManager;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import java.util.ArrayList;
@@ -83,6 +84,17 @@ public class InputMethodUtils {
Locale.UK, // "en_GB"
};
// A temporary workaround for the performance concerns in
// #getImplicitlyApplicableSubtypesLocked(Resources, InputMethodInfo).
// TODO: Optimize all the critical paths including this one.
private static final Object sCacheLock = new Object();
@GuardedBy("sCacheLock")
private static LocaleList sCachedSystemLocales;
@GuardedBy("sCacheLock")
private static InputMethodInfo sCachedInputMethodInfo;
@GuardedBy("sCacheLock")
private static ArrayList<InputMethodSubtype> sCachedResult;
private InputMethodUtils() {
// This utility class is not publicly instantiable.
}
@@ -498,6 +510,32 @@ public class InputMethodUtils {
@VisibleForTesting
public static ArrayList<InputMethodSubtype> getImplicitlyApplicableSubtypesLocked(
Resources res, InputMethodInfo imi) {
final LocaleList systemLocales = res.getConfiguration().getLocales();
synchronized (sCacheLock) {
// We intentionally do not use InputMethodInfo#equals(InputMethodInfo) here because
// it does not check if subtypes are also identical.
if (systemLocales.equals(sCachedSystemLocales) && sCachedInputMethodInfo == imi) {
return new ArrayList<>(sCachedResult);
}
}
// Note: Only resource info in "res" is used in getImplicitlyApplicableSubtypesLockedImpl().
// TODO: Refactor getImplicitlyApplicableSubtypesLockedImpl() so that it can receive
// LocaleList rather than Resource.
final ArrayList<InputMethodSubtype> result =
getImplicitlyApplicableSubtypesLockedImpl(res, imi);
synchronized (sCacheLock) {
// Both LocaleList and InputMethodInfo are immutable. No need to copy them here.
sCachedSystemLocales = systemLocales;
sCachedInputMethodInfo = imi;
sCachedResult = new ArrayList<>(result);
}
return result;
}
private static ArrayList<InputMethodSubtype> getImplicitlyApplicableSubtypesLockedImpl(
Resources res, InputMethodInfo imi) {
final List<InputMethodSubtype> subtypes = InputMethodUtils.getSubtypes(imi);
final LocaleList systemLocales = res.getConfiguration().getLocales();
final String systemLocale = systemLocales.get(0).toString();