theme user groups and mentions

Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
This commit is contained in:
sowjanyakch 2025-02-28 11:02:10 +01:00
parent 9d834c2835
commit c096c9bb6e
No known key found for this signature in database
GPG Key ID: F7AA2A8B65B50220
8 changed files with 82 additions and 1 deletions

View File

@ -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.profile.ProfileOverall
import com.nextcloud.talk.models.json.testNotification.TestNotificationOverall import com.nextcloud.talk.models.json.testNotification.TestNotificationOverall
import com.nextcloud.talk.models.json.userAbsence.UserAbsenceOverall 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.MultipartBody
import okhttp3.RequestBody import okhttp3.RequestBody
import retrofit2.http.Body import retrofit2.http.Body

View File

@ -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_ROOM_TOKEN
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_START_CALL_AFTER_ROOM_SWITCH 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.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.permissions.PlatformPermissionUtil
import com.nextcloud.talk.utils.rx.DisposableSet import com.nextcloud.talk.utils.rx.DisposableSet
import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder
@ -271,6 +272,9 @@ class ChatActivity :
@Inject @Inject
lateinit var networkMonitor: NetworkMonitor lateinit var networkMonitor: NetworkMonitor
@Inject
lateinit var messageUtils: MessageUtils
lateinit var chatViewModel: ChatViewModel lateinit var chatViewModel: ChatViewModel
lateinit var conversationInfoViewModel: ConversationInfoViewModel lateinit var conversationInfoViewModel: ConversationInfoViewModel
@ -669,6 +673,10 @@ class ChatActivity :
} }
} }
conversationUser?.let { user ->
chatViewModel.fetchUserData(user)
}
if (currentConversation?.objectType == ConversationEnums.ObjectType.EVENT && if (currentConversation?.objectType == ConversationEnums.ObjectType.EVENT &&
hasSpreedFeatureCapability( hasSpreedFeatureCapability(
conversationUser?.capabilities!!.spreedCapability!!, 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() { private fun removeUnreadMessagesMarker() {

View File

@ -77,4 +77,6 @@ interface ChatNetworkDataSource {
): List<ChatMessageJson> ): List<ChatMessageJson>
suspend fun getOpenGraph(credentials: String, baseUrl: String, extractedLinkToPreview: String): Reference? suspend fun getOpenGraph(credentials: String, baseUrl: String, extractedLinkToPreview: String): Reference?
suspend fun unbindRoom(credentials: String, baseUrl: String, roomToken: String): GenericOverall suspend fun unbindRoom(credentials: String, baseUrl: String, roomToken: String): GenericOverall
suspend fun getUserGroups(user: User): Set<String>
suspend fun getUserCircles(user: User): Set<String>
} }

View File

@ -222,4 +222,25 @@ class RetrofitChatNetwork(
val url = ApiUtils.getUrlForUnbindingRoom(baseUrl, roomToken) val url = ApiUtils.getUrlForUnbindingRoom(baseUrl, roomToken)
return ncApiCoroutines.unbindRoom(credentials, url) return ncApiCoroutines.unbindRoom(credentials, url)
} }
override suspend fun getUserGroups(user: User): Set<String> {
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<String> {
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()
}
} }

View File

@ -50,6 +50,9 @@ import io.reactivex.schedulers.Schedulers
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow 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.MutableSharedFlow
import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
@ -233,6 +236,12 @@ class ChatViewModel @Inject constructor(
val leaveRoomViewState: LiveData<ViewState> val leaveRoomViewState: LiveData<ViewState>
get() = _leaveRoomViewState get() = _leaveRoomViewState
private val _userGroups = MutableStateFlow<Set<String>>(emptySet())
val userGroups: StateFlow<Set<String>> = _userGroups.asStateFlow()
private val _userCircles = MutableStateFlow<Set<String>>(emptySet())
val userCircles: StateFlow<Set<String>> = _userCircles.asStateFlow()
object ChatMessageInitialState : ViewState object ChatMessageInitialState : ViewState
object ChatMessageStartState : ViewState object ChatMessageStartState : ViewState
object ChatMessageUpdateState : ViewState object ChatMessageUpdateState : ViewState
@ -355,6 +364,13 @@ class ChatViewModel @Inject constructor(
_getReminderExistState.value = GetReminderStateSet _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) { fun deleteReminder(user: User, roomToken: String, messageId: String, chatApiVersion: Int) {
chatNetworkDataSource.deleteReminder(user, roomToken, messageId, chatApiVersion) chatNetworkDataSource.deleteReminder(user, roomToken, messageId, chatApiVersion)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())

View File

@ -0,0 +1,23 @@
/*
* Nextcloud Talk - Android Client
*
* SPDX-FileCopyrightText: 2025 Sowjanya Kota <sowjanya.kch@gmail.com>
* 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<String>?
) : Parcelable {
// This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
constructor() : this(null)
}

View File

@ -19,7 +19,7 @@ data class UserGroupsOCS(
@JsonField(name = ["meta"]) @JsonField(name = ["meta"])
var meta: GenericMeta?, var meta: GenericMeta?,
@JsonField(name = ["data"]) @JsonField(name = ["data"])
var data: List<String>? var data: UserGroupsData?
) : Parcelable { ) : Parcelable {
// This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
constructor() : this(null, null) constructor() : this(null, null)

View File

@ -30,6 +30,7 @@ import io.noties.markwon.ext.tasklist.TaskListDrawable
import io.noties.markwon.ext.tasklist.TaskListPlugin import io.noties.markwon.ext.tasklist.TaskListPlugin
class MessageUtils(val context: Context) { class MessageUtils(val context: Context) {
fun enrichChatReplyMessageText( fun enrichChatReplyMessageText(
context: Context, context: Context,
message: ChatMessage, message: ChatMessage,