From 2e33c2fcc90ff067332147a9f9c90c93ac9ea87c Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Thu, 13 Jun 2024 17:40:37 +0300
Subject: [PATCH] Update notification for gallery

---
 .../feature/circles/CirclesDataSource.kt      |  4 +++-
 .../feature/groups/GroupsDataSource.kt        |  3 ++-
 .../circles/mapping/RoomSummaryMapping.kt     | 17 +-------------
 .../gallery/rooms/list/GalleryViewHolder.kt   |  9 +++++---
 .../core/mapping/RoomSummaryMapping.kt        | 23 ++++++++++++++++---
 .../circles/core/model/GalleryListItem.kt     |  6 +++--
 core/src/main/res/values/strings.xml          |  1 -
 .../gallery/feature/PhotosDataSource.kt       |  7 ++++--
 8 files changed, 41 insertions(+), 29 deletions(-)

diff --git a/app/src/main/java/org/futo/circles/feature/circles/CirclesDataSource.kt b/app/src/main/java/org/futo/circles/feature/circles/CirclesDataSource.kt
index fb3885672..eff69942f 100644
--- a/app/src/main/java/org/futo/circles/feature/circles/CirclesDataSource.kt
+++ b/app/src/main/java/org/futo/circles/feature/circles/CirclesDataSource.kt
@@ -47,7 +47,9 @@ class CirclesDataSource @Inject constructor(
         joinedCirclesWithTimelines.forEach { knocksCount += it.knockRequestsCount }
 
         val displayList = mutableListOf<CircleListItem>().apply {
-            if (invitesCount > 0) add(CircleInvitesNotificationListItem(invitesCount, knocksCount))
+            if (invitesCount > 0 || knocksCount > 0) {
+                add(CircleInvitesNotificationListItem(invitesCount, knocksCount))
+            }
             addAll(joinedCirclesWithTimelines)
         }
         return displayList
diff --git a/app/src/main/java/org/futo/circles/feature/groups/GroupsDataSource.kt b/app/src/main/java/org/futo/circles/feature/groups/GroupsDataSource.kt
index 8012e5df6..aa6b2d0c3 100644
--- a/app/src/main/java/org/futo/circles/feature/groups/GroupsDataSource.kt
+++ b/app/src/main/java/org/futo/circles/feature/groups/GroupsDataSource.kt
@@ -34,8 +34,9 @@ class GroupsDataSource @Inject constructor() {
         joinedGroups.forEach { knocksCount += it.knockRequestsCount }
 
         return mutableListOf<GroupListItem>().apply {
-            if (invitesCount > 0 || knocksCount > 0)
+            if (invitesCount > 0 || knocksCount > 0) {
                 add(GroupInvitesNotificationListItem(invitesCount, knocksCount))
+            }
 
             addAll(joinedGroups)
         }
diff --git a/app/src/main/java/org/futo/circles/mapping/RoomSummaryMapping.kt b/app/src/main/java/org/futo/circles/mapping/RoomSummaryMapping.kt
index cf6d75c71..6d4f1b133 100644
--- a/app/src/main/java/org/futo/circles/mapping/RoomSummaryMapping.kt
+++ b/app/src/main/java/org/futo/circles/mapping/RoomSummaryMapping.kt
@@ -1,9 +1,8 @@
 package org.futo.circles.mapping
 
 import org.futo.circles.core.extensions.getCircleAvatarUrl
-import org.futo.circles.core.extensions.getPowerLevelContent
 import org.futo.circles.core.extensions.getRoomOwner
-import org.futo.circles.core.extensions.isCurrentUserAbleToInvite
+import org.futo.circles.core.mapping.getKnocksCount
 import org.futo.circles.core.mapping.nameOrId
 import org.futo.circles.core.model.RoomInfo
 import org.futo.circles.core.provider.MatrixSessionProvider
@@ -11,10 +10,7 @@ import org.futo.circles.core.utils.getJoinedRoomById
 import org.futo.circles.core.utils.getTimelineRoomFor
 import org.futo.circles.model.JoinedCircleListItem
 import org.futo.circles.model.JoinedGroupListItem
-import org.matrix.android.sdk.api.session.getRoom
 import org.matrix.android.sdk.api.session.getRoomSummary
-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.RoomSummary
 
 
@@ -64,14 +60,3 @@ private fun RoomSummary.getCircleUnreadMessagesCount(): Int {
     return unreadInCircle
 }
 
-fun getKnocksCount(roomId: String): Int {
-    if (getPowerLevelContent(roomId)?.isCurrentUserAbleToInvite() == false) return 0
-    return MatrixSessionProvider.currentSession?.getRoom(roomId)?.membershipService()
-        ?.getRoomMembers(
-            roomMemberQueryParams {
-                excludeSelf = true
-                memberships = listOf(Membership.KNOCK)
-            }
-        )?.size ?: 0
-}
-
diff --git a/core/src/main/java/org/futo/circles/core/feature/picker/gallery/rooms/list/GalleryViewHolder.kt b/core/src/main/java/org/futo/circles/core/feature/picker/gallery/rooms/list/GalleryViewHolder.kt
index b5de996eb..662f47ca9 100644
--- a/core/src/main/java/org/futo/circles/core/feature/picker/gallery/rooms/list/GalleryViewHolder.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/picker/gallery/rooms/list/GalleryViewHolder.kt
@@ -3,7 +3,6 @@ package org.futo.circles.core.feature.picker.gallery.rooms.list
 import android.view.View
 import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
-import org.futo.circles.core.R
 import org.futo.circles.core.base.list.ViewBindingHolder
 import org.futo.circles.core.base.list.context
 import org.futo.circles.core.databinding.ListItemInviteHeaderBinding
@@ -19,6 +18,7 @@ import org.futo.circles.core.model.GalleryHeaderItem
 import org.futo.circles.core.model.GalleryInvitesNotificationListItem
 import org.futo.circles.core.model.GalleryListItem
 import org.futo.circles.core.model.JoinedGalleryListItem
+import org.futo.circles.core.utils.TextFormatUtils
 
 
 abstract class GalleryViewHolder(view: View) : RecyclerView.ViewHolder(view) {
@@ -73,8 +73,11 @@ class GalleryInviteNotificationViewHolder(
 
     override fun bind(data: GalleryListItem) {
         if (data !is GalleryInvitesNotificationListItem) return
-        binding.tvInvitesMessage.text =
-            context.getString(R.string.gallery_invites_notification_format, data.invitesCount)
+        binding.tvInvitesMessage.text = TextFormatUtils.getFormattedInvitesKnocksMessage(
+            context,
+            data.invitesCount,
+            data.knocksCount
+        )
     }
 }
 
diff --git a/core/src/main/java/org/futo/circles/core/mapping/RoomSummaryMapping.kt b/core/src/main/java/org/futo/circles/core/mapping/RoomSummaryMapping.kt
index 166497ae6..5394b1218 100644
--- a/core/src/main/java/org/futo/circles/core/mapping/RoomSummaryMapping.kt
+++ b/core/src/main/java/org/futo/circles/core/mapping/RoomSummaryMapping.kt
@@ -1,14 +1,19 @@
 package org.futo.circles.core.mapping
 
 import org.futo.circles.core.extensions.getCircleAvatarUrl
+import org.futo.circles.core.extensions.getPowerLevelContent
 import org.futo.circles.core.extensions.getRoomOwner
+import org.futo.circles.core.extensions.isCurrentUserAbleToInvite
 import org.futo.circles.core.extensions.notEmptyDisplayName
-import org.futo.circles.core.model.CircleRoomTypeArg
 import org.futo.circles.core.model.JoinedGalleryListItem
 import org.futo.circles.core.model.RoomInfo
 import org.futo.circles.core.model.SelectRoomTypeArg
 import org.futo.circles.core.model.SelectableRoomListItem
 import org.futo.circles.core.model.isCircle
+import org.futo.circles.core.provider.MatrixSessionProvider
+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.RoomMemberSummary
 import org.matrix.android.sdk.api.session.room.model.RoomSummary
 import org.matrix.android.sdk.api.session.user.model.User
@@ -31,7 +36,19 @@ fun RoomSummary.toSelectableRoomListItem(
 fun RoomSummary.toJoinedGalleryListItem() = JoinedGalleryListItem(
     id = roomId,
     info = RoomInfo(nameOrId(), avatarUrl),
-    roomOwner = getRoomOwner(roomId)?.toUser()
+    roomOwner = getRoomOwner(roomId)?.toUser(),
+    knockRequestsCount = getKnocksCount(roomId)
 )
 
-fun RoomMemberSummary.toUser() = User(userId, notEmptyDisplayName(), avatarUrl)
\ No newline at end of file
+fun RoomMemberSummary.toUser() = User(userId, notEmptyDisplayName(), avatarUrl)
+
+fun getKnocksCount(roomId: String): Int {
+    if (getPowerLevelContent(roomId)?.isCurrentUserAbleToInvite() == false) return 0
+    return MatrixSessionProvider.currentSession?.getRoom(roomId)?.membershipService()
+        ?.getRoomMembers(
+            roomMemberQueryParams {
+                excludeSelf = true
+                memberships = listOf(Membership.KNOCK)
+            }
+        )?.size ?: 0
+}
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/model/GalleryListItem.kt b/core/src/main/java/org/futo/circles/core/model/GalleryListItem.kt
index 51cdea23f..36029b0a7 100644
--- a/core/src/main/java/org/futo/circles/core/model/GalleryListItem.kt
+++ b/core/src/main/java/org/futo/circles/core/model/GalleryListItem.kt
@@ -21,14 +21,16 @@ data class GalleryHeaderItem(
 data class JoinedGalleryListItem(
     override val id: String,
     val info: RoomInfo,
-    val roomOwner: User?
+    val roomOwner: User?,
+    val knockRequestsCount: Int
 ) : GalleryListItem() {
     fun isMyGallery(): Boolean =
         roomOwner?.let { it.userId == MatrixSessionProvider.currentSession?.myUserId } ?: true
 }
 
 data class GalleryInvitesNotificationListItem(
-    val invitesCount: Int
+    val invitesCount: Int,
+    val knocksCount: Int
 ) : GalleryListItem() {
     override val id: String = "GroupInvitesNotificationListItem"
 }
\ No newline at end of file
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index ac7d1c9f2..1959dbb46 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -131,7 +131,6 @@
     <string name="knock_requests_empty_message">You don\'t have any knock request</string>
     <string name="create">Create</string>
     <string name="show">Show</string>
-    <string name="gallery_invites_notification_format">Show %d Gallery invitations</string>
     <string name="group_invitations">Group invitations</string>
     <string name="gallery_invitations">Gallery invitations</string>
     <string name="circle_invitations">Circle invitations</string>
diff --git a/gallery/src/main/java/org/futo/circles/gallery/feature/PhotosDataSource.kt b/gallery/src/main/java/org/futo/circles/gallery/feature/PhotosDataSource.kt
index 045ea3cf5..11cb075d3 100644
--- a/gallery/src/main/java/org/futo/circles/gallery/feature/PhotosDataSource.kt
+++ b/gallery/src/main/java/org/futo/circles/gallery/feature/PhotosDataSource.kt
@@ -32,10 +32,13 @@ class PhotosDataSource @Inject constructor() {
         }
         val sharedGalleries = joined.filter { !it.isMyGallery() }
         val invitesCount = galleries.filter { it.membership == Membership.INVITE }.size
+        var knocksCount = 0
+        joined.forEach { knocksCount += it.knockRequestsCount }
 
         val displayList = mutableListOf<GalleryListItem>().apply {
-            if (invitesCount > 0)
-                add(GalleryInvitesNotificationListItem(invitesCount))
+            if (invitesCount > 0 || knocksCount > 0) {
+                add(GalleryInvitesNotificationListItem(invitesCount, knocksCount))
+            }
 
             addSection(
                 GalleryHeaderItem.myGalleriesHeader,
-- 
GitLab