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 <assam.boudjelthia@qt.io>
(cherry picked from commit fdccb66a4e9a8b22c881c4775895b7af174b0b24)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Bartlomiej Moskal 2023-06-27 09:14:57 +02:00 committed by Qt Cherry-pick Bot
parent 98ff5a2676
commit 477ecafaee
5 changed files with 33 additions and 9 deletions

View File

@ -895,7 +895,7 @@ public class QtNative
public static boolean hasClipboardText() public static boolean hasClipboardText()
{ {
return hasClipboardMimeType("text/plain"); return hasClipboardMimeType("text/(.*)");
} }
private static String getClipboardText() private static String getClipboardText()
@ -953,7 +953,7 @@ public class QtNative
for (int i = 0; i < description.getMimeTypeCount(); ++i) { for (int i = 0; i < description.getMimeTypeCount(); ++i) {
String itemMimeType = description.getMimeType(i); String itemMimeType = description.getMimeType(i);
if (itemMimeType.equals(mimeType)) if (itemMimeType.matches(mimeType))
return true; return true;
} }
return false; return false;

View File

@ -43,16 +43,16 @@ namespace QtAndroidClipboard
"(Ljava/lang/String;)V", "(Ljava/lang/String;)V",
QJniObject::fromString(u.toEncoded()).object()); QJniObject::fromString(u.toEncoded()).object());
} }
} else if (data->hasText()) { // hasText || hasUrls, so the order matter here. } else if (data->hasHtml()) { // html can contain text
QJniObject::callStaticMethod<void>(applicationClass(),
"setClipboardText", "(Ljava/lang/String;)V",
QJniObject::fromString(data->text()).object());
} else if (data->hasHtml()) {
QJniObject::callStaticMethod<void>(applicationClass(), QJniObject::callStaticMethod<void>(applicationClass(),
"setClipboardHtml", "setClipboardHtml",
"(Ljava/lang/String;Ljava/lang/String;)V", "(Ljava/lang/String;Ljava/lang/String;)V",
QJniObject::fromString(data->text()).object(), QJniObject::fromString(data->text()).object(),
QJniObject::fromString(data->html()).object()); QJniObject::fromString(data->html()).object());
} else if (data->hasText()) { // hasText must be the last (the order matter here)
QJniObject::callStaticMethod<void>(applicationClass(),
"setClipboardText", "(Ljava/lang/String;)V",
QJniObject::fromString(data->text()).object());
} }
} }

View File

@ -29,7 +29,7 @@ endif()
add_subdirectory(qpixelformat) add_subdirectory(qpixelformat)
add_subdirectory(qrasterwindow) add_subdirectory(qrasterwindow)
add_subdirectory(qaddpostroutine) add_subdirectory(qaddpostroutine)
if(NOT ANDROID AND NOT UIKIT) if(NOT UIKIT)
add_subdirectory(qclipboard) add_subdirectory(qclipboard)
endif() endif()
if(TARGET Qt::Network) if(TARGET Qt::Network)

View File

@ -0,0 +1,5 @@
# QTBUG-87429
[testSignals]
android
[setMimeData]
android

View File

@ -41,6 +41,7 @@ private slots:
void testSignals(); void testSignals();
void setMimeData(); void setMimeData();
void clearBeforeSetText(); void clearBeforeSetText();
void getTextFromHTMLMimeType();
# ifdef Q_OS_WIN # ifdef Q_OS_WIN
void testWindowsMimeRegisterType(); void testWindowsMimeRegisterType();
void testWindowsMime_data(); void testWindowsMime_data();
@ -61,7 +62,7 @@ void tst_QClipboard::initTestCase()
#if QT_CONFIG(clipboard) #if QT_CONFIG(clipboard)
void tst_QClipboard::init() void tst_QClipboard::init()
{ {
#if QT_CONFIG(process) #if QT_CONFIG(process) && !defined(Q_OS_ANDROID)
const QString testdataDir = QFileInfo(QFINDTESTDATA("copier")).absolutePath(); const QString testdataDir = QFileInfo(QFINDTESTDATA("copier")).absolutePath();
QVERIFY2(QDir::setCurrent(testdataDir), qPrintable("Could not chdir to " + testdataDir)); QVERIFY2(QDir::setCurrent(testdataDir), qPrintable("Could not chdir to " + testdataDir));
#endif #endif
@ -424,6 +425,24 @@ void tst_QClipboard::clearBeforeSetText()
QCOMPARE(QGuiApplication::clipboard()->text(), text); 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("<html><body>") + testString + QLatin1String("</body></html>"));
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 # ifdef Q_OS_WIN
using QWindowsMimeConverter = QWindowsMimeConverter; using QWindowsMimeConverter = QWindowsMimeConverter;