mirror of
https://github.com/nextcloud/talk-android
synced 2025-03-12 02:19:44 +00:00
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:
parent
10857114f5
commit
ae65de6cce
app/src/main/java/com/nextcloud/talk/shareditems
@ -82,27 +82,31 @@ class SharedItemsActivity : AppCompatActivity() {
|
||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||
|
||||
viewModel = ViewModelProvider(this, viewModelFactory)[SharedItemsViewModel::class.java]
|
||||
viewModel.initialize(userEntity, roomToken, SharedItemType.MEDIA)
|
||||
|
||||
viewModel.sharedItemTypes.observe(this) {
|
||||
initTabs(it)
|
||||
}
|
||||
viewModel.viewState.observe(this) { state ->
|
||||
when (state) {
|
||||
SharedItemsViewModel.NoSharedItemsState -> {
|
||||
// todo
|
||||
}
|
||||
is SharedItemsViewModel.LoadedState -> {
|
||||
val sharedMediaItems = state.items
|
||||
Log.d(TAG, "Items received: $sharedMediaItems")
|
||||
|
||||
viewModel.sharedItems.observe(this) {
|
||||
Log.d(TAG, "Items received: $it")
|
||||
val showGrid = viewModel.currentItemType == SharedItemType.MEDIA
|
||||
val layoutManager = if (showGrid) {
|
||||
GridLayoutManager(this, SPAN_COUNT)
|
||||
} else {
|
||||
LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
|
||||
}
|
||||
|
||||
val showGrid = viewModel.currentItemType == SharedItemType.MEDIA
|
||||
val layoutManager = if (showGrid) {
|
||||
GridLayoutManager(this, SPAN_COUNT)
|
||||
} else {
|
||||
LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
|
||||
val adapter = SharedItemsAdapter(showGrid, userEntity).apply {
|
||||
items = sharedMediaItems.items
|
||||
}
|
||||
binding.imageRecycler.adapter = adapter
|
||||
binding.imageRecycler.layoutManager = layoutManager
|
||||
}
|
||||
is SharedItemsViewModel.TabsLoadedState -> initTabs(state.types)
|
||||
}
|
||||
|
||||
val adapter = SharedItemsAdapter(showGrid, userEntity).apply {
|
||||
items = it.items
|
||||
}
|
||||
binding.imageRecycler.adapter = adapter
|
||||
binding.imageRecycler.layoutManager = layoutManager
|
||||
}
|
||||
|
||||
binding.imageRecycler.addOnScrollListener(object : RecyclerView.OnScrollListener() {
|
||||
@ -113,6 +117,8 @@ class SharedItemsActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
viewModel.initialize(userEntity, roomToken, SharedItemType.MEDIA)
|
||||
}
|
||||
|
||||
private fun initTabs(sharedItemTypes: Set<SharedItemType>) {
|
||||
@ -175,6 +181,8 @@ class SharedItemsActivity : AppCompatActivity() {
|
||||
|
||||
override fun onTabReselected(tab: TabLayout.Tab) = Unit
|
||||
})
|
||||
|
||||
viewModel.loadItems(SharedItemType.MEDIA)
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
|
@ -41,38 +41,41 @@ class SharedItemsViewModel @Inject constructor(
|
||||
) :
|
||||
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 _currentItemType: SharedItemType
|
||||
|
||||
val sharedItemTypes: LiveData<Set<SharedItemType>>
|
||||
get() = _sharedItemTypes
|
||||
|
||||
val sharedItems: LiveData<SharedMediaItems>
|
||||
get() = _sharedItems
|
||||
|
||||
val currentItemType: SharedItemType
|
||||
get() = _currentItemType
|
||||
|
||||
fun loadNextItems() {
|
||||
val currentSharedItems = sharedItems.value ?: return
|
||||
// items
|
||||
sealed interface ViewState
|
||||
object NoSharedItemsState : ViewState
|
||||
open class TabsLoadedState(val types: Set<SharedItemType>) : ViewState
|
||||
class LoadedState(types: Set<SharedItemType>, val items: SharedMediaItems) : TabsLoadedState(types)
|
||||
|
||||
if (currentSharedItems.moreItemsExisting) {
|
||||
repository.media(repositoryParameters, _currentItemType, currentSharedItems.lastSeenId)
|
||||
?.subscribeOn(Schedulers.io())
|
||||
?.observeOn(AndroidSchedulers.mainThread())
|
||||
?.subscribe(observer(_currentItemType, false))
|
||||
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) {
|
||||
repository.media(repositoryParameters, _currentItemType, currentSharedItems.lastSeenId)
|
||||
?.subscribeOn(Schedulers.io())
|
||||
?.observeOn(AndroidSchedulers.mainThread())
|
||||
?.subscribe(observer(_currentItemType, false))
|
||||
}
|
||||
}
|
||||
else -> return
|
||||
}
|
||||
}
|
||||
|
||||
@ -101,23 +104,38 @@ class SharedItemsViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
override fun onComplete() {
|
||||
val items = newSharedItems!!
|
||||
// todo replace initmodel with tabsloadedstate
|
||||
if (initModel) {
|
||||
this@SharedItemsViewModel._sharedItems.value =
|
||||
newSharedItems
|
||||
setCurrentState(items)
|
||||
} else {
|
||||
val oldItems = this@SharedItemsViewModel._sharedItems.value!!.items
|
||||
this@SharedItemsViewModel._sharedItems.value =
|
||||
val state = this@SharedItemsViewModel._viewState.value as LoadedState
|
||||
val oldItems = state.items.items
|
||||
val newItems =
|
||||
SharedMediaItems(
|
||||
oldItems + newSharedItems!!.items,
|
||||
newSharedItems!!.lastSeenId,
|
||||
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())
|
||||
?.observeOn(AndroidSchedulers.mainThread())
|
||||
?.subscribe(object : Observer<Set<SharedItemType>> {
|
||||
@ -135,7 +153,12 @@ class SharedItemsViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
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
|
||||
)
|
||||
_currentItemType = initialType
|
||||
loadAvailableTypes()
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
Loading…
Reference in New Issue
Block a user