From 114be6fe5a1ec67d7d075090e7dd24c06e8324b3 Mon Sep 17 00:00:00 2001 From: aayush262 Date: Sun, 19 May 2024 14:47:43 +0530 Subject: [PATCH] fix: review rework --- .../ani/dantotsu/home/status/CircleView.kt | 3 +- .../java/ani/dantotsu/home/status/Stories.kt | 2 +- .../java/ani/dantotsu/media/ReviewActivity.kt | 33 +--- .../java/ani/dantotsu/media/ReviewAdapter.kt | 129 +++++++++++++ .../main/res/layout/activity_review_view.xml | 1 + app/src/main/res/layout/item_developer.xml | 6 +- app/src/main/res/layout/item_reviews.xml | 182 ++++++++++++++++++ 7 files changed, 326 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/ani/dantotsu/media/ReviewAdapter.kt create mode 100644 app/src/main/res/layout/item_reviews.xml diff --git a/app/src/main/java/ani/dantotsu/home/status/CircleView.kt b/app/src/main/java/ani/dantotsu/home/status/CircleView.kt index 2a7c02d9..63986d83 100644 --- a/app/src/main/java/ani/dantotsu/home/status/CircleView.kt +++ b/app/src/main/java/ani/dantotsu/home/status/CircleView.kt @@ -12,13 +12,14 @@ import ani.dantotsu.getThemeColor class CircleView(context: Context, attrs: AttributeSet?) : View(context, attrs) { private var parts: Int = 3 - private var gapAngle: Float = 9f + private var gapAngle: Float = 12f private val path = Path() private var isUser = false private var booleanList = listOf() private val paint: Paint = Paint(Paint.ANTI_ALIAS_FLAG).apply { style = Paint.Style.STROKE strokeWidth = 6f + strokeCap = Paint.Cap.ROUND } @SuppressLint("DrawAllocation") diff --git a/app/src/main/java/ani/dantotsu/home/status/Stories.kt b/app/src/main/java/ani/dantotsu/home/status/Stories.kt index 2779eff5..7f2c60ec 100644 --- a/app/src/main/java/ani/dantotsu/home/status/Stories.kt +++ b/app/src/main/java/ani/dantotsu/home/status/Stories.kt @@ -462,7 +462,7 @@ class Stories @JvmOverloads constructor( binding.activityLike.setColorFilter(if (story.isLiked == true) likeColor else notLikeColor) binding.replyCount.text = story.replyCount.toString() binding.activityLikeCount.text = story.likeCount.toString() - binding.activityLike.setColorFilter(ContextCompat.getColor(context, R.color.bg_opp)) + binding.activityReplies.setColorFilter(ContextCompat.getColor(context, R.color.bg_opp)) binding.activityLikeContainer.setOnClickListener { like() } diff --git a/app/src/main/java/ani/dantotsu/media/ReviewActivity.kt b/app/src/main/java/ani/dantotsu/media/ReviewActivity.kt index b4631db4..8f3c3b12 100644 --- a/app/src/main/java/ani/dantotsu/media/ReviewActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/ReviewActivity.kt @@ -77,7 +77,7 @@ class ReviewActivity : AppCompatActivity() { binding.listBack.setOnClickListener { onBackPressedDispatcher.onBackPressed() } lifecycleScope.launch(Dispatchers.IO) { - val response = Anilist.query.getReviews(mediaId) + val response = Anilist.query.getReviews(mediaId)?.data?.page withContext(Dispatchers.Main) { binding.listProgressBar.visibility = View.GONE binding.listRecyclerView.setOnTouchListener { _, event -> @@ -94,9 +94,9 @@ class ReviewActivity : AppCompatActivity() { } false } - currentPage = response?.data?.page?.pageInfo?.currentPage ?: 1 - hasNextPage = response?.data?.page?.pageInfo?.hasNextPage ?: false - response?.data?.page?.reviews?.let { + currentPage = response?.pageInfo?.currentPage ?: 1 + hasNextPage = response?.pageInfo?.hasNextPage ?: false + response?.reviews?.let { reviews.addAll(it) fillList() } @@ -122,29 +122,10 @@ class ReviewActivity : AppCompatActivity() { private fun fillList() { adapter.clear() reviews.forEach { - val username = it.user?.name ?: "Unknown" - val name = SpannableString(username + " - " + it.score) - //change the size of the score - name.setSpan( - android.text.style.RelativeSizeSpan(0.9f), - 0, - name.length, - android.text.Spannable.SPAN_EXCLUSIVE_EXCLUSIVE - ) - //give the text an underline - name.setSpan( - android.text.style.UnderlineSpan(), - username.length + 3, - name.length, - android.text.Spannable.SPAN_EXCLUSIVE_EXCLUSIVE - ) adapter.add( - FollowerItem( - it.id, - name, - it.user?.avatar?.medium, - it.user?.bannerImage, - it.summary, + ReviewAdapter( + it, + this, this::onUserClick ) ) diff --git a/app/src/main/java/ani/dantotsu/media/ReviewAdapter.kt b/app/src/main/java/ani/dantotsu/media/ReviewAdapter.kt new file mode 100644 index 00000000..1f8034d3 --- /dev/null +++ b/app/src/main/java/ani/dantotsu/media/ReviewAdapter.kt @@ -0,0 +1,129 @@ +package ani.dantotsu.media + + +import android.content.Context +import android.text.SpannableString +import android.view.View +import androidx.lifecycle.lifecycleScope +import ani.dantotsu.R +import ani.dantotsu.blurImage +import ani.dantotsu.connections.anilist.Anilist +import ani.dantotsu.connections.anilist.api.Query +import ani.dantotsu.databinding.ItemFollowerBinding +import ani.dantotsu.databinding.ItemReviewsBinding +import ani.dantotsu.getThemeColor +import ani.dantotsu.loadImage +import ani.dantotsu.profile.activity.ActivityItemBuilder +import ani.dantotsu.toast +import com.xwray.groupie.viewbinding.BindableItem +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class ReviewAdapter( + private var review: Query.Review, + val context: ReviewActivity, + val clickCallback: (Int) -> Unit + +) : BindableItem() { + private lateinit var binding: ItemReviewsBinding + + override fun bind(viewBinding: ItemReviewsBinding, position: Int) { + binding = viewBinding + binding.reviewUserName.text = review.user?.name + binding.reviewUserAvatar.loadImage(review.user?.avatar?.medium) + binding.reviewText.text = review.summary + binding.reviewPostTime.text = ActivityItemBuilder.getDateTime(review.createdAt) + binding.reviewTag.text = "[${review.score}]" + binding.root.setOnClickListener { clickCallback(review.id) } + userVote(review.userRating) + enableVote() + binding.reviewTotalVotes.text = review.rating.toString() + } + + override fun getLayout(): Int { + return R.layout.item_reviews + } + + override fun initializeViewBinding(view: View): ItemReviewsBinding { + return ItemReviewsBinding.bind(view) + } + private fun userVote(type: String) { + when (type) { + "NO_VOTE" -> { + binding.reviewUpVote.setImageResource(R.drawable.ic_round_upvote_inactive_24) + binding.reviewDownVote.setImageResource(R.drawable.ic_round_upvote_inactive_24) + binding.reviewUpVote.alpha = 0.6f + binding.reviewDownVote.alpha = 0.6f + } + + "UP_VOTE" -> { + binding.reviewUpVote.setImageResource(R.drawable.ic_round_upvote_active_24) + binding.reviewDownVote.setImageResource(R.drawable.ic_round_upvote_inactive_24) + binding.reviewUpVote.alpha = 1f + binding.reviewDownVote.alpha = 0.6f + } + + "DOWN_VOTE" -> { + binding.reviewUpVote.setImageResource(R.drawable.ic_round_upvote_inactive_24) + binding.reviewDownVote.setImageResource(R.drawable.ic_round_upvote_active_24) + binding.reviewDownVote.alpha = 1f + binding.reviewUpVote.alpha = 0.6f + } + } + } + + private fun rateReview(rating: String) { + disableVote() + context.lifecycleScope.launch { + val result = Anilist.mutation.rateReview(review.id, rating) + if (result != null) { + withContext(Dispatchers.Main) { + val res = result.data.rateReview + review.rating = res.rating + review.ratingAmount = res.ratingAmount + review.userRating = res.userRating + userVote(review.userRating) + binding.reviewTotalVotes.text = review.rating.toString() + userVote(review.userRating) + enableVote() + } + } else { + withContext(Dispatchers.Main) { + toast( + context.getString(R.string.error_message, "response is null") + ) + enableVote() + } + } + } + } + + private fun disableVote() { + binding.reviewUpVote.setOnClickListener(null) + binding.reviewDownVote.setOnClickListener(null) + binding.reviewUpVote.isEnabled = false + binding.reviewDownVote.isEnabled = false + } + + private fun enableVote() { + binding.reviewUpVote.setOnClickListener { + if (review.userRating == "UP_VOTE") { + rateReview("NO_VOTE") + } else { + rateReview("UP_VOTE") + } + disableVote() + } + binding.reviewDownVote.setOnClickListener { + if (review.userRating == "DOWN_VOTE") { + rateReview("NO_VOTE") + } else { + rateReview("DOWN_VOTE") + } + disableVote() + } + binding.reviewUpVote.isEnabled = true + binding.reviewDownVote.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_review_view.xml b/app/src/main/res/layout/activity_review_view.xml index 6732d8f9..8ae33dc4 100644 --- a/app/src/main/res/layout/activity_review_view.xml +++ b/app/src/main/res/layout/activity_review_view.xml @@ -2,6 +2,7 @@ diff --git a/app/src/main/res/layout/item_developer.xml b/app/src/main/res/layout/item_developer.xml index c4c87d7b..d695edec 100644 --- a/app/src/main/res/layout/item_developer.xml +++ b/app/src/main/res/layout/item_developer.xml @@ -28,7 +28,7 @@ + android:text="@string/lorem_ipsum" + android:maxLines="2" + android:fontFamily="@font/poppins_semi_bold" /> diff --git a/app/src/main/res/layout/item_reviews.xml b/app/src/main/res/layout/item_reviews.xml new file mode 100644 index 00000000..0d2d5832 --- /dev/null +++ b/app/src/main/res/layout/item_reviews.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file