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.copyToClipboard
import ani.dantotsu.databinding.ItemCommentsBinding import ani.dantotsu.databinding.ItemCommentsBinding
import ani.dantotsu.loadImage import ani.dantotsu.loadImage
import ani.dantotsu.others.ImageViewDialog
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
@ -101,7 +102,13 @@ class CommentItem(val comment: Comment,
.putExtra("userId", comment.userId.toInt()) .putExtra("userId", comment.userId.toInt())
.putExtra("username","[${levelColor.second}]"), null .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 { viewBinding.commentText.setOnLongClickListener {
copyToClipboard(comment.content) copyToClipboard(comment.content)
@ -193,10 +200,15 @@ class CommentItem(val comment: Comment,
} }
} }
viewBinding.commentTotalVotes.text = (comment.upvotes - comment.downvotes).toString() 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) } comment.profilePictureUrl?.let { viewBinding.commentUserAvatar.loadImage(it) }
viewBinding.commentUserName.text = comment.username viewBinding.commentUserName.text = comment.username
viewBinding.commentUserLevel.text = "[${levelColor.second}]" viewBinding.commentUserLevel.text = "[${levelColor.second}]"
viewBinding.commentUserLevel.setTextColor(levelColor.first) viewBinding.commentUserLevel.setTextColor(levelColor.first)
viewBinding.commentUserTime.text = formatTimestamp(comment.timestamp) viewBinding.commentUserTime.text = formatTimestamp(comment.timestamp)

View file

@ -4,8 +4,10 @@ import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
@ -20,8 +22,12 @@ import ani.dantotsu.loadImage
import ani.dantotsu.media.Media import ani.dantotsu.media.Media
import ani.dantotsu.media.MediaDetailsActivity import ani.dantotsu.media.MediaDetailsActivity
import ani.dantotsu.media.user.ListActivity import ani.dantotsu.media.user.ListActivity
import ani.dantotsu.navBarHeight
import ani.dantotsu.others.ImageViewDialog import ani.dantotsu.others.ImageViewDialog
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.snackString import ani.dantotsu.snackString
import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager import ani.dantotsu.themes.ThemeManager
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -32,7 +38,7 @@ import nl.joery.animatedbottombar.AnimatedBottomBar
class ProfileActivity : AppCompatActivity(){ class ProfileActivity : AppCompatActivity(){
private lateinit var binding: ActivityProfileBinding private lateinit var binding: ActivityProfileBinding
private var selected: Int = 0 private var selected: Int = 0
private lateinit var tabLayout: AnimatedBottomBar private lateinit var navBar: AnimatedBottomBar
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -40,15 +46,14 @@ class ProfileActivity : AppCompatActivity(){
initActivity(this) initActivity(this)
binding = ActivityProfileBinding.inflate(layoutInflater) binding = ActivityProfileBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
tabLayout = binding.typeTab navBar = binding.profileNavBar
val profileTab = tabLayout.createTab(R.drawable.ic_round_person_24, "Profile") navBar.updateLayoutParams<ViewGroup.MarginLayoutParams> { bottomMargin = navBarHeight }
val statsTab = tabLayout.createTab(R.drawable.ic_stats_24, "Stats") val profileTab = navBar.createTab(R.drawable.ic_round_person_24, "Profile")
tabLayout.addTab(profileTab) val statsTab = navBar.createTab(R.drawable.ic_stats_24, "Stats")
tabLayout.addTab(statsTab) navBar.addTab(profileTab)
tabLayout.visibility = View.GONE navBar.addTab(statsTab)
navBar.visibility = View.GONE
binding.mediaViewPager.isUserInputEnabled = false binding.mediaViewPager.isUserInputEnabled = false
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
val userid = intent.getIntExtra("userId", 0) val userid = intent.getIntExtra("userId", 0)
val respond = Anilist.query.getUserProfile(userid) val respond = Anilist.query.getUserProfile(userid)
@ -60,9 +65,9 @@ class ProfileActivity : AppCompatActivity(){
} }
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
binding.mediaViewPager.adapter = ViewPagerAdapter(supportFragmentManager, lifecycle, user, this@ProfileActivity) binding.mediaViewPager.adapter = ViewPagerAdapter(supportFragmentManager, lifecycle, user, this@ProfileActivity)
tabLayout.visibility = View.VISIBLE navBar.visibility = View.VISIBLE
tabLayout.selectTabAt(selected) navBar.selectTabAt(selected)
tabLayout.setOnTabSelectListener(object : AnimatedBottomBar.OnTabSelectListener { navBar.setOnTabSelectListener(object : AnimatedBottomBar.OnTabSelectListener {
override fun onTabSelected( override fun onTabSelected(
lastIndex: Int, lastIndex: Int,
lastTab: AnimatedBottomBar.Tab?, lastTab: AnimatedBottomBar.Tab?,
@ -76,13 +81,29 @@ class ProfileActivity : AppCompatActivity(){
val userLevel = intent.getStringExtra("username")?: "" val userLevel = intent.getStringExtra("username")?: ""
binding.profileProgressBar.visibility = View.GONE binding.profileProgressBar.visibility = View.GONE
binding.profileTopContainer.visibility = View.VISIBLE
binding.profileBannerImage.loadImage(user.bannerImage) 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.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.profileUserName.text = "${user.name} $userLevel"
binding.profileUserEpisodesWatched.text = user.statistics.anime.episodesWatched.toString() binding.profileUserEpisodesWatched.text = user.statistics.anime.episodesWatched.toString()
binding.profileUserChaptersRead.text = user.statistics.manga.chaptersRead.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.loadImage(user.bannerImage)
binding.profileBannerImage.updateLayoutParams { height += statusBarHeight }
binding.profileBannerImage.setOnLongClickListener { binding.profileBannerImage.setOnLongClickListener {
ImageViewDialog.newInstance( ImageViewDialog.newInstance(
this@ProfileActivity, this@ProfileActivity,
@ -104,8 +125,8 @@ class ProfileActivity : AppCompatActivity(){
} }
override fun onResume() { override fun onResume() {
if (this::tabLayout.isInitialized) { if (this::navBar.isInitialized) {
tabLayout.selectTabAt(selected) navBar.selectTabAt(selected)
} }
super.onResume() 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?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val markwon = buildMarkwon(activity, false) 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 { binding.profileAnimeList.setOnClickListener {
ContextCompat.startActivity( ContextCompat.startActivity(
activity, Intent(activity, ListActivity::class.java) 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.profileAnimeListImage.loadImage("https://bit.ly/31bsIHq")
binding.profileMangaListImage.loadImage("https://bit.ly/2ZGfcuG") 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) { val fotmatTypes: List<String> = if (anime) {
stats?.data?.user?.statistics?.anime?.formats?.map { it.format } ?: emptyList() stats?.data?.user?.statistics?.anime?.formats?.map { it.format } ?: emptyList()
} else { } 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) { val formatCount: List<Int> = if (anime) {
stats?.data?.user?.statistics?.anime?.formats?.map { it.count } ?: emptyList() stats?.data?.user?.statistics?.anime?.formats?.map { it.count } ?: emptyList()
} else { } 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()) if (fotmatTypes.isEmpty() || formatCount.isEmpty())
return null return null

View file

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

View file

@ -6,151 +6,361 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<TextView <LinearLayout
android:layout_width="wrap_content" android:id="@+id/userListContainer"
android:layout_height="wrap_content"
android:layout_marginStart="18dp"
android:layout_marginTop="24dp"
android:fontFamily="@font/poppins_semi_bold"
android:text="List"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/profileListContainer"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clipToPadding="false" android:orientation="vertical">
android:paddingStart="24dp"
android:paddingEnd="24dp">
<com.google.android.material.card.MaterialCardView <TextView
android:id="@+id/profileAnimeList" 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="List"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="72dp" android:layout_height="wrap_content"
android:layout_margin="8dp" android:clipToPadding="false"
app:boxStrokeColor="@color/text_input_layout_stroke_color" android:paddingStart="24dp"
app:cardCornerRadius="16dp" android:paddingEnd="24dp">
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/profileMangaList"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_max="256dp"
tools:visibility="visible">
<ImageView <com.google.android.material.card.MaterialCardView
android:id="@+id/profileAnimeListImage" android:id="@+id/profileAnimeList"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="72dp"
android:scaleType="centerCrop" android:layout_margin="8dp"
tools:ignore="ContentDescription" app:boxStrokeColor="@color/text_input_layout_stroke_color"
tools:src="@tools:sample/backgrounds/scenic" /> app:cardCornerRadius="16dp"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/profileMangaList"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_max="256dp"
tools:visibility="visible">
<View <ImageView
android:id="@+id/profileAnimeListImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
tools:ignore="ContentDescription"
tools:src="@tools:sample/backgrounds/scenic" />
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0.6"
android:background="@color/bg_black" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:fontFamily="@font/poppins_bold"
android:text="@string/anime_list"
android:textAllCaps="true"
android:textColor="@color/bg_white"
android:textSize="16sp" />
<View
android:layout_width="64dp"
android:layout_height="2dp"
android:layout_gravity="center"
android:background="?attr/colorPrimary" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
android:id="@+id/profileMangaList"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="72dp"
android:alpha="0.6" android:layout_margin="8dp"
android:background="@color/bg_black" /> android:layout_marginBottom="16dp"
app:boxStrokeColor="@color/text_input_layout_stroke_color"
app:cardCornerRadius="16dp"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/profileAnimeList"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_max="256dp"
tools:visibility="visible">
<LinearLayout <ImageView
android:layout_width="wrap_content" android:id="@+id/profileMangaListImage"
android:layout_height="wrap_content" android:layout_width="match_parent"
android:layout_gravity="center" android:layout_height="match_parent"
android:orientation="vertical"> android:scaleType="centerCrop"
tools:ignore="ContentDescription"
tools:src="@tools:sample/backgrounds/scenic" />
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0.6"
android:background="@color/bg_black" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:fontFamily="@font/poppins_bold"
android:text="@string/manga_list"
android:textAllCaps="true"
android:textColor="@color/bg_white"
android:textSize="16sp" />
<View
android:layout_width="64dp"
android:layout_height="2dp"
android:layout_gravity="center"
android:background="?attr/colorPrimary" />
</LinearLayout>
</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="Bio"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<TextView
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:alpha="0.58"
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 <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" 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:fontFamily="@font/poppins_bold"
android:text="@string/anime_list" android:textAlignment="textEnd" />
android:textAllCaps="true"
android:textColor="@color/bg_white"
android:textSize="16sp" />
<View </TableRow>
android:layout_width="64dp"
android:layout_height="2dp"
android:layout_gravity="center"
android:background="?attr/colorPrimary" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView <TableRow
android:id="@+id/profileMangaList"
android:layout_width="match_parent"
android:layout_height="72dp"
android:layout_margin="8dp"
android:layout_marginBottom="16dp"
app:boxStrokeColor="@color/text_input_layout_stroke_color"
app:cardCornerRadius="16dp"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/profileAnimeList"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_max="256dp"
tools:visibility="visible">
<ImageView
android:id="@+id/profileMangaListImage"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="24dp"
android:scaleType="centerCrop" android:orientation="horizontal">
tools:ignore="ContentDescription"
tools:src="@tools:sample/backgrounds/scenic" />
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0.6"
android:background="@color/bg_black" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical">
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" 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:fontFamily="@font/poppins_bold"
android:text="@string/manga_list" android:textAlignment="textEnd" />
android:textAllCaps="true" </TableRow>
android:textColor="@color/bg_white"
android:textSize="16sp" />
<View <TableRow
android:layout_width="64dp" android:layout_width="match_parent"
android:layout_height="2dp" android:layout_height="24dp"
android:layout_gravity="center" android:orientation="horizontal">
android:background="?attr/colorPrimary" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.58"
android:text="Total Anime"
android:textStyle="bold" />
</androidx.constraintlayout.widget.ConstraintLayout> <TextView
<TextView android:id="@+id/statsTotalAnime"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="18dp" android:layout_weight="1"
android:layout_marginTop="24dp" android:fontFamily="@font/poppins_bold"
android:fontFamily="@font/poppins_semi_bold" android:textAlignment="textEnd" />
android:text="Info" </TableRow>
android:textSize="18sp"
tools:ignore="HardcodedText" />
<TextView <TableRow
android:id="@+id/profileUserInfo" android:layout_width="match_parent"
android:layout_width="wrap_content" android:layout_height="24dp"
android:layout_height="wrap_content" android:orientation="horizontal">
android:fontFamily="@font/poppins_semi_bold"
android:layout_marginStart="18dp" <TextView
android:layout_marginEnd="18dp" android:layout_width="wrap_content"
android:text="info" android:layout_height="wrap_content"
android:alpha="0.58" android:alpha="0.58"
android:textSize="12sp" /> 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> </LinearLayout>