Minimize invocations of queryIntentServices() in IMMS

This CL reworks how updates on user locking state and additional
subtypes are reflected into the InputMethodSettingsRepository.

Previously we have called

  InputMethodManagerService#queryInputMethodServicesInternal()

in a relatively ad-hoc manner, meaning that we have called it whenever
we need a new InputMethodMap that is different from the one stored in
InputMethodSettingsRepository.

With this CL

  UserData#mRawInputMethodMap

keeps track of the raw results of Context#queryIntentServices() for
both direct-boot aware IMEs and direct-boot unaware IMEs in a form
that additional subtypes are not yet taken into account. The cache
allows us to reconstruct the required InputMethodMap on the fly
without calling Context#queryIntentServices() again. This is a huge
win in terms of both performance and code simplicity.

For instance, the following IME APIs no longer need to rely on
Context#queryIntentServices() internally, which means that these APIs
will return much sooner than before, and more importantly without
depending on ActivityManagerService global lock.

 * InputMethodManager#setAdditionalInputMethodSubtypes()
 * InputMethodManager#getInputMethodListAsUser()
           with DirectBootAwareness.ANY

Overall there should be no observable behavior change, and wxisting
end-to-end CTS tests should verify such expectations.

Fix: 354256119
Test: atest CtsInputMethodTestCases
Test: atest CtsInputMethodInstallTestCases
Test: atest FrameworksInputMethodSystemServerTest
Flag: EXEMPT refactor
Change-Id: I4cb07b0c776143b2f477ef8bb383ad4e0ed0b204
5 files changed