Avoid unnecessary ULocale.addLikelySubtags()
This CL gets rid of unnecessary operations from
LocaleUtils.filterByLanguage() to speed it up, especially for the case
where there is an IME that has many subtypes.
ULocale.addLikelySubtags(ULocale) is known to be slow. Given an IME
that has N IME subtypes, LocaleUtils.filterByLanguage() calls it no
less than N times even when the only one system language is selected.
This has contributed to device boot time (Bug 32343335) time and user
switching time (Bug 28750507) since Android N where IME support
started taking multi-locale into account.
With this CL, LocaleUtils.filterByLanguage() no longer calls it
for a subtype unless its language part of the locale matches one of
user-selected system locales.
The only assumption we made here is
for any Locale objects l1 and l2
TextUtils.equals(l1.getLanguage(), l2.getLanguage())
and
TextUtils.equals(ul1.getLanguage(), ul2.getLanguage())
are equivalent, where
ul1 = ULocale.addLikelySubtags(ULocale.forLocale(l1)) and
ul2 = ULocale.addLikelySubtags(ULocale.forLocale(l2))
This should be reasonable assumption, at least for locales we want to
care about for IMEs. Under this assumption there is no behavior
change at all.
Test: bit FrameworksCoreTests:com.android.internal.inputmethod.LocaleUtilsTest
Bug: 37647204
Change-Id: Ic96900fcaf3db8b7046a50b3fe6ad65aceada369
1 file changed