mirror of https://github.com/tasks/tasks
Convert TaskListViewModel to flow
parent
1811eb561f
commit
b0bb58bb4c
@ -1,64 +1,66 @@
|
|||||||
package org.tasks.ui
|
package org.tasks.ui
|
||||||
|
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import android.content.BroadcastReceiver
|
||||||
import androidx.lifecycle.LiveData
|
import android.content.Context
|
||||||
import androidx.lifecycle.MutableLiveData
|
import android.content.Intent
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import com.todoroo.andlib.utility.DateUtilities
|
||||||
import com.todoroo.andlib.utility.AndroidUtilities
|
|
||||||
import com.todoroo.astrid.api.Filter
|
import com.todoroo.astrid.api.Filter
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.filter
|
||||||
|
import kotlinx.coroutines.flow.map
|
||||||
|
import kotlinx.coroutines.flow.update
|
||||||
|
import org.tasks.LocalBroadcastManager
|
||||||
|
import org.tasks.compose.throttleLatest
|
||||||
import org.tasks.data.TaskContainer
|
import org.tasks.data.TaskContainer
|
||||||
import org.tasks.data.TaskDao
|
import org.tasks.data.TaskDao
|
||||||
import org.tasks.data.TaskListQuery.getQuery
|
import org.tasks.data.TaskListQuery.getQuery
|
||||||
import org.tasks.preferences.Preferences
|
import org.tasks.preferences.Preferences
|
||||||
import timber.log.Timber
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class TaskListViewModel @Inject constructor(
|
class TaskListViewModel @Inject constructor(
|
||||||
private val preferences: Preferences,
|
private val preferences: Preferences,
|
||||||
private val taskDao: TaskDao) : ViewModel() {
|
private val taskDao: TaskDao,
|
||||||
|
private val localBroadcastManager: LocalBroadcastManager,
|
||||||
|
) : ViewModel() {
|
||||||
|
|
||||||
private var _tasks = MutableLiveData<List<TaskContainer>>()
|
data class State(
|
||||||
val tasks: LiveData<List<TaskContainer>>
|
val filter: Filter? = null,
|
||||||
get() = _tasks
|
val now: Long = DateUtilities.now(),
|
||||||
private var filter: Filter? = null
|
)
|
||||||
private var manualSortFilter = false
|
|
||||||
|
|
||||||
fun setFilter(filter: Filter) {
|
private val _state = MutableStateFlow(State())
|
||||||
manualSortFilter = (filter.supportsManualSort() && preferences.isManualSort
|
|
||||||
|| filter.supportsAstridSorting() && preferences.isAstridSort)
|
val tasks: Flow<List<TaskContainer>> =
|
||||||
if (filter != this.filter || filter.getSqlQuery() != this.filter!!.getSqlQuery()) {
|
_state
|
||||||
this.filter = filter
|
.filter { it.filter != null }
|
||||||
_tasks = MutableLiveData()
|
.throttleLatest(333)
|
||||||
|
.map { taskDao.fetchTasks { getQuery(preferences, it.filter!!) } }
|
||||||
|
|
||||||
|
private val refreshReceiver = object : BroadcastReceiver() {
|
||||||
|
override fun onReceive(context: Context?, intent: Intent?) {
|
||||||
invalidate()
|
invalidate()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun observe(owner: LifecycleOwner, observer: (List<TaskContainer>) -> Unit) =
|
fun setFilter(filter: Filter) {
|
||||||
_tasks.observe(owner, observer)
|
_state.update {
|
||||||
|
it.copy(filter = filter)
|
||||||
fun searchByFilter(filter: Filter?) {
|
}
|
||||||
this.filter = filter
|
|
||||||
invalidate()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun invalidate() {
|
fun invalidate() {
|
||||||
AndroidUtilities.assertMainThread()
|
_state.update { it.copy(now = DateUtilities.now()) }
|
||||||
if (filter == null) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
viewModelScope.launch {
|
|
||||||
_tasks.value = taskDao.fetchTasks { getQuery(preferences, filter!!) }
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
Timber.e(e)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val value: List<TaskContainer>
|
init {
|
||||||
get() = _tasks.value ?: emptyList()
|
localBroadcastManager.registerRefreshReceiver(refreshReceiver)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onCleared() {
|
||||||
|
localBroadcastManager.unregisterReceiver(refreshReceiver)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue