Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<ActivityData>,
val activitiesQueryConfig: ActivitiesQueryConfig,
val aggregatedActivities: List<AggregatedActivityData>,
val feed: FeedData,
val followers: List<FollowData>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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) },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ internal class FeedImpl(
val query =
FeedQuery(
fid = fid,
activityFilter = _state.activitiesQueryConfig?.filter,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we not supposed to pass the original filter argument from the original query when loading the next page of activities?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤦‍♂️ fixing it and adding a test

activityFilter = query.activityFilter,
activityLimit = limit ?: query.activityLimit,
activityNext = next,
activitySelectorOptions = null,
Expand All @@ -240,7 +240,6 @@ internal class FeedImpl(
activities = it.activities,
aggregatedActivities = it.aggregatedActivities,
pagination = it.pagination,
queryConfig = it.activitiesQueryConfig,
)
}
.map(GetOrCreateInfo::activities)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -91,12 +86,6 @@ internal class FeedStateImpl(

private var _activitiesPagination: PaginationData? = null

internal var activitiesQueryConfig: ActivitiesQueryConfig? = null
private set

private val activitiesSorting: List<Sort<ActivityData>>
get() = activitiesQueryConfig?.sort ?: ActivitiesSort.Default

override val fid: FeedId
get() = feedQuery.fid

Expand Down Expand Up @@ -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 }
Expand All @@ -150,14 +138,9 @@ internal class FeedStateImpl(
activities: List<ActivityData>,
aggregatedActivities: List<AggregatedActivityData>,
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)
}
Expand All @@ -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) }
}
}

Expand Down Expand Up @@ -417,7 +398,6 @@ internal interface FeedStateUpdates {
activities: List<ActivityData>,
aggregatedActivities: List<AggregatedActivityData>,
pagination: PaginationData,
queryConfig: ActivitiesQueryConfig,
)

/** Handles updates to the feed state when activity is added or updated. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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 = {
Expand All @@ -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(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)

Expand All @@ -407,6 +417,7 @@ internal class FeedImplTest {

assertEquals(listOf(newActivity), result.getOrNull())
assertEquals(initialActivities + newActivity, feed.state.activities.value)
coVerify { feedsRepository.getOrCreateFeed(expectedQuery) }
}

@Test
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -120,7 +118,6 @@ internal class FeedStateImplTest {
activities = newActivities,
aggregatedActivities = newAggregated,
pagination = newPagination,
queryConfig = createQueryConfig(),
)

assertEquals(newPagination, feedState.activitiesPagination)
Expand Down Expand Up @@ -695,12 +692,10 @@ internal class FeedStateImplTest {
aggregatedActivities: List<AggregatedActivityData> = 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,
Expand All @@ -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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -685,11 +685,11 @@ internal object TestData {
custom = emptyMap(),
)

fun getOrCreateFeedResponse() =
fun getOrCreateFeedResponse(activities: List<ActivityResponse> = emptyList()) =
GetOrCreateFeedResponse(
created = false,
duration = "duration",
activities = emptyList(),
activities = activities,
aggregatedActivities = emptyList(),
followers = emptyList(),
following = emptyList(),
Expand Down