Skip to content

Commit 99d02f7

Browse files
committed
Add flowOn DefaultDispatcher.
Change-Id: I04d005004d4fd6b813e625a1865edf5b65f2a5c8
1 parent d438a00 commit 99d02f7

File tree

4 files changed

+50
-22
lines changed

4 files changed

+50
-22
lines changed

core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/CompositeUserNewsResourceRepository.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@ package com.google.samples.apps.nowinandroid.core.data.repository
1818

1919
import com.google.samples.apps.nowinandroid.core.model.data.UserNewsResource
2020
import com.google.samples.apps.nowinandroid.core.model.data.mapToUserNewsResources
21+
import com.google.samples.apps.nowinandroid.core.network.Dispatcher
22+
import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.Default
23+
import kotlinx.coroutines.CoroutineDispatcher
2124
import kotlinx.coroutines.flow.Flow
2225
import kotlinx.coroutines.flow.combine
2326
import kotlinx.coroutines.flow.distinctUntilChanged
2427
import kotlinx.coroutines.flow.flatMapLatest
2528
import kotlinx.coroutines.flow.flowOf
29+
import kotlinx.coroutines.flow.flowOn
2630
import kotlinx.coroutines.flow.map
2731
import javax.inject.Inject
2832

@@ -33,8 +37,8 @@ import javax.inject.Inject
3337
class CompositeUserNewsResourceRepository @Inject constructor(
3438
val newsRepository: NewsRepository,
3539
val userDataRepository: UserDataRepository,
40+
@Dispatcher(Default) private val defaultDispatcher: CoroutineDispatcher,
3641
) : UserNewsResourceRepository {
37-
3842
/**
3943
* Returns available news resources (joined with user data) matching the given query.
4044
*/
@@ -44,7 +48,7 @@ class CompositeUserNewsResourceRepository @Inject constructor(
4448
newsRepository.getNewsResources(query)
4549
.combine(userDataRepository.userData) { newsResources, userData ->
4650
newsResources.mapToUserNewsResources(userData)
47-
}
51+
}.flowOn(defaultDispatcher)
4852

4953
/**
5054
* Returns available news resources (joined with user data) for the followed topics.

core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.google.samples.apps.nowinandroid.core.data.repository
1818

19+
import androidx.tracing.trace
1920
import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceDao
2021
import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceFtsDao
2122
import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao
@@ -25,13 +26,15 @@ import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel
2526
import com.google.samples.apps.nowinandroid.core.database.model.asFtsEntity
2627
import com.google.samples.apps.nowinandroid.core.model.data.SearchResult
2728
import com.google.samples.apps.nowinandroid.core.network.Dispatcher
29+
import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.Default
2830
import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO
2931
import kotlinx.coroutines.CoroutineDispatcher
3032
import kotlinx.coroutines.flow.Flow
3133
import kotlinx.coroutines.flow.combine
3234
import kotlinx.coroutines.flow.distinctUntilChanged
3335
import kotlinx.coroutines.flow.first
3436
import kotlinx.coroutines.flow.flatMapLatest
37+
import kotlinx.coroutines.flow.flowOn
3538
import kotlinx.coroutines.flow.mapLatest
3639
import kotlinx.coroutines.withContext
3740
import javax.inject.Inject
@@ -42,6 +45,7 @@ internal class DefaultSearchContentsRepository @Inject constructor(
4245
private val topicDao: TopicDao,
4346
private val topicFtsDao: TopicFtsDao,
4447
@Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher,
48+
@Dispatcher(Default) private val defaultDispatcher: CoroutineDispatcher,
4549
) : SearchContentsRepository {
4650

4751
override suspend fun populateFtsData() {
@@ -75,18 +79,22 @@ internal class DefaultSearchContentsRepository @Inject constructor(
7579
.distinctUntilChanged()
7680
.flatMapLatest(topicDao::getTopicEntities)
7781
return combine(newsResourcesFlow, topicsFlow) { newsResources, topics ->
78-
SearchResult(
79-
topics = topics.map { it.asExternalModel() },
80-
newsResources = newsResources.map { it.asExternalModel() },
81-
)
82-
}
82+
trace("DefaultSearchContentsRepository.searchContents") {
83+
SearchResult(
84+
topics = topics.map { it.asExternalModel() },
85+
newsResources = newsResources.map { it.asExternalModel() },
86+
)
87+
}
88+
}.flowOn(defaultDispatcher)
8389
}
8490

8591
override fun getSearchContentsCount(): Flow<Int> =
8692
combine(
8793
newsResourceFtsDao.getCount(),
8894
topicFtsDao.getCount(),
8995
) { newsResourceCount, topicsCount ->
90-
newsResourceCount + topicsCount
91-
}
96+
trace("DefaultSearchContentsRepository.getSearchContentsCount") {
97+
newsResourceCount + topicsCount
98+
}
99+
}.flowOn(defaultDispatcher)
92100
}

core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,18 @@
1616

1717
package com.google.samples.apps.nowinandroid.core.domain
1818

19+
import androidx.tracing.trace
1920
import com.google.samples.apps.nowinandroid.core.data.repository.TopicsRepository
2021
import com.google.samples.apps.nowinandroid.core.data.repository.UserDataRepository
2122
import com.google.samples.apps.nowinandroid.core.domain.TopicSortField.NAME
2223
import com.google.samples.apps.nowinandroid.core.domain.TopicSortField.NONE
2324
import com.google.samples.apps.nowinandroid.core.model.data.FollowableTopic
25+
import com.google.samples.apps.nowinandroid.core.network.Dispatcher
26+
import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.Default
27+
import kotlinx.coroutines.CoroutineDispatcher
2428
import kotlinx.coroutines.flow.Flow
2529
import kotlinx.coroutines.flow.combine
30+
import kotlinx.coroutines.flow.flowOn
2631
import javax.inject.Inject
2732

2833
/**
@@ -31,6 +36,7 @@ import javax.inject.Inject
3136
class GetFollowableTopicsUseCase @Inject constructor(
3237
private val topicsRepository: TopicsRepository,
3338
private val userDataRepository: UserDataRepository,
39+
@Dispatcher(Default) private val defaultDispatcher: CoroutineDispatcher,
3440
) {
3541
/**
3642
* Returns a list of topics with their associated followed state.
@@ -41,18 +47,20 @@ class GetFollowableTopicsUseCase @Inject constructor(
4147
userDataRepository.userData,
4248
topicsRepository.getTopics(),
4349
) { userData, topics ->
44-
val followedTopics = topics
45-
.map { topic ->
46-
FollowableTopic(
47-
topic = topic,
48-
isFollowed = topic.id in userData.followedTopics,
49-
)
50+
trace("GetFollowableTopicsUseCase.invoke") {
51+
val followedTopics = topics
52+
.map { topic ->
53+
FollowableTopic(
54+
topic = topic,
55+
isFollowed = topic.id in userData.followedTopics,
56+
)
57+
}
58+
when (sortBy) {
59+
NAME -> followedTopics.sortedBy { it.topic.name }
60+
else -> followedTopics
5061
}
51-
when (sortBy) {
52-
NAME -> followedTopics.sortedBy { it.topic.name }
53-
else -> followedTopics
5462
}
55-
}
63+
}.flowOn(defaultDispatcher)
5664
}
5765

5866
enum class TopicSortField {

core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsUseCase.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,12 @@ import com.google.samples.apps.nowinandroid.core.model.data.SearchResult
2323
import com.google.samples.apps.nowinandroid.core.model.data.UserData
2424
import com.google.samples.apps.nowinandroid.core.model.data.UserNewsResource
2525
import com.google.samples.apps.nowinandroid.core.model.data.UserSearchResult
26+
import com.google.samples.apps.nowinandroid.core.network.Dispatcher
27+
import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.Default
28+
import kotlinx.coroutines.CoroutineDispatcher
2629
import kotlinx.coroutines.flow.Flow
2730
import kotlinx.coroutines.flow.combine
31+
import kotlinx.coroutines.flow.flowOn
2832
import javax.inject.Inject
2933

3034
/**
@@ -33,16 +37,20 @@ import javax.inject.Inject
3337
class GetSearchContentsUseCase @Inject constructor(
3438
private val searchContentsRepository: SearchContentsRepository,
3539
private val userDataRepository: UserDataRepository,
40+
@Dispatcher(Default) private val defaultDispatcher: CoroutineDispatcher,
3641
) {
3742

3843
operator fun invoke(
3944
searchQuery: String,
4045
): Flow<UserSearchResult> =
4146
searchContentsRepository.searchContents(searchQuery)
42-
.mapToUserSearchResult(userDataRepository.userData)
47+
.mapToUserSearchResult(userDataRepository.userData, defaultDispatcher)
4348
}
4449

45-
private fun Flow<SearchResult>.mapToUserSearchResult(userDataStream: Flow<UserData>): Flow<UserSearchResult> =
50+
private fun Flow<SearchResult>.mapToUserSearchResult(
51+
userDataStream: Flow<UserData>,
52+
defaultDispatcher: CoroutineDispatcher,
53+
): Flow<UserSearchResult> =
4654
combine(userDataStream) { searchResult, userData ->
4755
UserSearchResult(
4856
topics = searchResult.topics.map { topic ->
@@ -58,4 +66,4 @@ private fun Flow<SearchResult>.mapToUserSearchResult(userDataStream: Flow<UserDa
5866
)
5967
},
6068
)
61-
}
69+
}.flowOn(defaultDispatcher)

0 commit comments

Comments
 (0)