From 134b8f70a93da9964081ab94ec155e6045d32096 Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Fri, 27 Oct 2023 19:18:22 +0300
Subject: [PATCH] Add message to room knock items

---
 .../room/knoks/KnockRequestViewModel.kt        |  2 +-
 .../room/knoks/KnockRequestsDataSource.kt      | 18 +++++++++++++++---
 .../room/knoks/list/KnockRequestViewHolder.kt  |  5 +++++
 .../circles/core/model/KnockRequestListItem.kt |  3 ++-
 .../res/layout/list_item_knock_request.xml     | 17 ++++++++++++++++-
 5 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/core/src/main/java/org/futo/circles/core/feature/room/knoks/KnockRequestViewModel.kt b/core/src/main/java/org/futo/circles/core/feature/room/knoks/KnockRequestViewModel.kt
index 7c14675f9..9887aca60 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/knoks/KnockRequestViewModel.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/knoks/KnockRequestViewModel.kt
@@ -15,7 +15,7 @@ import javax.inject.Inject
 class KnockRequestViewModel @Inject constructor(
     savedStateHandle: SavedStateHandle,
     private val inviteRequestsDataSource: InviteRequestsDataSource,
-    private val knockRequestsDataSource: KnockRequestsDataSource
+    knockRequestsDataSource: KnockRequestsDataSource
 ) : ViewModel() {
 
     private val roomId: String = savedStateHandle.getOrThrow("roomId")
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/knoks/KnockRequestsDataSource.kt b/core/src/main/java/org/futo/circles/core/feature/room/knoks/KnockRequestsDataSource.kt
index 7aeeb5705..22148cac3 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/knoks/KnockRequestsDataSource.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/knoks/KnockRequestsDataSource.kt
@@ -4,16 +4,20 @@ import androidx.lifecycle.map
 import org.futo.circles.core.model.KnockRequestListItem
 import org.futo.circles.core.provider.MatrixSessionProvider
 import org.futo.circles.core.utils.UserUtils
+import org.matrix.android.sdk.api.query.QueryStringValue
+import org.matrix.android.sdk.api.session.events.model.EventType.STATE_ROOM_MEMBER
+import org.matrix.android.sdk.api.session.events.model.toModel
 import org.matrix.android.sdk.api.session.getRoom
 import org.matrix.android.sdk.api.session.room.members.roomMemberQueryParams
 import org.matrix.android.sdk.api.session.room.model.Membership
+import org.matrix.android.sdk.api.session.room.model.RoomMemberContent
 import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
 import javax.inject.Inject
 
 class KnockRequestsDataSource @Inject constructor() {
 
     fun getKnockRequestsListItemsLiveData(roomId: String) = getKnockRequestLiveData(roomId)?.map {
-        it.map { user -> user.toKnockRequestListItem() }
+        it.map { user -> user.toKnockRequestListItem(roomId) }
     }
 
     fun getKnockRequestCountLiveData(roomId: String) =
@@ -28,9 +32,17 @@ class KnockRequestsDataSource @Inject constructor() {
                 }
             )
 
-    private fun RoomMemberSummary.toKnockRequestListItem() = KnockRequestListItem(
+    private fun getReasonMessage(roomId: String, userId: String) =
+        MatrixSessionProvider.currentSession?.getRoom(roomId)?.stateService()?.getStateEvents(
+            setOf(STATE_ROOM_MEMBER), QueryStringValue.Contains(userId)
+        )?.firstOrNull {
+            it.content.toModel<RoomMemberContent>()?.membership == Membership.KNOCK
+        }?.content.toModel<RoomMemberContent>()?.safeReason
+
+    private fun RoomMemberSummary.toKnockRequestListItem(roomId: String) = KnockRequestListItem(
         requesterId = userId,
         requesterName = displayName ?: UserUtils.removeDomainSuffix(userId),
-        requesterAvatarUrl = avatarUrl
+        requesterAvatarUrl = avatarUrl,
+        message = getReasonMessage(roomId, userId)
     )
 }
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/knoks/list/KnockRequestViewHolder.kt b/core/src/main/java/org/futo/circles/core/feature/room/knoks/list/KnockRequestViewHolder.kt
index 5ceaa0242..c0634a697 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/knoks/list/KnockRequestViewHolder.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/knoks/list/KnockRequestViewHolder.kt
@@ -5,6 +5,7 @@ import androidx.recyclerview.widget.RecyclerView
 import org.futo.circles.core.base.list.ViewBindingHolder
 import org.futo.circles.core.databinding.ListItemKnockRequestBinding
 import org.futo.circles.core.extensions.onClick
+import org.futo.circles.core.extensions.setIsVisible
 import org.futo.circles.core.model.KnockRequestListItem
 import org.futo.circles.core.model.toCircleUser
 
@@ -24,6 +25,10 @@ class KnockRequestViewHolder(
     }
 
     fun bind(data: KnockRequestListItem) {
+        binding.tvReason.apply {
+            setIsVisible(!data.message.isNullOrBlank())
+            text = data.message
+        }
         binding.vUserLayout.bind(data.toCircleUser())
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/model/KnockRequestListItem.kt b/core/src/main/java/org/futo/circles/core/model/KnockRequestListItem.kt
index 54e49e8df..4b7becdc8 100644
--- a/core/src/main/java/org/futo/circles/core/model/KnockRequestListItem.kt
+++ b/core/src/main/java/org/futo/circles/core/model/KnockRequestListItem.kt
@@ -5,7 +5,8 @@ import org.futo.circles.core.base.list.IdEntity
 data class KnockRequestListItem(
     val requesterId: String,
     val requesterName: String,
-    val requesterAvatarUrl: String?
+    val requesterAvatarUrl: String?,
+    val message: String?
 ) : IdEntity<String> {
     override val id: String = requesterId
 }
diff --git a/core/src/main/res/layout/list_item_knock_request.xml b/core/src/main/res/layout/list_item_knock_request.xml
index 82644229c..08e07c234 100644
--- a/core/src/main/res/layout/list_item_knock_request.xml
+++ b/core/src/main/res/layout/list_item_knock_request.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
 
@@ -14,6 +15,20 @@
         app:layout_constraintTop_toTopOf="parent" />
 
 
+    <TextView
+        android:id="@+id/tvReason"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginHorizontal="16dp"
+        android:layout_marginTop="8dp"
+        android:visibility="gone"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/vUserLayout"
+        tools:text="Message"
+        tools:visibility="visible" />
+
+
     <com.google.android.material.button.MaterialButton
         android:id="@+id/btnInvite"
         style="@style/AccentButtonStyle"
@@ -27,7 +42,7 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toStartOf="@id/btnDecline"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/vUserLayout" />
+        app:layout_constraintTop_toBottomOf="@id/tvReason" />
 
     <com.google.android.material.button.MaterialButton
         android:id="@+id/btnDecline"
-- 
GitLab