@@ -10,19 +10,24 @@ import android.util.Log
10
10
import androidx.lifecycle.LiveData
11
11
import androidx.lifecycle.MutableLiveData
12
12
import androidx.lifecycle.ViewModel
13
+ import androidx.lifecycle.viewModelScope
14
+ import com.nextcloud.talk.adapters.items.ConversationItem
13
15
import com.nextcloud.talk.chat.data.ChatMessageRepository
14
16
import com.nextcloud.talk.conversationlist.data.OfflineConversationsRepository
15
17
import com.nextcloud.talk.invitation.data.InvitationsModel
16
18
import com.nextcloud.talk.invitation.data.InvitationsRepository
17
19
import com.nextcloud.talk.models.domain.ConversationModel
18
20
import com.nextcloud.talk.users.UserManager
19
21
import com.nextcloud.talk.utils.ApiUtils
22
+ import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
20
23
import io.reactivex.Observer
21
24
import io.reactivex.android.schedulers.AndroidSchedulers
22
25
import io.reactivex.disposables.Disposable
23
26
import io.reactivex.schedulers.Schedulers
27
+ import kotlinx.coroutines.Dispatchers
24
28
import kotlinx.coroutines.flow.catch
25
29
import kotlinx.coroutines.flow.onEach
30
+ import kotlinx.coroutines.launch
26
31
import javax.inject.Inject
27
32
28
33
class ConversationsListViewModel @Inject constructor(
@@ -88,10 +93,41 @@ class ConversationsListViewModel @Inject constructor(
88
93
repository.getRooms()
89
94
}
90
95
91
- fun updateRoomMessages (model : ConversationModel , limit : Int , credentials : String , baseUrl : String ) {
96
+ fun updateRoomMessages (credentials : String , oldList : MutableList <AbstractFlexibleItem <* >>, list : List <ConversationModel >) {
97
+ val previous = oldList.associate {
98
+ (it as ConversationItem )
99
+ val unreadMessages = it.model.unreadMessages
100
+ val roomToken = it.model.token
101
+ Pair (roomToken, unreadMessages)
102
+ }
103
+
104
+ val current = list.associateWith { model ->
105
+ val unreadMessages = model.unreadMessages
106
+ unreadMessages
107
+ }
108
+
109
+ val result = current.map { (model, unreadMessages) ->
110
+ val previousUnreadMessages = previous[model.token] // Check if this conversation exists in last list
111
+ previousUnreadMessages?.let {
112
+ Pair (model, unreadMessages - previousUnreadMessages)
113
+ }
114
+ }.filterNotNull()
115
+ val baseUrl = userManager.currentUser.blockingGet().baseUrl!!
116
+
117
+ viewModelScope.launch(Dispatchers .IO ) {
118
+ for (pair in result) {
119
+ if (pair.second > 0 ) {
120
+ updateRoomMessage(pair.first, pair.second, credentials, baseUrl)
121
+ }
122
+ }
123
+ }
124
+
125
+ }
126
+
127
+ private suspend fun updateRoomMessage (model : ConversationModel , limit : Int , credentials : String , baseUrl : String ) {
92
128
val urlForChatting = ApiUtils .getUrlForChat(1 , baseUrl, model.token) // FIXME v1?
93
129
chatRepository.setData(model, credentials, urlForChatting)
94
- chatRepository.updateRoomMessages(model.token , limit)
130
+ chatRepository.updateRoomMessages(model.internalId , limit)
95
131
}
96
132
97
133
inner class FederatedInvitationsObserver : Observer <InvitationsModel > {
0 commit comments