diff options
author | Bartlomiej Moskal <[email protected]> | 2024-09-18 09:00:17 +0200 |
---|---|---|
committer | Bartlomiej Moskal <[email protected]> | 2024-10-02 11:24:31 +0000 |
commit | dbd5af6231c9182ef370eca2e06c485591d715b9 (patch) | |
tree | 83e3e011f20bd6670fee3ff8f6f0da38880c9e99 /src/plugins/platforms/android/qandroidinputcontext.cpp | |
parent | 44149f9d8b62b5343a5d06628b0c9588f035ccc2 (diff) |
Android: Override new methods in InputConnection
InputConnection interface got new method like [0]replaceText and some
overloaded (setComposingText, setComposingRegion and commitText) that
need to be override by QtInputConnection
[0]https://developer.android.com/reference/android/view/inputmethod/InputConnection#replaceText(int,%20int,%20java.lang.CharSequence,%20int,%20android.view.inputmethod.TextAttribute)
Task-number: QTBUG-120238
Pick-to: 6.8 6.7
Change-Id: I72a35ff6bf8cdc10d782b24efb6c99b92b33926d
Reviewed-by: Assam Boudjelthia <[email protected]>
Diffstat (limited to 'src/plugins/platforms/android/qandroidinputcontext.cpp')
-rw-r--r-- | src/plugins/platforms/android/qandroidinputcontext.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp index 62212ff63d7..24742160bf9 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.cpp +++ b/src/plugins/platforms/android/qandroidinputcontext.cpp @@ -137,6 +137,23 @@ static jboolean finishComposingText(JNIEnv */*env*/, jobject /*thiz*/) return res; } +static jboolean replaceText(JNIEnv *env, jobject /*thiz*/, jint start, jint end, jstring text, jint newCursorPosition) +{ + if (!m_androidInputContext) + return JNI_FALSE; + + jboolean isCopy; + const jchar *jstr = env->GetStringChars(text, &isCopy); + QString str(reinterpret_cast<const QChar *>(jstr), env->GetStringLength(text)); + env->ReleaseStringChars(text, jstr); + + qCDebug(lcQpaInputMethods) << "@@@ REPLACE" << start << end << str << newCursorPosition; + jboolean res = JNI_FALSE; + runOnQtThread([&]{res = m_androidInputContext->replaceText(start, end, str, newCursorPosition);}); + + return res; +} + static jint getCursorCapsMode(JNIEnv */*env*/, jobject /*thiz*/, jint reqModes) { if (!m_androidInputContext) @@ -336,6 +353,7 @@ static JNINativeMethod methods[] = { {"getSelectedText", "(I)Ljava/lang/String;", (void *)getSelectedText}, {"getTextAfterCursor", "(II)Ljava/lang/String;", (void *)getTextAfterCursor}, {"getTextBeforeCursor", "(II)Ljava/lang/String;", (void *)getTextBeforeCursor}, + {"replaceText", "(IILjava/lang/String;I)Z", (void *)replaceText}, {"setComposingText", "(Ljava/lang/String;I)Z", (void *)setComposingText}, {"setComposingRegion", "(II)Z", (void *)setComposingRegion}, {"setSelection", "(II)Z", (void *)setSelection}, @@ -1123,6 +1141,21 @@ jboolean QAndroidInputContext::finishComposingText() return JNI_TRUE; } +/* + Android docs say: This behaves like calling finishComposingText(), setSelection(start, end) + and then commitText(text, newCursorPosition, textAttribute) + https://developer.android.com/reference/android/view/inputmethod/InputConnection#replaceText(int,%20int,%20java.lang.CharSequence,%20int,%20android.view.inputmethod.TextAttribute) +*/ +jboolean QAndroidInputContext::replaceText(jint start, jint end, const QString text, jint newCursorPosition) +{ + if (!finishComposingText()) + return JNI_FALSE; + if (!setSelection(start, end)) + return JNI_FALSE; + + return commitText(text, newCursorPosition); +} + void QAndroidInputContext::reportFullscreenMode(jboolean enabled) { m_fullScreenMode = enabled; |