diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt index e3142cd1..8f2f2a8f 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt @@ -133,6 +133,7 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene ) true } + R.id.action_view_followers -> { ContextCompat.startActivity( this@ProfileActivity, @@ -143,10 +144,12 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene ) true } + R.id.action_view_on_anilist -> { openLinkInBrowser("https://anilist.co/user/${user.name}") true } + else -> false } } @@ -214,7 +217,8 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene isCollapsed = false ObjectAnimator.ofFloat(binding.profileUserDataContainer, "translationX", 0f) .setDuration(duration).start() - ObjectAnimator.ofFloat(binding.profileUserAvatarContainer, "translationX", 0f).setDuration(duration) + ObjectAnimator.ofFloat(binding.profileUserAvatarContainer, "translationX", 0f) + .setDuration(duration) .start() if (PrefManager.getVal(PrefName.BannerAnimations)) binding.profileBannerImage.resume() } diff --git a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt index acf00143..60800c07 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt @@ -46,7 +46,9 @@ class ActivityItem( false ) 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) val likeColor = ContextCompat.getColor(binding.root.context, R.color.yt_red) val notLikeColor = ContextCompat.getColor(binding.root.context, R.color.bg_opp) @@ -56,12 +58,19 @@ class ActivityItem( binding.commentRepliesContainer.setOnClickListener { when (binding.activityReplies.visibility) { View.GONE -> { - repliesAdapter.addAll( - activity.replies?.map { ActivityReplyItem(it) } ?: emptyList() - ) + val replyItems = activity.replies?.map { + ActivityReplyItem(it) { id, type -> + clickCallback( + id, + type + ) + } + } ?: emptyList() + repliesAdapter.addAll(replyItems) binding.activityReplies.visibility = View.VISIBLE binding.commentTotalReplies.text = "Hide replies" } + else -> { repliesAdapter.clear() 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 { val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) scope.launch { @@ -83,7 +92,7 @@ class ActivityItem( } else { activity.likeCount = activity.likeCount?.plus(1) } - binding.activityLikeCount.text = (activity.likeCount?:0).toString() + binding.activityLikeCount.text = (activity.likeCount ?: 0).toString() activity.isLiked = !activity.isLiked!! binding.activityLike.setColorFilter(if (activity.isLiked == true) likeColor else notLikeColor) @@ -107,7 +116,18 @@ class ActivityItem( """${activity.user!!.name} ${activity.status} ${activity.progress ?: ""}""" binding.activityCover.loadImage(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" -> { @@ -115,7 +135,16 @@ class ActivityItem( binding.activityContent.visibility = View.VISIBLE if (!(context as android.app.Activity).isDestroyed) { 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 if (!(context as android.app.Activity).isDestroyed) { 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") } } } diff --git a/app/src/main/java/ani/dantotsu/profile/activity/ActivityReplyItem.kt b/app/src/main/java/ani/dantotsu/profile/activity/ActivityReplyItem.kt index 40d3192a..b5b7aa89 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/ActivityReplyItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/ActivityReplyItem.kt @@ -11,7 +11,8 @@ import ani.dantotsu.util.AniMarkdown.Companion.getBasicAniHTML import com.xwray.groupie.viewbinding.BindableItem class ActivityReplyItem( - private val reply: ActivityReply + private val reply: ActivityReply, + private val clickCallback: (Int, type: String) -> Unit ) : BindableItem() { private lateinit var binding: ItemActivityReplyBinding @@ -27,7 +28,12 @@ class ActivityReplyItem( binding.activityLike.setColorFilter(if (reply.isLiked) likeColor else notLikeColor) val markwon = buildMarkwon(binding.root.context) 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 { diff --git a/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt b/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt index 3cea775c..98f0492b 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt @@ -16,7 +16,7 @@ import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager import nl.joery.animatedbottombar.AnimatedBottomBar -class FeedActivity: AppCompatActivity() { +class FeedActivity : AppCompatActivity() { private lateinit var binding: ActivityFeedBinding private var selected: Int = 0 private lateinit var navBar: AnimatedBottomBar @@ -33,14 +33,15 @@ class FeedActivity: AppCompatActivity() { val globalTab = navBar.createTab(R.drawable.ic_globe_24, "Global") navBar.addTab(personalTab) navBar.addTab(globalTab) - binding.listTitle.text = "Activities" + binding.listTitle.text = getString(R.string.activities) binding.feedViewPager.updateLayoutParams { bottomMargin += navBarHeight topMargin += statusBarHeight } binding.listToolbar.updateLayoutParams { topMargin += statusBarHeight } 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.isUserInputEnabled = false navBar.selectTabAt(selected) @@ -65,7 +66,6 @@ class FeedActivity: AppCompatActivity() { navBar.selectTabAt(selected) } - private class ViewPagerAdapter( fragmentManager: FragmentManager, lifecycle: Lifecycle, diff --git a/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt b/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt index f6ac6a8a..6c2844fa 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt @@ -1,11 +1,13 @@ package ani.dantotsu.profile.activity import android.annotation.SuppressLint +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.MotionEvent import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.fragment.app.Fragment 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.api.Activity import ani.dantotsu.databinding.FragmentFeedBinding -import ani.dantotsu.util.Logger +import ani.dantotsu.media.MediaDetailsActivity import ani.dantotsu.profile.ProfileActivity import ani.dantotsu.snackString 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 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 val scrollView = binding.listRecyclerView @@ -86,14 +88,14 @@ class FeedFragment : Fragment() { page++ binding.feedRefresh.visibility = ViewGroup.VISIBLE activity.lifecycleScope.launch(Dispatchers.IO) { - val res = Anilist.query.getFeed(userId, global, page) + val newRes = Anilist.query.getFeed(userId, global, page) withContext(Dispatchers.Main) { - res?.data?.page?.activities?.let { activities -> + newRes?.data?.page?.activities?.let { activities -> activityList += activities val filtered = activities.filterNot { 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 } @@ -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 { fun newInstance(userId: Int?, global: Boolean, activityId: Int): FeedFragment { val fragment = FeedFragment() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c5d98e9b..2f526b24 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -703,4 +703,5 @@ Non quae tempore quo provident laudantium qui illo dolor vel quia dolor et exerc Anilist Notification Filters Anilist notifications update frequency : %1$s Comment notifications update frequency : %1$s + Activities