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
QtClipboardManager.java
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:critical reason:data-parser
4
5package org.qtproject.qt.android;
6
7import android.content.ClipData;
8import android.content.ClipDescription;
9import android.content.ClipboardManager;
10import android.content.Context;
11import android.content.Intent;
12import android.net.Uri;
13import android.os.Build;
14import android.util.Log;
15
16import java.util.ArrayList;
17import java.util.Objects;
18import java.util.concurrent.Semaphore;
19
20class QtClipboardManager
21{
22 static native void onClipboardDataChanged(long nativePointer);
23
24 private final static String TAG = "QtClipboardManager";
25 private ClipboardManager m_clipboardManager = null;
26 private boolean m_usePrimaryClip = false;
27 private final long m_nativePointer;
28
29 QtClipboardManager(Context context, long nativePointer)
30 {
31 m_nativePointer = nativePointer;
32 registerClipboardManager(context);
33 }
34
35 private void registerClipboardManager(Context context)
36 {
37 if (context != null) {
38 final Semaphore semaphore = new Semaphore(0);
39 QtNative.runAction(() -> {
40 m_clipboardManager =
41 (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
42 if (m_clipboardManager != null) {
43 m_clipboardManager.addPrimaryClipChangedListener(
44 () -> onClipboardDataChanged(m_nativePointer));
45 }
46 semaphore.release();
47 });
48 try {
49 semaphore.acquire();
50 } catch (Exception e) {
51 e.printStackTrace();
52 }
53 }
54 }
55
56 @UsedFromNativeCode
57 void clearClipData()
58 {
59 if (m_clipboardManager != null) {
60 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
61 m_clipboardManager.clearPrimaryClip();
62 } else {
63 String[] mimeTypes = { "application/octet-stream" };
64 ClipData data = new ClipData("", mimeTypes, new ClipData.Item(new Intent()));
65 m_clipboardManager.setPrimaryClip(data);
66 }
67 }
68 m_usePrimaryClip = false;
69 }
70
71 @UsedFromNativeCode
72 void setClipboardText(Context context, String text)
73 {
74 if (m_clipboardManager != null) {
75 ClipData clipData = ClipData.newPlainText("text/plain", text);
76 updatePrimaryClip(clipData, context);
77 }
78 }
79
80 static boolean hasClipboardText(Context context)
81 {
82 ClipboardManager clipboardManager =
83 (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
84
85 if (clipboardManager == null)
86 return false;
87
88 ClipDescription description = clipboardManager.getPrimaryClipDescription();
89 // getPrimaryClipDescription can fail if the app does not have input focus
90 if (description == null)
91 return false;
92
93 for (int i = 0; i < description.getMimeTypeCount(); ++i) {
94 String itemMimeType = description.getMimeType(i);
95 if (itemMimeType.matches("text/(.*)"))
96 return true;
97 }
98 return false;
99 }
100
101 @UsedFromNativeCode
102 boolean hasClipboardText()
103 {
104 return hasClipboardMimeType("text/(.*)");
105 }
106
107 @UsedFromNativeCode
108 String getClipboardText()
109 {
110 try {
111 if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
112 ClipData primaryClip = m_clipboardManager.getPrimaryClip();
113 if (primaryClip != null) {
114 for (int i = 0; i < primaryClip.getItemCount(); ++i)
115 if (primaryClip.getItemAt(i).getText() != null)
116 return primaryClip.getItemAt(i).getText().toString();
117 }
118 }
119 } catch (Exception e) {
120 Log.e(TAG, "Failed to get clipboard data", e);
121 }
122 return "";
123 }
124
125 private void updatePrimaryClip(ClipData clipData, Context context)
126 {
127 try {
128 if (m_usePrimaryClip) {
129 ClipData clip = m_clipboardManager.getPrimaryClip();
130 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
131 Objects.requireNonNull(clip).addItem(context.getContentResolver(),
132 clipData.getItemAt(0));
133 } else {
134 Objects.requireNonNull(clip).addItem(clipData.getItemAt(0));
135 }
136 m_clipboardManager.setPrimaryClip(clip);
137 } else {
138 m_clipboardManager.setPrimaryClip(clipData);
139 m_usePrimaryClip = true;
140 }
141 } catch (Exception e) {
142 Log.e(TAG, "Failed to set clipboard data", e);
143 }
144 }
145
146 @UsedFromNativeCode
147 void setClipboardHtml(Context context, String text, String html)
148 {
149 if (m_clipboardManager != null) {
150 ClipData clipData = ClipData.newHtmlText("text/html", text, html);
151 updatePrimaryClip(clipData, context);
152 }
153 }
154
155 private boolean hasClipboardMimeType(String mimeType)
156 {
157 if (m_clipboardManager == null)
158 return false;
159
160 ClipDescription description = m_clipboardManager.getPrimaryClipDescription();
161 // getPrimaryClipDescription can fail if the app does not have input focus
162 if (description == null)
163 return false;
164
165 for (int i = 0; i < description.getMimeTypeCount(); ++i) {
166 String itemMimeType = description.getMimeType(i);
167 if (itemMimeType.matches(mimeType))
168 return true;
169 }
170 return false;
171 }
172
173 @UsedFromNativeCode
174 boolean hasClipboardHtml()
175 {
176 return hasClipboardMimeType("text/html");
177 }
178
179 @UsedFromNativeCode
180 String getClipboardHtml()
181 {
182 try {
183 if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
184 ClipData primaryClip = m_clipboardManager.getPrimaryClip();
185 if (primaryClip != null) {
186 for (int i = 0; i < primaryClip.getItemCount(); ++i)
187 if (primaryClip.getItemAt(i).getHtmlText() != null)
188 return primaryClip.getItemAt(i).getHtmlText();
189 }
190 }
191 } catch (Exception e) {
192 Log.e(TAG, "Failed to get clipboard data", e);
193 }
194 return "";
195 }
196
197 @UsedFromNativeCode
198 void setClipboardUri(Context context, String uriString)
199 {
200 if (m_clipboardManager != null) {
201 ClipData clipData = ClipData.newUri(context.getContentResolver(), "text/uri-list",
202 Uri.parse(uriString));
203 updatePrimaryClip(clipData, context);
204 }
205 }
206
207 @UsedFromNativeCode
208 boolean hasClipboardUri()
209 {
210 return hasClipboardMimeType("text/uri-list");
211 }
212
213 @UsedFromNativeCode
214 private String[] getClipboardUris()
215 {
216 ArrayList<String> uris = new ArrayList<>();
217 try {
218 if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
219 ClipData primaryClip = m_clipboardManager.getPrimaryClip();
220 if (primaryClip != null) {
221 for (int i = 0; i < primaryClip.getItemCount(); ++i)
222 if (primaryClip.getItemAt(i).getUri() != null)
223 uris.add(primaryClip.getItemAt(i).getUri().toString());
224 }
225 }
226 } catch (Exception e) {
227 Log.e(TAG, "Failed to get clipboard data", e);
228 }
229 String[] strings = new String[uris.size()];
230 strings = uris.toArray(strings);
231 return strings;
232 }
233}
QPainter Context
static const QString context()
Definition java.cpp:398
const char * mimeType
GLsizei const GLchar ** strings
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
[0]