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 6511456fb..54bf4a934 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt +++ b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt @@ -293,4 +293,7 @@ interface NcApiCoroutines { @GET suspend fun getThreads(@Header("Authorization") authorization: String, @Url url: String): ThreadsOverall + + @GET + suspend fun getThread(@Header("Authorization") authorization: String, @Url url: String): ThreadOverall } 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 ac92656af..ea2526cf9 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -148,6 +148,7 @@ import com.nextcloud.talk.models.json.chat.ReadStatus import com.nextcloud.talk.models.json.conversations.ConversationEnums import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall +import com.nextcloud.talk.models.json.threads.ThreadInfo import com.nextcloud.talk.polls.ui.PollCreateDialogFragment import com.nextcloud.talk.remotefilebrowser.activities.RemoteFileBrowserActivity import com.nextcloud.talk.shareditems.activities.SharedItemsActivity @@ -353,6 +354,7 @@ class ChatActivity : var sessionIdAfterRoomJoined: String? = null lateinit var roomToken: String var threadId: Long? = null + var thread: ThreadInfo? = null var conversationUser: User? = null lateinit var spreedCapabilities: SpreedCapability var chatApiVersion: Int = 1 @@ -507,6 +509,16 @@ class ChatActivity : threadId ) + threadId?.let{ + val threadUrl = ApiUtils.getUrlForThread( + version = 1, + baseUrl = conversationUser!!.baseUrl, + token = roomToken, + threadId = it.toInt() + ) + chatViewModel.getThread(credentials, threadUrl) + } + messageInputFragment = getMessageInputFragment() messageInputViewModel = ViewModelProvider(this, viewModelFactory)[MessageInputViewModel::class.java] messageInputViewModel.setData(chatViewModel.getChatRepository()) @@ -1270,6 +1282,24 @@ class ChatActivity : } } } + + this.lifecycleScope.launch { + chatViewModel.threadRetrieveState.collect { uiState -> + when (uiState) { + ChatViewModel.ThreadRetrieveUiState.None -> { + } + + is ChatViewModel.ThreadRetrieveUiState.Error -> { + Log.e(TAG, "Error when retrieving thread") + Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show() + } + + is ChatViewModel.ThreadRetrieveUiState.Success -> { + thread = uiState.thread + } + } + } + } } private fun removeUnreadMessagesMarker() { @@ -2637,7 +2667,7 @@ class ChatActivity : title.text = if (isChatThread()) { - "Thread $threadId" + thread?.first?.message } else if (currentConversation?.displayName != null) { try { EmojiCompat.get().process(currentConversation?.displayName as CharSequence).toString() @@ -2649,7 +2679,13 @@ class ChatActivity : "" } - if (currentConversation?.type == ConversationEnums.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL) { + if (isChatThread()) { + val repliesAmountTitle = String.format( + resources.getString(R.string.thread_replies_amount), + thread?.thread?.numReplies + ) + statusMessageViewContents(repliesAmountTitle) + } else if (currentConversation?.type == ConversationEnums.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL) { var statusMessage = "" if (currentConversation?.statusIcon != null) { statusMessage += currentConversation?.statusIcon 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 74f39fa0f..230d6b80a 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 @@ -40,6 +40,7 @@ import com.nextcloud.talk.models.json.reminder.Reminder import com.nextcloud.talk.models.json.threads.ThreadInfo import com.nextcloud.talk.models.json.userAbsence.UserAbsenceData import com.nextcloud.talk.repositories.reactions.ReactionsRepository +import com.nextcloud.talk.threadsoverview.data.ThreadsRepository import com.nextcloud.talk.ui.PlaybackSpeed import com.nextcloud.talk.utils.bundle.BundleKeys import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew @@ -68,6 +69,7 @@ class ChatViewModel @Inject constructor( private val appPreferences: AppPreferences, private val chatNetworkDataSource: ChatNetworkDataSource, private val chatRepository: ChatMessageRepository, + private val threadsRepository: ThreadsRepository, private val conversationRepository: OfflineConversationsRepository, private val reactionsRepository: ReactionsRepository, private val mediaRecorderManager: MediaRecorderManager, @@ -162,6 +164,9 @@ class ChatViewModel @Inject constructor( private val _threadCreationState = MutableStateFlow(ThreadCreationUiState.None) val threadCreationState: StateFlow = _threadCreationState + private val _threadRetrieveState = MutableStateFlow(ThreadRetrieveUiState.None) + val threadRetrieveState: StateFlow = _threadRetrieveState + val getOpenGraph: LiveData get() = _getOpenGraph private val _getOpenGraph: MutableLiveData = MutableLiveData() @@ -435,6 +440,13 @@ class ChatViewModel @Inject constructor( } } + fun getThread(credentials: String, url: String) { + viewModelScope.launch { + val thread = threadsRepository.getThread(credentials, url) + _threadRetrieveState.value = ThreadRetrieveUiState.Success(thread.ocs?.data) + } + } + fun loadMessages(withCredentials: String, withUrl: String) { val bundle = Bundle() bundle.putString(BundleKeys.KEY_CHAT_URL, withUrl) @@ -890,4 +902,10 @@ class ChatViewModel @Inject constructor( data class Success(val thread: ThreadInfo?) : ThreadCreationUiState() data class Error(val message: String) : ThreadCreationUiState() } + + sealed class ThreadRetrieveUiState { + data object None : ThreadRetrieveUiState() + data class Success(val thread: ThreadInfo?) : ThreadRetrieveUiState() + data class Error(val message: String) : ThreadRetrieveUiState() + } } diff --git a/app/src/main/java/com/nextcloud/talk/threadsoverview/data/ThreadsRepository.kt b/app/src/main/java/com/nextcloud/talk/threadsoverview/data/ThreadsRepository.kt index a829124e4..d2b2f17e5 100644 --- a/app/src/main/java/com/nextcloud/talk/threadsoverview/data/ThreadsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/threadsoverview/data/ThreadsRepository.kt @@ -7,9 +7,12 @@ package com.nextcloud.talk.threadsoverview.data +import com.nextcloud.talk.models.json.threads.ThreadOverall import com.nextcloud.talk.models.json.threads.ThreadsOverall interface ThreadsRepository { suspend fun getThreads(credentials: String, url: String): ThreadsOverall + + suspend fun getThread(credentials: String, url: String): ThreadOverall } diff --git a/app/src/main/java/com/nextcloud/talk/threadsoverview/data/ThreadsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/threadsoverview/data/ThreadsRepositoryImpl.kt index 84f9e497a..a4d002f59 100644 --- a/app/src/main/java/com/nextcloud/talk/threadsoverview/data/ThreadsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/threadsoverview/data/ThreadsRepositoryImpl.kt @@ -9,6 +9,7 @@ package com.nextcloud.talk.threadsoverview.data import com.nextcloud.talk.api.NcApiCoroutines import com.nextcloud.talk.data.user.model.User +import com.nextcloud.talk.models.json.threads.ThreadOverall import com.nextcloud.talk.models.json.threads.ThreadsOverall import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew import javax.inject.Inject @@ -24,6 +25,10 @@ class ThreadsRepositoryImpl @Inject constructor( return ncApiCoroutines.getThreads(credentials, url) } + override suspend fun getThread(credentials: String, url: String): ThreadOverall { + return ncApiCoroutines.getThread(credentials, url) + } + companion object { val TAG = ThreadsRepositoryImpl::class.simpleName } diff --git a/app/src/main/java/com/nextcloud/talk/utils/preview/ComposePreviewUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/preview/ComposePreviewUtils.kt index 6bad62ae5..c2924d59a 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preview/ComposePreviewUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/preview/ComposePreviewUtils.kt @@ -41,6 +41,8 @@ import com.nextcloud.talk.data.user.UsersRepository import com.nextcloud.talk.data.user.UsersRepositoryImpl import com.nextcloud.talk.repositories.reactions.ReactionsRepository import com.nextcloud.talk.repositories.reactions.ReactionsRepositoryImpl +import com.nextcloud.talk.threadsoverview.data.ThreadsRepository +import com.nextcloud.talk.threadsoverview.data.ThreadsRepositoryImpl import com.nextcloud.talk.ui.theme.MaterialSchemesProviderImpl import com.nextcloud.talk.ui.theme.TalkSpecificViewThemeUtils import com.nextcloud.talk.ui.theme.ViewThemeUtils @@ -147,6 +149,9 @@ class ComposePreviewUtils private constructor(context: Context) { userProvider ) + val threadsRepository: ThreadsRepository + get() = ThreadsRepositoryImpl(ncApiCoroutines, userProvider) + val conversationNetworkDataSource: ConversationsNetworkDataSource get() = RetrofitConversationsNetwork(ncApi) @@ -173,6 +178,7 @@ class ComposePreviewUtils private constructor(context: Context) { appPreferences, chatNetworkDataSource, chatRepository, + threadsRepository, conversationRepository, reactionsRepository, mediaRecorderManager, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0de29fbe9..2a6cacda1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -553,6 +553,7 @@ How to translate with transifex: Reply in thread Show threads Recent threads + %1$d replies Add to conversation