From fc410c13980378223fa501b60cc47d08d5b3d8f5 Mon Sep 17 00:00:00 2001 From: Kai Uwe Broulik Date: Tue, 2 Jun 2015 09:21:14 +0200 Subject: Android: Add support for EnterKey QAndroidInputContext now sends along the EnterKey type provided by the EnterKey input method query enabling the QtActivityDelegate to set the imeOptions for the TextView accordingly. Change-Id: Ic96077ab4b11cf6dec52283ecf66b2cabe7af665 Reviewed-by: BogDan Vatra --- .../qtproject/qt5/android/QtActivityDelegate.java | 42 ++++++++++++++++++++-- .../src/org/qtproject/qt5/android/QtNative.java | 5 +-- src/plugins/platforms/android/androidjniinput.cpp | 10 +++--- src/plugins/platforms/android/androidjniinput.h | 2 +- .../platforms/android/qandroidinputcontext.cpp | 4 ++- 5 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java index ba3ecfecd6..ee196f1aef 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -203,6 +203,16 @@ public class QtActivityDelegate private final int ImhUrlCharactersOnly = 0x400000; private final int ImhLatinOnly = 0x800000; + // enter key type - must be kept in sync with QTDIR/src/corelib/global/qnamespace.h + private final int EnterKeyDefault = 0; + private final int EnterKeyReturn = 1; + private final int EnterKeyDone = 2; + private final int EnterKeyGo = 3; + private final int EnterKeySend = 4; + private final int EnterKeySearch = 5; + private final int EnterKeyNext = 6; + private final int EnterKeyPrevious = 7; + // application state private final int ApplicationSuspended = 0x0; private final int ApplicationHidden = 0x1; @@ -239,7 +249,7 @@ public class QtActivityDelegate }, 5); } - public void showSoftwareKeyboard(int x, int y, int width, int height, int inputHints) + public void showSoftwareKeyboard(int x, int y, int width, int height, int inputHints, int enterKeyType) { if (m_imm == null) return; @@ -252,7 +262,31 @@ public class QtActivityDelegate m_activity.getWindow().setSoftInputMode(m_softInputMode); int initialCapsMode = 0; + int imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_DONE; + + switch (enterKeyType) { + case EnterKeyReturn: + imeOptions = android.view.inputmethod.EditorInfo.IME_FLAG_NO_ENTER_ACTION; + break; + case EnterKeyGo: + imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_GO; + break; + case EnterKeySend: + imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_SEND; + break; + case EnterKeySearch: + imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_SEARCH; + break; + case EnterKeyNext: + imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_NEXT; + break; + case EnterKeyPrevious: + if (Build.VERSION.SDK_INT > 10) + imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_PREVIOUS; + break; + } + int inputType = android.text.InputType.TYPE_CLASS_TEXT; if ((inputHints & (ImhPreferNumbers | ImhDigitsOnly | ImhFormattedNumbersOnly)) != 0) { @@ -278,7 +312,9 @@ public class QtActivityDelegate if ((inputHints & (ImhEmailCharactersOnly | ImhUrlCharactersOnly)) != 0) { if ((inputHints & ImhUrlCharactersOnly) != 0) { inputType |= android.text.InputType.TYPE_TEXT_VARIATION_URI; - imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_GO; + + if (enterKeyType == 0) // not explicitly overridden + imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_GO; } else if ((inputHints & ImhEmailCharactersOnly) != 0) { inputType |= android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS; } @@ -305,7 +341,7 @@ public class QtActivityDelegate } } - if ((inputHints & ImhMultiLine) != 0) + if (enterKeyType == 0 && (inputHints & ImhMultiLine) != 0) imeOptions = android.view.inputmethod.EditorInfo.IME_FLAG_NO_ENTER_ACTION; m_editText.setInitialCapsMode(initialCapsMode); diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index 5d7918ea54..a1e7dac4d4 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -389,12 +389,13 @@ public class QtNative final int y, final int width, final int height, - final int inputHints ) + final int inputHints, + final int enterKeyType) { runAction(new Runnable() { @Override public void run() { - m_activityDelegate.showSoftwareKeyboard(x, y, width, height, inputHints); + m_activityDelegate.showSoftwareKeyboard(x, y, width, height, inputHints, enterKeyType); } }); } diff --git a/src/plugins/platforms/android/androidjniinput.cpp b/src/plugins/platforms/android/androidjniinput.cpp index be5e969d2b..b410e5f68e 100644 --- a/src/plugins/platforms/android/androidjniinput.cpp +++ b/src/plugins/platforms/android/androidjniinput.cpp @@ -70,18 +70,20 @@ namespace QtAndroidInput candidatesEnd); } - void showSoftwareKeyboard(int left, int top, int width, int height, int inputHints) + void showSoftwareKeyboard(int left, int top, int width, int height, int inputHints, int enterKeyType) { QJNIObjectPrivate::callStaticMethod(applicationClass(), "showSoftwareKeyboard", - "(IIIII)V", + "(IIIIII)V", left, top, width, height, - inputHints); + inputHints, + enterKeyType + ); #ifdef QT_DEBUG_ANDROID_IM_PROTOCOL - qDebug() << "@@@ SHOWSOFTWAREKEYBOARD" << left << top << width << height << inputHints; + qDebug() << "@@@ SHOWSOFTWAREKEYBOARD" << left << top << width << height << inputHints << enterKeyType; #endif } diff --git a/src/plugins/platforms/android/androidjniinput.h b/src/plugins/platforms/android/androidjniinput.h index b5a2ef06e4..d737dc9c98 100644 --- a/src/plugins/platforms/android/androidjniinput.h +++ b/src/plugins/platforms/android/androidjniinput.h @@ -41,7 +41,7 @@ QT_BEGIN_NAMESPACE namespace QtAndroidInput { // Software keyboard support - void showSoftwareKeyboard(int top, int left, int width, int height, int inputHints); + void showSoftwareKeyboard(int top, int left, int width, int height, int inputHints, int enterKeyType); void resetSoftwareKeyboard(); void hideSoftwareKeyboard(); bool isSoftwareKeyboardVisible(); diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp index d264f74d66..b44340106d 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.cpp +++ b/src/plugins/platforms/android/qandroidinputcontext.cpp @@ -545,7 +545,9 @@ void QAndroidInputContext::showInputPanel() rect.top(), rect.width(), rect.height(), - query->value(Qt::ImHints).toUInt()); + query->value(Qt::ImHints).toUInt(), + query->value(Qt::ImEnterKeyType).toUInt() + ); } void QAndroidInputContext::showInputPanelLater(Qt::ApplicationState state) -- cgit v1.2.3