Skip to content

Commit

Permalink
prepare to replace no-internet-connection message handling (sorry Jul…
Browse files Browse the repository at this point in the history
…ius!!)

Signed-off-by: Marcel Hibbe <[email protected]>
  • Loading branch information
mahibi committed Dec 11, 2024
1 parent 3758641 commit a255b91
Show file tree
Hide file tree
Showing 7 changed files with 212 additions and 221 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -121,25 +121,25 @@ class OutcomingTextMessageViewHolder(itemView: View) :
}


// CoroutineScope(Dispatchers.Main).launch {
CoroutineScope(Dispatchers.Main).launch {
if (message.sendingFailed) {
updateStatus(
R.drawable.baseline_report_problem_24,
"failed"
)
// } else if (message.isTempMessage && !networkMonitor.isOnline.first()) {
// updateStatus(
// R.drawable.ic_signal_wifi_off_white_24dp,
// "offline"
// )
} else if (message.isTempMessage && !networkMonitor.isOnline.first()) {
updateStatus(
R.drawable.ic_signal_wifi_off_white_24dp,
"offline"
)
} else if (message.isTempMessage) {
updateSendingStatus()
} else if(message.readStatus == ReadStatus.READ){
updateStatus(R.drawable.ic_check_all, context.resources?.getString(R.string.nc_message_read))
} else if(message.readStatus == ReadStatus.SENT) {
updateStatus(R.drawable.ic_check, context.resources?.getString(R.string.nc_message_sent))
}
// }
}

itemView.setTag(R.string.replyable_message_view_tag, message.replyable)

Expand Down
69 changes: 34 additions & 35 deletions app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -573,21 +573,21 @@ class ChatActivity :
private fun initObservers() {
Log.d(TAG, "initObservers Called")

messageInputViewModel.messageQueueFlow.observe(this) { list ->
list.forEachIndexed { _, qMsg ->
val temporaryChatMessage = ChatMessage()
temporaryChatMessage.jsonMessageId = TEMPORARY_MESSAGE_ID_INT
temporaryChatMessage.actorId = TEMPORARY_MESSAGE_ID_STRING
temporaryChatMessage.timestamp = System.currentTimeMillis() / ONE_SECOND_IN_MILLIS
temporaryChatMessage.message = qMsg.message.toString()
temporaryChatMessage.tempMessageId = qMsg.id
temporaryChatMessage.isTempMessage = true
temporaryChatMessage.parentMessageId = qMsg.replyTo!!.toLong()
val pos = adapter?.getMessagePositionById(qMsg.replyTo.toString())
adapter?.addToStart(temporaryChatMessage, true)
adapter?.notifyDataSetChanged()
}
}
// messageInputViewModel.messageQueueFlow.observe(this) { list ->
// list.forEachIndexed { _, qMsg ->
// val temporaryChatMessage = ChatMessage()
// temporaryChatMessage.jsonMessageId = TEMPORARY_MESSAGE_ID_INT
// temporaryChatMessage.actorId = TEMPORARY_MESSAGE_ID_STRING
// temporaryChatMessage.timestamp = System.currentTimeMillis() / ONE_SECOND_IN_MILLIS
// temporaryChatMessage.message = qMsg.message.toString()
// temporaryChatMessage.tempMessageId = qMsg.id
// temporaryChatMessage.isTempMessage = true
// temporaryChatMessage.parentMessageId = qMsg.replyTo!!.toLong()
// val pos = adapter?.getMessagePositionById(qMsg.replyTo.toString())
// adapter?.addToStart(temporaryChatMessage, true)
// adapter?.notifyDataSetChanged()
// }
// }

messageInputViewModel.messageQueueSizeFlow.observe(this) { size ->
if (size == 0) {
Expand Down Expand Up @@ -697,7 +697,6 @@ class ChatActivity :
withCredentials = credentials!!,
withUrl = urlForChatting
)
messageInputViewModel.getTempMessagesFromMessageQueue(currentConversation!!.internalId)
}
} else {
Log.w(
Expand Down Expand Up @@ -3634,7 +3633,7 @@ class ChatActivity :
CONTENT_TYPE_SYSTEM_MESSAGE -> !TextUtils.isEmpty(message.systemMessage)
CONTENT_TYPE_UNREAD_NOTICE_MESSAGE -> message.id == UNREAD_MESSAGES_MARKER_ID.toString()
CONTENT_TYPE_CALL_STARTED -> message.id == "-2"
CONTENT_TYPE_TEMP -> message.id == TEMPORARY_MESSAGE_ID_STRING
// CONTENT_TYPE_TEMP -> message.id == TEMPORARY_MESSAGE_ID_STRING
// CONTENT_TYPE_TEMP -> message.readStatus == ReadStatus.FAILED
CONTENT_TYPE_DECK_CARD -> message.isDeckCard()

Expand Down Expand Up @@ -3781,27 +3780,27 @@ class ChatActivity :
}

override fun editTemporaryMessage(id: Int, newMessage: String) {
messageInputViewModel.editQueuedMessage(currentConversation!!.internalId, id, newMessage)
adapter?.notifyDataSetChanged() // TODO optimize this
// messageInputViewModel.editQueuedMessage(currentConversation!!.internalId, id, newMessage)
// adapter?.notifyDataSetChanged() // TODO optimize this
}

override fun deleteTemporaryMessage(id: Int) {
messageInputViewModel.removeFromQueue(currentConversation!!.internalId, id)
var i = 0
val max = messageInputViewModel.messageQueueSizeFlow.value?.plus(1)
for (item in adapter?.items!!) {
if (i > max!! && max < 1) break
if (item.item is ChatMessage &&
(item.item as ChatMessage).isTempMessage &&
(item.item as ChatMessage).tempMessageId == id
) {
val index = adapter?.items!!.indexOf(item)
adapter?.items!!.removeAt(index)
adapter?.notifyItemRemoved(index)
break
}
i++
}
// messageInputViewModel.removeFromQueue(currentConversation!!.internalId, id)
// var i = 0
// val max = messageInputViewModel.messageQueueSizeFlow.value?.plus(1)
// for (item in adapter?.items!!) {
// if (i > max!! && max < 1) break
// if (item.item is ChatMessage &&
// (item.item as ChatMessage).isTempMessage &&
// (item.item as ChatMessage).tempMessageId == id
// ) {
// val index = adapter?.items!!.indexOf(item)
// adapter?.items!!.removeAt(index)
// adapter?.notifyItemRemoved(index)
// break
// }
// i++
// }
}

private fun logConversationInfos(methodName: String) {
Expand Down
35 changes: 17 additions & 18 deletions app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,6 @@ class MessageInputFragment : Fragment() {

override fun onResume() {
super.onResume()
chatActivity.messageInputViewModel.restoreMessageQueue(conversationInternalId)
}

override fun onDestroyView() {
Expand Down Expand Up @@ -199,7 +198,7 @@ class MessageInputFragment : Fragment() {
wasOnline = !binding.fragmentConnectionLost.isShown
val connectionGained = (!wasOnline && isOnline)
Log.d(TAG, "isOnline: $isOnline\nwasOnline: $wasOnline\nconnectionGained: $connectionGained")
handleMessageQueue(isOnline)
// handleMessageQueue(isOnline)
handleUI(isOnline, connectionGained)
}.collect()
}
Expand Down Expand Up @@ -296,22 +295,22 @@ class MessageInputFragment : Fragment() {
}
}

private fun handleMessageQueue(isOnline: Boolean) {
if (isOnline) {
chatActivity.messageInputViewModel.switchToMessageQueue(false)
chatActivity.messageInputViewModel.sendAndEmptyMessageQueue(
conversationInternalId,
chatActivity.conversationUser!!.getCredentials(),
ApiUtils.getUrlForChat(
chatActivity.chatApiVersion,
chatActivity.conversationUser!!.baseUrl!!,
chatActivity.roomToken
)
)
} else {
chatActivity.messageInputViewModel.switchToMessageQueue(true)
}
}
// private fun handleMessageQueue(isOnline: Boolean) {
// if (isOnline) {
// chatActivity.messageInputViewModel.switchToMessageQueue(false)
// chatActivity.messageInputViewModel.sendAndEmptyMessageQueue(
// conversationInternalId,
// chatActivity.conversationUser!!.getCredentials(),
// ApiUtils.getUrlForChat(
// chatActivity.chatApiVersion,
// chatActivity.conversationUser!!.baseUrl!!,
// chatActivity.roomToken
// )
// )
// } else {
// chatActivity.messageInputViewModel.switchToMessageQueue(true)
// }
// }

private fun restoreState() {
if (binding.fragmentMessageInputView.inputEditText.text.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,16 +55,16 @@ class MessageInputViewModel @Inject constructor(
chatRepository = chatMessageRepository
}

data class QueuedMessage(
val id: Int,
var message: CharSequence? = null,
val displayName: String? = null,
val replyTo: Int? = null,
val sendWithoutNotification: Boolean? = null
)
// data class QueuedMessage(
// val id: Int,
// var message: CharSequence? = null,
// val displayName: String? = null,
// val replyTo: Int? = null,
// val sendWithoutNotification: Boolean? = null
// )

private var isQueueing: Boolean = false
private var messageQueue: MutableList<QueuedMessage> = mutableListOf()
// private var isQueueing: Boolean = false
// private var messageQueue: MutableList<QueuedMessage> = mutableListOf()

override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
Expand Down Expand Up @@ -129,13 +129,13 @@ class MessageInputViewModel @Inject constructor(
val isVoicePreviewPlaying: LiveData<Boolean>
get() = _isVoicePreviewPlaying

private val _messageQueueSizeFlow = MutableStateFlow(messageQueue.size)
private val _messageQueueSizeFlow = MutableStateFlow(666)
val messageQueueSizeFlow: LiveData<Int>
get() = _messageQueueSizeFlow.asLiveData()

private val _messageQueueFlow: MutableLiveData<List<QueuedMessage>> = MutableLiveData()
val messageQueueFlow: LiveData<List<QueuedMessage>>
get() = _messageQueueFlow
// private val _messageQueueFlow: MutableLiveData<List<QueuedMessage>> = MutableLiveData()
// val messageQueueFlow: LiveData<List<QueuedMessage>>
// get() = _messageQueueFlow

private val _callStartedFlow: MutableLiveData<Pair<ChatMessage, Boolean>> = MutableLiveData()
val callStartedFlow: LiveData<Pair<ChatMessage, Boolean>>
Expand Down Expand Up @@ -171,16 +171,16 @@ class MessageInputViewModel @Inject constructor(
}
}

if (isQueueing) {
val tempID = System.currentTimeMillis().toInt()
val qMsg = QueuedMessage(tempID, message, displayName, replyTo, sendWithoutNotification)
messageQueue = appPreferences.getMessageQueue(internalId)
messageQueue.add(qMsg)
appPreferences.saveMessageQueue(internalId, messageQueue)
_messageQueueSizeFlow.update { messageQueue.size }
_messageQueueFlow.postValue(listOf(qMsg))
return
}
// if (isQueueing) {
// val tempID = System.currentTimeMillis().toInt()
// val qMsg = QueuedMessage(tempID, message, displayName, replyTo, sendWithoutNotification)
// messageQueue = appPreferences.getMessageQueue(internalId)
// messageQueue.add(qMsg)
// appPreferences.saveMessageQueue(internalId, messageQueue)
// _messageQueueSizeFlow.update { messageQueue.size }
// _messageQueueFlow.postValue(listOf(qMsg))
// return
// }

viewModelScope.launch {
chatRepository.sendChatMessage(
Expand Down Expand Up @@ -268,68 +268,68 @@ class MessageInputViewModel @Inject constructor(
_getRecordingTime.postValue(time)
}

fun sendAndEmptyMessageQueue(internalId: String, credentials: String, url: String) {
if (isQueueing) return
messageQueue.clear()

val queue = appPreferences.getMessageQueue(internalId)
appPreferences.saveMessageQueue(internalId, null) // empties the queue
while (queue.size > 0) {
val msg = queue.removeAt(0)
sendChatMessage(
internalId,
credentials,
url,
msg.message!!,
msg.displayName!!,
msg.replyTo!!,
msg.sendWithoutNotification!!
)
sleep(DELAY_BETWEEN_QUEUED_MESSAGES)
}
_messageQueueSizeFlow.tryEmit(0)
}

fun getTempMessagesFromMessageQueue(internalId: String) {
val queue = appPreferences.getMessageQueue(internalId)
val list = mutableListOf<QueuedMessage>()
for (msg in queue) {
list.add(msg)
}
_messageQueueFlow.postValue(list)
}

fun switchToMessageQueue(shouldQueue: Boolean) {
isQueueing = shouldQueue
}

fun restoreMessageQueue(internalId: String) {
messageQueue = appPreferences.getMessageQueue(internalId)
_messageQueueSizeFlow.tryEmit(messageQueue.size)
}

fun removeFromQueue(internalId: String, id: Int) {
val queue = appPreferences.getMessageQueue(internalId)
for (qMsg in queue) {
if (qMsg.id == id) {
queue.remove(qMsg)
break
}
}
appPreferences.saveMessageQueue(internalId, queue)
_messageQueueSizeFlow.tryEmit(queue.size)
}

fun editQueuedMessage(internalId: String, id: Int, newMessage: String) {
val queue = appPreferences.getMessageQueue(internalId)
for (qMsg in queue) {
if (qMsg.id == id) {
qMsg.message = newMessage
break
}
}
appPreferences.saveMessageQueue(internalId, queue)
}
// fun sendAndEmptyMessageQueue(internalId: String, credentials: String, url: String) {
// if (isQueueing) return
// messageQueue.clear()
//
// val queue = appPreferences.getMessageQueue(internalId)
// appPreferences.saveMessageQueue(internalId, null) // empties the queue
// while (queue.size > 0) {
// val msg = queue.removeAt(0)
// sendChatMessage(
// internalId,
// credentials,
// url,
// msg.message!!,
// msg.displayName!!,
// msg.replyTo!!,
// msg.sendWithoutNotification!!
// )
// sleep(DELAY_BETWEEN_QUEUED_MESSAGES)
// }
// _messageQueueSizeFlow.tryEmit(0)
// }
//
// fun getTempMessagesFromMessageQueue(internalId: String) {
// val queue = appPreferences.getMessageQueue(internalId)
// val list = mutableListOf<QueuedMessage>()
// for (msg in queue) {
// list.add(msg)
// }
// _messageQueueFlow.postValue(list)
// }
//
// fun switchToMessageQueue(shouldQueue: Boolean) {
// isQueueing = shouldQueue
// }
//
// fun restoreMessageQueue(internalId: String) {
// messageQueue = appPreferences.getMessageQueue(internalId)
// _messageQueueSizeFlow.tryEmit(messageQueue.size)
// }
//
// fun removeFromQueue(internalId: String, id: Int) {
// val queue = appPreferences.getMessageQueue(internalId)
// for (qMsg in queue) {
// if (qMsg.id == id) {
// queue.remove(qMsg)
// break
// }
// }
// appPreferences.saveMessageQueue(internalId, queue)
// _messageQueueSizeFlow.tryEmit(queue.size)
// }
//
// fun editQueuedMessage(internalId: String, id: Int, newMessage: String) {
// val queue = appPreferences.getMessageQueue(internalId)
// for (qMsg in queue) {
// if (qMsg.id == id) {
// qMsg.message = newMessage
// break
// }
// }
// appPreferences.saveMessageQueue(internalId, queue)
// }

fun showCallStartedIndicator(recent: ChatMessage, show: Boolean) {
_callStartedFlow.postValue(Pair(recent, show))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,6 @@ private void deleteUser(User user) {
if (user.getId() != null) {
String username = user.getUsername();
try {
appPreferences.deleteAllMessageQueuesFor(user.getUserId());
userManager.deleteUser(user.getId());
Log.d(TAG, "deleted user: " + username);
} catch (Throwable e) {
Expand Down
Loading

0 comments on commit a255b91

Please sign in to comment.