diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt index f5c59bf6d..7a9c1083f 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt @@ -129,7 +129,9 @@ class ConversationFragment : SlidingPaneChildFragment() { private var filePathToExport: String? = null private val pickMedia = registerForActivityResult( - ActivityResultContracts.PickMultipleVisualMedia() + ActivityResultContracts.PickMultipleVisualMedia( + maxItems = SendMessageInConversationViewModel.MAX_FILES_TO_ATTACH + ) ) { list -> if (!list.isNullOrEmpty()) { for (uri in list) { diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt index a10f1be90..1fa05662c 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt @@ -58,6 +58,8 @@ import org.linphone.utils.LinphoneUtils class SendMessageInConversationViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Send Message In Conversation ViewModel]" + + const val MAX_FILES_TO_ATTACH = 12 } val textToSend = MutableLiveData() @@ -72,6 +74,8 @@ class SendMessageInConversationViewModel @UiThread constructor() : GenericViewMo val isFileAttachmentsListOpen = MutableLiveData() + val maxNumberOfAttachmentsReached = MutableLiveData() + val attachments = MutableLiveData>() val isReplying = MutableLiveData() @@ -147,6 +151,7 @@ class SendMessageInConversationViewModel @UiThread constructor() : GenericViewMo isEmojiPickerOpen.value = false isPlayingVoiceRecord.value = false isInCallConversation.value = false + maxNumberOfAttachmentsReached.value = false } override fun onCleared() { @@ -309,12 +314,32 @@ class SendMessageInConversationViewModel @UiThread constructor() : GenericViewMo } val list = arrayListOf() attachments.value = list + maxNumberOfAttachmentsReached.value = false isFileAttachmentsListOpen.value = false } @UiThread fun addAttachment(file: String) { + if (attachments.value.orEmpty().size >= MAX_FILES_TO_ATTACH) { + Log.w( + "$TAG Max number of attachments [$MAX_FILES_TO_ATTACH] reached, file [$file] won't be attached" + ) + showRedToastEvent.postValue( + Event( + Pair( + R.string.conversation_maximum_number_of_attachments_reached, + R.drawable.warning_circle + ) + ) + ) + viewModelScope.launch { + Log.i("$TAG Deleting temporary file [$file]") + FileUtils.deleteFile(file) + } + return + } + val list = arrayListOf() list.addAll(attachments.value.orEmpty()) @@ -326,6 +351,7 @@ class SendMessageInConversationViewModel @UiThread constructor() : GenericViewMo list.add(model) attachments.value = list + maxNumberOfAttachmentsReached.value = list.size >= MAX_FILES_TO_ATTACH if (list.isNotEmpty()) { isFileAttachmentsListOpen.value = true @@ -353,6 +379,7 @@ class SendMessageInConversationViewModel @UiThread constructor() : GenericViewMo Log.w("$TAG Failed to find file attachment matching [$file]") } attachments.value = list + maxNumberOfAttachmentsReached.value = list.size >= MAX_FILES_TO_ATTACH if (list.isEmpty()) { isFileAttachmentsListOpen.value = false diff --git a/app/src/main/res/color/icon_color_selector.xml b/app/src/main/res/color/icon_color_selector.xml index 978dca6bf..93c5547b1 100644 --- a/app/src/main/res/color/icon_color_selector.xml +++ b/app/src/main/res/color/icon_color_selector.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/chat_conversation_send_area.xml b/app/src/main/res/layout/chat_conversation_send_area.xml index 49b7e75fb..1f4e59f69 100644 --- a/app/src/main/res/layout/chat_conversation_send_area.xml +++ b/app/src/main/res/layout/chat_conversation_send_area.xml @@ -97,6 +97,7 @@ android:layout_height="0dp" android:layout_marginStart="5dp" android:onClick="@{openFilePickerClickListener}" + android:enabled="@{!viewModel.maxNumberOfAttachmentsReached}" android:padding="8dp" android:src="@drawable/paperclip" android:contentDescription="@string/content_description_chat_open_attach_media" @@ -112,6 +113,7 @@ android:layout_height="0dp" android:layout_marginStart="5dp" android:onClick="@{openCameraClickListener}" + android:enabled="@{!viewModel.maxNumberOfAttachmentsReached}" android:padding="8dp" android:src="@drawable/camera" android:contentDescription="@string/content_description_chat_take_picture" diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 159b181da..91b744db4 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -454,6 +454,7 @@ Cette conversation a été désactivée pour garantir votre sécurité. Chiffrement obligatoire Vous avez activé le chiffrement obligatoire. Vos conversations non chiffrées sont désactivées pour garantir votre sécurité. Vous pouvez recréer cette conversation ou bien désactiver le chiffrement obligatoire dans vos paramètres de compte. + Nombre maximum de fichiers atteint ! Nommer la conversation Renommer la conversation Nom de la conversation diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 01c4c9409..0dc597237 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -489,7 +489,8 @@ This conversation is not encrypted! For your safety, this conversation was disabled. Mandatory encryption - + You enabled mandatory encryption. Non encrypted conversations are disabled for your safety. You can re-create this conversation or disable mandatory encryption in your account parameters. + Maximum number of attachments reached! Set conversation subject Edit conversation subject Conversation subject