added settings to disable HD, SUB, DUB & Title. Now stop complaining

This commit is contained in:
LagradOst 2022-05-05 18:16:41 +02:00
parent a114c8658e
commit 1499b2be40
9 changed files with 180 additions and 71 deletions

View File

@ -36,7 +36,7 @@ android {
targetSdkVersion 30 targetSdkVersion 30
versionCode 47 versionCode 47
versionName "2.9.24" versionName "2.9.25"
resValue "string", "app_version", resValue "string", "app_version",
"${defaultConfig.versionName}${versionNameSuffix ?: ""}" "${defaultConfig.versionName}${versionNameSuffix ?: ""}"

View File

@ -44,6 +44,7 @@ import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.appString
import com.lagradost.cloudstream3.ui.APIRepository import com.lagradost.cloudstream3.ui.APIRepository
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO
import com.lagradost.cloudstream3.ui.result.ResultFragment 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.isEmulatorSettings
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable
@ -109,7 +110,8 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
super.onConfigurationChanged(newConfig) super.onConfigurationChanged(newConfig)
updateLocale() // android fucks me by chaining lang when rotating the phone 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) } navHostFragment.navController.currentDestination?.let { updateNavBar(it) }
} }
@ -349,6 +351,8 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
api.init() api.init()
} }
SearchResultBuilder.updateCache(this)
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this) val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
val downloadFromGithub = try { val downloadFromGithub = try {
settingsManager.getBoolean(getString(R.string.killswitch_key), true) settingsManager.getBoolean(getString(R.string.killswitch_key), true)
@ -365,57 +369,68 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
e.printStackTrace() e.printStackTrace()
false 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 fun addNginxToJson(data: java.util.HashMap<String, ProvidersInfoJson>): java.util.HashMap<String, ProvidersInfoJson>? {
} catch (e: Exception) { try {
logError(e) val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
return data val nginxUrl =
} settingsManager.getString(getString(R.string.nginx_url_key), "nginx_url_key")
} .toString()
fun createNginxJson() : ProvidersInfoJson? { //java.util.HashMap<String, ProvidersInfoJson> val nginxCredentials =
return try { settingsManager.getString(
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this) getString(R.string.nginx_credentials),
val nginxUrl = settingsManager.getString(getString(R.string.nginx_url_key), "nginx_url_key").toString() "nginx_credentials"
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: .toString()
null // don't overwrite anything val StoredNginxProvider = NginxProvider()
} else { if (nginxUrl == "nginx_url_key" || nginxUrl == "") { // if key is default value, or empty:
ProvidersInfoJson( data[StoredNginxProvider.javaClass.simpleName] = ProvidersInfoJson(
url = nginxUrl, url = nginxUrl,
name = NginxProvider().name, name = StoredNginxProvider.name,
status = PROVIDER_STATUS_OK, status = PROVIDER_STATUS_DOWN, // the provider will not be display
credentials = nginxCredentials 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 // this pulls the latest data so ppl don't have to update to simply change provider url
if (downloadFromGithub) { if (downloadFromGithub) {
@ -435,13 +450,15 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
tryParseJson<HashMap<String, ProvidersInfoJson>>(txt) tryParseJson<HashMap<String, ProvidersInfoJson>>(txt)
setKey(PROVIDER_STATUS_KEY, txt) setKey(PROVIDER_STATUS_KEY, txt)
MainAPI.overrideData = newCache // update all new providers MainAPI.overrideData = newCache // update all new providers
val newUpdatedCache = newCache?.let { addNginxToJson(it) ?: it }
for (api in apis) { // update current providers val newUpdatedCache =
newUpdatedCache?.get(api.javaClass.simpleName)?.let { data -> newCache?.let { addNginxToJson(it) ?: it }
api.overrideWithNewData(data)
} for (api in apis) { // update current providers
newUpdatedCache?.get(api.javaClass.simpleName)
?.let { data ->
api.overrideWithNewData(data)
}
} }
} catch (e: Exception) { } catch (e: Exception) {
logError(e) logError(e)
@ -456,7 +473,8 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
newCache newCache
}?.let { providersJsonMap -> }?.let { providersJsonMap ->
MainAPI.overrideData = 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 = val acceptableProviders =
providersJsonMapUpdated.filter { it.value.status == PROVIDER_STATUS_OK || it.value.status == PROVIDER_STATUS_SLOW } providersJsonMapUpdated.filter { it.value.status == PROVIDER_STATUS_OK || it.value.status == PROVIDER_STATUS_SLOW }
.map { it.key }.toSet() .map { it.key }.toSet()
@ -524,7 +542,8 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
setUpBackup() setUpBackup()
CommonActivity.init(this) 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 = navHostFragment.navController
//val navController = findNavController(R.id.nav_host_fragment) //val navController = findNavController(R.id.nav_host_fragment)

View File

@ -1,11 +1,13 @@
package com.lagradost.cloudstream3.ui.search package com.lagradost.cloudstream3.ui.search
import android.content.Context
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
import android.widget.ProgressBar import android.widget.ProgressBar
import android.widget.TextView import android.widget.TextView
import androidx.cardview.widget.CardView import androidx.cardview.widget.CardView
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.preference.PreferenceManager
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull 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.* import kotlinx.android.synthetic.main.home_result_grid.view.*
object SearchResultBuilder { 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. * @param nextFocusBehavior True if first, False if last, Null if between.
* Used to prevent escaping the adapter horizontally (focus wise). * Used to prevent escaping the adapter horizontally (focus wise).
@ -34,6 +47,7 @@ object SearchResultBuilder {
val textIsDub: TextView? = itemView.text_is_dub val textIsDub: TextView? = itemView.text_is_dub
val textIsSub: TextView? = itemView.text_is_sub val textIsSub: TextView? = itemView.text_is_sub
val textQuality: TextView? = itemView.text_quality val textQuality: TextView? = itemView.text_quality
val shadow: View? = itemView.title_shadow
val bg: CardView = itemView.background_card val bg: CardView = itemView.background_card
@ -47,6 +61,13 @@ object SearchResultBuilder {
textIsDub?.isVisible = false textIsDub?.isVisible = false
textIsSub?.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) { when (card.quality) {
SearchQuality.BlueRay -> R.string.quality_blueray SearchQuality.BlueRay -> R.string.quality_blueray
SearchQuality.Cam -> R.string.quality_cam SearchQuality.Cam -> R.string.quality_cam
@ -67,14 +88,15 @@ object SearchResultBuilder {
null -> null null -> null
}?.let { textRes -> }?.let { textRes ->
textQuality?.setText(textRes) textQuality?.setText(textRes)
textQuality?.isVisible = true textQuality?.isVisible = showHd
} ?: run { } ?: run {
textQuality?.isVisible = false textQuality?.isVisible = false
} }
cardText?.text = card.name cardText?.text = card.name
cardText?.isVisible = showTitle
cardView.isVisible = true cardView.isVisible = true
if (!cardView.setImage(card.posterUrl, card.posterHeaders)) { if (!cardView.setImage(card.posterUrl, card.posterHeaders)) {
cardView.setImageResource(R.drawable.default_cover) cardView.setImageResource(R.drawable.default_cover)
} }
@ -185,10 +207,10 @@ object SearchResultBuilder {
val dubStatus = card.dubStatus val dubStatus = card.dubStatus
if (!dubStatus.isNullOrEmpty()) { if (!dubStatus.isNullOrEmpty()) {
if (dubStatus.contains(DubStatus.Dubbed)) { if (dubStatus.contains(DubStatus.Dubbed)) {
textIsDub?.visibility = View.VISIBLE textIsDub?.isVisible = showDub
} }
if (dubStatus.contains(DubStatus.Subbed)) { if (dubStatus.contains(DubStatus.Subbed)) {
textIsSub?.visibility = View.VISIBLE textIsSub?.isVisible = showSub
} }
} }

View File

@ -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.aniListApi
import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.malApi import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.malApi
import com.lagradost.cloudstream3.ui.APIRepository 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.ChromecastSubtitlesFragment
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
import com.lagradost.cloudstream3.utils.BackupUtils.backup import com.lagradost.cloudstream3.utils.BackupUtils.backup
@ -339,6 +340,34 @@ class SettingsFragment : PreferenceFragmentCompat() {
return@setOnPreferenceClickListener true 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 = val syncApis =
listOf(Pair(R.string.mal_key, malApi), Pair(R.string.anilist_key, aniListApi)) listOf(Pair(R.string.mal_key, malApi), Pair(R.string.anilist_key, aniListApi))
for ((key, api) in syncApis) { for ((key, api) in syncApis) {
@ -487,28 +516,34 @@ class SettingsFragment : PreferenceFragmentCompat() {
return@setOnPreferenceClickListener true return@setOnPreferenceClickListener true
} }
getPref(R.string.nginx_url_key)?.setOnPreferenceClickListener { getPref(R.string.nginx_url_key)?.setOnPreferenceClickListener {
activity?.showNginxTextInputDialog( activity?.showNginxTextInputDialog(
settingsManager.getString(getString(R.string.nginx_url_pref), "Nginx server url").toString(), settingsManager.getString(getString(R.string.nginx_url_pref), "Nginx server url")
settingsManager.getString(getString(R.string.nginx_url_key), "").toString(), // key: the actual you use rn .toString(),
settingsManager.getString(getString(R.string.nginx_url_key), "")
.toString(), // key: the actual you use rn
android.text.InputType.TYPE_TEXT_VARIATION_URI, // uri android.text.InputType.TYPE_TEXT_VARIATION_URI, // uri
{}) { {}) {
settingsManager.edit() 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 return@setOnPreferenceClickListener true
} }
getPref(R.string.nginx_credentials)?.setOnPreferenceClickListener { getPref(R.string.nginx_credentials)?.setOnPreferenceClickListener {
activity?.showNginxTextInputDialog( activity?.showNginxTextInputDialog(
settingsManager.getString(getString(R.string.nginx_credentials_title), "Nginx Credentials").toString(), settingsManager.getString(
settingsManager.getString(getString(R.string.nginx_credentials), "").toString(), // key: the actual you use rn 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, android.text.InputType.TYPE_TEXT_VARIATION_URI,
{}) { {}) {
settingsManager.edit() 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 return@setOnPreferenceClickListener true
} }

View File

@ -30,6 +30,7 @@
android:clickable="false" android:clickable="false"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="50dp" android:layout_height="50dp"
android:id="@+id/title_shadow"
android:src="@drawable/title_shadow" android:src="@drawable/title_shadow"
android:layout_gravity="bottom" android:layout_gravity="bottom"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />

View File

@ -36,6 +36,7 @@
android:clickable="false" android:clickable="false"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="50dp" android:layout_height="50dp"
android:id="@+id/title_shadow"
android:src="@drawable/title_shadow" android:src="@drawable/title_shadow"
android:layout_gravity="bottom" android:layout_gravity="bottom"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
@ -55,6 +56,7 @@
android:paddingStart="5dp" android:paddingStart="5dp"
android:paddingEnd="5dp" android:paddingEnd="5dp"
android:ellipsize="end" /> android:ellipsize="end" />
<TextView <TextView
tools:text="@string/quality_hd" tools:text="@string/quality_hd"
android:id="@+id/text_quality" android:id="@+id/text_quality"
@ -67,6 +69,7 @@
android:layout_gravity="end" android:layout_gravity="end"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<TextView <TextView
android:text="@string/app_dubbed_text" android:text="@string/app_dubbed_text"
android:id="@+id/text_is_dub" android:id="@+id/text_is_dub"

View File

@ -143,6 +143,20 @@
<item>500</item> <item>500</item>
</array> </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"> <array name="episode_long_click_options">
<item>@string/episode_action_chromecast_episode</item> <item>@string/episode_action_chromecast_episode</item>
<item>@string/episode_action_chromecast_mirror</item> <item>@string/episode_action_chromecast_mirror</item>

View File

@ -48,6 +48,7 @@
<string name="log_enabled_key" translatable="false">log_enabled_key</string> <string name="log_enabled_key" translatable="false">log_enabled_key</string>
<string name="show_logcat_key" translatable="false">show_logcat_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="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 --> <!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG -->
<string name="extra_info_format" translatable="false" formatted="true">%d %s | %sMB</string> <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_reload_links">Reload links</string>
<string name="episode_action_download_subtitle">Download subtitles</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="no_update_found">No Update Found</string>
<string name="check_for_update">Check for Update</string> <string name="check_for_update">Check for Update</string>

View File

@ -166,6 +166,10 @@
android:key="@string/bottom_title_key" android:key="@string/bottom_title_key"
android:summary="@string/bottom_title_settings_des" android:summary="@string/bottom_title_settings_des"
android:title="@string/bottom_title_settings" /> 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>
<PreferenceCategory <PreferenceCategory
android:key="search" android:key="search"