diff --git a/app/src/main/java/org/mosad/teapod/parser/crunchyroll/Crunchyroll.kt b/app/src/main/java/org/mosad/teapod/parser/crunchyroll/Crunchyroll.kt index cac61fa..87d8da8 100644 --- a/app/src/main/java/org/mosad/teapod/parser/crunchyroll/Crunchyroll.kt +++ b/app/src/main/java/org/mosad/teapod/parser/crunchyroll/Crunchyroll.kt @@ -368,4 +368,21 @@ object Crunchyroll { return objects(objects) } + /** + * TODO + */ + suspend fun upNextAccount(n: Int = 20): ContinueWatchingList { + val watchlistEndpoint = "/content/v1/$accountID/up_next_account" + val parameters = listOf("locale" to locale, "n" to n) + + val resultUpNextAccount = request(watchlistEndpoint, parameters) + val list: ContinueWatchingList = resultUpNextAccount.component1()?.obj()?.let { + json.decodeFromString(it.toString()) + } ?: NoneContinueWatchingList + +// val objects = list.items.map{ it.panel.episodeMetadata.seriesId } +// return objects(objects) + return list + } + } diff --git a/app/src/main/java/org/mosad/teapod/parser/crunchyroll/DataTypes.kt b/app/src/main/java/org/mosad/teapod/parser/crunchyroll/DataTypes.kt index 34470c1..3690e58 100644 --- a/app/src/main/java/org/mosad/teapod/parser/crunchyroll/DataTypes.kt +++ b/app/src/main/java/org/mosad/teapod/parser/crunchyroll/DataTypes.kt @@ -17,15 +17,19 @@ enum class SortBy(val str: String) { /** * search, browse, watchlist data types (all collections) */ + +// TODO make generic @Serializable data class Collection( @SerialName("total") val total: Int, @SerialName("items") val items: List ) +// TODO don't use aliases typealias SearchCollection = Collection typealias BrowseResult = Collection typealias Watchlist = Collection +typealias UpNextAccount = Collection @Serializable data class SearchResult( @@ -44,9 +48,10 @@ data class ContinueWatchingItem( @SerialName("panel") val panel: EpisodePanel, @SerialName("new") val new: Boolean, @SerialName("new_content") val newContent: Boolean, - @SerialName("is_favorite") val isFavorite: Boolean, - @SerialName("never_watched") val neverWatched: Boolean, - @SerialName("completion_status") val completionStatus: Boolean, + // not present in up_next_account's continue_watching_item +// @SerialName("is_favorite") val isFavorite: Boolean, +// @SerialName("never_watched") val neverWatched: Boolean, +// @SerialName("completion_status") val completionStatus: Boolean, @SerialName("playhead") val playhead: Int, ) diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/HomeFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/HomeFragment.kt index a39dc88..01a86b9 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/HomeFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/HomeFragment.kt @@ -15,12 +15,13 @@ import org.mosad.teapod.util.ItemMedia import org.mosad.teapod.util.adapter.MediaItemAdapter import org.mosad.teapod.util.decoration.MediaItemDecoration import org.mosad.teapod.util.showFragment +import org.mosad.teapod.util.toItemMediaList class HomeFragment : Fragment() { private lateinit var binding: FragmentHomeBinding + private lateinit var adapterUpNext: MediaItemAdapter private lateinit var adapterWatchlist: MediaItemAdapter - private lateinit var adapterNewEpisodes: MediaItemAdapter private lateinit var adapterNewTitles: MediaItemAdapter private lateinit var adapterTopTen: MediaItemAdapter @@ -71,17 +72,21 @@ class HomeFragment : Fragment() { val asyncJobList = arrayListOf() + // continue watching + val upNextJob = lifecycleScope.launch { + // TODO create EpisodeItemAdapter, which will start the playback of the selected episode immediately + adapterUpNext = MediaItemAdapter(Crunchyroll.upNextAccount().toItemMediaList()) + binding.recyclerNewEpisodes.adapter = adapterUpNext + } + asyncJobList.add(upNextJob) + // watchlist val watchlistJob = lifecycleScope.launch { - adapterWatchlist = MediaItemAdapter(mapMyListToItemMedia()) + adapterWatchlist = MediaItemAdapter(Crunchyroll.watchlist(50).toItemMediaList()) binding.recyclerWatchlist.adapter = adapterWatchlist } asyncJobList.add(watchlistJob) - // new episodes TODO replace with continue watching -// adapterNewEpisodes = MediaItemAdapter(AoDParser.newEpisodesList) -// binding.recyclerNewEpisodes.adapter = adapterNewEpisodes - // new titles TODO // adapterNewTitles = MediaItemAdapter(AoDParser.newTitlesList) // binding.recyclerNewTitles.adapter = adapterNewTitles @@ -122,18 +127,14 @@ class HomeFragment : Fragment() { activity?.showFragment(MediaFragment("")) } - adapterWatchlist.onItemClick = { id, _ -> - activity?.showFragment(MediaFragment("")) //(mediaId)) + adapterUpNext.onItemClick = { id, _ -> + activity?.showFragment(MediaFragment(id)) + } + + adapterWatchlist.onItemClick = { id, _ -> + activity?.showFragment(MediaFragment(id)) } -// adapterNewEpisodes.onItemClick = { id, _ -> -// activity?.showFragment(MediaFragment("")) //(mediaId)) -// } -// -// adapterNewSimulcasts.onItemClick = { id, _ -> -// activity?.showFragment(MediaFragment("")) //(mediaId)) -// } -// // adapterNewTitles.onItemClick = { id, _ -> // activity?.showFragment(MediaFragment("")) //(mediaId)) // } @@ -143,10 +144,4 @@ class HomeFragment : Fragment() { // } } - private suspend fun mapMyListToItemMedia(): List { - return Crunchyroll.watchlist(50).items.map { - ItemMedia(it.id, it.title, it.images.poster_wide[0][0].source) - } - } - } \ No newline at end of file diff --git a/app/src/main/java/org/mosad/teapod/util/Utils.kt b/app/src/main/java/org/mosad/teapod/util/Utils.kt index bd284e6..368dbc1 100644 --- a/app/src/main/java/org/mosad/teapod/util/Utils.kt +++ b/app/src/main/java/org/mosad/teapod/util/Utils.kt @@ -1,6 +1,8 @@ package org.mosad.teapod.util import android.widget.TextView +import org.mosad.teapod.parser.crunchyroll.Collection +import org.mosad.teapod.parser.crunchyroll.ContinueWatchingList fun TextView.setDrawableTop(drawable: Int) { this.setCompoundDrawablesWithIntrinsicBounds(0, drawable, 0, 0) @@ -9,3 +11,18 @@ fun TextView.setDrawableTop(drawable: Int) { fun concatenate(vararg lists: List): List { return listOf(*lists).flatten() } + +// TODO move to correct location +fun Collection.toItemMediaList(): List { + return this.items.map { + ItemMedia(it.id, it.title, it.images.poster_wide[0][0].source) + } +} + +fun ContinueWatchingList.toItemMediaList(): List { + return this.items.map { + // TODO add season and episode to title + ItemMedia(it.panel.episodeMetadata.seriesId, it.panel.title, it.panel.images.thumbnail[0][0].source) + + } +} diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 9e80ae8..0b55cd8 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -107,6 +107,34 @@ + + + + + + + - - - - - - - @@ -136,15 +137,19 @@ android:id="@+id/linear_my_list_action" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:foreground="?android:selectableItemBackground" android:gravity="center_horizontal" android:orientation="vertical"> @@ -164,7 +169,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="7dp" - android:layout_marginTop="12dp" + android:layout_marginTop="7dp" android:layout_marginEnd="7dp" android:background="@android:color/transparent" app:tabGravity="start" diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 4f3d2b0..7ecf195 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -7,6 +7,7 @@ Highlight + Weiterschauen Meine Liste Neue Episoden Neue Simulcasts diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ca77eca..d13bb14 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,6 +7,7 @@ Highlight + Up next My list New episodes New simulcasts