From 3e1674cb0be43d5dcffe5601fc05901bab85ec07 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Mon, 2 Apr 2018 14:51:09 +0200 Subject: [PATCH] Add copy/share menu to links --- .../ui/chat/messages/MessageAdapter.kt | 21 +++++++--- .../ui/chat/messages/MessageListFragment.kt | 39 ++++++++++++++++++- app/src/main/res/menu/context_link.xml | 11 ++++++ 3 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/menu/context_link.xml diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt index 2d9731451..d7a5dcdbd 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt @@ -29,7 +29,8 @@ class MessageAdapter( private val messageRenderer: MessageRenderer, private val clickListener: ((FormattedMessage) -> Unit)? = null, private val selectionListener: ((FormattedMessage) -> Unit)? = null, - private val expansionListener: ((QuasselDatabase.DatabaseMessage) -> Unit)? = null + private val expansionListener: ((QuasselDatabase.DatabaseMessage) -> Unit)? = null, + private val urlLongClickListener: ((TextView, String) -> Boolean)? = null ) : PagedListAdapter<DisplayMessage, MessageAdapter.QuasselMessageViewHolder>( object : DiffUtil.ItemCallback<DisplayMessage>() { override fun areItemsTheSame(oldItem: DisplayMessage, newItem: DisplayMessage) = @@ -38,6 +39,13 @@ class MessageAdapter( override fun areContentsTheSame(oldItem: DisplayMessage, newItem: DisplayMessage) = oldItem == newItem }) { + private val movementMethod = BetterLinkMovementMethod.newInstance() + + init { + movementMethod.setOnLinkLongClickListener { textView, url -> + urlLongClickListener?.invoke(textView, url) ?: false + } + } private val messageCache = LruCache<DisplayMessage.Tag, FormattedMessage>(512) @@ -99,7 +107,8 @@ class MessageAdapter( ), clickListener, selectionListener, - expansionListener + expansionListener, + movementMethod ) messageRenderer.init(viewHolder, messageType, hasHighlight, isFollowUp) return viewHolder @@ -115,7 +124,8 @@ class MessageAdapter( itemView: View, clickListener: ((FormattedMessage) -> Unit)? = null, selectionListener: ((FormattedMessage) -> Unit)? = null, - expansionListener: ((QuasselDatabase.DatabaseMessage) -> Unit)? = null + expansionListener: ((QuasselDatabase.DatabaseMessage) -> Unit)? = null, + movementMethod: BetterLinkMovementMethod ) : RecyclerView.ViewHolder(itemView) { @BindView(R.id.time_left) @JvmField @@ -172,9 +182,8 @@ class MessageAdapter( init { ButterKnife.bind(this, itemView) - - content?.movementMethod = BetterLinkMovementMethod.getInstance() - combined?.movementMethod = BetterLinkMovementMethod.getInstance() + content?.movementMethod = movementMethod + combined?.movementMethod = movementMethod itemView.setOnClickListener(localClickListener) itemView.setOnLongClickListener(localLongClickListener) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt index 0d9a20d67..777086ec9 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt @@ -10,6 +10,7 @@ import android.os.Bundle import android.support.design.widget.FloatingActionButton import android.support.v4.widget.SwipeRefreshLayout import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.PopupMenu import android.support.v7.widget.RecyclerView import android.text.SpannableStringBuilder import android.view.* @@ -97,7 +98,7 @@ class MessageListFragment : ServiceBoundFragment() { else builder - val clipboard = requireActivity().systemService<ClipboardManager>() + val clipboard = requireContext().systemService<ClipboardManager>() val clip = ClipData.newPlainText(null, data) clipboard.primaryClip = clip actionMode?.finish() @@ -174,6 +175,7 @@ class MessageListFragment : ServiceBoundFragment() { linearLayoutManager = LinearLayoutManager(context) linearLayoutManager.reverseLayout = true + var linkMenu: PopupMenu? = null adapter = MessageAdapter( messageRenderer, { msg -> @@ -190,6 +192,41 @@ class MessageListFragment : ServiceBoundFragment() { if (!viewModel.selectedMessagesToggle(msg.id, msg)) { actionMode?.finish() } + }, + null, + { textView, url -> + if (linkMenu == null) { + linkMenu = PopupMenu(requireContext(), textView).also { menu -> + linkMenu?.dismiss() + menu.menuInflater.inflate(R.menu.context_link, menu.menu) + menu.setOnMenuItemClickListener { + when (it.itemId) { + R.id.action_copy -> { + val clipboard = requireContext().systemService<ClipboardManager>() + val clip = ClipData.newPlainText(null, url) + clipboard.primaryClip = clip + menu.dismiss() + linkMenu = null + true + } + R.id.action_share -> { + val intent = Intent(Intent.ACTION_SEND) + intent.type = "text/plain" + intent.putExtra(Intent.EXTRA_TEXT, url) + requireContext().startActivity( + Intent.createChooser(intent, requireContext().getString(R.string.label_share)) + ) + menu.dismiss() + linkMenu = null + true + } + else -> false + } + } + menu.show() + } + } + true } ) messageList.adapter = adapter diff --git a/app/src/main/res/menu/context_link.xml b/app/src/main/res/menu/context_link.xml new file mode 100644 index 000000000..bfe7c61d9 --- /dev/null +++ b/app/src/main/res/menu/context_link.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:id="@+id/action_copy" + android:icon="@drawable/ic_copy" + android:title="@string/label_copy" /> + <item + android:id="@+id/action_share" + android:icon="@drawable/ic_share" + android:title="@string/label_share" /> +</menu> -- GitLab