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