Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qandroidplatformclipboard.cpp
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4// Qt-Security score:significant reason:default
5
7
8#include <QtCore/QUrl>
9#include <QtCore/QJniEnvironment>
10#include <QtCore/QJniObject>
11#include <QtCore/private/qjnihelpers_p.h>
12
13#ifndef QT_NO_CLIPBOARD
14
15using namespace QtJniTypes;
16
17QT_BEGIN_NAMESPACE
18
19void QAndroidPlatformClipboard::onClipboardDataChanged(JNIEnv *env, jobject obj, jlong nativePointer)
20{
21 Q_UNUSED(env)
22 Q_UNUSED(obj)
23
24 auto *clipboardManager = reinterpret_cast<QAndroidPlatformClipboard *>(nativePointer);
25 if (clipboardManager)
26 clipboardManager->emitChanged(QClipboard::Clipboard);
27}
28
30{
31 m_clipboardManager = QtClipboardManager::construct(QtAndroidPrivate::context(),
32 reinterpret_cast<jlong>(this));
33}
34
36{
37 if (data)
38 delete data;
39}
40
41QMimeData *QAndroidPlatformClipboard::getClipboardMimeData()
42{
43 QMimeData *data = new QMimeData;
44 if (m_clipboardManager.callMethod<jboolean>("hasClipboardText")) {
45 data->setText(m_clipboardManager.callMethod<QString>("getClipboardText"));
46 }
47 if (m_clipboardManager.callMethod<jboolean>("hasClipboardHtml")) {
48 data->setHtml(m_clipboardManager.callMethod<QString>("getClipboardHtml"));
49 }
50 if (m_clipboardManager.callMethod<jboolean>("hasClipboardUri")) {
51 auto uris = m_clipboardManager.callMethod<QString[]>("getClipboardUris");
52 if (uris.isValid()) {
53 QList<QUrl> urls;
54 for (const QString &uri : uris)
55 urls << QUrl(uri);
56 data->setUrls(urls);
57 }
58 }
59 return data;
60}
61
63{
64 Q_UNUSED(mode);
65 Q_ASSERT(supportsMode(mode));
66 if (data)
67 data->deleteLater();
68 data = getClipboardMimeData();
69 return data;
70}
71
72void QAndroidPlatformClipboard::clearClipboardData()
73{
74 m_clipboardManager.callMethod<void>("clearClipData");
75}
76
77void QAndroidPlatformClipboard::setClipboardMimeData(QMimeData *data)
78{
79 clearClipboardData();
80 auto context = QtAndroidPrivate::context();
81 if (data->hasUrls()) {
82 QList<QUrl> urls = data->urls();
83 for (const auto &u : std::as_const(urls))
84 m_clipboardManager.callMethod<void>("setClipboardUri", context, u.toEncoded());
85 } else if (data->hasHtml()) { // html can contain text
86 m_clipboardManager.callMethod<void>("setClipboardHtml",
87 context, data->text(), data->html());
88 } else if (data->hasText()) { // hasText must be the last (the order matter here)
89 m_clipboardManager.callMethod<void>("setClipboardText", context, data->text());
90 }
91}
92
93void QAndroidPlatformClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode)
94{
95 if (!data) {
96 clearClipboardData();
97 return;
98 }
99 if (data && supportsMode(mode))
100 setClipboardMimeData(data);
101 if (data != 0)
102 data->deleteLater();
103}
104
105bool QAndroidPlatformClipboard::supportsMode(QClipboard::Mode mode) const
106{
107 return QClipboard::Clipboard == mode;
108}
109
110bool QAndroidPlatformClipboard::registerNatives(QJniEnvironment &env)
111{
112 bool success = env.registerNativeMethods(Traits<QtClipboardManager>::className(),
113 { Q_JNI_NATIVE_SCOPED_METHOD(onClipboardDataChanged, QAndroidPlatformClipboard) });
114 if (!success) {
115 qCritical() << "QtClipboardManager: registerNativeMethods() failed";
116 return false;
117 }
118
119 return true;
120}
121
122QT_END_NAMESPACE
123
124#endif // QT_NO_CLIPBOARD
void setMimeData(QMimeData *data, QClipboard::Mode mode=QClipboard::Clipboard) override
QMimeData * mimeData(QClipboard::Mode mode=QClipboard::Clipboard) override
bool supportsMode(QClipboard::Mode mode) const override