feat: list view for home page media

This commit is contained in:
aayush262 2024-05-01 00:57:58 +05:30
parent fdb7f45a3d
commit 42330032c8
8 changed files with 359 additions and 89 deletions

View file

@ -217,6 +217,9 @@
android:label="@string/manga"
android:launchMode="singleTask" />
<activity android:name=".media.GenreActivity" />
<activity
android:name=".media.MediaListViewActivity"
android:parentActivityName=".MainActivity" />
<activity
android:name=".media.MediaDetailsActivity"
android:parentActivityName=".MainActivity"

View file

@ -603,10 +603,11 @@ class AnilistQueries {
val activities = listOf(
response.data.page1.activities,
response.data.page2.activities
).flatten()
).asSequence().flatten()
.filter { it.typename != "MessageActivity" }
.filter { if (Anilist.adult) true else it.media?.isAdult == false }
.filter { it.createdAt * 1000L > threeDaysAgo }.toList()
.sortedByDescending { it.createdAt }
.filter { it.createdAt * 1000L > threeDaysAgo }
val anilistActivities = mutableListOf<User>()
val groupedActivities = activities.groupBy { it.userId }
@ -1584,7 +1585,7 @@ Page(page:$page,perPage:50) {
)
}
private fun status(page: Int = 1): String {
return """Page(page:$page,perPage:50){activities(isFollowing: true,sort:ID_DESC){__typename ... on TextActivity{id userId type replyCount text(asHtml:true)siteUrl isLocked isSubscribed likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}... on ListActivity{id userId type replyCount status progress siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}media{id title{english romaji native userPreferred}bannerImage coverImage{extraLarge medium large}}likes{id name bannerImage avatar{medium large}}}... on MessageActivity{id type createdAt}}}"""
return """Page(page:$page,perPage:50){activities(isFollowing: true,sort:ID_DESC){__typename ... on TextActivity{id userId type replyCount text(asHtml:true)siteUrl isLocked isSubscribed likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}... on ListActivity{id userId type replyCount status progress siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}media{id isAdult title{english romaji native userPreferred}bannerImage coverImage{extraLarge medium large}}likes{id name bannerImage avatar{medium large}}}... on MessageActivity{id type createdAt}}}"""
}
suspend fun getUpcomingAnime(id: String): List<Media> {

View file

@ -34,6 +34,7 @@ import ani.dantotsu.home.status.UserStatusAdapter
import ani.dantotsu.loadImage
import ani.dantotsu.media.Media
import ani.dantotsu.media.MediaAdaptor
import ani.dantotsu.media.MediaListViewActivity
import ani.dantotsu.media.user.ListActivity
import ani.dantotsu.navBarHeight
import ani.dantotsu.profile.ProfileActivity
@ -209,13 +210,15 @@ class HomeFragment : Fragment() {
recyclerView: RecyclerView,
progress: View,
empty: View,
title: View
title: View,
more: View
) {
container.visibility = View.VISIBLE
progress.visibility = View.VISIBLE
recyclerView.visibility = View.GONE
empty.visibility = View.GONE
title.visibility = View.INVISIBLE
more.visibility = View.INVISIBLE
mode.observe(viewLifecycleOwner) {
recyclerView.visibility = View.GONE
@ -228,6 +231,14 @@ class HomeFragment : Fragment() {
LinearLayoutManager.HORIZONTAL,
false
)
more.setOnClickListener { _ ->
MediaListViewActivity.mediaList = it
ContextCompat.startActivity(
requireActivity(), Intent(requireActivity(), MediaListViewActivity::class.java)
.putExtra("title", getString(R.string.continue_watching)),
null
)
}
recyclerView.visibility = View.VISIBLE
recyclerView.layoutAnimation =
LayoutAnimationController(setSlideIn(), 0.25f)
@ -235,6 +246,7 @@ class HomeFragment : Fragment() {
} else {
empty.visibility = View.VISIBLE
}
more?.visibility = View.VISIBLE
title.visibility = View.VISIBLE
title.startAnimation(setSlideUp())
progress.visibility = View.GONE
@ -250,7 +262,8 @@ class HomeFragment : Fragment() {
binding.homeWatchingRecyclerView,
binding.homeWatchingProgressBar,
binding.homeWatchingEmpty,
binding.homeContinueWatch
binding.homeContinueWatch,
binding.homeContinueWatchMore
)
binding.homeWatchingBrowseButton.setOnClickListener {
bottomBar.selectTabAt(0)
@ -262,7 +275,9 @@ class HomeFragment : Fragment() {
binding.homeFavAnimeRecyclerView,
binding.homeFavAnimeProgressBar,
binding.homeFavAnimeEmpty,
binding.homeFavAnime
binding.homeFavAnime,
binding.homeFavAnimeMore
)
initRecyclerView(
@ -271,7 +286,8 @@ class HomeFragment : Fragment() {
binding.homePlannedAnimeRecyclerView,
binding.homePlannedAnimeProgressBar,
binding.homePlannedAnimeEmpty,
binding.homePlannedAnime
binding.homePlannedAnime,
binding.homePlannedAnimeMore
)
binding.homePlannedAnimeBrowseButton.setOnClickListener {
bottomBar.selectTabAt(0)
@ -283,7 +299,8 @@ class HomeFragment : Fragment() {
binding.homeReadingRecyclerView,
binding.homeReadingProgressBar,
binding.homeReadingEmpty,
binding.homeContinueRead
binding.homeContinueRead,
binding.homeContinueReadMore
)
binding.homeReadingBrowseButton.setOnClickListener {
bottomBar.selectTabAt(2)
@ -295,7 +312,8 @@ class HomeFragment : Fragment() {
binding.homeFavMangaRecyclerView,
binding.homeFavMangaProgressBar,
binding.homeFavMangaEmpty,
binding.homeFavManga
binding.homeFavManga,
binding.homeFavMangaMore
)
initRecyclerView(
@ -304,7 +322,8 @@ class HomeFragment : Fragment() {
binding.homePlannedMangaRecyclerView,
binding.homePlannedMangaProgressBar,
binding.homePlannedMangaEmpty,
binding.homePlannedManga
binding.homePlannedManga,
binding.homePlannedMangaMore
)
binding.homePlannedMangaBrowseButton.setOnClickListener {
bottomBar.selectTabAt(2)
@ -316,7 +335,8 @@ class HomeFragment : Fragment() {
binding.homeRecommendedRecyclerView,
binding.homeRecommendedProgressBar,
binding.homeRecommendedEmpty,
binding.homeRecommended
binding.homeRecommended,
binding.homeRecommendedMore
)
binding.homeUserStatusContainer.visibility = View.VISIBLE
binding.homeUserStatusProgressBar.visibility = View.VISIBLE

View file

@ -396,7 +396,7 @@ constructor(
}
binding.infoText.text = text
val bannerAnimations: Boolean = PrefManager.getVal(PrefName.BannerAnimations)
blurImage(if (bannerAnimations)binding.contentImageViewKen else binding.contentImageView, story.media?.bannerImage ?: story.media?.coverImage?.extraLarge)
blurImage(if (bannerAnimations) binding.contentImageViewKen else binding.contentImageView, story.media?.bannerImage ?: story.media?.coverImage?.extraLarge)
binding.coverImage.loadImage(story.media?.coverImage?.extraLarge)
binding.coverImage.setOnClickListener{
ContextCompat.startActivity(context, Intent(context, MediaDetailsActivity::class.java)
@ -406,7 +406,7 @@ constructor(
binding.coverImage,
ViewCompat.getTransitionName(binding.coverImage)!!
).toBundle()
)
)
}

View file

@ -573,23 +573,23 @@ class MediaInfoFragment : Fragment() {
parent.addView(root)
}
}
val users: ArrayList<User> = media.users ?: arrayListOf()
if (Anilist.token != null && media.userStatus != null) {
users.add(0,
User(
id = Anilist.userid!!,
name = getString(R.string.your_progress),
pfp = Anilist.avatar,
banner = "",
status = media.userStatus,
score = media.userScore.toFloat(),
progress = media.userProgress,
totalEpisodes = media.anime?.totalEpisodes ?: media.manga?.totalChapters,
nextAiringEpisode = media.anime?.nextAiringEpisode
)
)
}
if (!media.users.isNullOrEmpty() && !offline) {
val users: ArrayList<User> = media.users ?: arrayListOf()
if (Anilist.token != null && media.userStatus != null) {
users.add(0,
User(
id = Anilist.userid!!,
name = getString(R.string.your_progress),
pfp = Anilist.avatar,
banner = "",
status = media.userStatus,
score = media.userScore.toFloat(),
progress = media.userProgress,
totalEpisodes = media.anime?.totalEpisodes ?: media.manga?.totalChapters,
nextAiringEpisode = media.anime?.nextAiringEpisode
)
)
}
ItemTitleRecyclerBinding.inflate(
LayoutInflater.from(context),
parent,

View file

@ -0,0 +1,42 @@
package ani.dantotsu.media
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import ani.dantotsu.databinding.ActivityMediaListViewBinding
import ani.dantotsu.getThemeColor
import ani.dantotsu.initActivity
import ani.dantotsu.themes.ThemeManager
import java.util.ArrayList
class MediaListViewActivity: AppCompatActivity() {
private lateinit var binding: ActivityMediaListViewBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMediaListViewBinding.inflate(layoutInflater)
ThemeManager(this).applyTheme()
initActivity(this)
setContentView(binding.root)
val primaryColor = getThemeColor(com.google.android.material.R.attr.colorSurface)
val primaryTextColor = getThemeColor(com.google.android.material.R.attr.colorPrimary)
val secondaryTextColor = getThemeColor(com.google.android.material.R.attr.colorOutline)
window.statusBarColor = primaryColor
window.navigationBarColor = primaryColor
binding.listAppBar.setBackgroundColor(primaryColor)
binding.listTitle.setTextColor(primaryTextColor)
val screenWidth = resources.displayMetrics.run { widthPixels / density }
binding.listTitle.text = intent.getStringExtra("title")
binding.mediaRecyclerView.adapter = MediaAdaptor(0, mediaList, this)
binding.mediaRecyclerView.layoutManager = GridLayoutManager(
this,
(screenWidth / 120f).toInt()
)
}
companion object{
var mediaList: ArrayList<Media> = arrayListOf()
}
}

View file

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/listAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorSurface">
<LinearLayout
android:id="@+id/settingsContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/listTitle"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_marginStart="32dp"
android:layout_weight="1"
android:ellipsize="end"
android:fontFamily="@font/poppins_bold"
android:gravity="center|start"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"
android:textColor="?attr/colorOnBackground"
android:textSize="16sp"
tools:text="@string/app_name" />
</LinearLayout>
</LinearLayout>
<ani.dantotsu.FadingEdgeRecyclerView
android:id="@+id/mediaRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:requiresFadingEdge="horizontal"
tools:itemCount="4"
tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_media_compact"
tools:orientation="horizontal" />
</com.google.android.material.appbar.AppBarLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -314,8 +314,8 @@
android:id="@+id/homeUserStatusContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:minHeight="100dp">
android:minHeight="100dp"
android:visibility="gone">
<ProgressBar
android:id="@+id/homeUserStatusProgressBar"
@ -345,15 +345,35 @@
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/homeContinueWatch"
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/continue_watching"
android:textSize="16sp" />
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/homeContinueWatch"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/continue_watching"
android:textSize="16sp" />
<ImageView
android:id="@+id/homeContinueWatchMore"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginEnd="16dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:src="@drawable/arrow_mark"
android:text="@string/continue_watching"
android:textSize="16sp"
tools:ignore="ContentDescription" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
@ -421,16 +441,36 @@
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/homeFavAnime"
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/fav_anime"
android:textSize="16sp" />
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/homeFavAnime"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/fav_anime"
android:textSize="16sp" />
<ImageView
android:id="@+id/homeFavAnimeMore"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginEnd="16dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:src="@drawable/arrow_mark"
android:text="@string/continue_watching"
android:textSize="16sp"
tools:ignore="ContentDescription" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
@ -495,15 +535,36 @@
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/homePlannedAnime"
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/planned_anime"
android:textSize="16sp" />
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/homePlannedAnime"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/planned_anime"
android:textSize="16sp" />
<ImageView
android:id="@+id/homePlannedAnimeMore"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginEnd="16dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:src="@drawable/arrow_mark"
android:text="@string/continue_watching"
android:textSize="16sp"
tools:ignore="ContentDescription" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
@ -571,15 +632,36 @@
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/homeContinueRead"
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/continue_reading"
android:textSize="16sp" />
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/homeContinueRead"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/continue_reading"
android:textSize="16sp" />
<ImageView
android:id="@+id/homeContinueReadMore"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginEnd="16dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:src="@drawable/arrow_mark"
android:text="@string/continue_watching"
android:textSize="16sp"
tools:ignore="ContentDescription" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
@ -647,16 +729,35 @@
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/homeFavManga"
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/fav_manga"
android:textSize="16sp" />
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/homeFavManga"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/fav_manga"
android:textSize="16sp" />
<ImageView
android:id="@+id/homeFavMangaMore"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginEnd="16dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:src="@drawable/arrow_mark"
android:text="@string/continue_watching"
android:textSize="16sp"
tools:ignore="ContentDescription" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
@ -721,15 +822,36 @@
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/homePlannedManga"
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/planned_manga"
android:textSize="16sp" />
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/homePlannedManga"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/planned_manga"
android:textSize="16sp" />
<ImageView
android:id="@+id/homePlannedMangaMore"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:src="@drawable/arrow_mark"
android:text="@string/continue_watching"
android:textSize="16sp"
tools:ignore="ContentDescription" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
@ -797,15 +919,36 @@
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/homeRecommended"
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/recommended"
android:textSize="16sp" />
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/homeRecommended"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/recommended"
android:textSize="16sp" />
<ImageView
android:id="@+id/homeRecommendedMore"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginEnd="16dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:src="@drawable/arrow_mark"
android:text="@string/continue_watching"
android:textSize="16sp"
tools:ignore="ContentDescription" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"