Skip to content

Commit 7313121

Browse files
authored
Move Task ID creation out of Task (#924)
1 parent 94abf0c commit 7313121

File tree

9 files changed

+109
-35
lines changed

9 files changed

+109
-35
lines changed

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.example.android.architecture.blueprints.todoapp.data
1818

1919
import com.example.android.architecture.blueprints.todoapp.data.source.local.TaskDao
2020
import com.example.android.architecture.blueprints.todoapp.data.source.network.NetworkDataSource
21+
import java.util.UUID
2122
import kotlinx.coroutines.CoroutineDispatcher
2223
import kotlinx.coroutines.Dispatchers
2324
import kotlinx.coroutines.flow.Flow
@@ -40,7 +41,16 @@ class DefaultTaskRepository(
4041
) : TaskRepository {
4142

4243
override suspend fun createTask(title: String, description: String): Task {
43-
val task = Task(title = title, description = description)
44+
// ID creation might be a complex operation so it's executed using the supplied
45+
// coroutine dispatcher
46+
val taskId = withContext(coroutineDispatcher) {
47+
UUID.randomUUID().toString()
48+
}
49+
val task = Task(
50+
title = title,
51+
description = description,
52+
id = taskId,
53+
)
4454
taskDao.upsert(task.toLocal())
4555
saveTasksToNetwork()
4656
return task

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package com.example.android.architecture.blueprints.todoapp.data
1818

19-
import java.util.UUID
20-
2119
/**
2220
* Immutable model class for a Task.
2321
*
@@ -33,7 +31,7 @@ data class Task(
3331
val title: String = "",
3432
val description: String = "",
3533
val isCompleted: Boolean = false,
36-
val id: String = UUID.randomUUID().toString()
34+
val id: String,
3735
) {
3836

3937
val titleForList: String

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

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,12 @@ private fun EditTaskContentPreview() {
156156
EditTaskContent(
157157
loading = false,
158158
empty = false,
159-
Task("Title", "Description", isCompleted = false),
159+
Task(
160+
title = "Title",
161+
description = "Description",
162+
isCompleted = false,
163+
id = "ID"
164+
),
160165
onTaskCheck = { },
161166
onRefresh = { }
162167
)
@@ -172,7 +177,12 @@ private fun EditTaskContentTaskCompletedPreview() {
172177
EditTaskContent(
173178
loading = false,
174179
empty = false,
175-
Task("Title", "Description", isCompleted = true),
180+
Task(
181+
title = "Title",
182+
description = "Description",
183+
isCompleted = false,
184+
id = "ID"
185+
),
176186
onTaskCheck = { },
177187
onRefresh = { }
178188
)
@@ -188,7 +198,12 @@ private fun EditTaskContentEmptyPreview() {
188198
EditTaskContent(
189199
loading = false,
190200
empty = true,
191-
Task("Title", "Description", isCompleted = false),
201+
Task(
202+
title = "Title",
203+
description = "Description",
204+
isCompleted = false,
205+
id = "ID"
206+
),
192207
onTaskCheck = { },
193208
onRefresh = { }
194209
)

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

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,36 @@ private fun TasksContentPreview() {
236236
TasksContent(
237237
loading = false,
238238
tasks = listOf(
239-
Task("Title 1", "Description 1"),
240-
Task("Title 2", "Description 2", true),
241-
Task("Title 3", "Description 3", true),
242-
Task("Title 4", "Description 4"),
243-
Task("Title 5", "Description 5", true)
239+
Task(
240+
title = "Title 1",
241+
description = "Description 1",
242+
isCompleted = false,
243+
id = "ID 1"
244+
),
245+
Task(
246+
title = "Title 2",
247+
description = "Description 2",
248+
isCompleted = true,
249+
id = "ID 2"
250+
),
251+
Task(
252+
title = "Title 3",
253+
description = "Description 3",
254+
isCompleted = true,
255+
id = "ID 3"
256+
),
257+
Task(
258+
title = "Title 4",
259+
description = "Description 4",
260+
isCompleted = false,
261+
id = "ID 4"
262+
),
263+
Task(
264+
title = "Title 5",
265+
description = "Description 5",
266+
isCompleted = true,
267+
id = "ID 5"
268+
),
244269
),
245270
currentFilteringLabel = R.string.label_all,
246271
noTasksLabel = R.string.no_tasks_all,
@@ -291,7 +316,11 @@ private fun TaskItemPreview() {
291316
AppCompatTheme {
292317
Surface {
293318
TaskItem(
294-
task = Task("Title", "Description"),
319+
task = Task(
320+
title = "Title",
321+
description = "Description",
322+
id = "ID"
323+
),
295324
onTaskClick = { },
296325
onCheckedChange = { }
297326
)
@@ -305,7 +334,12 @@ private fun TaskItemCompletedPreview() {
305334
AppCompatTheme {
306335
Surface {
307336
TaskItem(
308-
task = Task("Title", "Description", true),
337+
task = Task(
338+
title = "Title",
339+
description = "Description",
340+
isCompleted = true,
341+
id = "ID"
342+
),
309343
onTaskClick = { },
310344
onCheckedChange = { }
311345
)

app/src/test/java/com/example/android/architecture/blueprints/todoapp/data/DefaultTaskRepositoryTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ import org.junit.Test
3333
@ExperimentalCoroutinesApi
3434
class DefaultTaskRepositoryTest {
3535

36-
private val task1 = Task(title = "Title1", description = "Description1")
37-
private val task2 = Task(title = "Title2", description = "Description2")
38-
private val task3 = Task(title = "Title3", description = "Description3")
39-
private val newTask = Task(title = "Title new", description = "Description new")
36+
private val task1 = Task(id = "1", title = "Title1", description = "Description1")
37+
private val task2 = Task(id = "2", title = "Title2", description = "Description2")
38+
private val task3 = Task(id = "3", title = "Title3", description = "Description3")
39+
private val newTask = Task(id = "new", title = "Title new", description = "Description new")
4040
private val networkTasks = listOf(task1, task2).toNetwork().sortedBy { it.id }
4141
private val localTasks = listOf(task3.toLocal()).sortedBy { it.id }
4242

app/src/test/java/com/example/android/architecture/blueprints/todoapp/statistics/StatisticsUtilsTest.kt

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,12 @@ class StatisticsUtilsTest {
2929
@Test
3030
fun getActiveAndCompletedStats_noCompleted() {
3131
val tasks = listOf(
32-
Task("title", "desc", isCompleted = false)
32+
Task(
33+
id = "id",
34+
title = "title",
35+
description = "desc",
36+
isCompleted = false,
37+
)
3338
)
3439
// When the list of tasks is computed with an active task
3540
val result = getActiveAndCompletedStats(tasks)
@@ -42,7 +47,12 @@ class StatisticsUtilsTest {
4247
@Test
4348
fun getActiveAndCompletedStats_noActive() {
4449
val tasks = listOf(
45-
Task("title", "desc", isCompleted = true)
50+
Task(
51+
id = "id",
52+
title = "title",
53+
description = "desc",
54+
isCompleted = true,
55+
)
4656
)
4757
// When the list of tasks is computed with a completed task
4858
val result = getActiveAndCompletedStats(tasks)
@@ -56,11 +66,11 @@ class StatisticsUtilsTest {
5666
fun getActiveAndCompletedStats_both() {
5767
// Given 3 completed tasks and 2 active tasks
5868
val tasks = listOf(
59-
Task("title", "desc", isCompleted = true),
60-
Task("title", "desc", isCompleted = true),
61-
Task("title", "desc", isCompleted = true),
62-
Task("title", "desc", isCompleted = false),
63-
Task("title", "desc", isCompleted = false)
69+
Task(id = "1", title = "title", description = "desc", isCompleted = true),
70+
Task(id = "2", title = "title", description = "desc", isCompleted = true),
71+
Task(id = "3", title = "title", description = "desc", isCompleted = true),
72+
Task(id = "4", title = "title", description = "desc", isCompleted = false),
73+
Task(id = "5", title = "title", description = "desc", isCompleted = false),
6474
)
6575
// When the list of tasks is computed
6676
val result = getActiveAndCompletedStats(tasks)

app/src/test/java/com/example/android/architecture/blueprints/todoapp/statistics/StatisticsViewModelTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ class StatisticsViewModelTest {
6767
@Test
6868
fun loadNonEmptyTasksFromRepository_NonEmptyResults() = runTest {
6969
// We initialise the tasks to 3, with one active and two completed
70-
val task1 = Task("Title1", "Description1")
71-
val task2 = Task("Title2", "Description2", true)
72-
val task3 = Task("Title3", "Description3", true)
73-
val task4 = Task("Title4", "Description4", true)
70+
val task1 = Task(id = "1", title = "Title1", description = "Desc1")
71+
val task2 = Task(id = "2", title = "Title2", description = "Desc2", isCompleted = true)
72+
val task3 = Task(id = "3", title = "Title3", description = "Desc3", isCompleted = true)
73+
val task4 = Task(id = "4", title = "Title4", description = "Desc4", isCompleted = true)
7474
tasksRepository.addTasks(task1, task2, task3, task4)
7575

7676
// Then the results are not empty

app/src/test/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksViewModelTest.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ class TasksViewModelTest {
5757
fun setupViewModel() {
5858
// We initialise the tasks to 3, with one active and two completed
5959
tasksRepository = FakeTaskRepository()
60-
val task1 = Task("Title1", "Description1")
61-
val task2 = Task("Title2", "Description2", true)
62-
val task3 = Task("Title3", "Description3", true)
60+
val task1 = Task(id = "1", title = "Title1", description = "Desc1")
61+
val task2 = Task(id = "2", title = "Title2", description = "Desc2", isCompleted = true)
62+
val task3 = Task(id = "3", title = "Title3", description = "Desc3", isCompleted = true)
6363
tasksRepository.addTasks(task1, task2, task3)
6464

6565
tasksViewModel = TasksViewModel(tasksRepository, SavedStateHandle())
@@ -195,7 +195,7 @@ class TasksViewModelTest {
195195
@Test
196196
fun completeTask_dataAndSnackbarUpdated() = runTest {
197197
// With a repository that has an active task
198-
val task = Task("Title", "Description")
198+
val task = Task(id = "id", title = "Title", description = "Description")
199199
tasksRepository.addTasks(task)
200200

201201
// Complete task
@@ -212,7 +212,7 @@ class TasksViewModelTest {
212212
@Test
213213
fun activateTask_dataAndSnackbarUpdated() = runTest {
214214
// With a repository that has a completed task
215-
val task = Task("Title", "Description", true)
215+
val task = Task(id = "id", title = "Title", description = "Description", isCompleted = true)
216216
tasksRepository.addTasks(task)
217217

218218
// Activate task

shared-test/src/main/java/com/example/android/architecture/blueprints/todoapp/data/FakeTaskRepository.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.example.android.architecture.blueprints.todoapp.data
1818

1919
import androidx.annotation.VisibleForTesting
20+
import java.util.UUID
2021
import kotlinx.coroutines.flow.Flow
2122
import kotlinx.coroutines.flow.MutableStateFlow
2223
import kotlinx.coroutines.flow.StateFlow
@@ -56,7 +57,11 @@ class FakeTaskRepository : TaskRepository {
5657
}
5758

5859
override suspend fun createTask(title: String, description: String): Task {
59-
return Task(title = title, description = description).also {
60+
return Task(
61+
title = title,
62+
description = description,
63+
id = generateTaskId()
64+
).also {
6065
saveTask(it)
6166
}
6267
}
@@ -134,6 +139,8 @@ class FakeTaskRepository : TaskRepository {
134139
}
135140
}
136141

142+
private fun generateTaskId() = UUID.randomUUID().toString()
143+
137144
@VisibleForTesting
138145
fun addTasks(vararg tasks: Task) {
139146
_savedTasks.update { oldTasks ->

0 commit comments

Comments
 (0)