5package org.qtproject.qt.android;
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;
16import java.util.ArrayList;
17import java.util.Objects;
18import java.util.concurrent.Semaphore;
20class QtClipboardManager
22 static native
void onClipboardDataChanged(
long nativePointer);
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;
31 m_nativePointer = nativePointer;
32 registerClipboardManager(
context);
38 final Semaphore semaphore =
new Semaphore(0);
39 QtNative.runAction(() -> {
41 (ClipboardManager)
context.getSystemService(
Context.CLIPBOARD_SERVICE);
42 if (m_clipboardManager !=
null) {
43 m_clipboardManager.addPrimaryClipChangedListener(
44 () -> onClipboardDataChanged(m_nativePointer));
50 }
catch (Exception e) {
59 if (m_clipboardManager !=
null) {
60 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
61 m_clipboardManager.clearPrimaryClip();
63 String[] mimeTypes = {
"application/octet-stream" };
64 ClipData
data =
new ClipData(
"", mimeTypes,
new ClipData.Item(
new Intent()));
65 m_clipboardManager.setPrimaryClip(
data);
68 m_usePrimaryClip =
false;
74 if (m_clipboardManager !=
null) {
75 ClipData clipData = ClipData.newPlainText(
"text/plain", text);
76 updatePrimaryClip(clipData,
context);
82 ClipboardManager clipboardManager =
83 (ClipboardManager)
context.getSystemService(
Context.CLIPBOARD_SERVICE);
85 if (clipboardManager ==
null)
88 ClipDescription description = clipboardManager.getPrimaryClipDescription();
90 if (description ==
null)
93 for (
int i = 0;
i < description.getMimeTypeCount(); ++
i) {
94 String itemMimeType = description.getMimeType(i);
95 if (itemMimeType.matches(
"text/(.*)"))
102 boolean hasClipboardText()
104 return hasClipboardMimeType(
"text/(.*)");
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();
119 }
catch (Exception e) {
120 Log.e(TAG,
"Failed to get clipboard data", e);
125 private void updatePrimaryClip(ClipData clipData,
Context context)
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));
134 Objects.requireNonNull(clip).addItem(clipData.getItemAt(0));
136 m_clipboardManager.setPrimaryClip(clip);
138 m_clipboardManager.setPrimaryClip(clipData);
139 m_usePrimaryClip =
true;
141 }
catch (Exception e) {
142 Log.e(TAG,
"Failed to set clipboard data", e);
149 if (m_clipboardManager !=
null) {
150 ClipData clipData = ClipData.newHtmlText(
"text/html", text, html);
151 updatePrimaryClip(clipData,
context);
157 if (m_clipboardManager ==
null)
160 ClipDescription description = m_clipboardManager.getPrimaryClipDescription();
162 if (description ==
null)
165 for (
int i = 0;
i < description.getMimeTypeCount(); ++
i) {
166 String itemMimeType = description.getMimeType(i);
174 boolean hasClipboardHtml()
176 return hasClipboardMimeType(
"text/html");
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();
191 }
catch (Exception e) {
192 Log.e(TAG,
"Failed to get clipboard data", e);
200 if (m_clipboardManager !=
null) {
201 ClipData clipData = ClipData.newUri(
context.getContentResolver(),
"text/uri-list",
202 Uri.parse(uriString));
203 updatePrimaryClip(clipData,
context);
208 boolean hasClipboardUri()
210 return hasClipboardMimeType(
"text/uri-list");
214 private String[] getClipboardUris()
216 ArrayList<String> uris =
new ArrayList<>();
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());
226 }
catch (Exception e) {
227 Log.e(TAG,
"Failed to get clipboard data", e);
static const QString context()
GLsizei const GLchar ** strings
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
[0]