From 23a950413bc27972c4a4fb9beaeee3df610d01ae Mon Sep 17 00:00:00 2001 From: dspencer001 Date: Sun, 12 Jun 2022 18:12:05 -0400 Subject: [PATCH 1/4] Add showing additional parts --- .../jellyfin/androidtv/constant/QueryType.kt | 1 + .../data/querying/AdditionalPartsQuery.java | 13 +++++ .../ui/itemdetail/FullDetailsActivity.java | 17 +++++-- .../ui/itemhandling/ItemRowAdapter.java | 48 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.java diff --git a/app/src/main/java/org/jellyfin/androidtv/constant/QueryType.kt b/app/src/main/java/org/jellyfin/androidtv/constant/QueryType.kt index 7209b6c911..b1489dfbbe 100644 --- a/app/src/main/java/org/jellyfin/androidtv/constant/QueryType.kt +++ b/app/src/main/java/org/jellyfin/androidtv/constant/QueryType.kt @@ -12,6 +12,7 @@ enum class QueryType { StaticChapters, Search, Specials, + AdditionalParts, Trailers, LiveTvChannel, LiveTvProgram, diff --git a/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.java b/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.java new file mode 100644 index 0000000000..b476bb9b70 --- /dev/null +++ b/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.java @@ -0,0 +1,13 @@ +package org.jellyfin.androidtv.data.querying; + +public class AdditionalPartsQuery { + private String ItemId; + + public AdditionalPartsQuery(String itemId) { + ItemId = itemId; + } + + public String getItemId() { + return ItemId; + } +} diff --git a/app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsActivity.java b/app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsActivity.java index fa0afeb2d4..68ed422ded 100644 --- a/app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsActivity.java +++ b/app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsActivity.java @@ -37,6 +37,7 @@ import org.jellyfin.androidtv.data.model.ChapterItemInfo; import org.jellyfin.androidtv.data.model.DataRefreshService; import org.jellyfin.androidtv.data.model.InfoItem; +import org.jellyfin.androidtv.data.querying.AdditionalPartsQuery; import org.jellyfin.androidtv.data.querying.SpecialsQuery; import org.jellyfin.androidtv.data.querying.StdItemQuery; import org.jellyfin.androidtv.data.querying.TrailersQuery; @@ -526,27 +527,33 @@ protected void addAdditionalRows(ArrayObjectAdapter adapter) { switch (mBaseItem.getBaseItemType()) { case Movie: + //Additional Parts + if (mBaseItem.getPartCount() != null && mBaseItem.getPartCount() > 0) { + ItemRowAdapter additionalPartsAdapter = new ItemRowAdapter(this, new AdditionalPartsQuery(mBaseItem.getId()), new CardPresenter(), adapter); + addItemRow(adapter, additionalPartsAdapter, 0, getString(R.string.lbl_additional_parts)); + } + //Cast/Crew if (mBaseItem.getPeople() != null && mBaseItem.getPeople().length > 0) { ItemRowAdapter castAdapter = new ItemRowAdapter(this, mBaseItem.getPeople(), new CardPresenter(true, 260), adapter); - addItemRow(adapter, castAdapter, 0, getString(R.string.lbl_cast_crew)); + addItemRow(adapter, castAdapter, 1, getString(R.string.lbl_cast_crew)); } //Specials if (mBaseItem.getSpecialFeatureCount() != null && mBaseItem.getSpecialFeatureCount() > 0) { - addItemRow(adapter, new ItemRowAdapter(this, new SpecialsQuery(mBaseItem.getId()), new CardPresenter(), adapter), 2, getString(R.string.lbl_specials)); + addItemRow(adapter, new ItemRowAdapter(this, new SpecialsQuery(mBaseItem.getId()), new CardPresenter(), adapter), 3, getString(R.string.lbl_specials)); } //Trailers if (mBaseItem.getLocalTrailerCount() != null && mBaseItem.getLocalTrailerCount() > 1) { - addItemRow(adapter, new ItemRowAdapter(this, new TrailersQuery(mBaseItem.getId()), new CardPresenter(), adapter), 3, getString(R.string.lbl_trailers)); + addItemRow(adapter, new ItemRowAdapter(this, new TrailersQuery(mBaseItem.getId()), new CardPresenter(), adapter), 4, getString(R.string.lbl_trailers)); } //Chapters if (mBaseItem.getChapters() != null && mBaseItem.getChapters().size() > 0) { List chapters = BaseItemUtils.buildChapterItems(mBaseItem); ItemRowAdapter chapterAdapter = new ItemRowAdapter(this, chapters, new CardPresenter(true, 240), adapter); - addItemRow(adapter, chapterAdapter, 1, getString(R.string.lbl_chapters)); + addItemRow(adapter, chapterAdapter, 2, getString(R.string.lbl_chapters)); } //Similar @@ -560,7 +567,7 @@ protected void addAdditionalRows(ArrayObjectAdapter adapter) { similar.setLimit(10); ItemRowAdapter similarMoviesAdapter = new ItemRowAdapter(this, similar, QueryType.SimilarMovies, new CardPresenter(), adapter); - addItemRow(adapter, similarMoviesAdapter, 4, getString(R.string.lbl_more_like_this)); + addItemRow(adapter, similarMoviesAdapter, 5, getString(R.string.lbl_more_like_this)); addInfoRows(adapter); break; diff --git a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ItemRowAdapter.java b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ItemRowAdapter.java index 3d5e7f33fd..642e63b8d7 100644 --- a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ItemRowAdapter.java +++ b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ItemRowAdapter.java @@ -19,6 +19,7 @@ import org.jellyfin.androidtv.data.model.ChapterItemInfo; import org.jellyfin.androidtv.data.model.DataRefreshService; import org.jellyfin.androidtv.data.model.FilterOptions; +import org.jellyfin.androidtv.data.querying.AdditionalPartsQuery; import org.jellyfin.androidtv.data.querying.SpecialsQuery; import org.jellyfin.androidtv.data.querying.StdItemQuery; import org.jellyfin.androidtv.data.querying.TrailersQuery; @@ -79,6 +80,7 @@ public class ItemRowAdapter extends ArrayObjectAdapter { private PersonsQuery mPersonsQuery; private SearchQuery mSearchQuery; private SpecialsQuery mSpecialsQuery; + private AdditionalPartsQuery mAdditionalPartsQuery; private TrailersQuery mTrailersQuery; private LiveTvChannelQuery mTvChannelQuery; private RecommendedProgramQuery mTvProgramQuery; @@ -279,6 +281,14 @@ public ItemRowAdapter(Context context, SpecialsQuery query, Presenter presenter, queryType = QueryType.Specials; } + public ItemRowAdapter(Context context, AdditionalPartsQuery query, Presenter presenter, ArrayObjectAdapter parent) { + super(presenter); + this.context = context; + mParent = parent; + mAdditionalPartsQuery = query; + queryType = QueryType.AdditionalParts; + } + public ItemRowAdapter(Context context, TrailersQuery query, Presenter presenter, ArrayObjectAdapter parent) { super(presenter); this.context = context; @@ -663,6 +673,9 @@ public void Retrieve() { case Specials: retrieve(mSpecialsQuery); break; + case AdditionalParts: + retrieve(mAdditionalPartsQuery); + break; case Trailers: retrieve(mTrailersQuery); break; @@ -1316,6 +1329,41 @@ public void onError(Exception exception) { } + private void retrieve(final AdditionalPartsQuery query) { + final ItemRowAdapter adapter = this; + apiClient.getValue().GetAdditionalParts(query.getItemId(), KoinJavaComponent.get(UserRepository.class).getCurrentUser().getValue().getId().toString(), new Response() { + @Override + public void onResponse(ItemsResult response) { + if (response.getItems() != null && response.getItems().length > 0) { + int i = 0; + if (adapter.size() > 0) { + adapter.clear(); + } + for (BaseItemDto item : response.getItems()) { + adapter.add(new BaseRowItem(i++, item)); + } + totalItems = response.getTotalRecordCount(); + setItemsLoaded(itemsLoaded + i); + if (i == 0) { + removeRow(); + } + } else { + // no results - don't show us + removeRow(); + } + + notifyRetrieveFinished(); + } + + @Override + public void onError(Exception exception) { + Timber.e(exception, "Error retrieving similar series items"); + removeRow(); + notifyRetrieveFinished(exception); + } + }); + } + private void retrieve(final TrailersQuery query) { final ItemRowAdapter adapter = this; apiClient.getValue().GetLocalTrailersAsync(KoinJavaComponent.get(UserRepository.class).getCurrentUser().getValue().getId().toString(), query.getItemId(), new Response() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 84646efd01..ed00d1e2fa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,6 +49,7 @@ Recording Cancelled Unable to cancel recording Cast/Crew + Additional Parts Chapters Specials Trailers From 71ff2aca7b0e777c16ab3506cec1892ebc0cfeca Mon Sep 17 00:00:00 2001 From: dspencer001 Date: Sat, 18 Jun 2022 16:41:10 -0400 Subject: [PATCH 2/4] Rewrite additional parts query in Kotlin --- .../data/querying/AdditionalPartsQuery.java | 13 ------------- .../androidtv/data/querying/AdditionalPartsQuery.kt | 7 +++++++ 2 files changed, 7 insertions(+), 13 deletions(-) delete mode 100644 app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.java create mode 100644 app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.kt diff --git a/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.java b/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.java deleted file mode 100644 index b476bb9b70..0000000000 --- a/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.jellyfin.androidtv.data.querying; - -public class AdditionalPartsQuery { - private String ItemId; - - public AdditionalPartsQuery(String itemId) { - ItemId = itemId; - } - - public String getItemId() { - return ItemId; - } -} diff --git a/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.kt b/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.kt new file mode 100644 index 0000000000..8163054894 --- /dev/null +++ b/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.kt @@ -0,0 +1,7 @@ +package org.jellyfin.androidtv.data.querying; + +class AdditionalPartsQuery(private val ItemId: String) { + fun getItemId(): String { + return ItemId + } +} From 90bfc24653e57b1c375ca2f4c96892ad78e09ce8 Mon Sep 17 00:00:00 2001 From: dspencer001 Date: Thu, 7 Jul 2022 19:47:07 -0400 Subject: [PATCH 3/4] Use a data class instead of manually defining getter --- .../androidtv/data/querying/AdditionalPartsQuery.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.kt b/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.kt index 8163054894..01f4d50735 100644 --- a/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.kt +++ b/app/src/main/java/org/jellyfin/androidtv/data/querying/AdditionalPartsQuery.kt @@ -1,7 +1,3 @@ package org.jellyfin.androidtv.data.querying; -class AdditionalPartsQuery(private val ItemId: String) { - fun getItemId(): String { - return ItemId - } -} +data class AdditionalPartsQuery(val itemId: String) From d5a3b043a6caee6a2a8e58c2485e3effe638167d Mon Sep 17 00:00:00 2001 From: dspencer001 Date: Thu, 7 Jul 2022 19:47:45 -0400 Subject: [PATCH 4/4] Fix error message for additional parts --- .../org/jellyfin/androidtv/ui/itemhandling/ItemRowAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ItemRowAdapter.java b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ItemRowAdapter.java index 642e63b8d7..2fa3f578d8 100644 --- a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ItemRowAdapter.java +++ b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ItemRowAdapter.java @@ -1357,7 +1357,7 @@ public void onResponse(ItemsResult response) { @Override public void onError(Exception exception) { - Timber.e(exception, "Error retrieving similar series items"); + Timber.e(exception, "Error retrieving additional parts for item"); removeRow(); notifyRetrieveFinished(exception); }