mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
added settings to disable HD, SUB, DUB & Title. Now stop complaining
This commit is contained in:
parent
a114c8658e
commit
1499b2be40
9 changed files with 180 additions and 71 deletions
|
@ -36,7 +36,7 @@ android {
|
|||
targetSdkVersion 30
|
||||
|
||||
versionCode 47
|
||||
versionName "2.9.24"
|
||||
versionName "2.9.25"
|
||||
|
||||
resValue "string", "app_version",
|
||||
"${defaultConfig.versionName}${versionNameSuffix ?: ""}"
|
||||
|
|
|
@ -44,6 +44,7 @@ import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.appString
|
|||
import com.lagradost.cloudstream3.ui.APIRepository
|
||||
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO
|
||||
import com.lagradost.cloudstream3.ui.result.ResultFragment
|
||||
import com.lagradost.cloudstream3.ui.search.SearchResultBuilder
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isEmulatorSettings
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable
|
||||
|
@ -109,7 +110,8 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
|||
super.onConfigurationChanged(newConfig)
|
||||
updateLocale() // android fucks me by chaining lang when rotating the phone
|
||||
|
||||
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
|
||||
val navHostFragment =
|
||||
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
|
||||
navHostFragment.navController.currentDestination?.let { updateNavBar(it) }
|
||||
}
|
||||
|
||||
|
@ -349,6 +351,8 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
|||
api.init()
|
||||
}
|
||||
|
||||
SearchResultBuilder.updateCache(this)
|
||||
|
||||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
||||
val downloadFromGithub = try {
|
||||
settingsManager.getBoolean(getString(R.string.killswitch_key), true)
|
||||
|
@ -365,57 +369,68 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
|||
e.printStackTrace()
|
||||
false
|
||||
}
|
||||
fun addNginxToJson(data: java.util.HashMap<String, ProvidersInfoJson>): java.util.HashMap<String, ProvidersInfoJson>? {
|
||||
try {
|
||||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
||||
val nginxUrl =
|
||||
settingsManager.getString(getString(R.string.nginx_url_key), "nginx_url_key").toString()
|
||||
val nginxCredentials =
|
||||
settingsManager.getString(getString(R.string.nginx_credentials), "nginx_credentials")
|
||||
.toString()
|
||||
val StoredNginxProvider = NginxProvider()
|
||||
if (nginxUrl == "nginx_url_key" || nginxUrl == "") { // if key is default value, or empty:
|
||||
data[StoredNginxProvider.javaClass.simpleName] = ProvidersInfoJson(
|
||||
url = nginxUrl,
|
||||
name = StoredNginxProvider.name,
|
||||
status = PROVIDER_STATUS_DOWN, // the provider will not be display
|
||||
credentials = nginxCredentials
|
||||
)
|
||||
} else { // valid url
|
||||
data[StoredNginxProvider.javaClass.simpleName] = ProvidersInfoJson(
|
||||
url = nginxUrl,
|
||||
name = StoredNginxProvider.name,
|
||||
status = PROVIDER_STATUS_OK,
|
||||
credentials = nginxCredentials
|
||||
)
|
||||
}
|
||||
|
||||
return data
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
return data
|
||||
}
|
||||
}
|
||||
fun createNginxJson() : ProvidersInfoJson? { //java.util.HashMap<String, ProvidersInfoJson>
|
||||
return try {
|
||||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
||||
val nginxUrl = settingsManager.getString(getString(R.string.nginx_url_key), "nginx_url_key").toString()
|
||||
val nginxCredentials = settingsManager.getString(getString(R.string.nginx_credentials), "nginx_credentials").toString()
|
||||
if (nginxUrl == "nginx_url_key" || nginxUrl == "") { // if key is default value or empty:
|
||||
null // don't overwrite anything
|
||||
} else {
|
||||
ProvidersInfoJson(
|
||||
url = nginxUrl,
|
||||
name = NginxProvider().name,
|
||||
status = PROVIDER_STATUS_OK,
|
||||
credentials = nginxCredentials
|
||||
)
|
||||
fun addNginxToJson(data: java.util.HashMap<String, ProvidersInfoJson>): java.util.HashMap<String, ProvidersInfoJson>? {
|
||||
try {
|
||||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
||||
val nginxUrl =
|
||||
settingsManager.getString(getString(R.string.nginx_url_key), "nginx_url_key")
|
||||
.toString()
|
||||
val nginxCredentials =
|
||||
settingsManager.getString(
|
||||
getString(R.string.nginx_credentials),
|
||||
"nginx_credentials"
|
||||
)
|
||||
.toString()
|
||||
val StoredNginxProvider = NginxProvider()
|
||||
if (nginxUrl == "nginx_url_key" || nginxUrl == "") { // if key is default value, or empty:
|
||||
data[StoredNginxProvider.javaClass.simpleName] = ProvidersInfoJson(
|
||||
url = nginxUrl,
|
||||
name = StoredNginxProvider.name,
|
||||
status = PROVIDER_STATUS_DOWN, // the provider will not be display
|
||||
credentials = nginxCredentials
|
||||
)
|
||||
} else { // valid url
|
||||
data[StoredNginxProvider.javaClass.simpleName] = ProvidersInfoJson(
|
||||
url = nginxUrl,
|
||||
name = StoredNginxProvider.name,
|
||||
status = PROVIDER_STATUS_OK,
|
||||
credentials = nginxCredentials
|
||||
)
|
||||
}
|
||||
|
||||
return data
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
return data
|
||||
}
|
||||
}
|
||||
|
||||
fun createNginxJson(): ProvidersInfoJson? { //java.util.HashMap<String, ProvidersInfoJson>
|
||||
return try {
|
||||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
||||
val nginxUrl =
|
||||
settingsManager.getString(getString(R.string.nginx_url_key), "nginx_url_key")
|
||||
.toString()
|
||||
val nginxCredentials = settingsManager.getString(
|
||||
getString(R.string.nginx_credentials),
|
||||
"nginx_credentials"
|
||||
).toString()
|
||||
if (nginxUrl == "nginx_url_key" || nginxUrl == "") { // if key is default value or empty:
|
||||
null // don't overwrite anything
|
||||
} else {
|
||||
ProvidersInfoJson(
|
||||
url = nginxUrl,
|
||||
name = NginxProvider().name,
|
||||
status = PROVIDER_STATUS_OK,
|
||||
credentials = nginxCredentials
|
||||
)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
null
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
// this pulls the latest data so ppl don't have to update to simply change provider url
|
||||
if (downloadFromGithub) {
|
||||
|
@ -435,13 +450,15 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
|||
tryParseJson<HashMap<String, ProvidersInfoJson>>(txt)
|
||||
setKey(PROVIDER_STATUS_KEY, txt)
|
||||
MainAPI.overrideData = newCache // update all new providers
|
||||
|
||||
val newUpdatedCache = newCache?.let { addNginxToJson(it) ?: it }
|
||||
|
||||
for (api in apis) { // update current providers
|
||||
newUpdatedCache?.get(api.javaClass.simpleName)?.let { data ->
|
||||
api.overrideWithNewData(data)
|
||||
}
|
||||
val newUpdatedCache =
|
||||
newCache?.let { addNginxToJson(it) ?: it }
|
||||
|
||||
for (api in apis) { // update current providers
|
||||
newUpdatedCache?.get(api.javaClass.simpleName)
|
||||
?.let { data ->
|
||||
api.overrideWithNewData(data)
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
|
@ -456,7 +473,8 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
|||
newCache
|
||||
}?.let { providersJsonMap ->
|
||||
MainAPI.overrideData = providersJsonMap
|
||||
val providersJsonMapUpdated = addNginxToJson(providersJsonMap)?: providersJsonMap // if return null, use unchanged one
|
||||
val providersJsonMapUpdated = addNginxToJson(providersJsonMap)
|
||||
?: providersJsonMap // if return null, use unchanged one
|
||||
val acceptableProviders =
|
||||
providersJsonMapUpdated.filter { it.value.status == PROVIDER_STATUS_OK || it.value.status == PROVIDER_STATUS_SLOW }
|
||||
.map { it.key }.toSet()
|
||||
|
@ -524,7 +542,8 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
|||
setUpBackup()
|
||||
|
||||
CommonActivity.init(this)
|
||||
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
|
||||
val navHostFragment =
|
||||
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
|
||||
val navController = navHostFragment.navController
|
||||
//val navController = findNavController(R.id.nav_host_fragment)
|
||||
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
package com.lagradost.cloudstream3.ui.search
|
||||
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import android.widget.ImageView
|
||||
import android.widget.ProgressBar
|
||||
import android.widget.TextView
|
||||
import androidx.cardview.widget.CardView
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
|
||||
|
@ -15,6 +17,17 @@ import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
|||
import kotlinx.android.synthetic.main.home_result_grid.view.*
|
||||
|
||||
object SearchResultBuilder {
|
||||
private val showCache: MutableMap<String, Boolean> = mutableMapOf()
|
||||
|
||||
fun updateCache(context: Context?) {
|
||||
if (context == null) return
|
||||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
|
||||
for (k in context.resources.getStringArray(R.array.poster_ui_options_values)) {
|
||||
showCache[k] = settingsManager.getBoolean(k, showCache[k] ?: true)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param nextFocusBehavior True if first, False if last, Null if between.
|
||||
* Used to prevent escaping the adapter horizontally (focus wise).
|
||||
|
@ -34,6 +47,7 @@ object SearchResultBuilder {
|
|||
val textIsDub: TextView? = itemView.text_is_dub
|
||||
val textIsSub: TextView? = itemView.text_is_sub
|
||||
val textQuality: TextView? = itemView.text_quality
|
||||
val shadow: View? = itemView.title_shadow
|
||||
|
||||
val bg: CardView = itemView.background_card
|
||||
|
||||
|
@ -47,6 +61,13 @@ object SearchResultBuilder {
|
|||
textIsDub?.isVisible = false
|
||||
textIsSub?.isVisible = false
|
||||
|
||||
val showSub = showCache[textIsDub?.context?.getString(R.string.show_sub_key)] ?: false
|
||||
val showDub = showCache[textIsDub?.context?.getString(R.string.show_dub_key)] ?: false
|
||||
val showTitle = showCache[cardText?.context?.getString(R.string.show_title_key)] ?: false
|
||||
val showHd = showCache[textQuality?.context?.getString(R.string.show_title_key)] ?: false
|
||||
|
||||
shadow?.isVisible = showTitle
|
||||
|
||||
when (card.quality) {
|
||||
SearchQuality.BlueRay -> R.string.quality_blueray
|
||||
SearchQuality.Cam -> R.string.quality_cam
|
||||
|
@ -67,14 +88,15 @@ object SearchResultBuilder {
|
|||
null -> null
|
||||
}?.let { textRes ->
|
||||
textQuality?.setText(textRes)
|
||||
textQuality?.isVisible = true
|
||||
textQuality?.isVisible = showHd
|
||||
} ?: run {
|
||||
textQuality?.isVisible = false
|
||||
}
|
||||
|
||||
cardText?.text = card.name
|
||||
|
||||
cardText?.isVisible = showTitle
|
||||
cardView.isVisible = true
|
||||
|
||||
if (!cardView.setImage(card.posterUrl, card.posterHeaders)) {
|
||||
cardView.setImageResource(R.drawable.default_cover)
|
||||
}
|
||||
|
@ -185,10 +207,10 @@ object SearchResultBuilder {
|
|||
val dubStatus = card.dubStatus
|
||||
if (!dubStatus.isNullOrEmpty()) {
|
||||
if (dubStatus.contains(DubStatus.Dubbed)) {
|
||||
textIsDub?.visibility = View.VISIBLE
|
||||
textIsDub?.isVisible = showDub
|
||||
}
|
||||
if (dubStatus.contains(DubStatus.Subbed)) {
|
||||
textIsSub?.visibility = View.VISIBLE
|
||||
textIsSub?.isVisible = showSub
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ import com.lagradost.cloudstream3.syncproviders.OAuth2API
|
|||
import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.aniListApi
|
||||
import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.malApi
|
||||
import com.lagradost.cloudstream3.ui.APIRepository
|
||||
import com.lagradost.cloudstream3.ui.search.SearchResultBuilder
|
||||
import com.lagradost.cloudstream3.ui.subtitles.ChromecastSubtitlesFragment
|
||||
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
|
||||
import com.lagradost.cloudstream3.utils.BackupUtils.backup
|
||||
|
@ -339,6 +340,34 @@ class SettingsFragment : PreferenceFragmentCompat() {
|
|||
return@setOnPreferenceClickListener true
|
||||
}
|
||||
|
||||
getPref(R.string.poster_ui_key)?.setOnPreferenceClickListener {
|
||||
val prefNames = resources.getStringArray(R.array.poster_ui_options)
|
||||
val keys = resources.getStringArray(R.array.poster_ui_options_values)
|
||||
val prefValues = keys.map {
|
||||
settingsManager.getBoolean(it, true)
|
||||
}.mapIndexedNotNull { index, b ->
|
||||
if (b) {
|
||||
index
|
||||
} else null
|
||||
}
|
||||
|
||||
activity?.showMultiDialog(
|
||||
prefNames.toList(),
|
||||
prefValues,
|
||||
getString(R.string.poster_ui_settings),
|
||||
{}) { list ->
|
||||
val edit = settingsManager.edit()
|
||||
for ((i, key) in keys.withIndex()) {
|
||||
edit.putBoolean(key, list.contains(i))
|
||||
}
|
||||
edit.apply()
|
||||
SearchResultBuilder.updateCache(it.context)
|
||||
}
|
||||
|
||||
return@setOnPreferenceClickListener true
|
||||
}
|
||||
|
||||
|
||||
val syncApis =
|
||||
listOf(Pair(R.string.mal_key, malApi), Pair(R.string.anilist_key, aniListApi))
|
||||
for ((key, api) in syncApis) {
|
||||
|
@ -487,28 +516,34 @@ class SettingsFragment : PreferenceFragmentCompat() {
|
|||
return@setOnPreferenceClickListener true
|
||||
}
|
||||
|
||||
getPref(R.string.nginx_url_key)?.setOnPreferenceClickListener {
|
||||
|
||||
getPref(R.string.nginx_url_key)?.setOnPreferenceClickListener {
|
||||
activity?.showNginxTextInputDialog(
|
||||
settingsManager.getString(getString(R.string.nginx_url_pref), "Nginx server url").toString(),
|
||||
settingsManager.getString(getString(R.string.nginx_url_key), "").toString(), // key: the actual you use rn
|
||||
settingsManager.getString(getString(R.string.nginx_url_pref), "Nginx server url")
|
||||
.toString(),
|
||||
settingsManager.getString(getString(R.string.nginx_url_key), "")
|
||||
.toString(), // key: the actual you use rn
|
||||
android.text.InputType.TYPE_TEXT_VARIATION_URI, // uri
|
||||
{}) {
|
||||
settingsManager.edit()
|
||||
.putString(getString(R.string.nginx_url_key), it).apply() // change the stored url in nginx_url_key to it
|
||||
.putString(getString(R.string.nginx_url_key), it)
|
||||
.apply() // change the stored url in nginx_url_key to it
|
||||
}
|
||||
return@setOnPreferenceClickListener true
|
||||
}
|
||||
|
||||
getPref(R.string.nginx_credentials)?.setOnPreferenceClickListener {
|
||||
|
||||
activity?.showNginxTextInputDialog(
|
||||
settingsManager.getString(getString(R.string.nginx_credentials_title), "Nginx Credentials").toString(),
|
||||
settingsManager.getString(getString(R.string.nginx_credentials), "").toString(), // key: the actual you use rn
|
||||
settingsManager.getString(
|
||||
getString(R.string.nginx_credentials_title),
|
||||
"Nginx Credentials"
|
||||
).toString(),
|
||||
settingsManager.getString(getString(R.string.nginx_credentials), "")
|
||||
.toString(), // key: the actual you use rn
|
||||
android.text.InputType.TYPE_TEXT_VARIATION_URI,
|
||||
{}) {
|
||||
settingsManager.edit()
|
||||
.putString(getString(R.string.nginx_credentials), it).apply() // change the stored url in nginx_url_key to it
|
||||
.putString(getString(R.string.nginx_credentials), it)
|
||||
.apply() // change the stored url in nginx_url_key to it
|
||||
}
|
||||
return@setOnPreferenceClickListener true
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
android:clickable="false"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:id="@+id/title_shadow"
|
||||
android:src="@drawable/title_shadow"
|
||||
android:layout_gravity="bottom"
|
||||
tools:ignore="ContentDescription" />
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
android:clickable="false"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:id="@+id/title_shadow"
|
||||
android:src="@drawable/title_shadow"
|
||||
android:layout_gravity="bottom"
|
||||
tools:ignore="ContentDescription" />
|
||||
|
@ -55,6 +56,7 @@
|
|||
android:paddingStart="5dp"
|
||||
android:paddingEnd="5dp"
|
||||
android:ellipsize="end" />
|
||||
|
||||
<TextView
|
||||
tools:text="@string/quality_hd"
|
||||
android:id="@+id/text_quality"
|
||||
|
@ -67,6 +69,7 @@
|
|||
android:layout_gravity="end"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView
|
||||
android:text="@string/app_dubbed_text"
|
||||
android:id="@+id/text_is_dub"
|
||||
|
|
|
@ -143,6 +143,20 @@
|
|||
<item>500</item>
|
||||
</array>
|
||||
|
||||
<array name="poster_ui_options">
|
||||
<item>@string/show_hd</item>
|
||||
<item>@string/show_dub</item>
|
||||
<item>@string/show_sub</item>
|
||||
<item>@string/show_title</item>
|
||||
</array>
|
||||
|
||||
<array name="poster_ui_options_values">
|
||||
<item>@string/show_hd_key</item>
|
||||
<item>@string/show_dub_key</item>
|
||||
<item>@string/show_sub_key</item>
|
||||
<item>@string/show_title_key</item>
|
||||
</array>
|
||||
|
||||
<array name="episode_long_click_options">
|
||||
<item>@string/episode_action_chromecast_episode</item>
|
||||
<item>@string/episode_action_chromecast_mirror</item>
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
<string name="log_enabled_key" translatable="false">log_enabled_key</string>
|
||||
<string name="show_logcat_key" translatable="false">show_logcat_key</string>
|
||||
<string name="bottom_title_key" translatable="false">bottom_title_key</string>
|
||||
<string name="poster_ui_key" translatable="false">poster_ui_key</string>
|
||||
|
||||
<!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG -->
|
||||
<string name="extra_info_format" translatable="false" formatted="true">%d %s | %sMB</string>
|
||||
|
@ -342,6 +343,16 @@
|
|||
<string name="episode_action_reload_links">Reload links</string>
|
||||
<string name="episode_action_download_subtitle">Download subtitles</string>
|
||||
|
||||
<string name="show_hd">Quality label</string>
|
||||
<string name="show_dub">Dub label</string>
|
||||
<string name="show_sub">Sub label</string>
|
||||
<string name="show_title">Title</string>
|
||||
<string name="show_hd_key" translatable="false">show_hd_key</string>
|
||||
<string name="show_dub_key" translatable="false">show_dub_key</string>
|
||||
<string name="show_sub_key" translatable="false">show_sub_key</string>
|
||||
<string name="show_title_key" translatable="false">show_title_key</string>
|
||||
<string name="poster_ui_settings">Toggle UI elements on poster</string>
|
||||
|
||||
<string name="no_update_found">No Update Found</string>
|
||||
<string name="check_for_update">Check for Update</string>
|
||||
|
||||
|
|
|
@ -166,6 +166,10 @@
|
|||
android:key="@string/bottom_title_key"
|
||||
android:summary="@string/bottom_title_settings_des"
|
||||
android:title="@string/bottom_title_settings" />
|
||||
<Preference
|
||||
android:icon="@drawable/ic_baseline_tv_24"
|
||||
android:key="@string/poster_ui_key"
|
||||
android:title="@string/poster_ui_settings" />
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory
|
||||
android:key="search"
|
||||
|
|
Loading…
Reference in a new issue