@@ -29,14 +29,17 @@ import androidx.core.view.isVisible
2929import androidx.fragment.app.Fragment
3030import androidx.fragment.app.FragmentManager
3131import androidx.recyclerview.widget.DefaultItemAnimator
32+ import androidx.recyclerview.widget.ItemTouchHelper
3233import androidx.recyclerview.widget.LinearLayoutManager
3334import androidx.recyclerview.widget.RecyclerView
3435import chat.rocket.android.R
3536import chat.rocket.android.analytics.AnalyticsManager
3637import chat.rocket.android.analytics.event.ScreenViewEvent
38+ import chat.rocket.android.chatroom.adapter.AttachmentViewHolder
3739import chat.rocket.android.chatroom.adapter.ChatRoomAdapter
3840import chat.rocket.android.chatroom.adapter.CommandSuggestionsAdapter
3941import chat.rocket.android.chatroom.adapter.EmojiSuggestionsAdapter
42+ import chat.rocket.android.chatroom.adapter.MessageViewHolder
4043import chat.rocket.android.chatroom.adapter.PEOPLE
4144import chat.rocket.android.chatroom.adapter.PeopleSuggestionsAdapter
4245import chat.rocket.android.chatroom.adapter.RoomSuggestionsAdapter
@@ -156,7 +159,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
156159 lateinit var analyticsManager: AnalyticsManager
157160 @Inject
158161 lateinit var navigator: ChatRoomNavigator
159- private lateinit var adapter : ChatRoomAdapter
162+ private lateinit var chatRoomAdapter : ChatRoomAdapter
160163 internal lateinit var chatRoomId: String
161164 private lateinit var chatRoomName: String
162165 internal lateinit var chatRoomType: String
@@ -289,7 +292,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
289292 }
290293 ? : requireNotNull(arguments) { " no arguments supplied when the fragment was instantiated" }
291294
292- adapter = ChatRoomAdapter (
295+ chatRoomAdapter = ChatRoomAdapter (
293296 roomId = chatRoomId,
294297 roomType = chatRoomType,
295298 roomName = chatRoomName,
@@ -388,7 +391,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
388391 override fun showMessages (dataSet : List <BaseUiModel <* >>, clearDataSet : Boolean ) {
389392 ui {
390393 if (clearDataSet) {
391- adapter .clearData()
394+ chatRoomAdapter .clearData()
392395 }
393396
394397 if (dataSet.isNotEmpty()) {
@@ -429,35 +432,22 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
429432 }
430433 }
431434
432- if (recycler_view.adapter == null ) {
433- recycler_view.adapter = adapter
434- if (dataSet.size >= 30 ) {
435- recycler_view.addOnScrollListener(endlessRecyclerViewScrollListener)
436- }
437- recycler_view.addOnLayoutChangeListener(layoutChangeListener)
438- recycler_view.addOnScrollListener(onScrollListener)
439-
440- // Load just once, on the first page...
441- presenter.loadActiveMembers(chatRoomId, chatRoomType, filterSelfOut = true )
442- }
443-
444- val oldMessagesCount = adapter.itemCount
445- adapter.appendData(dataSet)
435+ val oldMessagesCount = chatRoomAdapter.itemCount
436+ chatRoomAdapter.appendData(dataSet)
446437 if (oldMessagesCount == 0 && dataSet.isNotEmpty()) {
447438 recycler_view.scrollToPosition(0 )
448439 verticalScrollOffset.set(0 )
449440 }
450- presenter.loadActiveMembers(chatRoomId, chatRoomType, filterSelfOut = true )
451- empty_chat_view.isVisible = adapter.itemCount == 0
441+ empty_chat_view.isVisible = chatRoomAdapter.itemCount == 0
452442 dismissEmojiKeyboard()
453443 }
454444 }
455445
456446 override fun showSearchedMessages (dataSet : List <BaseUiModel <* >>) {
457447 recycler_view.removeOnScrollListener(endlessRecyclerViewScrollListener)
458- adapter .clearData()
459- adapter .prependData(dataSet)
460- empty_chat_view.isVisible = adapter .itemCount == 0
448+ chatRoomAdapter .clearData()
449+ chatRoomAdapter .prependData(dataSet)
450+ empty_chat_view.isVisible = chatRoomAdapter .itemCount == 0
461451 dismissEmojiKeyboard()
462452 }
463453
@@ -469,10 +459,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
469459 setupMessageComposer(roomUiModel)
470460 isBroadcastChannel = roomUiModel.broadcast
471461 isFavorite = roomUiModel.favorite.orFalse()
472- if (isBroadcastChannel && ! roomUiModel.canModerate) {
473- disableMenu = true
474- activity?.invalidateOptionsMenu()
475- }
462+ disableMenu = (roomUiModel.broadcast && ! roomUiModel.canModerate)
463+ activity?.invalidateOptionsMenu()
476464 }
477465 }
478466
@@ -542,7 +530,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
542530
543531 override fun showNewMessage (message : List <BaseUiModel <* >>, isMessageReceived : Boolean ) {
544532 ui {
545- adapter .prependData(message)
533+ chatRoomAdapter .prependData(message)
546534 if (isMessageReceived && button_fab.isVisible) {
547535 newMessageCount++
548536 if (newMessageCount <= 99 ) {
@@ -555,7 +543,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
555543 recycler_view.scrollToPosition(0 )
556544 }
557545 verticalScrollOffset.set(0 )
558- empty_chat_view.isVisible = adapter .itemCount == 0
546+ empty_chat_view.isVisible = chatRoomAdapter .itemCount == 0
559547 dismissEmojiKeyboard()
560548 }
561549 }
@@ -565,9 +553,9 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
565553 // TODO - investigate WHY we get a empty list here
566554 if (message.isEmpty()) return @ui
567555
568- if (adapter .updateItem(message.last())) {
556+ if (chatRoomAdapter .updateItem(message.last())) {
569557 if (message.size > 1 ) {
570- adapter .prependData(listOf (message.first()))
558+ chatRoomAdapter .prependData(listOf (message.first()))
571559 }
572560 } else {
573561 showNewMessage(message, true )
@@ -578,7 +566,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
578566
579567 override fun dispatchDeleteMessage (msgId : String ) {
580568 ui {
581- adapter .removeItem(msgId)
569+ chatRoomAdapter .removeItem(msgId)
582570 }
583571 }
584572
@@ -807,7 +795,56 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
807795 presenter.loadMessages(chatRoomId, chatRoomType, page * 30L )
808796 }
809797 }
810- recycler_view.addOnScrollListener(fabScrollListener)
798+
799+ with (recycler_view) {
800+ adapter = chatRoomAdapter
801+ addOnScrollListener(endlessRecyclerViewScrollListener)
802+ addOnLayoutChangeListener(layoutChangeListener)
803+ addOnScrollListener(onScrollListener)
804+ addOnScrollListener(fabScrollListener)
805+ }
806+ if (! isReadOnly) {
807+ val touchCallback: ItemTouchHelper .SimpleCallback =
808+ object : ItemTouchHelper .SimpleCallback (0 , ItemTouchHelper .LEFT ) {
809+ override fun onMove (
810+ recyclerView : RecyclerView ,
811+ viewHolder : RecyclerView .ViewHolder ,
812+ target : RecyclerView .ViewHolder
813+ ): Boolean {
814+ return true
815+ }
816+
817+ override fun onSwiped (viewHolder : RecyclerView .ViewHolder , direction : Int ) {
818+ var replyId: String? = null
819+
820+ when (viewHolder) {
821+ is MessageViewHolder -> replyId = viewHolder.data?.messageId
822+ is AttachmentViewHolder -> replyId = viewHolder.data?.messageId
823+ }
824+
825+ replyId?.let {
826+ citeMessage(chatRoomName, chatRoomType, it, true )
827+ }
828+
829+ chatRoomAdapter.notifyItemChanged(viewHolder.adapterPosition)
830+ }
831+
832+ override fun getSwipeDirs (
833+ recyclerView : RecyclerView ,
834+ viewHolder : RecyclerView .ViewHolder
835+ ): Int {
836+ // Currently enable swipes for text and attachment messages only
837+
838+ if (viewHolder is MessageViewHolder || viewHolder is AttachmentViewHolder ) {
839+ return super .getSwipeDirs(recyclerView, viewHolder)
840+ }
841+
842+ return 0
843+ }
844+ }
845+
846+ ItemTouchHelper (touchCallback).attachToRecyclerView(recycler_view)
847+ }
811848 }
812849
813850 private fun setupFab () {
0 commit comments