Skip to content
Snippets Groups Projects
Commit 3e1674cb authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Add copy/share menu to links

parent 484f8a5e
Branches
Tags
No related merge requests found
...@@ -29,7 +29,8 @@ class MessageAdapter( ...@@ -29,7 +29,8 @@ class MessageAdapter(
private val messageRenderer: MessageRenderer, private val messageRenderer: MessageRenderer,
private val clickListener: ((FormattedMessage) -> Unit)? = null, private val clickListener: ((FormattedMessage) -> Unit)? = null,
private val selectionListener: ((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>( ) : PagedListAdapter<DisplayMessage, MessageAdapter.QuasselMessageViewHolder>(
object : DiffUtil.ItemCallback<DisplayMessage>() { object : DiffUtil.ItemCallback<DisplayMessage>() {
override fun areItemsTheSame(oldItem: DisplayMessage, newItem: DisplayMessage) = override fun areItemsTheSame(oldItem: DisplayMessage, newItem: DisplayMessage) =
...@@ -38,6 +39,13 @@ class MessageAdapter( ...@@ -38,6 +39,13 @@ class MessageAdapter(
override fun areContentsTheSame(oldItem: DisplayMessage, newItem: DisplayMessage) = override fun areContentsTheSame(oldItem: DisplayMessage, newItem: DisplayMessage) =
oldItem == newItem 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) private val messageCache = LruCache<DisplayMessage.Tag, FormattedMessage>(512)
...@@ -99,7 +107,8 @@ class MessageAdapter( ...@@ -99,7 +107,8 @@ class MessageAdapter(
), ),
clickListener, clickListener,
selectionListener, selectionListener,
expansionListener expansionListener,
movementMethod
) )
messageRenderer.init(viewHolder, messageType, hasHighlight, isFollowUp) messageRenderer.init(viewHolder, messageType, hasHighlight, isFollowUp)
return viewHolder return viewHolder
...@@ -115,7 +124,8 @@ class MessageAdapter( ...@@ -115,7 +124,8 @@ class MessageAdapter(
itemView: View, itemView: View,
clickListener: ((FormattedMessage) -> Unit)? = null, clickListener: ((FormattedMessage) -> Unit)? = null,
selectionListener: ((FormattedMessage) -> Unit)? = null, selectionListener: ((FormattedMessage) -> Unit)? = null,
expansionListener: ((QuasselDatabase.DatabaseMessage) -> Unit)? = null expansionListener: ((QuasselDatabase.DatabaseMessage) -> Unit)? = null,
movementMethod: BetterLinkMovementMethod
) : RecyclerView.ViewHolder(itemView) { ) : RecyclerView.ViewHolder(itemView) {
@BindView(R.id.time_left) @BindView(R.id.time_left)
@JvmField @JvmField
...@@ -172,9 +182,8 @@ class MessageAdapter( ...@@ -172,9 +182,8 @@ class MessageAdapter(
init { init {
ButterKnife.bind(this, itemView) ButterKnife.bind(this, itemView)
content?.movementMethod = movementMethod
content?.movementMethod = BetterLinkMovementMethod.getInstance() combined?.movementMethod = movementMethod
combined?.movementMethod = BetterLinkMovementMethod.getInstance()
itemView.setOnClickListener(localClickListener) itemView.setOnClickListener(localClickListener)
itemView.setOnLongClickListener(localLongClickListener) itemView.setOnLongClickListener(localLongClickListener)
......
...@@ -10,6 +10,7 @@ import android.os.Bundle ...@@ -10,6 +10,7 @@ import android.os.Bundle
import android.support.design.widget.FloatingActionButton import android.support.design.widget.FloatingActionButton
import android.support.v4.widget.SwipeRefreshLayout import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.PopupMenu
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.view.* import android.view.*
...@@ -97,7 +98,7 @@ class MessageListFragment : ServiceBoundFragment() { ...@@ -97,7 +98,7 @@ class MessageListFragment : ServiceBoundFragment() {
else else
builder builder
val clipboard = requireActivity().systemService<ClipboardManager>() val clipboard = requireContext().systemService<ClipboardManager>()
val clip = ClipData.newPlainText(null, data) val clip = ClipData.newPlainText(null, data)
clipboard.primaryClip = clip clipboard.primaryClip = clip
actionMode?.finish() actionMode?.finish()
...@@ -174,6 +175,7 @@ class MessageListFragment : ServiceBoundFragment() { ...@@ -174,6 +175,7 @@ class MessageListFragment : ServiceBoundFragment() {
linearLayoutManager = LinearLayoutManager(context) linearLayoutManager = LinearLayoutManager(context)
linearLayoutManager.reverseLayout = true linearLayoutManager.reverseLayout = true
var linkMenu: PopupMenu? = null
adapter = MessageAdapter( adapter = MessageAdapter(
messageRenderer, messageRenderer,
{ msg -> { msg ->
...@@ -190,6 +192,41 @@ class MessageListFragment : ServiceBoundFragment() { ...@@ -190,6 +192,41 @@ class MessageListFragment : ServiceBoundFragment() {
if (!viewModel.selectedMessagesToggle(msg.id, msg)) { if (!viewModel.selectedMessagesToggle(msg.id, msg)) {
actionMode?.finish() 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 messageList.adapter = adapter
......
<?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>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment