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