mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-19 11:39:42 +01:00
Add editor name and message timestamp to MessageActionsDialog
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
This commit is contained in:
parent
716a1f900d
commit
683f924556
@ -113,15 +113,13 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
|
|||||||
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
|
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
|
||||||
binding.messageText.text = processedMessageText
|
binding.messageText.text = processedMessageText
|
||||||
|
|
||||||
if (message.parentMessage?.id != null && message.systemMessageType == ChatMessage.SystemMessageType
|
if (message.lastEditTimestamp != 0L && !message.isDeleted) {
|
||||||
.MESSAGE_EDITED
|
|
||||||
) {
|
|
||||||
binding.messageType.visibility = View.VISIBLE
|
binding.messageType.visibility = View.VISIBLE
|
||||||
|
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.lastEditTimestamp)
|
||||||
} else {
|
} else {
|
||||||
binding.messageType.visibility = View.GONE
|
binding.messageType.visibility = View.GONE
|
||||||
}
|
|
||||||
|
|
||||||
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
|
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
|
||||||
|
}
|
||||||
|
|
||||||
// parent message handling
|
// parent message handling
|
||||||
if (!message.isDeleted && message.parentMessage != null) {
|
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) {
|
fun assignCommonMessageInterface(commonMessageInterface: CommonMessageInterface) {
|
||||||
this.commonMessageInterface = commonMessageInterface
|
this.commonMessageInterface = commonMessageInterface
|
||||||
}
|
}
|
||||||
|
@ -100,18 +100,17 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH
|
|||||||
setBubbleOnChatMessage(message)
|
setBubbleOnChatMessage(message)
|
||||||
|
|
||||||
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
|
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
|
binding.messageTime.layoutParams = layoutParams
|
||||||
viewThemeUtils.platform.colorTextView(binding.messageText, ColorRole.ON_SURFACE_VARIANT)
|
viewThemeUtils.platform.colorTextView(binding.messageText, ColorRole.ON_SURFACE_VARIANT)
|
||||||
binding.messageText.text = processedMessageText
|
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)
|
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
|
||||||
|
}
|
||||||
|
|
||||||
// parent message handling
|
// parent message handling
|
||||||
if (!message.isDeleted && message.parentMessage != null) {
|
if (!message.isDeleted && message.parentMessage != null) {
|
||||||
|
@ -922,6 +922,13 @@ class ChatActivity :
|
|||||||
message.message = messageEdited.ocs?.data?.parentMessage?.text
|
message.message = messageEdited.ocs?.data?.parentMessage?.text
|
||||||
adapter?.update(message)
|
adapter?.update(message)
|
||||||
adapter?.notifyDataSetChanged()
|
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()
|
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 metaData = ""
|
||||||
|
var room = ""
|
||||||
|
|
||||||
if (!participantPermissions.hasChatPermission()) {
|
if (!participantPermissions.hasChatPermission()) {
|
||||||
Log.w(TAG, "uploading file(s) is forbidden because of missing attendee permissions")
|
Log.w(TAG, "uploading file(s) is forbidden because of missing attendee permissions")
|
||||||
@ -2807,11 +2815,13 @@ class ChatActivity :
|
|||||||
metaData = "{\"caption\":\"$caption\"}"
|
metaData = "{\"caption\":\"$caption\"}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (token == "") room = roomToken else room = token
|
||||||
|
|
||||||
try {
|
try {
|
||||||
require(fileUri.isNotEmpty())
|
require(fileUri.isNotEmpty())
|
||||||
UploadAndShareFilesWorker.upload(
|
UploadAndShareFilesWorker.upload(
|
||||||
fileUri,
|
fileUri,
|
||||||
roomToken,
|
room,
|
||||||
currentConversation?.displayName!!,
|
currentConversation?.displayName!!,
|
||||||
metaData
|
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) {
|
fun openInFilesApp(message: ChatMessage) {
|
||||||
val keyID = message.selectedIndividualHashMap!![PreviewMessageViewHolder.KEY_ID]
|
val keyID = message.selectedIndividualHashMap!![PreviewMessageViewHolder.KEY_ID]
|
||||||
val link = message.selectedIndividualHashMap!!["link"]
|
val link = message.selectedIndividualHashMap!!["link"]
|
||||||
|
@ -121,6 +121,18 @@ data class ChatMessage(
|
|||||||
@JsonField(name = ["markdown"])
|
@JsonField(name = ["markdown"])
|
||||||
var renderMarkdown: Boolean? = null,
|
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 isDownloadingVoiceMessage: Boolean = false,
|
||||||
|
|
||||||
var resetVoiceMessage: Boolean = false,
|
var resetVoiceMessage: Boolean = false,
|
||||||
|
@ -51,6 +51,7 @@ import com.nextcloud.talk.repositories.reactions.ReactionsRepository
|
|||||||
import com.nextcloud.talk.ui.theme.ViewThemeUtils
|
import com.nextcloud.talk.ui.theme.ViewThemeUtils
|
||||||
import com.nextcloud.talk.utils.ApiUtils
|
import com.nextcloud.talk.utils.ApiUtils
|
||||||
import com.nextcloud.talk.utils.ConversationUtils
|
import com.nextcloud.talk.utils.ConversationUtils
|
||||||
|
import com.nextcloud.talk.utils.DateUtils
|
||||||
import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew
|
import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew
|
||||||
import com.vanniktech.emoji.EmojiPopup
|
import com.vanniktech.emoji.EmojiPopup
|
||||||
import com.vanniktech.emoji.EmojiTextView
|
import com.vanniktech.emoji.EmojiTextView
|
||||||
@ -78,6 +79,9 @@ class MessageActionsDialog(
|
|||||||
@Inject
|
@Inject
|
||||||
lateinit var reactionsRepository: ReactionsRepository
|
lateinit var reactionsRepository: ReactionsRepository
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var dateUtils: DateUtils
|
||||||
|
|
||||||
private lateinit var dialogMessageActionsBinding: DialogMessageActionsBinding
|
private lateinit var dialogMessageActionsBinding: DialogMessageActionsBinding
|
||||||
|
|
||||||
private lateinit var popup: EmojiPopup
|
private lateinit var popup: EmojiPopup
|
||||||
@ -88,6 +92,11 @@ class MessageActionsDialog(
|
|||||||
private val messageHasRegularText = ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message
|
private val messageHasRegularText = ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message
|
||||||
.getCalculateMessageType() && !message.isDeleted
|
.getCalculateMessageType() && !message.isDeleted
|
||||||
|
|
||||||
|
private val isMessageEditable = CapabilitiesUtilNew.hasSpreedFeatureCapability(
|
||||||
|
user,
|
||||||
|
"edit-messages"
|
||||||
|
) && !message.isDeleted
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
NextcloudTalkApplication.sharedApplication?.componentApplication?.inject(this)
|
NextcloudTalkApplication.sharedApplication?.componentApplication?.inject(this)
|
||||||
@ -129,6 +138,7 @@ class MessageActionsDialog(
|
|||||||
ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() &&
|
ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() &&
|
||||||
CapabilitiesUtilNew.isTranslationsSupported(user)
|
CapabilitiesUtilNew.isTranslationsSupported(user)
|
||||||
)
|
)
|
||||||
|
initMenuEditorDetails(message.lastEditTimestamp != 0L && isMessageEditable)
|
||||||
initMenuReplyToMessage(message.replyable && hasChatPermission)
|
initMenuReplyToMessage(message.replyable && hasChatPermission)
|
||||||
initMenuReplyPrivately(
|
initMenuReplyPrivately(
|
||||||
message.replyable &&
|
message.replyable &&
|
||||||
@ -136,7 +146,7 @@ class MessageActionsDialog(
|
|||||||
hasUserActorId(message) &&
|
hasUserActorId(message) &&
|
||||||
currentConversation?.type != ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL
|
currentConversation?.type != ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL
|
||||||
)
|
)
|
||||||
initMenuEditMessage(CapabilitiesUtilNew.hasSpreedFeatureCapability(user, "edit-messages"))
|
initMenuEditMessage(isMessageEditable)
|
||||||
initMenuDeleteMessage(showMessageDeletionButton)
|
initMenuDeleteMessage(showMessageDeletionButton)
|
||||||
initMenuForwardMessage(
|
initMenuForwardMessage(
|
||||||
ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() &&
|
ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() &&
|
||||||
@ -318,13 +328,13 @@ class MessageActionsDialog(
|
|||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dialogMessageActionsBinding.menuDeleteMessage.visibility = getVisibility(visible)
|
dialogMessageActionsBinding.menuDeleteMessage.visibility = getVisibility(visible)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initMenuEditMessage(visible: Boolean) {
|
private fun initMenuEditMessage(visible: Boolean) {
|
||||||
dialogMessageActionsBinding.menuEditMessage.setOnClickListener {
|
dialogMessageActionsBinding.menuEditMessage.setOnClickListener {
|
||||||
chatActivity.editMessage(message)
|
chatActivity.editMessage(message)
|
||||||
|
Log.d("EDIT MESSAGE", "$message")
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,6 +363,16 @@ class MessageActionsDialog(
|
|||||||
dialogMessageActionsBinding.menuReplyToMessage.visibility = getVisibility(visible)
|
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) {
|
private fun initMenuItemCopy(visible: Boolean) {
|
||||||
if (visible) {
|
if (visible) {
|
||||||
dialogMessageActionsBinding.menuCopyMessage.setOnClickListener {
|
dialogMessageActionsBinding.menuCopyMessage.setOnClickListener {
|
||||||
|
@ -127,6 +127,41 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical">
|
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
|
<LinearLayout
|
||||||
android:id="@+id/menu_reply_to_message"
|
android:id="@+id/menu_reply_to_message"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -787,7 +787,7 @@ How to translate with transifex:
|
|||||||
<string name="languages_error_title">Retrieval failed</string>
|
<string name="languages_error_title">Retrieval failed</string>
|
||||||
<string name="languages_error_message">Languages could not be retrieved</string>
|
<string name="languages_error_message">Languages could not be retrieved</string>
|
||||||
<string name="edit_message_icon_description">Edit Message Icon</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_send_edit_message">Send Edit Message</string>
|
||||||
<string name="nc_clear_edit_message">Clear 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>
|
<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="hint_edited_message">(edited)</string>
|
||||||
<string name="nc_conversation_not_found">Conversation not found</string>
|
<string name="nc_conversation_not_found">Conversation not found</string>
|
||||||
<string name="add_to_notes">Add to Notes</string>
|
<string name="add_to_notes">Add to Notes</string>
|
||||||
|
<string name="nc_edited_by_admin">Edited by admin</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
Reference in New Issue
Block a user