From fe8f19be1b43f4ae74bbdbb9d31ab4404c5cbfbf Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Thu, 27 Feb 2025 22:10:30 +0100 Subject: [PATCH 01/14] add endpoints Signed-off-by: sowjanyakch --- app/src/main/java/com/nextcloud/talk/api/NcApi.java | 10 ++++++++++ app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt | 8 ++++++++ .../com/nextcloud/talk/utils/message/MessageUtils.kt | 1 + 3 files changed, 19 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index ca5d7afe592..3a7f423d548 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -34,6 +34,8 @@ import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall; import com.nextcloud.talk.models.json.status.StatusOverall; import com.nextcloud.talk.models.json.unifiedsearch.UnifiedSearchOverall; +import com.nextcloud.talk.models.json.usercircles.UserCirclesOverall; +import com.nextcloud.talk.models.json.usergroups.UserGroupsOverall; import com.nextcloud.talk.models.json.userprofile.UserProfileFieldsOverall; import com.nextcloud.talk.models.json.userprofile.UserProfileOverall; import com.nextcloud.talk.polls.repositories.model.PollOverall; @@ -646,4 +648,12 @@ Observable acceptInvitation(@Header("Authorization") String auth @DELETE Observable rejectInvitation(@Header("Authorization") String authorization, @Url String url); + + @GET + Observable getUserGroups (@Header("Authorization") String authorization, + @Url String url); + + @GET + Observable getUserCircles(@Header("Authorization") String authorization, + @Url String url); } \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt index fe258be3c8e..e8e34c4f3c2 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt @@ -363,6 +363,14 @@ object ApiUtils { return "$baseUrl$OCS_API_VERSION/cloud/users/$userId" } + fun getUrlForUserGroups(baseUrl: String, userId: String): String { + return "$baseUrl$OCS_API_VERSION/cloud/users/$userId/groups" + } + + fun getUrlForUserCircles(baseUrl: String): String { + return "$baseUrl$OCS_API_VERSION/apps/circles/probecircles" + } + fun getUrlForUserSettings(baseUrl: String): String { // FIXME Introduce API version return "$baseUrl$OCS_API_VERSION$SPREED_API_VERSION/settings/user" 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 985a0aa1ea9..81944ac42c8 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 @@ -110,6 +110,7 @@ class MessageUtils(val context: Context) { for (key in messageParameters.keys) { val individualHashMap = message.messageParameters?.get(key) if (individualHashMap != null) { + when (individualHashMap["type"]) { "user", "guest", "call", "user-group", "email", "circle" -> { val chip = if (individualHashMap["id"]?.equals(message.activeUser?.userId) == true) { From 02b8ecd03c4c489083af90c59f3535b6b0de597c Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Thu, 27 Feb 2025 22:10:47 +0100 Subject: [PATCH 02/14] add model Signed-off-by: sowjanyakch --- .../models/json/usercircles/UserCircles.kt | 44 +++++++++++++++++++ .../models/json/usercircles/UserCirclesOCS.kt | 26 +++++++++++ .../json/usercircles/UserCirclesOverall.kt | 23 ++++++++++ .../models/json/usergroups/UserGroupsOCS.kt | 26 +++++++++++ .../json/usergroups/UserGroupsOverall.kt | 23 ++++++++++ 5 files changed, 142 insertions(+) create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCircles.kt create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOCS.kt create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOverall.kt create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOCS.kt create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOverall.kt diff --git a/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCircles.kt b/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCircles.kt new file mode 100644 index 00000000000..1589ee24254 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCircles.kt @@ -0,0 +1,44 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.models.json.usercircles + +import android.os.Parcelable +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject +import kotlinx.parcelize.Parcelize + +@Parcelize +@JsonObject +data class UserCircles( + @JsonField(name = ["id"]) + var id: String? = null, + @JsonField(name = ["name"]) + var name: String? = null, + @JsonField(name = ["displayName"]) + var displayName: String? = null, + @JsonField(name = ["sanitizedName"]) + var sanitizedName: String? = null, + @JsonField(name = ["source"]) + var source: Int = 0, + @JsonField(name = ["population"]) + var population: Int = 0, + @JsonField(name = ["config"]) + var config: Int = 0, + @JsonField(name = ["description"]) + var description: String? = null, + @JsonField(name = ["url"]) + var url: String? = null, + @JsonField(name = ["creation"]) + var creation: Int = 0, + @JsonField(name = ["initiator"]) + var initiator: String? = null + +) : Parcelable { + // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' + constructor() : this(null, null, null, null, 0, 0, 0, null, null, 0, null) +} diff --git a/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOCS.kt b/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOCS.kt new file mode 100644 index 00000000000..81ca2d7ccdc --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOCS.kt @@ -0,0 +1,26 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.models.json.usercircles + +import android.os.Parcelable +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject +import com.nextcloud.talk.models.json.generic.GenericMeta +import kotlinx.parcelize.Parcelize + +@Parcelize +@JsonObject +data class UserCirclesOCS( + @JsonField(name = ["meta"]) + var meta: GenericMeta?, + @JsonField(name = ["data"]) + var data: List? +) : 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/models/json/usercircles/UserCirclesOverall.kt b/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOverall.kt new file mode 100644 index 00000000000..0e11f884bbb --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOverall.kt @@ -0,0 +1,23 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.models.json.usercircles + +import android.os.Parcelable +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject +import kotlinx.parcelize.Parcelize + +@Parcelize +@JsonObject +data class UserCirclesOverall( + @JsonField(name = ["ocs"]) + var ocs: UserCirclesOCS? +) : 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 new file mode 100644 index 00000000000..0d53fdbdfe3 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOCS.kt @@ -0,0 +1,26 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2025 Your Name + * 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 com.nextcloud.talk.models.json.generic.GenericMeta +import kotlinx.parcelize.Parcelize + +@Parcelize +@JsonObject +data class UserGroupsOCS( + @JsonField(name = ["meta"]) + var meta: GenericMeta?, + @JsonField(name = ["data"]) + var data: List? +) : 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/models/json/usergroups/UserGroupsOverall.kt b/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOverall.kt new file mode 100644 index 00000000000..92cff37b506 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOverall.kt @@ -0,0 +1,23 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2025 Your Name + * 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 UserGroupsOverall( + @JsonField(name = ["ocs"]) + var ocs: UserGroupsOCS? +) : Parcelable { + // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' + constructor() : this(null) +} From 9d834c28356519c969e45396c208d8631be870c3 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Thu, 27 Feb 2025 22:14:16 +0100 Subject: [PATCH 03/14] add copyright Signed-off-by: sowjanyakch --- .../com/nextcloud/talk/models/json/usercircles/UserCircles.kt | 2 +- .../nextcloud/talk/models/json/usercircles/UserCirclesOCS.kt | 2 +- .../talk/models/json/usercircles/UserCirclesOverall.kt | 2 +- .../com/nextcloud/talk/models/json/usergroups/UserGroupsOCS.kt | 2 +- .../nextcloud/talk/models/json/usergroups/UserGroupsOverall.kt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCircles.kt b/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCircles.kt index 1589ee24254..260426a240a 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCircles.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCircles.kt @@ -1,7 +1,7 @@ /* * Nextcloud Talk - Android Client * - * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-FileCopyrightText: 2025 Sowjanya Kota * SPDX-License-Identifier: GPL-3.0-or-later */ diff --git a/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOCS.kt b/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOCS.kt index 81ca2d7ccdc..8e5fb9137d2 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOCS.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOCS.kt @@ -1,7 +1,7 @@ /* * Nextcloud Talk - Android Client * - * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-FileCopyrightText: 2025 Sowjanya Kota * SPDX-License-Identifier: GPL-3.0-or-later */ diff --git a/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOverall.kt b/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOverall.kt index 0e11f884bbb..e2db21c5bb3 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOverall.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/usercircles/UserCirclesOverall.kt @@ -1,7 +1,7 @@ /* * Nextcloud Talk - Android Client * - * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-FileCopyrightText: 2025 Sowjanya Kota * SPDX-License-Identifier: GPL-3.0-or-later */ 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 0d53fdbdfe3..ac5f2e7f899 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 @@ -1,7 +1,7 @@ /* * Nextcloud Talk - Android Client * - * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-FileCopyrightText: 2025 Sowjanya Kota * SPDX-License-Identifier: GPL-3.0-or-later */ diff --git a/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOverall.kt b/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOverall.kt index 92cff37b506..23b7ec6b7b1 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOverall.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsOverall.kt @@ -1,7 +1,7 @@ /* * Nextcloud Talk - Android Client * - * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-FileCopyrightText: 2025 Sowjanya Kota * SPDX-License-Identifier: GPL-3.0-or-later */ From c096c9bb6ea42422cd50dfde40364580b0076348 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Fri, 28 Feb 2025 11:02:10 +0100 Subject: [PATCH 04/14] theme user groups and mentions Signed-off-by: sowjanyakch --- .../com/nextcloud/talk/api/NcApiCoroutines.kt | 2 ++ .../com/nextcloud/talk/chat/ChatActivity.kt | 16 +++++++++++++ .../data/network/ChatNetworkDataSource.kt | 2 ++ .../chat/data/network/RetrofitChatNetwork.kt | 21 +++++++++++++++++ .../talk/chat/viewmodels/ChatViewModel.kt | 16 +++++++++++++ .../models/json/usergroups/UserGroupsData.kt | 23 +++++++++++++++++++ .../models/json/usergroups/UserGroupsOCS.kt | 2 +- .../talk/utils/message/MessageUtils.kt | 1 + 8 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/usergroups/UserGroupsData.kt 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 a2e58dcd166..b4adbac7d87 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 c92ca2e4af8..bdf53ddbc05 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 7276f448942..8945a6987db 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 bf36274f634..85aa4763725 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 124d81cdb04..e82130c3d58 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 00000000000..f075d09bf69 --- /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 ac5f2e7f899..28f1999e678 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 81944ac42c8..456b5ab5289 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, From 5779dce42faf428541b2ac18fefc10badf6cec89 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Fri, 28 Feb 2025 11:03:42 +0100 Subject: [PATCH 05/14] modify ncApiCoroutines Signed-off-by: sowjanyakch --- app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt | 6 ++++++ 1 file changed, 6 insertions(+) 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 b4adbac7d87..ff63a08529c 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt +++ b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt @@ -287,4 +287,10 @@ interface NcApiCoroutines { @DELETE suspend fun unbindRoom(@Header("Authorization") authorization: String, @Url url: String): GenericOverall + + @GET + suspend fun getUserGroups(@Header("Authorization") authorization: String?, @Url url: String?): UserGroupsOverall + + @GET + suspend fun getUserCircles(@Header("Authorization") authorization: String?, @Url url: String?): UserCirclesOverall } From 82109fe36449d99c6798ddfbe8c3131f3f36956b Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Fri, 28 Feb 2025 11:22:29 +0100 Subject: [PATCH 06/14] theme mention-all and remove unused code Signed-off-by: sowjanyakch --- app/src/main/java/com/nextcloud/talk/api/NcApi.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index 3a7f423d548..2c4b626de09 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -649,11 +649,4 @@ Observable acceptInvitation(@Header("Authorization") String auth Observable rejectInvitation(@Header("Authorization") String authorization, @Url String url); - @GET - Observable getUserGroups (@Header("Authorization") String authorization, - @Url String url); - - @GET - Observable getUserCircles(@Header("Authorization") String authorization, - @Url String url); } \ No newline at end of file From d3051325d351c2590139ad620f6edff9e03fc853 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Fri, 28 Feb 2025 12:57:33 +0100 Subject: [PATCH 07/14] fix group mentions Signed-off-by: sowjanyakch --- .../main/java/com/nextcloud/talk/chat/ChatActivity.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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 bdf53ddbc05..a722e808696 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -1215,9 +1215,12 @@ class ChatActivity : lifecycleScope.launch { chatViewModel.userGroups.collect { userGroups -> - chatViewModel.userCircles.collect { userCircles -> - messageUtils.setUserData(userGroups, userCircles) - } + messageUtils.setUserGroups(userGroups) + } + } + lifecycleScope.launch { + chatViewModel.userCircles.collect { userCircles -> + messageUtils.setUserCircles(userCircles) } } } From acee0a5545e8f5c8191bc97c31a78534d2f3abab Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 18 Mar 2025 22:33:02 +0100 Subject: [PATCH 08/14] store user groups and circles in room database Signed-off-by: sowjanyakch --- .../13.json | 44 ++++++++++- .../nextcloud/talk/activities/MainActivity.kt | 10 +++ .../com/nextcloud/talk/chat/ChatActivity.kt | 11 --- .../talk/chat/viewmodels/ChatViewModel.kt | 16 ---- .../talk/dagger/modules/DaosModule.kt | 4 + .../talk/dagger/modules/RepositoryModule.kt | 11 +++ .../talk/dagger/modules/UtilsModule.kt | 7 -- .../database/dao/UserCirclesOrGroupsDao.kt | 32 ++++++++ .../data/database/model/UserCirclesEntity.kt | 19 +++++ .../model/UserGroupsCirclesRepository.kt | 78 +++++++++++++++++++ .../data/database/model/UserGroupsEntity.kt | 18 +++++ .../talk/data/source/local/TalkDatabase.kt | 8 +- 12 files changed, 221 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt create mode 100644 app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt create mode 100644 app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt create mode 100644 app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt diff --git a/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/13.json b/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/13.json index 2e23450016a..f8cb76a68de 100644 --- a/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/13.json +++ b/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/13.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 13, - "identityHash": "a521f027909f69f4c7d1855f84a2e67f", + "identityHash": "f58d9b51b48ddc5c6f4dc4c742eb5f3f", "entities": [ { "tableName": "User", @@ -738,12 +738,52 @@ ] } ] + }, + { + "tableName": "user_circles", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`displayName` TEXT NOT NULL, PRIMARY KEY(`displayName`))", + "fields": [ + { + "fieldPath": "displayName", + "columnName": "displayName", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "displayName" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "user_groups", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groups` TEXT NOT NULL, PRIMARY KEY(`groups`))", + "fields": [ + { + "fieldPath": "groups", + "columnName": "groups", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "groups" + ] + }, + "indices": [], + "foreignKeys": [] } ], "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a521f027909f69f4c7d1855f84a2e67f')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f58d9b51b48ddc5c6f4dc4c742eb5f3f')" ] } } \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt index 0828b475f85..7028255f8a6 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt @@ -21,6 +21,7 @@ import androidx.activity.OnBackPressedCallback import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner +import androidx.lifecycle.lifecycleScope import autodagger.AutoInjector import com.google.android.material.snackbar.Snackbar import com.nextcloud.talk.R @@ -30,6 +31,7 @@ import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.conversationlist.ConversationsListActivity +import com.nextcloud.talk.data.database.model.UserGroupsCirclesRepository import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivityMainBinding import com.nextcloud.talk.invitation.InvitationsActivity @@ -46,6 +48,7 @@ import io.reactivex.SingleObserver import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers +import kotlinx.coroutines.launch import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) @@ -58,6 +61,9 @@ class MainActivity : BaseActivity(), ActionBarProvider { @Inject lateinit var userManager: UserManager + @Inject + lateinit var userGroupsOrCirclesRepository: UserGroupsCirclesRepository + private val onBackPressedCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { finish() @@ -146,6 +152,10 @@ class MainActivity : BaseActivity(), ActionBarProvider { } private fun handleActionFromContact(intent: Intent) { + lifecycleScope.launch { + val initialized = userGroupsOrCirclesRepository.initialize() + Log.d("MainActivity", "$initialized") + } if (intent.action == Intent.ACTION_VIEW && intent.data != null) { val cursor = contentResolver.query(intent.data!!, null, null, null, null) 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 a722e808696..4feda24ecb8 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -1212,17 +1212,6 @@ class ChatActivity : } } } - - lifecycleScope.launch { - chatViewModel.userGroups.collect { userGroups -> - messageUtils.setUserGroups(userGroups) - } - } - lifecycleScope.launch { - chatViewModel.userCircles.collect { userCircles -> - messageUtils.setUserCircles(userCircles) - } - } } private fun removeUnreadMessagesMarker() { 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 e82130c3d58..124d81cdb04 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,9 +50,6 @@ 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 @@ -236,12 +233,6 @@ 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 @@ -364,13 +355,6 @@ 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/dagger/modules/DaosModule.kt b/app/src/main/java/com/nextcloud/talk/dagger/modules/DaosModule.kt index 27ec540a07b..3403bcfed3f 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/DaosModule.kt +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/DaosModule.kt @@ -10,6 +10,7 @@ package com.nextcloud.talk.dagger.modules import com.nextcloud.talk.data.database.dao.ChatBlocksDao import com.nextcloud.talk.data.database.dao.ChatMessagesDao import com.nextcloud.talk.data.database.dao.ConversationsDao +import com.nextcloud.talk.data.database.dao.UserCirclesOrGroupsDao import com.nextcloud.talk.data.source.local.TalkDatabase import dagger.Module import dagger.Provides @@ -24,4 +25,7 @@ internal object DaosModule { @Provides fun providesChatBlocksDao(database: TalkDatabase): ChatBlocksDao = database.chatBlocksDao() + + @Provides + fun providesUserCirclesOrGroups(database: TalkDatabase): UserCirclesOrGroupsDao = database.userCirclesOrGroupsDao() } diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt index 6eb4d0aa43b..e9486ca5320 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt @@ -28,6 +28,8 @@ import com.nextcloud.talk.conversationlist.data.network.RetrofitConversationsNet import com.nextcloud.talk.data.database.dao.ChatBlocksDao import com.nextcloud.talk.data.database.dao.ChatMessagesDao import com.nextcloud.talk.data.database.dao.ConversationsDao +import com.nextcloud.talk.data.database.dao.UserCirclesOrGroupsDao +import com.nextcloud.talk.data.database.model.UserGroupsCirclesRepository import com.nextcloud.talk.data.network.NetworkMonitor import com.nextcloud.talk.data.source.local.TalkDatabase import com.nextcloud.talk.data.storage.ArbitraryStoragesRepository @@ -186,4 +188,13 @@ class RepositoryModule { ncApiCoroutines: NcApiCoroutines, currentUserProviderNew: CurrentUserProviderNew ): ConversationCreationRepository = ConversationCreationRepositoryImpl(ncApiCoroutines, currentUserProviderNew) + + @Provides + fun provideUserGroupsCirclesRepository( + userCirclesOrGroupsDao: UserCirclesOrGroupsDao, + ncApiCoroutines: NcApiCoroutines, + userProvider: CurrentUserProviderNew + ): UserGroupsCirclesRepository { + return UserGroupsCirclesRepository(userCirclesOrGroupsDao, ncApiCoroutines, userProvider) + } } diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/UtilsModule.kt b/app/src/main/java/com/nextcloud/talk/dagger/modules/UtilsModule.kt index 05eb3b29fe2..4bd15fc8381 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/UtilsModule.kt +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/UtilsModule.kt @@ -9,7 +9,6 @@ package com.nextcloud.talk.dagger.modules import android.content.Context import com.nextcloud.talk.utils.DateUtils -import com.nextcloud.talk.utils.message.MessageUtils import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil import com.nextcloud.talk.utils.permissions.PlatformPermissionUtilImpl import dagger.Module @@ -29,10 +28,4 @@ class UtilsModule { fun provideDateUtils(context: Context): DateUtils { return DateUtils(context) } - - @Provides - @Reusable - fun provideMessageUtils(context: Context): MessageUtils { - return MessageUtils(context) - } } diff --git a/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt b/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt new file mode 100644 index 00000000000..4b0143b9c98 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt @@ -0,0 +1,32 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.data.database.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.nextcloud.talk.data.database.model.UserCirclesEntity +import com.nextcloud.talk.data.database.model.UserGroupsEntity + +@Dao +interface UserCirclesOrGroupsDao { + + @Query("SELECT groups FROM user_groups") + fun getUserGroups(): List + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertUserGroups(groups:List) + + @Query("SELECT displayName FROM user_circles") + fun getUserCircles(): List + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertUserCircles(circles: List) + +} diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt new file mode 100644 index 00000000000..da0ef500465 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt @@ -0,0 +1,19 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.data.database.model + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "user_circles") +data class UserCirclesEntity( + @PrimaryKey + @ColumnInfo(name = "displayName") + var displayName: String, +) diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt new file mode 100644 index 00000000000..80b32a6e15f --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt @@ -0,0 +1,78 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.data.database.model + +import android.util.Log +import com.nextcloud.talk.api.NcApiCoroutines +import com.nextcloud.talk.data.database.dao.UserCirclesOrGroupsDao +import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import javax.inject.Inject + +class UserGroupsCirclesRepository @Inject constructor( + private val userCirclesOrGroupsDao: UserCirclesOrGroupsDao, + private val ncApiCoroutines: NcApiCoroutines, + private val currentUserProvider: CurrentUserProviderNew +) { + val user = currentUserProvider.currentUser.blockingGet() + suspend fun initialize(): Boolean = withContext(Dispatchers.IO) { + try { + val credentials: String = ApiUtils.getCredentials(user.username, user.token)!! + + coroutineScope { + launch { + val response = ncApiCoroutines.getUserGroups( + credentials, + ApiUtils.getUrlForUserGroups( + user.baseUrl!!, + user.userId!! + ) + ) + val groups = response.ocs?.data?.groups?: emptyList() + + userCirclesOrGroupsDao.insertUserGroups( + groups.map{ + UserGroupsEntity(it) + } + ) + } + + launch { + + val response = ncApiCoroutines.getUserCircles( + credentials, + ApiUtils.getUrlForUserCircles(user.baseUrl!!) + ) + val circles = response.ocs?.data?.map { it.displayName!! }?: emptyList() + userCirclesOrGroupsDao.insertUserCircles( + circles.map{ + UserCirclesEntity(it) + } + ) + } + } + + return@withContext true + } catch (e: Exception) { + Log.e("UserDataRepo", "Error initializing user data", e) + return@withContext false + } + } + + fun getUserGroups(): List { + return userCirclesOrGroupsDao.getUserGroups() + } + + fun getUserCircles(): List { + return userCirclesOrGroupsDao.getUserCircles() + } +} diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt new file mode 100644 index 00000000000..3e1ffcf078d --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt @@ -0,0 +1,18 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.data.database.model + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "user_groups") +data class UserGroupsEntity( + @PrimaryKey + @ColumnInfo (name="groups") var groups: String, +) diff --git a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt index 1108fa394bb..d064e56c153 100644 --- a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt +++ b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt @@ -20,9 +20,12 @@ import com.nextcloud.talk.R import com.nextcloud.talk.data.database.dao.ChatBlocksDao import com.nextcloud.talk.data.database.dao.ChatMessagesDao import com.nextcloud.talk.data.database.dao.ConversationsDao +import com.nextcloud.talk.data.database.dao.UserCirclesOrGroupsDao import com.nextcloud.talk.data.database.model.ChatBlockEntity import com.nextcloud.talk.data.database.model.ChatMessageEntity import com.nextcloud.talk.data.database.model.ConversationEntity +import com.nextcloud.talk.data.database.model.UserCirclesEntity +import com.nextcloud.talk.data.database.model.UserGroupsEntity import com.nextcloud.talk.data.source.local.converters.ArrayListConverter import com.nextcloud.talk.data.source.local.converters.CapabilitiesConverter import com.nextcloud.talk.data.source.local.converters.ExternalSignalingServerConverter @@ -47,7 +50,9 @@ import java.util.Locale ArbitraryStorageEntity::class, ConversationEntity::class, ChatMessageEntity::class, - ChatBlockEntity::class + ChatBlockEntity::class, + UserCirclesEntity:: class, + UserGroupsEntity::class ], version = 16, autoMigrations = [ @@ -72,6 +77,7 @@ abstract class TalkDatabase : RoomDatabase() { abstract fun chatMessagesDao(): ChatMessagesDao abstract fun chatBlocksDao(): ChatBlocksDao abstract fun arbitraryStoragesDao(): ArbitraryStoragesDao + abstract fun userCirclesOrGroupsDao(): UserCirclesOrGroupsDao companion object { const val TAG = "TalkDatabase" From 2b29685d7b621796792c9e0f895118ef6192b614 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 18 Mar 2025 22:36:33 +0100 Subject: [PATCH 09/14] add copyright Signed-off-by: sowjanyakch --- .../nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt | 2 +- .../com/nextcloud/talk/data/database/model/UserCirclesEntity.kt | 2 +- .../talk/data/database/model/UserGroupsCirclesRepository.kt | 2 +- .../com/nextcloud/talk/data/database/model/UserGroupsEntity.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt b/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt index 4b0143b9c98..1122f62de34 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt @@ -1,7 +1,7 @@ /* * Nextcloud Talk - Android Client * - * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-FileCopyrightText: 2025 Sowjanya Kota * SPDX-License-Identifier: GPL-3.0-or-later */ diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt index da0ef500465..edf58703471 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt @@ -1,7 +1,7 @@ /* * Nextcloud Talk - Android Client * - * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-FileCopyrightText: 2025 Sowjanya Kota * SPDX-License-Identifier: GPL-3.0-or-later */ diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt index 80b32a6e15f..e3ee96c2c8b 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt @@ -1,7 +1,7 @@ /* * Nextcloud Talk - Android Client * - * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-FileCopyrightText: 2025 Sowjanya Kota * SPDX-License-Identifier: GPL-3.0-or-later */ diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt index 3e1ffcf078d..8ce47db5230 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt @@ -1,7 +1,7 @@ /* * Nextcloud Talk - Android Client * - * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-FileCopyrightText: 2025 Sowjanya Kota * SPDX-License-Identifier: GPL-3.0-or-later */ From 0a107c455f3c2f5bb9ef2830f0225204e7497b27 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 19 Mar 2025 10:52:51 +0100 Subject: [PATCH 10/14] apply theming to user mentions Signed-off-by: sowjanyakch --- .../nextcloud/talk/activities/MainActivity.kt | 17 +++++++++++++---- .../talk/dagger/modules/RepositoryModule.kt | 4 ++-- .../data/database/dao/UserCirclesOrGroupsDao.kt | 8 +++++++- .../model/UserGroupsCirclesRepository.kt | 11 +++++++---- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt index 7028255f8a6..47d50d8b534 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt @@ -48,6 +48,7 @@ import io.reactivex.SingleObserver import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers +import kotlinx.coroutines.Job import kotlinx.coroutines.launch import javax.inject.Inject @@ -60,6 +61,7 @@ class MainActivity : BaseActivity(), ActionBarProvider { @Inject lateinit var userManager: UserManager + private var job: Job? = null @Inject lateinit var userGroupsOrCirclesRepository: UserGroupsCirclesRepository @@ -92,6 +94,11 @@ class MainActivity : BaseActivity(), ActionBarProvider { handleIntent(intent) + job = lifecycleScope.launch { + val initialized = userGroupsOrCirclesRepository.initialize() + Log.d("MainActivity", "$initialized") + } + onBackPressedDispatcher.addCallback(this, onBackPressedCallback) } @@ -144,6 +151,11 @@ class MainActivity : BaseActivity(), ActionBarProvider { super.onStop() } + override fun onDestroy() { + super.onDestroy() + job?.cancel() + } + private fun openConversationList() { val intent = Intent(this, ConversationsListActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) @@ -152,10 +164,7 @@ class MainActivity : BaseActivity(), ActionBarProvider { } private fun handleActionFromContact(intent: Intent) { - lifecycleScope.launch { - val initialized = userGroupsOrCirclesRepository.initialize() - Log.d("MainActivity", "$initialized") - } + if (intent.action == Intent.ACTION_VIEW && intent.data != null) { val cursor = contentResolver.query(intent.data!!, null, null, null, null) diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt index e9486ca5320..2f052817768 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt @@ -193,8 +193,8 @@ class RepositoryModule { fun provideUserGroupsCirclesRepository( userCirclesOrGroupsDao: UserCirclesOrGroupsDao, ncApiCoroutines: NcApiCoroutines, - userProvider: CurrentUserProviderNew + currentUserProvider: CurrentUserProviderNew ): UserGroupsCirclesRepository { - return UserGroupsCirclesRepository(userCirclesOrGroupsDao, ncApiCoroutines, userProvider) + return UserGroupsCirclesRepository(userCirclesOrGroupsDao, ncApiCoroutines, currentUserProvider) } } diff --git a/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt b/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt index 1122f62de34..9ef26f1104c 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt @@ -18,7 +18,7 @@ import com.nextcloud.talk.data.database.model.UserGroupsEntity interface UserCirclesOrGroupsDao { @Query("SELECT groups FROM user_groups") - fun getUserGroups(): List + fun getUserGroups():List @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertUserGroups(groups:List) @@ -29,4 +29,10 @@ interface UserCirclesOrGroupsDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertUserCircles(circles: List) + @Query("DELETE FROM user_groups") + suspend fun deleteAllUserGroups() + + @Query("DELETE FROM user_circles") + suspend fun deleteAllUserCircles() + } diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt index e3ee96c2c8b..85485158a2c 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt @@ -30,6 +30,7 @@ class UserGroupsCirclesRepository @Inject constructor( coroutineScope { launch { + userCirclesOrGroupsDao.deleteAllUserGroups() val response = ncApiCoroutines.getUserGroups( credentials, ApiUtils.getUrlForUserGroups( @@ -38,7 +39,7 @@ class UserGroupsCirclesRepository @Inject constructor( ) ) val groups = response.ocs?.data?.groups?: emptyList() - + Log.d("UserDataRepo","$groups") userCirclesOrGroupsDao.insertUserGroups( groups.map{ UserGroupsEntity(it) @@ -47,12 +48,13 @@ class UserGroupsCirclesRepository @Inject constructor( } launch { - + userCirclesOrGroupsDao.deleteAllUserCircles() val response = ncApiCoroutines.getUserCircles( credentials, ApiUtils.getUrlForUserCircles(user.baseUrl!!) ) val circles = response.ocs?.data?.map { it.displayName!! }?: emptyList() + Log.d("UserDataRepo","$circles") userCirclesOrGroupsDao.insertUserCircles( circles.map{ UserCirclesEntity(it) @@ -66,13 +68,14 @@ class UserGroupsCirclesRepository @Inject constructor( Log.e("UserDataRepo", "Error initializing user data", e) return@withContext false } + } - fun getUserGroups(): List { + fun getUserGroups(): List { return userCirclesOrGroupsDao.getUserGroups() } - fun getUserCircles(): List { + fun getUserCircles(): List{ return userCirclesOrGroupsDao.getUserCircles() } } From 17f4a20cbde6dc4e6f7ec216098876f8ac779c78 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 19 Mar 2025 11:00:55 +0100 Subject: [PATCH 11/14] ktlintformat Signed-off-by: sowjanyakch --- .../nextcloud/talk/activities/MainActivity.kt | 1 - .../database/dao/UserCirclesOrGroupsDao.kt | 5 +- .../data/database/model/UserCirclesEntity.kt | 2 +- .../model/UserGroupsCirclesRepository.kt | 86 ++++++++++--------- .../data/database/model/UserGroupsEntity.kt | 2 +- .../talk/data/source/local/TalkDatabase.kt | 2 +- .../talk/utils/message/MessageUtils.kt | 2 +- 7 files changed, 50 insertions(+), 50 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt index 47d50d8b534..bc5234956b9 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt @@ -164,7 +164,6 @@ class MainActivity : BaseActivity(), ActionBarProvider { } private fun handleActionFromContact(intent: Intent) { - if (intent.action == Intent.ACTION_VIEW && intent.data != null) { val cursor = contentResolver.query(intent.data!!, null, null, null, null) diff --git a/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt b/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt index 9ef26f1104c..922271c286b 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt @@ -18,10 +18,10 @@ import com.nextcloud.talk.data.database.model.UserGroupsEntity interface UserCirclesOrGroupsDao { @Query("SELECT groups FROM user_groups") - fun getUserGroups():List + fun getUserGroups(): List @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insertUserGroups(groups:List) + suspend fun insertUserGroups(groups: List) @Query("SELECT displayName FROM user_circles") fun getUserCircles(): List @@ -34,5 +34,4 @@ interface UserCirclesOrGroupsDao { @Query("DELETE FROM user_circles") suspend fun deleteAllUserCircles() - } diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt index edf58703471..2e34cd6cab1 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt @@ -15,5 +15,5 @@ import androidx.room.PrimaryKey data class UserCirclesEntity( @PrimaryKey @ColumnInfo(name = "displayName") - var displayName: String, + var displayName: String ) diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt index 85485158a2c..c8b2001d252 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt @@ -24,58 +24,60 @@ class UserGroupsCirclesRepository @Inject constructor( private val currentUserProvider: CurrentUserProviderNew ) { val user = currentUserProvider.currentUser.blockingGet() - suspend fun initialize(): Boolean = withContext(Dispatchers.IO) { - try { - val credentials: String = ApiUtils.getCredentials(user.username, user.token)!! - coroutineScope { - launch { - userCirclesOrGroupsDao.deleteAllUserGroups() - val response = ncApiCoroutines.getUserGroups( - credentials, - ApiUtils.getUrlForUserGroups( - user.baseUrl!!, - user.userId!! + @Suppress("Detekt.TooGenericExceptionCaught") + suspend fun initialize(): Boolean = + withContext(Dispatchers.IO) { + try { + val credentials: String = ApiUtils.getCredentials(user.username, user.token)!! + + coroutineScope { + launch { + userCirclesOrGroupsDao.deleteAllUserGroups() + val response = ncApiCoroutines.getUserGroups( + credentials, + ApiUtils.getUrlForUserGroups( + user.baseUrl!!, + user.userId!! + ) ) - ) - val groups = response.ocs?.data?.groups?: emptyList() - Log.d("UserDataRepo","$groups") - userCirclesOrGroupsDao.insertUserGroups( - groups.map{ - UserGroupsEntity(it) - } - ) - } + val groups = response.ocs?.data?.groups ?: emptyList() + Log.d("UserDataRepo", "$groups") + userCirclesOrGroupsDao.insertUserGroups( + groups.map { + UserGroupsEntity(it) + } + ) + } - launch { - userCirclesOrGroupsDao.deleteAllUserCircles() - val response = ncApiCoroutines.getUserCircles( - credentials, - ApiUtils.getUrlForUserCircles(user.baseUrl!!) - ) - val circles = response.ocs?.data?.map { it.displayName!! }?: emptyList() - Log.d("UserDataRepo","$circles") - userCirclesOrGroupsDao.insertUserCircles( - circles.map{ - UserCirclesEntity(it) - } - ) + launch { + userCirclesOrGroupsDao.deleteAllUserCircles() + val response = ncApiCoroutines.getUserCircles( + credentials, + ApiUtils.getUrlForUserCircles(user.baseUrl!!) + ) + val circles = response.ocs?.data?.map { it.displayName!! } ?: emptyList() + Log.d("UserDataRepo", "$circles") + userCirclesOrGroupsDao.insertUserCircles( + circles.map { + UserCirclesEntity(it) + } + ) + } } - } - return@withContext true - } catch (e: Exception) { - Log.e("UserDataRepo", "Error initializing user data", e) - return@withContext false + return@withContext true + } catch (e: Exception) { + Log.e("UserDataRepo", "Error initializing user data", e) + return@withContext false + } } - } - - fun getUserGroups(): List { + fun getUserGroups(): List { return userCirclesOrGroupsDao.getUserGroups() } - fun getUserCircles(): List{ + fun getUserCircles(): List { return userCirclesOrGroupsDao.getUserCircles() } } diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt index 8ce47db5230..b8938bef3c6 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt @@ -14,5 +14,5 @@ import androidx.room.PrimaryKey @Entity(tableName = "user_groups") data class UserGroupsEntity( @PrimaryKey - @ColumnInfo (name="groups") var groups: String, + @ColumnInfo(name = "groups") var groups: String ) diff --git a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt index d064e56c153..05f8c467a14 100644 --- a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt +++ b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt @@ -51,7 +51,7 @@ import java.util.Locale ConversationEntity::class, ChatMessageEntity::class, ChatBlockEntity::class, - UserCirclesEntity:: class, + UserCirclesEntity::class, UserGroupsEntity::class ], version = 16, 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 456b5ab5289..71392dac299 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 @@ -98,7 +98,7 @@ class MessageUtils(val context: Context) { return processedMessageText } - @Suppress("NestedBlockDepth", "LongParameterList") + @Suppress("NestedBlockDepth", "LongParameterList", "Detekt.LongMethod") private fun processMessageParameters( themingContext: Context, viewThemeUtils: ViewThemeUtils, From e874502d8c31188ac957b8c18aa2c5cf8ca02025 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Thu, 20 Mar 2025 17:33:21 +0100 Subject: [PATCH 12/14] refactor Signed-off-by: sowjanyakch --- .../13.json | 32 +++++++++++++------ .../nextcloud/talk/activities/MainActivity.kt | 14 -------- .../IncomingLinkPreviewMessageViewHolder.kt | 4 ++- .../IncomingPreviewMessageViewHolder.java | 4 ++- .../messages/IncomingTextMessageViewHolder.kt | 22 +++++++++++-- .../OutcomingLinkPreviewMessageViewHolder.kt | 4 ++- .../OutcomingPreviewMessageViewHolder.java | 4 ++- .../OutcomingTextMessageViewHolder.kt | 26 +++++++++++++-- .../ConversationsListActivity.kt | 13 ++++++++ .../database/dao/UserCirclesOrGroupsDao.kt | 9 +++--- .../data/database/model/UserCirclesEntity.kt | 7 ++-- .../model/UserGroupsCirclesRepository.kt | 18 ++++------- .../data/database/model/UserGroupsEntity.kt | 7 ++-- .../talk/utils/message/MessageUtils.kt | 23 +++++++++---- 14 files changed, 129 insertions(+), 58 deletions(-) diff --git a/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/13.json b/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/13.json index f8cb76a68de..fc41c7d0912 100644 --- a/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/13.json +++ b/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/13.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 13, - "identityHash": "f58d9b51b48ddc5c6f4dc4c742eb5f3f", + "identityHash": "b3d3d5405b220baf1819c1397f935f95", "entities": [ { "tableName": "User", @@ -741,19 +741,25 @@ }, { "tableName": "user_circles", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`displayName` TEXT NOT NULL, PRIMARY KEY(`displayName`))", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `displayName` TEXT)", "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, { "fieldPath": "displayName", "columnName": "displayName", "affinity": "TEXT", - "notNull": true + "notNull": false } ], "primaryKey": { - "autoGenerate": false, + "autoGenerate": true, "columnNames": [ - "displayName" + "id" ] }, "indices": [], @@ -761,19 +767,25 @@ }, { "tableName": "user_groups", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groups` TEXT NOT NULL, PRIMARY KEY(`groups`))", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `groups` TEXT)", "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, { "fieldPath": "groups", "columnName": "groups", "affinity": "TEXT", - "notNull": true + "notNull": false } ], "primaryKey": { - "autoGenerate": false, + "autoGenerate": true, "columnNames": [ - "groups" + "id" ] }, "indices": [], @@ -783,7 +795,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f58d9b51b48ddc5c6f4dc4c742eb5f3f')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'b3d3d5405b220baf1819c1397f935f95')" ] } } \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt index bc5234956b9..35997f9cbc5 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt @@ -21,7 +21,6 @@ import androidx.activity.OnBackPressedCallback import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner -import androidx.lifecycle.lifecycleScope import autodagger.AutoInjector import com.google.android.material.snackbar.Snackbar import com.nextcloud.talk.R @@ -31,7 +30,6 @@ import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.conversationlist.ConversationsListActivity -import com.nextcloud.talk.data.database.model.UserGroupsCirclesRepository import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivityMainBinding import com.nextcloud.talk.invitation.InvitationsActivity @@ -48,8 +46,6 @@ import io.reactivex.SingleObserver import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers -import kotlinx.coroutines.Job -import kotlinx.coroutines.launch import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) @@ -61,10 +57,6 @@ class MainActivity : BaseActivity(), ActionBarProvider { @Inject lateinit var userManager: UserManager - private var job: Job? = null - - @Inject - lateinit var userGroupsOrCirclesRepository: UserGroupsCirclesRepository private val onBackPressedCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { @@ -94,11 +86,6 @@ class MainActivity : BaseActivity(), ActionBarProvider { handleIntent(intent) - job = lifecycleScope.launch { - val initialized = userGroupsOrCirclesRepository.initialize() - Log.d("MainActivity", "$initialized") - } - onBackPressedDispatcher.addCallback(this, onBackPressedCallback) } @@ -153,7 +140,6 @@ class MainActivity : BaseActivity(), ActionBarProvider { override fun onDestroy() { super.onDestroy() - job?.cancel() } private fun openConversationList() { diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLinkPreviewMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLinkPreviewMessageViewHolder.kt index b1993172676..8c6f6c7301b 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLinkPreviewMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLinkPreviewMessageViewHolder.kt @@ -83,7 +83,9 @@ class IncomingLinkPreviewMessageViewHolder(incomingView: View, payload: Any) : viewThemeUtils, processedMessageText!!, message, - itemView + itemView, + null, + null ) binding.messageText.text = processedMessageText diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPreviewMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPreviewMessageViewHolder.java index 572bd9e9ac5..21c1a738538 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPreviewMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPreviewMessageViewHolder.java @@ -60,7 +60,9 @@ public void onBind(@NonNull ChatMessage message) { viewThemeUtils, processedMessageText, message, - binding.incomingPreviewMessageBubble); + binding.incomingPreviewMessageBubble, + null, + null); } binding.incomingPreviewMessageBubble.setOnClickListener(null); diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt index 18b298756d7..b9c4763f2e3 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt @@ -27,6 +27,7 @@ import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.chat.data.ChatMessageRepository import com.nextcloud.talk.chat.data.model.ChatMessage import com.nextcloud.talk.data.user.model.User +import com.nextcloud.talk.data.database.model.UserGroupsCirclesRepository import com.nextcloud.talk.databinding.ItemCustomIncomingTextMessageBinding import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils @@ -43,6 +44,8 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.Date @@ -74,6 +77,11 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) : lateinit var commonMessageInterface: CommonMessageInterface + @Inject + lateinit var userGroupsCirclesRepository: UserGroupsCirclesRepository + + private val coroutineScope = CoroutineScope(Dispatchers.Main) + @Inject lateinit var chatRepository: ChatMessageRepository @@ -95,7 +103,14 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) : private fun processMessage(message: ChatMessage, hasCheckboxes: Boolean) { var textSize = context.resources!!.getDimension(R.dimen.chat_text_size) - if (!hasCheckboxes) { + coroutineScope.launch { + val userGroups = userGroupsCirclesRepository.getUserGroups() + .map { list -> list.mapNotNull { it.groups } }.firstOrNull() ?: emptyList() + + val userCircles = userGroupsCirclesRepository.getUserCircles() + .map { list -> list.mapNotNull { it.displayName } }.firstOrNull() ?: emptyList() + + if (!hasCheckboxes) { binding.messageText.visibility = View.VISIBLE binding.checkboxContainer.visibility = View.GONE var processedMessageText = messageUtils.enrichChatMessageText( @@ -132,7 +147,9 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) : viewThemeUtils, processedMessageText, message, - itemView + itemView, + userGroups, + userCircles ) val messageParameters = message.messageParameters if ( @@ -178,6 +195,7 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) : viewThemeUtils ) } + } private fun processCheckboxes(chatMessage: ChatMessage, user: User): Boolean { val chatActivity = commonMessageInterface as ChatActivity diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLinkPreviewMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLinkPreviewMessageViewHolder.kt index 8d553dae323..bd02a97a63a 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLinkPreviewMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLinkPreviewMessageViewHolder.kt @@ -83,7 +83,9 @@ class OutcomingLinkPreviewMessageViewHolder(outcomingView: View, payload: Any) : viewThemeUtils, processedMessageText!!, message, - itemView + itemView, + null, + null ) binding.messageText.text = processedMessageText diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPreviewMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPreviewMessageViewHolder.java index eb7d54452c9..c5ca7effa2a 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPreviewMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPreviewMessageViewHolder.java @@ -60,7 +60,9 @@ public void onBind(@NonNull ChatMessage message) { viewThemeUtils, processedMessageText, message, - binding.outgoingPreviewMessageBubble); + binding.outgoingPreviewMessageBubble, + null, + null); } binding.outgoingPreviewMessageBubble.setOnClickListener(null); 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 dc3aea52d32..a123d4416bd 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 @@ -29,6 +29,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedA import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.chat.data.ChatMessageRepository import com.nextcloud.talk.chat.data.model.ChatMessage +import com.nextcloud.talk.data.database.model.UserGroupsCirclesRepository import com.nextcloud.talk.data.network.NetworkMonitor import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ItemCustomOutcomingTextMessageBinding @@ -47,6 +48,8 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.Date @@ -85,6 +88,11 @@ class OutcomingTextMessageViewHolder(itemView: View) : private var job: Job? = null + @Inject + lateinit var userGroupsCirclesRepository: UserGroupsCirclesRepository + + private val coroutineScope = CoroutineScope(Dispatchers.Main) + @Suppress("Detekt.LongMethod") override fun onBind(message: ChatMessage) { super.onBind(message) @@ -106,6 +114,13 @@ class OutcomingTextMessageViewHolder(itemView: View) : realView.isSelected = false layoutParams.isWrapBefore = false viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT) + viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT) + coroutineScope.launch { + val userGroups = userGroupsCirclesRepository.getUserGroups() + .map { list -> list.mapNotNull { it.groups } }.firstOrNull() ?: emptyList() + + val userCircles = userGroupsCirclesRepository.getUserCircles() + .map { list -> list.mapNotNull { it.displayName } }.firstOrNull() ?: emptyList() binding.messageText.visibility = View.VISIBLE binding.checkboxContainer.visibility = View.GONE @@ -114,7 +129,8 @@ class OutcomingTextMessageViewHolder(itemView: View) : binding.messageText.context, message, false, - viewThemeUtils + viewThemeUtils, + ) val spansFromString: Array = processedMessageText!!.getSpans( @@ -144,8 +160,13 @@ class OutcomingTextMessageViewHolder(itemView: View) : viewThemeUtils, processedMessageText, message, - itemView + itemView, + userGroups, + userCircles ) + binding.messageText.text = processedMessageText + } + if ( (message.messageParameters == null || message.messageParameters!!.size <= 0) && @@ -220,6 +241,7 @@ class OutcomingTextMessageViewHolder(itemView: View) : ) } + private fun processCheckboxes(chatMessage: ChatMessage, user: User): Boolean { val chatActivity = commonMessageInterface as ChatActivity val message = chatMessage.message!!.toSpanned() diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index 1086d9d8e50..2e73a43b5c7 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -89,6 +89,7 @@ import com.nextcloud.talk.contacts.ContactsUiState import com.nextcloud.talk.contacts.ContactsViewModel import com.nextcloud.talk.contacts.RoomUiState import com.nextcloud.talk.conversationlist.viewmodels.ConversationsListViewModel +import com.nextcloud.talk.data.database.model.UserGroupsCirclesRepository import com.nextcloud.talk.data.network.NetworkMonitor import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivityConversationsBinding @@ -152,6 +153,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers import io.reactivex.subjects.BehaviorSubject +import kotlinx.coroutines.Job import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch @@ -202,6 +204,11 @@ class ConversationsListActivity : lateinit var conversationsListViewModel: ConversationsListViewModel + private var job: Job? = null + + @Inject + lateinit var userGroupsOrCirclesRepository: UserGroupsCirclesRepository + override val appBarLayoutType: AppBarLayoutType get() = AppBarLayoutType.SEARCH_BAR @@ -271,6 +278,11 @@ class ConversationsListActivity : forwardMessage = intent.getBooleanExtra(KEY_FORWARD_MSG_FLAG, false) onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + job = lifecycleScope.launch { + val initialized = userGroupsOrCirclesRepository.initialize() + Log.d("MainActivity", "$initialized") + } + initObservers() } @@ -1355,6 +1367,7 @@ class ConversationsListActivity : if (searchViewDisposable != null && !searchViewDisposable!!.isDisposed) { searchViewDisposable!!.dispose() } + job?.cancel() } private fun onQueryTextChange(newText: String?) { diff --git a/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt b/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt index 922271c286b..0bcdc80e6ad 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/dao/UserCirclesOrGroupsDao.kt @@ -13,18 +13,19 @@ import androidx.room.OnConflictStrategy import androidx.room.Query import com.nextcloud.talk.data.database.model.UserCirclesEntity import com.nextcloud.talk.data.database.model.UserGroupsEntity +import kotlinx.coroutines.flow.Flow @Dao interface UserCirclesOrGroupsDao { - @Query("SELECT groups FROM user_groups") - fun getUserGroups(): List + @Query("SELECT * FROM user_groups") + fun getUserGroups(): Flow> @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertUserGroups(groups: List) - @Query("SELECT displayName FROM user_circles") - fun getUserCircles(): List + @Query("SELECT * FROM user_circles") + fun getUserCircles(): Flow> @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertUserCircles(circles: List) diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt index 2e34cd6cab1..7d2ae4d8951 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserCirclesEntity.kt @@ -10,10 +10,13 @@ package com.nextcloud.talk.data.database.model import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey +import javax.annotation.Nonnull @Entity(tableName = "user_circles") data class UserCirclesEntity( - @PrimaryKey + @Nonnull + @PrimaryKey(autoGenerate = true) + @ColumnInfo(name = "id") var id: Int = 0, @ColumnInfo(name = "displayName") - var displayName: String + var displayName: String? ) diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt index c8b2001d252..95fa31c2980 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsCirclesRepository.kt @@ -14,6 +14,7 @@ import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Inject @@ -23,12 +24,12 @@ class UserGroupsCirclesRepository @Inject constructor( private val ncApiCoroutines: NcApiCoroutines, private val currentUserProvider: CurrentUserProviderNew ) { - val user = currentUserProvider.currentUser.blockingGet() @Suppress("Detekt.TooGenericExceptionCaught") suspend fun initialize(): Boolean = withContext(Dispatchers.IO) { try { + val user = currentUserProvider.currentUser.blockingGet() val credentials: String = ApiUtils.getCredentials(user.username, user.token)!! coroutineScope { @@ -45,7 +46,7 @@ class UserGroupsCirclesRepository @Inject constructor( Log.d("UserDataRepo", "$groups") userCirclesOrGroupsDao.insertUserGroups( groups.map { - UserGroupsEntity(it) + UserGroupsEntity(id = 0, it) } ) } @@ -60,24 +61,17 @@ class UserGroupsCirclesRepository @Inject constructor( Log.d("UserDataRepo", "$circles") userCirclesOrGroupsDao.insertUserCircles( circles.map { - UserCirclesEntity(it) + UserCirclesEntity(id = 0, it) } ) } } - return@withContext true } catch (e: Exception) { Log.e("UserDataRepo", "Error initializing user data", e) return@withContext false } } - - fun getUserGroups(): List { - return userCirclesOrGroupsDao.getUserGroups() - } - - fun getUserCircles(): List { - return userCirclesOrGroupsDao.getUserCircles() - } + fun getUserGroups(): Flow> = userCirclesOrGroupsDao.getUserGroups() + fun getUserCircles(): Flow> = userCirclesOrGroupsDao.getUserCircles() } diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt index b8938bef3c6..c781fab2ea1 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/UserGroupsEntity.kt @@ -10,9 +10,12 @@ package com.nextcloud.talk.data.database.model import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey +import javax.annotation.Nonnull @Entity(tableName = "user_groups") data class UserGroupsEntity( - @PrimaryKey - @ColumnInfo(name = "groups") var groups: String + @Nonnull + @PrimaryKey(autoGenerate = true) + @ColumnInfo(name = "id") var id: Int = 0, + @ColumnInfo(name = "groups") var groups: String? ) 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 71392dac299..480ab11a0a6 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 @@ -28,8 +28,9 @@ import io.noties.markwon.ext.strikethrough.StrikethroughPlugin import io.noties.markwon.ext.tables.TablePlugin import io.noties.markwon.ext.tasklist.TaskListDrawable import io.noties.markwon.ext.tasklist.TaskListPlugin +import javax.inject.Inject -class MessageUtils(val context: Context) { +class MessageUtils @Inject constructor(val context: Context) { fun enrichChatReplyMessageText( context: Context, @@ -81,7 +82,9 @@ class MessageUtils(val context: Context) { viewThemeUtils: ViewThemeUtils, spannedText: Spanned, message: ChatMessage, - itemView: View? + itemView: View?, + userGroups: List?, + userCircles: List? ): Spanned { var processedMessageText = spannedText val messageParameters = message.messageParameters @@ -92,7 +95,10 @@ class MessageUtils(val context: Context) { messageParameters, message, processedMessageText, - itemView + itemView, + userGroups ?: emptyList(), + userCircles ?: emptyList() + ) } return processedMessageText @@ -105,16 +111,21 @@ class MessageUtils(val context: Context) { messageParameters: HashMap>, message: ChatMessage, messageString: Spanned, - itemView: View? + itemView: View?, + userGroups: List, + userCircles: List ): Spanned { var messageStringInternal = messageString for (key in messageParameters.keys) { val individualHashMap = message.messageParameters?.get(key) if (individualHashMap != null) { - when (individualHashMap["type"]) { "user", "guest", "call", "user-group", "email", "circle" -> { - val chip = if (individualHashMap["id"]?.equals(message.activeUser?.userId) == true) { + val chip = if (individualHashMap["id"] == message.activeUser!!.userId || + userGroups.any { it == individualHashMap["name"] } || + userCircles.any { it == individualHashMap["name"] } || + individualHashMap["type"] == "call" + ) { R.xml.chip_you } else { R.xml.chip_others From b92020d0d0e6466f4bf9d7476c17fe9b66208f61 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Thu, 20 Mar 2025 19:04:57 +0100 Subject: [PATCH 13/14] logging info Signed-off-by: sowjanyakch --- .../talk/conversationlist/ConversationsListActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index 2e73a43b5c7..d5dceebb5e3 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -280,7 +280,7 @@ class ConversationsListActivity : job = lifecycleScope.launch { val initialized = userGroupsOrCirclesRepository.initialize() - Log.d("MainActivity", "$initialized") + Log.d(TAG, "user groups and circles - $initialized ") } initObservers() From 689f5ede9ecbcfdfa0f65500697dfdd58dad9631 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 16 Apr 2025 11:46:32 +0200 Subject: [PATCH 14/14] detekt + merge conflicts Signed-off-by: sowjanyakch --- .../messages/IncomingTextMessageViewHolder.kt | 35 +++++++++----- .../OutcomingTextMessageViewHolder.kt | 47 +++++++++++-------- .../nextcloud/talk/ui/ComposeChatAdapter.kt | 2 +- .../talk/utils/message/MessageUtils.kt | 1 + 4 files changed, 51 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt index b9c4763f2e3..26f19775e51 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt @@ -94,23 +94,33 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) : colorizeMessageBubble(message) itemView.isSelected = false val user = currentUserProvider.currentUser.blockingGet() - val hasCheckboxes = processCheckboxes( - message, - user - ) - processMessage(message, hasCheckboxes) - } - - private fun processMessage(message: ChatMessage, hasCheckboxes: Boolean) { - var textSize = context.resources!!.getDimension(R.dimen.chat_text_size) + lateinit var userGroups: List + lateinit var userCircles: List coroutineScope.launch { - val userGroups = userGroupsCirclesRepository.getUserGroups() + userGroups = userGroupsCirclesRepository.getUserGroups() .map { list -> list.mapNotNull { it.groups } }.firstOrNull() ?: emptyList() - val userCircles = userGroupsCirclesRepository.getUserCircles() + userCircles = userGroupsCirclesRepository.getUserCircles() .map { list -> list.mapNotNull { it.displayName } }.firstOrNull() ?: emptyList() - if (!hasCheckboxes) { + val hasCheckboxes = processCheckboxes( + message, + user + ) + processMessage(message, hasCheckboxes, userGroups, userCircles) + } + } + + @Suppress("Detekt.LongMethod") + private fun processMessage( + message: ChatMessage, + hasCheckboxes: Boolean, + userGroups: List, + userCircles: List + ) { + var textSize = context.resources!!.getDimension(R.dimen.chat_text_size) + + if (!hasCheckboxes) { binding.messageText.visibility = View.VISIBLE binding.checkboxContainer.visibility = View.GONE var processedMessageText = messageUtils.enrichChatMessageText( @@ -195,7 +205,6 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) : viewThemeUtils ) } - } private fun processCheckboxes(chatMessage: ChatMessage, user: User): Boolean { val chatActivity = commonMessageInterface as ChatActivity 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 a123d4416bd..8778e0ad279 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 @@ -93,20 +93,34 @@ class OutcomingTextMessageViewHolder(itemView: View) : private val coroutineScope = CoroutineScope(Dispatchers.Main) - @Suppress("Detekt.LongMethod") override fun onBind(message: ChatMessage) { super.onBind(message) sharedApplication!!.componentApplication.inject(this) val user = currentUserProvider.currentUser.blockingGet() - val hasCheckboxes = processCheckboxes( - message, - user - ) - processMessage(message, hasCheckboxes) + lateinit var userGroups: List + lateinit var userCircles: List + coroutineScope.launch { + userGroups = userGroupsCirclesRepository.getUserGroups() + .map { list -> list.mapNotNull { it.groups } }.firstOrNull() ?: emptyList() + + userCircles = userGroupsCirclesRepository.getUserCircles() + .map { list -> list.mapNotNull { it.displayName } }.firstOrNull() ?: emptyList() + + val hasCheckboxes = processCheckboxes( + message, + user + ) + processMessage(message, hasCheckboxes, userCircles, userGroups) + } } @Suppress("Detekt.LongMethod") - private fun processMessage(message: ChatMessage, hasCheckboxes: Boolean) { + private fun processMessage( + message: ChatMessage, + hasCheckboxes: Boolean, + userGroups: List, + userCircles: List + ) { var isBubbled = true val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams var textSize = context.resources.getDimension(R.dimen.chat_text_size) @@ -114,13 +128,7 @@ class OutcomingTextMessageViewHolder(itemView: View) : realView.isSelected = false layoutParams.isWrapBefore = false viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT) - viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT) - coroutineScope.launch { - val userGroups = userGroupsCirclesRepository.getUserGroups() - .map { list -> list.mapNotNull { it.groups } }.firstOrNull() ?: emptyList() - - val userCircles = userGroupsCirclesRepository.getUserCircles() - .map { list -> list.mapNotNull { it.displayName } }.firstOrNull() ?: emptyList() + viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT) binding.messageText.visibility = View.VISIBLE binding.checkboxContainer.visibility = View.GONE @@ -129,7 +137,7 @@ class OutcomingTextMessageViewHolder(itemView: View) : binding.messageText.context, message, false, - viewThemeUtils, + viewThemeUtils ) @@ -165,8 +173,6 @@ class OutcomingTextMessageViewHolder(itemView: View) : userCircles ) binding.messageText.text = processedMessageText - } - if ( (message.messageParameters == null || message.messageParameters!!.size <= 0) && @@ -177,7 +183,6 @@ class OutcomingTextMessageViewHolder(itemView: View) : realView.isSelected = true isBubbled = false } - binding.messageTime.layoutParams = layoutParams viewThemeUtils.platform.colorTextView(binding.messageText, ColorRole.ON_SURFACE_VARIANT) binding.messageText.text = processedMessageText @@ -207,7 +212,10 @@ class OutcomingTextMessageViewHolder(itemView: View) : binding.sendingProgress.visibility = View.GONE if (message.sendingFailed) { - updateStatus(R.drawable.baseline_error_outline_24, context.resources?.getString(R.string.nc_message_failed)) + updateStatus( + R.drawable.baseline_error_outline_24, + context.resources?.getString(R.string.nc_message_failed) + ) } else if (message.isTemporary) { updateStatus(R.drawable.baseline_schedule_24, context.resources?.getString(R.string.nc_message_sending)) } else if (message.readStatus == ReadStatus.READ) { @@ -241,7 +249,6 @@ class OutcomingTextMessageViewHolder(itemView: View) : ) } - private fun processCheckboxes(chatMessage: ChatMessage, user: User): Boolean { val chatActivity = commonMessageInterface as ChatActivity val message = chatMessage.message!!.toSpanned() diff --git a/app/src/main/java/com/nextcloud/talk/ui/ComposeChatAdapter.kt b/app/src/main/java/com/nextcloud/talk/ui/ComposeChatAdapter.kt index e473f0684c8..cb626e0386d 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/ComposeChatAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/ComposeChatAdapter.kt @@ -621,7 +621,7 @@ class ComposeChatAdapter( ) processedMessageText = viewModel.messageUtils.processMessageParameters( - ctx, viewModel.viewThemeUtils, processedMessageText!!, message, null + ctx, viewModel.viewThemeUtils, processedMessageText!!, message, null, null, null ) EmojiTextView(ctx).apply { 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 480ab11a0a6..1d08bbb9f99 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 @@ -77,6 +77,7 @@ class MessageUtils @Inject constructor(val context: Context) { return viewThemeUtils.talk.themeMarkdown(context, message, incoming) } + @Suppress("LongParameterList") fun processMessageParameters( themingContext: Context, viewThemeUtils: ViewThemeUtils,