Skip to content

Commit 17da41e

Browse files
authored
Remove withContext, refactor duplicate methods (#907)
1 parent a3d0c07 commit 17da41e

File tree

15 files changed

+57
-144
lines changed

15 files changed

+57
-144
lines changed

app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/Task.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ import java.util.UUID
3232
*/
3333
@Entity(tableName = "tasks")
3434
data class Task @JvmOverloads constructor(
35-
@ColumnInfo(name = "title") var title: String = "",
36-
@ColumnInfo(name = "description") var description: String = "",
37-
@ColumnInfo(name = "completed") var isCompleted: Boolean = false,
38-
@PrimaryKey @ColumnInfo(name = "entryid") var id: String = UUID.randomUUID().toString()
35+
@ColumnInfo(name = "title") val title: String = "",
36+
@ColumnInfo(name = "description") val description: String = "",
37+
@ColumnInfo(name = "completed") val isCompleted: Boolean = false,
38+
@PrimaryKey @ColumnInfo(name = "entryid") val id: String = UUID.randomUUID().toString()
3939
) {
4040

4141
val titleForList: String

app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/DefaultTasksRepository.kt

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,16 @@
1717
package com.example.android.architecture.blueprints.todoapp.data.source
1818

1919
import com.example.android.architecture.blueprints.todoapp.data.Task
20-
import kotlinx.coroutines.CoroutineDispatcher
21-
import kotlinx.coroutines.Dispatchers
2220
import kotlinx.coroutines.coroutineScope
2321
import kotlinx.coroutines.flow.Flow
2422
import kotlinx.coroutines.launch
25-
import kotlinx.coroutines.withContext
2623

2724
/**
2825
* Default implementation of [TasksRepository]. Single entry point for managing tasks' data.
2926
*/
3027
class DefaultTasksRepository(
3128
private val tasksRemoteDataSource: TasksDataSource,
3229
private val tasksLocalDataSource: TasksDataSource,
33-
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
3430
) : TasksRepository {
3531

3632
override suspend fun getTasks(forceUpdate: Boolean): List<Task> {
@@ -97,29 +93,17 @@ class DefaultTasksRepository(
9793
}
9894
}
9995

100-
override suspend fun completeTask(task: Task) {
101-
coroutineScope {
102-
launch { tasksRemoteDataSource.completeTask(task) }
103-
launch { tasksLocalDataSource.completeTask(task) }
104-
}
105-
}
106-
10796
override suspend fun completeTask(taskId: String) {
108-
withContext(ioDispatcher) {
109-
getTaskWithId(taskId)?.let { completeTask(it) }
110-
}
111-
}
112-
113-
override suspend fun activateTask(task: Task) = withContext<Unit>(ioDispatcher) {
11497
coroutineScope {
115-
launch { tasksRemoteDataSource.activateTask(task) }
116-
launch { tasksLocalDataSource.activateTask(task) }
98+
launch { tasksRemoteDataSource.completeTask(taskId) }
99+
launch { tasksLocalDataSource.completeTask(taskId) }
117100
}
118101
}
119102

120103
override suspend fun activateTask(taskId: String) {
121-
withContext(ioDispatcher) {
122-
getTaskWithId(taskId)?.let { activateTask(it) }
104+
coroutineScope {
105+
launch { tasksRemoteDataSource.activateTask(taskId) }
106+
launch { tasksLocalDataSource.activateTask(taskId) }
123107
}
124108
}
125109

@@ -131,11 +115,9 @@ class DefaultTasksRepository(
131115
}
132116

133117
override suspend fun deleteAllTasks() {
134-
withContext(ioDispatcher) {
135-
coroutineScope {
136-
launch { tasksRemoteDataSource.deleteAllTasks() }
137-
launch { tasksLocalDataSource.deleteAllTasks() }
138-
}
118+
coroutineScope {
119+
launch { tasksRemoteDataSource.deleteAllTasks() }
120+
launch { tasksLocalDataSource.deleteAllTasks() }
139121
}
140122
}
141123

@@ -145,8 +127,4 @@ class DefaultTasksRepository(
145127
launch { tasksLocalDataSource.deleteTask(taskId) }
146128
}
147129
}
148-
149-
private suspend fun getTaskWithId(id: String): Task? {
150-
return tasksLocalDataSource.getTask(id)
151-
}
152130
}

app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/TasksDataSource.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,8 @@ interface TasksDataSource {
3838

3939
suspend fun saveTask(task: Task)
4040

41-
suspend fun completeTask(task: Task)
42-
4341
suspend fun completeTask(taskId: String)
4442

45-
suspend fun activateTask(task: Task)
46-
4743
suspend fun activateTask(taskId: String)
4844

4945
suspend fun clearCompletedTasks()

app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/TasksRepository.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,8 @@ interface TasksRepository {
3838

3939
suspend fun saveTask(task: Task)
4040

41-
suspend fun completeTask(task: Task)
42-
4341
suspend fun completeTask(taskId: String)
4442

45-
suspend fun activateTask(task: Task)
46-
4743
suspend fun activateTask(taskId: String)
4844

4945
suspend fun clearCompletedTasks()

app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/local/TasksLocalDataSource.kt

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,12 @@ package com.example.android.architecture.blueprints.todoapp.data.source.local
1818

1919
import com.example.android.architecture.blueprints.todoapp.data.Task
2020
import com.example.android.architecture.blueprints.todoapp.data.source.TasksDataSource
21-
import kotlinx.coroutines.CoroutineDispatcher
22-
import kotlinx.coroutines.Dispatchers
23-
import kotlinx.coroutines.withContext
2421

2522
/**
2623
* Concrete implementation of a data source as a db.
2724
*/
2825
class TasksLocalDataSource internal constructor(
29-
private val tasksDao: TasksDao,
30-
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
26+
private val tasksDao: TasksDao
3127
) : TasksDataSource {
3228

3329
override fun getTasksStream() = tasksDao.observeTasks()
@@ -42,43 +38,25 @@ class TasksLocalDataSource internal constructor(
4238
// NO-OP
4339
}
4440

45-
override suspend fun getTasks(): List<Task> = withContext(ioDispatcher) {
46-
return@withContext tasksDao.getTasks()
47-
}
41+
override suspend fun getTasks(): List<Task> = tasksDao.getTasks()
4842

49-
override suspend fun getTask(taskId: String): Task? = withContext(ioDispatcher) {
50-
return@withContext tasksDao.getTaskById(taskId)
51-
}
43+
override suspend fun getTask(taskId: String): Task? = tasksDao.getTaskById(taskId)
5244

53-
override suspend fun saveTask(task: Task) = withContext(ioDispatcher) {
54-
tasksDao.insertTask(task)
55-
}
56-
57-
override suspend fun completeTask(task: Task) = withContext(ioDispatcher) {
58-
tasksDao.updateCompleted(task.id, true)
59-
}
45+
override suspend fun saveTask(task: Task) = tasksDao.insertTask(task)
6046

61-
override suspend fun completeTask(taskId: String) {
47+
override suspend fun completeTask(taskId: String) =
6248
tasksDao.updateCompleted(taskId, true)
63-
}
64-
65-
override suspend fun activateTask(task: Task) = withContext(ioDispatcher) {
66-
tasksDao.updateCompleted(task.id, false)
67-
}
6849

69-
override suspend fun activateTask(taskId: String) {
50+
override suspend fun activateTask(taskId: String) =
7051
tasksDao.updateCompleted(taskId, false)
71-
}
7252

73-
override suspend fun clearCompletedTasks() = withContext<Unit>(ioDispatcher) {
53+
override suspend fun clearCompletedTasks() {
7454
tasksDao.deleteCompletedTasks()
7555
}
7656

77-
override suspend fun deleteAllTasks() = withContext(ioDispatcher) {
78-
tasksDao.deleteTasks()
79-
}
57+
override suspend fun deleteAllTasks() = tasksDao.deleteTasks()
8058

81-
override suspend fun deleteTask(taskId: String) = withContext<Unit>(ioDispatcher) {
59+
override suspend fun deleteTask(taskId: String) {
8260
tasksDao.deleteTaskById(taskId)
8361
}
8462
}

app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/remote/TasksRemoteDataSource.kt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,22 +80,16 @@ object TasksRemoteDataSource : TasksDataSource {
8080
TASKS_SERVICE_DATA[task.id] = task
8181
}
8282

83-
override suspend fun completeTask(task: Task) {
84-
val completedTask = Task(task.title, task.description, true, task.id)
85-
TASKS_SERVICE_DATA[task.id] = completedTask
86-
}
87-
8883
override suspend fun completeTask(taskId: String) {
89-
// Not required for the remote data source
90-
}
91-
92-
override suspend fun activateTask(task: Task) {
93-
val activeTask = Task(task.title, task.description, false, task.id)
94-
TASKS_SERVICE_DATA[task.id] = activeTask
84+
TASKS_SERVICE_DATA[taskId]?.let {
85+
saveTask(it.copy(isCompleted = true))
86+
}
9587
}
9688

9789
override suspend fun activateTask(taskId: String) {
98-
// Not required for the remote data source
90+
TASKS_SERVICE_DATA[taskId]?.let {
91+
saveTask(it.copy(isCompleted = true))
92+
}
9993
}
10094

10195
override suspend fun clearCompletedTasks() {

app/src/main/java/com/example/android/architecture/blueprints/todoapp/di/DataModules.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import dagger.hilt.android.qualifiers.ApplicationContext
3131
import dagger.hilt.components.SingletonComponent
3232
import javax.inject.Qualifier
3333
import javax.inject.Singleton
34-
import kotlinx.coroutines.CoroutineDispatcher
3534

3635
@Qualifier
3736
@Retention(AnnotationRetention.RUNTIME)
@@ -50,9 +49,8 @@ object RepositoryModule {
5049
fun provideTasksRepository(
5150
@RemoteTasksDataSource remoteDataSource: TasksDataSource,
5251
@LocalTasksDataSource localDataSource: TasksDataSource,
53-
@IoDispatcher ioDispatcher: CoroutineDispatcher
5452
): TasksRepository {
55-
return DefaultTasksRepository(remoteDataSource, localDataSource, ioDispatcher)
53+
return DefaultTasksRepository(remoteDataSource, localDataSource)
5654
}
5755
}
5856

@@ -69,10 +67,9 @@ object DataSourceModule {
6967
@LocalTasksDataSource
7068
@Provides
7169
fun provideTasksLocalDataSource(
72-
database: ToDoDatabase,
73-
@IoDispatcher ioDispatcher: CoroutineDispatcher
70+
database: ToDoDatabase
7471
): TasksDataSource {
75-
return TasksLocalDataSource(database.taskDao(), ioDispatcher)
72+
return TasksLocalDataSource(database.taskDao())
7673
}
7774
}
7875

app/src/main/java/com/example/android/architecture/blueprints/todoapp/taskdetail/TaskDetailViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,10 @@ class TaskDetailViewModel @Inject constructor(
100100
fun setCompleted(completed: Boolean) = viewModelScope.launch {
101101
val task = uiState.value.task ?: return@launch
102102
if (completed) {
103-
tasksRepository.completeTask(task)
103+
tasksRepository.completeTask(task.id)
104104
showSnackbarMessage(R.string.task_marked_complete)
105105
} else {
106-
tasksRepository.activateTask(task)
106+
tasksRepository.activateTask(task.id)
107107
showSnackbarMessage(R.string.task_marked_active)
108108
}
109109
}

app/src/main/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,10 @@ class TasksViewModel @Inject constructor(
113113

114114
fun completeTask(task: Task, completed: Boolean) = viewModelScope.launch {
115115
if (completed) {
116-
tasksRepository.completeTask(task)
116+
tasksRepository.completeTask(task.id)
117117
showSnackbarMessage(R.string.task_marked_complete)
118118
} else {
119-
tasksRepository.activateTask(task)
119+
tasksRepository.activateTask(task.id)
120120
showSnackbarMessage(R.string.task_marked_active)
121121
}
122122
}

app/src/sharedTest/java/com/example/android/architecture/blueprints/todoapp/data/source/FakeRepository.kt

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -86,31 +86,16 @@ class FakeRepository : TasksRepository {
8686
}
8787
}
8888

89-
override suspend fun completeTask(task: Task) {
90-
val completedTask = Task(task.title, task.description, true, task.id)
91-
_savedTasks.update { tasks ->
92-
val newTasks = LinkedHashMap<String, Task>(tasks)
93-
newTasks[task.id] = completedTask
94-
newTasks
95-
}
96-
}
97-
9889
override suspend fun completeTask(taskId: String) {
99-
// Not required for the remote data source.
100-
throw NotImplementedError()
101-
}
102-
103-
override suspend fun activateTask(task: Task) {
104-
val activeTask = Task(task.title, task.description, false, task.id)
105-
_savedTasks.update { tasks ->
106-
val newTasks = LinkedHashMap<String, Task>(tasks)
107-
newTasks[task.id] = activeTask
108-
newTasks
90+
_savedTasks.value[taskId]?.let {
91+
saveTask(it.copy(isCompleted = true))
10992
}
11093
}
11194

11295
override suspend fun activateTask(taskId: String) {
113-
throw NotImplementedError()
96+
_savedTasks.value[taskId]?.let {
97+
saveTask(it.copy(isCompleted = false))
98+
}
11499
}
115100

116101
override suspend fun clearCompletedTasks() {

0 commit comments

Comments
 (0)