4package org.qtproject.qt.android;
6import android.content.ClipData;
7import android.content.ClipDescription;
8import android.content.ClipboardManager;
9import android.content.Context;
10import android.content.Intent;
11import android.net.Uri;
12import android.os.Build;
13import android.util.Log;
15import java.util.ArrayList;
16import java.util.Objects;
17import java.util.concurrent.Semaphore;
19class QtClipboardManager
21 public static native
void onClipboardDataChanged(
long nativePointer);
23 private final static String TAG =
"QtClipboardManager";
24 private ClipboardManager m_clipboardManager =
null;
25 private boolean m_usePrimaryClip =
false;
26 private final long m_nativePointer;
28 public QtClipboardManager(Context
context,
long nativePointer)
30 m_nativePointer = nativePointer;
31 registerClipboardManager(
context);
34 private void registerClipboardManager(Context
context)
37 final Semaphore semaphore =
new Semaphore(0);
38 QtNative.runAction(() -> {
40 (ClipboardManager)
context.getSystemService(Context.CLIPBOARD_SERVICE);
41 if (m_clipboardManager !=
null) {
42 m_clipboardManager.addPrimaryClipChangedListener(
43 () -> onClipboardDataChanged(m_nativePointer));
49 }
catch (Exception e) {
56 public void clearClipData()
58 if (m_clipboardManager !=
null) {
59 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
60 m_clipboardManager.clearPrimaryClip();
62 String[] mimeTypes = {
"application/octet-stream" };
64 m_clipboardManager.setPrimaryClip(
data);
67 m_usePrimaryClip =
false;
71 public void setClipboardText(Context
context, String
text)
73 if (m_clipboardManager !=
null) {
75 updatePrimaryClip(clipData,
context);
79 public static boolean hasClipboardText(Context
context)
81 ClipboardManager clipboardManager =
82 (ClipboardManager)
context.getSystemService(Context.CLIPBOARD_SERVICE);
84 if (clipboardManager ==
null)
87 ClipDescription description = clipboardManager.getPrimaryClipDescription();
89 if (description ==
null)
92 for (
int i = 0;
i < description.getMimeTypeCount(); ++
i) {
93 String itemMimeType = description.getMimeType(
i);
94 if (itemMimeType.matches(
"text/(.*)"))
101 public boolean hasClipboardText()
103 return hasClipboardMimeType(
"text/(.*)");
107 public String getClipboardText()
110 if (m_clipboardManager !=
null && m_clipboardManager.hasPrimaryClip()) {
111 ClipData primaryClip = m_clipboardManager.getPrimaryClip();
112 if (primaryClip !=
null) {
113 for (
int i = 0;
i < primaryClip.getItemCount(); ++
i)
114 if (primaryClip.getItemAt(
i).getText() !=
null)
115 return primaryClip.getItemAt(
i).getText().toString();
118 }
catch (Exception e) {
119 Log.e(TAG,
"Failed to get clipboard data", e);
127 if (m_usePrimaryClip) {
128 ClipData clip = m_clipboardManager.getPrimaryClip();
129 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
130 Objects.requireNonNull(clip).addItem(
context.getContentResolver(),
131 clipData.getItemAt(0));
133 Objects.requireNonNull(clip).addItem(clipData.getItemAt(0));
135 m_clipboardManager.setPrimaryClip(clip);
137 m_clipboardManager.setPrimaryClip(clipData);
138 m_usePrimaryClip =
true;
140 }
catch (Exception e) {
141 Log.e(TAG,
"Failed to set clipboard data", e);
146 public void setClipboardHtml(Context
context, String
text, String html)
148 if (m_clipboardManager !=
null) {
150 updatePrimaryClip(clipData,
context);
154 private boolean hasClipboardMimeType(String
mimeType)
156 if (m_clipboardManager ==
null)
159 ClipDescription description = m_clipboardManager.getPrimaryClipDescription();
161 if (description ==
null)
164 for (
int i = 0;
i < description.getMimeTypeCount(); ++
i) {
165 String itemMimeType = description.getMimeType(
i);
173 public boolean hasClipboardHtml()
175 return hasClipboardMimeType(
"text/html");
179 public String getClipboardHtml()
182 if (m_clipboardManager !=
null && m_clipboardManager.hasPrimaryClip()) {
183 ClipData primaryClip = m_clipboardManager.getPrimaryClip();
184 if (primaryClip !=
null) {
185 for (
int i = 0;
i < primaryClip.getItemCount(); ++
i)
186 if (primaryClip.getItemAt(
i).getHtmlText() !=
null)
187 return primaryClip.getItemAt(
i).getHtmlText();
190 }
catch (Exception e) {
191 Log.e(TAG,
"Failed to get clipboard data", e);
197 public void setClipboardUri(Context
context, String uriString)
199 if (m_clipboardManager !=
null) {
201 Uri.parse(uriString));
202 updatePrimaryClip(clipData,
context);
207 public boolean hasClipboardUri()
209 return hasClipboardMimeType(
"text/uri-list");
213 private String[] getClipboardUris()
215 ArrayList<String> uris =
new ArrayList<>();
217 if (m_clipboardManager !=
null && m_clipboardManager.hasPrimaryClip()) {
218 ClipData primaryClip = m_clipboardManager.getPrimaryClip();
219 if (primaryClip !=
null) {
220 for (
int i = 0;
i < primaryClip.getItemCount(); ++
i)
221 if (primaryClip.getItemAt(
i).getUri() !=
null)
222 uris.add(primaryClip.getItemAt(
i).getUri().toString());
225 }
catch (Exception e) {
226 Log.e(TAG,
"Failed to get clipboard data", e);
228 String[]
strings =
new String[uris.size()];
GLsizei const GLchar ** strings
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data