mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
testing tv UI 2, NOT FINISHED
This commit is contained in:
parent
35084389a1
commit
51a6e917b5
3 changed files with 356 additions and 268 deletions
|
@ -170,6 +170,13 @@ class ResultFragmentTv : Fragment() {
|
||||||
super.onStop()
|
super.onStop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun toggleEpisodes(show: Boolean) {
|
||||||
|
binding?.apply {
|
||||||
|
episodeHolderTv.isVisible = show
|
||||||
|
leftLayout.isGone = show
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
@ -191,6 +198,62 @@ class ResultFragmentTv : Fragment() {
|
||||||
// ===== ===== =====
|
// ===== ===== =====
|
||||||
|
|
||||||
binding?.apply {
|
binding?.apply {
|
||||||
|
|
||||||
|
val leftListener: View.OnFocusChangeListener =
|
||||||
|
View.OnFocusChangeListener { _, hasFocus ->
|
||||||
|
if (!hasFocus) return@OnFocusChangeListener
|
||||||
|
toggleEpisodes(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
val rightListener: View.OnFocusChangeListener =
|
||||||
|
View.OnFocusChangeListener { _, hasFocus ->
|
||||||
|
if (!hasFocus) return@OnFocusChangeListener
|
||||||
|
toggleEpisodes(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
resultPlayMovie.onFocusChangeListener = leftListener
|
||||||
|
resultPlaySeries.onFocusChangeListener = leftListener
|
||||||
|
resultResumeSeries.onFocusChangeListener = leftListener
|
||||||
|
resultPlayTrailer.onFocusChangeListener = leftListener
|
||||||
|
resultEpisodesShow.onFocusChangeListener = rightListener
|
||||||
|
resultDescription.onFocusChangeListener = leftListener
|
||||||
|
resultBookmarkButton.onFocusChangeListener = leftListener
|
||||||
|
redirectToPlay.setOnFocusChangeListener { _, hasFocus ->
|
||||||
|
if (!hasFocus) return@setOnFocusChangeListener
|
||||||
|
toggleEpisodes(false)
|
||||||
|
|
||||||
|
binding?.apply {
|
||||||
|
val views = listOf(
|
||||||
|
resultPlayMovie,
|
||||||
|
resultPlaySeries,
|
||||||
|
resultResumeSeries,
|
||||||
|
resultPlayTrailer,
|
||||||
|
resultBookmarkButton
|
||||||
|
)
|
||||||
|
for (requestView in views) {
|
||||||
|
if (!requestView.isVisible) continue
|
||||||
|
if (requestView.requestFocus()) break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
redirectToEpisodes.setOnFocusChangeListener { _, hasFocus ->
|
||||||
|
if (!hasFocus) return@setOnFocusChangeListener
|
||||||
|
toggleEpisodes(true)
|
||||||
|
binding?.apply {
|
||||||
|
val views = listOf(
|
||||||
|
resultSeasonSelection,
|
||||||
|
resultRangeSelection,
|
||||||
|
resultDubSelection,
|
||||||
|
resultPlayTrailer,
|
||||||
|
resultEpisodes
|
||||||
|
)
|
||||||
|
for (requestView in views) {
|
||||||
|
if (!requestView.isVisible) continue
|
||||||
|
if (requestView.requestFocus()) break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
resultEpisodes.layoutManager =
|
resultEpisodes.layoutManager =
|
||||||
LinearListLayout(resultEpisodes.context).apply {
|
LinearListLayout(resultEpisodes.context).apply {
|
||||||
setVertical()
|
setVertical()
|
||||||
|
@ -287,7 +350,7 @@ class ResultFragmentTv : Fragment() {
|
||||||
// if movie then hide both as movie button is
|
// if movie then hide both as movie button is
|
||||||
// always visible on movies, this is done in movie observe
|
// always visible on movies, this is done in movie observe
|
||||||
|
|
||||||
if(resume?.isMovie == true) {
|
if (resume?.isMovie == true) {
|
||||||
resultPlaySeries.isVisible = false
|
resultPlaySeries.isVisible = false
|
||||||
resultResumeSeries.isVisible = false
|
resultResumeSeries.isVisible = false
|
||||||
return@observeNullable
|
return@observeNullable
|
||||||
|
@ -375,6 +438,7 @@ class ResultFragmentTv : Fragment() {
|
||||||
binding?.apply {
|
binding?.apply {
|
||||||
resultPlayMovie.isVisible = data is Resource.Success
|
resultPlayMovie.isVisible = data is Resource.Success
|
||||||
seriesHolder.isVisible = data == null
|
seriesHolder.isVisible = data == null
|
||||||
|
resultEpisodesShow.isVisible = data == null
|
||||||
|
|
||||||
(data as? Resource.Success)?.value?.let { (text, ep) ->
|
(data as? Resource.Success)?.value?.let { (text, ep) ->
|
||||||
resultPlayMovie.setText(text)
|
resultPlayMovie.setText(text)
|
||||||
|
@ -489,7 +553,7 @@ class ResultFragmentTv : Fragment() {
|
||||||
observeNullable(viewModel.episodes) { episodes ->
|
observeNullable(viewModel.episodes) { episodes ->
|
||||||
binding?.apply {
|
binding?.apply {
|
||||||
resultEpisodes.isVisible = episodes is Resource.Success
|
resultEpisodes.isVisible = episodes is Resource.Success
|
||||||
resultEpisodeLoading.isVisible = episodes is Resource.Loading
|
// resultEpisodeLoading.isVisible = episodes is Resource.Loading
|
||||||
if (episodes is Resource.Success) {
|
if (episodes is Resource.Success) {
|
||||||
val first = episodes.value.firstOrNull()
|
val first = episodes.value.firstOrNull()
|
||||||
if (first != null) {
|
if (first != null) {
|
||||||
|
@ -530,24 +594,30 @@ class ResultFragmentTv : Fragment() {
|
||||||
|
|
||||||
val hasEpisodes =
|
val hasEpisodes =
|
||||||
!(resultEpisodes.adapter as? EpisodeAdapter?)?.cardList.isNullOrEmpty()
|
!(resultEpisodes.adapter as? EpisodeAdapter?)?.cardList.isNullOrEmpty()
|
||||||
|
/*val focus = activity?.currentFocus
|
||||||
|
|
||||||
if (hasEpisodes) {
|
if (hasEpisodes) {
|
||||||
// Make it impossible to focus anywhere else!
|
// Make it impossible to focus anywhere else!
|
||||||
temporaryNoFocus.isFocusable = true
|
temporaryNoFocus.isFocusable = true
|
||||||
temporaryNoFocus.requestFocus()
|
temporaryNoFocus.requestFocus()
|
||||||
}
|
}*/
|
||||||
|
|
||||||
(resultEpisodes.adapter as? EpisodeAdapter)?.updateList(episodes.value)
|
(resultEpisodes.adapter as? EpisodeAdapter)?.updateList(episodes.value)
|
||||||
|
|
||||||
if (hasEpisodes) main {
|
/* if (hasEpisodes) main {
|
||||||
delay(500)
|
|
||||||
temporaryNoFocus.isFocusable = false
|
|
||||||
// This might make some people sad as it changes the focus when leaving an episode :(
|
|
||||||
temporaryNoFocus.requestFocus()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasNoFocus())
|
delay(500)
|
||||||
binding?.resultEpisodes?.requestFocus()
|
// This might make some people sad as it changes the focus when leaving an episode :(
|
||||||
|
if(focus?.requestFocus() == true) {
|
||||||
|
temporaryNoFocus.isFocusable = false
|
||||||
|
return@main
|
||||||
|
}
|
||||||
|
temporaryNoFocus.isFocusable = false
|
||||||
|
temporaryNoFocus.requestFocus()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasNoFocus())
|
||||||
|
binding?.resultEpisodes?.requestFocus()*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -582,7 +652,20 @@ class ResultFragmentTv : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
backgroundPoster.setImage(d.posterBackgroundImage, radius = 10)
|
val error = listOf(
|
||||||
|
R.drawable.profile_bg_dark_blue,
|
||||||
|
R.drawable.profile_bg_blue,
|
||||||
|
R.drawable.profile_bg_orange,
|
||||||
|
R.drawable.profile_bg_pink,
|
||||||
|
R.drawable.profile_bg_purple,
|
||||||
|
R.drawable.profile_bg_red,
|
||||||
|
R.drawable.profile_bg_teal
|
||||||
|
).random()
|
||||||
|
backgroundPoster.setImage(
|
||||||
|
d.posterBackgroundImage ?: UiImage.Drawable(error),
|
||||||
|
radius = 0,
|
||||||
|
errorImageDrawable = error
|
||||||
|
)
|
||||||
|
|
||||||
resultComingSoon.isVisible = d.comingSoon
|
resultComingSoon.isVisible = d.comingSoon
|
||||||
resultDataHolder.isGone = d.comingSoon
|
resultDataHolder.isGone = d.comingSoon
|
||||||
|
|
|
@ -126,16 +126,18 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
|
||||||
|
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:visibility="gone"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="200dp">
|
android:layout_height="200dp"
|
||||||
|
android:visibility="visible">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/background_poster"
|
android:id="@+id/background_poster"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="200dp"
|
android:layout_height="250dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:alpha="0.8"
|
||||||
android:scaleType="centerCrop"
|
android:scaleType="centerCrop"
|
||||||
tools:src="@drawable/example_poster" />
|
tools:src="@drawable/profile_bg_dark_blue" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -144,117 +146,267 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
|
||||||
android:src="@drawable/background_shadow">
|
android:src="@drawable/background_shadow">
|
||||||
|
|
||||||
</ImageView>
|
</ImageView>
|
||||||
|
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<View
|
||||||
android:orientation="horizontal"
|
android:id="@+id/redirect_to_episodes"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="0dp"></View>
|
||||||
|
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/redirect_to_play"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="0dp"></View>
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_weight="1"
|
android:id="@+id/linearLayout2"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical">
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="10dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/result_title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textColor="?attr/textColor"
|
||||||
|
android:textSize="20sp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
tools:text="The Perfect Run The Perfect Run" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/right_layout"
|
android:id="@+id/result_next_airing_holder"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="start"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical">
|
||||||
android:padding="10dp"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/left_layout"
|
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/result_title"
|
android:id="@+id/result_episodes_text"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="30dp"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="5dp"
|
android:layout_gravity="center_vertical"
|
||||||
android:gravity="center_vertical"
|
android:layout_marginEnd="20dp"
|
||||||
android:maxLines="1"
|
|
||||||
android:textColor="?attr/textColor"
|
android:textColor="?attr/textColor"
|
||||||
android:textSize="20sp"
|
android:textSize="17sp"
|
||||||
android:textStyle="bold"
|
android:textStyle="normal"
|
||||||
tools:text="The Perfect Run The Perfect Run" />
|
android:visibility="gone"
|
||||||
|
tools:text="8 Episodes" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/result_next_airing"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:gravity="center"
|
||||||
|
android:textColor="?attr/grayTextColor"
|
||||||
|
android:textSize="17sp"
|
||||||
|
android:textStyle="normal"
|
||||||
|
tools:text="Episode 1022 will be released in" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/result_next_airing_time"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:gravity="start"
|
||||||
|
android:textColor="?attr/textColor"
|
||||||
|
android:textSize="17sp"
|
||||||
|
android:textStyle="normal"
|
||||||
|
tools:text="5d 3h 30m" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/left_layout"
|
android:id="@+id/result_movie_parent"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="start"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:animateLayoutChanges="true"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:padding="10dp"
|
tools:visibility="visible">
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/right_layout"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
|
||||||
|
|
||||||
<com.lagradost.cloudstream3.widget.FlowLayout
|
<com.google.android.material.button.MaterialButton
|
||||||
android:layout_width="match_parent"
|
android:id="@+id/result_play_movie"
|
||||||
|
style="@style/ResultButtonTV"
|
||||||
|
|
||||||
|
android:nextFocusRight="@id/redirect_to_episodes"
|
||||||
|
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" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/series_holder"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:itemSpacing="10dp">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/result_meta_site"
|
android:id="@+id/result_play_series"
|
||||||
style="@style/SmallBlackButton"
|
style="@style/ResultButtonTV"
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
tools:text="Gogoanime" />
|
|
||||||
|
|
||||||
<TextView
|
android:nextFocusRight="@id/redirect_to_episodes"
|
||||||
android:id="@+id/result_meta_type"
|
android:nextFocusUp="@id/result_play_movie"
|
||||||
style="@style/ResultInfoText"
|
android:nextFocusDown="@id/result_resume_series"
|
||||||
tools:text="Movie" />
|
android:text="@string/play_episode"
|
||||||
|
android:visibility="visible"
|
||||||
|
app:icon="@drawable/ic_baseline_play_arrow_24"
|
||||||
|
tools:visibility="gone" />
|
||||||
|
|
||||||
<TextView
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/result_meta_year"
|
android:id="@+id/result_resume_series"
|
||||||
style="@style/ResultInfoText"
|
style="@style/ResultButtonTV"
|
||||||
tools:text="2022" />
|
|
||||||
|
|
||||||
<TextView
|
android:nextFocusRight="@id/redirect_to_episodes"
|
||||||
android:id="@+id/result_meta_rating"
|
android:nextFocusUp="@id/result_play_series"
|
||||||
style="@style/ResultInfoText"
|
android:nextFocusDown="@id/result_play_trailer"
|
||||||
tools:text="Rated: 8.5/10.0" />
|
android:text="@string/resume"
|
||||||
|
android:visibility="visible"
|
||||||
|
app:icon="@drawable/ic_baseline_play_arrow_24"
|
||||||
|
tools:visibility="gone" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/result_meta_status"
|
|
||||||
style="@style/ResultInfoText"
|
|
||||||
tools:text="Ongoing" />
|
|
||||||
|
|
||||||
<TextView
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/result_meta_duration"
|
android:id="@+id/result_play_trailer"
|
||||||
style="@style/ResultInfoText"
|
style="@style/ResultButtonTV"
|
||||||
tools:text="121min" />
|
|
||||||
</com.lagradost.cloudstream3.widget.FlowLayout>
|
|
||||||
|
|
||||||
|
android:nextFocusRight="@id/redirect_to_episodes"
|
||||||
|
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="gone" />
|
||||||
|
|
||||||
|
|
||||||
|
<!-- <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/ResultButtonTV"
|
||||||
|
android:nextFocusRight="@id/redirect_to_episodes"
|
||||||
|
android:nextFocusUp="@id/result_play_trailer"
|
||||||
|
|
||||||
|
android:nextFocusDown="@id/result_episodes_show"
|
||||||
|
android:text="@string/type_none"
|
||||||
|
android:visibility="visible"
|
||||||
|
app:icon="@drawable/ic_baseline_bookmark_24" />
|
||||||
|
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/result_episodes_show"
|
||||||
|
style="@style/ResultButtonTV"
|
||||||
|
|
||||||
|
android:nextFocusRight="@id/redirect_to_episodes"
|
||||||
|
android:nextFocusUp="@id/result_bookmark_button"
|
||||||
|
android:text="@string/episodes"
|
||||||
|
android:visibility="visible"
|
||||||
|
app:icon="@drawable/ic_baseline_sort_24"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/left_layout"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="end"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="10dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/linearLayout2"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<com.lagradost.cloudstream3.widget.FlowLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:itemSpacing="10dp">
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/result_meta_site"
|
||||||
|
style="@style/SmallWhiteButton"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
tools:text="Gogoanime" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/result_description"
|
android:id="@+id/result_meta_type"
|
||||||
android:layout_width="match_parent"
|
style="@style/ResultInfoText"
|
||||||
android:layout_height="wrap_content"
|
tools:text="Movie" />
|
||||||
android:ellipsize="end"
|
|
||||||
android:fadingEdgeLength="30dp"
|
|
||||||
android:foreground="@drawable/outline_drawable"
|
|
||||||
android:maxLines="7"
|
|
||||||
android:nextFocusUp="@id/result_back"
|
|
||||||
android:nextFocusDown="@id/result_bookmark_button"
|
|
||||||
android:padding="5dp"
|
|
||||||
android:requiresFadingEdge="vertical"
|
|
||||||
android:textColor="?attr/textColor"
|
|
||||||
android:textSize="12sp"
|
|
||||||
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. " />
|
|
||||||
|
|
||||||
<com.google.android.material.chip.ChipGroup
|
<TextView
|
||||||
android:id="@+id/result_tag"
|
android:id="@+id/result_meta_year"
|
||||||
style="@style/ChipParent"
|
style="@style/ResultInfoText"
|
||||||
android:layout_width="match_parent"
|
tools:text="2022" />
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/result_meta_rating"
|
||||||
|
style="@style/ResultInfoText"
|
||||||
|
tools:text="Rated: 8.5/10.0" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/result_meta_status"
|
||||||
|
style="@style/ResultInfoText"
|
||||||
|
tools:text="Ongoing" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/result_meta_duration"
|
||||||
|
style="@style/ResultInfoText"
|
||||||
|
tools:text="121min" />
|
||||||
|
</com.lagradost.cloudstream3.widget.FlowLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/result_description"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:fadingEdgeLength="30dp"
|
||||||
|
android:foreground="@drawable/outline_drawable"
|
||||||
|
android:maxLines="7"
|
||||||
|
android:nextFocusUp="@id/result_back"
|
||||||
|
android:nextFocusDown="@id/result_bookmark_button"
|
||||||
|
android:padding="5dp"
|
||||||
|
android:requiresFadingEdge="vertical"
|
||||||
|
android:textColor="?attr/textColor"
|
||||||
|
android:textSize="12sp"
|
||||||
|
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. " />
|
||||||
|
|
||||||
|
<com.google.android.material.chip.ChipGroup
|
||||||
|
android:id="@+id/result_tag"
|
||||||
|
style="@style/ChipParent"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:visibility="gone">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/result_resume_progress_holder"
|
android:id="@+id/result_resume_progress_holder"
|
||||||
|
@ -274,10 +426,11 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:indeterminate="false"
|
android:indeterminate="false"
|
||||||
android:max="100"
|
android:max="100"
|
||||||
|
|
||||||
android:paddingEnd="10dp"
|
android:paddingEnd="10dp"
|
||||||
android:progress="0"
|
android:progress="0"
|
||||||
android:progressBackgroundTint="?attr/colorPrimary"
|
android:progressBackgroundTint="?attr/colorPrimary"
|
||||||
android:visibility="visible"
|
android:visibility="gone"
|
||||||
tools:progress="50"
|
tools:progress="50"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
@ -291,158 +444,35 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
android:paddingEnd="5dp"
|
android:paddingEnd="5dp"
|
||||||
android:textColor="?attr/grayTextColor"
|
android:textColor="?attr/grayTextColor"
|
||||||
|
android:visibility="gone"
|
||||||
tools:ignore="RtlSymmetry"
|
tools:ignore="RtlSymmetry"
|
||||||
tools:text="69m remaining" />
|
tools:text="69m remaining" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/result_next_airing_holder"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="start"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:visibility="gone"
|
|
||||||
android:id="@+id/result_episodes_text"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:layout_marginEnd="20dp"
|
|
||||||
android:textColor="?attr/textColor"
|
|
||||||
android:textSize="17sp"
|
|
||||||
android:textStyle="normal"
|
|
||||||
tools:text="8 Episodes" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/result_next_airing"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:gravity="center"
|
|
||||||
android:textColor="?attr/grayTextColor"
|
|
||||||
android:textSize="17sp"
|
|
||||||
android:textStyle="normal"
|
|
||||||
tools:text="Episode 1022 will be released in" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/result_next_airing_time"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:gravity="center"
|
|
||||||
android:paddingStart="5dp"
|
|
||||||
android:paddingEnd="5dp"
|
|
||||||
android:textColor="?attr/textColor"
|
|
||||||
android:textSize="17sp"
|
|
||||||
android:textStyle="normal"
|
|
||||||
tools:text="5d 3h 30m" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/result_movie_parent"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:animateLayoutChanges="true"
|
|
||||||
android:orientation="vertical"
|
|
||||||
tools:visibility="visible">
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/result_play_movie"
|
|
||||||
style="@style/ResultButtonTV"
|
|
||||||
|
|
||||||
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:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/result_play_series"
|
|
||||||
style="@style/ResultButtonTV"
|
|
||||||
|
|
||||||
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"
|
|
||||||
tools:visibility="gone" />
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/result_resume_series"
|
|
||||||
style="@style/ResultButtonTV"
|
|
||||||
|
|
||||||
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"
|
|
||||||
tools:visibility="gone" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/result_play_trailer"
|
|
||||||
style="@style/ResultButtonTV"
|
|
||||||
|
|
||||||
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="gone">
|
|
||||||
|
|
||||||
</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/ResultButtonTV"
|
|
||||||
android:nextFocusUp="@id/result_play_trailer"
|
|
||||||
|
|
||||||
android:nextFocusDown="@id/result_resume_series_button"
|
|
||||||
android:text="@string/type_none"
|
|
||||||
android:visibility="visible"
|
|
||||||
app:icon="@drawable/ic_baseline_bookmark_24" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_weight="1"
|
android:id="@+id/episode_holder_tv"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="500dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="horizontal">
|
android:layout_gravity="end"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:visibility="visible">
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/result_season_selection"
|
android:id="@+id/result_season_selection"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
||||||
android:nextFocusUp="@id/result_resume_series_button"
|
android:nextFocusLeft="@id/result_episodes_show"
|
||||||
android:nextFocusDown="@id/result_range_selection"
|
android:nextFocusRight="@id/result_range_selection"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:paddingBottom="10dp"
|
android:paddingBottom="10dp"
|
||||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||||
|
@ -453,8 +483,8 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
||||||
android:nextFocusUp="@id/result_season_selection"
|
android:nextFocusLeft="@id/result_season_selection"
|
||||||
android:nextFocusDown="@id/result_dub_selection"
|
android:nextFocusRight="@id/result_dub_selection"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:paddingBottom="10dp"
|
android:paddingBottom="10dp"
|
||||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||||
|
@ -465,41 +495,14 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
||||||
android:nextFocusUp="@id/result_range_selection"
|
android:nextFocusLeft="@id/result_range_selection"
|
||||||
android:nextFocusDown="@id/result_episodes"
|
android:nextFocusRight="@id/result_episodes"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:paddingBottom="10dp"
|
android:paddingBottom="10dp"
|
||||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||||
tools:listitem="@layout/result_selection" />
|
tools:listitem="@layout/result_selection" />
|
||||||
|
|
||||||
|
|
||||||
<com.facebook.shimmer.ShimmerFrameLayout
|
|
||||||
android:id="@+id/result_episode_loading"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:layout_marginTop="15dp"
|
|
||||||
android:orientation="vertical"
|
|
||||||
app:shimmer_auto_start="true"
|
|
||||||
app:shimmer_base_alpha="0.2"
|
|
||||||
app:shimmer_duration="@integer/loading_time"
|
|
||||||
app:shimmer_highlight_alpha="0.3"
|
|
||||||
tools:visibility="gone">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<include layout="@layout/loading_episode" />
|
|
||||||
|
|
||||||
<include layout="@layout/loading_episode" />
|
|
||||||
|
|
||||||
<include layout="@layout/loading_episode" />
|
|
||||||
|
|
||||||
<include layout="@layout/loading_episode" />
|
|
||||||
</LinearLayout>
|
|
||||||
</com.facebook.shimmer.ShimmerFrameLayout>
|
|
||||||
<!--<androidx.core.widget.ContentLoadingProgressBar
|
<!--<androidx.core.widget.ContentLoadingProgressBar
|
||||||
android:id="@+id/result_episode_loading"
|
android:id="@+id/result_episode_loading"
|
||||||
|
|
||||||
|
@ -513,8 +516,8 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:nextFocusUp="@id/result_dub_selection"
|
android:nextFocusLeft="@id/result_dub_selection"
|
||||||
android:nextFocusDown="@id/result_recommendations_filter_selection"
|
android:nextFocusRight="@id/result_recommendations_filter_selection"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||||
tools:listitem="@layout/result_episode" />
|
tools:listitem="@layout/result_episode" />
|
||||||
|
@ -529,9 +532,7 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
|
||||||
android:nextFocusUp="@id/temporary_no_focus"
|
android:nextFocusUp="@id/temporary_no_focus"
|
||||||
android:nextFocusDown="@id/temporary_no_focus" />
|
android:nextFocusDown="@id/temporary_no_focus" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<androidx.core.widget.NestedScrollView
|
<androidx.core.widget.NestedScrollView
|
||||||
|
|
|
@ -724,8 +724,12 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="ResultButtonTV" parent="@style/RegularButtonTV">
|
<style name="ResultButtonTV" parent="@style/RegularButtonTV">
|
||||||
|
<item name="iconGravity">start</item>
|
||||||
|
<item name="android:gravity">center_vertical</item>
|
||||||
<item name="android:layout_width">250dp</item>
|
<item name="android:layout_width">250dp</item>
|
||||||
<item name="android:layout_marginBottom">5dp</item>
|
<item name="android:layout_marginBottom">5dp</item>
|
||||||
|
<item name="android:layout_marginStart">0dp</item>
|
||||||
|
<item name="android:layout_marginEnd">0dp</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="RegularButtonTV">
|
<style name="RegularButtonTV">
|
||||||
|
|
Loading…
Reference in a new issue