diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt index a2e58dcd1..b4adbac7d 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt +++ b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt @@ -20,6 +20,8 @@ import com.nextcloud.talk.models.json.participants.TalkBanOverall import com.nextcloud.talk.models.json.profile.ProfileOverall import com.nextcloud.talk.models.json.testNotification.TestNotificationOverall import com.nextcloud.talk.models.json.userAbsence.UserAbsenceOverall +import com.nextcloud.talk.models.json.usercircles.UserCirclesOverall +import com.nextcloud.talk.models.json.usergroups.UserGroupsOverall import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.Body diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index c92ca2e4a..bdf53ddbc 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -196,6 +196,7 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_RECORDING_STATE import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_START_CALL_AFTER_ROOM_SWITCH import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SWITCH_TO_ROOM +import com.nextcloud.talk.utils.message.MessageUtils import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil import com.nextcloud.talk.utils.rx.DisposableSet import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder @@ -271,6 +272,9 @@ class ChatActivity : @Inject lateinit var networkMonitor: NetworkMonitor + @Inject + lateinit var messageUtils: MessageUtils + lateinit var chatViewModel: ChatViewModel lateinit var conversationInfoViewModel: ConversationInfoViewModel @@ -669,6 +673,10 @@ class ChatActivity : } } + conversationUser?.let { user -> + chatViewModel.fetchUserData(user) + } + if (currentConversation?.objectType == ConversationEnums.ObjectType.EVENT && hasSpreedFeatureCapability( conversationUser?.capabilities!!.spreedCapability!!, @@ -1204,6 +1212,14 @@ class ChatActivity : } } } + + lifecycleScope.launch { + chatViewModel.userGroups.collect { userGroups -> + chatViewModel.userCircles.collect { userCircles -> + messageUtils.setUserData(userGroups, userCircles) + } + } + } } private fun removeUnreadMessagesMarker() { diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/network/ChatNetworkDataSource.kt b/app/src/main/java/com/nextcloud/talk/chat/data/network/ChatNetworkDataSource.kt index 7276f4489..8945a6987 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/data/network/ChatNetworkDataSource.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/data/network/ChatNetworkDataSource.kt @@ -77,4 +77,6 @@ interface ChatNetworkDataSource { ): List suspend fun getOpenGraph(credentials: String, baseUrl: String, extractedLinkToPreview: String): Reference? suspend fun unbindRoom(credentials: String, baseUrl: String, roomToken: String): GenericOverall + suspend fun getUserGroups(user: User): Set + suspend fun getUserCircles(user: User): Set } diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/network/RetrofitChatNetwork.kt b/app/src/main/java/com/nextcloud/talk/chat/data/network/RetrofitChatNetwork.kt index bf36274f6..85aa47637 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/data/network/RetrofitChatNetwork.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/data/network/RetrofitChatNetwork.kt @@ -222,4 +222,25 @@ class RetrofitChatNetwork( val url = ApiUtils.getUrlForUnbindingRoom(baseUrl, roomToken) return ncApiCoroutines.unbindRoom(credentials, url) } + + override suspend fun getUserGroups(user: User): Set { + val credentials: String = ApiUtils.getCredentials(user.username, user.token)!! + val response = ncApiCoroutines.getUserGroups( + credentials, + ApiUtils.getUrlForUserGroups( + user.baseUrl!!, + user.userId!! + ) + ) + return response.ocs?.data?.groups?.toSet() ?: emptySet() + } + + override suspend fun getUserCircles(user: User): Set { + val credentials: String = ApiUtils.getCredentials(user.username, user.token)!! + val response = ncApiCoroutines.getUserCircles( + credentials, + ApiUtils.getUrlForUserCircles(user.baseUrl!!) + ) + return response.ocs?.data?.map { it.displayName!! }?.toSet() ?: emptySet() + } } diff --git a/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt b/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt index 124d81cdb..e82130c3d 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt @@ -50,6 +50,9 @@ import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.first @@ -233,6 +236,12 @@ class ChatViewModel @Inject constructor( val leaveRoomViewState: LiveData get() = _leaveRoomViewState + private val _userGroups = MutableStateFlow>(emptySet()) + val userGroups: StateFlow> = _userGroups.asStateFlow() + + private val _userCircles = MutableStateFlow>(emptySet()) + val userCircles: StateFlow> = _userCircles.asStateFlow() + object ChatMessageInitialState : ViewState object ChatMessageStartState : ViewState object ChatMessageUpdateState : ViewState @@ -355,6 +364,13 @@ class ChatViewModel @Inject constructor( _getReminderExistState.value = GetReminderStateSet } + fun fetchUserData(user: User) { + viewModelScope.launch { + _userGroups.value = chatNetworkDataSource.getUserGroups(user) + _userCircles.value = chatNetworkDataSource.getUserCircles(user) + } + } + fun deleteReminder(user: User, roomToken: String, messageId: String, chatApiVersion: Int) { chatNetworkDataSource.deleteReminder(user, roomToken, messageId, chatApiVersion) .subscribeOn(Schedulers.io()) diff --git a/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsData.kt b/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsData.kt new file mode 100644 index 000000000..f075d09bf --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsData.kt @@ -0,0 +1,23 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2025 Sowjanya Kota + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.models.json.usergroups + +import android.os.Parcelable +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject +import kotlinx.parcelize.Parcelize + +@Parcelize +@JsonObject +data class UserGroupsData( + @JsonField(name = ["groups"]) + var groups: List? +) : Parcelable { + // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' + constructor() : this(null) +} diff --git a/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOCS.kt b/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOCS.kt index ac5f2e7f8..28f1999e6 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOCS.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOCS.kt @@ -19,7 +19,7 @@ data class UserGroupsOCS( @JsonField(name = ["meta"]) var meta: GenericMeta?, @JsonField(name = ["data"]) - var data: List? + var data: UserGroupsData? ) : Parcelable { // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' constructor() : this(null, null) diff --git a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt index 81944ac42..456b5ab52 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt @@ -30,6 +30,7 @@ import io.noties.markwon.ext.tasklist.TaskListDrawable import io.noties.markwon.ext.tasklist.TaskListPlugin class MessageUtils(val context: Context) { + fun enrichChatReplyMessageText( context: Context, message: ChatMessage,