From 5636bf2518ecf0230435471d8b1ae22548bdf331 Mon Sep 17 00:00:00 2001
From: Gustavo <64141391+GustavoASantos@users.noreply.github.com>
Date: Thu, 25 Aug 2022 19:59:44 +0100
Subject: [PATCH 1/5] Update PT and PT BR translations (#60)
---
app/src/main/res/values-bp/strings.xml | 39 +++++++++++++++++
app/src/main/res/values-pt/strings-pt.xml | 51 ++++++++++++++++++++---
2 files changed, 85 insertions(+), 5 deletions(-)
diff --git a/app/src/main/res/values-bp/strings.xml b/app/src/main/res/values-bp/strings.xml
index 33245013..f35047dc 100644
--- a/app/src/main/res/values-bp/strings.xml
+++ b/app/src/main/res/values-bp/strings.xml
@@ -468,9 +468,48 @@
Resolução
Id invalida
Dado invalido
+URL invalido
Erro
Remover legendas ocultas(CC) das legendas
Remover bloat das legendas
+Filtrar por linguagem preferida
Extras
Trailer
+
+Próximo
+ Ver vídeos nestas linguagens
+ Anterior
+ Saltar setup
+
+ Change the look of the app to suit your device
+ Crash reporting
+ What do you want to see
+ Feito
+ Extensões
+ Adicionar repositório
+ Nome do repositório
+ URL do repositório
+ Plugin Carregado
+ Plugin Apagado
+ Falha ao carregar %s
+
+ Iniciada a transferência %d %s
+ Transferido %d %s com sucesso
+ Tudo %s já transferido
+ Transferência em batch
+ plugin
+ plugins
+ Isto irá apagar todos os repositórios de plugins
+ Apagar repositório
+ Transferir lista de sites a usar
+ Transferido: %d
+ Desativado: %d
+ Não transferido: %d
+ Adicionar um repositório para instalar extensões de sites
+ Ver repositórios da comunidade
+ Lista pública
+ Todas as legendas em maiúsculas
+
+ Transferir todos os plugins deste repositório?
+ %s (Desativado)
diff --git a/app/src/main/res/values-pt/strings-pt.xml b/app/src/main/res/values-pt/strings-pt.xml
index a77aac7a..55ad9d0a 100644
--- a/app/src/main/res/values-pt/strings-pt.xml
+++ b/app/src/main/res/values-pt/strings-pt.xml
@@ -22,7 +22,7 @@
Início
Pesquisa
Transferências
- Configurações
+ Opções
Procurar…
Procurar em %s…
@@ -61,7 +61,7 @@
Transferência Falhou
Transferência Cancelada
Transferência Completa
- Transmitir
+ Stream
Erro a Carregar Links
Armazenamento Interno
@@ -189,7 +189,7 @@
Dar um benene aos devs
Benene dada
- Linguagem da App
+ Idioma da App
Este fornecedor não tem suporte para Chromecast
Nenhum Link Encontrado
@@ -422,11 +422,52 @@
Resolução e título
Título
Resolução
- Id invalida
- Dado invalido
+ Id inválida
+ Dado inválido
+
+URL inválido
Erro
Remover legendas ocultas(CC) das legendas
Remover bloat das legendas
+
+Filtrar por linguagem preferida
Extras
Trailer
+
+ Próximo
+ Ver vídeos nestas linguagens
+ Anterior
+ Saltar setup
+
+ Change the look of the app to suit your device
+ Crash reporting
+ What do you want to see
+ Feito
+ Extensões
+ Adicionar repositório
+ Nome do repositório
+ URL do repositório
+ Plugin Carregado
+ Plugin Apagado
+ Falha ao carregar %s
+
+ Iniciada a transferência %d %s
+ Transferido %d %s com sucesso
+ Tudo %s já transferido
+ Transferência em batch
+ plugin
+ plugins
+ Isto irá apagar todos os repositórios de plugins
+ Apagar repositório
+ Transferir lista de sites a usar
+ Transferido: %d
+ Desativado: %d
+ Não transferido: %d
+ Adicionar um repositório para instalar extensões de sites
+ Ver repositórios da comunidade
+ Lista pública
+ Todas as legendas em maiúsculas
+
+ Transferir todos os plugins deste repositório?
+ %s (Desativado)
From 66842daa9369dcfc44fdf7321ce25a2b6ffb043d Mon Sep 17 00:00:00 2001
From: Hexated <37908684+hexated@users.noreply.github.com>
Date: Fri, 26 Aug 2022 19:07:53 +0700
Subject: [PATCH 2/5] Added Zorofile (extractor) (#58)
* Added Zorofile (extractor)
* fixes
---
.../cloudstream3/extractors/StreamSB.kt | 4 +
.../cloudstream3/extractors/Zorofile.kt | 76 +++++++++++++++++++
.../cloudstream3/utils/ExtractorApi.kt | 2 +
3 files changed, 82 insertions(+)
create mode 100644 app/src/main/java/com/lagradost/cloudstream3/extractors/Zorofile.kt
diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/StreamSB.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/StreamSB.kt
index da3ef278..8cd68587 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/extractors/StreamSB.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/StreamSB.kt
@@ -7,6 +7,10 @@ import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper
+class Sbthe : StreamSB() {
+ override var mainUrl = "https://sbthe.com"
+}
+
class Ssbstream : StreamSB() {
override var mainUrl = "https://ssbstream.net"
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Zorofile.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Zorofile.kt
new file mode 100644
index 00000000..84785b6c
--- /dev/null
+++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Zorofile.kt
@@ -0,0 +1,76 @@
+package com.lagradost.cloudstream3.extractors
+
+import com.fasterxml.jackson.annotation.JsonProperty
+import com.lagradost.cloudstream3.APIHolder.getCaptchaToken
+import com.lagradost.cloudstream3.ErrorLoadingException
+import com.lagradost.cloudstream3.SubtitleFile
+import com.lagradost.cloudstream3.app
+import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
+import com.lagradost.cloudstream3.utils.ExtractorApi
+import com.lagradost.cloudstream3.utils.ExtractorLink
+import com.lagradost.cloudstream3.utils.M3u8Helper
+
+class Zorofile : ExtractorApi() {
+ override val name = "Zorofile"
+ override val mainUrl = "https://zorofile.com"
+ override val requiresReferer = true
+
+ override suspend fun getUrl(
+ url: String,
+ referer: String?,
+ subtitleCallback: (SubtitleFile) -> Unit,
+ callback: (ExtractorLink) -> Unit
+ ) {
+ val id = url.split("?").first().split("/").last()
+ val token = app.get(
+ url,
+ referer = referer
+ ).document.select("button.g-recaptcha").attr("data-sitekey").let { captchaKey ->
+ getCaptchaToken(
+ url,
+ captchaKey,
+ referer = referer
+ )
+ } ?: throw ErrorLoadingException("can't bypass captcha")
+
+ val data = app.post(
+ "$mainUrl/dl",
+ data = mapOf(
+ "op" to "embed",
+ "file_code" to id,
+ "auto" to "1",
+ "referer" to "$referer/",
+ "g-recaptcha-response" to token
+ ),
+ referer = url,
+ headers = mapOf(
+ "Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
+ "Content-Type" to "application/x-www-form-urlencoded",
+ "Origin" to mainUrl,
+ "Sec-Fetch-Dest" to "iframe",
+ "Sec-Fetch-Mode" to "navigate",
+ "Sec-Fetch-Site" to "same-origin",
+ "Sec-Fetch-User" to "?1",
+ "Upgrade-Insecure-Requests" to "1",
+ )
+ ).document.select("script").find { it.data().contains("var holaplayer;") }?.data()
+ ?.substringAfter("sources: [")?.substringBefore("],")?.replace("src", "\"src\"")
+ ?.replace("type", "\"type\"")
+
+ tryParseJson("$data")?.let { res ->
+ return M3u8Helper.generateM3u8(
+ name,
+ res.src ?: return@let,
+ "$mainUrl/",
+ headers = mapOf(
+ "Origin" to mainUrl,
+ )
+ ).forEach(callback)
+ }
+ }
+
+ private data class Sources(
+ @JsonProperty("src") val src: String? = null,
+ @JsonProperty("type") val type: String? = null,
+ )
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt
index de3c013a..217837c9 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt
@@ -234,6 +234,7 @@ val extractorApis: MutableList = arrayListOf(
// Streamhub(), cause Streamhub2() works
Streamhub2(),
Ssbstream(),
+ Sbthe(),
Fastream(),
@@ -312,6 +313,7 @@ val extractorApis: MutableList = arrayListOf(
Linkbox(),
Acefile(),
SpeedoStream(),
+ Zorofile(),
YoutubeExtractor(),
YoutubeShortLinkExtractor(),
From 2893cd8da3e16faae3dfed5e084c23cb731256f1 Mon Sep 17 00:00:00 2001
From: Dilute Oxygen
Date: Mon, 29 Aug 2022 00:01:30 +0530
Subject: [PATCH 3/5] Updated HI Translation (#66)
---
app/src/main/res/values-hi/strings.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index 03d54924..e3f0a233 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -47,7 +47,7 @@
डाउनलोड फिर शुरू करे
डाउनलोड रोके
- Disable automatic bug reporting
+ स्वचालित त्रुटि रिपोर्ट रोकें
और जानकारी
छिपाये
चलाये
@@ -149,7 +149,7 @@
ताला
आकार
सूत्र
- OP टालें
+ OP स्किप करें
फिरसे ना दिखाए
अपडेट
From 01c81fc4215efb813961e40c87f851c6ec1ed02c Mon Sep 17 00:00:00 2001
From: Jace <54625750+Jacekun@users.noreply.github.com>
Date: Mon, 29 Aug 2022 02:32:17 +0800
Subject: [PATCH 4/5] [Feature] Copy settings values from Preferences to
providers APIs (#48)
* [Feature] Copy settings values from Preferences to providers APIs
* Use companion object instead for singular object access across all providers
* Fix build
* Re-order code hierarchy. Prioritize loading settings from pref
---
app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt | 5 +++++
.../main/java/com/lagradost/cloudstream3/MainActivity.kt | 5 +++++
app/src/main/res/values/strings.xml | 3 +++
app/src/main/res/xml/settings_media_lang.xml | 7 +++++++
4 files changed, 20 insertions(+)
diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
index f442e175..67a3051c 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
@@ -315,6 +315,10 @@ data class ProvidersInfoJson(
@JsonProperty("status") var status: Int,
)
+data class SettingsJson(
+ @JsonProperty("enableAdult") var enableAdult: Boolean = false,
+)
+
data class MainPageData(
val name: String,
@@ -354,6 +358,7 @@ fun newHomePageResponse(list: List, hasNext: Boolean? = null): Hom
abstract class MainAPI {
companion object {
var overrideData: HashMap? = null
+ var settingsForProvider: SettingsJson = SettingsJson()
}
fun init() {
diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
index 629406aa..44f78703 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
@@ -455,6 +455,11 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
override fun onCreate(savedInstanceState: Bundle?) {
app.initClient(this)
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
+
+ val settingsForProvider = SettingsJson()
+ settingsForProvider.enableAdult = settingsManager.getBoolean(getString(R.string.enable_nsfw_on_providers_key), false)
+
+ MainAPI.settingsForProvider = settingsForProvider
loadThemes(this)
updateLocale()
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1b47b180..268d6246 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -55,6 +55,7 @@
redo_setup_key
filter_sub_lang_key
pref_filter_search_quality_key
+ enable_nsfw_on_providers_key
%d %s | %s
@@ -444,6 +445,7 @@
Provider languages
App Layout
Preferred media
+ Enable NSFW on supported providers
Subtitle encoding
Language
Layout
@@ -607,4 +609,5 @@
Download all plugins from this repository?
%s (Disabled)
+ Apply on Restart
diff --git a/app/src/main/res/xml/settings_media_lang.xml b/app/src/main/res/xml/settings_media_lang.xml
index 575b638c..2244eff8 100644
--- a/app/src/main/res/xml/settings_media_lang.xml
+++ b/app/src/main/res/xml/settings_media_lang.xml
@@ -18,4 +18,11 @@
android:key="@string/display_sub_key"
android:title="@string/display_subbed_dubbed_settings"
android:icon="@drawable/ic_outline_voice_over_off_24" />
+
+
\ No newline at end of file
From cd119822f21045d7db6cf1838ffb44f305bb384b Mon Sep 17 00:00:00 2001
From: reduplicated <110570621+reduplicated@users.noreply.github.com>
Date: Mon, 29 Aug 2022 01:52:15 +0200
Subject: [PATCH 5/5] tv UI fixes
---
.../lagradost/cloudstream3/CommonActivity.kt | 5 +-
.../com/lagradost/cloudstream3/MainAPI.kt | 2 +-
.../ui/download/DownloadFragment.kt | 2 +-
.../cloudstream3/ui/home/HomeFragment.kt | 64 +++---
.../ui/home/HomeParentItemAdapter.kt | 2 +-
.../cloudstream3/ui/player/GeneratorPlayer.kt | 2 +-
.../ui/player/PlayerEpisodeAdapter.kt | 2 +-
.../cloudstream3/ui/result/EpisodeAdapter.kt | 2 +-
.../cloudstream3/ui/result/ImageAdapter.kt | 2 +-
.../cloudstream3/ui/result/ResultFragment.kt | 10 +-
.../cloudstream3/ui/result/SelectAdaptor.kt | 2 +-
.../cloudstream3/ui/search/SearchFragment.kt | 2 +-
.../ui/search/SearchResultBuilder.kt | 2 +-
.../ui/settings/SettingsAccount.kt | 2 +-
.../ui/settings/SettingsFragment.kt | 24 +-
.../cloudstream3/ui/settings/SettingsUI.kt | 8 +-
.../settings/extensions/ExtensionsFragment.kt | 24 +-
.../ui/settings/extensions/PluginAdapter.kt | 5 +-
.../ui/settings/extensions/PluginsFragment.kt | 2 +-
.../ui/settings/extensions/RepoAdapter.kt | 4 +-
.../ui/setup/SetupFragmentExtensions.kt | 6 +-
.../subtitles/ChromecastSubtitlesFragment.kt | 2 +-
.../ui/subtitles/SubtitlesFragment.kt | 2 +-
.../lagradost/cloudstream3/utils/AppUtils.kt | 8 +-
.../utils/SingleSelectionHelper.kt | 2 +-
.../widget/LinearRecycleViewLayoutManager.kt | 30 +++
app/src/main/res/layout/add_repo_input.xml | 4 +
.../main/res/layout/fragment_extensions.xml | 216 ++++++++++--------
.../main/res/layout/repository_item_tv.xml | 122 ++++++++++
29 files changed, 393 insertions(+), 167 deletions(-)
create mode 100644 app/src/main/java/com/lagradost/cloudstream3/widget/LinearRecycleViewLayoutManager.kt
create mode 100644 app/src/main/res/layout/repository_item_tv.xml
diff --git a/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt
index 0f54770f..e56b3bd9 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt
@@ -6,7 +6,6 @@ import android.content.Context
import android.content.pm.PackageManager
import android.content.res.Resources
import android.os.Build
-import android.os.Looper
import android.util.Log
import android.view.*
import android.widget.TextView
@@ -20,12 +19,12 @@ import com.google.android.gms.cast.framework.CastSession
import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.ui.player.PlayerEventType
import com.lagradost.cloudstream3.ui.result.UiText
+import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.updateTv
import com.lagradost.cloudstream3.utils.Event
import com.lagradost.cloudstream3.utils.UIHelper
import com.lagradost.cloudstream3.utils.UIHelper.hasPIPPermission
import com.lagradost.cloudstream3.utils.UIHelper.shouldShowPIPMode
import com.lagradost.cloudstream3.utils.UIHelper.toPx
-import kotlinx.coroutines.currentCoroutineContext
import org.schabi.newpipe.extractor.NewPipe
import java.util.*
@@ -128,7 +127,7 @@ object CommonActivity {
act.hasPIPPermission() // CHECK IF FEATURE IS ENABLED IN SETTINGS
act.updateLocale()
-
+ act.updateTv()
NewPipe.init(DownloaderTestImpl.getInstance())
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
index 67a3051c..dc6cc454 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
@@ -226,7 +226,7 @@ object APIHolder {
}
private fun Context.getHasTrailers(): Boolean {
- if (this.isTvSettings()) return false
+ if (isTvSettings()) return false
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
return settingsManager.getBoolean(this.getString(R.string.show_trailers_key), true)
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadFragment.kt
index 7ea360a8..3335e023 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadFragment.kt
@@ -175,7 +175,7 @@ class DownloadFragment : Fragment() {
download_list?.adapter = adapter
download_list?.layoutManager = GridLayoutManager(context, 1)
- download_stream_button?.isGone = context?.isTvSettings() == true
+ download_stream_button?.isGone = isTvSettings()
download_stream_button?.setOnClickListener {
val dialog =
Dialog(it.context ?: return@setOnClickListener, R.style.AlertDialogCustom)
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 539ce843..0071ab49 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
@@ -400,7 +400,7 @@ class HomeFragment : Fragment() {
//homeViewModel =
// ViewModelProvider(this).get(HomeViewModel::class.java)
val layout =
- if (context?.isTvSettings() == true) R.layout.fragment_home_tv else R.layout.fragment_home
+ if (isTvSettings()) R.layout.fragment_home_tv else R.layout.fragment_home
return inflater.inflate(layout, container, false)
}
@@ -568,7 +568,7 @@ class HomeFragment : Fragment() {
val randomSize = items.size
tempAdapter?.updateList(items)
- if (context?.isTvSettings() == false) {
+ if (!isTvSettings()) {
home_main_poster_recyclerview?.post {
(home_main_poster_recyclerview?.layoutManager as CenterZoomLayoutManager?)?.let { manager ->
manager.updateSize(forceUpdate = true)
@@ -939,7 +939,7 @@ class HomeFragment : Fragment() {
}
} // GridLayoutManager(context, 1).also { it.supportsPredictiveItemAnimations() }
- if (context?.isTvSettings() == false) {
+ if (!isTvSettings()) {
LinearSnapHelper().attachToRecyclerView(home_main_poster_recyclerview) // snap
val centerLayoutManager =
CenterZoomLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
@@ -975,7 +975,7 @@ class HomeFragment : Fragment() {
home_api_fab?.shrink() // hide
home_random?.shrink()
} else if (dy < -5) {
- if (v.context?.isTvSettings() == false) {
+ if (!isTvSettings()) {
home_api_fab?.extend() // show
home_random?.extend()
}
@@ -984,37 +984,35 @@ class HomeFragment : Fragment() {
// nice profile pic on homepage
home_profile_picture_holder?.isVisible = false
- context?.let { ctx ->
- // just in case
- if (ctx.isTvSettings()) {
- home_api_fab?.isVisible = false
- home_change_api?.isVisible = true
- if (ctx.isTrueTvSettings()) {
- home_change_api_loading?.isVisible = true
- home_change_api_loading?.isFocusable = true
- home_change_api_loading?.isFocusableInTouchMode = true
- home_change_api?.isFocusable = true
- home_change_api?.isFocusableInTouchMode = true
- }
- // home_bookmark_select?.isFocusable = true
- // home_bookmark_select?.isFocusableInTouchMode = true
- } else {
- home_api_fab?.isVisible = true
- home_change_api?.isVisible = false
- home_change_api_loading?.isVisible = false
+ // just in case
+ if (isTvSettings()) {
+ home_api_fab?.isVisible = false
+ home_change_api?.isVisible = true
+ if (isTrueTvSettings()) {
+ home_change_api_loading?.isVisible = true
+ home_change_api_loading?.isFocusable = true
+ home_change_api_loading?.isFocusableInTouchMode = true
+ home_change_api?.isFocusable = true
+ home_change_api?.isFocusableInTouchMode = true
}
+ // home_bookmark_select?.isFocusable = true
+ // home_bookmark_select?.isFocusableInTouchMode = true
+ } else {
+ home_api_fab?.isVisible = true
+ home_change_api?.isVisible = false
+ home_change_api_loading?.isVisible = false
+ }
- for (syncApi in OAuth2Apis) {
- val login = syncApi.loginInfo()
- val pic = login?.profilePicture
- if (home_profile_picture?.setImage(
- pic,
- errorImageDrawable = errorProfilePic
- ) == true
- ) {
- home_profile_picture_holder?.isVisible = true
- break
- }
+ for (syncApi in OAuth2Apis) {
+ val login = syncApi.loginInfo()
+ val pic = login?.profilePicture
+ if (home_profile_picture?.setImage(
+ pic,
+ errorImageDrawable = errorProfilePic
+ ) == true
+ ) {
+ home_profile_picture_holder?.isVisible = true
+ break
}
}
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapter.kt
index 3fc1da24..23ab81ce 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapter.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapter.kt
@@ -29,7 +29,7 @@ class ParentItemAdapter(
override fun onCreateViewHolder(parent: ViewGroup, i: Int): ParentViewHolder {
//println("onCreateViewHolder $i")
val layout =
- if (parent.context.isTvSettings()) R.layout.homepage_parent_tv else R.layout.homepage_parent
+ if (isTvSettings()) R.layout.homepage_parent_tv else R.layout.homepage_parent
return ParentViewHolder(
LayoutInflater.from(parent.context).inflate(layout, parent, false),
clickCallback,
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt
index 3e6e24cb..8f908465 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt
@@ -993,7 +993,7 @@ class GeneratorPlayer : FullScreenPlayer() {
savedInstanceState: Bundle?
): View? {
// this is used instead of layout-television to follow the settings and some TV devices are not classified as TV for some reason
- isTv = context?.isTvSettings() == true
+ isTv = isTvSettings()
layout =
if (isTv) R.layout.fragment_player_tv else R.layout.fragment_player
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerEpisodeAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerEpisodeAdapter.kt
index 2ba47978..cfe27a30 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerEpisodeAdapter.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerEpisodeAdapter.kt
@@ -124,7 +124,7 @@ class PlayerEpisodeAdapter(
clickCallback.invoke(PlayerEpisodeClickEvent(0, card))
}
- if (parentView.context.isTrueTvSettings()) {
+ if (isTrueTvSettings()) {
parentView.isFocusable = true
parentView.isFocusableInTouchMode = true
parentView.touchscreenBlocksFocus = false
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/EpisodeAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/EpisodeAdapter.kt
index 075e6cf5..a89e8279 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/EpisodeAdapter.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/EpisodeAdapter.kt
@@ -166,7 +166,7 @@ class EpisodeAdapter(
fun bind(card: ResultEpisode) {
localCard = card
- val isTrueTv = itemView.context?.isTrueTvSettings() == true
+ val isTrueTv = isTrueTvSettings()
val (parentView, otherView) = if (card.poster == null) {
itemView.episode_holder to itemView.episode_holder_large
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ImageAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ImageAdapter.kt
index 35e372d6..ebd6a658 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ImageAdapter.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ImageAdapter.kt
@@ -83,7 +83,7 @@ class ImageAdapter(
this.nextFocusUpId = nextFocusUp
}
if (clickCallback != null) {
- if (context.isTrueTvSettings()) {
+ if (isTrueTvSettings()) {
isClickable = true
isLongClickable = true
isFocusable = true
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 d47ebb4c..5fc61146 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
@@ -293,7 +293,7 @@ open class ResultFragment : ResultTrailerPlayer() {
result_reload_connection_open_in_browser?.isVisible = true
}
2 -> {
- result_bookmark_fab?.isGone = result_bookmark_fab?.context?.isTvSettings() == true
+ result_bookmark_fab?.isGone = isTvSettings()
result_bookmark_fab?.extend()
//if (result_bookmark_button?.context?.isTrueTvSettings() == true) {
// when {
@@ -551,7 +551,7 @@ open class ResultFragment : ResultTrailerPlayer() {
}
// This is to band-aid FireTV navigation
- val isTv = context?.isTvSettings() == true
+ val isTv = isTvSettings()
result_season_button?.isFocusableInTouchMode = isTv
result_episode_select?.isFocusableInTouchMode = isTv
result_dub_select?.isFocusableInTouchMode = isTv
@@ -794,7 +794,7 @@ open class ResultFragment : ResultTrailerPlayer() {
result_next_airing_time.setText(d.nextAiringDate)
result_poster.setImage(d.posterImage)
- if (d.posterImage != null && context?.isTrueTvSettings() == false)
+ if (d.posterImage != null && !isTrueTvSettings())
result_poster_holder?.setOnClickListener {
try {
context?.let { ctx ->
@@ -883,7 +883,7 @@ open class ResultFragment : ResultTrailerPlayer() {
result_tag_holder?.isVisible = tags.isNotEmpty()
if (tags.isNotEmpty()) {
//result_tag_holder?.visibility = VISIBLE
- val isOnTv = context?.isTrueTvSettings() == true
+ val isOnTv = isTrueTvSettings()
for ((index, tag) in tags.withIndex()) {
val viewBtt = layoutInflater.inflate(R.layout.result_tag, null)
val btt = viewBtt.findViewById(R.id.result_tag_card)
@@ -941,7 +941,7 @@ open class ResultFragment : ResultTrailerPlayer() {
}
// bloats the navigation on tv
- if (context?.isTrueTvSettings() == false) {
+ if (!isTrueTvSettings()) {
result_meta_site?.setOnClickListener {
it.context?.openBrowser(storedData.url)
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/SelectAdaptor.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/SelectAdaptor.kt
index 74647ada..2e7ec529 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/SelectAdaptor.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/SelectAdaptor.kt
@@ -85,7 +85,7 @@ class SelectAdaptor(val callback: (Any) -> Unit) : RecyclerView.Adapter Unit
) {
- val isTrueTv = itemView.context?.isTrueTvSettings() == true
+ val isTrueTv = isTrueTvSettings()
if (isTrueTv) {
item.isFocusable = true
item.isFocusableInTouchMode = true
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt
index 74d81627..69f8a274 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt
@@ -386,7 +386,7 @@ class SearchFragment : Fragment() {
}
}
- if (context?.isTrueTvSettings() == true) {
+ if (isTrueTvSettings()) {
search_filter.isFocusable = true
search_filter.isFocusableInTouchMode = true
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchResultBuilder.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchResultBuilder.kt
index bcabb268..3afbb8c0 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchResultBuilder.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchResultBuilder.kt
@@ -164,7 +164,7 @@ object SearchResultBuilder {
}
}
- if (bg.context.isTrueTvSettings()) {
+ if (isTrueTvSettings()) {
bg.isFocusable = true
bg.isFocusableInTouchMode = true
bg.touchscreenBlocksFocus = false
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt
index 971e630e..2554d6ee 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt
@@ -117,7 +117,7 @@ class SettingsAccount : PreferenceFragmentCompat() {
dialog.login_username_input to api.requiresUsername
)
- if (activity.isTvSettings()) {
+ if (isTvSettings()) {
visibilityMap.forEach { (input, isVisible) ->
input.isVisible = isVisible
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt
index 4c532e4c..7e26afb5 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt
@@ -30,6 +30,9 @@ class SettingsFragment : Fragment() {
companion object {
var beneneCount = 0
+ private var isTv : Boolean = false
+ private var isTrueTv : Boolean = false
+
fun PreferenceFragmentCompat?.getPref(id: Int): Preference? {
if (this == null) return null
@@ -45,7 +48,7 @@ class SettingsFragment : Fragment() {
* On TV you cannot properly scroll to the bottom of settings, this fixes that.
* */
fun PreferenceFragmentCompat.setPaddingBottom() {
- if (this.context?.isTvSettings() == true) {
+ if (isTvSettings()) {
listView?.setPadding(0, 0, 0, 100.toPx)
}
}
@@ -93,7 +96,7 @@ class SettingsFragment : Fragment() {
return settingsManager.getInt(this.getString(R.string.app_layout_key), -1)
}
- fun Context.isTvSettings(): Boolean {
+ private fun Context.isTvSettings(): Boolean {
var value = getLayoutInt()
if (value == -1) {
value = if (isAutoTv()) 1 else 0
@@ -101,7 +104,7 @@ class SettingsFragment : Fragment() {
return value == 1 || value == 2
}
- fun Context.isTrueTvSettings(): Boolean {
+ private fun Context.isTrueTvSettings(): Boolean {
var value = getLayoutInt()
if (value == -1) {
value = if (isAutoTv()) 1 else 0
@@ -109,6 +112,19 @@ class SettingsFragment : Fragment() {
return value == 1
}
+ fun Context.updateTv() {
+ isTrueTv = isTrueTvSettings()
+ isTv = isTvSettings()
+ }
+
+ fun isTrueTvSettings(): Boolean {
+ return isTrueTv
+ }
+
+ fun isTvSettings(): Boolean {
+ return isTv
+ }
+
fun Context.isEmulatorSettings(): Boolean {
return getLayoutInt() == 2
}
@@ -136,7 +152,7 @@ class SettingsFragment : Fragment() {
activity?.navigate(id, Bundle())
}
- val isTrueTv = context?.isTrueTvSettings() == true
+ val isTrueTv = isTrueTvSettings()
for (syncApi in accountManagers) {
val login = syncApi.loginInfo()
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUI.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUI.kt
index 9e85ab94..9ad3ee8f 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUI.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUI.kt
@@ -11,6 +11,7 @@ import com.lagradost.cloudstream3.ui.search.SearchResultBuilder
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
+import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.updateTv
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog
@@ -22,6 +23,7 @@ class SettingsUI : PreferenceFragmentCompat() {
setUpToolbar(R.string.category_ui)
setPaddingBottom()
}
+
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
hideKeyboard()
setPreferencesFromResource(R.xml.settins_ui, rootKey)
@@ -71,6 +73,7 @@ class SettingsUI : PreferenceFragmentCompat() {
settingsManager.edit()
.putInt(getString(R.string.app_layout_key), prefValues[it])
.apply()
+ context?.updateTv()
activity?.recreate()
} catch (e: Exception) {
logError(e)
@@ -130,7 +133,10 @@ class SettingsUI : PreferenceFragmentCompat() {
getPref(R.string.pref_filter_search_quality_key)?.setOnPreferenceClickListener {
val names = enumValues().sorted().map { it.name }
- val currentList = settingsManager.getStringSet(getString(R.string.pref_filter_search_quality_key), setOf())?.map {
+ val currentList = settingsManager.getStringSet(
+ getString(R.string.pref_filter_search_quality_key),
+ setOf()
+ )?.map {
it.toInt()
} ?: listOf()
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt
index 143794d1..267dda60 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt
@@ -11,6 +11,7 @@ import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
+import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
@@ -23,12 +24,14 @@ import com.lagradost.cloudstream3.mvvm.Some
import com.lagradost.cloudstream3.mvvm.observe
import com.lagradost.cloudstream3.plugins.RepositoryManager
import com.lagradost.cloudstream3.ui.result.setText
+import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
import com.lagradost.cloudstream3.utils.AppUtils.downloadAllPluginsDialog
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.Coroutines.main
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
+import com.lagradost.cloudstream3.widget.LinearRecycleViewLayoutManager
import kotlinx.android.synthetic.main.add_repo_input.*
import kotlinx.android.synthetic.main.fragment_extensions.*
import kotlinx.android.synthetic.main.fragment_extensions.list_repositories
@@ -119,9 +122,15 @@ class ExtensionsFragment : Fragment() {
(repo_recycler_view?.adapter as? RepoAdapter)?.updateList(it)
}
+ repo_recycler_view?.apply {
+ context?.let { ctx ->
+ layoutManager = LinearRecycleViewLayoutManager(ctx, nextFocusUpId, nextFocusDownId)
+ }
+ }
+
list_repositories?.setOnClickListener {
// Open webview on tv if browser fails
- val isTv = it.context.isTvSettings()
+ val isTv = isTvSettings()
openBrowser(PUBLIC_REPOSITORIES_LIST, isTv, this)
// Set clipboard on TV because the browser might not exist or work properly
@@ -170,9 +179,9 @@ class ExtensionsFragment : Fragment() {
)
}
- add_repo_button?.setOnClickListener {
+ val addRepositoryClick = View.OnClickListener {
val builder =
- AlertDialog.Builder(context ?: return@setOnClickListener, R.style.AlertDialogCustom)
+ AlertDialog.Builder(context ?: return@OnClickListener, R.style.AlertDialogCustom)
.setView(R.layout.add_repo_input)
val dialog = builder.create()
@@ -193,8 +202,7 @@ class ExtensionsFragment : Fragment() {
dialog.list_repositories?.setOnClickListener {
// Open webview on tv if browser fails
- val isTv = it.context.isTvSettings()
- openBrowser(PUBLIC_REPOSITORIES_LIST, isTv, this)
+ openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this)
}
// dialog.text2?.text = provider.name
@@ -223,6 +231,12 @@ class ExtensionsFragment : Fragment() {
}
}
+ val isTv = isTrueTvSettings()
+ add_repo_button?.isGone = isTv
+ add_repo_button_imageview_holder?.isVisible = isTv
+ add_repo_button?.setOnClickListener(addRepositoryClick)
+ add_repo_button_imageview?.setOnClickListener(addRepositoryClick)
+
reloadRepositories()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginAdapter.kt
index e46c1508..75e7023e 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginAdapter.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginAdapter.kt
@@ -14,6 +14,7 @@ import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.plugins.PluginManager
import com.lagradost.cloudstream3.ui.result.setText
import com.lagradost.cloudstream3.ui.result.txt
+import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
import com.lagradost.cloudstream3.utils.AppUtils.html
import com.lagradost.cloudstream3.utils.GlideApp
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTwoLettersToLanguage
@@ -36,8 +37,9 @@ class PluginAdapter(
private val plugins: MutableList = mutableListOf()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
+ val layout = if(isTrueTvSettings()) R.layout.repository_item_tv else R.layout.repository_item
return PluginViewHolder(
- LayoutInflater.from(parent.context).inflate(R.layout.repository_item, parent, false)
+ LayoutInflater.from(parent.context).inflate(layout, parent, false)
)
}
@@ -123,7 +125,6 @@ class PluginAdapter(
itemView.action_button?.setOnClickListener {
iconClickCallback.invoke(data.plugin)
}
- testFindClosestBase2()
//if (itemView.context?.isTrueTvSettings() == false) {
// val siteUrl = metadata.repositoryUrl
// if (siteUrl != null && siteUrl.isNotBlank() && siteUrl != "NONE") {
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt
index 0ee0615a..7b944f62 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt
@@ -128,7 +128,7 @@ class PluginsFragment : Fragment() {
pluginViewModel.handlePluginAction(activity, url, it, isLocal)
}
- if (context?.isTvSettings() == true) {
+ if (isTvSettings()) {
// Scrolling down does not reveal the whole RecyclerView on TV, add to bypass that.
plugin_recycler_view?.setPadding(0, 0, 0, 200.toPx)
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/RepoAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/RepoAdapter.kt
index 15c54687..2dc302ee 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/RepoAdapter.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/RepoAdapter.kt
@@ -7,6 +7,7 @@ import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES
+import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
import kotlinx.android.synthetic.main.repository_item.view.*
class RepoAdapter(
@@ -19,8 +20,9 @@ class RepoAdapter(
private val repositories: MutableList = mutableListOf()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
+ val layout = if(isTrueTvSettings()) R.layout.repository_item_tv else R.layout.repository_item
return RepoViewHolder(
- LayoutInflater.from(parent.context).inflate(R.layout.repository_item, parent, false)
+ LayoutInflater.from(parent.context).inflate(layout, parent, false)
)
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt
index a3ea9b2a..43037038 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt
@@ -73,8 +73,7 @@ class SetupFragmentExtensions : Fragment() {
} else {
list_repositories?.setOnClickListener {
// Open webview on tv if browser fails
- val isTv = it.context.isTvSettings()
- openBrowser(PUBLIC_REPOSITORIES_LIST, isTv, this)
+ openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this)
}
}
}
@@ -86,8 +85,7 @@ class SetupFragmentExtensions : Fragment() {
val isSetup = arguments?.getBoolean(SETUP_EXTENSION_BUNDLE_IS_SETUP) ?: false
view_public_repositories_button?.setOnClickListener {
- val isTv = it.context.isTvSettings()
- openBrowser(PUBLIC_REPOSITORIES_LIST, isTv, this)
+ openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this)
}
with(context) {
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/ChromecastSubtitlesFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/ChromecastSubtitlesFragment.kt
index 957b1d9b..83d134cb 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/ChromecastSubtitlesFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/ChromecastSubtitlesFragment.kt
@@ -164,7 +164,7 @@ class ChromecastSubtitlesFragment : Fragment() {
state = getCurrentSavedStyle()
context?.updateState()
- val isTvSettings = context?.isTvSettings() == true
+ val isTvSettings = isTvSettings()
fun View.setFocusableInTv() {
this.isFocusableInTouchMode = isTvSettings
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/SubtitlesFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/SubtitlesFragment.kt
index 8095b007..b1d82b76 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/SubtitlesFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/SubtitlesFragment.kt
@@ -243,7 +243,7 @@ class SubtitlesFragment : Fragment() {
state = getCurrentSavedStyle()
context?.updateState()
- val isTvTrueSettings = context?.isTrueTvSettings() == true
+ val isTvTrueSettings = isTrueTvSettings()
fun View.setFocusableInTv() {
this.isFocusableInTouchMode = isTvTrueSettings
diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt
index fa39e374..1c7bb214 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt
@@ -407,8 +407,8 @@ object AppUtils {
//private val viewModel: ResultViewModel by activityViewModels()
- private fun getResultsId(context: Context): Int {
- return if (context.isTrueTvSettings()) {
+ private fun getResultsId(): Int {
+ return if (isTrueTvSettings()) {
R.id.global_to_navigation_results_tv
} else {
R.id.global_to_navigation_results_phone
@@ -424,7 +424,7 @@ object AppUtils {
this.runOnUiThread {
// viewModelStore.clear()
this.navigate(
- getResultsId(this.applicationContext ?: return@runOnUiThread),
+ getResultsId(),
ResultFragment.newInstance(url, apiName, startAction, startValue)
)
}
@@ -438,7 +438,7 @@ object AppUtils {
this?.runOnUiThread {
// viewModelStore.clear()
this.navigate(
- getResultsId(this),
+ getResultsId(),
ResultFragment.newInstance(card, startAction, startValue)
)
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/SingleSelectionHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/SingleSelectionHelper.kt
index b228fe77..b3bce446 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/utils/SingleSelectionHelper.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/utils/SingleSelectionHelper.kt
@@ -44,7 +44,7 @@ object SingleSelectionHelper {
) {
if (this == null) return
- if (this.isTvSettings()) {
+ if (isTvSettings()) {
val builder =
AlertDialog.Builder(this, R.style.AlertDialogCustom)
.setView(R.layout.options_popup_tv)
diff --git a/app/src/main/java/com/lagradost/cloudstream3/widget/LinearRecycleViewLayoutManager.kt b/app/src/main/java/com/lagradost/cloudstream3/widget/LinearRecycleViewLayoutManager.kt
new file mode 100644
index 00000000..4df8e086
--- /dev/null
+++ b/app/src/main/java/com/lagradost/cloudstream3/widget/LinearRecycleViewLayoutManager.kt
@@ -0,0 +1,30 @@
+package com.lagradost.cloudstream3.widget
+
+import android.content.Context
+import android.view.View
+import androidx.recyclerview.widget.LinearLayoutManager
+
+class LinearRecycleViewLayoutManager(
+ val context: Context,
+ val nextFocusUp: Int,
+ val nextFocusDown: Int
+) : LinearLayoutManager(context) {
+ override fun onInterceptFocusSearch(focused: View, direction: Int): View? {
+ return try {
+ val position = getPosition(focused)
+ val count = itemCount
+ //println("onInterceptFocusSearch position=$position count=$count focused=$focused direction=$direction")
+
+ (if (position == count - 1 && direction == View.FOCUS_DOWN) {
+ focused.rootView.findViewById(nextFocusDown)
+ } else if (position == 0 && direction == View.FOCUS_UP) {
+ focused.rootView.findViewById(nextFocusUp)
+ } else {
+ super.onInterceptFocusSearch(focused, direction)
+ }) ?: super.onInterceptFocusSearch(focused, direction)
+ } catch (t : Throwable) {
+ super.onInterceptFocusSearch(focused, direction)
+ }
+ }
+}
+
diff --git a/app/src/main/res/layout/add_repo_input.xml b/app/src/main/res/layout/add_repo_input.xml
index 0e8b72aa..445e71ec 100644
--- a/app/src/main/res/layout/add_repo_input.xml
+++ b/app/src/main/res/layout/add_repo_input.xml
@@ -29,7 +29,10 @@
android:textStyle="bold" />
+ android:orientation="vertical"
+ tools:visibility="gone">
-
-
+ android:orientation="horizontal">
-
-
-
-
-
-
-
-
-
-
+
+
+ android:text="@string/extensions"
+ android:textColor="?attr/textColor" />
-
+
+
+
+
+
+
+
+
+
+ android:orientation="horizontal">
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file