diff --git a/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/repository/FeedsRepository.kt b/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/repository/FeedsRepository.kt index 00f62a4bb..2c6d8d2a9 100644 --- a/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/repository/FeedsRepository.kt +++ b/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/repository/FeedsRepository.kt @@ -29,7 +29,6 @@ import io.getstream.feeds.android.client.api.model.PaginationData import io.getstream.feeds.android.client.api.state.query.FeedQuery import io.getstream.feeds.android.client.api.state.query.FeedsQuery import io.getstream.feeds.android.client.internal.model.PaginationResult -import io.getstream.feeds.android.client.internal.state.query.ActivitiesQueryConfig import io.getstream.feeds.android.network.models.AcceptFollowRequest import io.getstream.feeds.android.network.models.FollowRequest import io.getstream.feeds.android.network.models.NotificationStatusResponse @@ -115,20 +114,18 @@ internal interface FeedsRepository { * Data class representing the information returned when getting or creating a feed. * * @property activities A paginated result of activities associated with the feed. - * @property activitiesQueryConfig The configuration used to query activities. + * @property aggregatedActivities A list of aggregated activities in the feed. * @property feed The feed data associated with the feed. * @property followers A list of followers for the feed. * @property following A list of feeds that this feed is following. * @property followRequests A list of follow requests for the feed. * @property members A paginated result of members in the feed. * @property pinnedActivities A list of activities that are pinned in the feed. - * @property aggregatedActivities A list of aggregated activities in the feed. * @property notificationStatus The notification status for the feed, if available. */ internal data class GetOrCreateInfo( val pagination: PaginationData, val activities: List, - val activitiesQueryConfig: ActivitiesQueryConfig, val aggregatedActivities: List, val feed: FeedData, val followers: List, diff --git a/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/repository/FeedsRepositoryImpl.kt b/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/repository/FeedsRepositoryImpl.kt index d4d9e8976..25d1bf1ca 100644 --- a/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/repository/FeedsRepositoryImpl.kt +++ b/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/repository/FeedsRepositoryImpl.kt @@ -16,7 +16,6 @@ package io.getstream.feeds.android.client.internal.repository -import io.getstream.android.core.api.sort.sortedWith import io.getstream.android.core.result.runSafely import io.getstream.feeds.android.client.api.model.FeedData import io.getstream.feeds.android.client.api.model.FeedId @@ -25,11 +24,9 @@ import io.getstream.feeds.android.client.api.model.FeedSuggestionData import io.getstream.feeds.android.client.api.model.FollowData import io.getstream.feeds.android.client.api.model.ModelUpdates import io.getstream.feeds.android.client.api.model.PaginationData -import io.getstream.feeds.android.client.api.state.query.ActivitiesSort import io.getstream.feeds.android.client.api.state.query.FeedQuery import io.getstream.feeds.android.client.api.state.query.FeedsQuery import io.getstream.feeds.android.client.internal.model.PaginationResult -import io.getstream.feeds.android.client.internal.model.QueryConfiguration import io.getstream.feeds.android.client.internal.model.isFollowRequest import io.getstream.feeds.android.client.internal.model.isFollowerOf import io.getstream.feeds.android.client.internal.model.isFollowing @@ -65,10 +62,7 @@ internal class FeedsRepositoryImpl(private val api: FeedsApi) : FeedsRepository val rawFollowers = response.followers.map { it.toModel() } GetOrCreateInfo( pagination = PaginationData(next = response.next, previous = response.prev), - activities = - response.activities.map { it.toModel() }.sortedWith(ActivitiesSort.Default), - activitiesQueryConfig = - QueryConfiguration(filter = query.activityFilter, sort = ActivitiesSort.Default), + activities = response.activities.map { it.toModel() }, aggregatedActivities = response.aggregatedActivities.map { it.toModel() }, feed = response.feed.toModel(), followers = rawFollowers.filter { it.isFollowerOf(fid) }, diff --git a/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/state/FeedImpl.kt b/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/state/FeedImpl.kt index a956c96b5..f0462a6e9 100644 --- a/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/state/FeedImpl.kt +++ b/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/state/FeedImpl.kt @@ -220,7 +220,7 @@ internal class FeedImpl( val query = FeedQuery( fid = fid, - activityFilter = _state.activitiesQueryConfig?.filter, + activityFilter = query.activityFilter, activityLimit = limit ?: query.activityLimit, activityNext = next, activitySelectorOptions = null, @@ -240,7 +240,6 @@ internal class FeedImpl( activities = it.activities, aggregatedActivities = it.aggregatedActivities, pagination = it.pagination, - queryConfig = it.activitiesQueryConfig, ) } .map(GetOrCreateInfo::activities) diff --git a/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/state/FeedStateImpl.kt b/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/state/FeedStateImpl.kt index f216ebf45..b63eb2541 100644 --- a/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/state/FeedStateImpl.kt +++ b/stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/state/FeedStateImpl.kt @@ -16,7 +16,6 @@ package io.getstream.feeds.android.client.internal.state -import io.getstream.android.core.api.sort.Sort import io.getstream.feeds.android.client.api.model.ActivityData import io.getstream.feeds.android.client.api.model.ActivityPinData import io.getstream.feeds.android.client.api.model.AggregatedActivityData @@ -31,7 +30,6 @@ import io.getstream.feeds.android.client.api.model.PaginationData import io.getstream.feeds.android.client.api.model.PollData import io.getstream.feeds.android.client.api.model.PollVoteData import io.getstream.feeds.android.client.api.state.FeedState -import io.getstream.feeds.android.client.api.state.query.ActivitiesSort import io.getstream.feeds.android.client.api.state.query.FeedQuery import io.getstream.feeds.android.client.internal.model.QueryConfiguration import io.getstream.feeds.android.client.internal.model.deleteBookmark @@ -49,12 +47,9 @@ import io.getstream.feeds.android.client.internal.model.upsertCommentReaction import io.getstream.feeds.android.client.internal.model.upsertReaction import io.getstream.feeds.android.client.internal.model.upsertVote import io.getstream.feeds.android.client.internal.repository.GetOrCreateInfo -import io.getstream.feeds.android.client.internal.state.query.ActivitiesQueryConfig -import io.getstream.feeds.android.client.internal.utils.mergeSorted import io.getstream.feeds.android.client.internal.utils.updateIf import io.getstream.feeds.android.client.internal.utils.upsert import io.getstream.feeds.android.client.internal.utils.upsertAll -import io.getstream.feeds.android.client.internal.utils.upsertSorted import io.getstream.feeds.android.network.models.NotificationStatusResponse import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -91,12 +86,6 @@ internal class FeedStateImpl( private var _activitiesPagination: PaginationData? = null - internal var activitiesQueryConfig: ActivitiesQueryConfig? = null - private set - - private val activitiesSorting: List> - get() = activitiesQueryConfig?.sort ?: ActivitiesSort.Default - override val fid: FeedId get() = feedQuery.fid @@ -134,7 +123,6 @@ internal class FeedStateImpl( _activities.update { result.activities } _aggregatedActivities.update { result.aggregatedActivities } _activitiesPagination = result.pagination - activitiesQueryConfig = result.activitiesQueryConfig _feed.update { result.feed } _followers.update { result.followers } _following.update { result.following } @@ -150,14 +138,9 @@ internal class FeedStateImpl( activities: List, aggregatedActivities: List, pagination: PaginationData, - queryConfig: ActivitiesQueryConfig, ) { _activitiesPagination = pagination - activitiesQueryConfig = queryConfig - // Merge the new activities with the existing ones (keeping the sort order) - _activities.update { current -> - current.mergeSorted(activities, ActivityData::id, activitiesSorting) - } + _activities.update { current -> current.upsertAll(activities, ActivityData::id) } _aggregatedActivities.update { current -> current.upsertAll(aggregatedActivities, AggregatedActivityData::group) } @@ -169,9 +152,7 @@ internal class FeedStateImpl( existingActivity.update(activity) } } else { - _activities.update { current -> - current.upsertSorted(activity, ActivityData::id, activitiesSorting) - } + _activities.update { current -> current.upsert(activity, ActivityData::id) } } } @@ -417,7 +398,6 @@ internal interface FeedStateUpdates { activities: List, aggregatedActivities: List, pagination: PaginationData, - queryConfig: ActivitiesQueryConfig, ) /** Handles updates to the feed state when activity is added or updated. */ diff --git a/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/repository/FeedsRepositoryImplTest.kt b/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/repository/FeedsRepositoryImplTest.kt index 37da8e63a..4abcdc454 100644 --- a/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/repository/FeedsRepositoryImplTest.kt +++ b/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/repository/FeedsRepositoryImplTest.kt @@ -20,16 +20,15 @@ import io.getstream.feeds.android.client.api.model.FeedId import io.getstream.feeds.android.client.api.model.FeedMemberData import io.getstream.feeds.android.client.api.model.ModelUpdates import io.getstream.feeds.android.client.api.model.PaginationData -import io.getstream.feeds.android.client.api.state.query.ActivitiesSort import io.getstream.feeds.android.client.api.state.query.FeedQuery import io.getstream.feeds.android.client.api.state.query.FeedsQuery import io.getstream.feeds.android.client.internal.model.PaginationResult -import io.getstream.feeds.android.client.internal.model.QueryConfiguration import io.getstream.feeds.android.client.internal.model.toModel import io.getstream.feeds.android.client.internal.repository.RepositoryTestUtils.testDelegation import io.getstream.feeds.android.client.internal.state.query.toRequest import io.getstream.feeds.android.client.internal.test.TestData.acceptFeedMemberResponse import io.getstream.feeds.android.client.internal.test.TestData.acceptFollowResponse +import io.getstream.feeds.android.client.internal.test.TestData.activityResponse import io.getstream.feeds.android.client.internal.test.TestData.feedMemberResponse import io.getstream.feeds.android.client.internal.test.TestData.feedResponse import io.getstream.feeds.android.client.internal.test.TestData.followResponse @@ -45,6 +44,7 @@ import io.getstream.feeds.android.client.internal.test.TestData.updateFeedMember import io.getstream.feeds.android.client.internal.test.TestData.updateFeedResponse import io.getstream.feeds.android.network.apis.FeedsApi import io.getstream.feeds.android.network.models.AcceptFollowRequest +import io.getstream.feeds.android.network.models.ActivityResponse import io.getstream.feeds.android.network.models.FeedSuggestionResponse import io.getstream.feeds.android.network.models.FollowRequest import io.getstream.feeds.android.network.models.QueryFeedMembersRequest @@ -65,7 +65,15 @@ internal class FeedsRepositoryImplTest { fun `on getOrCreateFeed, delegate to api`() = runTest { val query = FeedQuery(group = "user", id = "user-1") val request = query.toRequest() - val apiResult = getOrCreateFeedResponse() + val apiResult = + getOrCreateFeedResponse( + activities = + listOf( + activityResponse("activity-2", createdAt = 2000), + activityResponse("activity-1", createdAt = 1000), + activityResponse("activity-3", createdAt = 3000), + ) + ) testDelegation( apiFunction = { @@ -76,12 +84,7 @@ internal class FeedsRepositoryImplTest { repositoryResult = GetOrCreateInfo( pagination = PaginationData(next = "next", previous = "prev"), - activities = emptyList(), - activitiesQueryConfig = - QueryConfiguration( - filter = query.activityFilter, - sort = ActivitiesSort.Default, - ), + activities = apiResult.activities.map(ActivityResponse::toModel), aggregatedActivities = emptyList(), feed = apiResult.feed.toModel(), followers = emptyList(), diff --git a/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/state/FeedImplTest.kt b/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/state/FeedImplTest.kt index c8a7d7df8..85821dee3 100644 --- a/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/state/FeedImplTest.kt +++ b/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/state/FeedImplTest.kt @@ -16,6 +16,7 @@ package io.getstream.feeds.android.client.internal.state +import io.getstream.android.core.api.filter.equal import io.getstream.feeds.android.client.api.file.FeedUploadPayload import io.getstream.feeds.android.client.api.model.ActivityData import io.getstream.feeds.android.client.api.model.FeedAddActivityRequest @@ -26,11 +27,10 @@ import io.getstream.feeds.android.client.api.model.FollowData import io.getstream.feeds.android.client.api.model.ModelUpdates import io.getstream.feeds.android.client.api.model.PaginationData import io.getstream.feeds.android.client.api.model.request.ActivityAddCommentRequest -import io.getstream.feeds.android.client.api.state.query.ActivitiesSort +import io.getstream.feeds.android.client.api.state.query.ActivitiesFilterField import io.getstream.feeds.android.client.api.state.query.FeedQuery import io.getstream.feeds.android.client.internal.client.reconnect.FeedWatchHandler import io.getstream.feeds.android.client.internal.model.PaginationResult -import io.getstream.feeds.android.client.internal.model.QueryConfiguration import io.getstream.feeds.android.client.internal.repository.ActivitiesRepository import io.getstream.feeds.android.client.internal.repository.BookmarksRepository import io.getstream.feeds.android.client.internal.repository.CommentsRepository @@ -86,7 +86,7 @@ internal class FeedImplTest { @Test fun `on getOrCreate with watch enabled, then call feedWatchHandler`() = runTest { - val feed = createFeed(watch = true) + val feed = createFeed(FeedQuery(fid, watch = true)) val testFeedData = feedData() val feedInfo = getOrCreateInfo(testFeedData) coEvery { feedsRepository.getOrCreateFeed(any()) } returns Result.success(feedInfo) @@ -100,7 +100,7 @@ internal class FeedImplTest { @Test fun `on getOrCreate with watch disabled, then do not call feedWatchHandler`() = runTest { - val feed = createFeed(watch = false) + val feed = createFeed(FeedQuery(fid, watch = false)) val testFeedData = feedData() val feedInfo = getOrCreateInfo(testFeedData) coEvery { feedsRepository.getOrCreateFeed(any()) } returns Result.success(feedInfo) @@ -392,10 +392,20 @@ internal class FeedImplTest { @Test fun `on queryMoreActivities, delegate to repository`() = runTest { - val feed = createFeed() + val initialQuery = + FeedQuery(fid = fid, activityFilter = ActivitiesFilterField.id.equal("id")) + val feed = createFeed(initialQuery) val limit = 10 val newActivity = activityData("activity-2") val initialActivities = listOf(activityData("activity-1")) + val expectedQuery = + initialQuery.copy( + activityLimit = limit, + activityNext = "cursor", + followerLimit = 0, + followingLimit = 0, + memberLimit = 0, + ) setupInitialState(feed, activities = initialActivities) @@ -407,6 +417,7 @@ internal class FeedImplTest { assertEquals(listOf(newActivity), result.getOrNull()) assertEquals(initialActivities + newActivity, feed.state.activities.value) + coVerify { feedsRepository.getOrCreateFeed(expectedQuery) } } @Test @@ -759,9 +770,9 @@ internal class FeedImplTest { verify { stateEventListener.onEvent(StateUpdateEvent.ActivityAdded("group:id", activity)) } } - private fun createFeed(watch: Boolean = false) = + private fun createFeed(query: FeedQuery = FeedQuery(fid)) = FeedImpl( - query = FeedQuery(fid, watch = watch), + query = query, currentUserId = "user", activitiesRepository = activitiesRepository, bookmarksRepository = bookmarksRepository, @@ -785,8 +796,6 @@ internal class FeedImplTest { return GetOrCreateInfo( pagination = paginationData, activities = activities, - activitiesQueryConfig = - QueryConfiguration(filter = null, sort = ActivitiesSort.Default), aggregatedActivities = emptyList(), feed = testFeedData, followers = followers, diff --git a/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/state/FeedStateImplTest.kt b/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/state/FeedStateImplTest.kt index 2cefa62e4..a5750641f 100644 --- a/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/state/FeedStateImplTest.kt +++ b/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/state/FeedStateImplTest.kt @@ -25,11 +25,9 @@ import io.getstream.feeds.android.client.api.model.FollowData import io.getstream.feeds.android.client.api.model.PaginationData import io.getstream.feeds.android.client.api.model.PollData import io.getstream.feeds.android.client.api.model.PollVoteData -import io.getstream.feeds.android.client.api.state.query.ActivitiesSort import io.getstream.feeds.android.client.api.state.query.FeedQuery import io.getstream.feeds.android.client.internal.model.PaginationResult import io.getstream.feeds.android.client.internal.repository.GetOrCreateInfo -import io.getstream.feeds.android.client.internal.state.query.ActivitiesQueryConfig import io.getstream.feeds.android.client.internal.test.TestData.activityData import io.getstream.feeds.android.client.internal.test.TestData.activityPin import io.getstream.feeds.android.client.internal.test.TestData.aggregatedActivityData @@ -120,7 +118,6 @@ internal class FeedStateImplTest { activities = newActivities, aggregatedActivities = newAggregated, pagination = newPagination, - queryConfig = createQueryConfig(), ) assertEquals(newPagination, feedState.activitiesPagination) @@ -695,12 +692,10 @@ internal class FeedStateImplTest { aggregatedActivities: List = emptyList(), ): GetOrCreateInfo { val pagination = PaginationData(next = "next-cursor", previous = null) - val queryConfig = createQueryConfig() return GetOrCreateInfo( pagination = pagination, activities = activities, - activitiesQueryConfig = queryConfig, aggregatedActivities = aggregatedActivities, feed = feed, followers = followers, @@ -716,9 +711,6 @@ internal class FeedStateImplTest { ) } - private fun createQueryConfig() = - ActivitiesQueryConfig(filter = null, sort = ActivitiesSort.Default) - private fun setupActivityWithPoll(poll: PollData): ActivityData { val activity = activityData("activity-1", poll = poll) setupInitialState(listOf(activity)) diff --git a/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/test/TestData.kt b/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/test/TestData.kt index 78f926ed2..2cb3f0836 100644 --- a/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/test/TestData.kt +++ b/stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/test/TestData.kt @@ -329,11 +329,11 @@ internal object TestData { updatedAt = Date(1000), ) - fun activityResponse(id: String = ""): ActivityResponse = + fun activityResponse(id: String = "", createdAt: Long = 1000): ActivityResponse = ActivityResponse( bookmarkCount = 0, commentCount = 0, - createdAt = Date(1000), + createdAt = Date(createdAt), id = id, popularity = 0, reactionCount = 0, @@ -685,11 +685,11 @@ internal object TestData { custom = emptyMap(), ) - fun getOrCreateFeedResponse() = + fun getOrCreateFeedResponse(activities: List = emptyList()) = GetOrCreateFeedResponse( created = false, duration = "duration", - activities = emptyList(), + activities = activities, aggregatedActivities = emptyList(), followers = emptyList(), following = emptyList(),