From d652689b790382cb9e5e9c182ffdedfa5a0ddd6b Mon Sep 17 00:00:00 2001 From: TEMP Date: Fri, 14 Aug 2026 19:03:11 -0400 Subject: [PATCH 1/3] feat(tv): add plugin settings button to home top bar --- .../cloudstream3/ui/home/HomeFragment.kt | 21 +++++++++++++++++++ app/src/main/res/layout/fragment_home.xml | 7 +++++++ app/src/main/res/layout/fragment_home_tv.xml | 21 +++++++++++++++++-- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt index 0e52baff6b9..bf0479bc6fc 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt @@ -30,6 +30,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.chip.Chip import com.lagradost.api.Log +import com.lagradost.cloudstream3.APIHolder import com.lagradost.cloudstream3.APIHolder.apis import com.lagradost.cloudstream3.AllLanguagesName import com.lagradost.cloudstream3.CommonActivity.showToast @@ -701,6 +702,21 @@ class HomeFragment : BaseFragment( homeViewModel.queryTextSubmit("") } + homePreviewSettingsButton.setOnClickListener { view -> + val apiName = homeViewModel.apiName.value + val plugin = APIHolder.getApiFromNameNull(apiName) + ?.sourcePlugin?.let { PluginManager.plugins[it] } as? Plugin + val openSettings = plugin?.openSettings + if (openSettings != null) { + try { + val activityContext = view.context.getActivity() ?: view.context + openSettings.invoke(activityContext) + } catch (e: Throwable) { + logError(e) + } + } + } + // Load value for toggling Tv layout real time clock. Hide by default at startup // set visibility first, to apply a scroll effect later context?.let { @@ -795,6 +811,11 @@ class HomeFragment : BaseFragment( homeChangeApi.text = apiName homePreviewReloadProvider.isGone = (apiName == noneApi.name) homePreviewSearchButton.isGone = (apiName == noneApi.name) + if (isLayout(TV)) { + val plugin = APIHolder.getApiFromNameNull(apiName) + ?.sourcePlugin?.let { PluginManager.plugins[it] } as? Plugin + homePreviewSettingsButton.isVisible = plugin?.openSettings != null + } } } diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 8d78c01b3e7..dc1635392c6 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -260,4 +260,11 @@ android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone" /> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_tv.xml b/app/src/main/res/layout/fragment_home_tv.xml index d50c4c2e40c..f8559ab14d3 100644 --- a/app/src/main/res/layout/fragment_home_tv.xml +++ b/app/src/main/res/layout/fragment_home_tv.xml @@ -200,11 +200,28 @@ android:gravity="center" android:nextFocusLeft="@id/navigation_home" tools:text="Hello!" - android:nextFocusRight="@id/home_preview_reload_provider" + android:nextFocusRight="@id/home_preview_settings_button" android:nextFocusDown="@id/home_preview_info_btt" > + + Date: Fri, 14 Aug 2026 19:33:29 -0400 Subject: [PATCH 2/3] fix(tv): hide settings button with isGone, cover emulator mode --- .../java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt index bf0479bc6fc..092676ff31d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt @@ -811,10 +811,10 @@ class HomeFragment : BaseFragment( homeChangeApi.text = apiName homePreviewReloadProvider.isGone = (apiName == noneApi.name) homePreviewSearchButton.isGone = (apiName == noneApi.name) - if (isLayout(TV)) { + if (isLayout(TV or EMULATOR)) { val plugin = APIHolder.getApiFromNameNull(apiName) ?.sourcePlugin?.let { PluginManager.plugins[it] } as? Plugin - homePreviewSettingsButton.isVisible = plugin?.openSettings != null + homePreviewSettingsButton.isGone = plugin?.openSettings == null } } } From 1d9832013ccc91170d1257fc492de1063aa607c4 Mon Sep 17 00:00:00 2001 From: TEMP Date: Sun, 23 Aug 2026 15:01:12 -0400 Subject: [PATCH 3/3] fix(tv): move settings button visibility to page load Plugin openSettings may be set after apiName fires, causing the button to hide on startup. Check visibility when the page pops in instead. --- .../lagradost/cloudstream3/ui/home/HomeFragment.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt index 092676ff31d..0363948e8ab 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt @@ -811,11 +811,6 @@ class HomeFragment : BaseFragment( homeChangeApi.text = apiName homePreviewReloadProvider.isGone = (apiName == noneApi.name) homePreviewSearchButton.isGone = (apiName == noneApi.name) - if (isLayout(TV or EMULATOR)) { - val plugin = APIHolder.getApiFromNameNull(apiName) - ?.sourcePlugin?.let { PluginManager.plugins[it] } as? Plugin - homePreviewSettingsButton.isGone = plugin?.openSettings == null - } } } @@ -836,6 +831,12 @@ class HomeFragment : BaseFragment( homeLoadingError.isVisible = false homeMasterRecycler.isVisible = true homeLoadingShimmer.stopShimmer() + + if (isLayout(TV or EMULATOR)) { + val plugin = APIHolder.getApiFromNameNull(homeViewModel.apiName.value) + ?.sourcePlugin?.let { PluginManager.plugins[it] } as? Plugin + homePreviewSettingsButton.isGone = plugin?.openSettings == null + } //home_loaded?.isVisible = true if (toggleRandomButton) { val distinct = d.values