[Feature] Random button on Homepage. (#919)

* [Feature] Random button on Homepage.

* commit missing edits

* applied PR suggestions

* [Feature] Add option to hide title on video player.

* Toggle visibility of Random button on Homepage

* fixes
This commit is contained in:
Jace 2022-04-19 01:55:21 +08:00 committed by GitHub
parent 83d8e2bb4d
commit 9fb4b74b79
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 69 additions and 7 deletions

View file

@ -15,6 +15,7 @@ import androidx.core.view.isVisible
import androidx.core.widget.NestedScrollView import androidx.core.widget.NestedScrollView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSnapHelper import androidx.recyclerview.widget.LinearSnapHelper
@ -97,6 +98,7 @@ class HomeFragment : Fragment() {
companion object { companion object {
val configEvent = Event<Int>() val configEvent = Event<Int>()
var currentSpan = 1 var currentSpan = 1
val listHomepageItems = mutableListOf<SearchResponse>()
fun Activity.loadHomepageList(item: HomePageList) { fun Activity.loadHomepageList(item: HomePageList) {
val context = this val context = this
@ -358,6 +360,7 @@ class HomeFragment : Fragment() {
} }
private var currentApiName: String? = null private var currentApiName: String? = null
private var toggleRandomButton = false
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -367,6 +370,21 @@ class HomeFragment : Fragment() {
home_change_api?.setOnClickListener(apiChangeClickListener) home_change_api?.setOnClickListener(apiChangeClickListener)
home_change_api_loading?.setOnClickListener(apiChangeClickListener) home_change_api_loading?.setOnClickListener(apiChangeClickListener)
home_api_fab?.setOnClickListener(apiChangeClickListener) home_api_fab?.setOnClickListener(apiChangeClickListener)
home_random?.setOnClickListener {
if (listHomepageItems.isNotEmpty()) {
activity.loadSearchResult(listHomepageItems.random())
}
}
//Disable Random button, if its toggled off on settings
context?.let {
val settingsManager = PreferenceManager.getDefaultSharedPreferences(it)
toggleRandomButton = settingsManager.getBoolean(getString(R.string.random_button_key), false)
home_random?.isVisible = toggleRandomButton
if (!toggleRandomButton) {
home_random?.visibility = View.GONE
}
}
observe(homeViewModel.apiName) { apiName -> observe(homeViewModel.apiName) { apiName ->
currentApiName = apiName currentApiName = apiName
@ -441,11 +459,13 @@ class HomeFragment : Fragment() {
home_loading_shimmer?.stopShimmer() home_loading_shimmer?.stopShimmer()
val d = data.value val d = data.value
listHomepageItems.clear()
currentHomePage = d currentHomePage = d
(home_master_recycler?.adapter as? ParentItemAdapter?)?.updateList( (home_master_recycler?.adapter as? ParentItemAdapter?)?.updateList(
d?.items?.mapNotNull { d?.items?.mapNotNull {
try { try {
listHomepageItems.addAll(it.list.filterSearchResponse())
HomePageList(it.name, it.list.filterSearchResponse()) HomePageList(it.name, it.list.filterSearchResponse())
} catch (e: Exception) { } catch (e: Exception) {
logError(e) logError(e)
@ -456,6 +476,9 @@ class HomeFragment : Fragment() {
home_loading?.isVisible = false home_loading?.isVisible = false
home_loading_error?.isVisible = false home_loading_error?.isVisible = false
home_loaded?.isVisible = true home_loaded?.isVisible = true
if (toggleRandomButton) {
home_random?.isVisible = listHomepageItems.isNotEmpty()
}
} }
is Resource.Failure -> { is Resource.Failure -> {
home_loading_shimmer?.stopShimmer() home_loading_shimmer?.stopShimmer()
@ -791,9 +814,11 @@ class HomeFragment : Fragment() {
val dy = scrollY - oldScrollY val dy = scrollY - oldScrollY
if (dy > 0) { //check for scroll down if (dy > 0) { //check for scroll down
home_api_fab?.shrink() // hide home_api_fab?.shrink() // hide
home_random?.shrink()
} else if (dy < -5) { } else if (dy < -5) {
if (view?.context?.isTvSettings() == false) { if (view?.context?.isTvSettings() == false) {
home_api_fab?.extend() // show home_api_fab?.extend() // show
home_random?.extend()
} }
} }
}) })

View file

@ -499,13 +499,21 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
private fun updateUIVisibility() { private fun updateUIVisibility() {
val isGone = isLocked || !isShowing val isGone = isLocked || !isShowing
var togglePlayerTitleGone = isGone
context?.let {
val settingsManager = PreferenceManager.getDefaultSharedPreferences(it)
val limitTitle = settingsManager.getInt(getString(R.string.prefer_limit_title_key), 0)
if (limitTitle < 0) {
togglePlayerTitleGone = true
}
}
player_lock_holder?.isGone = isGone player_lock_holder?.isGone = isGone
player_video_bar?.isGone = isGone player_video_bar?.isGone = isGone
player_pause_play_holder?.isGone = isGone player_pause_play_holder?.isGone = isGone
player_pause_play?.isGone = isGone player_pause_play?.isGone = isGone
//player_buffering?.isGone = isGone //player_buffering?.isGone = isGone
player_top_holder?.isGone = isGone player_top_holder?.isGone = isGone
player_video_title?.isGone = isGone player_video_title?.isGone = togglePlayerTitleGone
player_video_title_rez?.isGone = isGone player_video_title_rez?.isGone = isGone
player_episode_filler?.isGone = isGone player_episode_filler?.isGone = isGone
player_center_menu?.isGone = isGone player_center_menu?.isGone = isGone

View file

@ -569,12 +569,18 @@ class GeneratorPlayer : FullScreenPlayer() {
} else { } else {
"" ""
} }
//Hide title, if set in setting
if (limitTitle < 0) {
player_video_title?.visibility = View.GONE
} else {
//Truncate video title if it exceeds limit //Truncate video title if it exceeds limit
val differenceInLength = playerVideoTitle.length - limitTitle val differenceInLength = playerVideoTitle.length - limitTitle
val margin = 3 //If the difference is smaller than or equal to this value, ignore it val margin = 3 //If the difference is smaller than or equal to this value, ignore it
if (limitTitle > 0 && differenceInLength > margin) { if (limitTitle > 0 && differenceInLength > margin) {
playerVideoTitle = playerVideoTitle.substring(0, limitTitle-1) + "..." playerVideoTitle = playerVideoTitle.substring(0, limitTitle-1) + "..."
} }
}
player_episode_filler_holder?.isVisible = isFiller ?: false player_episode_filler_holder?.isVisible = isFiller ?: false
player_video_title?.text = playerVideoTitle player_video_title?.text = playerVideoTitle

View file

@ -512,4 +512,14 @@
style="@style/ExtendedFloatingActionButton" style="@style/ExtendedFloatingActionButton"
android:textColor="?attr/textColor" android:textColor="?attr/textColor"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:visibility="gone"
tools:visibility="visible"
android:text="@string/home_random"
android:id="@+id/home_random"
android:layout_gravity="bottom|start"
app:icon="@drawable/ic_baseline_play_arrow_24"
style="@style/ExtendedFloatingActionButton"
android:textColor="?attr/textColor"
tools:ignore="ContentDescription" />
</FrameLayout> </FrameLayout>

View file

@ -133,6 +133,7 @@
android:gravity="center" android:gravity="center"
android:textColor="@color/white" android:textColor="@color/white"
android:textStyle="bold" android:textStyle="bold"
android:visibility="visible"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:text="Hello world" /> tools:text="Hello world" />

View file

@ -65,6 +65,7 @@
<item>32 characters</item> <item>32 characters</item>
<item>64 characters</item> <item>64 characters</item>
<item>128 characters</item> <item>128 characters</item>
<item>Hide Title</item>
</array> </array>
<array name="limit_title_pref_values"> <array name="limit_title_pref_values">
<item>0</item> <item>0</item>
@ -72,6 +73,7 @@
<item>32</item> <item>32</item>
<item>64</item> <item>64</item>
<item>128</item> <item>128</item>
<item>-1</item>
</array> </array>
<array name="video_buffer_length_names"> <array name="video_buffer_length_names">

View file

@ -30,6 +30,7 @@
<string name="swipe_vertical_enabled_key" translatable="false">swipe_vertical_enabled_key</string> <string name="swipe_vertical_enabled_key" translatable="false">swipe_vertical_enabled_key</string>
<string name="display_sub_key" translatable="false">display_sub_key</string> <string name="display_sub_key" translatable="false">display_sub_key</string>
<string name="show_fillers_key" translatable="false">show_fillers_key</string> <string name="show_fillers_key" translatable="false">show_fillers_key</string>
<string name="random_button_key" translatable="false">random_button_key</string>
<string name="provider_lang_key" translatable="false">provider_lang_key</string> <string name="provider_lang_key" translatable="false">provider_lang_key</string>
<string name="dns_key" translatable="false">dns_key</string> <string name="dns_key" translatable="false">dns_key</string>
<string name="download_path_key" translatable="false">download_path_key</string> <string name="download_path_key" translatable="false">download_path_key</string>
@ -352,7 +353,7 @@
<string name="skip_update">Skip this Update</string> <string name="skip_update">Skip this Update</string>
<string name="update">Update</string> <string name="update">Update</string>
<string name="watch_quality_pref">Preferred watch quality</string> <string name="watch_quality_pref">Preferred watch quality</string>
<string name="limit_title">Limit title characters on player</string> <string name="limit_title">Video player title max chars.</string>
<string name="video_buffer_size_settings">Video buffer size</string> <string name="video_buffer_size_settings">Video buffer size</string>
<string name="video_buffer_length_settings">Video buffer length</string> <string name="video_buffer_length_settings">Video buffer length</string>
<string name="video_buffer_disk_settings">Video cache on disk</string> <string name="video_buffer_disk_settings">Video cache on disk</string>
@ -393,6 +394,8 @@
CloudStream 3 at your own risk. CloudStream 3 at your own risk.
</string> </string>
<string name="general">General</string> <string name="general">General</string>
<string name="random_button_settings">Random Button</string>
<string name="random_button_settings_desc">Show random button on Homepage</string>
<string name="provider_lang_settings">Provider Languages</string> <string name="provider_lang_settings">Provider Languages</string>
<string name="app_layout">App Layout</string> <string name="app_layout">App Layout</string>
<string name="preferred_media_settings">Preferred Media</string> <string name="preferred_media_settings">Preferred Media</string>
@ -467,6 +470,7 @@
<string name="actor_background">Background</string> <string name="actor_background">Background</string>
<string name="home_source">Source</string> <string name="home_source">Source</string>
<string name="home_random">Random</string>
<string name="coming_soon">Coming soon…</string> <string name="coming_soon">Coming soon…</string>

View file

@ -111,6 +111,12 @@
android:key="general" android:key="general"
android:title="@string/general" android:title="@string/general"
app:isPreferenceVisible="true"> app:isPreferenceVisible="true">
<SwitchPreference
android:icon="@drawable/ic_baseline_play_arrow_24"
app:key="@string/random_button_key"
android:title="@string/random_button_settings"
android:summary="@string/random_button_settings_desc"
app:defaultValue="false" />
<Preference <Preference
android:icon="@drawable/ic_baseline_language_24" android:icon="@drawable/ic_baseline_language_24"
android:key="@string/provider_lang_key" android:key="@string/provider_lang_key"