From ccb2fcfcadee894418dc0a68de56bf93edb191bb Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 19 May 2025 15:29:48 +0200 Subject: [PATCH 01/18] create a layout to show conversation delete notice Signed-off-by: sowjanyakch --- app/src/main/res/layout/activity_chat.xml | 13 +++++ .../remainder_to_delete_conversation.xml | 57 +++++++++++++++++++ app/src/main/res/values/strings.xml | 7 ++- 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/layout/remainder_to_delete_conversation.xml diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml index 9652c2947..3706dc924 100644 --- a/app/src/main/res/layout/activity_chat.xml +++ b/app/src/main/res/layout/activity_chat.xml @@ -139,6 +139,19 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b8f31db2e..7af5aac2a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -513,7 +513,12 @@ How to translate with transifex: Reply Reply privately Delete - Message deleted successfully, but it might have been leaked to other services + This conversation will be automatically deleted in %1$d days of + no activity + Delete now + Keep + Message deleted successfully, but it might have been + 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 From 7a4c98db01a42bf00dc8458e960d08207e4420ea Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 19 May 2025 16:17:38 +0200 Subject: [PATCH 02/18] add different room types and their retention Signed-off-by: sowjanyakch --- .../json/conversations/ConversationEnums.kt | 4 ++- .../ConversationObjectTypeConverter.kt | 4 +++ .../nextcloud/talk/utils/CapabilitiesUtil.kt | 30 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/models/json/conversations/ConversationEnums.kt b/app/src/main/java/com/nextcloud/talk/models/json/conversations/ConversationEnums.kt index 44dd302b5..bca14bf3b 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/conversations/ConversationEnums.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/conversations/ConversationEnums.kt @@ -44,6 +44,8 @@ class ConversationEnums { SHARE_PASSWORD, FILE, ROOM, - EVENT + EVENT, + PHONE, + INSTANT_MEETING } } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/converters/ConversationObjectTypeConverter.kt b/app/src/main/java/com/nextcloud/talk/models/json/converters/ConversationObjectTypeConverter.kt index 817f1b089..b0566332c 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/converters/ConversationObjectTypeConverter.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/converters/ConversationObjectTypeConverter.kt @@ -16,6 +16,8 @@ class ConversationObjectTypeConverter : StringBasedTypeConverter ConversationEnums.ObjectType.ROOM "file" -> ConversationEnums.ObjectType.FILE "event" -> ConversationEnums.ObjectType.EVENT + "phone" -> ConversationEnums.ObjectType.PHONE + "instant_meeting" -> ConversationEnums.ObjectType.INSTANT_MEETING else -> ConversationEnums.ObjectType.DEFAULT } } @@ -30,6 +32,8 @@ class ConversationObjectTypeConverter : StringBasedTypeConverter "room" ConversationEnums.ObjectType.FILE -> "file" ConversationEnums.ObjectType.EVENT -> "event" + ConversationEnums.ObjectType.PHONE -> "phone" + ConversationEnums.ObjectType.INSTANT_MEETING -> "instant_meeting" else -> "" } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt b/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt index 8ed61b5c7..5fc262adf 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt @@ -140,6 +140,36 @@ object CapabilitiesUtil { return false } + fun retentionOfEventRooms(spreedCapabilities: SpreedCapability): Int { + if (spreedCapabilities.config?.containsKey("conversations") == true) { + val map = spreedCapabilities.config!!["conversations"] + if (map?.containsKey("retention-event") == true) { + return map["retention-event"].toString().toInt() + } + } + return 0 + } + + fun retentionOfSIP(spreedCapabilities: SpreedCapability): Int { + if (spreedCapabilities.config?.containsKey("conversations") == true) { + val map = spreedCapabilities.config!!["conversations"] + if (map?.containsKey("retention-phone") == true) { + return map["retention-phone"].toString().toInt() + } + } + return 0 + } + + fun retentionOfInstantMeetings(spreedCapabilities: SpreedCapability): Int { + if (spreedCapabilities.config?.containsKey("conversations") == true) { + val map = spreedCapabilities.config!!["conversations"] + if (map?.containsKey("retention-instant-meetings") == true) { + return map["retention-instant-meetings"].toString().toInt() + } + } + return 0 + } + @JvmStatic fun isCallRecordingAvailable(spreedCapabilities: SpreedCapability): Boolean { if (hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.RECORDING_V1) && From 0104989eef19d35ef4a1969244ec2cdb07b8d89f Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 19 May 2025 17:25:27 +0200 Subject: [PATCH 03/18] show warning dialog when call ends Signed-off-by: sowjanyakch --- .../com/nextcloud/talk/chat/ChatActivity.kt | 51 +++++++++++++++++++ .../nextcloud/talk/utils/CapabilitiesUtil.kt | 6 +-- 2 files changed, 54 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 9b242a8a8..46735da28 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -229,6 +229,13 @@ import java.util.Locale import java.util.concurrent.ExecutionException import javax.inject.Inject import kotlin.math.roundToInt +import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia +import com.google.android.material.card.MaterialCardView +import com.nextcloud.talk.conversationinfo.viewmodel.ConversationInfoViewModel +import com.nextcloud.talk.models.json.participants.Participant +import com.nextcloud.talk.utils.CapabilitiesUtil.retentionOfEventRooms +import com.nextcloud.talk.utils.CapabilitiesUtil.retentionOfInstantMeetingRoom +import com.nextcloud.talk.utils.CapabilitiesUtil.retentionOfSIPRoom @Suppress("TooManyFunctions") @AutoInjector(NextcloudTalkApplication::class) @@ -664,6 +671,40 @@ class ChatActivity : } } + if (currentConversation?.objectType == ConversationEnums.ObjectType.EVENT) { + val eventEndTimeStamp = currentConversation?.objectId?.split("#")[1]?.toLong() + val currentTimeStamp = (System.currentTimeMillis() / 1000).toLong() + val retentionPeriod = retentionOfEventRooms(spreedCapabilities) + val isPastEvent = eventEndTimeStamp?.let { it < currentTimeStamp } + if (isPastEvent == true && retentionPeriod != 0) { + showConversationDeletionWarning(retentionPeriod) + } + } + + if (currentConversation?.objectType == ConversationEnums.ObjectType.PHONE) { + val retentionPeriod = retentionOfSIPRoom(spreedCapabilities) + val systemMessage = currentConversation?.lastMessage?.systemMessageType + if (retentionPeriod != 0 && ( + systemMessage == ChatMessage.SystemMessageType.CALL_ENDED || + systemMessage == ChatMessage.SystemMessageType.CALL_ENDED_EVERYONE + ) + ) { + showConversationDeletionWarning(retentionPeriod) + } + } + + if (currentConversation?.objectType == ConversationEnums.ObjectType.INSTANT_MEETING) { + val retentionPeriod = retentionOfInstantMeetingRoom(spreedCapabilities) + val systemMessage = currentConversation?.lastMessage?.systemMessageType + if (retentionPeriod != 0 && ( + systemMessage == ChatMessage.SystemMessageType.CALL_ENDED || + systemMessage == ChatMessage.SystemMessageType.CALL_ENDED_EVERYONE + ) + ) { + showConversationDeletionWarning(retentionPeriod) + } + } + updateRoomTimerHandler(MILLIS_250) val urlForChatting = @@ -1150,6 +1191,16 @@ class ChatActivity : } } + fun showConversationDeletionWarning(retentionPeriod: Int) { + binding.conversationDeleteNotice.visibility = View.VISIBLE + val deleteNoticeCard = findViewById(R.id.conversation_delete_notice) + val messageTextView = deleteNoticeCard.findViewById(R.id.deletion_message) + messageTextView.text = String.format( + resources.getString(R.string.nc_conversation_auto_delete_notice), + retentionPeriod + ) + } + @Suppress("Detekt.TooGenericExceptionCaught") override fun onResume() { super.onResume() diff --git a/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt b/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt index 5fc262adf..2bbeb8a7f 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt @@ -140,7 +140,7 @@ object CapabilitiesUtil { return false } - fun retentionOfEventRooms(spreedCapabilities: SpreedCapability): Int { + fun retentionOfEventRooms(spreedCapabilities: SpreedCapability): Int { if (spreedCapabilities.config?.containsKey("conversations") == true) { val map = spreedCapabilities.config!!["conversations"] if (map?.containsKey("retention-event") == true) { @@ -150,7 +150,7 @@ object CapabilitiesUtil { return 0 } - fun retentionOfSIP(spreedCapabilities: SpreedCapability): Int { + fun retentionOfSIPRoom(spreedCapabilities: SpreedCapability): Int { if (spreedCapabilities.config?.containsKey("conversations") == true) { val map = spreedCapabilities.config!!["conversations"] if (map?.containsKey("retention-phone") == true) { @@ -160,7 +160,7 @@ object CapabilitiesUtil { return 0 } - fun retentionOfInstantMeetings(spreedCapabilities: SpreedCapability): Int { + fun retentionOfInstantMeetingRoom(spreedCapabilities: SpreedCapability): Int { if (spreedCapabilities.config?.containsKey("conversations") == true) { val map = spreedCapabilities.config!!["conversations"] if (map?.containsKey("retention-instant-meetings") == true) { From 4d3acdb2f539bddfe9dd59da367a1efe0bfa2715 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 19 May 2025 17:28:48 +0200 Subject: [PATCH 04/18] don't show deletion warning initially Signed-off-by: sowjanyakch --- app/src/main/res/layout/activity_chat.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml index 3706dc924..0a77d7a5e 100644 --- a/app/src/main/res/layout/activity_chat.xml +++ b/app/src/main/res/layout/activity_chat.xml @@ -144,7 +144,7 @@ android:id="@+id/conversation_delete_notice" android:layout_width="match_parent" android:layout_height="wrap_content" - android:visibility="visible" + android:visibility="gone" tools:visibility="visible" android:layout_margin="8dp" app:cardCornerRadius="12dp"> From 1ed89b2a5399f987191c67659535fc792b8758cd Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 19 May 2025 18:46:02 +0200 Subject: [PATCH 05/18] delete event conversation Signed-off-by: sowjanyakch --- .../com/nextcloud/talk/chat/ChatActivity.kt | 81 +++++++++++-------- .../remainder_to_delete_conversation.xml | 1 - 2 files changed, 49 insertions(+), 33 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 46735da28..d7eadc71f 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -86,6 +86,7 @@ import coil.request.CachePolicy import coil.request.ImageRequest import coil.target.Target import coil.transform.CircleCropTransformation +import com.google.android.material.button.MaterialButton import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import com.nextcloud.android.common.ui.color.ColorUtil @@ -168,6 +169,9 @@ import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.AudioUtils import com.nextcloud.talk.utils.CapabilitiesUtil +import com.nextcloud.talk.utils.CapabilitiesUtil.retentionOfEventRooms +import com.nextcloud.talk.utils.CapabilitiesUtil.retentionOfInstantMeetingRoom +import com.nextcloud.talk.utils.CapabilitiesUtil.retentionOfSIPRoom import com.nextcloud.talk.utils.ContactUtils import com.nextcloud.talk.utils.ConversationUtils import com.nextcloud.talk.utils.DateConstants @@ -229,13 +233,6 @@ import java.util.Locale import java.util.concurrent.ExecutionException import javax.inject.Inject import kotlin.math.roundToInt -import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia -import com.google.android.material.card.MaterialCardView -import com.nextcloud.talk.conversationinfo.viewmodel.ConversationInfoViewModel -import com.nextcloud.talk.models.json.participants.Participant -import com.nextcloud.talk.utils.CapabilitiesUtil.retentionOfEventRooms -import com.nextcloud.talk.utils.CapabilitiesUtil.retentionOfInstantMeetingRoom -import com.nextcloud.talk.utils.CapabilitiesUtil.retentionOfSIPRoom @Suppress("TooManyFunctions") @AutoInjector(NextcloudTalkApplication::class) @@ -1193,12 +1190,53 @@ class ChatActivity : fun showConversationDeletionWarning(retentionPeriod: Int) { binding.conversationDeleteNotice.visibility = View.VISIBLE - val deleteNoticeCard = findViewById(R.id.conversation_delete_notice) - val messageTextView = deleteNoticeCard.findViewById(R.id.deletion_message) - messageTextView.text = String.format( + binding.conversationDeleteNotice.apply { + isClickable = false + isFocusable = false + bringToFront() + } + val deleteNoticeText = binding.conversationDeleteNotice.findViewById(R.id.deletion_message) + + deleteNoticeText.text = String.format( resources.getString(R.string.nc_conversation_auto_delete_notice), retentionPeriod ) + + binding.conversationDeleteNotice.findViewById(R.id.delete_now_button).setOnClickListener { + deleteConversationDialog(it.context) + } + + binding.conversationDeleteNotice.findViewById(R.id.keep_button).setOnClickListener{ + + } + } + + + fun deleteConversationDialog(context:Context){ + + val dialogBuilder = MaterialAlertDialogBuilder(context) + .setIcon( + viewThemeUtils.dialog + .colorMaterialAlertDialogIcon(context, R.drawable.ic_delete_black_24dp) + ) + .setTitle(R.string.nc_delete_call) + .setMessage(R.string.nc_delete_conversation_more) + .setPositiveButton(R.string.nc_delete) { _, _ -> + currentConversation?.let { conversation -> + deleteConversation(conversation) + } + } + .setNegativeButton(R.string.nc_cancel) { _, _ -> + } + + viewThemeUtils.dialog + .colorMaterialAlertDialogBackground(context, dialogBuilder) + val dialog = dialogBuilder.show() + viewThemeUtils.platform.colorTextButtons( + dialog.getButton(AlertDialog.BUTTON_POSITIVE), + dialog.getButton(AlertDialog.BUTTON_NEGATIVE) + ) + } @Suppress("Detekt.TooGenericExceptionCaught") @@ -3092,28 +3130,7 @@ class ChatActivity : deleteConversation.visibility = View.VISIBLE deleteConversation.setOnClickListener { - val dialogBuilder = MaterialAlertDialogBuilder(it.context) - .setIcon( - viewThemeUtils.dialog - .colorMaterialAlertDialogIcon(context, R.drawable.ic_delete_black_24dp) - ) - .setTitle(R.string.nc_delete_call) - .setMessage(R.string.nc_delete_conversation_more) - .setPositiveButton(R.string.nc_delete) { _, _ -> - currentConversation?.let { conversation -> - deleteConversation(conversation) - } - } - .setNegativeButton(R.string.nc_cancel) { _, _ -> - } - - viewThemeUtils.dialog - .colorMaterialAlertDialogBackground(it.context, dialogBuilder) - val dialog = dialogBuilder.show() - viewThemeUtils.platform.colorTextButtons( - dialog.getButton(AlertDialog.BUTTON_POSITIVE), - dialog.getButton(AlertDialog.BUTTON_NEGATIVE) - ) + deleteConversationDialog(it.context) popupWindow.dismiss() } } else { diff --git a/app/src/main/res/layout/remainder_to_delete_conversation.xml b/app/src/main/res/layout/remainder_to_delete_conversation.xml index 2b94a27a3..30fe63629 100644 --- a/app/src/main/res/layout/remainder_to_delete_conversation.xml +++ b/app/src/main/res/layout/remainder_to_delete_conversation.xml @@ -22,7 +22,6 @@ android:text="@string/nc_conversation_auto_delete_notice" android:textSize="14sp" android:lineSpacingExtra="4dp" - android:textColor="@android:color/black" android:gravity="center" android:layout_marginBottom="12dp" /> From 01b80a07538613b9dfc8a082fd8440448fa4cdbb Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 19 May 2025 19:59:38 +0200 Subject: [PATCH 06/18] 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 From 1670ff181ff0e6674043cd7bcdd4210a814f9a11 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 20 May 2025 09:00:10 +0200 Subject: [PATCH 07/18] add unbind-conversation capability Signed-off-by: sowjanyakch --- .../com/nextcloud/talk/chat/ChatActivity.kt | 21 +++++++++++++++---- .../talk/chat/viewmodels/ChatViewModel.kt | 2 +- .../java/com/nextcloud/talk/utils/ApiUtils.kt | 2 +- .../nextcloud/talk/utils/CapabilitiesUtil.kt | 3 ++- app/src/main/res/values/strings.xml | 2 +- 5 files changed, 22 insertions(+), 8 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 e2cd8243a..a41d91392 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -169,6 +169,7 @@ import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.AudioUtils import com.nextcloud.talk.utils.CapabilitiesUtil +import com.nextcloud.talk.utils.CapabilitiesUtil.hasSpreedFeatureCapability import com.nextcloud.talk.utils.CapabilitiesUtil.retentionOfEventRooms import com.nextcloud.talk.utils.CapabilitiesUtil.retentionOfInstantMeetingRoom import com.nextcloud.talk.utils.CapabilitiesUtil.retentionOfSIPRoom @@ -668,7 +669,11 @@ class ChatActivity : } } - if (currentConversation?.objectType == ConversationEnums.ObjectType.EVENT) { + if (currentConversation?.objectType == ConversationEnums.ObjectType.EVENT && hasSpreedFeatureCapability( + conversationUser?.capabilities!!.spreedCapability!!, + SpreedFeatures.UNBIND_CONVERSATION + ) + ) { val eventEndTimeStamp = currentConversation?.objectId?.split("#")[1]?.toLong() val currentTimeStamp = (System.currentTimeMillis() / 1000).toLong() val retentionPeriod = retentionOfEventRooms(spreedCapabilities) @@ -678,7 +683,11 @@ class ChatActivity : } } - if (currentConversation?.objectType == ConversationEnums.ObjectType.PHONE) { + if (currentConversation?.objectType == ConversationEnums.ObjectType.PHONE && hasSpreedFeatureCapability( + conversationUser?.capabilities!!.spreedCapability!!, + SpreedFeatures.UNBIND_CONVERSATION + ) + ) { val retentionPeriod = retentionOfSIPRoom(spreedCapabilities) val systemMessage = currentConversation?.lastMessage?.systemMessageType if (retentionPeriod != 0 && ( @@ -690,7 +699,11 @@ class ChatActivity : } } - if (currentConversation?.objectType == ConversationEnums.ObjectType.INSTANT_MEETING) { + if (currentConversation?.objectType == ConversationEnums.ObjectType.INSTANT_MEETING && hasSpreedFeatureCapability( + conversationUser?.capabilities!!.spreedCapability!!, + SpreedFeatures.UNBIND_CONVERSATION + ) + ) { val retentionPeriod = retentionOfInstantMeetingRoom(spreedCapabilities) val systemMessage = currentConversation?.lastMessage?.systemMessageType if (retentionPeriod != 0 && ( @@ -1232,7 +1245,7 @@ class ChatActivity : } } - fun deleteConversationDialog(context: Context) { + fun deleteConversationDialog(context: Context) { val dialogBuilder = MaterialAlertDialogBuilder(context) .setIcon( viewThemeUtils.dialog 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 d9e38e59b..4da2f4f18 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 @@ -808,7 +808,7 @@ class ChatViewModel @Inject constructor( } } - fun unbindRoom(credentials: String, baseUrl: String, roomToken: String) { + fun unbindRoom(credentials: String, baseUrl: String, roomToken: String) { viewModelScope.launch { try { val response = chatNetworkDataSource.unbindRoom(credentials, baseUrl, roomToken) 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 1c5bc67ac..d27608b56 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt @@ -449,7 +449,7 @@ object ApiUtils { return "$baseUrl$OCS_API_VERSION/cloud/users/search/by-phone" } - fun getUrlForUnbindingRoom(baseUrl: String, roomToken: String): String { + fun getUrlForUnbindingRoom(baseUrl: String, roomToken: String): String { return "$baseUrl/ocs/v2.php/apps/spreed/api/v4/room/$roomToken/object" } diff --git a/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt b/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt index 2bbeb8a7f..ef0f85f1e 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt @@ -57,7 +57,8 @@ enum class SpreedFeatures(val value: String) { BAN_V1("ban-v1"), EDIT_MESSAGES_NOTE_TO_SELF("edit-messages-note-to-self"), ARCHIVE_CONVERSATIONS("archived-conversations-v2"), - CONVERSATION_CREATION_ALL("conversation-creation-all") + CONVERSATION_CREATION_ALL("conversation-creation-all"), + UNBIND_CONVERSATION("unbind-conversation") } @Suppress("TooManyFunctions") diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5d261e45f..c280c3415 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -521,7 +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 + Room is retained successfully Share Send to From d6a2a1fe27945c953021e8a5b11c34d5a8d8aa0a Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 20 May 2025 09:11:34 +0200 Subject: [PATCH 08/18] modify strings Signed-off-by: sowjanyakch --- .../java/com/nextcloud/talk/chat/ChatActivity.kt | 16 ++++++++++++---- app/src/main/res/values/strings.xml | 6 ++++-- 2 files changed, 16 insertions(+), 6 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 a41d91392..ea2294d04 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -1231,10 +1231,18 @@ class ChatActivity : } val deleteNoticeText = binding.conversationDeleteNotice.findViewById(R.id.deletion_message) - deleteNoticeText.text = String.format( - resources.getString(R.string.nc_conversation_auto_delete_notice), - retentionPeriod - ) + if(currentConversation?.objectType!= ConversationEnums.ObjectType.INSTANT_MEETING){ + deleteNoticeText.text = String.format( + resources.getString(R.string.nc_conversation_auto_delete_notice), + retentionPeriod + ) + }else{ + deleteNoticeText.text = String.format( + resources.getString(R.string.nc_conversation_auto_delete_warning), + retentionPeriod + ) + } + binding.conversationDeleteNotice.findViewById(R.id.delete_now_button).setOnClickListener { deleteConversationDialog(it.context) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c280c3415..5cc5e58f3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -513,8 +513,10 @@ How to translate with transifex: Reply Reply privately Delete - This conversation will be automatically deleted in %1$d days of - no activity + This conversation will be automatically deleted for everyone in + %1$d days of no activity + This conversation will be automatically deleted for everyone in + %1$d day of no activity Delete now Keep Message deleted successfully, but it might have been From 6659b664d8da00cc51253978642e50e62d267135 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 20 May 2025 09:26:38 +0200 Subject: [PATCH 09/18] add meaningful names Signed-off-by: sowjanyakch --- .../java/com/nextcloud/talk/chat/ChatActivity.kt | 14 ++++++++------ .../conversationlist/ConversationsListActivity.kt | 13 +++++++------ 2 files changed, 15 insertions(+), 12 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 ea2294d04..13cb44156 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -669,7 +669,8 @@ class ChatActivity : } } - if (currentConversation?.objectType == ConversationEnums.ObjectType.EVENT && hasSpreedFeatureCapability( + if (currentConversation?.objectType == ConversationEnums.ObjectType.EVENT && + hasSpreedFeatureCapability( conversationUser?.capabilities!!.spreedCapability!!, SpreedFeatures.UNBIND_CONVERSATION ) @@ -683,7 +684,8 @@ class ChatActivity : } } - if (currentConversation?.objectType == ConversationEnums.ObjectType.PHONE && hasSpreedFeatureCapability( + if (currentConversation?.objectType == ConversationEnums.ObjectType.PHONE && + hasSpreedFeatureCapability( conversationUser?.capabilities!!.spreedCapability!!, SpreedFeatures.UNBIND_CONVERSATION ) @@ -699,7 +701,8 @@ class ChatActivity : } } - if (currentConversation?.objectType == ConversationEnums.ObjectType.INSTANT_MEETING && hasSpreedFeatureCapability( + if (currentConversation?.objectType == ConversationEnums.ObjectType.INSTANT_MEETING && + hasSpreedFeatureCapability( conversationUser?.capabilities!!.spreedCapability!!, SpreedFeatures.UNBIND_CONVERSATION ) @@ -1231,19 +1234,18 @@ class ChatActivity : } val deleteNoticeText = binding.conversationDeleteNotice.findViewById(R.id.deletion_message) - if(currentConversation?.objectType!= ConversationEnums.ObjectType.INSTANT_MEETING){ + if (currentConversation?.objectType != ConversationEnums.ObjectType.INSTANT_MEETING) { deleteNoticeText.text = String.format( resources.getString(R.string.nc_conversation_auto_delete_notice), retentionPeriod ) - }else{ + } else { deleteNoticeText.text = String.format( resources.getString(R.string.nc_conversation_auto_delete_warning), retentionPeriod ) } - binding.conversationDeleteNotice.findViewById(R.id.delete_now_button).setOnClickListener { deleteConversationDialog(it.context) } 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 a7bd96431..f5fed2217 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -523,7 +523,7 @@ class ConversationsListActivity : nearFutureEventConversationItems.clear() for (conversation in list) { - if (!futureEvent(conversation)) { + if (!isFutureEvent(conversation)) { addToNearFutureEventConversationItems(conversation) } addToConversationItems(conversation) @@ -564,13 +564,14 @@ class ConversationsListActivity : return false } - private fun futureEvent(conversation: ConversationModel): Boolean { + private fun isFutureEvent(conversation: ConversationModel): Boolean { if (!conversation.objectId.contains("#")) { return false } - return conversation.objectType == ConversationEnums.ObjectType.EVENT && - (conversation.objectId.split("#")[0].toLong() - (System.currentTimeMillis() / LONG_1000)) > - AGE_THRESHOLD_FOR_EVENT_CONVERSATIONS + val eventTimeStart = conversation.objectId.split("#")[0].toLong() + val currentTimeStampInSeconds = System.currentTimeMillis() / LONG_1000 + val sixteenHoursAfterTimeStamp = (eventTimeStart - currentTimeStampInSeconds) > SIXTEEN_HOURS_IN_SECONDS + return conversation.objectType == ConversationEnums.ObjectType.EVENT && sixteenHoursAfterTimeStamp } fun showOnlyNearFutureEvents() { @@ -2156,7 +2157,7 @@ class ConversationsListActivity : const val NOTIFICATION_WARNING_DATE_NOT_SET = 0L const val OFFSET_HEIGHT_DIVIDER: Int = 3 const val ROOM_TYPE_ONE_ONE = "1" - private const val AGE_THRESHOLD_FOR_EVENT_CONVERSATIONS: Long = 57600 + private const val SIXTEEN_HOURS_IN_SECONDS: Long = 57600 const val LONG_1000: Long = 1000 } } From 5512a47d32e94d570d612f96882c4a5088963736 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 20 May 2025 09:58:02 +0200 Subject: [PATCH 10/18] color change Signed-off-by: sowjanyakch --- app/src/main/res/layout/item_event_schedule.xml | 8 ++++++-- app/src/main/res/values-night/colors.xml | 2 +- app/src/main/res/values/colors.xml | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/item_event_schedule.xml b/app/src/main/res/layout/item_event_schedule.xml index ebc69f470..d365073d0 100644 --- a/app/src/main/res/layout/item_event_schedule.xml +++ b/app/src/main/res/layout/item_event_schedule.xml @@ -12,12 +12,13 @@ xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:padding="16dp" - android:background="@color/popup_menu_color"> + android:background="@color/grey_600"> @@ -26,7 +27,7 @@ android:id="@+id/meetingTime" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textColor="?android:attr/textColorSecondary" + android:textColor="@color/black" android:textSize="16sp" tools:text="Meeting at 8:00 pm"/> @@ -45,7 +46,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/archive_conversation" + android:textColor="@color/black" android:visibility = "gone" + android:textSize="18sp" android:paddingTop="24dp"/> @@ -54,6 +57,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/unarchive_conversation" + android:textColor="@color/black" android:visibility = "gone" android:textSize="18sp" android:paddingTop="24dp"/> diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index df8bcb4d6..05d9f105e 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -12,7 +12,7 @@ #006AA3 @color/colorPrimary #ff6F6F6F - #FF37474F + #1E1E1E diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 829a9ed53..661c4299d 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -13,7 +13,7 @@ #ff888888 #ffffff #B3FFFFFF - #FF607D8B + From 30076338731a66dd15b73c59f53c5a7b5038c9db Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 20 May 2025 10:18:57 +0200 Subject: [PATCH 11/18] only show delete and keep options for moderators of a conversation Signed-off-by: sowjanyakch --- .../main/java/com/nextcloud/talk/chat/ChatActivity.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 13cb44156..ad512479a 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -1246,6 +1246,16 @@ class ChatActivity : ) } + if(ConversationUtils.isParticipantOwnerOrModerator(currentConversation!!)) { + binding.conversationDeleteNotice.findViewById(R.id.delete_now_button).visibility = + View.VISIBLE + binding.conversationDeleteNotice.findViewById(R.id.keep_button).visibility = View.VISIBLE + }else{ + binding.conversationDeleteNotice.findViewById(R.id.delete_now_button).visibility = + View.GONE + binding.conversationDeleteNotice.findViewById(R.id.keep_button).visibility = View.GONE + + } binding.conversationDeleteNotice.findViewById(R.id.delete_now_button).setOnClickListener { deleteConversationDialog(it.context) } From e72701c219b57b172611649e8b500b8f59f28f56 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 20 May 2025 10:20:39 +0200 Subject: [PATCH 12/18] ktlintFormat Signed-off-by: sowjanyakch --- app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt | 5 ++--- 1 file changed, 2 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 ad512479a..a585d5253 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -1246,15 +1246,14 @@ class ChatActivity : ) } - if(ConversationUtils.isParticipantOwnerOrModerator(currentConversation!!)) { + if (ConversationUtils.isParticipantOwnerOrModerator(currentConversation!!)) { binding.conversationDeleteNotice.findViewById(R.id.delete_now_button).visibility = View.VISIBLE binding.conversationDeleteNotice.findViewById(R.id.keep_button).visibility = View.VISIBLE - }else{ + } else { binding.conversationDeleteNotice.findViewById(R.id.delete_now_button).visibility = View.GONE binding.conversationDeleteNotice.findViewById(R.id.keep_button).visibility = View.GONE - } binding.conversationDeleteNotice.findViewById(R.id.delete_now_button).setOnClickListener { deleteConversationDialog(it.context) From c18556379414131b28ce053135810081e7ee6b84 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 21 May 2025 08:56:57 +0200 Subject: [PATCH 13/18] ktlintFormat Signed-off-by: sowjanyakch --- .../java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt | 1 + 1 file changed, 1 insertion(+) 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 4da2f4f18..124d81cdb 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 @@ -808,6 +808,7 @@ class ChatViewModel @Inject constructor( } } + @Suppress("Detekt.TooGenericExceptionCaught") fun unbindRoom(credentials: String, baseUrl: String, roomToken: String) { viewModelScope.launch { try { From 354b107e1c1ab72c64e4989ffa2c01074a81eb5a Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 21 May 2025 09:19:46 +0200 Subject: [PATCH 14/18] objectId instead of objectType Signed-off-by: sowjanyakch --- app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a585d5253..fbb80e4c1 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -684,7 +684,7 @@ class ChatActivity : } } - if (currentConversation?.objectType == ConversationEnums.ObjectType.PHONE && + if (currentConversation?.objectId == "phone" && hasSpreedFeatureCapability( conversationUser?.capabilities!!.spreedCapability!!, SpreedFeatures.UNBIND_CONVERSATION From ab8a41182a4ca7d44b4761e1202cdabd7c399fe9 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 21 May 2025 12:11:55 +0200 Subject: [PATCH 15/18] add different object types for phone Signed-off-by: sowjanyakch --- app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt | 2 +- .../talk/models/json/conversations/ConversationEnums.kt | 3 ++- .../json/converters/ConversationObjectTypeConverter.kt | 6 ++++-- 3 files changed, 7 insertions(+), 4 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 fbb80e4c1..cdcd0d377 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -684,7 +684,7 @@ class ChatActivity : } } - if (currentConversation?.objectId == "phone" && + if (currentConversation?.objectType == ConversationEnums.ObjectType.PHONE_TEMPORARY && hasSpreedFeatureCapability( conversationUser?.capabilities!!.spreedCapability!!, SpreedFeatures.UNBIND_CONVERSATION diff --git a/app/src/main/java/com/nextcloud/talk/models/json/conversations/ConversationEnums.kt b/app/src/main/java/com/nextcloud/talk/models/json/conversations/ConversationEnums.kt index bca14bf3b..56a8d9660 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/conversations/ConversationEnums.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/conversations/ConversationEnums.kt @@ -45,7 +45,8 @@ class ConversationEnums { FILE, ROOM, EVENT, - PHONE, + PHONE_TEMPORARY, + PHONE_PERSIST, INSTANT_MEETING } } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/converters/ConversationObjectTypeConverter.kt b/app/src/main/java/com/nextcloud/talk/models/json/converters/ConversationObjectTypeConverter.kt index b0566332c..3171bf223 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/converters/ConversationObjectTypeConverter.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/converters/ConversationObjectTypeConverter.kt @@ -16,7 +16,8 @@ class ConversationObjectTypeConverter : StringBasedTypeConverter ConversationEnums.ObjectType.ROOM "file" -> ConversationEnums.ObjectType.FILE "event" -> ConversationEnums.ObjectType.EVENT - "phone" -> ConversationEnums.ObjectType.PHONE + "phone_persist" -> ConversationEnums.ObjectType.PHONE_PERSIST + "phone_temporary" -> ConversationEnums.ObjectType.PHONE_TEMPORARY "instant_meeting" -> ConversationEnums.ObjectType.INSTANT_MEETING else -> ConversationEnums.ObjectType.DEFAULT } @@ -32,7 +33,8 @@ class ConversationObjectTypeConverter : StringBasedTypeConverter "room" ConversationEnums.ObjectType.FILE -> "file" ConversationEnums.ObjectType.EVENT -> "event" - ConversationEnums.ObjectType.PHONE -> "phone" + ConversationEnums.ObjectType.PHONE_PERSIST -> "phone_persist" + ConversationEnums.ObjectType.PHONE_TEMPORARY -> "phone_temporary" ConversationEnums.ObjectType.INSTANT_MEETING -> "instant_meeting" else -> "" } From 9493e7889f30f2fa8d2685e022d0513b80742f6a Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 22 May 2025 16:22:53 +0200 Subject: [PATCH 16/18] fix to avoid linebreaks in strings.xml Signed-off-by: Marcel Hibbe --- app/src/main/res/values/strings.xml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5cc5e58f3..ab88925c4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -513,14 +513,11 @@ How to translate with transifex: Reply Reply privately Delete - This conversation will be automatically deleted for everyone in - %1$d days of no activity - This conversation will be automatically deleted for everyone in - %1$d day of no activity + This conversation will be automatically deleted for everyone in %1$d days of no activity + This conversation will be automatically deleted for everyone in %1$d day of no activity Delete now Keep - Message deleted successfully, but it might have been - leaked to other services + Message deleted successfully, but it might have been 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 is retained successfully From 38eba2f6c9ed0b38192412b54d94c8b7cfbb8d04 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 22 May 2025 16:45:21 +0200 Subject: [PATCH 17/18] avoid NPE for eventEndTimeStamp Signed-off-by: Marcel Hibbe --- app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 cdcd0d377..974fd4708 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -675,7 +675,11 @@ class ChatActivity : SpreedFeatures.UNBIND_CONVERSATION ) ) { - val eventEndTimeStamp = currentConversation?.objectId?.split("#")[1]?.toLong() + val eventEndTimeStamp = + currentConversation?.objectId + ?.split("#") + ?.getOrNull(1) + ?.toLongOrNull() val currentTimeStamp = (System.currentTimeMillis() / 1000).toLong() val retentionPeriod = retentionOfEventRooms(spreedCapabilities) val isPastEvent = eventEndTimeStamp?.let { it < currentTimeStamp } From 8836195f929cd404b0961b5ce867e44c8225cb02 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 22 May 2025 16:59:03 +0200 Subject: [PATCH 18/18] delete useless string & logic for conversationDeleteNotice ... string text was exactly the same Signed-off-by: Marcel Hibbe --- .../java/com/nextcloud/talk/chat/ChatActivity.kt | 15 ++++----------- app/src/main/res/values/strings.xml | 1 - 2 files changed, 4 insertions(+), 12 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 974fd4708..c92ca2e4a 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -1238,17 +1238,10 @@ class ChatActivity : } val deleteNoticeText = binding.conversationDeleteNotice.findViewById(R.id.deletion_message) - if (currentConversation?.objectType != ConversationEnums.ObjectType.INSTANT_MEETING) { - deleteNoticeText.text = String.format( - resources.getString(R.string.nc_conversation_auto_delete_notice), - retentionPeriod - ) - } else { - deleteNoticeText.text = String.format( - resources.getString(R.string.nc_conversation_auto_delete_warning), - retentionPeriod - ) - } + deleteNoticeText.text = String.format( + resources.getString(R.string.nc_conversation_auto_delete_notice), + retentionPeriod + ) if (ConversationUtils.isParticipantOwnerOrModerator(currentConversation!!)) { binding.conversationDeleteNotice.findViewById(R.id.delete_now_button).visibility = diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ab88925c4..6b23dff0a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -514,7 +514,6 @@ How to translate with transifex: Reply privately Delete This conversation will be automatically deleted for everyone in %1$d days of no activity - This conversation will be automatically deleted for everyone in %1$d day of no activity Delete now Keep Message deleted successfully, but it might have been leaked to other services