Skip to content

Commit e664958

Browse files
committed
TaskDetailVM cleanup, addressing Lyla's comments
1 parent bd21066 commit e664958

File tree

2 files changed

+25
-41
lines changed

2 files changed

+25
-41
lines changed

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

Lines changed: 23 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ package com.example.android.architecture.blueprints.todoapp.taskdetail
1818
import androidx.annotation.StringRes
1919
import androidx.lifecycle.LiveData
2020
import androidx.lifecycle.MutableLiveData
21-
import androidx.lifecycle.Transformations
2221
import androidx.lifecycle.ViewModel
22+
import androidx.lifecycle.map
2323
import androidx.lifecycle.switchMap
2424
import androidx.lifecycle.viewModelScope
2525
import com.example.android.architecture.blueprints.todoapp.Event
@@ -37,24 +37,14 @@ class TaskDetailViewModel(
3737
private val tasksRepository: TasksRepository
3838
) : ViewModel() {
3939

40+
private val _taskId = MutableLiveData<String>()
4041

41-
private val _params = MutableLiveData<Pair<String, Boolean>>()
42-
43-
private val _task = _params.switchMap { (taskId, forceUpdate) ->
44-
if (forceUpdate) {
45-
_dataLoading.value = true
46-
viewModelScope.launch {
47-
tasksRepository.refreshTasks()
48-
_dataLoading.value = false
49-
}
50-
}
51-
tasksRepository.observeTask(taskId).switchMap { computeResult(it) }
52-
42+
private val _task = _taskId.switchMap { taskId ->
43+
tasksRepository.observeTask(taskId).map { computeResult(it) }
5344
}
54-
val task: LiveData<Task> = _task
45+
val task: LiveData<Task?> = _task
5546

56-
private val _isDataAvailable = MutableLiveData<Boolean>()
57-
val isDataAvailable: LiveData<Boolean> = _isDataAvailable
47+
val isDataAvailable: LiveData<Boolean> = _task.map { it != null }
5848

5949
private val _dataLoading = MutableLiveData<Boolean>()
6050
val dataLoading: LiveData<Boolean> = _dataLoading
@@ -69,12 +59,12 @@ class TaskDetailViewModel(
6959
val snackbarMessage: LiveData<Event<Int>> = _snackbarText
7060

7161
// This LiveData depends on another so we can use a transformation.
72-
val completed: LiveData<Boolean> = Transformations.map(_task) { input: Task? ->
62+
val completed: LiveData<Boolean> = _task.map { input: Task? ->
7363
input?.isCompleted ?: false
7464
}
7565

7666
fun deleteTask() = viewModelScope.launch {
77-
_params.value?.first?.let {
67+
_taskId.value?.let {
7868
tasksRepository.deleteTask(it)
7969
_deleteTaskCommand.value = Event(Unit)
8070
}
@@ -97,38 +87,32 @@ class TaskDetailViewModel(
9787

9888
fun start(taskId: String?) {
9989
// If we're already loading or already loaded, return (might be a config change)
100-
if (_dataLoading.value == true || taskId == _params.value?.first) {
101-
return
102-
}
103-
if (taskId == null) {
104-
_isDataAvailable.value = false
90+
if (_dataLoading.value == true || taskId == _taskId.value) {
10591
return
10692
}
107-
108-
_params.value = Pair(taskId, false)
93+
// Trigger the load
94+
_taskId.value = taskId
10995
}
11096

111-
private fun computeResult(taskResult: Result<Task>): LiveData<Task> {
112-
113-
// TODO: This is a good case for liveData builder. Replace when stable.
114-
val result = MutableLiveData<Task>()
115-
116-
if (taskResult is Success) {
117-
result.value = taskResult.data
118-
_isDataAvailable.value = true
97+
private fun computeResult(taskResult: Result<Task>): Task? {
98+
return if (taskResult is Success) {
99+
taskResult.data
119100
} else {
120-
result.value = null
121101
showSnackbarMessage(R.string.loading_tasks_error)
122-
_isDataAvailable.value = false
102+
null
123103
}
124-
125-
return result
126104
}
127105

128106

129107
fun refresh() {
130-
// Recreate the parameters to force a new data load.
131-
_params.value = _params.value?.copy(second = true)
108+
// Refresh the repository and the task will be updated automatically.
109+
_task.value?.let {
110+
_dataLoading.value = true
111+
viewModelScope.launch {
112+
tasksRepository.refreshTask(it.id)
113+
_dataLoading.value = false
114+
}
115+
}
132116
}
133117

134118
private fun showSnackbarMessage(@StringRes message: Int) {

app/src/test/java/com/example/android/architecture/blueprints/todoapp/taskdetail/TaskDetailViewModelTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ class TaskDetailViewModelTest {
6868
taskDetailViewModel.start(task.id)
6969

7070
// Then verify that the view was notified
71-
assertThat(taskDetailViewModel.task.awaitNextValue().title).isEqualTo(task.title)
72-
assertThat(taskDetailViewModel.task.awaitNextValue().description)
71+
assertThat(taskDetailViewModel.task.awaitNextValue()?.title).isEqualTo(task.title)
72+
assertThat(taskDetailViewModel.task.awaitNextValue()?.description)
7373
.isEqualTo(task.description)
7474
}
7575

0 commit comments

Comments
 (0)