|
|
|
@ -50,11 +50,31 @@ import android.os.Bundle |
|
|
|
import androidx.core.content.ContextCompat |
|
|
|
import androidx.leanback.app.BackgroundManager |
|
|
|
import androidx.leanback.app.DetailsSupportFragment |
|
|
|
import androidx.leanback.widget.* |
|
|
|
import androidx.leanback.widget.Action |
|
|
|
import androidx.leanback.widget.ArrayObjectAdapter |
|
|
|
import androidx.leanback.widget.ClassPresenterSelector |
|
|
|
import androidx.leanback.widget.DetailsOverviewRow |
|
|
|
import androidx.leanback.widget.DiffCallback |
|
|
|
import androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter |
|
|
|
import androidx.leanback.widget.HeaderItem |
|
|
|
import androidx.leanback.widget.ListRow |
|
|
|
import androidx.leanback.widget.ListRowPresenter |
|
|
|
import androidx.leanback.widget.OnActionClickedListener |
|
|
|
import androidx.leanback.widget.OnItemViewClickedListener |
|
|
|
import androidx.leanback.widget.Presenter |
|
|
|
import androidx.leanback.widget.Row |
|
|
|
import androidx.leanback.widget.RowPresenter |
|
|
|
import androidx.leanback.widget.SparseArrayObjectAdapter |
|
|
|
import androidx.lifecycle.ViewModelProvider |
|
|
|
import androidx.lifecycle.lifecycleScope |
|
|
|
import kotlinx.coroutines.* |
|
|
|
import org.videolan.moviepedia.database.models.* |
|
|
|
import kotlinx.coroutines.CoroutineScope |
|
|
|
import kotlinx.coroutines.MainScope |
|
|
|
import kotlinx.coroutines.launch |
|
|
|
import org.videolan.moviepedia.database.models.MediaImage |
|
|
|
import org.videolan.moviepedia.database.models.MediaImageType |
|
|
|
import org.videolan.moviepedia.database.models.MediaMetadataWithImages |
|
|
|
import org.videolan.moviepedia.database.models.Person |
|
|
|
import org.videolan.moviepedia.database.models.tvEpisodeSubtitle |
|
|
|
import org.videolan.moviepedia.viewmodel.MediaMetadataFull |
|
|
|
import org.videolan.moviepedia.viewmodel.MediaMetadataModel |
|
|
|
import org.videolan.resources.util.getFromMl |
|
|
|
@ -72,7 +92,7 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc |
|
|
|
|
|
|
|
private lateinit var actionsAdapter: SparseArrayObjectAdapter |
|
|
|
private lateinit var showId: String |
|
|
|
private lateinit var detailsDescriptionPresenter: org.videolan.television.ui.TvShowDescriptionPresenter |
|
|
|
private lateinit var detailsDescriptionPresenter: TvShowDescriptionPresenter |
|
|
|
private lateinit var backgroundManager: BackgroundManager |
|
|
|
private lateinit var rowsAdapter: ArrayObjectAdapter |
|
|
|
private lateinit var browserFavRepository: BrowserFavRepository |
|
|
|
@ -99,11 +119,11 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc |
|
|
|
backgroundManager = BackgroundManager.getInstance(requireActivity()) |
|
|
|
backgroundManager.isAutoReleaseOnStop = false |
|
|
|
browserFavRepository = BrowserFavRepository.getInstance(requireContext()) |
|
|
|
detailsDescriptionPresenter = org.videolan.television.ui.TvShowDescriptionPresenter() |
|
|
|
arrayObjectAdapterPosters = ArrayObjectAdapter(org.videolan.television.ui.MediaImageCardPresenter(requireActivity(), MediaImageType.POSTER)) |
|
|
|
detailsDescriptionPresenter = TvShowDescriptionPresenter() |
|
|
|
arrayObjectAdapterPosters = ArrayObjectAdapter(MediaImageCardPresenter(requireActivity(), MediaImageType.POSTER)) |
|
|
|
|
|
|
|
val extras = requireActivity().intent.extras ?: savedInstanceState ?: return |
|
|
|
showId = extras.getString(org.videolan.television.ui.TV_SHOW_ID) ?: return |
|
|
|
showId = extras.getString(TV_SHOW_ID) ?: return |
|
|
|
viewModel = ViewModelProvider(this, MediaMetadataModel.Factory(requireActivity(), showId = showId)).get(showId, MediaMetadataModel::class.java) |
|
|
|
|
|
|
|
|
|
|
|
@ -125,7 +145,7 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc |
|
|
|
} |
|
|
|
|
|
|
|
override fun onSaveInstanceState(outState: Bundle) { |
|
|
|
outState.putString(org.videolan.television.ui.TV_SHOW_ID, showId) |
|
|
|
outState.putString(TV_SHOW_ID, showId) |
|
|
|
super.onSaveInstanceState(outState) |
|
|
|
} |
|
|
|
|
|
|
|
@ -139,7 +159,7 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc |
|
|
|
val media = item.media |
|
|
|
?: item.metadata.mlId?.let { requireActivity().getFromMl { getMedia(it) } } |
|
|
|
media?.let { |
|
|
|
org.videolan.television.ui.TvUtil.showMediaDetail(requireActivity(), it) |
|
|
|
TvUtil.showMediaDetail(requireActivity(), it) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -229,7 +249,7 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc |
|
|
|
} |
|
|
|
|
|
|
|
if (metadata.images.any { it.imageType == MediaImageType.BACKDROP }) { |
|
|
|
val arrayObjectAdapterBackdrops = ArrayObjectAdapter(org.videolan.television.ui.MediaImageCardPresenter(requireActivity(), MediaImageType.BACKDROP)) |
|
|
|
val arrayObjectAdapterBackdrops = ArrayObjectAdapter(MediaImageCardPresenter(requireActivity(), MediaImageType.BACKDROP)) |
|
|
|
arrayObjectAdapterBackdrops.setItems(metadata.images.filter { it.imageType == MediaImageType.BACKDROP }, imageDiffCallback) |
|
|
|
val headerBackdrops = HeaderItem(tvShow.metadata?.metadata?.moviepediaId?.toLong(36) |
|
|
|
?: 0, getString(R.string.backdrops)) |
|
|
|
@ -242,7 +262,7 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc |
|
|
|
|
|
|
|
override fun areContentsTheSame(oldItem: Row, newItem: Row): Boolean { |
|
|
|
if (oldItem is DetailsOverviewRow && newItem is DetailsOverviewRow) { |
|
|
|
return oldItem.item as org.videolan.television.ui.MediaItemDetails == newItem.item as org.videolan.television.ui.MediaItemDetails |
|
|
|
return oldItem.item as MediaItemDetails == newItem.item as MediaItemDetails |
|
|
|
} |
|
|
|
return true |
|
|
|
} |
|
|
|
@ -257,7 +277,7 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc |
|
|
|
|
|
|
|
// Attach your media item details presenter to the row presenter: |
|
|
|
val rowPresenter = FullWidthDetailsOverviewRowPresenter(detailsDescriptionPresenter) |
|
|
|
val videoPresenter = org.videolan.television.ui.VideoDetailsPresenter(requireActivity(), requireActivity().getScreenWidth()) |
|
|
|
val videoPresenter = VideoDetailsPresenter(requireActivity(), requireActivity().getScreenWidth()) |
|
|
|
|
|
|
|
val activity = requireActivity() |
|
|
|
detailsOverview = DetailsOverviewRow(tvShow) |
|
|
|
@ -268,12 +288,12 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc |
|
|
|
MediaUtils.openList(activity, viewModel.provider.getResumeMedias(viewModel.updateLiveData.value?.seasons), 0) |
|
|
|
} |
|
|
|
ID_START_OVER -> { |
|
|
|
org.videolan.television.ui.TvUtil.playMedia(activity, viewModel.provider.getAllMedias(viewModel.updateLiveData.value?.seasons)) |
|
|
|
TvUtil.playMedia(activity, viewModel.provider.getAllMedias(viewModel.updateLiveData.value?.seasons)) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
selector.addClassPresenter(DetailsOverviewRow::class.java, rowPresenter) |
|
|
|
selector.addClassPresenter(org.videolan.television.ui.VideoDetailsOverviewRow::class.java, videoPresenter) |
|
|
|
selector.addClassPresenter(VideoDetailsOverviewRow::class.java, videoPresenter) |
|
|
|
selector.addClassPresenter(ListRow::class.java, |
|
|
|
ListRowPresenter()) |
|
|
|
rowsAdapter = ArrayObjectAdapter(selector) |
|
|
|
|