Skip to content
Snippets Groups Projects
Commit 5d67fe09 authored by Taras's avatar Taras
Browse files

Add show invites item to groups list

parent 6bd5f898
No related branches found
No related tags found
No related merge requests found
......@@ -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
......@@ -38,12 +37,7 @@ class GroupsFragment : Fragment(org.futo.circles.core.R.layout.fragment_rooms),
private val listAdapter by lazy {
GroupsListAdapter(
onRoomClicked = { roomListItem -> onRoomListItemClicked(roomListItem) },
onInviteClicked = { roomListItem, isAccepted ->
onInviteClicked(roomListItem, isAccepted)
},
onUnblurProfileIconClicked = { roomListItem ->
viewModel.unblurProfileIcon(roomListItem)
}
onOpenInvitesClicked = {}
)
}
......@@ -92,12 +86,6 @@ class GroupsFragment : Fragment(org.futo.circles.core.R.layout.fragment_rooms),
viewModel.inviteResultLiveData.observeResponse(this)
}
private fun onInviteClicked(room: GroupListItem, isAccepted: Boolean) {
if (showNoInternetConnection()) return
if (isAccepted) viewModel.acceptGroupInvite(room.id)
else viewModel.rejectInvite(room.id)
}
private fun onRoomListItemClicked(room: GroupListItem) {
findNavController().navigateSafe(GroupsFragmentDirections.toTimeline(room.id))
......
......@@ -5,36 +5,14 @@ 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 org.futo.circles.core.extensions.launchBg
import org.futo.circles.core.feature.room.invite.InviteRequestsDataSource
import org.futo.circles.core.model.CircleRoomTypeArg
import org.futo.circles.model.GroupListItem
import javax.inject.Inject
@HiltViewModel
class GroupsViewModel @Inject constructor(
private val dataSource: GroupsDataSource,
private val inviteRequestsDataSource: InviteRequestsDataSource
dataSource: GroupsDataSource
) : ViewModel() {
val roomsLiveData = dataSource.getGroupsFlow().asLiveData()
val inviteResultLiveData = SingleEventLiveData<Response<Unit?>>()
fun rejectInvite(roomId: String) {
launchBg {
val result = inviteRequestsDataSource.rejectInvite(roomId)
inviteResultLiveData.postValue(result)
}
}
fun acceptGroupInvite(roomId: String) {
launchBg {
val result = inviteRequestsDataSource.acceptInvite(roomId, CircleRoomTypeArg.Group)
inviteResultLiveData.postValue(result)
}
}
fun unblurProfileIcon(roomListItem: GroupListItem) {
dataSource.unblurProfileImageFor(roomListItem.id)
}
}
\ No newline at end of file
......@@ -12,25 +12,17 @@ import org.futo.circles.core.base.list.context
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.ListItemInvitedGroupBinding
import org.futo.circles.databinding.ListItemInviteNotificationBinding
import org.futo.circles.databinding.ListItemJoinedGroupBinding
import org.futo.circles.extensions.setIsEncryptedIcon
import org.futo.circles.model.GroupInvitesNotificationListItem
import org.futo.circles.model.GroupListItem
import org.futo.circles.model.GroupListItemPayload
import org.futo.circles.model.InvitedGroupListItem
import org.futo.circles.model.JoinedGroupListItem
abstract class GroupViewHolder(view: View) : RecyclerView.ViewHolder(view) {
abstract fun bind(data: GroupListItem)
protected fun setIsEncrypted(lockIcon: ImageView, isEncrypted: Boolean) {
lockIcon.setIsEncryptedIcon(isEncrypted)
}
protected fun setTitle(titleView: TextView, title: String) {
titleView.text = title
}
}
class JoinedGroupViewHolder(
......@@ -67,6 +59,14 @@ class JoinedGroupViewHolder(
data.unreadCount?.let { setUnreadCount(it) }
}
private fun setIsEncrypted(lockIcon: ImageView, isEncrypted: Boolean) {
lockIcon.setIsEncryptedIcon(isEncrypted)
}
private fun setTitle(titleView: TextView, title: String) {
titleView.text = title
}
private fun setTopic(topic: String) {
binding.tvTopic.setIsVisible(topic.isNotEmpty())
binding.tvTopic.text = context.getString(R.string.topic_formatter, topic)
......@@ -102,38 +102,22 @@ class JoinedGroupViewHolder(
}
}
class InvitedGroupViewHolder(
class GroupInviteNotificationViewHolder(
parent: ViewGroup,
onInviteClicked: (Int, Boolean) -> Unit,
onShowProfileIconClicked: (Int) -> Unit
) : GroupViewHolder(inflate(parent, ListItemInvitedGroupBinding::inflate)) {
onClicked: () -> Unit
) : GroupViewHolder(inflate(parent, ListItemInviteNotificationBinding::inflate)) {
private companion object : ViewBindingHolder
private val binding = baseBinding as ListItemInvitedGroupBinding
private val binding = baseBinding as ListItemInviteNotificationBinding
init {
onClick(binding.btnAccept) { position -> onInviteClicked(position, true) }
onClick(binding.btnDecline) { position -> onInviteClicked(position, false) }
onClick(binding.ivGroup) { position -> onShowProfileIconClicked(position) }
onClick(binding.lInviteNotification) { _ -> onClicked() }
}
override fun bind(data: GroupListItem) {
if (data !is InvitedGroupListItem) return
with(binding) {
ivGroup.loadRoomProfileIcon(
data.info.avatarUrl,
data.info.title,
applyBlur = data.shouldBlurIcon
)
tvShowProfileImage.setIsVisible(data.shouldBlurIcon)
setIsEncrypted(ivLock, data.isEncrypted)
setTitle(tvGroupTitle, data.info.title)
tvInviterName.text = context.getString(
org.futo.circles.core.R.string.invited_by_format,
data.inviterName
)
}
if (data !is GroupInvitesNotificationListItem) return
binding.tvInvitesMessage.text =
context.getString(R.string.group_invites_notification_format, data.invitesCount)
}
}
\ No newline at end of file
......@@ -2,17 +2,16 @@ package org.futo.circles.feature.groups.list
import android.view.ViewGroup
import org.futo.circles.core.base.list.BaseRvAdapter
import org.futo.circles.model.GroupInvitesNotificationListItem
import org.futo.circles.model.GroupListItem
import org.futo.circles.model.GroupListItemPayload
import org.futo.circles.model.InvitedGroupListItem
import org.futo.circles.model.JoinedGroupListItem
enum class GroupListItemViewType { JoinedGroup, InvitedGroup }
enum class GroupListItemViewType { JoinedGroup, InviteNotification }
class GroupsListAdapter(
private val onRoomClicked: (GroupListItem) -> Unit,
private val onInviteClicked: (GroupListItem, Boolean) -> Unit,
private val onUnblurProfileIconClicked: (GroupListItem) -> Unit
private val onOpenInvitesClicked: () -> Unit
) : BaseRvAdapter<GroupListItem, GroupViewHolder>(PayloadIdEntityCallback { old, new ->
if (new is JoinedGroupListItem && old is JoinedGroupListItem) {
GroupListItemPayload(
......@@ -29,26 +28,17 @@ class GroupsListAdapter(
override fun getItemViewType(position: Int): Int = when (getItem(position)) {
is JoinedGroupListItem -> GroupListItemViewType.JoinedGroup.ordinal
is InvitedGroupListItem -> GroupListItemViewType.InvitedGroup.ordinal
is GroupInvitesNotificationListItem -> GroupListItemViewType.InviteNotification.ordinal
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
parent: ViewGroup, viewType: Int
) = when (GroupListItemViewType.values()[viewType]) {
GroupListItemViewType.JoinedGroup -> JoinedGroupViewHolder(
parent = parent,
onGroupClicked = { position -> onRoomClicked(getItem(position)) }
)
GroupListItemViewType.JoinedGroup -> JoinedGroupViewHolder(parent = parent,
onGroupClicked = { position -> onRoomClicked(getItem(position)) })
GroupListItemViewType.InvitedGroup -> InvitedGroupViewHolder(
parent = parent,
onInviteClicked = { position, isAccepted ->
onInviteClicked(getItem(position), isAccepted)
},
onShowProfileIconClicked = { position ->
onUnblurProfileIconClicked(getItem(position))
}
GroupListItemViewType.InviteNotification -> GroupInviteNotificationViewHolder(
parent = parent, onClicked = { onOpenInvitesClicked() }
)
}
......@@ -57,9 +47,7 @@ class GroupsListAdapter(
}
override fun onBindViewHolder(
holder: GroupViewHolder,
position: Int,
payloads: MutableList<Any>
holder: GroupViewHolder, position: Int, payloads: MutableList<Any>
) {
if (payloads.isEmpty()) {
super.onBindViewHolder(holder, position, payloads)
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/lInviteNotification"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:padding="8dp">
<TextView
android:id="@+id/tvInvitesMessage"
style="@style/body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="@color/blue"
tools:text="@string/group_invites_notification_format" />
</FrameLayout>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment