Add editor name and message timestamp to MessageActionsDialog

Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
This commit is contained in:
sowjanyakch 2024-02-09 10:03:57 +01:00
parent 716a1f900d
commit a67be70eaa
7 changed files with 175 additions and 18 deletions

View File

@ -113,15 +113,13 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
binding.messageText.text = processedMessageText
if (message.parentMessage?.id != null && message.systemMessageType == ChatMessage.SystemMessageType
.MESSAGE_EDITED
) {
if (message.lastEditTimestamp != 0L && !message.isDeleted) {
binding.messageType.visibility = View.VISIBLE
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.lastEditTimestamp)
} else {
binding.messageType.visibility = View.GONE
}
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
}
// parent message handling
if (!message.isDeleted && message.parentMessage != null) {
@ -244,6 +242,12 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
}
}
fun updateMessage(message: ChatMessage) {
binding.messageText.text = message.message
binding.messageType.visibility = View.VISIBLE
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.lastEditTimestamp)
}
fun assignCommonMessageInterface(commonMessageInterface: CommonMessageInterface) {
this.commonMessageInterface = commonMessageInterface
}

View File

@ -100,18 +100,17 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH
setBubbleOnChatMessage(message)
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
if (message.parentMessage?.id != null && message.systemMessageType == ChatMessage.SystemMessageType
.MESSAGE_EDITED
) {
binding.messageType.visibility = View.VISIBLE
} else {
binding.messageType.visibility = View.GONE
}
binding.messageTime.layoutParams = layoutParams
viewThemeUtils.platform.colorTextView(binding.messageText, ColorRole.ON_SURFACE_VARIANT)
binding.messageText.text = processedMessageText
if (message.lastEditTimestamp != 0L && !message.isDeleted) {
binding.messageType.visibility = View.VISIBLE
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.lastEditTimestamp)
} else {
binding.messageType.visibility = View.GONE
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
}
// parent message handling
if (!message.isDeleted && message.parentMessage != null) {

View File

@ -922,6 +922,13 @@ class ChatActivity :
message.message = messageEdited.ocs?.data?.parentMessage?.text
adapter?.update(message)
adapter?.notifyDataSetChanged()
// val inflater = LayoutInflater.from(context)
// val outgoingTextViewLayout = inflater.inflate(R.layout.item_custom_incoming_text_message, null)
// val messageType = outgoingTextViewLayout.findViewById<TextView>(R.id.messageType)
// val messageTime = outgoingTextViewLayout.findViewById<TextView>(R.id.messageTime)
// messageType.visibility = View.VISIBLE
// messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.lastEditTimestamp)
clearEditUI()
}
@ -2791,8 +2798,9 @@ class ChatActivity :
}
}
private fun uploadFile(fileUri: String, isVoiceMessage: Boolean, caption: String = "") {
private fun uploadFile(fileUri: String, isVoiceMessage: Boolean, caption: String = "", token: String = "") {
var metaData = ""
var room = ""
if (!participantPermissions.hasChatPermission()) {
Log.w(TAG, "uploading file(s) is forbidden because of missing attendee permissions")
@ -2807,11 +2815,13 @@ class ChatActivity :
metaData = "{\"caption\":\"$caption\"}"
}
if (token == "") room = roomToken else room = token
try {
require(fileUri.isNotEmpty())
UploadAndShareFilesWorker.upload(
fileUri,
roomToken,
room,
currentConversation?.displayName!!,
metaData
)
@ -4287,6 +4297,82 @@ class ChatActivity :
}
}
fun shareToNotes(message: ChatMessage, roomToken: String) {
val apiVersion = ApiUtils.getChatApiVersion(conversationUser, intArrayOf(1))
val type = message.getCalculateMessageType()
var shareUri: Uri? = null
var data: HashMap<String?, String?>?
var metaData: String = ""
var objectId: String = ""
if (message.hasFileAttachment()) {
val filename = message.selectedIndividualHashMap!!["name"]
path = applicationContext.cacheDir.absolutePath + "/" + filename
shareUri = FileProvider.getUriForFile(
this,
BuildConfig.APPLICATION_ID,
File(path)
)
this.grantUriPermission(
applicationContext.packageName,
shareUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
)
} else if (message.hasGeoLocation()) {
data = message.messageParameters?.get("object")
objectId = data?.get("id")!!
val name = data.get("name")!!
val lat = data.get("latitude")!!
val lon = data.get("longitude")!!
metaData =
"{\"type\":\"geo-location\",\"id\":\"geo:$lat,$lon\",\"latitude\":\"$lat\"," +
"\"longitude\":\"$lon\",\"name\":\"$name\"}"
}
when (type) {
ChatMessage.MessageType.VOICE_MESSAGE -> {
uploadFile(shareUri.toString(), true, token = roomToken)
Snackbar.make(binding.root, R.string.nc_message_sent, Snackbar.LENGTH_SHORT).show()
}
ChatMessage.MessageType.SINGLE_NC_ATTACHMENT_MESSAGE -> {
val caption = if (message.message != "{file}") message.message else ""
if (null != shareUri) {
try {
context.contentResolver.openInputStream(shareUri)?.close()
uploadFile(shareUri.toString(), false, caption!!, roomToken)
Snackbar.make(binding.root, R.string.nc_message_sent, Snackbar.LENGTH_SHORT).show()
} catch (e: java.lang.Exception) {
Log.w(TAG, "File corresponding to the uri does not exist " + shareUri.toString())
downloadFileToCache(message, false) {
uploadFile(shareUri.toString(), false, caption!!, roomToken)
Snackbar.make(binding.root, R.string.nc_message_sent, Snackbar.LENGTH_SHORT).show()
}
}
}
}
ChatMessage.MessageType.SINGLE_NC_GEOLOCATION_MESSAGE -> {
chatViewModel.shareLocationToNotes(
credentials!!,
ApiUtils.getUrlToSendLocation(apiVersion, conversationUser!!.baseUrl, roomToken),
"geo-location",
objectId,
metaData
)
Snackbar.make(binding.root, R.string.nc_message_sent, Snackbar.LENGTH_SHORT).show()
}
ChatMessage.MessageType.REGULAR_TEXT_MESSAGE -> {
chatViewModel.shareToNotes(
credentials!!,
ApiUtils.getUrlForChat(apiVersion, conversationUser!!.baseUrl, roomToken),
message.message!!,
conversationUser!!.displayName!!
)
Snackbar.make(binding.root, R.string.nc_message_sent, Snackbar.LENGTH_SHORT).show()
}
else -> {}
}
}
fun openInFilesApp(message: ChatMessage) {
val keyID = message.selectedIndividualHashMap!![PreviewMessageViewHolder.KEY_ID]
val link = message.selectedIndividualHashMap!!["link"]

View File

@ -121,6 +121,18 @@ data class ChatMessage(
@JsonField(name = ["markdown"])
var renderMarkdown: Boolean? = null,
@JsonField(name = ["lastEditActorDisplayName"])
var lastEditActorDisplayName: String? = null,
@JsonField(name = ["lastEditActorId"])
var lastEditActorId: String? = null,
@JsonField(name = ["lastEditActorType"])
var lastEditActorType: String? = null,
@JsonField(name = ["lastEditTimestamp"])
var lastEditTimestamp: Long = 0,
var isDownloadingVoiceMessage: Boolean = false,
var resetVoiceMessage: Boolean = false,

View File

@ -51,6 +51,7 @@ import com.nextcloud.talk.repositories.reactions.ReactionsRepository
import com.nextcloud.talk.ui.theme.ViewThemeUtils
import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.ConversationUtils
import com.nextcloud.talk.utils.DateUtils
import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew
import com.vanniktech.emoji.EmojiPopup
import com.vanniktech.emoji.EmojiTextView
@ -78,6 +79,9 @@ class MessageActionsDialog(
@Inject
lateinit var reactionsRepository: ReactionsRepository
@Inject
lateinit var dateUtils: DateUtils
private lateinit var dialogMessageActionsBinding: DialogMessageActionsBinding
private lateinit var popup: EmojiPopup
@ -88,6 +92,11 @@ class MessageActionsDialog(
private val messageHasRegularText = ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message
.getCalculateMessageType() && !message.isDeleted
private val isMessageEditable = CapabilitiesUtilNew.hasSpreedFeatureCapability(
user,
"edit-messages"
) && !message.isDeleted
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
NextcloudTalkApplication.sharedApplication?.componentApplication?.inject(this)
@ -129,6 +138,7 @@ class MessageActionsDialog(
ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() &&
CapabilitiesUtilNew.isTranslationsSupported(user)
)
initMenuEditorDetails(message.lastEditTimestamp != 0L && isMessageEditable)
initMenuReplyToMessage(message.replyable && hasChatPermission)
initMenuReplyPrivately(
message.replyable &&
@ -136,7 +146,7 @@ class MessageActionsDialog(
hasUserActorId(message) &&
currentConversation?.type != ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL
)
initMenuEditMessage(CapabilitiesUtilNew.hasSpreedFeatureCapability(user, "edit-messages"))
initMenuEditMessage(isMessageEditable)
initMenuDeleteMessage(showMessageDeletionButton)
initMenuForwardMessage(
ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() &&
@ -318,13 +328,13 @@ class MessageActionsDialog(
dismiss()
}
}
dialogMessageActionsBinding.menuDeleteMessage.visibility = getVisibility(visible)
}
private fun initMenuEditMessage(visible: Boolean) {
dialogMessageActionsBinding.menuEditMessage.setOnClickListener {
chatActivity.editMessage(message)
Log.d("EDIT MESSAGE", "$message")
dismiss()
}
@ -353,6 +363,16 @@ class MessageActionsDialog(
dialogMessageActionsBinding.menuReplyToMessage.visibility = getVisibility(visible)
}
private fun initMenuEditorDetails(showEditorDetails: Boolean) {
if (showEditorDetails) {
val editedTime = dateUtils.getLocalTimeStringFromTimestamp(message.lastEditTimestamp)
val editorName = "Edited by " + message.lastEditActorDisplayName
dialogMessageActionsBinding.editorName.setText(editorName)
dialogMessageActionsBinding.editedTime.setText(editedTime)
}
dialogMessageActionsBinding.menuMessageEditedInfo.visibility = getVisibility(showEditorDetails)
}
private fun initMenuItemCopy(visible: Boolean) {
if (visible) {
dialogMessageActionsBinding.menuCopyMessage.setOnClickListener {

View File

@ -127,6 +127,41 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/menu_message_edited_info"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_sheet_item_height"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/editor_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:paddingStart="@dimen/standard_double_padding"
android:paddingEnd="@dimen/standard_padding"
tools:text="@string/nc_edited_by_admin"
android:textAlignment="viewStart"
android:textColor="@color/high_emphasis_text"
android:textSize="@dimen/bottom_sheet_text_size" />
<TextView
android:id="@+id/edited_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:paddingStart="@dimen/standard_double_padding"
android:paddingEnd="@dimen/standard_padding"
tools:text="12:30 AM"
android:textAlignment="viewStart"
android:textColor="@color/high_emphasis_text"
android:textSize="@dimen/bottom_sheet_text_size" />
</LinearLayout>
<LinearLayout
android:id="@+id/menu_reply_to_message"
android:layout_width="match_parent"

View File

@ -787,7 +787,7 @@ How to translate with transifex:
<string name="languages_error_title">Retrieval failed</string>
<string name="languages_error_message">Languages could not be retrieved</string>
<string name="edit_message_icon_description">Edit Message Icon</string>
<string name="nc_edit_message">Edit message</string>
<string name="nc_edit_message">Edit</string>
<string name="nc_send_edit_message">Send Edit Message</string>
<string name="nc_clear_edit_message">Clear Edit Message</string>
<string name="edit_error_24_hours_old_message">Cannot Edit Messages older than 24 hours</string>
@ -796,4 +796,5 @@ How to translate with transifex:
<string name="hint_edited_message">(edited)</string>
<string name="nc_conversation_not_found">Conversation not found</string>
<string name="add_to_notes">Add to Notes</string>
<string name="nc_edited_by_admin">Edited by admin</string>
</resources>