From 152eacec4f5e1c78eafd42abbcf62fc12b0eee33 Mon Sep 17 00:00:00 2001 From: Ming-Shin Lu Date: Mon, 28 Sep 2020 01:35:31 +0800 Subject: Let IME#onFinishInput called without dup onStartInput when screen-off Also called IME#onStartInput without dup onFinishInput when screen-on, to fix the long-standing IME input connection lifecycle issue when device screen state changes. Bug: 156215187 Bug: 26851566 Test: atest InputMethodStartInputLifecycleTest Test: manual as below steps 0) Enable InputMethodService debug flag. 0-1) In Settings -> Develop options -> AppCompatibility Changes, Select Gboard and then toggle "FINISH_INPUT_NO_FALLBACK_CONNECTION" change. 1) Launch a app with focused a editor and show soft-input 2) When device screen turned-off, will see InputMethodService only callbacks below logs: CALL: doFinishInput CALL: onFinishInputView CALL: onFinishInput 3) When device screen turned-on, will see InputMethodService only callbacks below logs: CALL: onStartInput CALL: onStartInputView Change-Id: I8a657e75e274d842fb46b60375f6aeafeab96a59 --- .../android/inputmethodservice/IInputMethodSessionWrapper.java | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'core/java/android/inputmethodservice/IInputMethodSessionWrapper.java') diff --git a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java index e9de27456f97..0766917642e8 100644 --- a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java +++ b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java @@ -54,6 +54,8 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub private static final int DO_VIEW_CLICKED = 115; private static final int DO_NOTIFY_IME_HIDDEN = 120; private static final int DO_REMOVE_IME_SURFACE = 130; + private static final int DO_FINISH_INPUT = 140; + @UnsupportedAppUsage HandlerCaller mCaller; @@ -141,6 +143,10 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub mInputMethodSession.removeImeSurface(); return; } + case DO_FINISH_INPUT: { + mInputMethodSession.finishInput(); + return; + } } Log.w(TAG, "Unhandled message code: " + msg.what); } @@ -222,6 +228,10 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_SESSION)); } + @Override + public void finishInput() { + mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_INPUT)); + } private final class ImeInputEventReceiver extends InputEventReceiver implements InputMethodSession.EventCallback { private final SparseArray mPendingEvents = new SparseArray(); -- cgit v1.2.3 From 3d62f739a869c97a265506ac1e1ab58f93fa3b34 Mon Sep 17 00:00:00 2001 From: Jeff DeCew Date: Thu, 3 Dec 2020 19:13:34 +0000 Subject: Revert "Let IME#onFinishInput called without dup onStartInput wh..." Revert "Verify lifecycle test when screen on/off" Revert submission 12716106-ims_screenstate_lifecycle Reason for revert: b/174512702 Reverted Changes: Iba0332ed3:Verify lifecycle test when screen on/off I8a657e75e:Let IME#onFinishInput called without dup onStartIn... Change-Id: I16f4a34360a2f64b69978724648a9be741f140b5 --- .../android/inputmethodservice/IInputMethodSessionWrapper.java | 10 ---------- 1 file changed, 10 deletions(-) (limited to 'core/java/android/inputmethodservice/IInputMethodSessionWrapper.java') diff --git a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java index 0766917642e8..e9de27456f97 100644 --- a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java +++ b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java @@ -54,8 +54,6 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub private static final int DO_VIEW_CLICKED = 115; private static final int DO_NOTIFY_IME_HIDDEN = 120; private static final int DO_REMOVE_IME_SURFACE = 130; - private static final int DO_FINISH_INPUT = 140; - @UnsupportedAppUsage HandlerCaller mCaller; @@ -143,10 +141,6 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub mInputMethodSession.removeImeSurface(); return; } - case DO_FINISH_INPUT: { - mInputMethodSession.finishInput(); - return; - } } Log.w(TAG, "Unhandled message code: " + msg.what); } @@ -228,10 +222,6 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_SESSION)); } - @Override - public void finishInput() { - mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_INPUT)); - } private final class ImeInputEventReceiver extends InputEventReceiver implements InputMethodSession.EventCallback { private final SparseArray mPendingEvents = new SparseArray(); -- cgit v1.2.3 From 4ba8484ffbef4fac301ea70210549692e9684e0d Mon Sep 17 00:00:00 2001 From: Ming-Shin Lu Date: Fri, 4 Dec 2020 03:21:12 +0000 Subject: Revert "Revert "Let IME#onFinishInput called without dup onStart..." Revert^2 "Verify lifecycle test when screen on/off" c2769e41ea17d7f0d261396d28ddde3563422701 Reason: Fix forward Bug 174512702 and Bug 174445559 with CL[1]. CL[1]: Icf1504d40b25fc5f53eae65d4bab48a3070db1d6 Change-Id: Id4e71a822bfde5fe6a263bbe094c0d238017efe1 --- .../android/inputmethodservice/IInputMethodSessionWrapper.java | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'core/java/android/inputmethodservice/IInputMethodSessionWrapper.java') diff --git a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java index e9de27456f97..0766917642e8 100644 --- a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java +++ b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java @@ -54,6 +54,8 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub private static final int DO_VIEW_CLICKED = 115; private static final int DO_NOTIFY_IME_HIDDEN = 120; private static final int DO_REMOVE_IME_SURFACE = 130; + private static final int DO_FINISH_INPUT = 140; + @UnsupportedAppUsage HandlerCaller mCaller; @@ -141,6 +143,10 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub mInputMethodSession.removeImeSurface(); return; } + case DO_FINISH_INPUT: { + mInputMethodSession.finishInput(); + return; + } } Log.w(TAG, "Unhandled message code: " + msg.what); } @@ -222,6 +228,10 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_SESSION)); } + @Override + public void finishInput() { + mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_INPUT)); + } private final class ImeInputEventReceiver extends InputEventReceiver implements InputMethodSession.EventCallback { private final SparseArray mPendingEvents = new SparseArray(); -- cgit v1.2.3 From 2c8068c98a96a5439d1fdd537eee1f1729f7fab4 Mon Sep 17 00:00:00 2001 From: Ming-Shin Lu Date: Sat, 10 Apr 2021 00:17:35 +0800 Subject: Consolidate InputMethodManager#toggleSoftInput reliability As previously InputMethodManager#toggleSoftInput is designed to tell InputMethodService directly through IInputMethodSession to toggle soft-keyboard visibility, this could be happened some unexpected IME visibility issues that when the app calling this method in the wrong state like the app toggling IME visibility when the app is off-screen but unexpectedly it ends up showing soft-keyboard when the IME is in invisible state. To minimize the app compatibility without changing the public API surface and reducing unexpected IME visibilty been toggled behavior especially happens when switching the apps, changed the internal IPC protocols to call IMMS#showSoftInput or IMMS#hideSoftInput directly according the previous IME consumer requested visibility state, so that in IMMS side can validate to see if the token user is still focused and ready to toggle the IME visibility to show or hide. As the result, we deprecated toggleSoftInput and toggleSoftInputFromWindow to state the reason as the above, and recommand to use showSoftInput or hideSoftInputFromWindow instead, so that framework side no longer has to call {InputMethodSessionWrapper, InputMethodSessionImpl}#toggleSoftInput. Bug: 182071625 Test: m checkapi doc-comment-check-docs Test: atest KeyboardVisibilityControlTest#testToggleSoftInput Change-Id: I390dc029e7bcc30c200926a9bfbbbd0268a1f714 --- .../inputmethodservice/IInputMethodSessionWrapper.java | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'core/java/android/inputmethodservice/IInputMethodSessionWrapper.java') diff --git a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java index 0766917642e8..5a517ee0b0eb 100644 --- a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java +++ b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java @@ -49,7 +49,6 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub private static final int DO_UPDATE_CURSOR = 95; private static final int DO_UPDATE_CURSOR_ANCHOR_INFO = 99; private static final int DO_APP_PRIVATE_COMMAND = 100; - private static final int DO_TOGGLE_SOFT_INPUT = 105; private static final int DO_FINISH_SESSION = 110; private static final int DO_VIEW_CLICKED = 115; private static final int DO_NOTIFY_IME_HIDDEN = 120; @@ -123,10 +122,6 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub args.recycle(); return; } - case DO_TOGGLE_SOFT_INPUT: { - mInputMethodSession.toggleSoftInput(msg.arg1, msg.arg2); - return; - } case DO_FINISH_SESSION: { doFinishSession(); return; @@ -217,12 +212,6 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub mCaller.obtainMessageOO(DO_APP_PRIVATE_COMMAND, action, data)); } - @Override - public void toggleSoftInput(int showFlags, int hideFlags) { - mCaller.executeOrSendMessage( - mCaller.obtainMessageII(DO_TOGGLE_SOFT_INPUT, showFlags, hideFlags)); - } - @Override public void finishSession() { mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_SESSION)); -- cgit v1.2.3