summaryrefslogtreecommitdiffstats
path: root/src/android/jar/src/org/qtproject/qt/android/QtEditText.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/jar/src/org/qtproject/qt/android/QtEditText.java')
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtEditText.java249
1 files changed, 180 insertions, 69 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 ff58b6b27f..4524887242 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtEditText.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtEditText.java
@@ -1,110 +1,221 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Android port of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
package org.qtproject.qt.android;
import android.content.Context;
+import android.graphics.Canvas;
import android.text.InputType;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
+import android.view.KeyEvent;
-public class QtEditText extends View
+import org.qtproject.qt.android.QtInputConnection.QtInputConnectionListener;
+
+class QtEditText extends View
{
int m_initialCapsMode = 0;
int m_imeOptions = 0;
int m_inputType = InputType.TYPE_CLASS_TEXT;
boolean m_optionsChanged = false;
- QtActivityDelegate m_activityDelegate;
+ QtInputConnection m_inputConnection = null;
+
+ // input method hints - must be kept in sync with QTDIR/src/corelib/global/qnamespace.h
+ private final int ImhHiddenText = 0x1;
+ private final int ImhSensitiveData = 0x2;
+ private final int ImhNoAutoUppercase = 0x4;
+ private final int ImhPreferNumbers = 0x8;
+ private final int ImhPreferUppercase = 0x10;
+ private final int ImhPreferLowercase = 0x20;
+ private final int ImhNoPredictiveText = 0x40;
+
+ private final int ImhDate = 0x80;
+ private final int ImhTime = 0x100;
+
+ private final int ImhPreferLatin = 0x200;
+
+ private final int ImhMultiLine = 0x400;
+
+ private final int ImhDigitsOnly = 0x10000;
+ private final int ImhFormattedNumbersOnly = 0x20000;
+ private final int ImhUppercaseOnly = 0x40000;
+ private final int ImhLowercaseOnly = 0x80000;
+ private final int ImhDialableCharactersOnly = 0x100000;
+ private final int ImhEmailCharactersOnly = 0x200000;
+ private final int ImhUrlCharactersOnly = 0x400000;
+ private final int ImhLatinOnly = 0x800000;
+
+ private final QtInputConnectionListener m_qtInputConnectionListener;
+
+ public QtEditText(Context context, QtInputConnectionListener listener)
+ {
+ super(context);
+ setFocusable(true);
+ setFocusableInTouchMode(true);
+ m_qtInputConnectionListener = listener;
+ }
- public void setImeOptions(int m_imeOptions)
+ private void setImeOptions(int imeOptions)
{
- if (m_imeOptions == this.m_imeOptions)
+ if (m_imeOptions == imeOptions)
return;
- this.m_imeOptions = m_imeOptions;
+ m_imeOptions = m_imeOptions;
m_optionsChanged = true;
}
- public void setInitialCapsMode(int m_initialCapsMode)
+ private void setInitialCapsMode(int initialCapsMode)
{
- if (m_initialCapsMode == this.m_initialCapsMode)
+ if (m_initialCapsMode == initialCapsMode)
return;
- this.m_initialCapsMode = m_initialCapsMode;
+ m_initialCapsMode = initialCapsMode;
m_optionsChanged = true;
}
- public void setInputType(int m_inputType)
+ private void setInputType(int inputType)
{
- if (m_inputType == this.m_inputType)
+ if (m_inputType == inputType)
return;
- this.m_inputType = m_inputType;
+ m_inputType = m_inputType;
m_optionsChanged = true;
}
- public QtEditText(Context context, QtActivityDelegate activityDelegate)
+ @Override
+ public InputConnection onCreateInputConnection(EditorInfo outAttrs)
{
- super(context);
- setFocusable(true);
- setFocusableInTouchMode(true);
- m_activityDelegate = activityDelegate;
+ outAttrs.inputType = m_inputType;
+ outAttrs.imeOptions = m_imeOptions;
+ outAttrs.initialCapsMode = m_initialCapsMode;
+ m_inputConnection = new QtInputConnection(this,m_qtInputConnectionListener);
+ return m_inputConnection;
}
- public QtActivityDelegate getActivityDelegate()
+
+ @Override
+ public boolean onCheckIsTextEditor ()
{
- return m_activityDelegate;
+ return true;
}
@Override
- public InputConnection onCreateInputConnection(EditorInfo outAttrs)
+ public boolean onKeyDown (int keyCode, KeyEvent event)
{
- outAttrs.inputType = m_inputType;
- outAttrs.imeOptions = m_imeOptions;
- outAttrs.initialCapsMode = m_initialCapsMode;
- outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
- return new QtInputConnection(this);
+ if (null != m_inputConnection)
+ m_inputConnection.restartImmInput();
+
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ // DEBUG CODE
+ // canvas.drawARGB(127, 255, 0, 255);
+ super.onDraw(canvas);
}
-// // DEBUG CODE
-// @Override
-// protected void onDraw(Canvas canvas) {
-// canvas.drawARGB(127, 255, 0, 255);
-// super.onDraw(canvas);
-// }
+
+ public void setEditTextOptions(int enterKeyType, int inputHints)
+ {
+ int initialCapsMode = 0;
+ int imeOptions = imeOptionsFromEnterKeyType(enterKeyType);
+ int inputType = android.text.InputType.TYPE_CLASS_TEXT;
+
+ if ((inputHints & (ImhPreferNumbers | ImhDigitsOnly | ImhFormattedNumbersOnly)) != 0) {
+ inputType = android.text.InputType.TYPE_CLASS_NUMBER;
+ if ((inputHints & ImhFormattedNumbersOnly) != 0) {
+ inputType |= (android.text.InputType.TYPE_NUMBER_FLAG_DECIMAL
+ | android.text.InputType.TYPE_NUMBER_FLAG_SIGNED);
+ }
+
+ if ((inputHints & ImhHiddenText) != 0)
+ inputType |= android.text.InputType.TYPE_NUMBER_VARIATION_PASSWORD;
+ } else if ((inputHints & ImhDialableCharactersOnly) != 0) {
+ inputType = android.text.InputType.TYPE_CLASS_PHONE;
+ } else if ((inputHints & (ImhDate | ImhTime)) != 0) {
+ inputType = android.text.InputType.TYPE_CLASS_DATETIME;
+ if ((inputHints & (ImhDate | ImhTime)) != (ImhDate | ImhTime)) {
+ if ((inputHints & ImhDate) != 0)
+ inputType |= android.text.InputType.TYPE_DATETIME_VARIATION_DATE;
+ else
+ inputType |= android.text.InputType.TYPE_DATETIME_VARIATION_TIME;
+ } // else { TYPE_DATETIME_VARIATION_NORMAL(0) }
+ } else { // CLASS_TEXT
+ if ((inputHints & ImhHiddenText) != 0) {
+ inputType |= android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD;
+ } else if ((inputHints & ImhSensitiveData) != 0 ||
+ isDisablePredictiveTextWorkaround(inputHints)) {
+ inputType |= android.text.InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
+ } else if ((inputHints & ImhUrlCharactersOnly) != 0) {
+ inputType |= android.text.InputType.TYPE_TEXT_VARIATION_URI;
+ 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;
+ }
+
+ if ((inputHints & ImhMultiLine) != 0) {
+ inputType |= android.text.InputType.TYPE_TEXT_FLAG_MULTI_LINE;
+ // Clear imeOptions for Multi-Line Type
+ // User should be able to insert new line in such case
+ imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
+ }
+ if ((inputHints & (ImhNoPredictiveText | ImhSensitiveData | ImhHiddenText)) != 0)
+ inputType |= android.text.InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
+
+ if ((inputHints & ImhUppercaseOnly) != 0) {
+ initialCapsMode |= android.text.TextUtils.CAP_MODE_CHARACTERS;
+ inputType |= android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS;
+ } else if ((inputHints & ImhLowercaseOnly) == 0
+ && (inputHints & ImhNoAutoUppercase) == 0) {
+ initialCapsMode |= android.text.TextUtils.CAP_MODE_SENTENCES;
+ inputType |= android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES;
+ }
+ }
+
+ if (enterKeyType == 0 && (inputHints & ImhMultiLine) != 0)
+ imeOptions = android.view.inputmethod.EditorInfo.IME_FLAG_NO_ENTER_ACTION;
+
+ setInitialCapsMode(initialCapsMode);
+ setImeOptions(imeOptions);
+ setInputType(inputType);
+ }
+
+ private int imeOptionsFromEnterKeyType(int enterKeyType)
+ {
+ int imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
+
+ // enter key type - must be kept in sync with QTDIR/src/corelib/global/qnamespace.h
+ switch (enterKeyType) {
+ case 0: // EnterKeyDefault
+ break;
+ case 1: // EnterKeyReturn
+ imeOptions = android.view.inputmethod.EditorInfo.IME_FLAG_NO_ENTER_ACTION;
+ break;
+ case 2: // EnterKeyDone
+ break;
+ case 3: // EnterKeyGo
+ imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_GO;
+ break;
+ case 4: // EnterKeySend
+ imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_SEND;
+ break;
+ case 5: // EnterKeySearch
+ imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_SEARCH;
+ break;
+ case 6: // EnterKeyNext
+ imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_NEXT;
+ break;
+ case 7: // EnterKeyPrevious
+ imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_PREVIOUS;
+ break;
+ }
+ return imeOptions;
+ }
+
+ private boolean isDisablePredictiveTextWorkaround(int inputHints)
+ {
+ return (inputHints & ImhNoPredictiveText) != 0 &&
+ System.getenv("QT_ANDROID_ENABLE_WORKAROUND_TO_DISABLE_PREDICTIVE_TEXT") != null;
+ }
}