SharedItemsViewModel: use unified state livedata

Co-authored-by: Tim Krüger <t@timkrueger.me>
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
This commit is contained in:
Álvaro Brey 2022-05-20 12:50:14 +02:00 committed by Tim Krüger
parent 10857114f5
commit ae65de6cce
No known key found for this signature in database
GPG Key ID: FECE3A7222C52A4E
2 changed files with 81 additions and 49 deletions

View File

@ -82,14 +82,15 @@ class SharedItemsActivity : AppCompatActivity() {
supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayHomeAsUpEnabled(true)
viewModel = ViewModelProvider(this, viewModelFactory)[SharedItemsViewModel::class.java] viewModel = ViewModelProvider(this, viewModelFactory)[SharedItemsViewModel::class.java]
viewModel.initialize(userEntity, roomToken, SharedItemType.MEDIA)
viewModel.sharedItemTypes.observe(this) { viewModel.viewState.observe(this) { state ->
initTabs(it) when (state) {
SharedItemsViewModel.NoSharedItemsState -> {
// todo
} }
is SharedItemsViewModel.LoadedState -> {
viewModel.sharedItems.observe(this) { val sharedMediaItems = state.items
Log.d(TAG, "Items received: $it") Log.d(TAG, "Items received: $sharedMediaItems")
val showGrid = viewModel.currentItemType == SharedItemType.MEDIA val showGrid = viewModel.currentItemType == SharedItemType.MEDIA
val layoutManager = if (showGrid) { val layoutManager = if (showGrid) {
@ -99,11 +100,14 @@ class SharedItemsActivity : AppCompatActivity() {
} }
val adapter = SharedItemsAdapter(showGrid, userEntity).apply { val adapter = SharedItemsAdapter(showGrid, userEntity).apply {
items = it.items items = sharedMediaItems.items
} }
binding.imageRecycler.adapter = adapter binding.imageRecycler.adapter = adapter
binding.imageRecycler.layoutManager = layoutManager binding.imageRecycler.layoutManager = layoutManager
} }
is SharedItemsViewModel.TabsLoadedState -> initTabs(state.types)
}
}
binding.imageRecycler.addOnScrollListener(object : RecyclerView.OnScrollListener() { binding.imageRecycler.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
@ -113,6 +117,8 @@ class SharedItemsActivity : AppCompatActivity() {
} }
} }
}) })
viewModel.initialize(userEntity, roomToken, SharedItemType.MEDIA)
} }
private fun initTabs(sharedItemTypes: Set<SharedItemType>) { private fun initTabs(sharedItemTypes: Set<SharedItemType>) {
@ -175,6 +181,8 @@ class SharedItemsActivity : AppCompatActivity() {
override fun onTabReselected(tab: TabLayout.Tab) = Unit override fun onTabReselected(tab: TabLayout.Tab) = Unit
}) })
viewModel.loadItems(SharedItemType.MEDIA)
} }
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {

View File

@ -41,33 +41,33 @@ class SharedItemsViewModel @Inject constructor(
) : ) :
ViewModel() { ViewModel() {
private val _sharedItemTypes: MutableLiveData<Set<SharedItemType>> by lazy {
MutableLiveData<Set<SharedItemType>>().also {
availableTypes()
}
}
private val _sharedItems: MutableLiveData<SharedMediaItems> by lazy {
MutableLiveData<SharedMediaItems>().also {
loadItems(_currentItemType)
}
}
private lateinit var repositoryParameters: SharedItemsRepository.Parameters private lateinit var repositoryParameters: SharedItemsRepository.Parameters
private lateinit var _currentItemType: SharedItemType private lateinit var _currentItemType: SharedItemType
val sharedItemTypes: LiveData<Set<SharedItemType>>
get() = _sharedItemTypes
val sharedItems: LiveData<SharedMediaItems>
get() = _sharedItems
val currentItemType: SharedItemType val currentItemType: SharedItemType
get() = _currentItemType get() = _currentItemType
fun loadNextItems() { // items
val currentSharedItems = sharedItems.value ?: return sealed interface ViewState
object NoSharedItemsState : ViewState
open class TabsLoadedState(val types: Set<SharedItemType>) : ViewState
class LoadedState(types: Set<SharedItemType>, val items: SharedMediaItems) : TabsLoadedState(types)
private val _viewState: MutableLiveData<ViewState> = MutableLiveData(NoSharedItemsState)
val viewState: LiveData<ViewState>
get() = _viewState
// private val _sharedItems: MutableLiveData<SharedMediaItems> by lazy {
// MutableLiveData<SharedMediaItems>().also {
// loadItems(_currentItemType)
// }
// }
// val sharedItems: LiveData<SharedMediaItems>
// get() = _sharedItems
fun loadNextItems() {
when (val currentState = _viewState.value) {
is LoadedState -> {
val currentSharedItems = currentState.items
if (currentSharedItems.moreItemsExisting) { if (currentSharedItems.moreItemsExisting) {
repository.media(repositoryParameters, _currentItemType, currentSharedItems.lastSeenId) repository.media(repositoryParameters, _currentItemType, currentSharedItems.lastSeenId)
?.subscribeOn(Schedulers.io()) ?.subscribeOn(Schedulers.io())
@ -75,6 +75,9 @@ class SharedItemsViewModel @Inject constructor(
?.subscribe(observer(_currentItemType, false)) ?.subscribe(observer(_currentItemType, false))
} }
} }
else -> return
}
}
fun loadItems(type: SharedItemType) { fun loadItems(type: SharedItemType) {
@ -101,23 +104,38 @@ class SharedItemsViewModel @Inject constructor(
} }
override fun onComplete() { override fun onComplete() {
val items = newSharedItems!!
// todo replace initmodel with tabsloadedstate
if (initModel) { if (initModel) {
this@SharedItemsViewModel._sharedItems.value = setCurrentState(items)
newSharedItems
} else { } else {
val oldItems = this@SharedItemsViewModel._sharedItems.value!!.items val state = this@SharedItemsViewModel._viewState.value as LoadedState
this@SharedItemsViewModel._sharedItems.value = val oldItems = state.items.items
val newItems =
SharedMediaItems( SharedMediaItems(
oldItems + newSharedItems!!.items, oldItems + newSharedItems!!.items,
newSharedItems!!.lastSeenId, newSharedItems!!.lastSeenId,
newSharedItems!!.moreItemsExisting newSharedItems!!.moreItemsExisting
) )
setCurrentState(newItems)
}
}
private fun setCurrentState(items: SharedMediaItems) {
when (val state = this@SharedItemsViewModel._viewState.value) {
is TabsLoadedState -> {
this@SharedItemsViewModel._viewState.value = LoadedState(
state.types,
items
)
}
else -> return
} }
} }
} }
} }
private fun availableTypes() { private fun loadAvailableTypes() {
repository.availableTypes(repositoryParameters).subscribeOn(Schedulers.io()) repository.availableTypes(repositoryParameters).subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread()) ?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<Set<SharedItemType>> { ?.subscribe(object : Observer<Set<SharedItemType>> {
@ -135,7 +153,12 @@ class SharedItemsViewModel @Inject constructor(
} }
override fun onComplete() { override fun onComplete() {
this@SharedItemsViewModel._sharedItemTypes.value = this.types val newTypes = this.types
if (newTypes.isNullOrEmpty()) {
this@SharedItemsViewModel._viewState.value = NoSharedItemsState
} else {
this@SharedItemsViewModel._viewState.value = TabsLoadedState(newTypes)
}
} }
}) })
} }
@ -149,6 +172,7 @@ class SharedItemsViewModel @Inject constructor(
roomToken roomToken
) )
_currentItemType = initialType _currentItemType = initialType
loadAvailableTypes()
} }
companion object { companion object {