Skip to content

Commit 1c121fb

Browse files
committed
Discover: link to and add filterable new episodes screen
1 parent 87d8bdc commit 1c121fb

File tree

10 files changed

+191
-20
lines changed

10 files changed

+191
-20
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Version 73
1515
----------
1616
*in development*
1717

18+
* 🌟 Discover: add new episodes screen with year and language filters, similar to popular shows screen.
1819
* 🔧 History: sort Trakt friends by latest activity first.
1920
* 🔨 Comments: do not display misleading "Could not modify data" message when commenting on a show.
2021

app/src/main/java/com/battlelancer/seriesguide/shows/search/discover/DiscoverShowsActivity.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import android.os.Bundle
99
import androidx.core.view.isVisible
1010
import com.battlelancer.seriesguide.R
1111
import com.battlelancer.seriesguide.databinding.ActivityDiscoverShowsBinding
12+
import com.battlelancer.seriesguide.shows.search.newepisodes.ShowsNewEpisodesFragment
1213
import com.battlelancer.seriesguide.shows.search.popular.ShowsDiscoverPagingFragment
1314
import com.battlelancer.seriesguide.shows.search.popular.ShowsPopularFragment
1415
import com.battlelancer.seriesguide.shows.search.similar.SimilarShowsActivity
@@ -32,22 +33,24 @@ class DiscoverShowsActivity : BaseMessageActivity(), AddShowDialogFragment.OnAdd
3233
// Change the scrolling view the AppBarLayout should use to determine if it should lift.
3334
// This is required so the AppBarLayout does not flicker its background when scrolling.
3435
binding.sgAppBarLayout.liftOnScrollTargetViewId = when (link) {
35-
DiscoverShowsLink.POPULAR -> ShowsDiscoverPagingFragment.liftOnScrollTargetViewId
36+
DiscoverShowsLink.POPULAR, DiscoverShowsLink.NEW_EPISODES -> ShowsDiscoverPagingFragment.liftOnScrollTargetViewId
3637
else -> TraktAddFragment.liftOnScrollTargetViewId
3738
}
38-
// Filters currently only supported for the popular screen
39-
binding.scrollViewTraktShowsChips.isVisible = link == DiscoverShowsLink.POPULAR
39+
// Filters only supported on TMDB provided lists
40+
binding.scrollViewTraktShowsChips.isVisible =
41+
link == DiscoverShowsLink.POPULAR || link == DiscoverShowsLink.NEW_EPISODES
4042
setupActionBar(link)
4143

4244
if (savedInstanceState == null) {
4345
val fragment = when (link) {
4446
DiscoverShowsLink.POPULAR -> ShowsPopularFragment()
47+
DiscoverShowsLink.NEW_EPISODES -> ShowsNewEpisodesFragment()
4548
else -> TraktAddFragment.newInstance(link)
4649
}
4750
supportFragmentManager
48-
.beginTransaction()
49-
.add(R.id.containerTraktShowsFragment, fragment)
50-
.commit()
51+
.beginTransaction()
52+
.add(R.id.containerTraktShowsFragment, fragment)
53+
.commit()
5154
}
5255

5356
SimilarShowsFragment.displaySimilarShowsEventLiveData.observe(this) {

app/src/main/java/com/battlelancer/seriesguide/shows/search/discover/DiscoverShowsLink.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99

1010
public enum DiscoverShowsLink {
1111
POPULAR(0, R.string.title_popular),
12-
WATCHED(1, R.string.watched_shows),
13-
COLLECTION(2, R.string.shows_collection),
14-
WATCHLIST(3, R.string.watchlist);
12+
NEW_EPISODES(1, R.string.title_new_episodes),
13+
WATCHED(2, R.string.watched_shows),
14+
COLLECTION(3, R.string.shows_collection),
15+
WATCHLIST(4, R.string.watchlist);
1516

1617
final int id;
1718
final int titleRes;

app/src/main/java/com/battlelancer/seriesguide/shows/search/discover/ShowsDiscoverAdapter.kt

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import androidx.annotation.StringRes
1212
import androidx.recyclerview.widget.RecyclerView
1313
import com.battlelancer.seriesguide.R
1414
import com.battlelancer.seriesguide.databinding.ItemAddshowBinding
15+
import com.battlelancer.seriesguide.databinding.ItemDiscoverShowsHeaderBinding
1516
import com.battlelancer.seriesguide.databinding.ItemDiscoverShowsLinkBinding
16-
import com.battlelancer.seriesguide.databinding.ItemGridHeaderBinding
1717
import com.battlelancer.seriesguide.traktapi.TraktCredentials
1818
import com.battlelancer.seriesguide.util.ImageTools
1919
import com.battlelancer.seriesguide.util.ViewTools
@@ -106,7 +106,7 @@ class ShowsDiscoverAdapter(
106106
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
107107
return when (viewType) {
108108
VIEW_TYPE_LINK -> LinkViewHolder.inflate(parent, itemClickListener)
109-
VIEW_TYPE_HEADER -> HeaderViewHolder.inflate(parent)
109+
VIEW_TYPE_HEADER -> HeaderViewHolder.inflate(parent, itemClickListener)
110110
VIEW_TYPE_SHOW -> ShowViewHolder.inflate(parent, itemClickListener)
111111
else -> throw IllegalArgumentException("View type $viewType is unknown")
112112
}
@@ -117,9 +117,11 @@ class ShowsDiscoverAdapter(
117117
is LinkViewHolder -> {
118118
holder.bindTo(context, links[position])
119119
}
120+
120121
is HeaderViewHolder -> {
121-
holder.bindTo(R.string.title_new_episodes)
122+
holder.bindTo(R.string.title_new_episodes, DiscoverShowsLink.NEW_EPISODES)
122123
}
124+
123125
is ShowViewHolder -> {
124126
val item = getSearchResultFor(position)
125127
holder.bindTo(context, item, showMenuWatchlist, hideMenuWatchlistIfAdded)
@@ -176,16 +178,36 @@ class ShowsDiscoverAdapter(
176178
}
177179
}
178180

179-
class HeaderViewHolder(private val binding: ItemGridHeaderBinding) :
180-
RecyclerView.ViewHolder(binding.root) {
181-
fun bindTo(@StringRes text: Int) {
181+
class HeaderViewHolder(
182+
private val binding: ItemDiscoverShowsHeaderBinding,
183+
onItemClickListener: OnItemClickListener
184+
) : RecyclerView.ViewHolder(binding.root) {
185+
186+
private var link: DiscoverShowsLink? = null
187+
188+
init {
189+
itemView.setOnClickListener {
190+
link?.let {
191+
onItemClickListener.onLinkClick(itemView, it)
192+
}
193+
}
194+
}
195+
196+
fun bindTo(@StringRes text: Int, link: DiscoverShowsLink) {
182197
binding.textViewGridHeader.setText(text)
198+
this.link = link
183199
}
184200

185201
companion object {
186-
fun inflate(parent: ViewGroup) = HeaderViewHolder(
187-
ItemGridHeaderBinding.inflate(LayoutInflater.from(parent.context), parent, false)
188-
)
202+
fun inflate(parent: ViewGroup, onItemClickListener: OnItemClickListener) =
203+
HeaderViewHolder(
204+
ItemDiscoverShowsHeaderBinding.inflate(
205+
LayoutInflater.from(parent.context),
206+
parent,
207+
false
208+
),
209+
onItemClickListener
210+
)
189211
}
190212
}
191213

@@ -208,7 +230,12 @@ class ShowsDiscoverAdapter(
208230
}
209231
}
210232

211-
fun bindTo(context: Context, item: SearchResult, showMenuWatchlist: Boolean, hideMenuWatchlistIfAdded: Boolean) {
233+
fun bindTo(
234+
context: Context,
235+
item: SearchResult,
236+
showMenuWatchlist: Boolean,
237+
hideMenuWatchlistIfAdded: Boolean
238+
) {
212239
this.item = item
213240

214241
// hide watchlist menu if not useful
@@ -230,7 +257,11 @@ class ShowsDiscoverAdapter(
230257
binding.textViewAddTitle.text = showTitle
231258
binding.textViewAddDescription.text = item.overview
232259

233-
ImageTools.loadShowPosterResizeCrop(context, binding.imageViewAddPoster, item.posterPath)
260+
ImageTools.loadShowPosterResizeCrop(
261+
context,
262+
binding.imageViewAddPoster,
263+
item.posterPath
264+
)
234265
}
235266

236267
companion object {
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// Copyright 2024 Uwe Trottmann
3+
4+
package com.battlelancer.seriesguide.shows.search.newepisodes
5+
6+
import android.content.Context
7+
import com.battlelancer.seriesguide.shows.search.popular.BaseDiscoverShowDataSource
8+
import com.battlelancer.seriesguide.tmdbapi.TmdbTools2
9+
import com.uwetrottmann.tmdb2.Tmdb
10+
import com.uwetrottmann.tmdb2.entities.TvShowResultsPage
11+
12+
/**
13+
* Loads shows with new episodes in pages from TMDB.
14+
*/
15+
class ShowsNewEpisodesDataSource(
16+
context: Context,
17+
tmdb: Tmdb,
18+
languageCode: String,
19+
firstReleaseYear: Int?,
20+
originalLanguageCode: String?,
21+
watchProviderIds: List<Int>?,
22+
watchRegion: String?
23+
) : BaseDiscoverShowDataSource(
24+
context,
25+
tmdb,
26+
languageCode,
27+
firstReleaseYear,
28+
originalLanguageCode,
29+
watchProviderIds,
30+
watchRegion
31+
) {
32+
33+
override val action: String
34+
get() = "get shows w new episodes"
35+
36+
override suspend fun loadShows(
37+
tmdb: Tmdb,
38+
language: String,
39+
page: Int,
40+
firstReleaseYear: Int?,
41+
originalLanguageCode: String?,
42+
watchProviderIds: List<Int>?,
43+
watchRegion: String?
44+
): TvShowResultsPage? = TmdbTools2().getShowsWithNewEpisodes(
45+
tmdb,
46+
language,
47+
page,
48+
firstReleaseYear,
49+
originalLanguageCode,
50+
watchProviderIds,
51+
watchRegion
52+
)
53+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// Copyright 2024 Uwe Trottmann
3+
4+
package com.battlelancer.seriesguide.shows.search.newepisodes
5+
6+
import androidx.fragment.app.viewModels
7+
import com.battlelancer.seriesguide.shows.search.popular.ShowsDiscoverPagingFragment
8+
9+
/**
10+
* Displays shows with new episodes with filters provided by
11+
* [com.battlelancer.seriesguide.shows.search.discover.DiscoverShowsActivity].
12+
*/
13+
class ShowsNewEpisodesFragment : ShowsDiscoverPagingFragment() {
14+
15+
override val model: ShowsNewEpisodesViewModel by viewModels()
16+
17+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// Copyright 2024 Uwe Trottmann
3+
4+
package com.battlelancer.seriesguide.shows.search.newepisodes
5+
6+
import android.app.Application
7+
import com.battlelancer.seriesguide.shows.search.popular.BaseDiscoverShowDataSource
8+
import com.battlelancer.seriesguide.shows.search.popular.BaseDiscoverShowsViewModel
9+
import com.uwetrottmann.tmdb2.Tmdb
10+
11+
class ShowsNewEpisodesViewModel(application: Application) : BaseDiscoverShowsViewModel(application) {
12+
13+
override fun buildDataSource(
14+
tmdb: Tmdb, languageCode: String,
15+
firstReleaseYear: Int?,
16+
originalLanguageCode: String?,
17+
watchProviderIds: List<Int>?,
18+
watchRegion: String?
19+
): BaseDiscoverShowDataSource {
20+
return ShowsNewEpisodesDataSource(
21+
getApplication(),
22+
tmdb,
23+
languageCode,
24+
firstReleaseYear,
25+
originalLanguageCode,
26+
watchProviderIds,
27+
watchRegion
28+
)
29+
}
30+
31+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="32dp"
3+
android:height="32dp"
4+
android:autoMirrored="true"
5+
android:tint="?attr/colorControlNormal"
6+
android:viewportWidth="960"
7+
android:viewportHeight="960">
8+
<path
9+
android:fillColor="#FF000000"
10+
android:pathData="M504,480L348,324Q337,313 337,296Q337,279 348,268Q359,257 376,257Q393,257 404,268L588,452Q594,458 596.5,465Q599,472 599,480Q599,488 596.5,495Q594,502 588,508L404,692Q393,703 376,703Q359,703 348,692Q337,681 337,664Q337,647 348,636L504,480Z" />
11+
</vector>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:app="http://schemas.android.com/apk/res-auto"
5+
xmlns:tools="http://schemas.android.com/tools"
6+
android:id="@+id/textViewGridHeader"
7+
android:layout_width="wrap_content"
8+
android:layout_height="wrap_content"
9+
android:background="?attr/selectableItemBackground"
10+
android:paddingLeft="@dimen/default_padding"
11+
android:paddingTop="@dimen/default_padding"
12+
android:paddingRight="@dimen/default_padding"
13+
android:paddingBottom="0dp"
14+
android:textAppearance="@style/TextAppearance.SeriesGuide.TitleLarge.Bold"
15+
app:drawableEndCompat="@drawable/ic_chevron_right_black_24dp"
16+
app:drawableTint="?android:attr/textColorPrimary"
17+
tools:text="New episodes" />

app/src/main/res/values/styles.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@
6969
<item name="android:textColor">?attr/sgTextColorSecondaryDim</item>
7070
</style>
7171

72+
<style name="TextAppearance.SeriesGuide.TitleLarge" parent="TextAppearance.Material3.TitleLarge" />
73+
<style name="TextAppearance.SeriesGuide.TitleLarge.Bold">
74+
<item name="fontFamily">sans-serif-medium</item>
75+
<item name="android:fontFamily">sans-serif-medium</item>
76+
</style>
77+
7278
<style name="TextAppearance.SeriesGuide.Subtitle1" parent="TextAppearance.Material3.TitleMedium">
7379
<item name="fontFamily">sans-serif</item>
7480
<item name="android:fontFamily">sans-serif</item>

0 commit comments

Comments
 (0)