@@ -18,8 +18,8 @@ package com.example.android.architecture.blueprints.todoapp.taskdetail
18
18
import androidx.annotation.StringRes
19
19
import androidx.lifecycle.LiveData
20
20
import androidx.lifecycle.MutableLiveData
21
- import androidx.lifecycle.Transformations
22
21
import androidx.lifecycle.ViewModel
22
+ import androidx.lifecycle.map
23
23
import androidx.lifecycle.switchMap
24
24
import androidx.lifecycle.viewModelScope
25
25
import com.example.android.architecture.blueprints.todoapp.Event
@@ -37,24 +37,14 @@ class TaskDetailViewModel(
37
37
private val tasksRepository : TasksRepository
38
38
) : ViewModel() {
39
39
40
+ private val _taskId = MutableLiveData <String >()
40
41
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) }
53
44
}
54
- val task: LiveData <Task > = _task
45
+ val task: LiveData <Task ? > = _task
55
46
56
- private val _isDataAvailable = MutableLiveData <Boolean >()
57
- val isDataAvailable: LiveData <Boolean > = _isDataAvailable
47
+ val isDataAvailable: LiveData <Boolean > = _task .map { it != null }
58
48
59
49
private val _dataLoading = MutableLiveData <Boolean >()
60
50
val dataLoading: LiveData <Boolean > = _dataLoading
@@ -69,12 +59,12 @@ class TaskDetailViewModel(
69
59
val snackbarMessage: LiveData <Event <Int >> = _snackbarText
70
60
71
61
// 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 ? ->
73
63
input?.isCompleted ? : false
74
64
}
75
65
76
66
fun deleteTask () = viewModelScope.launch {
77
- _params .value?.first ?.let {
67
+ _taskId .value?.let {
78
68
tasksRepository.deleteTask(it)
79
69
_deleteTaskCommand .value = Event (Unit )
80
70
}
@@ -97,38 +87,32 @@ class TaskDetailViewModel(
97
87
98
88
fun start (taskId : String? ) {
99
89
// 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) {
105
91
return
106
92
}
107
-
108
- _params .value = Pair ( taskId, false )
93
+ // Trigger the load
94
+ _taskId .value = taskId
109
95
}
110
96
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
119
100
} else {
120
- result.value = null
121
101
showSnackbarMessage(R .string.loading_tasks_error)
122
- _isDataAvailable .value = false
102
+ null
123
103
}
124
-
125
- return result
126
104
}
127
105
128
106
129
107
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
+ }
132
116
}
133
117
134
118
private fun showSnackbarMessage (@StringRes message : Int ) {
0 commit comments