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
6
7#include <QtCore/QUrl>
8#include <QtCore/QJniEnvironment>
9#include <QtCore/QJniObject>
10#include <QtCore/private/qjnihelpers_p.h>
11
12#ifndef QT_NO_CLIPBOARD
13
14using namespace QtJniTypes;
15
16QT_BEGIN_NAMESPACE
17
18void QAndroidPlatformClipboard::onClipboardDataChanged(JNIEnv *env, jobject obj, jlong nativePointer)
19{
20 Q_UNUSED(env)
21 Q_UNUSED(obj)
22
23 auto *clipboardManager = reinterpret_cast<QAndroidPlatformClipboard *>(nativePointer);
24 if (clipboardManager)
25 clipboardManager->emitChanged(QClipboard::Clipboard);
26}
27
29{
30 m_clipboardManager = QtClipboardManager::construct(QtAndroidPrivate::context(),
31 reinterpret_cast<jlong>(this));
32}
33
35{
36 if (data)
37 delete data;
38}
39
40QMimeData *QAndroidPlatformClipboard::getClipboardMimeData()
41{
42 QMimeData *data = new QMimeData;
43 if (m_clipboardManager.callMethod<jboolean>("hasClipboardText")) {
44 data->setText(m_clipboardManager.callMethod<QString>("getClipboardText"));
45 }
46 if (m_clipboardManager.callMethod<jboolean>("hasClipboardHtml")) {
47 data->setHtml(m_clipboardManager.callMethod<QString>("getClipboardHtml"));
48 }
49 if (m_clipboardManager.callMethod<jboolean>("hasClipboardUri")) {
50 auto uris = m_clipboardManager.callMethod<QString[]>("getClipboardUris");
51 if (uris.isValid()) {
52 QList<QUrl> urls;
53 for (const QString &uri : uris)
54 urls << QUrl(uri);
55 data->setUrls(urls);
56 }
57 }
58 return data;
59}
60
62{
63 Q_UNUSED(mode);
64 Q_ASSERT(supportsMode(mode));
65 if (data)
66 data->deleteLater();
67 data = getClipboardMimeData();
68 return data;
69}
70
71void QAndroidPlatformClipboard::clearClipboardData()
72{
73 m_clipboardManager.callMethod<void>("clearClipData");
74}
75
76void QAndroidPlatformClipboard::setClipboardMimeData(QMimeData *data)
77{
78 clearClipboardData();
79 auto context = QtAndroidPrivate::context();
80 if (data->hasUrls()) {
81 QList<QUrl> urls = data->urls();
82 for (const auto &u : std::as_const(urls))
83 m_clipboardManager.callMethod<void>("setClipboardUri", context, u.toEncoded());
84 } else if (data->hasHtml()) { // html can contain text
85 m_clipboardManager.callMethod<void>("setClipboardHtml",
86 context, data->text(), data->html());
87 } else if (data->hasText()) { // hasText must be the last (the order matter here)
88 m_clipboardManager.callMethod<void>("setClipboardText", context, data->text());
89 }
90}
91
92void QAndroidPlatformClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode)
93{
94 if (!data) {
95 clearClipboardData();
96 return;
97 }
98 if (data && supportsMode(mode))
99 setClipboardMimeData(data);
100 if (data != 0)
101 data->deleteLater();
102}
103
104bool QAndroidPlatformClipboard::supportsMode(QClipboard::Mode mode) const
105{
106 return QClipboard::Clipboard == mode;
107}
108
109bool QAndroidPlatformClipboard::registerNatives(QJniEnvironment &env)
110{
111 bool success = env.registerNativeMethods(Traits<QtClipboardManager>::className(),
112 { Q_JNI_NATIVE_SCOPED_METHOD(onClipboardDataChanged, QAndroidPlatformClipboard) });
113 if (!success) {
114 qCritical() << "QtClipboardManager: registerNativeMethods() failed";
115 return false;
116 }
117
118 return true;
119}
120
121QT_END_NAMESPACE
122
123#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