feat: activity replies

This commit is contained in:
rebelonion 2024-03-11 04:28:13 -05:00
parent a35887d4ac
commit 408737d510
6 changed files with 182 additions and 5 deletions

View file

@ -1110,7 +1110,7 @@ fun logToFile(context: Context, message: String) {
* Builds the markwon instance with all the plugins
* @return the markwon instance
*/
fun buildMarkwon(activity: Activity, userInputContent: Boolean = true): Markwon {
fun buildMarkwon(activity: Context, userInputContent: Boolean = true): Markwon {
val markwon = Markwon.builder(activity)
.usePlugin(object : AbstractMarkwonPlugin() {
override fun configureConfiguration(builder: MarkwonConfiguration.Builder) {

View file

@ -70,13 +70,13 @@ data class Activity(
@SerialName("media")
val media: Media?,
@SerialName("replies")
val replies: List<Reply>?,
val replies: List<ActivityReply>?,
@SerialName("likes")
val likes: List<User>?,
) : java.io.Serializable
@Serializable
data class Reply(
data class ActivityReply(
@SerialName("id")
val id: Int,
@SerialName("userId")

View file

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.content.Context
import android.view.View
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.LinearLayoutManager
import ani.dantotsu.R
import ani.dantotsu.buildMarkwon
import ani.dantotsu.connections.anilist.Anilist
@ -16,6 +17,7 @@ import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.model.GlideUrl
import com.bumptech.glide.request.RequestOptions
import com.xwray.groupie.GroupieAdapter
import com.xwray.groupie.viewbinding.BindableItem
import jp.wasabeef.glide.transformations.BlurTransformation
import kotlinx.coroutines.CoroutineScope
@ -29,11 +31,19 @@ class ActivityItem(
val clickCallback: (Int, type: String) -> Unit
) : BindableItem<ItemActivityBinding>() {
private lateinit var binding: ItemActivityBinding
private lateinit var repliesAdapter: GroupieAdapter
@SuppressLint("SetTextI18n")
override fun bind(viewBinding: ItemActivityBinding, position: Int) {
binding = viewBinding
repliesAdapter = GroupieAdapter()
binding.activityReplies.adapter = repliesAdapter
binding.activityReplies.layoutManager = LinearLayoutManager(
binding.root.context,
LinearLayoutManager.VERTICAL,
false
)
binding.activityUserName.text = activity.user?.name ?: activity.messenger?.name
binding.activityUserAvatar.loadImage(activity.user?.avatar?.medium ?: activity.messenger?.avatar?.medium)
binding.activityTime.text = ActivityItemBuilder.getDateTime(activity.createdAt)
@ -42,8 +52,24 @@ class ActivityItem(
binding.activityLike.setColorFilter(if (activity.isLiked == true) likeColor else notLikeColor)
binding.commentRepliesContainer.visibility =
if (activity.replyCount > 0) View.VISIBLE else View.GONE
binding.activityLikeCount.text = (activity.likeCount?:0).toString()
binding.commentRepliesContainer.setOnClickListener {
when (binding.activityReplies.visibility) {
View.GONE -> {
repliesAdapter.addAll(
activity.replies?.map { ActivityReplyItem(it) } ?: emptyList()
)
binding.activityReplies.visibility = View.VISIBLE
binding.commentTotalReplies.text = "Hide replies"
}
else -> {
repliesAdapter.clear()
binding.activityReplies.visibility = View.GONE
binding.commentTotalReplies.text = "View replies"
}
}
}
binding.activityLikeCount.text = (activity.likeCount?:0).toString()
binding.activityLike.setOnClickListener {
val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
scope.launch {
@ -106,7 +132,7 @@ class ActivityItem(
binding.activityContent.visibility = View.VISIBLE
if (!(context as android.app.Activity).isDestroyed) {
val markwon = buildMarkwon(context, false)
markwon.setMarkdown(binding.activityContent, activity.message ?: "")
markwon.setMarkdown(binding.activityContent, getBasicAniHTML(activity.message ?: ""))
}
}
}

View file

@ -0,0 +1,40 @@
package ani.dantotsu.profile.activity
import android.view.View
import androidx.core.content.ContextCompat
import ani.dantotsu.R
import ani.dantotsu.buildMarkwon
import ani.dantotsu.connections.anilist.api.ActivityReply
import ani.dantotsu.databinding.ItemActivityReplyBinding
import ani.dantotsu.loadImage
import ani.dantotsu.util.AniMarkdown.Companion.getBasicAniHTML
import com.xwray.groupie.viewbinding.BindableItem
class ActivityReplyItem(
private val reply: ActivityReply
) : BindableItem<ItemActivityReplyBinding>() {
private lateinit var binding: ItemActivityReplyBinding
override fun bind(viewBinding: ItemActivityReplyBinding, position: Int) {
binding = viewBinding
binding.activityUserAvatar.loadImage(reply.user.avatar?.medium)
binding.activityUserName.text = reply.user.name
binding.activityTime.text = ActivityItemBuilder.getDateTime(reply.createdAt)
binding.activityLikeCount.text = reply.likeCount.toString()
val likeColor = ContextCompat.getColor(binding.root.context, R.color.yt_red)
val notLikeColor = ContextCompat.getColor(binding.root.context, R.color.bg_opp)
binding.activityLike.setColorFilter(if (reply.isLiked) likeColor else notLikeColor)
val markwon = buildMarkwon(binding.root.context)
markwon.setMarkdown(binding.activityContent, getBasicAniHTML(reply.text))
}
override fun getLayout(): Int {
return R.layout.item_activity_reply
}
override fun initializeViewBinding(view: View): ItemActivityReplyBinding {
return ItemActivityReplyBinding.bind(view)
}
}