From 48268e62c6818573ea899ccb4dd3c696c64c381c Mon Sep 17 00:00:00 2001 From: VyomV Date: Mon, 4 May 2026 23:04:33 +0530 Subject: [PATCH 1/4] Add toggle between logo and full title on click in details screen --- .../cloudstream3/ui/result/ResultFragment.kt | 79 +++++++++++++++++++ .../ui/result/ResultFragmentPhone.kt | 8 ++ .../ui/result/ResultFragmentTv.kt | 8 ++ app/src/main/res/layout/fragment_result.xml | 26 +++++- .../main/res/layout/fragment_result_tv.xml | 28 ++++++- app/src/main/res/values/strings.xml | 2 + 6 files changed, 149 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt index cbf94fd9796..9cdfdbcded6 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt @@ -277,6 +277,85 @@ object ResultFragment { ) } + /** + * Sets up the click-toggle interaction between the logo image and the full title text. + * When the logo is clicked, it crossfades to the full title text and vice versa. + * + * @param logoView The logo ImageView in the banner area. + * @param fullTitleView The TextView for displaying the full title (overlaid in the banner). + * @param title The full title string to display. + * @param hasLogo Whether a logo URL exists (toggle is only enabled when true). + */ + fun setupLogoTitleToggle( + logoView: ImageView, + fullTitleView: TextView, + title: String, + hasLogo: Boolean + ) { + fullTitleView.text = title + + if (!hasLogo) { + // No logo available — keep full title hidden, no toggle needed + fullTitleView.isVisible = false + logoView.setOnClickListener(null) + fullTitleView.setOnClickListener(null) + return + } + + // Reset to default state: logo visible, title hidden + fullTitleView.isVisible = false + fullTitleView.alpha = 0f + logoView.alpha = 1f + + logoView.setOnClickListener { + if (!logoView.isClickable) return@setOnClickListener + logoView.isClickable = false + fullTitleView.isClickable = false + + fullTitleView.isVisible = true + fullTitleView.animate() + .alpha(1f) + .setDuration(200) + .withEndAction { + fullTitleView.isClickable = true + } + .start() + + logoView.animate() + .alpha(0f) + .setDuration(200) + .withEndAction { + logoView.isVisible = false + logoView.isClickable = true + } + .start() + } + + fullTitleView.setOnClickListener { + if (!fullTitleView.isClickable) return@setOnClickListener + fullTitleView.isClickable = false + logoView.isClickable = false + + logoView.isVisible = true + logoView.animate() + .alpha(1f) + .setDuration(200) + .withEndAction { + logoView.isClickable = true + } + .start() + + fullTitleView.animate() + .alpha(0f) + .setDuration(200) + .withEndAction { + fullTitleView.isVisible = false + fullTitleView.isClickable = true + } + .start() + } + } + fun Fragment.getStoredData(): StoredData? { val context = this.context ?: this.activity ?: return null val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt index 38b24b26517..c1fc81d0296 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt @@ -66,6 +66,7 @@ import com.lagradost.cloudstream3.ui.player.PlayerView import com.lagradost.cloudstream3.ui.player.source_priority.QualityProfileDialog import com.lagradost.cloudstream3.ui.quicksearch.QuickSearchFragment import com.lagradost.cloudstream3.ui.result.ResultFragment.bindLogo +import com.lagradost.cloudstream3.ui.result.ResultFragment.setupLogoTitleToggle import com.lagradost.cloudstream3.ui.result.ResultFragment.getStoredData import com.lagradost.cloudstream3.ui.result.ResultFragment.updateUIEvent import com.lagradost.cloudstream3.ui.search.SearchAdapter @@ -975,6 +976,13 @@ open class ResultFragmentPhone : BaseFragment( logoView = backgroundPosterWatermarkBadge ) + setupLogoTitleToggle( + logoView = backgroundPosterWatermarkBadge, + fullTitleView = resultFullTitleText, + title = d.title, + hasLogo = !d.logoUrl.isNullOrBlank() + ) + var isExpanded = false resultDescription.apply { setTextHtml(d.plotText) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt index 70ca117432d..4fc2d2ffc03 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt @@ -37,6 +37,7 @@ import com.lagradost.cloudstream3.ui.player.GeneratorPlayer import com.lagradost.cloudstream3.ui.player.NEXT_WATCH_EPISODE_PERCENTAGE import com.lagradost.cloudstream3.ui.quicksearch.QuickSearchFragment import com.lagradost.cloudstream3.ui.result.ResultFragment.bindLogo +import com.lagradost.cloudstream3.ui.result.ResultFragment.setupLogoTitleToggle import com.lagradost.cloudstream3.ui.result.ResultFragment.getStoredData import com.lagradost.cloudstream3.ui.result.ResultFragment.updateUIEvent import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_FOCUSED @@ -921,6 +922,13 @@ class ResultFragmentTv : BaseFragment( logoView = backgroundPosterWatermarkBadgeHolder ) + setupLogoTitleToggle( + logoView = backgroundPosterWatermarkBadgeHolder, + fullTitleView = resultFullTitleText, + title = d.title, + hasLogo = !d.logoUrl.isNullOrBlank() + ) + comingSoon = d.comingSoon resultTvComingSoon.isVisible = d.comingSoon diff --git a/app/src/main/res/layout/fragment_result.xml b/app/src/main/res/layout/fragment_result.xml index a5c933d6a03..1cb1cbf831c 100644 --- a/app/src/main/res/layout/fragment_result.xml +++ b/app/src/main/res/layout/fragment_result.xml @@ -311,7 +311,31 @@ android:paddingBottom="4dp" android:adjustViewBounds="true" android:scaleType="fitStart" - android:contentDescription="@null" /> + android:focusable="true" + android:contentDescription="@string/result_logo_img_des" /> + + diff --git a/app/src/main/res/layout/fragment_result_tv.xml b/app/src/main/res/layout/fragment_result_tv.xml index 3dff8f0d535..e6cd81997bd 100644 --- a/app/src/main/res/layout/fragment_result_tv.xml +++ b/app/src/main/res/layout/fragment_result_tv.xml @@ -55,7 +55,33 @@ https://developer.android.com/design/ui/tv/samples/jet-fit android:layout_marginBottom="56dp" android:adjustViewBounds="true" android:scaleType="fitStart" - android:contentDescription="@null" /> + android:focusable="true" + android:focusableInTouchMode="true" + android:contentDescription="@string/result_logo_img_des" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 31cf951cf5f..611d5f7dab7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,6 +21,8 @@ Play from the Beginning Change Provider Preview Background + Logo + Full title Speed (%.2fx) Rated: %.1f From 939ce205de5d9e684bf40f2aefa83c7f2d06915e Mon Sep 17 00:00:00 2001 From: VyomV Date: Tue, 5 May 2026 00:44:08 +0530 Subject: [PATCH 2/4] Refactor toggle and fix nav --- .../cloudstream3/ui/result/ResultFragment.kt | 115 +++++++----------- .../ui/result/ResultFragmentPhone.kt | 8 -- .../ui/result/ResultFragmentTv.kt | 8 -- app/src/main/res/layout/fragment_result.xml | 23 ---- .../main/res/layout/fragment_result_tv.xml | 45 ++----- app/src/main/res/values/strings.xml | 1 - 6 files changed, 59 insertions(+), 141 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt index 9cdfdbcded6..fa55b720216 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt @@ -248,77 +248,36 @@ object ResultFragment { // Cancel it, as we want to remove the listener onSuccess race condition logoView.dispose() + // Clear any previous toggle listeners to ensure clean state on rebind + logoView.setOnClickListener(null) + titleView.setOnClickListener(null) + if (url.isNullOrBlank()) { logoView.isVisible = false titleView.isVisible = true return } + // Reset to the default state: logo visible, title hidden + logoView.alpha = 1f logoView.isVisible = true + titleView.alpha = 0f titleView.isVisible = false + titleView.isClickable = true + titleView.isFocusable = true + titleView.isFocusableInTouchMode = true - logoView.loadImage( - imageData = UiImage.Image(url, headers = headers), - builder = { - listener( - onSuccess = { _, _ -> - logoView.isVisible = true - titleView.isVisible = false - }, - onError = { _, _ -> - logoView.isVisible = false - titleView.isVisible = true - }, - onCancel = { - // If we manually cancel, then it should not do anything - } - ) - } - ) - } - - /** - * Sets up the click-toggle interaction between the logo image and the full title text. - * When the logo is clicked, it crossfades to the full title text and vice versa. - * - * @param logoView The logo ImageView in the banner area. - * @param fullTitleView The TextView for displaying the full title (overlaid in the banner). - * @param title The full title string to display. - * @param hasLogo Whether a logo URL exists (toggle is only enabled when true). - */ - fun setupLogoTitleToggle( - logoView: ImageView, - fullTitleView: TextView, - title: String, - hasLogo: Boolean - ) { - fullTitleView.text = title - - if (!hasLogo) { - // No logo available — keep full title hidden, no toggle needed - fullTitleView.isVisible = false - logoView.setOnClickListener(null) - fullTitleView.setOnClickListener(null) - return - } - - // Reset to default state: logo visible, title hidden - fullTitleView.isVisible = false - fullTitleView.alpha = 0f - logoView.alpha = 1f - + // Toggle: logo -> title logoView.setOnClickListener { - if (!logoView.isClickable) return@setOnClickListener - logoView.isClickable = false - fullTitleView.isClickable = false + if (!logoView.isEnabled) return@setOnClickListener + logoView.isEnabled = false + titleView.isEnabled = false - fullTitleView.isVisible = true - fullTitleView.animate() + titleView.isVisible = true + titleView.animate() .alpha(1f) .setDuration(200) - .withEndAction { - fullTitleView.isClickable = true - } + .withEndAction { titleView.isEnabled = true } .start() logoView.animate() @@ -326,34 +285,52 @@ object ResultFragment { .setDuration(200) .withEndAction { logoView.isVisible = false - logoView.isClickable = true + logoView.isEnabled = true } .start() } - fullTitleView.setOnClickListener { - if (!fullTitleView.isClickable) return@setOnClickListener - fullTitleView.isClickable = false - logoView.isClickable = false + // Toggle: title -> logo + titleView.setOnClickListener { + if (!titleView.isEnabled) return@setOnClickListener + titleView.isEnabled = false + logoView.isEnabled = false logoView.isVisible = true logoView.animate() .alpha(1f) .setDuration(200) - .withEndAction { - logoView.isClickable = true - } + .withEndAction { logoView.isEnabled = true } .start() - fullTitleView.animate() + titleView.animate() .alpha(0f) .setDuration(200) .withEndAction { - fullTitleView.isVisible = false - fullTitleView.isClickable = true + titleView.isVisible = false + titleView.isEnabled = true } .start() } + + logoView.loadImage( + imageData = UiImage.Image(url, headers = headers), + builder = { + listener( + onSuccess = { _, _ -> + logoView.isVisible = true + titleView.isVisible = false + }, + onError = { _, _ -> + logoView.isVisible = false + titleView.isVisible = true + }, + onCancel = { + // If we manually cancel, then it should not do anything + } + ) + } + ) } fun Fragment.getStoredData(): StoredData? { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt index c1fc81d0296..38b24b26517 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt @@ -66,7 +66,6 @@ import com.lagradost.cloudstream3.ui.player.PlayerView import com.lagradost.cloudstream3.ui.player.source_priority.QualityProfileDialog import com.lagradost.cloudstream3.ui.quicksearch.QuickSearchFragment import com.lagradost.cloudstream3.ui.result.ResultFragment.bindLogo -import com.lagradost.cloudstream3.ui.result.ResultFragment.setupLogoTitleToggle import com.lagradost.cloudstream3.ui.result.ResultFragment.getStoredData import com.lagradost.cloudstream3.ui.result.ResultFragment.updateUIEvent import com.lagradost.cloudstream3.ui.search.SearchAdapter @@ -976,13 +975,6 @@ open class ResultFragmentPhone : BaseFragment( logoView = backgroundPosterWatermarkBadge ) - setupLogoTitleToggle( - logoView = backgroundPosterWatermarkBadge, - fullTitleView = resultFullTitleText, - title = d.title, - hasLogo = !d.logoUrl.isNullOrBlank() - ) - var isExpanded = false resultDescription.apply { setTextHtml(d.plotText) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt index 4fc2d2ffc03..70ca117432d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt @@ -37,7 +37,6 @@ import com.lagradost.cloudstream3.ui.player.GeneratorPlayer import com.lagradost.cloudstream3.ui.player.NEXT_WATCH_EPISODE_PERCENTAGE import com.lagradost.cloudstream3.ui.quicksearch.QuickSearchFragment import com.lagradost.cloudstream3.ui.result.ResultFragment.bindLogo -import com.lagradost.cloudstream3.ui.result.ResultFragment.setupLogoTitleToggle import com.lagradost.cloudstream3.ui.result.ResultFragment.getStoredData import com.lagradost.cloudstream3.ui.result.ResultFragment.updateUIEvent import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_FOCUSED @@ -922,13 +921,6 @@ class ResultFragmentTv : BaseFragment( logoView = backgroundPosterWatermarkBadgeHolder ) - setupLogoTitleToggle( - logoView = backgroundPosterWatermarkBadgeHolder, - fullTitleView = resultFullTitleText, - title = d.title, - hasLogo = !d.logoUrl.isNullOrBlank() - ) - comingSoon = d.comingSoon resultTvComingSoon.isVisible = d.comingSoon diff --git a/app/src/main/res/layout/fragment_result.xml b/app/src/main/res/layout/fragment_result.xml index 1cb1cbf831c..29a25efa2e8 100644 --- a/app/src/main/res/layout/fragment_result.xml +++ b/app/src/main/res/layout/fragment_result.xml @@ -314,29 +314,6 @@ android:focusable="true" android:contentDescription="@string/result_logo_img_des" /> - - diff --git a/app/src/main/res/layout/fragment_result_tv.xml b/app/src/main/res/layout/fragment_result_tv.xml index e6cd81997bd..bcb8c6c3f8d 100644 --- a/app/src/main/res/layout/fragment_result_tv.xml +++ b/app/src/main/res/layout/fragment_result_tv.xml @@ -57,32 +57,9 @@ https://developer.android.com/design/ui/tv/samples/jet-fit android:scaleType="fitStart" android:focusable="true" android:focusableInTouchMode="true" + android:nextFocusDown="@id/result_title" android:contentDescription="@string/result_logo_img_des" /> - - Change Provider Preview Background Logo - Full title Speed (%.2fx) Rated: %.1f From 7f2be62a2f3d7d157dcab6cffe99cc2db1c5d047 Mon Sep 17 00:00:00 2001 From: VyomV Date: Wed, 6 May 2026 17:20:37 +0530 Subject: [PATCH 3/4] Fix TV focus and improve toggle state handling --- .../cloudstream3/ui/result/ResultFragment.kt | 95 +++++++++---------- app/src/main/res/layout/fragment_result.xml | 2 + .../main/res/layout/fragment_result_tv.xml | 2 + 3 files changed, 47 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt index fa55b720216..870b3b83d73 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt @@ -1,6 +1,7 @@ package com.lagradost.cloudstream3.ui.result import android.os.Bundle +import android.util.LruCache import android.widget.ImageView import android.widget.TextView import androidx.core.view.isVisible @@ -14,6 +15,8 @@ import com.lagradost.cloudstream3.SearchResponse import com.lagradost.cloudstream3.SeasonData import com.lagradost.cloudstream3.TvType import com.lagradost.cloudstream3.ui.result.EpisodeAdapter.Companion.getPlayerAction +import com.lagradost.cloudstream3.ui.settings.Globals.TV +import com.lagradost.cloudstream3.ui.settings.Globals.isLayout import com.lagradost.cloudstream3.utils.AppContextUtils.getApiDubstatusSettings import com.lagradost.cloudstream3.utils.DataStoreHelper import com.lagradost.cloudstream3.utils.DataStoreHelper.getVideoWatchState @@ -143,6 +146,8 @@ object ResultFragment { private const val START_VALUE_BUNDLE = "startValue" private const val RESTART_BUNDLE = "restart" + private val logoTitleToggleCache = LruCache(100) + fun newInstance( card: SearchResponse, startAction: Int = 0, startValue: Int? = null ): Bundle { @@ -245,12 +250,25 @@ object ResultFragment { logoView: ImageView, titleView: TextView ) { - // Cancel it, as we want to remove the listener onSuccess race condition + // Cancel any pending image load to avoid race conditions when scrolling fast logoView.dispose() - // Clear any previous toggle listeners to ensure clean state on rebind + // Clean up the views completely before we do anything. + // This stops weird state bleeding when RecyclerView recycles these views. + logoView.clearAnimation() + titleView.clearAnimation() logoView.setOnClickListener(null) titleView.setOnClickListener(null) + logoView.isEnabled = true + titleView.isEnabled = true + logoView.alpha = 1f + titleView.alpha = 1f + + // CloudStream convention for TV touch focus + logoView.isFocusable = true + logoView.isFocusableInTouchMode = isLayout(TV) + titleView.isFocusable = true + titleView.isFocusableInTouchMode = isLayout(TV) if (url.isNullOrBlank()) { logoView.isVisible = false @@ -258,59 +276,28 @@ object ResultFragment { return } - // Reset to the default state: logo visible, title hidden - logoView.alpha = 1f - logoView.isVisible = true - titleView.alpha = 0f - titleView.isVisible = false - titleView.isClickable = true - titleView.isFocusable = true - titleView.isFocusableInTouchMode = true + // Grab the toggle state from our session cache (in case they've clicked it before) + val isShowingTitle = logoTitleToggleCache.get(url) == true - // Toggle: logo -> title - logoView.setOnClickListener { - if (!logoView.isEnabled) return@setOnClickListener - logoView.isEnabled = false - titleView.isEnabled = false + logoView.isVisible = !isShowingTitle + titleView.isVisible = isShowingTitle + // Hiding logo, showing title + logoView.setOnClickListener { + val wasFocused = logoView.isFocused + logoTitleToggleCache.put(url, true) + logoView.isVisible = false titleView.isVisible = true - titleView.animate() - .alpha(1f) - .setDuration(200) - .withEndAction { titleView.isEnabled = true } - .start() - - logoView.animate() - .alpha(0f) - .setDuration(200) - .withEndAction { - logoView.isVisible = false - logoView.isEnabled = true - } - .start() + if (wasFocused) titleView.requestFocus() } - // Toggle: title -> logo + // Hiding title, showing logo titleView.setOnClickListener { - if (!titleView.isEnabled) return@setOnClickListener - titleView.isEnabled = false - logoView.isEnabled = false - + val wasFocused = titleView.isFocused + logoTitleToggleCache.put(url, false) logoView.isVisible = true - logoView.animate() - .alpha(1f) - .setDuration(200) - .withEndAction { logoView.isEnabled = true } - .start() - - titleView.animate() - .alpha(0f) - .setDuration(200) - .withEndAction { - titleView.isVisible = false - titleView.isEnabled = true - } - .start() + titleView.isVisible = false + if (wasFocused) logoView.requestFocus() } logoView.loadImage( @@ -318,21 +305,25 @@ object ResultFragment { builder = { listener( onSuccess = { _, _ -> - logoView.isVisible = true - titleView.isVisible = false + // Only show the logo if the user hasn't already toggled to the title while we were loading + if (logoTitleToggleCache.get(url) != true) { + logoView.isVisible = true + titleView.isVisible = false + } }, onError = { _, _ -> + // If the logo is broken or missing, force the title text and disable the toggle so they aren't stuck with a blank image logoView.isVisible = false titleView.isVisible = true + titleView.setOnClickListener(null) }, onCancel = { - // If we manually cancel, then it should not do anything + // If we manually cancelled it (like when scrolling away), just do nothing } ) } ) } - fun Fragment.getStoredData(): StoredData? { val context = this.context ?: this.activity ?: return null val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) diff --git a/app/src/main/res/layout/fragment_result.xml b/app/src/main/res/layout/fragment_result.xml index 29a25efa2e8..c46b40e9481 100644 --- a/app/src/main/res/layout/fragment_result.xml +++ b/app/src/main/res/layout/fragment_result.xml @@ -312,6 +312,7 @@ android:adjustViewBounds="true" android:scaleType="fitStart" android:focusable="true" + android:foreground="@drawable/outline_drawable" android:contentDescription="@string/result_logo_img_des" /> @@ -367,6 +368,7 @@ android:textColor="?attr/textColor" android:textSize="20sp" android:textStyle="bold" + android:foreground="@drawable/outline_drawable" tools:text="The Perfect Run The Perfect Run" /> @@ -196,6 +197,7 @@ https://developer.android.com/design/ui/tv/samples/jet-fit android:textStyle="bold" android:focusable="true" android:focusableInTouchMode="true" + android:foreground="@drawable/outline_drawable" android:nextFocusUp="@id/background_poster_watermark_badge_holder" android:nextFocusDown="@id/result_play_parent" tools:text="The Perfect Run The Perfect Run" /> From f84101e324178c111852c47d62f237c2b0f70d55 Mon Sep 17 00:00:00 2001 From: VyomV Date: Wed, 6 May 2026 20:23:14 +0530 Subject: [PATCH 4/4] tv layout bug again --- .../main/res/layout/fragment_result_tv.xml | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/app/src/main/res/layout/fragment_result_tv.xml b/app/src/main/res/layout/fragment_result_tv.xml index e4473b5e749..e61d43ecc9d 100644 --- a/app/src/main/res/layout/fragment_result_tv.xml +++ b/app/src/main/res/layout/fragment_result_tv.xml @@ -44,23 +44,6 @@ https://developer.android.com/design/ui/tv/samples/jet-fit android:layout_gravity="bottom" android:src="@drawable/background_shadow" /> - - + + + + + + +