Pixelcat-App-Android/app/src/main/kotlin/at/connyduck/pixelcat/components/profile/ProfileViewModel.kt

96 lines
3.0 KiB
Kotlin
Raw Normal View History

2020-06-12 15:44:45 +02:00
package at.connyduck.pixelcat.components.profile
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.PagedList
import at.connyduck.pixelcat.components.util.Error
import at.connyduck.pixelcat.components.util.Success
import at.connyduck.pixelcat.components.util.UiState
import at.connyduck.pixelcat.db.AccountManager
import at.connyduck.pixelcat.model.Account
import at.connyduck.pixelcat.model.Relationship
import at.connyduck.pixelcat.model.Status
import at.connyduck.pixelcat.network.FediverseApi
import com.bumptech.glide.util.Executors
import kotlinx.coroutines.launch
import javax.inject.Inject
class ProfileViewModel @Inject constructor(
private val fediverseApi: FediverseApi,
private val accountManager: AccountManager
2020-06-12 19:58:15 +02:00
) : ViewModel() {
2020-06-12 15:44:45 +02:00
val profile = MutableLiveData<UiState<Account>>()
val relationship = MutableLiveData<UiState<Relationship>>()
2020-06-12 19:58:15 +02:00
val profileImages = MutableLiveData<PagedList<Status>>()
2020-06-12 15:44:45 +02:00
val isSelf: Boolean
get() = accountId == null
private var accountId: String? = null
fun load(reload: Boolean = false) {
loadAccount(reload)
if (!isSelf) {
loadRelationship(reload)
}
loadImages(reload)
}
fun setAccountInfo(accountId: String?) {
this@ProfileViewModel.accountId = accountId
load(false)
}
private fun loadAccount(reload: Boolean = false) {
if (profile.value == null || reload) {
viewModelScope.launch {
2020-06-12 19:58:15 +02:00
fediverseApi.account(getAccountId()).fold(
{
profile.value = Success(it)
},
{
profile.value = Error(cause = it)
}
)
2020-06-12 15:44:45 +02:00
}
}
}
private fun loadRelationship(reload: Boolean = false) {
if (relationship.value == null || reload) {
viewModelScope.launch {
2020-06-12 19:58:15 +02:00
fediverseApi.relationships(listOf(getAccountId())).fold(
{
relationship.value = Success(it.first())
},
{
relationship.value = Error(cause = it)
}
)
2020-06-12 15:44:45 +02:00
}
}
}
private fun loadImages(reload: Boolean = false) {
2020-06-12 19:58:15 +02:00
if (profileImages.value == null || reload) {
2020-06-12 15:44:45 +02:00
profileImages.value = PagedList.Builder(
ProfileImageDataSource(
fediverseApi,
accountId,
accountManager,
viewModelScope
2020-06-12 19:58:15 +02:00
),
20
2020-06-12 15:44:45 +02:00
).setNotifyExecutor(Executors.mainThreadExecutor())
.setFetchExecutor(java.util.concurrent.Executors.newSingleThreadExecutor())
.build()
}
}
private suspend fun getAccountId(): String {
return accountId ?: accountManager.activeAccount()?.accountId!!
}
2020-06-12 19:58:15 +02:00
}