diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt index 58111c6870..2cf4e0f86d 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt @@ -102,19 +102,7 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH binding.messageQuote.quotedChatMessageView.visibility = View.GONE } - val readStatusDrawableInt = when (message.readStatus) { - ReadStatus.READ -> R.drawable.ic_check_all - ReadStatus.SENT -> R.drawable.ic_check - else -> null - } - - val readStatusContentDescriptionString = when (message.readStatus) { - ReadStatus.READ -> context?.resources?.getString(R.string.nc_message_read) - ReadStatus.SENT -> context?.resources?.getString(R.string.nc_message_sent) - else -> null - } - - readStatusDrawableInt?.let { drawableInt -> + readStatusDrawableInt(message)?.let { drawableInt -> ResourcesCompat.getDrawable(context!!.resources, drawableInt, null)?.let { binding.checkMark.setImageDrawable(it) binding.checkMark.setColorFilter( @@ -123,7 +111,7 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH } } - binding.checkMark.setContentDescription(readStatusContentDescriptionString) + binding.checkMark.setContentDescription(readStatusContentDescriptionString(message)) itemView.setTag(MessageSwipeCallback.REPLYABLE_VIEW_TAG, message.replyable) @@ -146,6 +134,24 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH commonMessageInterface.onClickReaction(chatMessage, emoji) } + private fun readStatusContentDescriptionString(message: ChatMessage) = + when (message.readStatus) { + ReadStatus.READ -> context?.resources?.getString(R.string.nc_message_read) + ReadStatus.SENT -> context?.resources?.getString(R.string.nc_message_sent) + ReadStatus.SENDING -> context?.resources?.getString(R.string.nc_message_sending) + ReadStatus.FAILED -> context?.resources?.getString(R.string.nc_message_send_error) + else -> null + } + + private fun readStatusDrawableInt(message: ChatMessage) = + when (message.readStatus) { + ReadStatus.READ -> R.drawable.ic_check_all + ReadStatus.SENT -> R.drawable.ic_check + ReadStatus.SENDING -> R.drawable.ic_sending + ReadStatus.FAILED -> R.drawable.ic_warning_white + else -> null + } + private fun processParentMessage(message: ChatMessage) { val parentChatMessage = message.parentMessage val textColor = viewThemeUtils.getScheme(binding.messageQuote.quotedMessage.context).onSurfaceVariant diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 7f870d1cfc..1ff8219a86 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -207,6 +207,7 @@ import retrofit2.Response import java.io.File import java.io.IOException import java.net.HttpURLConnection +import java.security.MessageDigest import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -2120,6 +2121,46 @@ class ChatController(args: Bundle) : } private fun sendMessage(message: CharSequence, replyTo: Int?, sendWithoutNotification: Boolean) { + val messObj = ChatMessage() + messObj.message = message.toString() + messObj.activeUser = conversationUser + val tsLong = System.currentTimeMillis() / 1000 + messObj.timestamp = tsLong + messObj.jsonMessageId = 0 - tsLong.toInt() + + messObj.readStatus = ReadStatus.SENDING + + if (conversationUser!!.userId != "?") { + // Logged in user + messObj.actorType = "users" + messObj.actorId = conversationUser.userId + messObj.actorDisplayName = conversationUser.username + } else if (currentConversation!!.actorType != null) { + // API v3 or later + messObj.actorType = currentConversation!!.actorType + messObj.actorId = currentConversation!!.actorId + messObj.actorDisplayName = "" + } else { + // API v1 or v2 as a guest + messObj.actorType = "guests" + + val messageDigest: MessageDigest = MessageDigest.getInstance("SHA-1") + val digest: ByteArray = messageDigest.digest(currentConversation!!.sessionId!!.toByteArray()) + val sha1: StringBuilder = StringBuilder() + val i = digest.iterator() + while (i.hasNext()) { + sha1.append(String.format("%02X", i.next())) + } + + messObj.actorId = sha1.toString() + messObj.actorDisplayName = "" + } + + adapter!!.addToStart( + messObj, + true + ) + if (conversationUser != null) { val apiVersion = ApiUtils.getChatApiVersion(conversationUser, intArrayOf(1)) @@ -2140,6 +2181,8 @@ class ChatController(args: Bundle) : @Suppress("Detekt.TooGenericExceptionCaught") override fun onNext(genericOverall: GenericOverall) { + adapter!!.delete(messObj) + myFirstMessage = message try { @@ -2156,6 +2199,11 @@ class ChatController(args: Bundle) : } override fun onError(e: Throwable) { + Log.e(TAG, "An error occured while sending the chat message: " + e.message) + + messObj.readStatus = ReadStatus.FAILED + adapter!!.updateAndMoveToStart(messObj) + if (e is HttpException) { val code = e.code() if (code.toString().startsWith("2")) { @@ -2996,7 +3044,13 @@ class ChatController(args: Bundle) : fun replyPrivately(message: IMessage?) { val apiVersion = - ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1)) + ApiUtils.getConversationApiVersion( + conversationUser, + intArrayOf( + ApiUtils.APIv4, + 1 + ) + ) val retrofitBucket = ApiUtils.getRetrofitBucketForCreateRoom( apiVersion, conversationUser?.baseUrl, @@ -3058,8 +3112,7 @@ class ChatController(args: Bundle) : Log.e(TAG, e.message, e) } - override fun onComplete() { - // unused atm + override fun onComplete() { // unused atm } }) } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/chat/ReadStatus.kt b/app/src/main/java/com/nextcloud/talk/models/json/chat/ReadStatus.kt index d913689950..2fb1556edf 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/chat/ReadStatus.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/chat/ReadStatus.kt @@ -20,5 +20,9 @@ package com.nextcloud.talk.models.json.chat enum class ReadStatus { - NONE, SENT, READ + NONE, + SENT, + READ, + SENDING, + FAILED } diff --git a/app/src/main/res/drawable/ic_sending.xml b/app/src/main/res/drawable/ic_sending.xml new file mode 100644 index 0000000000..5893394f43 --- /dev/null +++ b/app/src/main/res/drawable/ic_sending.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 40ec2036ed..ba2f015945 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -339,6 +339,8 @@ Message read Message sent Failed to send message: + Message sending + Error while sending Remote audio off Add attachment Recent