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