diff options
| author | Tarandeep Singh <tarandeep@google.com> | 2018-11-09 18:15:57 +0100 |
|---|---|---|
| committer | Jorim Jaggi <jjaggi@google.com> | 2019-01-25 00:47:21 +0100 |
| commit | eadb1392f85f1ac8801018a02c31427801959b1c (patch) | |
| tree | f4685b80826de22e68be848853c8db67e46d2489 /core/java/android/inputmethodservice/IInputMethodWrapper.java | |
| parent | 75df50dc83f5ffb0b00cdf16f86556ce462df129 (diff) | |
Pre-render input method (IME transitions 1/n)
Pre-render input method views and window when EditText receives focus.
This is a pre-requisite for implementing better IME transitions.
Strategy:
Once EditText receives focus, startInput is called. If optimization is
available, IME views and window (SoftInputWindow) are created and
rendered. Until user taps on EditText or showSoftInput() is called, IME
window remains invisible. This pre-rendered window is kept around until
EditorInfo changes or new connection is started (onStartInput).
IME window's visibility will be set using new Insets controller API
rather than conventional client-side dialog.show().
Behavior:
- This is just IME side preparation CL. No performance improvements yet.
- There should be no user perceptible behavior change.
- As long as IME developers were following official lifecycle, they
shouldn't perceive any behavior change.
Availability:
This optimization, once fully implemented, will be available when:
- Device is not "Low memory"
- AND Master flag DebugFlags.FLAG_PRE_RENDER_IME_VIEWS is set.
- ViewRootImpl.USE_NEW_INSETS_API is enabled
Bug: 118599175
Bug: 111084606
Test: atest CtsInputMethodTestCases
Test: atest CtsInputMethodServiceHostTestCases
Test: atest ActivityManagerMultiDisplayTests
Test: Tested with 4 IMEs and didn't preceive any behavior change.
Scenarios tested:
1. With and without hardware keyboard
2. Screen rotation w/ fullscreen mode.
3. split-screen
Change-Id: I1a6300fe167eb205ee2b4214a6e270a52ebae062
Diffstat (limited to 'core/java/android/inputmethodservice/IInputMethodWrapper.java')
| -rw-r--r-- | core/java/android/inputmethodservice/IInputMethodWrapper.java | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/core/java/android/inputmethodservice/IInputMethodWrapper.java b/core/java/android/inputmethodservice/IInputMethodWrapper.java index 103069474445..37b25c8fec0c 100644 --- a/core/java/android/inputmethodservice/IInputMethodWrapper.java +++ b/core/java/android/inputmethodservice/IInputMethodWrapper.java @@ -179,19 +179,24 @@ class IInputMethodWrapper extends IInputMethod.Stub return; case DO_START_INPUT: { final SomeArgs args = (SomeArgs) msg.obj; - final int missingMethods = msg.arg1; - final boolean restarting = msg.arg2 != 0; final IBinder startInputToken = (IBinder) args.arg1; final IInputContext inputContext = (IInputContext) args.arg2; final EditorInfo info = (EditorInfo) args.arg3; final AtomicBoolean isUnbindIssued = (AtomicBoolean) args.arg4; + SomeArgs moreArgs = (SomeArgs) args.arg5; final InputConnection ic = inputContext != null ? new InputConnectionWrapper( - mTarget, inputContext, missingMethods, isUnbindIssued) : null; + mTarget, inputContext, moreArgs.argi3, isUnbindIssued) + : null; info.makeCompatible(mTargetSdkVersion); - inputMethod.dispatchStartInputWithToken(ic, info, restarting /* restarting */, - startInputToken); + inputMethod.dispatchStartInputWithToken( + ic, + info, + moreArgs.argi1 == 1 /* restarting */, + startInputToken, + moreArgs.argi2 == 1 /* shouldPreRenderIme */); args.recycle(); + moreArgs.recycle(); return; } case DO_CREATE_SESSION: { @@ -291,14 +296,17 @@ class IInputMethodWrapper extends IInputMethod.Stub @Override public void startInput(IBinder startInputToken, IInputContext inputContext, @InputConnectionInspector.MissingMethodFlags final int missingMethods, - EditorInfo attribute, boolean restarting) { + EditorInfo attribute, boolean restarting, boolean shouldPreRenderIme) { if (mIsUnbindIssued == null) { Log.e(TAG, "startInput must be called after bindInput."); mIsUnbindIssued = new AtomicBoolean(); } - mCaller.executeOrSendMessage(mCaller.obtainMessageIIOOOO(DO_START_INPUT, - missingMethods, restarting ? 1 : 0, startInputToken, inputContext, attribute, - mIsUnbindIssued)); + SomeArgs args = SomeArgs.obtain(); + args.argi1 = restarting ? 1 : 0; + args.argi2 = shouldPreRenderIme ? 1 : 0; + args.argi3 = missingMethods; + mCaller.executeOrSendMessage(mCaller.obtainMessageOOOOO( + DO_START_INPUT, startInputToken, inputContext, attribute, mIsUnbindIssued, args)); } @BinderThread |
