mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
changed a bit of TV UI
This commit is contained in:
parent
da6577e587
commit
5aa9019d6d
3 changed files with 275 additions and 158 deletions
|
@ -270,22 +270,8 @@ class ResultFragmentTv : Fragment() {
|
|||
|
||||
observeNullable(viewModel.resumeWatching) { resume ->
|
||||
binding?.apply {
|
||||
if (resume == null) {
|
||||
resultResumeParent.isVisible = false
|
||||
return@observeNullable
|
||||
}
|
||||
resultResumeParent.isVisible = true
|
||||
resume.progress?.let { progress ->
|
||||
resultResumeSeriesTitle.apply {
|
||||
isVisible = !resume.isMovie
|
||||
text =
|
||||
if (resume.isMovie) null else context?.getNameFull(
|
||||
resume.result.name,
|
||||
resume.result.episode,
|
||||
resume.result.season
|
||||
)
|
||||
}
|
||||
|
||||
// show progress no matter if series or movie
|
||||
resume?.progress?.let { progress ->
|
||||
resultResumeSeriesProgressText.setText(progress.progressLeft)
|
||||
resultResumeSeriesProgress.apply {
|
||||
isVisible = true
|
||||
|
@ -295,13 +281,41 @@ class ResultFragmentTv : Fragment() {
|
|||
resultResumeProgressHolder.isVisible = true
|
||||
} ?: run {
|
||||
resultResumeProgressHolder.isVisible = false
|
||||
resultResumeSeriesProgress.isVisible = false
|
||||
resultResumeSeriesTitle.isVisible = false
|
||||
resultResumeSeriesProgressText.isVisible = false
|
||||
}
|
||||
|
||||
resultResumeSeriesButton.isVisible = !resume.isMovie
|
||||
resultResumeSeriesButton.setOnClickListener {
|
||||
// if movie then hide both as movie button is
|
||||
// always visible on movies, this is done in movie observe
|
||||
|
||||
if(resume?.isMovie == true) {
|
||||
resultPlaySeries.isVisible = false
|
||||
resultResumeSeries.isVisible = false
|
||||
return@observeNullable
|
||||
}
|
||||
|
||||
// if series then
|
||||
// > resultPlaySeries is visible when null
|
||||
// > resultResumeSeries is visible when not null
|
||||
if (resume == null) {
|
||||
resultPlaySeries.isVisible = true
|
||||
resultResumeSeries.isVisible = false
|
||||
return@observeNullable
|
||||
}
|
||||
|
||||
resultPlaySeries.isVisible = false
|
||||
resultResumeSeries.isVisible = true
|
||||
|
||||
if (hasNoFocus()) {
|
||||
resultResumeSeries.requestFocus()
|
||||
}
|
||||
|
||||
resultResumeSeries.text =
|
||||
if (resume.isMovie) context?.getString(R.string.play_movie_button) else context?.getNameFull(
|
||||
null, // resume.result.name, we don't want episode title
|
||||
resume.result.episode,
|
||||
resume.result.season
|
||||
)
|
||||
|
||||
resultResumeSeries.setOnClickListener {
|
||||
viewModel.handleAction(
|
||||
EpisodeClickEvent(
|
||||
storedData.playerAction, //?: ACTION_PLAY_EPISODE_IN_PLAYER,
|
||||
|
@ -309,6 +323,14 @@ class ResultFragmentTv : Fragment() {
|
|||
)
|
||||
)
|
||||
}
|
||||
|
||||
resultResumeSeries.setOnLongClickListener {
|
||||
viewModel.handleAction(
|
||||
EpisodeClickEvent(ACTION_SHOW_OPTIONS, resume.result)
|
||||
)
|
||||
return@setOnLongClickListener true
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -351,6 +373,8 @@ class ResultFragmentTv : Fragment() {
|
|||
observeNullable(viewModel.movie) { data ->
|
||||
binding?.apply {
|
||||
resultPlayMovie.isVisible = data is Resource.Success
|
||||
seriesHolder.isVisible = data == null
|
||||
|
||||
(data as? Resource.Success)?.value?.let { (text, ep) ->
|
||||
resultPlayMovie.setText(text)
|
||||
resultPlayMovie.setOnClickListener {
|
||||
|
@ -466,6 +490,30 @@ class ResultFragmentTv : Fragment() {
|
|||
resultEpisodes.isVisible = episodes is Resource.Success
|
||||
resultEpisodeLoading.isVisible = episodes is Resource.Loading
|
||||
if (episodes is Resource.Success) {
|
||||
val first = episodes.value.firstOrNull()
|
||||
if (first != null) {
|
||||
resultPlaySeries.text = context?.getNameFull(
|
||||
null, // resume.result.name, we don't want episode title
|
||||
first.episode,
|
||||
first.season
|
||||
)
|
||||
|
||||
resultPlaySeries.setOnClickListener {
|
||||
viewModel.handleAction(
|
||||
EpisodeClickEvent(
|
||||
ACTION_PLAY_EPISODE_IN_PLAYER,
|
||||
first
|
||||
)
|
||||
)
|
||||
}
|
||||
resultPlaySeries.setOnLongClickListener {
|
||||
viewModel.handleAction(
|
||||
EpisodeClickEvent(ACTION_SHOW_OPTIONS, first)
|
||||
)
|
||||
return@setOnLongClickListener true
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Okay so what is this fuckery?
|
||||
* Basically Android TV will crash if you request a new focus while
|
||||
|
@ -523,6 +571,15 @@ class ResultFragmentTv : Fragment() {
|
|||
resultNextAiringTime.setText(d.nextAiringDate)
|
||||
resultPoster.setImage(d.posterImage)
|
||||
resultDescription.setTextHtml(d.plotText)
|
||||
resultDescription.setOnClickListener { view ->
|
||||
view.context?.let { ctx ->
|
||||
val builder: AlertDialog.Builder =
|
||||
AlertDialog.Builder(ctx, R.style.AlertDialogCustom)
|
||||
builder.setMessage(d.plotText.asString(ctx).html())
|
||||
.setTitle(d.plotHeaderText.asString(ctx))
|
||||
.show()
|
||||
}
|
||||
}
|
||||
|
||||
resultComingSoon.isVisible = d.comingSoon
|
||||
resultDataHolder.isGone = d.comingSoon
|
||||
|
|
|
@ -161,15 +161,6 @@
|
|||
</LinearLayout>
|
||||
</com.facebook.shimmer.ShimmerFrameLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/result_smallscreen_holder"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:descendantFocusability="blocksDescendants">
|
||||
|
||||
<include layout="@layout/fragment_trailer" />
|
||||
</FrameLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
|
@ -208,7 +199,7 @@
|
|||
android:contentDescription="@string/go_back"
|
||||
android:focusable="true"
|
||||
android:gravity="center_vertical"
|
||||
android:nextFocusDown="@id/result_description"
|
||||
android:nextFocusDown="@id/result_play_movie"
|
||||
android:src="@drawable/ic_baseline_arrow_back_24"
|
||||
app:tint="?attr/white" />
|
||||
|
||||
|
@ -230,11 +221,162 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/result_movie_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:animateLayoutChanges="true"
|
||||
android:orientation="vertical"
|
||||
tools:visibility="visible">
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/result_play_movie"
|
||||
style="@style/WhiteButton"
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
android:layout_marginStart="0dp"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_weight="1"
|
||||
android:minWidth="250dp"
|
||||
android:nextFocusUp="@id/result_back"
|
||||
android:nextFocusDown="@id/result_play_series"
|
||||
android:text="@string/play_movie_button"
|
||||
android:visibility="visible"
|
||||
app:icon="@drawable/ic_baseline_play_arrow_24">
|
||||
|
||||
</com.google.android.material.button.MaterialButton>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/series_holder"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/result_play_series"
|
||||
style="@style/WhiteButton"
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
android:layout_marginStart="0dp"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_weight="1"
|
||||
android:minWidth="250dp"
|
||||
android:nextFocusUp="@id/result_play_movie"
|
||||
android:nextFocusDown="@id/result_resume_series"
|
||||
android:text="@string/play_episode"
|
||||
android:visibility="visible"
|
||||
app:icon="@drawable/ic_baseline_play_arrow_24" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/result_resume_series"
|
||||
style="@style/WhiteButton"
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
android:layout_marginStart="0dp"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_weight="1"
|
||||
android:minWidth="250dp"
|
||||
android:nextFocusUp="@id/result_play_series"
|
||||
android:nextFocusDown="@id/result_play_trailer"
|
||||
android:text="@string/resume"
|
||||
android:visibility="visible"
|
||||
app:icon="@drawable/ic_baseline_play_arrow_24" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/result_play_trailer"
|
||||
style="@style/WhiteButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_marginStart="0dp"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_weight="1"
|
||||
android:minWidth="250dp"
|
||||
android:nextFocusUp="@id/result_resume_series"
|
||||
android:nextFocusDown="@id/result_bookmark_button"
|
||||
android:text="@string/play_trailer_button"
|
||||
android:visibility="gone"
|
||||
app:icon="@drawable/ic_baseline_play_arrow_24"
|
||||
tools:visibility="visible">
|
||||
|
||||
</com.google.android.material.button.MaterialButton>
|
||||
|
||||
<!-- <com.lagradost.cloudstream3.ui.download.button.DownloadButton
|
||||
android:visibility="gone"
|
||||
android:id="@+id/download_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:minWidth="250dp"
|
||||
app:download_layout="@layout/download_button_layout" />
|
||||
-->
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/result_bookmark_button"
|
||||
style="@style/BlackButton"
|
||||
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_marginStart="0dp"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_weight="1"
|
||||
android:minWidth="250dp"
|
||||
android:nextFocusUp="@id/result_play_trailer"
|
||||
android:nextFocusDown="@id/result_resume_series_button"
|
||||
android:text="@string/type_none"
|
||||
android:visibility="visible" />
|
||||
<LinearLayout
|
||||
android:id="@+id/result_resume_progress_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible">
|
||||
|
||||
<androidx.core.widget.ContentLoadingProgressBar
|
||||
android:id="@+id/result_resume_series_progress"
|
||||
style="?android:attr/progressBarStyleHorizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="20dp"
|
||||
android:layout_gravity="end|center_vertical"
|
||||
android:layout_weight="1"
|
||||
android:indeterminate="false"
|
||||
android:max="100"
|
||||
android:paddingEnd="10dp"
|
||||
android:progress="0"
|
||||
android:progressBackgroundTint="?attr/colorPrimary"
|
||||
android:visibility="visible"
|
||||
tools:progress="50"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/result_resume_series_progress_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:paddingEnd="5dp"
|
||||
android:textColor="?attr/grayTextColor"
|
||||
tools:ignore="RtlSymmetry"
|
||||
tools:text="69m remaining" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/result_poster_holder"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:visibility="gone"
|
||||
app:cardCornerRadius="@dimen/rounded_image_radius">
|
||||
|
||||
<ImageView
|
||||
|
@ -250,7 +392,7 @@
|
|||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.lagradost.cloudstream3.widget.FlowLayout
|
||||
|
@ -298,18 +440,18 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:fadingEdgeLength="30dp"
|
||||
android:foreground="@drawable/outline_drawable"
|
||||
android:maxLength="1000"
|
||||
android:maxLines="7"
|
||||
android:nextFocusUp="@id/result_back"
|
||||
android:nextFocusDown="@id/result_play_movie"
|
||||
android:nextFocusDown="@id/result_bookmark_button"
|
||||
android:padding="5dp"
|
||||
android:requiresFadingEdge="vertical"
|
||||
android:textColor="?attr/textColor"
|
||||
android:textSize="15sp"
|
||||
tools:text="Ryan Quicksave Romano is an eccentric adventurer with a strange power: he can create a save-point in time and redo his life whenever he dies. Arriving in New Rome, the glitzy capital of sin of a rebuilding Europe, he finds the city torn between mega-corporations, sponsored heroes, superpowered criminals, and true monsters. It's a time of chaos, where potions can grant the power to rule the world and dangers lurk everywhere. " />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -328,8 +470,8 @@
|
|||
android:id="@+id/result_cast_items"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
android:descendantFocusability="afterDescendants"
|
||||
|
||||
android:fadingEdge="horizontal"
|
||||
android:focusable="false"
|
||||
android:focusableInTouchMode="false"
|
||||
|
@ -420,87 +562,15 @@
|
|||
app:icon="@drawable/ic_baseline_add_24" />
|
||||
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/result_movie_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:animateLayoutChanges="true"
|
||||
android:orientation="horizontal"
|
||||
tools:visibility="visible">
|
||||
<!--<LinearLayout
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/result_play_movie"
|
||||
style="@style/WhiteButton"
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
android:layout_marginStart="0dp"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_weight="1"
|
||||
android:minWidth="250dp"
|
||||
android:nextFocusRight="@id/result_play_trailer"
|
||||
android:nextFocusUp="@id/result_cast_items"
|
||||
android:nextFocusDown="@id/result_resume_series_button"
|
||||
android:text="@string/play_movie_button"
|
||||
android:visibility="visible"
|
||||
app:icon="@drawable/ic_baseline_play_arrow_24">
|
||||
|
||||
</com.google.android.material.button.MaterialButton>
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/result_play_trailer"
|
||||
style="@style/WhiteButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_marginStart="0dp"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_weight="1"
|
||||
android:minWidth="250dp"
|
||||
android:nextFocusRight="@id/download_button"
|
||||
android:nextFocusUp="@id/result_cast_items"
|
||||
android:nextFocusDown="@id/result_resume_series_button"
|
||||
android:text="@string/play_trailer_button"
|
||||
android:visibility="gone"
|
||||
app:icon="@drawable/ic_baseline_play_arrow_24">
|
||||
|
||||
</com.google.android.material.button.MaterialButton>
|
||||
|
||||
<com.lagradost.cloudstream3.ui.download.button.DownloadButton
|
||||
android:visibility="gone"
|
||||
android:id="@+id/download_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:minWidth="250dp"
|
||||
app:download_layout="@layout/download_button_layout" />
|
||||
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/result_bookmark_button"
|
||||
style="@style/BlackButton"
|
||||
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_weight="1"
|
||||
android:minWidth="250dp"
|
||||
android:nextFocusLeft="@id/download_button"
|
||||
android:nextFocusRight="@id/result_bookmark_button"
|
||||
android:nextFocusDown="@id/result_resume_series_button"
|
||||
android:text="@string/type_none"
|
||||
android:visibility="visible" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/result_resume_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible">
|
||||
tools:visibility="gone">
|
||||
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
|
@ -551,46 +621,10 @@
|
|||
android:textStyle="bold"
|
||||
tools:text="S1E1 Episode 1" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/result_resume_series_progress_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:textColor="?attr/grayTextColor"
|
||||
tools:ignore="RtlSymmetry"
|
||||
tools:text="69m remaining" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>-->
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/result_resume_progress_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="10dp"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible">
|
||||
|
||||
<androidx.core.widget.ContentLoadingProgressBar
|
||||
android:id="@+id/result_resume_series_progress"
|
||||
style="?android:attr/progressBarStyleHorizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="20dp"
|
||||
android:layout_gravity="end|center_vertical"
|
||||
android:layout_weight="1"
|
||||
android:indeterminate="false"
|
||||
android:max="100"
|
||||
android:progress="0"
|
||||
android:progressBackgroundTint="?attr/colorPrimary"
|
||||
android:visibility="visible"
|
||||
tools:progress="50"
|
||||
tools:visibility="visible" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -723,6 +723,32 @@
|
|||
<item name="strokeColor">@color/tag_stroke_color</item>
|
||||
</style>
|
||||
|
||||
<style name="RegularButtonTV">
|
||||
<item name="android:stateListAnimator">@null</item>
|
||||
<item name="strokeColor">@color/transparent</item>
|
||||
<item name="backgroundTint">@null</item>
|
||||
<item name="android:background">@drawable/player_button_tv</item>
|
||||
<item name="rippleColor">@color/white</item>
|
||||
<item name="android:shadowColor">@color/transparent</item>
|
||||
|
||||
<item name="iconTint">@color/player_on_button_tv</item>
|
||||
<item name="textColor">@color/player_on_button_tv</item>
|
||||
<item name="android:textColor">@color/player_on_button_tv</item>
|
||||
<item name="android:layout_width">200dp</item>
|
||||
<item name="android:layout_height">30dp</item>
|
||||
<item name="iconSize">16dp</item>
|
||||
<item name="android:gravity">center</item>
|
||||
<item name="android:layout_gravity">center</item>
|
||||
<item name="android:baselineAligned">false</item>
|
||||
<item name="textAllCaps">false</item>
|
||||
<item name="android:textStyle">bold</item>
|
||||
<item name="android:textSize">10sp</item>
|
||||
<item name="android:layout_marginStart">4dp</item>
|
||||
<item name="android:layout_marginEnd">4dp</item>
|
||||
<item name="android:insetBottom">0dp</item>
|
||||
<item name="android:insetTop">0dp</item>
|
||||
</style>
|
||||
|
||||
<style name="VideoButtonTV">
|
||||
<item name="android:stateListAnimator">@null</item>
|
||||
<item name="strokeColor">@color/transparent</item>
|
||||
|
|
Loading…
Reference in a new issue