feat: activity clicking

This commit is contained in:
rebelonion 2024-03-15 05:55:46 -05:00
parent b69e466853
commit c5abfa15e0
6 changed files with 89 additions and 21 deletions

View file

@ -133,6 +133,7 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene
) )
true true
} }
R.id.action_view_followers -> { R.id.action_view_followers -> {
ContextCompat.startActivity( ContextCompat.startActivity(
this@ProfileActivity, this@ProfileActivity,
@ -143,10 +144,12 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene
) )
true true
} }
R.id.action_view_on_anilist -> { R.id.action_view_on_anilist -> {
openLinkInBrowser("https://anilist.co/user/${user.name}") openLinkInBrowser("https://anilist.co/user/${user.name}")
true true
} }
else -> false else -> false
} }
} }
@ -214,7 +217,8 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene
isCollapsed = false isCollapsed = false
ObjectAnimator.ofFloat(binding.profileUserDataContainer, "translationX", 0f) ObjectAnimator.ofFloat(binding.profileUserDataContainer, "translationX", 0f)
.setDuration(duration).start() .setDuration(duration).start()
ObjectAnimator.ofFloat(binding.profileUserAvatarContainer, "translationX", 0f).setDuration(duration) ObjectAnimator.ofFloat(binding.profileUserAvatarContainer, "translationX", 0f)
.setDuration(duration)
.start() .start()
if (PrefManager.getVal(PrefName.BannerAnimations)) binding.profileBannerImage.resume() if (PrefManager.getVal(PrefName.BannerAnimations)) binding.profileBannerImage.resume()
} }

View file

@ -46,7 +46,9 @@ class ActivityItem(
false false
) )
binding.activityUserName.text = activity.user?.name ?: activity.messenger?.name binding.activityUserName.text = activity.user?.name ?: activity.messenger?.name
binding.activityUserAvatar.loadImage(activity.user?.avatar?.medium ?: activity.messenger?.avatar?.medium) binding.activityUserAvatar.loadImage(
activity.user?.avatar?.medium ?: activity.messenger?.avatar?.medium
)
binding.activityTime.text = ActivityItemBuilder.getDateTime(activity.createdAt) binding.activityTime.text = ActivityItemBuilder.getDateTime(activity.createdAt)
val likeColor = ContextCompat.getColor(binding.root.context, R.color.yt_red) val likeColor = ContextCompat.getColor(binding.root.context, R.color.yt_red)
val notLikeColor = ContextCompat.getColor(binding.root.context, R.color.bg_opp) val notLikeColor = ContextCompat.getColor(binding.root.context, R.color.bg_opp)
@ -56,12 +58,19 @@ class ActivityItem(
binding.commentRepliesContainer.setOnClickListener { binding.commentRepliesContainer.setOnClickListener {
when (binding.activityReplies.visibility) { when (binding.activityReplies.visibility) {
View.GONE -> { View.GONE -> {
repliesAdapter.addAll( val replyItems = activity.replies?.map {
activity.replies?.map { ActivityReplyItem(it) } ?: emptyList() ActivityReplyItem(it) { id, type ->
) clickCallback(
id,
type
)
}
} ?: emptyList()
repliesAdapter.addAll(replyItems)
binding.activityReplies.visibility = View.VISIBLE binding.activityReplies.visibility = View.VISIBLE
binding.commentTotalReplies.text = "Hide replies" binding.commentTotalReplies.text = "Hide replies"
} }
else -> { else -> {
repliesAdapter.clear() repliesAdapter.clear()
binding.activityReplies.visibility = View.GONE binding.activityReplies.visibility = View.GONE
@ -70,7 +79,7 @@ class ActivityItem(
} }
} }
} }
binding.activityLikeCount.text = (activity.likeCount?:0).toString() binding.activityLikeCount.text = (activity.likeCount ?: 0).toString()
binding.activityLike.setOnClickListener { binding.activityLike.setOnClickListener {
val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
scope.launch { scope.launch {
@ -83,7 +92,7 @@ class ActivityItem(
} else { } else {
activity.likeCount = activity.likeCount?.plus(1) activity.likeCount = activity.likeCount?.plus(1)
} }
binding.activityLikeCount.text = (activity.likeCount?:0).toString() binding.activityLikeCount.text = (activity.likeCount ?: 0).toString()
activity.isLiked = !activity.isLiked!! activity.isLiked = !activity.isLiked!!
binding.activityLike.setColorFilter(if (activity.isLiked == true) likeColor else notLikeColor) binding.activityLike.setColorFilter(if (activity.isLiked == true) likeColor else notLikeColor)
@ -107,7 +116,18 @@ class ActivityItem(
"""${activity.user!!.name} ${activity.status} ${activity.progress ?: ""}""" """${activity.user!!.name} ${activity.status} ${activity.progress ?: ""}"""
binding.activityCover.loadImage(cover) binding.activityCover.loadImage(cover)
blurImage(binding.activityBannerImage, banner ?: cover) blurImage(binding.activityBannerImage, banner ?: cover)
binding.activityAvatarContainer.setOnClickListener {
clickCallback(activity.userId ?: -1, "USER")
}
binding.activityUserName.setOnClickListener {
clickCallback(activity.userId ?: -1, "USER")
}
binding.activityCoverContainer.setOnClickListener {
clickCallback(activity.media?.id ?: -1, "MEDIA")
}
binding.activityMediaName.setOnClickListener {
clickCallback(activity.media?.id ?: -1, "MEDIA")
}
} }
"TextActivity" -> { "TextActivity" -> {
@ -115,7 +135,16 @@ class ActivityItem(
binding.activityContent.visibility = View.VISIBLE binding.activityContent.visibility = View.VISIBLE
if (!(context as android.app.Activity).isDestroyed) { if (!(context as android.app.Activity).isDestroyed) {
val markwon = buildMarkwon(context, false) val markwon = buildMarkwon(context, false)
markwon.setMarkdown(binding.activityContent, getBasicAniHTML(activity.text ?: "")) markwon.setMarkdown(
binding.activityContent,
getBasicAniHTML(activity.text ?: "")
)
}
binding.activityAvatarContainer.setOnClickListener {
clickCallback(activity.userId ?: -1, "USER")
}
binding.activityUserName.setOnClickListener {
clickCallback(activity.userId ?: -1, "USER")
} }
} }
@ -124,7 +153,16 @@ class ActivityItem(
binding.activityContent.visibility = View.VISIBLE binding.activityContent.visibility = View.VISIBLE
if (!(context as android.app.Activity).isDestroyed) { if (!(context as android.app.Activity).isDestroyed) {
val markwon = buildMarkwon(context, false) val markwon = buildMarkwon(context, false)
markwon.setMarkdown(binding.activityContent, getBasicAniHTML(activity.message ?: "")) markwon.setMarkdown(
binding.activityContent,
getBasicAniHTML(activity.message ?: "")
)
}
binding.activityAvatarContainer.setOnClickListener {
clickCallback(activity.messengerId ?: -1, "USER")
}
binding.activityUserName.setOnClickListener {
clickCallback(activity.messengerId ?: -1, "USER")
} }
} }
} }

View file

@ -11,7 +11,8 @@ import ani.dantotsu.util.AniMarkdown.Companion.getBasicAniHTML
import com.xwray.groupie.viewbinding.BindableItem import com.xwray.groupie.viewbinding.BindableItem
class ActivityReplyItem( class ActivityReplyItem(
private val reply: ActivityReply private val reply: ActivityReply,
private val clickCallback: (Int, type: String) -> Unit
) : BindableItem<ItemActivityReplyBinding>() { ) : BindableItem<ItemActivityReplyBinding>() {
private lateinit var binding: ItemActivityReplyBinding private lateinit var binding: ItemActivityReplyBinding
@ -27,7 +28,12 @@ class ActivityReplyItem(
binding.activityLike.setColorFilter(if (reply.isLiked) likeColor else notLikeColor) binding.activityLike.setColorFilter(if (reply.isLiked) likeColor else notLikeColor)
val markwon = buildMarkwon(binding.root.context) val markwon = buildMarkwon(binding.root.context)
markwon.setMarkdown(binding.activityContent, getBasicAniHTML(reply.text)) markwon.setMarkdown(binding.activityContent, getBasicAniHTML(reply.text))
binding.activityAvatarContainer.setOnClickListener {
clickCallback(reply.userId, "USER")
}
binding.activityUserName.setOnClickListener {
clickCallback(reply.userId, "USER")
}
} }
override fun getLayout(): Int { override fun getLayout(): Int {

View file

@ -16,7 +16,7 @@ import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import nl.joery.animatedbottombar.AnimatedBottomBar import nl.joery.animatedbottombar.AnimatedBottomBar
class FeedActivity: AppCompatActivity() { class FeedActivity : AppCompatActivity() {
private lateinit var binding: ActivityFeedBinding private lateinit var binding: ActivityFeedBinding
private var selected: Int = 0 private var selected: Int = 0
private lateinit var navBar: AnimatedBottomBar private lateinit var navBar: AnimatedBottomBar
@ -33,14 +33,15 @@ class FeedActivity: AppCompatActivity() {
val globalTab = navBar.createTab(R.drawable.ic_globe_24, "Global") val globalTab = navBar.createTab(R.drawable.ic_globe_24, "Global")
navBar.addTab(personalTab) navBar.addTab(personalTab)
navBar.addTab(globalTab) navBar.addTab(globalTab)
binding.listTitle.text = "Activities" binding.listTitle.text = getString(R.string.activities)
binding.feedViewPager.updateLayoutParams<ViewGroup.MarginLayoutParams> { binding.feedViewPager.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin += navBarHeight bottomMargin += navBarHeight
topMargin += statusBarHeight topMargin += statusBarHeight
} }
binding.listToolbar.updateLayoutParams<ViewGroup.MarginLayoutParams> { topMargin += statusBarHeight } binding.listToolbar.updateLayoutParams<ViewGroup.MarginLayoutParams> { topMargin += statusBarHeight }
val activityId = intent.getIntExtra("activityId", -1) val activityId = intent.getIntExtra("activityId", -1)
binding.feedViewPager.adapter = ViewPagerAdapter(supportFragmentManager, lifecycle, activityId) binding.feedViewPager.adapter =
ViewPagerAdapter(supportFragmentManager, lifecycle, activityId)
binding.feedViewPager.setCurrentItem(selected, false) binding.feedViewPager.setCurrentItem(selected, false)
binding.feedViewPager.isUserInputEnabled = false binding.feedViewPager.isUserInputEnabled = false
navBar.selectTabAt(selected) navBar.selectTabAt(selected)
@ -65,7 +66,6 @@ class FeedActivity: AppCompatActivity() {
navBar.selectTabAt(selected) navBar.selectTabAt(selected)
} }
private class ViewPagerAdapter( private class ViewPagerAdapter(
fragmentManager: FragmentManager, fragmentManager: FragmentManager,
lifecycle: Lifecycle, lifecycle: Lifecycle,

View file

@ -1,11 +1,13 @@
package ani.dantotsu.profile.activity package ani.dantotsu.profile.activity
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MotionEvent import android.view.MotionEvent
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
@ -14,7 +16,7 @@ import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.connections.anilist.AnilistQueries import ani.dantotsu.connections.anilist.AnilistQueries
import ani.dantotsu.connections.anilist.api.Activity import ani.dantotsu.connections.anilist.api.Activity
import ani.dantotsu.databinding.FragmentFeedBinding import ani.dantotsu.databinding.FragmentFeedBinding
import ani.dantotsu.util.Logger import ani.dantotsu.media.MediaDetailsActivity
import ani.dantotsu.profile.ProfileActivity import ani.dantotsu.profile.ProfileActivity
import ani.dantotsu.snackString import ani.dantotsu.snackString
import com.xwray.groupie.GroupieAdapter import com.xwray.groupie.GroupieAdapter
@ -70,7 +72,7 @@ class FeedFragment : Fragment() {
val filtered = activityList.filterNot { //filter out messages that are not directed to the user val filtered = activityList.filterNot { //filter out messages that are not directed to the user
it.recipient?.id != null && it.recipient.id != Anilist.userid it.recipient?.id != null && it.recipient.id != Anilist.userid
} }
adapter.update(filtered.map { ActivityItem(it) { _, _ -> } }) adapter.update(filtered.map { ActivityItem(it, ::onActivityClick) })
} }
binding.listProgressBar.visibility = ViewGroup.GONE binding.listProgressBar.visibility = ViewGroup.GONE
val scrollView = binding.listRecyclerView val scrollView = binding.listRecyclerView
@ -86,14 +88,14 @@ class FeedFragment : Fragment() {
page++ page++
binding.feedRefresh.visibility = ViewGroup.VISIBLE binding.feedRefresh.visibility = ViewGroup.VISIBLE
activity.lifecycleScope.launch(Dispatchers.IO) { activity.lifecycleScope.launch(Dispatchers.IO) {
val res = Anilist.query.getFeed(userId, global, page) val newRes = Anilist.query.getFeed(userId, global, page)
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
res?.data?.page?.activities?.let { activities -> newRes?.data?.page?.activities?.let { activities ->
activityList += activities activityList += activities
val filtered = activities.filterNot { val filtered = activities.filterNot {
it.recipient?.id != null && it.recipient.id != Anilist.userid it.recipient?.id != null && it.recipient.id != Anilist.userid
} }
adapter.addAll(filtered.map { ActivityItem(it) { _, _ -> } }) adapter.addAll(filtered.map { ActivityItem(it, ::onActivityClick) })
} }
binding.feedRefresh.visibility = ViewGroup.GONE binding.feedRefresh.visibility = ViewGroup.GONE
} }
@ -109,6 +111,23 @@ class FeedFragment : Fragment() {
} }
} }
private fun onActivityClick(id: Int, type: String) {
when (type) {
"USER" -> {
ContextCompat.startActivity(
activity, Intent(activity, ProfileActivity::class.java)
.putExtra("userId", id), null
)
}
"MEDIA" -> {
ContextCompat.startActivity(
activity, Intent(activity, MediaDetailsActivity::class.java)
.putExtra("mediaId", id), null
)
}
}
}
companion object { companion object {
fun newInstance(userId: Int?, global: Boolean, activityId: Int): FeedFragment { fun newInstance(userId: Int?, global: Boolean, activityId: Int): FeedFragment {
val fragment = FeedFragment() val fragment = FeedFragment()

View file

@ -703,4 +703,5 @@ Non quae tempore quo provident laudantium qui illo dolor vel quia dolor et exerc
<string name="anilist_notification_filters">Anilist Notification Filters</string> <string name="anilist_notification_filters">Anilist Notification Filters</string>
<string name="anilist_notifications_checking_time">Anilist notifications update frequency : %1$s</string> <string name="anilist_notifications_checking_time">Anilist notifications update frequency : %1$s</string>
<string name="comment_notification_checking_time">Comment notifications update frequency : %1$s</string> <string name="comment_notification_checking_time">Comment notifications update frequency : %1$s</string>
<string name="activities">Activities</string>
</resources> </resources>