Updated layout & flow for group conversation creation + all floating action buttons are now on orange background

This commit is contained in:
Sylvain Berfini 2024-01-08 12:19:46 +01:00
parent d82eac6175
commit 615185deb9
17 changed files with 118 additions and 121 deletions

View file

@ -38,7 +38,7 @@ import org.linphone.databinding.ChatInfoFragmentBinding
import org.linphone.databinding.ChatParticipantAdminPopupMenuBinding
import org.linphone.ui.main.MainActivity
import org.linphone.ui.main.chat.adapter.ConversationParticipantsAdapter
import org.linphone.ui.main.chat.model.ConversationEditSubjectDialogModel
import org.linphone.ui.main.chat.model.ConversationSetOrEditSubjectDialogModel
import org.linphone.ui.main.chat.model.ParticipantModel
import org.linphone.ui.main.chat.viewmodel.ConversationInfoViewModel
import org.linphone.ui.main.fragment.SlidingPaneChildFragment
@ -216,9 +216,9 @@ class ConversationInfoFragment : SlidingPaneChildFragment() {
binding.setEditSubjectClickListener {
val currentSubject = viewModel.subject.value.orEmpty()
val model = ConversationEditSubjectDialogModel(currentSubject)
val model = ConversationSetOrEditSubjectDialogModel(currentSubject)
val dialog = DialogUtils.getEditConversationSubjectDialog(
val dialog = DialogUtils.getSetOrEditConversationSubjectDialog(
requireContext(),
model
)

View file

@ -33,9 +33,12 @@ import org.linphone.core.Friend
import org.linphone.core.tools.Log
import org.linphone.databinding.StartChatFragmentBinding
import org.linphone.ui.main.MainActivity
import org.linphone.ui.main.chat.model.ConversationSetOrEditSubjectDialogModel
import org.linphone.ui.main.chat.viewmodel.StartConversationViewModel
import org.linphone.ui.main.fragment.GenericAddressPickerFragment
import org.linphone.utils.DialogUtils
import org.linphone.utils.Event
import org.linphone.utils.hideKeyboard
@UiThread
class StartConversationFragment : GenericAddressPickerFragment() {
@ -70,6 +73,10 @@ class StartConversationFragment : GenericAddressPickerFragment() {
goBack()
}
binding.setAskForGroupConversationSubjectClickListener {
showGroupConversationSubjectDialog()
}
setupRecyclerView(binding.contactsList)
viewModel.contactsAndSuggestionsList.observe(
@ -113,4 +120,40 @@ class StartConversationFragment : GenericAddressPickerFragment() {
override fun onSingleAddressSelected(address: Address, friend: Friend) {
viewModel.createOneToOneChatRoomWith(address)
}
private fun showGroupConversationSubjectDialog() {
val model = ConversationSetOrEditSubjectDialogModel("")
val dialog = DialogUtils.getSetOrEditConversationSubjectDialog(
requireContext(),
model
)
model.dismissEvent.observe(viewLifecycleOwner) {
it.consume {
Log.i("$TAG Set conversation subject cancelled")
dialog.dismiss()
}
}
model.confirmEvent.observe(viewLifecycleOwner) {
it.consume { newSubject ->
if (newSubject.isNotEmpty()) {
Log.i(
"$TAG Conversation subject has been set to [$newSubject]"
)
viewModel.subject.value = newSubject
viewModel.createGroupChatRoom()
dialog.currentFocus?.hideKeyboard()
dialog.dismiss()
} else {
// TODO: show error
}
}
}
Log.i("$TAG Showing dialog to set conversation subject")
dialog.show()
}
}

View file

@ -23,7 +23,9 @@ import androidx.annotation.UiThread
import androidx.lifecycle.MutableLiveData
import org.linphone.utils.Event
class ConversationEditSubjectDialogModel @UiThread constructor(initialSubject: String) {
class ConversationSetOrEditSubjectDialogModel @UiThread constructor(initialSubject: String) {
val isEdit = initialSubject.isNotEmpty()
val subject = MutableLiveData<String>()
val dismissEvent = MutableLiveData<Event<Boolean>>()

View file

@ -89,14 +89,7 @@ class StartConversationViewModel @UiThread constructor() : AddressSelectionViewM
init {
groupChatRoomCreateButtonEnabled.postValue(false)
groupChatRoomCreateButtonEnabled.addSource(selection) {
groupChatRoomCreateButtonEnabled.postValue(
subject.value.orEmpty().isNotEmpty() && selection.value.orEmpty().isNotEmpty()
)
}
groupChatRoomCreateButtonEnabled.addSource(subject) {
groupChatRoomCreateButtonEnabled.postValue(
subject.value.orEmpty().isNotEmpty() && selection.value.orEmpty().isNotEmpty()
)
groupChatRoomCreateButtonEnabled.postValue(it.isNotEmpty())
}
updateGroupChatButtonVisibility()

View file

@ -39,17 +39,17 @@ 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
import org.linphone.databinding.DialogRemoveAllCallLogsBinding
import org.linphone.databinding.DialogRemoveCallLogsBinding
import org.linphone.databinding.DialogSetOrEditGroupConversationSubjectBindingImpl
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.chat.model.ConversationSetOrEditSubjectDialogModel
import org.linphone.ui.main.contacts.model.NumberOrAddressPickerDialogModel
import org.linphone.ui.main.contacts.model.TrustCallDialogModel
import org.linphone.ui.main.history.model.ConfirmationDialogModel
@ -268,13 +268,13 @@ class DialogUtils {
}
@UiThread
fun getEditConversationSubjectDialog(
fun getSetOrEditConversationSubjectDialog(
context: Context,
viewModel: ConversationEditSubjectDialogModel
viewModel: ConversationSetOrEditSubjectDialogModel
): Dialog {
val binding: DialogEditGroupConversationSubjectBinding = DataBindingUtil.inflate(
val binding: DialogSetOrEditGroupConversationSubjectBindingImpl = DataBindingUtil.inflate(
LayoutInflater.from(context),
R.layout.dialog_edit_group_conversation_subject,
R.layout.dialog_set_or_edit_group_conversation_subject,
null,
false
)
@ -323,16 +323,20 @@ class DialogUtils {
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
dialog.setContentView(binding.root)
dialog.window
?.setLayout(
dialog.window?.apply {
setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT
)
val d: Drawable = ColorDrawable(
context.getColor(R.color.black)
)
d.alpha = 153 // 60%
dialog.window?.setBackgroundDrawable(d)
setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
val d: Drawable = ColorDrawable(
context.getColor(R.color.black)
)
d.alpha = 153 // 60%
setBackgroundDrawable(d)
}
return dialog
}
}

View file

@ -106,8 +106,8 @@
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/plus_circle"
app:tint="?attr/color_main2_700"
app:backgroundTint="?attr/color_main2_000"
app:tint="?attr/color_main2_000"
app:backgroundTint="?attr/color_main1_500"
app:shapeAppearanceOverlay="@style/rounded"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />

View file

@ -154,8 +154,8 @@
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/user_plus"
app:tint="?attr/color_main2_700"
app:backgroundTint="?attr/color_main2_000"
app:tint="?attr/color_main2_000"
app:backgroundTint="?attr/color_main1_500"
app:shapeAppearanceOverlay="@style/rounded"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />

View file

@ -125,8 +125,8 @@
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/phone_plus"
app:tint="?attr/color_main2_700"
app:backgroundTint="?attr/color_main2_000"
app:tint="?attr/color_main2_000"
app:backgroundTint="?attr/color_main1_500"
app:shapeAppearanceOverlay="@style/rounded"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />

View file

@ -122,8 +122,8 @@
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/plus_circle"
app:tint="?attr/color_main2_700"
app:backgroundTint="?attr/color_main2_000"
app:tint="?attr/color_main2_000"
app:backgroundTint="?attr/color_main1_500"
app:shapeAppearanceOverlay="@style/rounded"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />

View file

@ -252,8 +252,8 @@
android:layout_margin="16dp"
android:src="@drawable/caret_double_down"
android:visibility="@{viewModel.isUserScrollingUp ? View.VISIBLE : View.GONE}"
app:tint="?attr/color_main2_700"
app:backgroundTint="?attr/color_main2_000"
app:tint="?attr/color_main2_000"
app:backgroundTint="?attr/color_main1_500"
app:shapeAppearanceOverlay="@style/rounded"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/send_area" />

View file

@ -107,8 +107,8 @@
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/plus_circle"
app:tint="?attr/color_main2_700"
app:backgroundTint="?attr/color_main2_000"
app:tint="?attr/color_main2_000"
app:backgroundTint="?attr/color_main1_500"
app:shapeAppearanceOverlay="@style/rounded"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/bottom_nav_bar" />

View file

@ -156,8 +156,8 @@
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/user_plus"
app:tint="?attr/color_main2_700"
app:backgroundTint="?attr/color_main2_000"
app:tint="?attr/color_main2_000"
app:backgroundTint="?attr/color_main1_500"
app:shapeAppearanceOverlay="@style/rounded"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/bottom_nav_bar" />

View file

@ -8,7 +8,7 @@
<import type="android.graphics.Typeface" />
<variable
name="viewModel"
type="org.linphone.ui.main.chat.model.ConversationEditSubjectDialogModel" />
type="org.linphone.ui.main.chat.model.ConversationSetOrEditSubjectDialogModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
@ -37,7 +37,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:paddingTop="@dimen/dialog_top_bottom_margin"
android:text="@string/dialog_group_conversation_edit_subject"
android:text="@{viewModel.isEdit ? @string/dialog_group_conversation_edit_subject : @string/dialog_group_conversation_set_subject, default=@string/dialog_group_conversation_set_subject}"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintBottom_toTopOf="@id/subject"
app:layout_constraintStart_toStartOf="@id/dialog_background"
@ -54,6 +54,7 @@
android:layout_marginTop="5dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:hint="@string/dialog_group_conversation_subject_hint"
android:text="@={viewModel.subject, default=`Lorem Ipsum`}"
android:textSize="14sp"
android:textColor="?attr/color_main2_600"
@ -86,7 +87,6 @@
android:onClick="@{() -> viewModel.confirm()}"
style="@style/primary_button_label_style"
android:id="@+id/confirm"
android:enabled="@{viewModel.subject.length() > 0}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"

View file

@ -126,8 +126,8 @@
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/phone_plus"
app:tint="?attr/color_main2_700"
app:backgroundTint="?attr/color_main2_000"
app:tint="?attr/color_main2_000"
app:backgroundTint="?attr/color_main1_500"
app:shapeAppearanceOverlay="@style/rounded"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/bottom_nav_bar" />

View file

@ -123,8 +123,8 @@
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/plus_circle"
app:tint="?attr/color_main2_700"
app:backgroundTint="?attr/color_main2_000"
app:tint="?attr/color_main2_000"
app:backgroundTint="?attr/color_main1_500"
app:shapeAppearanceOverlay="@style/rounded"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/bottom_nav_bar" />

View file

@ -8,6 +8,9 @@
<variable
name="backClickListener"
type="View.OnClickListener" />
<variable
name="askForGroupConversationSubjectClickListener"
type="View.OnClickListener" />
<variable
name="viewModel"
type="org.linphone.ui.main.chat.viewmodel.StartConversationViewModel" />
@ -26,29 +29,29 @@
android:id="@+id/multiple_selection_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:constraint_referenced_ids="group_name_title, group_name, required_label, create_group, multiple_selection, multiple_selection_count"
app:constraint_referenced_ids="multiple_selection, multiple_selection_count"
android:visibility="@{viewModel.multipleSelectionMode ? View.VISIBLE : View.GONE, default=gone}" />
<ImageView
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_height="@dimen/top_bar_height"
android:adjustViewBounds="true"
android:onClick="@{backClickListener}"
android:padding="15dp"
android:src="@drawable/caret_left"
app:tint="?attr/color_main1_500"
app:layout_constraintBottom_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/title" />
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/main_page_title_style"
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="@dimen/top_bar_height"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="@string/new_conversation_title"
android:text="@{viewModel.multipleSelectionMode ? @string/new_group_conversation_title : @string/new_conversation_title, default=@string/new_conversation_title}"
app:layout_constraintBottom_toBottomOf="@id/back"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/back"
app:layout_constraintTop_toTopOf="parent" />
@ -60,65 +63,19 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/title" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/header_style"
android:id="@+id/group_name_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:text="@string/new_conversation_group_name_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/background" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_300"
android:id="@+id/required_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/required"
android:textSize="12sp"
android:textColor="?attr/color_main2_600"
app:layout_constraintEnd_toEndOf="@id/group_name"
app:layout_constraintTop_toTopOf="@id/background" />
<androidx.appcompat.widget.AppCompatEditText
style="@style/default_text_style"
android:id="@+id/group_name"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginTop="5dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.subject, default=`Dummy subject`}"
android:hint="@string/new_conversation_group_name_title"
android:textSize="14sp"
android:textColor="?attr/color_main2_600"
android:maxLines="1"
android:background="@drawable/edit_text_background"
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"
app:layout_constraintEnd_toEndOf="parent"/>
app:layout_constraintTop_toBottomOf="@id/back" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_300"
android:id="@+id/multiple_selection_count"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="20dp"
android:text="@{viewModel.selectionCount, default=`0 selected`}"
android:textSize="12sp"
android:textColor="@color/black"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/group_name" />
app:layout_constraintStart_toStartOf="@id/title"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/title" />
<HorizontalScrollView
android:id="@+id/multiple_selection"
@ -263,27 +220,22 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/group_chat_icon"
app:layout_constraintBottom_toTopOf="@id/create_group" />
app:layout_constraintBottom_toBottomOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/primary_button_label_style"
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/create_group"
android:onClick="@{() -> viewModel.createGroupChatRoom()}"
android:layout_width="0dp"
android:onClick="@{askForGroupConversationSubjectClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@string/dialog_continue"
android:enabled="@{viewModel.groupChatRoomCreateButtonEnabled}"
app:layout_constraintWidth_max="@dimen/button_max_width"
app:layout_constraintTop_toBottomOf="@id/contacts_list"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:visibility="@{viewModel.multipleSelectionMode &amp;&amp; viewModel.groupChatRoomCreateButtonEnabled ? View.VISIBLE : View.GONE, default=gone}"
android:src="@drawable/check"
app:tint="?attr/color_main2_000"
app:backgroundTint="?attr/color_main1_500"
app:shapeAppearanceOverlay="@style/rounded"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -119,7 +119,9 @@
<string name="dialog_update_available_message">A new version %s is available. Do you want to update?</string>
<string name="dialog_account_international_prefix_help_title">Why do we need it?</string>
<string name="dialog_account_international_prefix_help_message">Blah blah blah</string>
<string name="dialog_group_conversation_set_subject">Set conversation subject</string>
<string name="dialog_group_conversation_edit_subject">Edit conversation subject</string>
<string name="dialog_group_conversation_subject_hint">Conversation subject</string>
<string name="dialog_group_conversation_edit_subject_confirm_button">Confirm</string>
<string name="toast_assistant_qr_code_invalid">Invalid QR code!</string>
@ -396,6 +398,7 @@
<string name="conversation_ephemeral_messages_duration_three_days">3 days</string>
<string name="conversation_ephemeral_messages_duration_one_week">1 week</string>
<string name="new_conversation_title">New conversation</string>
<string name="new_group_conversation_title">New group conversation</string>
<string name="new_conversation_search_bar_filter_hint">Search contact</string>
<string name="new_conversation_create_group">Create a group conversation</string>
<string name="new_conversation_no_contact">No contact and no suggestion for the moment…</string>