From e48415d57c3e7710de857c3e40994f11bcfdc49b Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Fri, 22 Dec 2023 16:02:09 +0200
Subject: [PATCH] Add show invites item to Cirles list

---
 .../feature/circles/CirclesFragment.kt        | 21 +--------
 .../feature/circles/CirclesViewModel.kt       | 17 +------
 .../circles/list/CirclesListAdapter.kt        | 18 +++-----
 .../feature/circles/list/CirclesViewHolder.kt | 44 +++++++------------
 .../circles/feature/groups/GroupsFragment.kt  |  1 -
 .../circles/feature/groups/GroupsViewModel.kt |  3 --
 6 files changed, 23 insertions(+), 81 deletions(-)

diff --git a/app/src/main/java/org/futo/circles/feature/circles/CirclesFragment.kt b/app/src/main/java/org/futo/circles/feature/circles/CirclesFragment.kt
index 079fe7cad..675e87b5e 100644
--- a/app/src/main/java/org/futo/circles/feature/circles/CirclesFragment.kt
+++ b/app/src/main/java/org/futo/circles/feature/circles/CirclesFragment.kt
@@ -22,7 +22,6 @@ import org.futo.circles.core.extensions.navigateSafe
 import org.futo.circles.core.extensions.observeData
 import org.futo.circles.core.extensions.observeResponse
 import org.futo.circles.core.extensions.setEnabledViews
-import org.futo.circles.core.extensions.showNoInternetConnection
 import org.futo.circles.core.model.CircleRoomTypeArg
 import org.futo.circles.core.provider.PreferencesProvider
 import org.futo.circles.core.view.EmptyTabPlaceholderView
@@ -79,12 +78,7 @@ class CirclesFragment : Fragment(org.futo.circles.core.R.layout.fragment_rooms),
             addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
             adapter = CirclesListAdapter(
                 onRoomClicked = { roomListItem -> onRoomListItemClicked(roomListItem) },
-                onInviteClicked = { roomListItem, isAccepted ->
-                    onInviteClicked(roomListItem, isAccepted)
-                },
-                onUnblurProfileIconClicked = { roomListItem ->
-                    viewModel.unblurProfileIcon(roomListItem)
-                }
+                onOpenInvitesClicked = {}
             ).also { listAdapter = it }
             bindToFab(binding.fbAddRoom)
         }
@@ -97,7 +91,6 @@ class CirclesFragment : Fragment(org.futo.circles.core.R.layout.fragment_rooms),
             listAdapter?.submitList(it)
             binding.rvRooms.notifyItemsChanged()
         }
-        viewModel.inviteResultLiveData.observeResponse(this)
         viewModel.createTimelineLoadingLiveData.observeData(this) {
             loadingDialog.handleLoading(it)
         }
@@ -107,12 +100,6 @@ class CirclesFragment : Fragment(org.futo.circles.core.R.layout.fragment_rooms),
             })
     }
 
-    private fun onInviteClicked(room: CircleListItem, isAccepted: Boolean) {
-        if (showNoInternetConnection()) return
-        if (isAccepted) onAcceptInviteClicked(room)
-        else viewModel.rejectInvite(room.id)
-    }
-
     private fun onRoomListItemClicked(room: CircleListItem) {
         viewModel.createTimeLineIfNotExist(room.id)
     }
@@ -120,10 +107,4 @@ class CirclesFragment : Fragment(org.futo.circles.core.R.layout.fragment_rooms),
     private fun navigateToCreateRoom() {
         findNavController().navigateSafe(CirclesFragmentDirections.toCreateCircleDialogFragment())
     }
-
-    private fun onAcceptInviteClicked(room: CircleListItem) {
-        findNavController().navigateSafe(
-            CirclesFragmentDirections.toAcceptCircleInviteDialogFragment(room.id)
-        )
-    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/org/futo/circles/feature/circles/CirclesViewModel.kt b/app/src/main/java/org/futo/circles/feature/circles/CirclesViewModel.kt
index 39f14d266..39975db9b 100644
--- a/app/src/main/java/org/futo/circles/feature/circles/CirclesViewModel.kt
+++ b/app/src/main/java/org/futo/circles/feature/circles/CirclesViewModel.kt
@@ -11,33 +11,22 @@ import org.futo.circles.core.extensions.Response
 import org.futo.circles.core.extensions.createResult
 import org.futo.circles.core.extensions.launchBg
 import org.futo.circles.core.feature.room.create.CreateRoomDataSource
-import org.futo.circles.core.feature.room.invite.InviteRequestsDataSource
 import org.futo.circles.core.model.LoadingData
 import org.futo.circles.core.provider.MatrixSessionProvider
 import org.futo.circles.core.utils.getTimelineRoomFor
-import org.futo.circles.model.CircleListItem
 import org.matrix.android.sdk.api.session.getRoomSummary
 import javax.inject.Inject
 
 @HiltViewModel
 class CirclesViewModel @Inject constructor(
-    private val dataSource: CirclesDataSource,
-    private val inviteRequestsDataSource: InviteRequestsDataSource,
+    dataSource: CirclesDataSource,
     private val createRoomDataSource: CreateRoomDataSource
 ) : ViewModel() {
 
     val roomsLiveData = dataSource.getCirclesFlow().asLiveData()
-    val inviteResultLiveData = SingleEventLiveData<Response<Unit?>>()
     val navigateToCircleLiveData = SingleEventLiveData<Response<String>>()
     val createTimelineLoadingLiveData = MutableLiveData<LoadingData>()
 
-    fun rejectInvite(roomId: String) {
-        launchBg {
-            val result = inviteRequestsDataSource.rejectInvite(roomId)
-            inviteResultLiveData.postValue(result)
-        }
-    }
-
 
     fun createTimeLineIfNotExist(circleId: String) {
         launchBg {
@@ -56,8 +45,4 @@ class CirclesViewModel @Inject constructor(
         }
     }
 
-    fun unblurProfileIcon(roomListItem: CircleListItem) {
-        dataSource.unblurProfileImageFor(roomListItem.id)
-    }
-
 }
\ No newline at end of file
diff --git a/app/src/main/java/org/futo/circles/feature/circles/list/CirclesListAdapter.kt b/app/src/main/java/org/futo/circles/feature/circles/list/CirclesListAdapter.kt
index bd1d6fa24..ffc2fb21a 100644
--- a/app/src/main/java/org/futo/circles/feature/circles/list/CirclesListAdapter.kt
+++ b/app/src/main/java/org/futo/circles/feature/circles/list/CirclesListAdapter.kt
@@ -2,18 +2,17 @@ package org.futo.circles.feature.circles.list
 
 import android.view.ViewGroup
 import org.futo.circles.core.base.list.BaseRvAdapter
+import org.futo.circles.model.CircleInvitesNotificationListItem
 import org.futo.circles.model.CircleListItem
 import org.futo.circles.model.CircleListItemPayload
 import org.futo.circles.model.CirclesHeaderItem
-import org.futo.circles.model.InvitedCircleListItem
 import org.futo.circles.model.JoinedCircleListItem
 
-enum class CirclesListItemViewType { JoinedCircle, InvitedCircle, Header }
+enum class CirclesListItemViewType { JoinedCircle, InviteNotification, Header }
 
 class CirclesListAdapter(
     private val onRoomClicked: (CircleListItem) -> Unit,
-    private val onInviteClicked: (CircleListItem, Boolean) -> Unit,
-    private val onUnblurProfileIconClicked: (CircleListItem) -> Unit
+    private val onOpenInvitesClicked: () -> Unit
 ) : BaseRvAdapter<CircleListItem, CirclesViewHolder>(PayloadIdEntityCallback { old, new ->
     if (new is JoinedCircleListItem && old is JoinedCircleListItem) {
         CircleListItemPayload(
@@ -28,7 +27,7 @@ class CirclesListAdapter(
 
     override fun getItemViewType(position: Int): Int = when (getItem(position)) {
         is JoinedCircleListItem -> CirclesListItemViewType.JoinedCircle.ordinal
-        is InvitedCircleListItem -> CirclesListItemViewType.InvitedCircle.ordinal
+        is CircleInvitesNotificationListItem -> CirclesListItemViewType.InviteNotification.ordinal
         is CirclesHeaderItem -> CirclesListItemViewType.Header.ordinal
     }
 
@@ -41,14 +40,9 @@ class CirclesListAdapter(
             onCircleClicked = { position -> onRoomClicked(getItem(position)) }
         )
 
-        CirclesListItemViewType.InvitedCircle -> InvitedCircleViewHolder(
+        CirclesListItemViewType.InviteNotification -> CircleInviteNotificationViewHolder(
             parent = parent,
-            onInviteClicked = { position, isAccepted ->
-                onInviteClicked(getItem(position), isAccepted)
-            },
-            onShowProfileIconClicked = { position ->
-                onUnblurProfileIconClicked(getItem(position))
-            }
+            onClicked = { onOpenInvitesClicked() }
         )
 
         CirclesListItemViewType.Header -> CircleHeaderViewHolder(parent = parent)
diff --git a/app/src/main/java/org/futo/circles/feature/circles/list/CirclesViewHolder.kt b/app/src/main/java/org/futo/circles/feature/circles/list/CirclesViewHolder.kt
index e5b172b70..99fabdaeb 100644
--- a/app/src/main/java/org/futo/circles/feature/circles/list/CirclesViewHolder.kt
+++ b/app/src/main/java/org/futo/circles/feature/circles/list/CirclesViewHolder.kt
@@ -11,20 +11,17 @@ import org.futo.circles.core.databinding.ListItemInviteHeaderBinding
 import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.extensions.onClick
 import org.futo.circles.core.extensions.setIsVisible
-import org.futo.circles.databinding.ListItemInvitedCircleBinding
+import org.futo.circles.databinding.ListItemInviteNotificationBinding
 import org.futo.circles.databinding.ListItemJoinedCircleBinding
+import org.futo.circles.model.CircleInvitesNotificationListItem
 import org.futo.circles.model.CircleListItem
 import org.futo.circles.model.CircleListItemPayload
 import org.futo.circles.model.CirclesHeaderItem
-import org.futo.circles.model.InvitedCircleListItem
 import org.futo.circles.model.JoinedCircleListItem
 
 abstract class CirclesViewHolder(view: View) : RecyclerView.ViewHolder(view) {
     abstract fun bind(data: CircleListItem)
 
-    protected fun setTitle(titleView: TextView, title: String) {
-        titleView.text = title
-    }
 }
 
 
@@ -61,6 +58,10 @@ class JoinedCircleViewHolder(
         data.knocksCount?.let { setRequestsCount(it) }
     }
 
+    private fun setTitle(titleView: TextView, title: String) {
+        titleView.text = title
+    }
+
     private fun setFollowingCount(followersCount: Int) {
         binding.tvFollowing.text = context.getString(R.string.following_format, followersCount)
     }
@@ -82,42 +83,27 @@ class JoinedCircleViewHolder(
     }
 }
 
-class InvitedCircleViewHolder(
+class CircleInviteNotificationViewHolder(
     parent: ViewGroup,
-    onInviteClicked: (Int, Boolean) -> Unit,
-    onShowProfileIconClicked: (Int) -> Unit
-) : CirclesViewHolder(inflate(parent, ListItemInvitedCircleBinding::inflate)) {
+    onClicked: () -> Unit
+) : CirclesViewHolder(inflate(parent, ListItemInviteNotificationBinding::inflate)) {
 
     private companion object : ViewBindingHolder
 
-    private val binding = baseBinding as ListItemInvitedCircleBinding
+    private val binding = baseBinding as ListItemInviteNotificationBinding
 
     init {
-        onClick(binding.btnAccept) { position -> onInviteClicked(position, true) }
-        onClick(binding.btnDecline) { position -> onInviteClicked(position, false) }
-        onClick(binding.ivCircle) { position -> onShowProfileIconClicked(position) }
+        onClick(binding.lInviteNotification) { _ -> onClicked() }
     }
 
     override fun bind(data: CircleListItem) {
-        if (data !is InvitedCircleListItem) return
-
-        with(binding) {
-            tvShowProfileImage.setIsVisible(data.shouldBlurIcon)
-            ivCircle.loadRoomProfileIcon(
-                data.info.avatarUrl,
-                data.info.title,
-                applyBlur = data.shouldBlurIcon
-            )
-            setTitle(tvCircleTitle, data.info.title)
-            binding.tvInvitedBy.text =
-                context.getString(
-                    org.futo.circles.core.R.string.invited_by_format,
-                    data.inviterName
-                )
-        }
+        if (data !is CircleInvitesNotificationListItem) return
+        binding.tvInvitesMessage.text =
+            context.getString(R.string.circle_invites_notification_format, data.invitesCount)
     }
 }
 
+
 class CircleHeaderViewHolder(
     parent: ViewGroup,
 ) : CirclesViewHolder(inflate(parent, ListItemInviteHeaderBinding::inflate)) {
diff --git a/app/src/main/java/org/futo/circles/feature/groups/GroupsFragment.kt b/app/src/main/java/org/futo/circles/feature/groups/GroupsFragment.kt
index b8054b5f8..fe498db76 100644
--- a/app/src/main/java/org/futo/circles/feature/groups/GroupsFragment.kt
+++ b/app/src/main/java/org/futo/circles/feature/groups/GroupsFragment.kt
@@ -83,7 +83,6 @@ class GroupsFragment : Fragment(org.futo.circles.core.R.layout.fragment_rooms),
     private fun setupObservers() {
         NetworkObserver.observe(this) { setEnabledViews(it, listOf(binding.rvRooms)) }
         viewModel.roomsLiveData.observeData(this) { listAdapter.submitList(it) }
-        viewModel.inviteResultLiveData.observeResponse(this)
     }
 
 
diff --git a/app/src/main/java/org/futo/circles/feature/groups/GroupsViewModel.kt b/app/src/main/java/org/futo/circles/feature/groups/GroupsViewModel.kt
index 6e8268fa6..fb0d46156 100644
--- a/app/src/main/java/org/futo/circles/feature/groups/GroupsViewModel.kt
+++ b/app/src/main/java/org/futo/circles/feature/groups/GroupsViewModel.kt
@@ -3,8 +3,6 @@ package org.futo.circles.feature.groups
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.asLiveData
 import dagger.hilt.android.lifecycle.HiltViewModel
-import org.futo.circles.core.base.SingleEventLiveData
-import org.futo.circles.core.extensions.Response
 import javax.inject.Inject
 
 @HiltViewModel
@@ -13,6 +11,5 @@ class GroupsViewModel @Inject constructor(
 ) : ViewModel() {
 
     val roomsLiveData = dataSource.getGroupsFlow().asLiveData()
-    val inviteResultLiveData = SingleEventLiveData<Response<Unit?>>()
 
 }
\ No newline at end of file
-- 
GitLab