From f301aca982017b4f601af0a776d6e5cdb38d6d6a Mon Sep 17 00:00:00 2001 From: Erik Cavazos Date: Mon, 17 Jul 2023 00:08:36 -0600 Subject: [PATCH] WIP cargo mas posts en feed --- .../java/com/isolaatti/home/FeedFragment.kt | 37 +++++++++-- .../java/com/isolaatti/home/HomeActivity.kt | 2 +- .../posts/presentation/PostsViewModel.kt | 13 +++- .../main/res/drawable/baseline_refresh_24.xml | 5 ++ .../main/res/layout-land/fragment_feed.xml | 61 ++++++++++++++++--- app/src/main/res/layout/fragment_feed.xml | 45 +++++++++++++- app/src/main/res/values/strings.xml | 2 + 7 files changed, 145 insertions(+), 20 deletions(-) create mode 100644 app/src/main/res/drawable/baseline_refresh_24.xml diff --git a/app/src/main/java/com/isolaatti/home/FeedFragment.kt b/app/src/main/java/com/isolaatti/home/FeedFragment.kt index 34650e2..dc53e08 100644 --- a/app/src/main/java/com/isolaatti/home/FeedFragment.kt +++ b/app/src/main/java/com/isolaatti/home/FeedFragment.kt @@ -9,6 +9,7 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager +import com.isolaatti.BuildConfig import com.isolaatti.R import com.isolaatti.common.ErrorMessageViewModel import com.isolaatti.databinding.FragmentFeedBinding @@ -75,7 +76,7 @@ class FeedFragment : Fragment(), OnUserInteractedWithPostCallback { override fun configureConfiguration(builder: MarkwonConfiguration.Builder) { builder .imageDestinationProcessor(ImageDestinationProcessorRelativeToAbsolute - .create("https://isolaatti.com/")) + .create(BuildConfig.backend)) } }) .usePlugin(PicassoImagesPluginDef.picassoImagePlugin) @@ -85,15 +86,40 @@ class FeedFragment : Fragment(), OnUserInteractedWithPostCallback { viewBinding.feedRecyclerView.adapter = adapter viewBinding.feedRecyclerView.layoutManager = LinearLayoutManager(requireContext()) + viewBinding.refreshButton.setOnClickListener { + viewModel.getFeed(refresh = true) + } + + viewBinding.swipeToRefresh.setOnRefreshListener { + viewModel.getFeed(refresh = true) + viewBinding.swipeToRefresh.isRefreshing = false + } + + viewBinding.loadMoreButton.setOnClickListener { + viewModel.getFeed(refresh = false) + } + viewModel.posts.observe(viewLifecycleOwner){ - Log.d("recycler", it.data.toString()) - adapter.updateList(it,null) + if (it != null) { + adapter.updateList(it,null) + } } - Log.d("FeedFragment", errorViewModel.toString()) + + viewModel.loadingPosts.observe(viewLifecycleOwner) { + viewBinding.progressBarLoading.visibility = if(it) View.VISIBLE else View.GONE + viewBinding.loadMoreButton.visibility = if(it) View.GONE else View.VISIBLE + } + + viewModel.noMoreContent.observe(viewLifecycleOwner) { + val visibility = if(it) View.VISIBLE else View.GONE + viewBinding.noMoreContentToShowTextView.visibility = visibility + viewBinding.refreshButton.visibility = visibility + viewBinding.loadMoreButton.visibility = if(it) View.GONE else View.VISIBLE + } + viewModel.errorLoading.observe(viewLifecycleOwner) { errorViewModel.error.postValue(it) - Log.d("FeedFragment", it.toString()) } viewModel.postLiked.observe(viewLifecycleOwner) { viewModel.posts.value?.let { feed -> @@ -108,6 +134,7 @@ class FeedFragment : Fragment(), OnUserInteractedWithPostCallback { } + override fun onLiked(postId: Long) = viewModel.likePost(postId) override fun onUnLiked(postId: Long) = viewModel.unLikePost(postId) diff --git a/app/src/main/java/com/isolaatti/home/HomeActivity.kt b/app/src/main/java/com/isolaatti/home/HomeActivity.kt index 82a2b39..5e9682d 100644 --- a/app/src/main/java/com/isolaatti/home/HomeActivity.kt +++ b/app/src/main/java/com/isolaatti/home/HomeActivity.kt @@ -32,7 +32,7 @@ class HomeActivity : IsolaattiBaseActivity() { viewBinding.navigationRail?.setupWithNavController(navHostFragment.navController) if(savedInstanceState == null) { - postsViewModel.getFeed() + postsViewModel.getFeed(false) } } diff --git a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostsViewModel.kt b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostsViewModel.kt index 846aa16..3b953cc 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostsViewModel.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostsViewModel.kt @@ -24,12 +24,15 @@ import javax.inject.Inject @HiltViewModel class PostsViewModel @Inject constructor(private val postsRepository: PostsRepository, private val likesRepository: LikesRepository) : ViewModel() { - private val _posts: MutableLiveData = MutableLiveData() - val posts: LiveData get() = _posts + private val _posts: MutableLiveData = MutableLiveData() + val posts: LiveData get() = _posts private val _loadingPosts = MutableLiveData(false) val loadingPosts: LiveData get() = _loadingPosts + private val _noMoreContent = MutableLiveData(false) + val noMoreContent: LiveData get() = _noMoreContent + private val _errorLoading: MutableLiveData = MutableLiveData() val errorLoading: LiveData get() = _errorLoading @@ -41,13 +44,17 @@ class PostsViewModel @Inject constructor(private val postsRepository: PostsRepos private val _postLiked: MutableLiveData = MutableLiveData() val postLiked: LiveData get() = _postLiked - fun getFeed() { + fun getFeed(refresh: Boolean) { viewModelScope.launch { + if(refresh) { + _posts.value = null + } postsRepository.getFeed(getLastId()).onEach { when(it) { is Resource.Success -> { _loadingPosts.postValue(false) _posts.postValue(posts.value?.concatFeed(it.data) ?: it.data) + _noMoreContent.postValue(it.data?.moreContent == false) } is Resource.Loading -> { _loadingPosts.postValue(true) diff --git a/app/src/main/res/drawable/baseline_refresh_24.xml b/app/src/main/res/drawable/baseline_refresh_24.xml new file mode 100644 index 0000000..98469ca --- /dev/null +++ b/app/src/main/res/drawable/baseline_refresh_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout-land/fragment_feed.xml b/app/src/main/res/layout-land/fragment_feed.xml index 63aae5c..88f0eaf 100644 --- a/app/src/main/res/layout-land/fragment_feed.xml +++ b/app/src/main/res/layout-land/fragment_feed.xml @@ -57,16 +57,61 @@ - + app:layout_constraintTop_toBottomOf="@+id/topAppBar_layout"> + + + + + + + + + + + +