From 477ecafaeef6dd357a0195a1332f0501fb34cf28 Mon Sep 17 00:00:00 2001 From: Bartlomiej Moskal Date: Tue, 27 Jun 2023 09:14:57 +0200 Subject: [PATCH] Android: Fix for checking clipboard text mime type Different mime types are widely used on mobile devices. For example all text copied from gmail is copied as text/html type. After 2937cf91c74b6562bf56e8872dfd2bfaafebb3cc commit there is a regression that makes it impossible to paste any text different than "text/plain". To fix it, any "text/*" mime type should be treat as it contains a text (not only "text/plain"). That will allow to paste different text mime types. During this work also tst_qclipboard testset was turned on for Android and new test (getTextFromHTMLMimeType) was added. Fixes: QTBUG-113461 Change-Id: I3ef9476b8facdc3b61f144bd55222898390127c9 Reviewed-by: Assam Boudjelthia (cherry picked from commit fdccb66a4e9a8b22c881c4775895b7af174b0b24) Reviewed-by: Qt Cherry-pick Bot --- .../org/qtproject/qt/android/QtNative.java | 4 ++-- .../platforms/android/androidjniclipboard.cpp | 10 ++++----- tests/auto/gui/kernel/CMakeLists.txt | 2 +- .../auto/gui/kernel/qclipboard/test/BLACKLIST | 5 +++++ .../gui/kernel/qclipboard/tst_qclipboard.cpp | 21 ++++++++++++++++++- 5 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 tests/auto/gui/kernel/qclipboard/test/BLACKLIST diff --git a/src/android/jar/src/org/qtproject/qt/android/QtNative.java b/src/android/jar/src/org/qtproject/qt/android/QtNative.java index f9afa8ae38a..161a489a566 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtNative.java @@ -895,7 +895,7 @@ public class QtNative public static boolean hasClipboardText() { - return hasClipboardMimeType("text/plain"); + return hasClipboardMimeType("text/(.*)"); } private static String getClipboardText() @@ -953,7 +953,7 @@ public class QtNative for (int i = 0; i < description.getMimeTypeCount(); ++i) { String itemMimeType = description.getMimeType(i); - if (itemMimeType.equals(mimeType)) + if (itemMimeType.matches(mimeType)) return true; } return false; diff --git a/src/plugins/platforms/android/androidjniclipboard.cpp b/src/plugins/platforms/android/androidjniclipboard.cpp index 81663cac0ce..d510f430498 100644 --- a/src/plugins/platforms/android/androidjniclipboard.cpp +++ b/src/plugins/platforms/android/androidjniclipboard.cpp @@ -43,16 +43,16 @@ namespace QtAndroidClipboard "(Ljava/lang/String;)V", QJniObject::fromString(u.toEncoded()).object()); } - } else if (data->hasText()) { // hasText || hasUrls, so the order matter here. - QJniObject::callStaticMethod(applicationClass(), - "setClipboardText", "(Ljava/lang/String;)V", - QJniObject::fromString(data->text()).object()); - } else if (data->hasHtml()) { + } else if (data->hasHtml()) { // html can contain text QJniObject::callStaticMethod(applicationClass(), "setClipboardHtml", "(Ljava/lang/String;Ljava/lang/String;)V", QJniObject::fromString(data->text()).object(), QJniObject::fromString(data->html()).object()); + } else if (data->hasText()) { // hasText must be the last (the order matter here) + QJniObject::callStaticMethod(applicationClass(), + "setClipboardText", "(Ljava/lang/String;)V", + QJniObject::fromString(data->text()).object()); } } diff --git a/tests/auto/gui/kernel/CMakeLists.txt b/tests/auto/gui/kernel/CMakeLists.txt index a178942d5a7..5377a04a640 100644 --- a/tests/auto/gui/kernel/CMakeLists.txt +++ b/tests/auto/gui/kernel/CMakeLists.txt @@ -29,7 +29,7 @@ endif() add_subdirectory(qpixelformat) add_subdirectory(qrasterwindow) add_subdirectory(qaddpostroutine) -if(NOT ANDROID AND NOT UIKIT) +if(NOT UIKIT) add_subdirectory(qclipboard) endif() if(TARGET Qt::Network) diff --git a/tests/auto/gui/kernel/qclipboard/test/BLACKLIST b/tests/auto/gui/kernel/qclipboard/test/BLACKLIST new file mode 100644 index 00000000000..3ca7791b371 --- /dev/null +++ b/tests/auto/gui/kernel/qclipboard/test/BLACKLIST @@ -0,0 +1,5 @@ +# QTBUG-87429 +[testSignals] +android +[setMimeData] +android diff --git a/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp b/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp index 0b694bff73d..520233bf69d 100644 --- a/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp +++ b/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp @@ -41,6 +41,7 @@ private slots: void testSignals(); void setMimeData(); void clearBeforeSetText(); + void getTextFromHTMLMimeType(); # ifdef Q_OS_WIN void testWindowsMimeRegisterType(); void testWindowsMime_data(); @@ -61,7 +62,7 @@ void tst_QClipboard::initTestCase() #if QT_CONFIG(clipboard) void tst_QClipboard::init() { -#if QT_CONFIG(process) +#if QT_CONFIG(process) && !defined(Q_OS_ANDROID) const QString testdataDir = QFileInfo(QFINDTESTDATA("copier")).absolutePath(); QVERIFY2(QDir::setCurrent(testdataDir), qPrintable("Could not chdir to " + testdataDir)); #endif @@ -424,6 +425,24 @@ void tst_QClipboard::clearBeforeSetText() QCOMPARE(QGuiApplication::clipboard()->text(), text); } +void tst_QClipboard::getTextFromHTMLMimeType() +{ + QClipboard * clipboard = QGuiApplication::clipboard(); + QMimeData * mimeData = new QMimeData(); + const QString testString("TEST"); + const QString htmlString(QLatin1String("") + testString + QLatin1String("")); + + mimeData->setText(testString); + mimeData->setHtml(htmlString); + clipboard->setMimeData(mimeData); + + QCOMPARE(clipboard->text(), testString); + QVERIFY(clipboard->mimeData()->hasText()); + QVERIFY(clipboard->mimeData()->hasHtml()); + QCOMPARE(clipboard->mimeData()->text(), testString); + QCOMPARE(clipboard->mimeData()->html(), htmlString); +} + # ifdef Q_OS_WIN using QWindowsMimeConverter = QWindowsMimeConverter;