diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt
index f1751b5a1..8b98203d7 100644
--- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt
+++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt
@@ -35,9 +35,11 @@ import org.linphone.R
import org.linphone.core.tools.Log
import org.linphone.databinding.ChatInfoFragmentBinding
import org.linphone.databinding.ChatParticipantAdminPopupMenuBinding
+import org.linphone.ui.main.chat.model.ConversationEditSubjectDialogModel
import org.linphone.ui.main.chat.model.ParticipantModel
import org.linphone.ui.main.chat.viewmodel.ConversationInfoViewModel
import org.linphone.ui.main.fragment.GenericFragment
+import org.linphone.utils.DialogUtils
@UiThread
class ConversationInfoFragment : GenericFragment() {
@@ -138,6 +140,36 @@ class ConversationInfoFragment : GenericFragment() {
val action = ConversationInfoFragmentDirections.actionConversationInfoFragmentToAddParticipantsFragment()
findNavController().navigate(action)
}
+
+ binding.setEditSubjectClickListener {
+ val currentSubject = viewModel.subject.value.orEmpty()
+ val model = ConversationEditSubjectDialogModel(currentSubject)
+
+ val dialog = DialogUtils.getEditConversationSubjectDialog(
+ requireContext(),
+ model
+ )
+
+ model.dismissEvent.observe(viewLifecycleOwner) {
+ it.consume {
+ Log.i("$TAG Conversation subject edit cancelled")
+ dialog.dismiss()
+ }
+ }
+
+ model.confirmEvent.observe(viewLifecycleOwner) {
+ it.consume { newSubject ->
+ Log.i(
+ "$TAG Conversation subject edit confirmed, new subject is [$newSubject] (old was [$currentSubject])"
+ )
+ viewModel.updateSubject(newSubject)
+ dialog.dismiss()
+ }
+ }
+
+ Log.i("$TAG Showing dialog to edit conversation subject")
+ dialog.show()
+ }
}
private fun showParticipantAdminPopupMenu(view: View, participantModel: ParticipantModel) {
diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/ConversationEditSubjectDialogModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/ConversationEditSubjectDialogModel.kt
new file mode 100644
index 000000000..e2ae96bcb
--- /dev/null
+++ b/app/src/main/java/org/linphone/ui/main/chat/model/ConversationEditSubjectDialogModel.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2010-2023 Belledonne Communications SARL.
+ *
+ * This file is part of linphone-android
+ * (see https://www.linphone.org).
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.linphone.ui.main.chat.model
+
+import androidx.annotation.UiThread
+import androidx.lifecycle.MutableLiveData
+import org.linphone.utils.Event
+
+class ConversationEditSubjectDialogModel @UiThread constructor(initialSubject: String) {
+ val subject = MutableLiveData()
+
+ val dismissEvent = MutableLiveData>()
+
+ val confirmEvent = MutableLiveData>()
+
+ init {
+ subject.value = initialSubject
+ }
+
+ @UiThread
+ fun dismiss() {
+ dismissEvent.value = Event(true)
+ }
+
+ @UiThread
+ fun confirm() {
+ confirmEvent.value = Event(subject.value.orEmpty())
+ }
+}
diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt
index 81afd4c40..fd77f4a60 100644
--- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt
+++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt
@@ -288,6 +288,16 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() {
}
}
+ @UiThread
+ fun updateSubject(newSubject: String) {
+ coreContext.postOnCoreThread {
+ if (::chatRoom.isInitialized) {
+ Log.i("$TAG Updating chat room subject to [$newSubject]")
+ chatRoom.subject = newSubject
+ }
+ }
+ }
+
@WorkerThread
private fun configureChatRoom() {
isMuted.postValue(chatRoom.muted)
diff --git a/app/src/main/java/org/linphone/utils/DialogUtils.kt b/app/src/main/java/org/linphone/utils/DialogUtils.kt
index 26c0f7529..6fa38244e 100644
--- a/app/src/main/java/org/linphone/utils/DialogUtils.kt
+++ b/app/src/main/java/org/linphone/utils/DialogUtils.kt
@@ -39,6 +39,7 @@ import org.linphone.databinding.DialogConfirmZrtpSasBinding
import org.linphone.databinding.DialogContactConfirmTrustCallBinding
import org.linphone.databinding.DialogContactTrustProcessBinding
import org.linphone.databinding.DialogDeleteContactBinding
+import org.linphone.databinding.DialogEditGroupConversationSubjectBinding
import org.linphone.databinding.DialogManageAccountInternationalPrefixHelpBinding
import org.linphone.databinding.DialogPickNumberOrAddressBinding
import org.linphone.databinding.DialogRemoveAccountBinding
@@ -48,6 +49,7 @@ import org.linphone.databinding.DialogUpdateAvailableBinding
import org.linphone.ui.assistant.model.AcceptConditionsAndPolicyDialogModel
import org.linphone.ui.assistant.model.ConfirmPhoneNumberDialogModel
import org.linphone.ui.call.model.ZrtpSasConfirmationDialogModel
+import org.linphone.ui.main.chat.model.ConversationEditSubjectDialogModel
import org.linphone.ui.main.contacts.model.NumberOrAddressPickerDialogModel
import org.linphone.ui.main.contacts.model.TrustCallDialogModel
import org.linphone.ui.main.history.model.ConfirmationDialogModel
@@ -265,6 +267,22 @@ class DialogUtils {
return getDialog(context, binding)
}
+ @UiThread
+ fun getEditConversationSubjectDialog(
+ context: Context,
+ viewModel: ConversationEditSubjectDialogModel
+ ): Dialog {
+ val binding: DialogEditGroupConversationSubjectBinding = DataBindingUtil.inflate(
+ LayoutInflater.from(context),
+ R.layout.dialog_edit_group_conversation_subject,
+ null,
+ false
+ )
+ binding.viewModel = viewModel
+
+ return getDialog(context, binding)
+ }
+
@UiThread
fun getUpdateAvailableDialog(
context: Context,
diff --git a/app/src/main/res/layout/chat_bubble_incoming.xml b/app/src/main/res/layout/chat_bubble_incoming.xml
index fcc13c433..d4bfc2020 100644
--- a/app/src/main/res/layout/chat_bubble_incoming.xml
+++ b/app/src/main/res/layout/chat_bubble_incoming.xml
@@ -37,7 +37,7 @@
android:visibility="@{!model.isFromGroup ? View.GONE: model.isGroupedWithPreviousOne ? View.INVISIBLE : View.VISIBLE}"
coilBubbleAvatar="@{model.avatarModel}"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent" />
+ app:layout_constraintTop_toBottomOf="@id/name" />
+
+
diff --git a/app/src/main/res/layout/chat_info_fragment.xml b/app/src/main/res/layout/chat_info_fragment.xml
index 16810ddf1..d468b2097 100644
--- a/app/src/main/res/layout/chat_info_fragment.xml
+++ b/app/src/main/res/layout/chat_info_fragment.xml
@@ -9,6 +9,9 @@
+
@@ -95,6 +98,7 @@
+
+
+
+
+
+
-
-
-
-
diff --git a/app/src/main/res/layout/dialog_edit_group_conversation_subject.xml b/app/src/main/res/layout/dialog_edit_group_conversation_subject.xml
new file mode 100644
index 000000000..5cbff6146
--- /dev/null
+++ b/app/src/main/res/layout/dialog_edit_group_conversation_subject.xml
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/start_chat_fragment.xml b/app/src/main/res/layout/start_chat_fragment.xml
index d8d4f32c8..d097f9887 100644
--- a/app/src/main/res/layout/start_chat_fragment.xml
+++ b/app/src/main/res/layout/start_chat_fragment.xml
@@ -116,7 +116,7 @@
android:textColor="@color/gray_main2_600"
android:maxLines="1"
android:background="@drawable/edit_text_background"
- android:inputType="text|textCapWords"
+ android:inputType="text|textCapSentences"
app:layout_constraintWidth_max="@dimen/text_input_max_width"
app:layout_constraintTop_toBottomOf="@id/group_name_title"
app:layout_constraintStart_toStartOf="parent"
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d3b45b311..11240f41d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -112,6 +112,8 @@
A new version %s is available. Do you want to update?
Why do we need it?
Blah blah blah
+ Edit conversation subject
+ Confirm
Invalid QR code!
SIP address copied into clipboard