From 09ca9b53514dac6ba9f793c299c0ea1f41221549 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 22 Jun 2023 16:28:32 +0200 Subject: [PATCH] Added menu --- .../linphone/ui/conversations/ChatRoomData.kt | 7 ++ .../ConversationMenuDialogFragment.kt | 22 ++-- .../ui/conversations/ConversationsFragment.kt | 32 +++++- .../conversations/ConversationsListAdapter.kt | 23 +++- .../main/res/layout/chat_room_list_cell.xml | 1 + app/src/main/res/layout/chat_room_menu.xml | 108 +++++++++++++++++- app/src/main/res/values/colors.xml | 2 + 7 files changed, 175 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/conversations/ChatRoomData.kt b/app/src/main/java/org/linphone/ui/conversations/ChatRoomData.kt index 981fc08fa..2465148c9 100644 --- a/app/src/main/java/org/linphone/ui/conversations/ChatRoomData.kt +++ b/app/src/main/java/org/linphone/ui/conversations/ChatRoomData.kt @@ -138,6 +138,11 @@ class ChatRoomData(val chatRoom: ChatRoom) { chatRoomDataListener?.onClicked() } + fun onLongClicked(): Boolean { + chatRoomDataListener?.onLongClicked() + return true + } + private fun computeLastMessageImdnIcon(message: ChatMessage) { val state = message.state showLastMessageImdnIcon.postValue( @@ -209,4 +214,6 @@ class ChatRoomData(val chatRoom: ChatRoom) { abstract class ChatRoomDataListener { abstract fun onClicked() + + abstract fun onLongClicked() } diff --git a/app/src/main/java/org/linphone/ui/conversations/ConversationMenuDialogFragment.kt b/app/src/main/java/org/linphone/ui/conversations/ConversationMenuDialogFragment.kt index c8155bd58..55e292792 100644 --- a/app/src/main/java/org/linphone/ui/conversations/ConversationMenuDialogFragment.kt +++ b/app/src/main/java/org/linphone/ui/conversations/ConversationMenuDialogFragment.kt @@ -19,6 +19,7 @@ */ package org.linphone.ui.conversations +import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -32,12 +33,22 @@ import org.linphone.utils.LinphoneUtils class ConversationMenuDialogFragment( private val chatRoom: ChatRoom, - private val mutedCallback: ((Boolean) -> Unit)? = null + private val onDismiss: (() -> Unit)? = null ) : BottomSheetDialogFragment() { companion object { const val TAG = "ConversationMenuDialogFragment" } + override fun onCancel(dialog: DialogInterface) { + onDismiss?.invoke() + super.onCancel(dialog) + } + + override fun onDismiss(dialog: DialogInterface) { + onDismiss?.invoke() + super.onDismiss(dialog) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -47,7 +58,7 @@ class ConversationMenuDialogFragment( val id = LinphoneUtils.getChatRoomId(chatRoom) view.isMuted = corePreferences.chatRoomMuted(id) - view.isRead = chatRoom.unreadMessagesCount == 0 // FIXME: danger? + view.isRead = chatRoom.unreadMessagesCount == 0 view.setMarkAsReadClickListener { coreContext.postOnCoreThread { core -> @@ -56,15 +67,9 @@ class ConversationMenuDialogFragment( dismiss() } - view.setCallClickListener { - // TODO - dismiss() - } - view.setMuteClickListener { coreContext.postOnCoreThread { core -> corePreferences.muteChatRoom(id, true) - mutedCallback?.invoke(true) } dismiss() } @@ -72,7 +77,6 @@ class ConversationMenuDialogFragment( view.setUnMuteClickListener { coreContext.postOnCoreThread { core -> corePreferences.muteChatRoom(id, false) - mutedCallback?.invoke(false) } dismiss() } diff --git a/app/src/main/java/org/linphone/ui/conversations/ConversationsFragment.kt b/app/src/main/java/org/linphone/ui/conversations/ConversationsFragment.kt index 8b3f263df..7d407073b 100644 --- a/app/src/main/java/org/linphone/ui/conversations/ConversationsFragment.kt +++ b/app/src/main/java/org/linphone/ui/conversations/ConversationsFragment.kt @@ -27,6 +27,7 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.navigation.navGraphViewModels import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import org.linphone.R import org.linphone.databinding.ConversationsFragmentBinding @@ -37,6 +38,26 @@ class ConversationsFragment : Fragment() { ) private lateinit var adapter: ConversationsListAdapter + private val observer = object : RecyclerView.AdapterDataObserver() { + override fun onChanged() { + scrollToTop() + } + override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { + if (positionStart == 0 && itemCount == 1) { + scrollToTop() + } + } + override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) { + scrollToTop() + } + } + + override fun onDestroyView() { + binding.conversationsList.adapter = null + adapter.unregisterAdapterDataObserver(observer) + super.onDestroyView() + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -59,6 +80,7 @@ class ConversationsFragment : Fragment() { binding.lifecycleOwner = viewLifecycleOwner adapter = ConversationsListAdapter(viewLifecycleOwner) + adapter.registerAdapterDataObserver(observer) binding.conversationsList.setHasFixedSize(true) binding.conversationsList.adapter = adapter @@ -66,10 +88,10 @@ class ConversationsFragment : Fragment() { it.consume { data -> } } - adapter.chatRoomMenuClickedEvent.observe(viewLifecycleOwner) { + adapter.chatRoomLongClickedEvent.observe(viewLifecycleOwner) { it.consume { data -> - val modalBottomSheet = ConversationMenuDialogFragment(data.chatRoom) { muted -> - data.isMuted.postValue(muted) + val modalBottomSheet = ConversationMenuDialogFragment(data.chatRoom) { + adapter.resetSelection() } modalBottomSheet.show(parentFragmentManager, ConversationMenuDialogFragment.TAG) } @@ -90,4 +112,8 @@ class ConversationsFragment : Fragment() { } } } + + private fun scrollToTop() { + binding.conversationsList.scrollToPosition(0) + } } diff --git a/app/src/main/java/org/linphone/ui/conversations/ConversationsListAdapter.kt b/app/src/main/java/org/linphone/ui/conversations/ConversationsListAdapter.kt index c84d5541d..425541da9 100644 --- a/app/src/main/java/org/linphone/ui/conversations/ConversationsListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/conversations/ConversationsListAdapter.kt @@ -34,9 +34,15 @@ import org.linphone.utils.Event class ConversationsListAdapter( private val viewLifecycleOwner: LifecycleOwner ) : ListAdapter(ConversationDiffCallback()) { - val chatRoomClickedEvent = MutableLiveData>() + val chatRoomClickedEvent: MutableLiveData> by lazy { + MutableLiveData>() + } - val chatRoomMenuClickedEvent = MutableLiveData>() + val chatRoomLongClickedEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + + var selectedAdapterPosition = -1 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val binding: ChatRoomListCellBinding = DataBindingUtil.inflate( @@ -52,6 +58,11 @@ class ConversationsListAdapter( (holder as ViewHolder).bind(getItem(position)) } + fun resetSelection() { + notifyItemChanged(selectedAdapterPosition) + selectedAdapterPosition = -1 + } + inner class ViewHolder( val binding: ChatRoomListCellBinding ) : RecyclerView.ViewHolder(binding.root) { @@ -62,10 +73,18 @@ class ConversationsListAdapter( lifecycleOwner = viewLifecycleOwner executePendingBindings() + binding.root.isSelected = bindingAdapterPosition == selectedAdapterPosition + chatRoomData.chatRoomDataListener = object : ChatRoomDataListener() { override fun onClicked() { chatRoomClickedEvent.value = Event(chatRoomData) } + + override fun onLongClicked() { + selectedAdapterPosition = bindingAdapterPosition + binding.root.isSelected = true + chatRoomLongClickedEvent.value = Event(chatRoomData) + } } } } diff --git a/app/src/main/res/layout/chat_room_list_cell.xml b/app/src/main/res/layout/chat_room_list_cell.xml index b08522bc6..543d33276 100644 --- a/app/src/main/res/layout/chat_room_list_cell.xml +++ b/app/src/main/res/layout/chat_room_list_cell.xml @@ -15,6 +15,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="@{() -> data.onClicked()}" + android:onLongClick="@{() -> data.onLongClicked()}" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:background="@drawable/conversation_cell_background"> diff --git a/app/src/main/res/layout/chat_room_menu.xml b/app/src/main/res/layout/chat_room_menu.xml index 284350316..d485f1e1f 100644 --- a/app/src/main/res/layout/chat_room_menu.xml +++ b/app/src/main/res/layout/chat_room_menu.xml @@ -7,15 +7,15 @@ - + @@ -27,13 +27,109 @@ type="Boolean" /> - + android:background="@color/separator"> + + - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ab795e1fb..00d856972 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -4,10 +4,12 @@ #000000 #FFFFFF + #DD5F5F #6C7A87 #F9F9F9 #EEF6F8 #949494 #4E4E4E + #E5E5EA \ No newline at end of file