From ae65de6cce0d0bbabd4615f80852caeaf8bc7c0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Fri, 20 May 2022 12:50:14 +0200 Subject: [PATCH] SharedItemsViewModel: use unified state livedata MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tim Krüger Signed-off-by: Álvaro Brey --- .../activities/SharedItemsActivity.kt | 42 +++++---- .../viewmodels/SharedItemsViewModel.kt | 88 ++++++++++++------- 2 files changed, 81 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 6d9ad7b0a..4ebed5b75 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -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) { @@ -175,6 +181,8 @@ class SharedItemsActivity : AppCompatActivity() { override fun onTabReselected(tab: TabLayout.Tab) = Unit }) + + viewModel.loadItems(SharedItemType.MEDIA) } override fun onOptionsItemSelected(item: MenuItem): Boolean { diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt index a1e220f82..f4ca8a4f2 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt @@ -41,38 +41,41 @@ class SharedItemsViewModel @Inject constructor( ) : ViewModel() { - private val _sharedItemTypes: MutableLiveData> by lazy { - MutableLiveData>().also { - availableTypes() - } - } - - private val _sharedItems: MutableLiveData by lazy { - MutableLiveData().also { - loadItems(_currentItemType) - } - } - private lateinit var repositoryParameters: SharedItemsRepository.Parameters private lateinit var _currentItemType: SharedItemType - - val sharedItemTypes: LiveData> - get() = _sharedItemTypes - - val sharedItems: LiveData - 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) : ViewState + class LoadedState(types: Set, 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 = MutableLiveData(NoSharedItemsState) + val viewState: LiveData + get() = _viewState + + // private val _sharedItems: MutableLiveData by lazy { + // MutableLiveData().also { + // loadItems(_currentItemType) + // } + // } + // val sharedItems: LiveData + // 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> { @@ -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 {