summaryrefslogtreecommitdiffstats
path: root/src/android/jar
diff options
context:
space:
mode:
authorRami Potinkara <rami.potinkara@qt.io>2023-07-03 09:33:22 +0300
committerRami Potinkara <rami.potinkara@qt.io>2024-02-15 00:59:14 +0200
commit1f6d7cbb341bd79826d3f6d69e1f1a427ebb8f1b (patch)
tree5fa42ec3e07ba534febca86c80f725712a06ada1 /src/android/jar
parentc30195a95e751552a39f99dd5833ebf722d11bc1 (diff)
Android: QtEditText support for full-screen soft keyboard
Full-screen soft keyboard support added. Including functionality for copy-cut-paste and line change. Future TODO QTBUG-121522 Task-number: QTBUG-109367 Pick-to: 6.7 6.6 6.5 6.2 Change-Id: Ia5632cacc910c7ebde0e40608c2abd027b8f953a Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/android/jar')
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtEditText.java22
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java48
2 files changed, 56 insertions, 14 deletions
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtEditText.java b/src/android/jar/src/org/qtproject/qt/android/QtEditText.java
index b32d7aeded..a44a4a4be5 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtEditText.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtEditText.java
@@ -10,6 +10,7 @@ import android.text.InputType;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
+import android.view.KeyEvent;
import org.qtproject.qt.android.QtInputConnection.QtInputConnectionListener;
@@ -19,7 +20,7 @@ class QtEditText extends View
int m_imeOptions = 0;
int m_inputType = InputType.TYPE_CLASS_TEXT;
boolean m_optionsChanged = false;
-
+ QtInputConnection m_inputConnection = null;
private QtInputConnectionListener m_qtInputConnectionListener;
public void setQtInputConnectionListener(QtInputConnectionListener listener)
@@ -65,8 +66,23 @@ class QtEditText extends View
outAttrs.inputType = m_inputType;
outAttrs.imeOptions = m_imeOptions;
outAttrs.initialCapsMode = m_initialCapsMode;
- outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
- return new QtInputConnection(this, m_qtInputConnectionListener);
+ m_inputConnection = new QtInputConnection(this,m_qtInputConnectionListener);
+ return m_inputConnection;
+ }
+
+ @Override
+ public boolean onCheckIsTextEditor ()
+ {
+ return true;
+ }
+
+ @Override
+ public boolean onKeyDown (int keyCode, KeyEvent event)
+ {
+ if (null != m_inputConnection)
+ m_inputConnection.restartImmInput();
+
+ return super.onKeyDown(keyCode, event);
}
@Override
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java b/src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java
index 02b1f373b6..1bfe05e7ac 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java
@@ -50,6 +50,8 @@ class QtNativeInputConnection
static native boolean copyURL();
static native boolean paste();
static native boolean updateCursorPosition();
+ static native void reportFullscreenMode(boolean enabled);
+ static native boolean fullscreenMode();
}
class QtInputConnection extends BaseInputConnection
@@ -101,6 +103,7 @@ class QtInputConnection extends BaseInputConnection
}
private final QtEditText m_view;
+ private final InputMethodManager m_imm;
private void setClosing(boolean closing)
{
@@ -114,9 +117,20 @@ class QtInputConnection extends BaseInputConnection
{
super(targetView, true);
m_view = targetView;
+ m_imm = (InputMethodManager)m_view.getContext().getSystemService(
+ Context.INPUT_METHOD_SERVICE);
m_qtInputConnectionListener = listener;
}
+ public void restartImmInput()
+ {
+ if (QtNativeInputConnection.fullscreenMode()) {
+ if (m_imm != null)
+ m_imm.restartInput(m_view);
+ }
+
+ }
+
@Override
public boolean beginBatchEdit()
{
@@ -125,6 +139,18 @@ class QtInputConnection extends BaseInputConnection
}
@Override
+ public boolean reportFullscreenMode (boolean enabled)
+ {
+ QtNativeInputConnection.reportFullscreenMode(enabled);
+ // Always ignored on calling editor.
+ // Always false on Android 8 and later, true with earlier.
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
+ return false;
+
+ return true;
+ }
+
+ @Override
public boolean endBatchEdit()
{
setClosing(false);
@@ -142,6 +168,7 @@ class QtInputConnection extends BaseInputConnection
public boolean commitText(CharSequence text, int newCursorPosition)
{
setClosing(false);
+ restartImmInput();
return QtNativeInputConnection.commitText(text.toString(), newCursorPosition);
}
@@ -207,23 +234,25 @@ class QtInputConnection extends BaseInputConnection
{
switch (id) {
case ID_SELECT_ALL:
+ restartImmInput();
return QtNativeInputConnection.selectAll();
case ID_COPY:
+ restartImmInput();
return QtNativeInputConnection.copy();
case ID_COPY_URL:
+ restartImmInput();
return QtNativeInputConnection.copyURL();
case ID_CUT:
+ restartImmInput();
return QtNativeInputConnection.cut();
case ID_PASTE:
+ restartImmInput();
return QtNativeInputConnection.paste();
-
case ID_SWITCH_INPUT_METHOD:
- InputMethodManager imm = (InputMethodManager)m_view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
- if (imm != null)
- imm.showInputMethodPicker();
+ if (m_imm != null)
+ m_imm.showInputMethodPicker();
return true;
-
case ID_ADD_TO_DICTIONARY:
// TODO
// String word = m_editable.subSequence(0, m_editable.length()).toString();
@@ -256,8 +285,7 @@ class QtInputConnection extends BaseInputConnection
event.getRepeatCount(),
event.getMetaState());
return super.sendKeyEvent(fakeEvent);
-
- case android.view.inputmethod.EditorInfo.IME_ACTION_PREVIOUS:
+ case android.view.inputmethod.EditorInfo.IME_ACTION_PREVIOUS:
fakeEvent = new KeyEvent(event.getDownTime(),
event.getEventTime(),
event.getAction(),
@@ -265,16 +293,14 @@ class QtInputConnection extends BaseInputConnection
event.getRepeatCount(),
KeyEvent.META_SHIFT_ON);
return super.sendKeyEvent(fakeEvent);
-
case android.view.inputmethod.EditorInfo.IME_FLAG_NO_ENTER_ACTION:
+ restartImmInput();
break;
-
default:
m_qtInputConnectionListener.onSendKeyEventDefaultCase();
- break;
+ break;
}
}
-
return super.sendKeyEvent(event);
}