Android-Keyboard: Use new show() / hide() methods for keyboard control

Starting with API level 30, Android introduced new
[0]WindowInsetsController.show(int) and [1]hide(int) methods for
controlling the keyboard visibility. This commit updates the code to use
these methods on devices running API 30 and above.

[0]https://developer.android.com/reference/android/view/WindowInsetsController#show(int)
[1]https://developer.android.com/reference/android/view/WindowInsetsController#hide(int)

Task-number: QTBUG-98984
Pick-to: 6.8
Change-Id: Icfcad3430cd269353572f66f72114238045f7756
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
(cherry picked from commit 3823d99a688813d2692eb0d4b99939a65bb6ee6a)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit 75e575e18f0fbfa8571d9044beea3cf3939881ab)
This commit is contained in:
Bartlomiej Moskal 2025-04-08 14:36:56 +02:00 committed by Qt Cherry-pick Bot
parent a72d1c424a
commit 2aae64c041

View File

@ -19,6 +19,8 @@ import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.WindowInsets;
import android.view.WindowInsets.Type;
import android.view.WindowInsetsAnimationController;
import android.view.WindowInsetsAnimationControlListener;
import android.view.WindowManager;
import android.view.ViewTreeObserver;
import android.view.inputmethod.InputMethodManager;
@ -127,25 +129,31 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt
}
}
@Override
public void showSoftwareKeyboard(Activity activity,
private void showKeyboard(Activity activity,
final int x, final int y, final int width, final int height,
final int inputHints, final int enterKeyType)
{
if (m_imm == null)
return;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
activity.getWindow().getInsetsController().controlWindowInsetsAnimation(
WindowInsets.Type.ime(), -1, null, null,
new WindowInsetsAnimationControlListener() {
@Override
public void onCancelled(WindowInsetsAnimationController controller) { }
QtNative.runAction(() -> {
if (m_imm == null || m_currentEditText == null)
return;
@Override
public void onReady(WindowInsetsAnimationController controller, int types) { }
if (updateSoftInputMode(activity, height))
return;
m_currentEditText.setEditTextOptions(enterKeyType, inputHints);
m_currentEditText.setLayoutParams(new QtLayout.LayoutParams(width, height, x, y));
m_currentEditText.requestFocus();
m_currentEditText.postDelayed(() -> {
@Override
public void onFinished(WindowInsetsAnimationController controller) {
QtNativeInputConnection.updateCursorPosition();
setKeyboardVisibility(true, System.nanoTime());
if (m_softInputMode == 0)
probeForKeyboardHeight(activity, x, y, width, height,
inputHints, enterKeyType);
}
});
activity.getWindow().getInsetsController().show(Type.ime());
} else {
if (m_imm == null)
return;
m_imm.showSoftInput(m_currentEditText, 0, new ResultReceiver(new Handler()) {
@ -170,6 +178,29 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt
}
}
});
}
}
@Override
public void showSoftwareKeyboard(Activity activity,
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;
if (updateSoftInputMode(activity, height))
return;
m_currentEditText.setEditTextOptions(enterKeyType, inputHints);
m_currentEditText.setLayoutParams(new QtLayout.LayoutParams(width, height, x, y));
m_currentEditText.requestFocus();
m_currentEditText.postDelayed(() -> {
showKeyboard(activity, x, y, width, height, inputHints, enterKeyType);
if (m_currentEditText.m_optionsChanged) {
m_imm.restartInput(m_currentEditText);
m_currentEditText.m_optionsChanged = false;
@ -228,6 +259,27 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt
if (m_imm == null || m_currentEditText == null)
return;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Activity activity = QtNative.activity();
if (activity == null) {
Log.w(TAG, "hideSoftwareKeyboard: The activity reference is null");
return;
}
activity.getWindow().getInsetsController().controlWindowInsetsAnimation(
WindowInsets.Type.ime(), -1, null, null,
new WindowInsetsAnimationControlListener() {
@Override
public void onCancelled(WindowInsetsAnimationController controller) { }
@Override
public void onReady(WindowInsetsAnimationController controller, int types) { }
@Override
public void onFinished(WindowInsetsAnimationController controller) {
setKeyboardVisibility(false, System.nanoTime());
}
});
activity.getWindow().getInsetsController().hide(Type.ime());
} else {
m_imm.hideSoftInputFromWindow(m_currentEditText.getWindowToken(), 0,
new ResultReceiver(new Handler()) {
@Override
@ -244,6 +296,7 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt
}
}
});
}
});
}
@ -271,7 +324,7 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt
boolean isKeyboardHidden = true;
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
Rect r = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
DisplayMetrics metrics = new DisplayMetrics();