feat(profile page): Stats, Banner animation

This commit is contained in:
aayush262 2024-03-02 23:01:58 +05:30
parent 2837cad762
commit 86ed721796
6 changed files with 412 additions and 149 deletions

View file

@ -12,6 +12,7 @@ import ani.dantotsu.connections.comments.CommentsAPI
import ani.dantotsu.copyToClipboard
import ani.dantotsu.databinding.ItemCommentsBinding
import ani.dantotsu.loadImage
import ani.dantotsu.others.ImageViewDialog
import ani.dantotsu.profile.ProfileActivity
import ani.dantotsu.snackString
import com.xwray.groupie.GroupieAdapter
@ -101,7 +102,13 @@ class CommentItem(val comment: Comment,
.putExtra("userId", comment.userId.toInt())
.putExtra("username","[${levelColor.second}]"), null
)
}
viewBinding.commentUserAvatar.setOnClickListener {
ContextCompat.startActivity(
commentsFragment.activity, Intent(commentsFragment.activity, ProfileActivity::class.java)
.putExtra("userId", comment.userId.toInt())
.putExtra("username","[${levelColor.second}]"), null
)
}
viewBinding.commentText.setOnLongClickListener {
copyToClipboard(comment.content)
@ -193,10 +200,15 @@ class CommentItem(val comment: Comment,
}
}
viewBinding.commentTotalVotes.text = (comment.upvotes - comment.downvotes).toString()
viewBinding.commentUserAvatar
viewBinding.commentUserAvatar.setOnLongClickListener {
ImageViewDialog.newInstance(
commentsFragment.activity,
"${comment.username}'s [Cover]",
comment.profilePictureUrl
)
}
comment.profilePictureUrl?.let { viewBinding.commentUserAvatar.loadImage(it) }
viewBinding.commentUserName.text = comment.username
viewBinding.commentUserLevel.text = "[${levelColor.second}]"
viewBinding.commentUserLevel.setTextColor(levelColor.first)
viewBinding.commentUserTime.text = formatTimestamp(comment.timestamp)

View file

@ -4,8 +4,10 @@ import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.lifecycle.Lifecycle
@ -20,8 +22,12 @@ import ani.dantotsu.loadImage
import ani.dantotsu.media.Media
import ani.dantotsu.media.MediaDetailsActivity
import ani.dantotsu.media.user.ListActivity
import ani.dantotsu.navBarHeight
import ani.dantotsu.others.ImageViewDialog
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString
import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -32,7 +38,7 @@ import nl.joery.animatedbottombar.AnimatedBottomBar
class ProfileActivity : AppCompatActivity(){
private lateinit var binding: ActivityProfileBinding
private var selected: Int = 0
private lateinit var tabLayout: AnimatedBottomBar
private lateinit var navBar: AnimatedBottomBar
@SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -40,15 +46,14 @@ class ProfileActivity : AppCompatActivity(){
initActivity(this)
binding = ActivityProfileBinding.inflate(layoutInflater)
setContentView(binding.root)
tabLayout = binding.typeTab
val profileTab = tabLayout.createTab(R.drawable.ic_round_person_24, "Profile")
val statsTab = tabLayout.createTab(R.drawable.ic_stats_24, "Stats")
tabLayout.addTab(profileTab)
tabLayout.addTab(statsTab)
tabLayout.visibility = View.GONE
navBar = binding.profileNavBar
navBar.updateLayoutParams<ViewGroup.MarginLayoutParams> { bottomMargin = navBarHeight }
val profileTab = navBar.createTab(R.drawable.ic_round_person_24, "Profile")
val statsTab = navBar.createTab(R.drawable.ic_stats_24, "Stats")
navBar.addTab(profileTab)
navBar.addTab(statsTab)
navBar.visibility = View.GONE
binding.mediaViewPager.isUserInputEnabled = false
lifecycleScope.launch(Dispatchers.IO) {
val userid = intent.getIntExtra("userId", 0)
val respond = Anilist.query.getUserProfile(userid)
@ -60,9 +65,9 @@ class ProfileActivity : AppCompatActivity(){
}
withContext(Dispatchers.Main) {
binding.mediaViewPager.adapter = ViewPagerAdapter(supportFragmentManager, lifecycle, user, this@ProfileActivity)
tabLayout.visibility = View.VISIBLE
tabLayout.selectTabAt(selected)
tabLayout.setOnTabSelectListener(object : AnimatedBottomBar.OnTabSelectListener {
navBar.visibility = View.VISIBLE
navBar.selectTabAt(selected)
navBar.setOnTabSelectListener(object : AnimatedBottomBar.OnTabSelectListener {
override fun onTabSelected(
lastIndex: Int,
lastTab: AnimatedBottomBar.Tab?,
@ -76,13 +81,29 @@ class ProfileActivity : AppCompatActivity(){
val userLevel = intent.getStringExtra("username")?: ""
binding.profileProgressBar.visibility = View.GONE
binding.profileTopContainer.visibility = View.VISIBLE
binding.profileBannerImage.loadImage(user.bannerImage)
binding.profileBannerImage.setOnLongClickListener {
ImageViewDialog.newInstance(
this@ProfileActivity,
"${user.name}'s [Banner]",
user.bannerImage
)
}
binding.profileUserAvatar.loadImage(user.avatar?.medium)
binding.profileUserAvatar.setOnLongClickListener {
ImageViewDialog.newInstance(
this@ProfileActivity,
"${user.name}'s [Avatar]",
user.avatar?.medium
)
}
binding.profileUserName.text = "${user.name} $userLevel"
binding.profileUserEpisodesWatched.text = user.statistics.anime.episodesWatched.toString()
binding.profileUserChaptersRead.text = user.statistics.manga.chaptersRead.toString()
if (!(PrefManager.getVal(PrefName.BannerAnimations) as Boolean)) binding.profileBannerImage.pause()
binding.profileBannerImage.loadImage(user.bannerImage)
binding.profileBannerImage.updateLayoutParams { height += statusBarHeight }
binding.profileBannerImage.setOnLongClickListener {
ImageViewDialog.newInstance(
this@ProfileActivity,
@ -104,8 +125,8 @@ class ProfileActivity : AppCompatActivity(){
}
override fun onResume() {
if (this::tabLayout.isInitialized) {
tabLayout.selectTabAt(selected)
if (this::navBar.isInitialized) {
navBar.selectTabAt(selected)
}
super.onResume()
}

View file

@ -27,7 +27,9 @@ class ProfileFragment(private val user: Query.UserProfile, private val activity:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val markwon = buildMarkwon(activity, false)
markwon.setMarkdown(binding.profileUserInfo, user.about?:"")
markwon.setMarkdown(binding.profileUserBio, user.about?:"")
binding.userInfoContainer.visibility = if (user.about != null) View.VISIBLE else View.GONE
binding.profileAnimeList.setOnClickListener {
ContextCompat.startActivity(
activity, Intent(activity, ListActivity::class.java)
@ -46,5 +48,15 @@ class ProfileFragment(private val user: Query.UserProfile, private val activity:
}
binding.profileAnimeListImage.loadImage("https://bit.ly/31bsIHq")
binding.profileMangaListImage.loadImage("https://bit.ly/2ZGfcuG")
binding.statsEpisodesWatched.text = user.statistics.anime.episodesWatched.toString()
binding.statsDaysWatched.text = (user.statistics.anime.minutesWatched / (24 * 60)).toString()
binding.statsTotalAnime.text = user.statistics.anime.count.toString()
binding.statsAnimeMeanScore.text = user.statistics.anime.meanScore.toString()
binding.statsChaptersRead.text = user.statistics.manga.chaptersRead.toString()
binding.statsVolumeRead.text = (user.statistics.manga.volumesRead).toString()
binding.statsTotalManga.text = user.statistics.manga.count.toString()
binding.statsMangaMeanScore.text = user.statistics.manga.meanScore.toString()
}
}

View file

@ -129,12 +129,12 @@ class StatsFragment(private val user: Query.UserProfile, private val activity: P
val fotmatTypes: List<String> = if (anime) {
stats?.data?.user?.statistics?.anime?.formats?.map { it.format } ?: emptyList()
} else {
stats?.data?.user?.statistics?.manga?.formats?.map { it.format } ?: emptyList()
stats?.data?.user?.statistics?.manga?.countries?.map { it.country } ?: emptyList()
}
val formatCount: List<Int> = if (anime) {
stats?.data?.user?.statistics?.anime?.formats?.map { it.count } ?: emptyList()
} else {
stats?.data?.user?.statistics?.manga?.formats?.map { it.count } ?: emptyList()
stats?.data?.user?.statistics?.manga?.countries?.map { it.count } ?: emptyList()
}
if (fotmatTypes.isEmpty() || formatCount.isEmpty())
return null

View file

@ -28,14 +28,22 @@
android:id="@+id/profileTopContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"
android:orientation="vertical">
<ImageView
<com.flaviofaria.kenburnsview.KenBurnsView
android:id="@+id/profileBannerImage"
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:src="@drawable/gradient_background"
tools:ignore="ContentDescription"
tools:src="@tools:sample/backgrounds/scenic" />
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginTop="-200dp"
android:src="@drawable/linear_gradient_bg"
tools:ignore="ContentDescription" />
<com.google.android.material.card.MaterialCardView
@ -45,7 +53,7 @@
android:layout_gravity="end"
android:layout_marginTop="-52dp"
android:layout_marginEnd="32dp"
app:cardCornerRadius="40dp">
app:cardCornerRadius="64dp">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/profileUserAvatar"
@ -62,7 +70,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="18dp"
android:layout_marginTop="-32dp"
android:layout_marginTop="-24dp"
android:orientation="vertical"
tools:visibility="visible">
@ -141,7 +149,7 @@
<nl.joery.animatedbottombar.AnimatedBottomBar
android:id="@+id/typeTab"
android:id="@+id/profileNavBar"
android:layout_width="match_parent"
android:layout_height="72dp"
android:layout_gravity="center_horizontal|bottom"

View file

@ -6,6 +6,12 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/userListContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -17,7 +23,6 @@
tools:ignore="HardcodedText" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/profileListContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
@ -133,24 +138,229 @@
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/userInfoContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/profileUserBioTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="18dp"
android:layout_marginTop="24dp"
android:fontFamily="@font/poppins_semi_bold"
android:text="Info"
android:text="Bio"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/profileUserInfo"
android:id="@+id/profileUserBio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/poppins_semi_bold"
android:layout_marginStart="18dp"
android:layout_marginEnd="18dp"
android:text="info"
android:alpha="0.58"
android:textSize="12sp" />
android:textSize="12sp"
tools:text="@tools:sample/lorem"/>
</LinearLayout>
<LinearLayout
android:id="@+id/userStatsContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/profileUserStatsTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="18dp"
android:layout_marginTop="24dp"
android:fontFamily="@font/poppins_semi_bold"
android:text="Stats"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<TableLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingStart="32dp"
android:paddingTop="16dp"
android:paddingEnd="32dp"
android:paddingBottom="16dp"
tools:ignore="HardcodedText">
<TableRow
android:layout_width="match_parent"
android:layout_height="24dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.58"
android:text="Episodes watched"
android:textStyle="bold" />
<TextView
android:id="@+id/statsEpisodesWatched"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:textAlignment="textEnd" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="24dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.58"
android:text="Days watched"
android:textStyle="bold" />
<TextView
android:id="@+id/statsDaysWatched"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:textAlignment="textEnd" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="24dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.58"
android:text="Total Anime"
android:textStyle="bold" />
<TextView
android:id="@+id/statsTotalAnime"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:textAlignment="textEnd" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="24dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.58"
android:text="Anime Mean Score"
android:textStyle="bold" />
<TextView
android:id="@+id/statsAnimeMeanScore"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:textAlignment="textEnd" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="24dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.58"
android:text="Chapter read"
android:textStyle="bold" />
<TextView
android:id="@+id/statsChaptersRead"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:textAlignment="textEnd" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="24dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.58"
android:text="Volume read"
android:textStyle="bold" />
<TextView
android:id="@+id/statsVolumeRead"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:textAlignment="textEnd" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="24dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.58"
android:text="Total Manga"
android:textStyle="bold" />
<TextView
android:id="@+id/statsTotalManga"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:textAlignment="textEnd" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="24dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.58"
android:text="Manga Mean Score"
android:textStyle="bold" />
<TextView
android:id="@+id/statsMangaMeanScore"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:textAlignment="textEnd" />
</TableRow>
</TableLayout>
</LinearLayout>
</LinearLayout>