From 22e31d6626344c2446e79c13cec07d4c42fb74a7 Mon Sep 17 00:00:00 2001 From: Victor Date: Mon, 15 Jul 2019 16:34:23 -0300 Subject: [PATCH 01/32] I added the swipe to refresh view into the layout, and removed the progress bar. Using the same fetch method, now it's possible to update too. --- .../feature/bookmarks/BookmarksFragment.kt | 12 +++-- .../main/res/layout/fragment_bookmarks.xml | 52 +++++++++---------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt b/app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt index c2c6086..e4cf6ff 100644 --- a/app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt +++ b/app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt @@ -62,6 +62,10 @@ class BookmarksFragment : BaseFragment() { epoxyRecyclerView.setController(this) } + swipeRefreshLayoutBookmarks.setOnRefreshListener { + viewModel.fetchBookmarks() + } + viewModel.bookmarksResource.observe(this, Observer { resource -> when (resource) { is Resource.Loading -> { @@ -96,16 +100,16 @@ class BookmarksFragment : BaseFragment() { emptyStateContainer.visibility = View.GONE epoxyRecyclerView.visibility = View.GONE - progressBar.visibility = View.VISIBLE + swipeRefreshLayoutBookmarks.isRefreshing = true } private fun hideLoading() { - progressBar.visibility = View.GONE + swipeRefreshLayoutBookmarks.isRefreshing = false } private fun showLoginEmptyState() { epoxyRecyclerView.visibility = View.GONE - progressBar.visibility = View.GONE + swipeRefreshLayoutBookmarks.isRefreshing = false emptyStateContainer.textView.text = getString(R.string.login_to_manage_bookmarks) emptyStateContainer.visibility = View.VISIBLE @@ -115,7 +119,7 @@ class BookmarksFragment : BaseFragment() { bookmarksEpoxyController?.setData(episodes) emptyStateContainer.visibility = View.GONE - progressBar.visibility = View.GONE + swipeRefreshLayoutBookmarks.isRefreshing = false epoxyRecyclerView.visibility = View.VISIBLE } diff --git a/app/src/main/res/layout/fragment_bookmarks.xml b/app/src/main/res/layout/fragment_bookmarks.xml index e07ce9f..13c4ec0 100644 --- a/app/src/main/res/layout/fragment_bookmarks.xml +++ b/app/src/main/res/layout/fragment_bookmarks.xml @@ -1,37 +1,33 @@ - + android:layout_height="match_parent"> - + tools:context=".MainActivity"> - + - + - + + \ No newline at end of file From 998b39dde4951d2fd8bb998256ce15f79b82098e Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 16 Jul 2019 09:00:33 -0300 Subject: [PATCH 02/32] layout reorganization --- .../feature/bookmarks/BookmarksFragment.kt | 6 +-- .../main/res/layout/fragment_bookmarks.xml | 38 +++++++++++-------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt b/app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt index e4cf6ff..c0e727d 100644 --- a/app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt +++ b/app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt @@ -98,7 +98,7 @@ class BookmarksFragment : BaseFragment() { private fun showLoading() { emptyStateContainer.visibility = View.GONE - epoxyRecyclerView.visibility = View.GONE + swipeRefreshLayoutBookmarks.visibility = View.GONE swipeRefreshLayoutBookmarks.isRefreshing = true } @@ -108,7 +108,7 @@ class BookmarksFragment : BaseFragment() { } private fun showLoginEmptyState() { - epoxyRecyclerView.visibility = View.GONE + swipeRefreshLayoutBookmarks.visibility = View.GONE swipeRefreshLayoutBookmarks.isRefreshing = false emptyStateContainer.textView.text = getString(R.string.login_to_manage_bookmarks) @@ -121,7 +121,7 @@ class BookmarksFragment : BaseFragment() { emptyStateContainer.visibility = View.GONE swipeRefreshLayoutBookmarks.isRefreshing = false - epoxyRecyclerView.visibility = View.VISIBLE + swipeRefreshLayoutBookmarks.visibility = View.VISIBLE } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_bookmarks.xml b/app/src/main/res/layout/fragment_bookmarks.xml index 13c4ec0..3399cae 100644 --- a/app/src/main/res/layout/fragment_bookmarks.xml +++ b/app/src/main/res/layout/fragment_bookmarks.xml @@ -1,20 +1,25 @@ - + android:layout_height="match_parent" + tools:context=".MainActivity"> - + - + + + - + - \ No newline at end of file From a7d2d9f5619ad891051b218d8083fef15b085945 Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 16 Jul 2019 13:36:40 -0300 Subject: [PATCH 03/32] renamed swipeToRefresh view. Moved the tool's visibility from epoxyRecycler to bookmarkSwipeToRefresh --- .../feature/bookmarks/BookmarksFragment.kt | 16 ++++++++-------- app/src/main/res/layout/fragment_bookmarks.xml | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt b/app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt index c0e727d..0f8f3be 100644 --- a/app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt +++ b/app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt @@ -62,7 +62,7 @@ class BookmarksFragment : BaseFragment() { epoxyRecyclerView.setController(this) } - swipeRefreshLayoutBookmarks.setOnRefreshListener { + bookmarksSwipeRefreshLayout.setOnRefreshListener { viewModel.fetchBookmarks() } @@ -98,18 +98,18 @@ class BookmarksFragment : BaseFragment() { private fun showLoading() { emptyStateContainer.visibility = View.GONE - swipeRefreshLayoutBookmarks.visibility = View.GONE + bookmarksSwipeRefreshLayout.visibility = View.GONE - swipeRefreshLayoutBookmarks.isRefreshing = true + bookmarksSwipeRefreshLayout.isRefreshing = true } private fun hideLoading() { - swipeRefreshLayoutBookmarks.isRefreshing = false + bookmarksSwipeRefreshLayout.isRefreshing = false } private fun showLoginEmptyState() { - swipeRefreshLayoutBookmarks.visibility = View.GONE - swipeRefreshLayoutBookmarks.isRefreshing = false + bookmarksSwipeRefreshLayout.visibility = View.GONE + bookmarksSwipeRefreshLayout.isRefreshing = false emptyStateContainer.textView.text = getString(R.string.login_to_manage_bookmarks) emptyStateContainer.visibility = View.VISIBLE @@ -119,9 +119,9 @@ class BookmarksFragment : BaseFragment() { bookmarksEpoxyController?.setData(episodes) emptyStateContainer.visibility = View.GONE - swipeRefreshLayoutBookmarks.isRefreshing = false + bookmarksSwipeRefreshLayout.isRefreshing = false - swipeRefreshLayoutBookmarks.visibility = View.VISIBLE + bookmarksSwipeRefreshLayout.visibility = View.VISIBLE } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_bookmarks.xml b/app/src/main/res/layout/fragment_bookmarks.xml index 3399cae..6a7df39 100644 --- a/app/src/main/res/layout/fragment_bookmarks.xml +++ b/app/src/main/res/layout/fragment_bookmarks.xml @@ -7,14 +7,15 @@ tools:context=".MainActivity"> + app:layout_constraintTop_toTopOf="parent" + tools:visibility="visible"> + tools:listitem="@layout/view_holder_bookmark" /> From b9b8ad4ab90c2e3864d8364644c8fa11f8d17619 Mon Sep 17 00:00:00 2001 From: Justin Terry Date: Mon, 5 Aug 2019 19:13:36 -0700 Subject: [PATCH 04/32] First commit. Added layout components and code necessary to upvote/downvote comments on episodes. --- .../feature/commentList/CommentsFragment.kt | 15 +++++++++++++ .../feature/commentList/CommentsViewModel.kt | 13 +++++++++++ .../epoxy/BaseCommentEpoxyModelWithHolder.kt | 6 +++++ .../epoxy/CommentEpoxyModelWithHolder.kt | 10 +++++++++ .../epoxy/CommentsEpoxyController.kt | 22 ++++++++++++++++++- .../epoxy/ReplyEpoxyModelWithHolder.kt | 22 +++++++++++++++++-- .../koalatea/sedaily/network/SEDailyApi.kt | 3 +++ .../sedaily/repository/CommentsRepository.kt | 12 ++++++++++ app/src/main/res/layout/merge_comment.xml | 20 +++++++++++++++-- .../main/res/layout/view_holder_comment.xml | 20 ++++++++++++++--- app/src/main/res/layout/view_holder_reply.xml | 19 ++++++++++++++++ app/src/main/res/values/strings.xml | 4 ++++ 12 files changed, 158 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/koalatea/sedaily/feature/commentList/CommentsFragment.kt b/app/src/main/java/com/koalatea/sedaily/feature/commentList/CommentsFragment.kt index bef2d68..138f263 100644 --- a/app/src/main/java/com/koalatea/sedaily/feature/commentList/CommentsFragment.kt +++ b/app/src/main/java/com/koalatea/sedaily/feature/commentList/CommentsFragment.kt @@ -20,6 +20,7 @@ import com.koalatea.sedaily.util.hideKeyboard import com.koalatea.sedaily.util.supportActionBar import kotlinx.android.synthetic.main.fragment_comments.* import kotlinx.android.synthetic.main.include_empty_state.view.* +import kotlinx.android.synthetic.main.view_holder_comment.* import org.koin.androidx.viewmodel.ext.android.viewModel private const val TAG_DIALOG_PROMPT_LOGIN = "prompt_login_dialog" @@ -51,6 +52,8 @@ class CommentsFragment : BaseFragment() { commentsEpoxyController = CommentsEpoxyController( replyClickListener = { comment -> viewModel.replyTo(comment) + }, upVoteClickListener = {comment -> + viewModel.upVoteComment(comment) } ).apply { epoxyRecyclerView.setController(this) @@ -63,6 +66,8 @@ class CommentsFragment : BaseFragment() { }) } + + addCommentButton.setOnClickListener { val comment = commentEditText.text?.trim()?.toString() ?: "" @@ -73,6 +78,16 @@ class CommentsFragment : BaseFragment() { viewModel.cancelReply() } + viewModel.commentVoteLiveData.observe(this, Observer { it.getContentIfNotHandled()?.let { resource -> + when (resource) { + is Resource.RequireLogin -> showPromptLoginDialog() + is Resource.Success -> { + viewModel.reloadComments(entityId) + } + } + } + }) + viewModel.commentsResource.observe(this, Observer { resource -> when (resource) { is Resource.Loading -> { diff --git a/app/src/main/java/com/koalatea/sedaily/feature/commentList/CommentsViewModel.kt b/app/src/main/java/com/koalatea/sedaily/feature/commentList/CommentsViewModel.kt index ed1142a..c826bb4 100644 --- a/app/src/main/java/com/koalatea/sedaily/feature/commentList/CommentsViewModel.kt +++ b/app/src/main/java/com/koalatea/sedaily/feature/commentList/CommentsViewModel.kt @@ -26,6 +26,10 @@ class CommentsViewModel( val replyToCommentLiveData: LiveData get() = _replyToCommentLiveData + private val _commentVoteLiveData = MutableLiveData>>() + val commentVoteLiveData: LiveData>> + get() = _commentVoteLiveData + private val _addCommentLiveData = MutableLiveData>>() val addCommentLiveData: LiveData>> get() = _addCommentLiveData @@ -42,6 +46,15 @@ class CommentsViewModel( entityIdLiveData.value = entityId } + @MainThread + fun upVoteComment(comment: Comment) = viewModelScope.launch { + + _addCommentLiveData.postValue(Event(Resource.Loading)) + val resource = commentsRepository.upVoteComment(comment._id) + _commentVoteLiveData.postValue(Event(resource)) + + } + @MainThread fun addComment(comment: String) = viewModelScope.launch { if (comment.isBlank()) return@launch diff --git a/app/src/main/java/com/koalatea/sedaily/feature/commentList/epoxy/BaseCommentEpoxyModelWithHolder.kt b/app/src/main/java/com/koalatea/sedaily/feature/commentList/epoxy/BaseCommentEpoxyModelWithHolder.kt index 9596b90..1d7d961 100644 --- a/app/src/main/java/com/koalatea/sedaily/feature/commentList/epoxy/BaseCommentEpoxyModelWithHolder.kt +++ b/app/src/main/java/com/koalatea/sedaily/feature/commentList/epoxy/BaseCommentEpoxyModelWithHolder.kt @@ -21,6 +21,7 @@ abstract class BaseCommentEpoxyModelWithHolder : Epox @EpoxyAttribute lateinit var authorName: String @EpoxyAttribute lateinit var comment: String @EpoxyAttribute var date: Date? = null + @EpoxyAttribute var score: Int? = 0 @CallSuper override fun bind(holder: Holder) { @@ -35,6 +36,10 @@ abstract class BaseCommentEpoxyModelWithHolder : Epox holder.authorNameTextView.text = authorName holder.commentTextView.text = comment + holder.scoreTextView.text = score.toString() + + + date?.let { holder.dateTextView.text = DateFormat.getDateFormat(context).format(date) @@ -51,4 +56,5 @@ abstract class BaseCommentHolder : KotlinEpoxyHolder() { val authorNameTextView by bind(R.id.authorNameTextView) val commentTextView by bind(R.id.commentTextView) val dateTextView by bind(R.id.dateTextView) + val scoreTextView by bind(R.id.scoreTextView) } \ No newline at end of file diff --git a/app/src/main/java/com/koalatea/sedaily/feature/commentList/epoxy/CommentEpoxyModelWithHolder.kt b/app/src/main/java/com/koalatea/sedaily/feature/commentList/epoxy/CommentEpoxyModelWithHolder.kt index ea7a2a8..1dad79d 100644 --- a/app/src/main/java/com/koalatea/sedaily/feature/commentList/epoxy/CommentEpoxyModelWithHolder.kt +++ b/app/src/main/java/com/koalatea/sedaily/feature/commentList/epoxy/CommentEpoxyModelWithHolder.kt @@ -1,6 +1,8 @@ package com.koalatea.sedaily.feature.commentList.epoxy +import android.graphics.Typeface import android.widget.Button +import android.widget.TextView import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import com.koalatea.sedaily.R @@ -9,15 +11,23 @@ import com.koalatea.sedaily.R abstract class CommentEpoxyModelWithHolder : BaseCommentEpoxyModelWithHolder() { @EpoxyAttribute lateinit var replyClickListener: () -> Unit + @EpoxyAttribute lateinit var upVoteClickListener: () -> Unit + @EpoxyAttribute var textWeight: Int = Typeface.NORMAL + override fun bind(holder: CommentHolder) { super.bind(holder) holder.replayButton.setOnClickListener { replyClickListener() } + holder.upVoteButton.setOnClickListener { upVoteClickListener() } + + holder.upVoteButton.setTypeface(null, textWeight) + } } class CommentHolder : BaseCommentHolder() { val replayButton by bind