Unify copyToClipboard

This is motivated by not showing the toast on Android 13 and above.
See https://developer.android.com/develop/ui/views/touch-and-input/copy-paste#duplicate-notifications.
This commit is contained in:
Thore Goebel 2023-06-16 20:42:24 +02:00
parent c15efff72c
commit d1015cb50a
5 changed files with 17 additions and 54 deletions

View file

@ -460,12 +460,7 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra
Log.d(TAG, "Copying topic URL $url to clipboard ") Log.d(TAG, "Copying topic URL $url to clipboard ")
runOnUiThread { runOnUiThread {
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager copyToClipboard(this, "topic address", url)
val clip = ClipData.newPlainText("topic address", url)
clipboard.setPrimaryClip(clip)
Toast
.makeText(this, getString(R.string.detail_copied_to_clipboard_message), Toast.LENGTH_LONG)
.show()
} }
} }
@ -639,13 +634,9 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra
} }
} }
} else { } else {
copyToClipboard(notification) runOnUiThread {
} copyToClipboard(this, "notification", decodeMessage(notification))
} }
private fun copyToClipboard(notification: Notification) {
runOnUiThread {
copyToClipboard(this, notification)
} }
} }
@ -702,12 +693,7 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra
}.orEmpty() }.orEmpty()
} }
runOnUiThread { runOnUiThread {
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager copyToClipboard(this@DetailActivity, "notifications", content)
val clip = ClipData.newPlainText("notifications", content)
clipboard.setPrimaryClip(clip)
Toast
.makeText(this@DetailActivity, getString(R.string.detail_copied_to_clipboard_message), Toast.LENGTH_LONG)
.show()
finishActionMode() finishActionMode()
} }
} }

View file

@ -281,12 +281,14 @@ class DetailAdapter(private val activity: Activity, private val lifecycleScope:
openItem.setOnMenuItemClickListener { openFile(context, attachment) } openItem.setOnMenuItemClickListener { openFile(context, attachment) }
saveFileItem.setOnMenuItemClickListener { saveFile(context, attachment) } saveFileItem.setOnMenuItemClickListener { saveFile(context, attachment) }
deleteItem.setOnMenuItemClickListener { deleteFile(context, notification, attachment) } deleteItem.setOnMenuItemClickListener { deleteFile(context, notification, attachment) }
copyUrlItem.setOnMenuItemClickListener { copyUrl(context, attachment) } copyUrlItem.setOnMenuItemClickListener { copyToClipboard(context, "attachment url", attachment.url); true }
downloadItem.setOnMenuItemClickListener { downloadFile(context, notification) } downloadItem.setOnMenuItemClickListener { downloadFile(context, notification) }
cancelItem.setOnMenuItemClickListener { cancelDownload(context, notification) } cancelItem.setOnMenuItemClickListener { cancelDownload(context, notification) }
} }
if (hasClickLink) { if (hasClickLink) {
copyContentsItem.setOnMenuItemClickListener { copyContents(context, notification) } copyContentsItem.setOnMenuItemClickListener {
copyToClipboard(context, "notification", decodeMessage(notification)); true
}
} }
openItem.isVisible = hasAttachment && attachmentExists openItem.isVisible = hasAttachment && attachmentExists
downloadItem.isVisible = hasAttachment && !attachmentExists && !expired && !inProgress downloadItem.isVisible = hasAttachment && !attachmentExists && !expired && !inProgress
@ -480,21 +482,6 @@ class DetailAdapter(private val activity: Activity, private val lifecycleScope:
return true return true
} }
private fun copyUrl(context: Context, attachment: Attachment): Boolean {
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("attachment url", attachment.url)
clipboard.setPrimaryClip(clip)
Toast
.makeText(context, context.getString(R.string.detail_item_menu_copy_url_copied), Toast.LENGTH_LONG)
.show()
return true
}
private fun copyContents(context: Context, notification: Notification): Boolean {
copyToClipboard(context, notification)
return true
}
private fun runAction(context: Context, notification: Notification, action: Action): Boolean { private fun runAction(context: Context, notification: Notification, action: Action): Boolean {
when (action.action) { when (action.action) {
ACTION_VIEW -> runViewAction(context, action) ACTION_VIEW -> runViewAction(context, action)

View file

@ -412,12 +412,7 @@ class DetailSettingsActivity : AppCompatActivity() {
topicUrlPref?.summary = topicUrl topicUrlPref?.summary = topicUrl
topicUrlPref?.onPreferenceClickListener = OnPreferenceClickListener { topicUrlPref?.onPreferenceClickListener = OnPreferenceClickListener {
val context = context ?: return@OnPreferenceClickListener false val context = context ?: return@OnPreferenceClickListener false
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager copyToClipboard(context, "topic url", topicUrl)
val clip = ClipData.newPlainText("topic url", topicUrl)
clipboard.setPrimaryClip(clip)
Toast
.makeText(context, getString(R.string.detail_settings_about_topic_url_copied_to_clipboard_message), Toast.LENGTH_LONG)
.show()
true true
} }
} }

View file

@ -552,12 +552,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere
versionPref?.summary = version versionPref?.summary = version
versionPref?.onPreferenceClickListener = OnPreferenceClickListener { versionPref?.onPreferenceClickListener = OnPreferenceClickListener {
val context = context ?: return@OnPreferenceClickListener false val context = context ?: return@OnPreferenceClickListener false
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager copyToClipboard(context, "ntfy version", version)
val clip = ClipData.newPlainText("ntfy version", version)
clipboard.setPrimaryClip(clip)
Toast
.makeText(context, getString(R.string.settings_about_version_copied_to_clipboard_message), Toast.LENGTH_LONG)
.show()
true true
} }
} }

View file

@ -481,14 +481,14 @@ fun ensureSafeNewFile(dir: File, name: String): File {
throw Exception("Cannot find safe file") throw Exception("Cannot find safe file")
} }
fun copyToClipboard(context: Context, notification: Notification) { fun copyToClipboard(context: Context, label: String, message: String) {
val message = decodeMessage(notification)
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("notification message", message) val clip = ClipData.newPlainText(label, message)
clipboard.setPrimaryClip(clip) clipboard.setPrimaryClip(clip)
Toast if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) {
.makeText(context, context.getString(R.string.detail_copied_to_clipboard_message), Toast.LENGTH_LONG) val copied = context.getString(R.string.detail_copied_to_clipboard_message)
.show() Toast.makeText(context, copied, Toast.LENGTH_LONG).show()
}
} }
fun String.sha256(): String { fun String.sha256(): String {