From 01b80a07538613b9dfc8a082fd8440448fa4cdbb Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 19 May 2025 19:59:38 +0200 Subject: [PATCH] retain conversation successfully Signed-off-by: sowjanyakch --- .../com/nextcloud/talk/api/NcApiCoroutines.kt | 3 ++ .../com/nextcloud/talk/chat/ChatActivity.kt | 36 ++++++++++++++----- .../data/network/ChatNetworkDataSource.kt | 1 + .../chat/data/network/RetrofitChatNetwork.kt | 5 +++ .../talk/chat/viewmodels/ChatViewModel.kt | 21 +++++++++++ .../java/com/nextcloud/talk/utils/ApiUtils.kt | 4 +++ app/src/main/res/values/strings.xml | 1 + 7 files changed, 62 insertions(+), 9 deletions(-) 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 351115c60..876e66e00 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt +++ b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt @@ -258,4 +258,7 @@ interface NcApiCoroutines { @GET suspend fun getProfile(@Header("Authorization") authorization: String, @Url url: String): ProfileOverall + + @DELETE + suspend fun unbindRoom(@Header("Authorization") authorization: String, @Url url: String): GenericOverall } 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 d7eadc71f..e2cd8243a 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -1073,6 +1073,27 @@ class ChatActivity : binding.voiceRecordingLock.y -= y } + chatViewModel.unbindRoomResult.observe(this) { uiState -> + when (uiState) { + is ChatViewModel.UnbindRoomUiState.Success -> { + binding.conversationDeleteNotice.visibility = View.GONE + Snackbar.make( + binding.root, + context.getString(R.string.nc_room_retention), + Snackbar.LENGTH_LONG + ).show() + } + is ChatViewModel.UnbindRoomUiState.Error -> { + Snackbar.make( + binding.root, + context.getString(R.string.nc_common_error_sorry), + Snackbar.LENGTH_LONG + ).show() + } + else -> { } + } + } + chatViewModel.outOfOfficeViewState.observe(this) { uiState -> when (uiState) { is ChatViewModel.OutOfOfficeUIState.Error -> { @@ -1188,16 +1209,16 @@ class ChatActivity : } } - fun showConversationDeletionWarning(retentionPeriod: Int) { + fun showConversationDeletionWarning(retentionPeriod: Int) { binding.conversationDeleteNotice.visibility = View.VISIBLE binding.conversationDeleteNotice.apply { isClickable = false isFocusable = false bringToFront() } - val deleteNoticeText = binding.conversationDeleteNotice.findViewById(R.id.deletion_message) + val deleteNoticeText = binding.conversationDeleteNotice.findViewById(R.id.deletion_message) - deleteNoticeText.text = String.format( + deleteNoticeText.text = String.format( resources.getString(R.string.nc_conversation_auto_delete_notice), retentionPeriod ) @@ -1206,14 +1227,12 @@ class ChatActivity : deleteConversationDialog(it.context) } - binding.conversationDeleteNotice.findViewById(R.id.keep_button).setOnClickListener{ - + binding.conversationDeleteNotice.findViewById(R.id.keep_button).setOnClickListener { + chatViewModel.unbindRoom(credentials!!, conversationUser?.baseUrl!!, currentConversation?.token!!) } } - - fun deleteConversationDialog(context:Context){ - + fun deleteConversationDialog(context: Context) { val dialogBuilder = MaterialAlertDialogBuilder(context) .setIcon( viewThemeUtils.dialog @@ -1236,7 +1255,6 @@ class ChatActivity : dialog.getButton(AlertDialog.BUTTON_POSITIVE), dialog.getButton(AlertDialog.BUTTON_NEGATIVE) ) - } @Suppress("Detekt.TooGenericExceptionCaught") 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 a533221dc..7276f4489 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 @@ -76,4 +76,5 @@ interface ChatNetworkDataSource { limit: Int ): List suspend fun getOpenGraph(credentials: String, baseUrl: String, extractedLinkToPreview: String): Reference? + suspend fun unbindRoom(credentials: String, baseUrl: String, roomToken: String): GenericOverall } 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 07989ffdb..bf36274f6 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 @@ -217,4 +217,9 @@ class RetrofitChatNetwork( extractedLinkToPreview ).blockingFirst().ocs?.data?.references?.entries?.iterator()?.next()?.value } + + override suspend fun unbindRoom(credentials: String, baseUrl: String, roomToken: String): GenericOverall { + val url = ApiUtils.getUrlForUnbindingRoom(baseUrl, roomToken) + return ncApiCoroutines.unbindRoom(credentials, url) + } } 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 617e949cd..d9e38e59b 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 @@ -146,6 +146,10 @@ class ChatViewModel @Inject constructor( val outOfOfficeViewState: LiveData get() = _outOfOfficeViewState + private val _unbindRoomResult = MutableLiveData(UnbindRoomUiState.None) + val unbindRoomResult: LiveData + get() = _unbindRoomResult + private val _voiceMessagePlaybackSpeedPreferences: MutableLiveData> = MutableLiveData() val voiceMessagePlaybackSpeedPreferences: LiveData> get() = _voiceMessagePlaybackSpeedPreferences @@ -804,6 +808,17 @@ class ChatViewModel @Inject constructor( } } + fun unbindRoom(credentials: String, baseUrl: String, roomToken: String) { + viewModelScope.launch { + try { + val response = chatNetworkDataSource.unbindRoom(credentials, baseUrl, roomToken) + _unbindRoomResult.value = UnbindRoomUiState.Success(response.ocs?.meta?.statusCode!!) + } catch (exception: Exception) { + _unbindRoomResult.value = UnbindRoomUiState.Error(exception.message.toString()) + } + } + } + fun resendMessage(credentials: String, urlForChat: String, message: ChatMessage) { viewModelScope.launch { chatRepository.resendChatMessage( @@ -855,4 +870,10 @@ class ChatViewModel @Inject constructor( data class Success(val userAbsence: UserAbsenceData) : OutOfOfficeUIState() data class Error(val exception: Exception) : OutOfOfficeUIState() } + + sealed class UnbindRoomUiState { + data object None : UnbindRoomUiState() + data class Success(val statusCode: Int) : UnbindRoomUiState() + data class Error(val message: String) : UnbindRoomUiState() + } } 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 4cd1e6d68..1c5bc67ac 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt @@ -449,6 +449,10 @@ object ApiUtils { return "$baseUrl$OCS_API_VERSION/cloud/users/search/by-phone" } + fun getUrlForUnbindingRoom(baseUrl: String, roomToken: String): String { + return "$baseUrl/ocs/v2.php/apps/spreed/api/v4/room/$roomToken/object" + } + fun getUrlForFileUpload(baseUrl: String, user: String, remotePath: String): String { return "$baseUrl/remote.php/dav/files/$user$remotePath" } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7af5aac2a..5d261e45f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -521,6 +521,7 @@ How to translate with transifex: leaked to other services You are not allowed to start a call You need to promote a new moderator before you can leave the conversation + Room was retained successfully Share Send to