Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.util.Log
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import android.widget.ImageView
import androidx.core.content.ContextCompat
Expand Down Expand Up @@ -74,7 +76,7 @@ class IncomingDeckCardViewHolder(incomingView: View, payload: Any) :
var boardName: String? = null
var cardLink: String? = null

@SuppressLint("SetTextI18n")
@SuppressLint("SetTextI18n", "ClickableViewAccessibility")
override fun onBind(message: ChatMessage) {
super.onBind(message)
this.message = message
Expand All @@ -95,9 +97,22 @@ class IncomingDeckCardViewHolder(incomingView: View, payload: Any) :
// parent message handling
setParentMessageDataOnMessageItem(message)

binding.cardView.setOnLongClickListener { l: View? ->
commonMessageInterface.onOpenMessageActionsDialog(message)
true
binding.cardView.isLongClickable = true
val cardViewGestureDetector = GestureDetector(
context,
object : GestureDetector.SimpleOnGestureListener() {
override fun onLongPress(e: MotionEvent) {
commonMessageInterface.onOpenMessageActionsDialog(message)
}
override fun onDoubleTap(e: MotionEvent): Boolean {
commonMessageInterface.onOpenMessageActionsDialog(message)
return true
}
}
)
binding.cardView.setOnTouchListener { _, event ->
cardViewGestureDetector.onTouchEvent(event)
false
}

binding.cardView.setOnClickListener {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ package com.nextcloud.talk.adapters.messages

import android.annotation.SuppressLint
import android.content.Context
import android.text.Spanned
import android.util.Log
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import androidx.core.content.ContextCompat
import autodagger.AutoInjector
Expand Down Expand Up @@ -64,27 +67,14 @@ class IncomingLinkPreviewMessageViewHolder(incomingView: View, payload: Any) :

lateinit var commonMessageInterface: CommonMessageInterface

@SuppressLint("SetTextI18n")
@SuppressLint("SetTextI18n", "ClickableViewAccessibility")
override fun onBind(message: ChatMessage) {
super.onBind(message)
this.message = message
sharedApplication!!.componentApplication.inject(this)
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)

var processedMessageText = messageUtils.enrichChatMessageText(
binding.messageText.context,
message,
true,
viewThemeUtils
)

processedMessageText = messageUtils.processMessageParameters(
binding.messageText.context,
viewThemeUtils,
processedMessageText!!,
message,
itemView
)
val processedMessageText = processMessageText(message)

binding.messageText.text = processedMessageText

Expand All @@ -103,9 +93,22 @@ class IncomingLinkPreviewMessageViewHolder(incomingView: View, payload: Any) :
binding.referenceInclude,
itemView.context
)
binding.referenceInclude.referenceWrapper.setOnLongClickListener { l: View? ->
commonMessageInterface.onOpenMessageActionsDialog(message)
true
binding.referenceInclude.referenceWrapper.isLongClickable = true
val referenceWrapperGestureDetector = GestureDetector(
context,
object : GestureDetector.SimpleOnGestureListener() {
override fun onLongPress(e: MotionEvent) {
commonMessageInterface.onOpenMessageActionsDialog(message)
}
override fun onDoubleTap(e: MotionEvent): Boolean {
commonMessageInterface.onOpenMessageActionsDialog(message)
return true
}
}
)
binding.referenceInclude.referenceWrapper.setOnTouchListener { _, event ->
referenceWrapperGestureDetector.onTouchEvent(event)
false
}

itemView.setTag(R.string.replyable_message_view_tag, message.replyable)
Expand Down Expand Up @@ -134,6 +137,24 @@ class IncomingLinkPreviewMessageViewHolder(incomingView: View, payload: Any) :
)
}

private fun processMessageText(message: ChatMessage): Spanned? {
var processedMessageText = messageUtils.enrichChatMessageText(
binding.messageText.context,
message,
true,
viewThemeUtils
)

processedMessageText = messageUtils.processMessageParameters(
binding.messageText.context,
viewThemeUtils,
processedMessageText!!,
message,
itemView
)
return processedMessageText
}

private fun longClickOnReaction(chatMessage: ChatMessage) {
commonMessageInterface.onLongClickReactions(chatMessage)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@
*/
package com.nextcloud.talk.adapters.messages

import android.annotation.SuppressLint
import android.content.Context
import android.util.Log
import android.util.TypedValue
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
Expand Down Expand Up @@ -98,6 +101,7 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
processMessage(message, hasCheckboxes)
}

@SuppressLint("ClickableViewAccessibility")
@Suppress("LongMethod")
private fun processMessage(message: ChatMessage, hasCheckboxes: Boolean) {
var textSize = context.resources!!.getDimension(R.dimen.chat_text_size)
Expand Down Expand Up @@ -181,9 +185,22 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
View.GONE
}

binding.messageQuote.quotedChatMessageView.setOnLongClickListener { l: View? ->
commonMessageInterface.onOpenMessageActionsDialog(message)
true
binding.messageQuote.quotedChatMessageView.isLongClickable = true
val quotedChatMessageViewGestureDetector = GestureDetector(
context,
object : GestureDetector.SimpleOnGestureListener() {
override fun onLongPress(e: MotionEvent) {
commonMessageInterface.onOpenMessageActionsDialog(message)
}
override fun onDoubleTap(e: MotionEvent): Boolean {
commonMessageInterface.onOpenMessageActionsDialog(message)
return true
}
}
)
binding.messageQuote.quotedChatMessageView.setOnTouchListener { _, event ->
quotedChatMessageViewGestureDetector.onTouchEvent(event)
false
}

itemView.setTag(R.string.replyable_message_view_tag, message.replyable)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@ class IncomingVoiceMessageViewHolder(incomingView: View, payload: Any) :
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)

setAvatarAndAuthorOnMessageItem(message)

colorizeMessageBubble(message)

itemView.isSelected = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ package com.nextcloud.talk.adapters.messages
import android.annotation.SuppressLint
import android.content.Context
import android.util.Log
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import androidx.appcompat.content.res.AppCompatResources
import autodagger.AutoInjector
Expand Down Expand Up @@ -67,7 +69,7 @@ class OutcomingLinkPreviewMessageViewHolder(outcomingView: View, payload: Any) :

lateinit var commonMessageInterface: CommonMessageInterface

@SuppressLint("SetTextI18n")
@SuppressLint("SetTextI18n", "ClickableViewAccessibility")
override fun onBind(message: ChatMessage) {
super.onBind(message)
this.message = message
Expand All @@ -87,7 +89,6 @@ class OutcomingLinkPreviewMessageViewHolder(outcomingView: View, payload: Any) :
)

binding.messageText.text = processedMessageText

itemView.isSelected = false

// parent message handling
Expand All @@ -114,15 +115,23 @@ class OutcomingLinkPreviewMessageViewHolder(outcomingView: View, payload: Any) :

binding.checkMark.contentDescription = readStatusContentDescriptionString

LinkPreview().showLink(
message,
ncApi,
binding.referenceInclude,
itemView.context
LinkPreview().showLink(message, ncApi, binding.referenceInclude, itemView.context)
binding.referenceInclude.referenceWrapper.isLongClickable = true
val referenceWrapperGestureDetector = GestureDetector(
context,
object : GestureDetector.SimpleOnGestureListener() {
override fun onLongPress(e: MotionEvent) {
commonMessageInterface.onOpenMessageActionsDialog(message)
}
override fun onDoubleTap(e: MotionEvent): Boolean {
commonMessageInterface.onOpenMessageActionsDialog(message)
return true
}
}
)
binding.referenceInclude.referenceWrapper.setOnLongClickListener { l: View? ->
commonMessageInterface.onOpenMessageActionsDialog(message)
true
binding.referenceInclude.referenceWrapper.setOnTouchListener { _, event ->
referenceWrapperGestureDetector.onTouchEvent(event)
false
}

itemView.setTag(R.string.replyable_message_view_tag, message.replyable)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@
*/
package com.nextcloud.talk.adapters.messages

import android.annotation.SuppressLint
import android.content.Context
import android.util.Log
import android.util.TypedValue
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
Expand Down Expand Up @@ -102,6 +105,7 @@ class OutcomingTextMessageViewHolder(itemView: View) :
processMessage(message, hasCheckboxes)
}

@SuppressLint("ClickableViewAccessibility")
@Suppress("Detekt.LongMethod")
private fun processMessage(message: ChatMessage, hasCheckboxes: Boolean) {
var isBubbled = true
Expand Down Expand Up @@ -196,9 +200,22 @@ class OutcomingTextMessageViewHolder(itemView: View) :
View.GONE
}

binding.messageQuote.quotedChatMessageView.setOnLongClickListener { l: View? ->
commonMessageInterface.onOpenMessageActionsDialog(message)
true
binding.messageQuote.quotedChatMessageView.isLongClickable = true
val quotedChatMessageViewGestureDetector = GestureDetector(
context,
object : GestureDetector.SimpleOnGestureListener() {
override fun onLongPress(e: MotionEvent) {
commonMessageInterface.onOpenMessageActionsDialog(message)
}
override fun onDoubleTap(e: MotionEvent): Boolean {
commonMessageInterface.onOpenMessageActionsDialog(message)
return true
}
}
)
binding.messageQuote.quotedChatMessageView.setOnTouchListener { _, event ->
quotedChatMessageViewGestureDetector.onTouchEvent(event)
false
}

binding.checkMark.visibility = View.INVISIBLE
Expand Down
20 changes: 20 additions & 0 deletions app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.SystemClock
import android.provider.ContactsContract
import android.provider.MediaStore
import android.provider.Settings
Expand All @@ -39,6 +40,7 @@ import android.view.Gravity
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.ViewConfiguration
import android.view.ViewGroup
import android.view.WindowManager
import android.view.animation.AccelerateDecelerateInterpolator
Expand Down Expand Up @@ -263,6 +265,7 @@ class ChatActivity :
MessagesListAdapter.OnLoadMoreListener,
MessagesListAdapter.Formatter<Date>,
MessagesListAdapter.OnMessageViewLongClickListener<IMessage>,
MessagesListAdapter.OnMessageClickListener<IMessage>,
ContentChecker<ChatMessage>,
VoiceMessageInterface,
CommonMessageInterface,
Expand Down Expand Up @@ -386,6 +389,8 @@ class ChatActivity :
var credentials: String? = null
var currentConversation: ConversationModel? = null
var adapter: TalkMessagesListAdapter<ChatMessage>? = null
private var lastMessageClickTime = 0L
private var lastMessageId = ""
var mentionAutocomplete: Autocomplete<*>? = null
var layoutManager: LinearLayoutManager? = null
var pullChatMessagesPending = false
Expand Down Expand Up @@ -1644,6 +1649,7 @@ class ChatActivity :
adapter?.setLoadMoreListener(this)
adapter?.setDateHeadersFormatter { format(it) }
adapter?.setOnMessageViewLongClickListener { view, message -> onMessageViewLongClick(view, message) }
adapter?.setOnMessageClickListener { message -> onMessageClick(message) }

adapter?.registerViewClickListener(
R.id.playPauseBtn
Expand Down Expand Up @@ -4087,6 +4093,20 @@ class ChatActivity :
openMessageActionsDialog(message)
}

override fun onMessageClick(message: IMessage) {
val now = SystemClock.elapsedRealtime()
if (now - lastMessageClickTime < ViewConfiguration.getDoubleTapTimeout() &&
message.id?.equals(lastMessageId) == true
) {
openMessageActionsDialog(message)
lastMessageClickTime = 0L
lastMessageId = ""
} else {
lastMessageClickTime = now
lastMessageId = message.id
}
}

override fun onPreviewMessageLongClick(chatMessage: ChatMessage) {
onOpenMessageActionsDialog(chatMessage)
}
Expand Down
Loading