From 07807794f762d283943ce7b86065e4f8112470ae Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Fri, 8 Nov 2024 15:50:29 +0200 Subject: [PATCH] Android: fix potential null InputMethodManager object access MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ensure we don't end up calling methods from a null m_imm object inside runAction(), the code was guarded outside the call but not inside where it can still happen. Fixes: QTBUG-129684 Change-Id: I41d7e64a028f551bb53d177e16a77e7ae512a84e Reviewed-by: Tinja Paavoseppä (cherry picked from commit 33ef9330f67dd3c6603fb222e1556c31591f1fd9) Reviewed-by: Qt Cherry-pick Bot --- .../qtproject/qt/android/QtInputDelegate.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java index 1fb25b5fe98..669ad0907e2 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java @@ -80,6 +80,8 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt void initInputMethodManager(Activity activity) { m_imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); + if (m_imm == null) + Log.w(TAG, "getSystemService() returned a null InputMethodManager instance"); } // QtInputInterface implementation begin @@ -87,12 +89,14 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt public void updateSelection(final int selStart, final int selEnd, final int candidatesStart, final int candidatesEnd) { - QtNative.runAction(() -> { - if (m_imm != null) { - m_imm.updateSelection(m_currentEditText, selStart, selEnd, - candidatesStart, candidatesEnd); - } - }); + if (m_imm != null) { + QtNative.runAction(() -> { + if (m_imm != null) { + m_imm.updateSelection(m_currentEditText, selStart, selEnd, + candidatesStart, candidatesEnd); + } + }); + } } @Override @@ -100,6 +104,9 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt final int x, final int y, final int width, final int height, final int inputHints, final int enterKeyType) { + if (m_imm == null) + return; + QtNative.runAction(() -> { if (m_imm == null || m_currentEditText == null) return; @@ -174,6 +181,8 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt if (m_imm == null || m_currentEditText == null) return; m_currentEditText.postDelayed(() -> { + if (m_imm == null || m_currentEditText == null) + return; m_imm.restartInput(m_currentEditText); m_currentEditText.m_optionsChanged = false; }, 5); @@ -182,6 +191,9 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt @Override public void hideSoftwareKeyboard() { + if (m_imm == null || m_currentEditText == null) + return; + m_isKeyboardHidingAnimationOngoing = true; QtNative.runAction(() -> { if (m_imm == null || m_currentEditText == null)