Handle exceptions when accessing android clipboard

In some circumstances android throws an exception or returns null,
when trying to access the clipboard.

Fixes: QTBUG-80689
Change-Id: I92c134e2a002fc648ff966e15a19eb3307c428a1
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
(cherry picked from commit 287b570ad5c00eb491f86eab0c4b8d3f6d96f666)
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Mike Achtelik 2020-01-22 13:17:20 +01:00 committed by Lars Schmertmann
parent ca0dedf9ea
commit 08d6cb7673

View File

@ -724,54 +724,66 @@ public class QtNative
public static boolean hasClipboardText() public static boolean hasClipboardText()
{ {
if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) { try {
ClipData primaryClip = m_clipboardManager.getPrimaryClip(); if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
for (int i = 0; i < primaryClip.getItemCount(); ++i) ClipData primaryClip = m_clipboardManager.getPrimaryClip();
if (primaryClip.getItemAt(i).getText() != null) for (int i = 0; i < primaryClip.getItemCount(); ++i)
return true; if (primaryClip.getItemAt(i).getText() != null)
return true;
}
} catch (Exception e) {
Log.e(QtTAG, "Failed to get clipboard data", e);
} }
return false; return false;
} }
private static String getClipboardText() private static String getClipboardText()
{ {
if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) { try {
ClipData primaryClip = m_clipboardManager.getPrimaryClip(); if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
for (int i = 0; i < primaryClip.getItemCount(); ++i) ClipData primaryClip = m_clipboardManager.getPrimaryClip();
if (primaryClip.getItemAt(i).getText() != null) for (int i = 0; i < primaryClip.getItemCount(); ++i)
return primaryClip.getItemAt(i).getText().toString(); if (primaryClip.getItemAt(i).getText() != null)
return primaryClip.getItemAt(i).getText().toString();
}
} catch (Exception e) {
Log.e(QtTAG, "Failed to get clipboard data", e);
} }
return ""; return "";
} }
private static void updatePrimaryClip(ClipData clipData) private static void updatePrimaryClip(ClipData clipData)
{ {
if (m_usePrimaryClip) { try {
ClipData clip = m_clipboardManager.getPrimaryClip(); if (m_usePrimaryClip) {
if (Build.VERSION.SDK_INT >= 26) { ClipData clip = m_clipboardManager.getPrimaryClip();
if (m_addItemMethod == null) { if (Build.VERSION.SDK_INT >= 26) {
Class[] cArg = new Class[2]; if (m_addItemMethod == null) {
cArg[0] = ContentResolver.class; Class[] cArg = new Class[2];
cArg[1] = ClipData.Item.class; cArg[0] = ContentResolver.class;
try { cArg[1] = ClipData.Item.class;
m_addItemMethod = m_clipboardManager.getClass().getMethod("addItem", cArg); try {
} catch (Exception e) { m_addItemMethod = m_clipboardManager.getClass().getMethod("addItem", cArg);
} catch (Exception e) {
}
} }
} }
} if (m_addItemMethod != null) {
if (m_addItemMethod != null) { try {
try { m_addItemMethod.invoke(m_activity.getContentResolver(), clipData.getItemAt(0));
m_addItemMethod.invoke(m_activity.getContentResolver(), clipData.getItemAt(0)); } catch (Exception e) {
} catch (Exception e) { e.printStackTrace();
e.printStackTrace(); }
} else {
clip.addItem(clipData.getItemAt(0));
} }
m_clipboardManager.setPrimaryClip(clip);
} else { } else {
clip.addItem(clipData.getItemAt(0)); m_clipboardManager.setPrimaryClip(clipData);
m_usePrimaryClip = true;
} }
m_clipboardManager.setPrimaryClip(clip); } catch (Exception e) {
} else { Log.e(QtTAG, "Failed to set clipboard data", e);
m_clipboardManager.setPrimaryClip(clipData);
m_usePrimaryClip = true;
} }
} }
@ -785,22 +797,30 @@ public class QtNative
public static boolean hasClipboardHtml() public static boolean hasClipboardHtml()
{ {
if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) { try {
ClipData primaryClip = m_clipboardManager.getPrimaryClip(); if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
for (int i = 0; i < primaryClip.getItemCount(); ++i) ClipData primaryClip = m_clipboardManager.getPrimaryClip();
if (primaryClip.getItemAt(i).getHtmlText() != null) for (int i = 0; i < primaryClip.getItemCount(); ++i)
return true; if (primaryClip.getItemAt(i).getHtmlText() != null)
return true;
}
} catch (Exception e) {
Log.e(QtTAG, "Failed to get clipboard data", e);
} }
return false; return false;
} }
private static String getClipboardHtml() private static String getClipboardHtml()
{ {
if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) { try {
ClipData primaryClip = m_clipboardManager.getPrimaryClip(); if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
for (int i = 0; i < primaryClip.getItemCount(); ++i) ClipData primaryClip = m_clipboardManager.getPrimaryClip();
if (primaryClip.getItemAt(i).getHtmlText() != null) for (int i = 0; i < primaryClip.getItemCount(); ++i)
return primaryClip.getItemAt(i).getHtmlText().toString(); if (primaryClip.getItemAt(i).getHtmlText() != null)
return primaryClip.getItemAt(i).getHtmlText().toString();
}
} catch (Exception e) {
Log.e(QtTAG, "Failed to get clipboard data", e);
} }
return ""; return "";
} }
@ -816,11 +836,15 @@ public class QtNative
public static boolean hasClipboardUri() public static boolean hasClipboardUri()
{ {
if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) { try {
ClipData primaryClip = m_clipboardManager.getPrimaryClip(); if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
for (int i = 0; i < primaryClip.getItemCount(); ++i) ClipData primaryClip = m_clipboardManager.getPrimaryClip();
if (primaryClip.getItemAt(i).getUri() != null) for (int i = 0; i < primaryClip.getItemCount(); ++i)
return true; if (primaryClip.getItemAt(i).getUri() != null)
return true;
}
} catch (Exception e) {
Log.e(QtTAG, "Failed to get clipboard data", e);
} }
return false; return false;
} }
@ -828,11 +852,15 @@ public class QtNative
private static String[] getClipboardUris() private static String[] getClipboardUris()
{ {
ArrayList<String> uris = new ArrayList<String>(); ArrayList<String> uris = new ArrayList<String>();
if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) { try {
ClipData primaryClip = m_clipboardManager.getPrimaryClip(); if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
for (int i = 0; i < primaryClip.getItemCount(); ++i) ClipData primaryClip = m_clipboardManager.getPrimaryClip();
if (primaryClip.getItemAt(i).getUri() != null) for (int i = 0; i < primaryClip.getItemCount(); ++i)
uris.add(primaryClip.getItemAt(i).getUri().toString()); if (primaryClip.getItemAt(i).getUri() != null)
uris.add(primaryClip.getItemAt(i).getUri().toString());
}
} catch (Exception e) {
Log.e(QtTAG, "Failed to get clipboard data", e);
} }
String[] strings = new String[uris.size()]; String[] strings = new String[uris.size()];
strings = uris.toArray(strings); strings = uris.toArray(strings);