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