mirror of
				https://github.com/recloudstream/cloudstream.git
				synced 2024-08-15 01:53:11 +00:00 
			
		
		
		
	[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:
		
							parent
							
								
									83d8e2bb4d
								
							
						
					
					
						commit
						9fb4b74b79
					
				
					 8 changed files with 69 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -15,6 +15,7 @@ import androidx.core.view.isVisible
 | 
			
		|||
import androidx.core.widget.NestedScrollView
 | 
			
		||||
import androidx.fragment.app.Fragment
 | 
			
		||||
import androidx.fragment.app.activityViewModels
 | 
			
		||||
import androidx.preference.PreferenceManager
 | 
			
		||||
import androidx.recyclerview.widget.GridLayoutManager
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import androidx.recyclerview.widget.LinearSnapHelper
 | 
			
		||||
| 
						 | 
				
			
			@ -97,6 +98,7 @@ class HomeFragment : Fragment() {
 | 
			
		|||
    companion object {
 | 
			
		||||
        val configEvent = Event<Int>()
 | 
			
		||||
        var currentSpan = 1
 | 
			
		||||
        val listHomepageItems = mutableListOf<SearchResponse>()
 | 
			
		||||
 | 
			
		||||
        fun Activity.loadHomepageList(item: HomePageList) {
 | 
			
		||||
            val context = this
 | 
			
		||||
| 
						 | 
				
			
			@ -358,6 +360,7 @@ class HomeFragment : Fragment() {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    private var currentApiName: String? = null
 | 
			
		||||
    private var toggleRandomButton = false
 | 
			
		||||
 | 
			
		||||
    @SuppressLint("SetTextI18n")
 | 
			
		||||
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
 | 
			
		||||
| 
						 | 
				
			
			@ -367,6 +370,21 @@ class HomeFragment : Fragment() {
 | 
			
		|||
        home_change_api?.setOnClickListener(apiChangeClickListener)
 | 
			
		||||
        home_change_api_loading?.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 ->
 | 
			
		||||
            currentApiName = apiName
 | 
			
		||||
| 
						 | 
				
			
			@ -441,11 +459,13 @@ class HomeFragment : Fragment() {
 | 
			
		|||
                    home_loading_shimmer?.stopShimmer()
 | 
			
		||||
 | 
			
		||||
                    val d = data.value
 | 
			
		||||
                    listHomepageItems.clear()
 | 
			
		||||
 | 
			
		||||
                    currentHomePage = d
 | 
			
		||||
                    (home_master_recycler?.adapter as? ParentItemAdapter?)?.updateList(
 | 
			
		||||
                        d?.items?.mapNotNull {
 | 
			
		||||
                            try {
 | 
			
		||||
                                listHomepageItems.addAll(it.list.filterSearchResponse())
 | 
			
		||||
                                HomePageList(it.name, it.list.filterSearchResponse())
 | 
			
		||||
                            } catch (e: Exception) {
 | 
			
		||||
                                logError(e)
 | 
			
		||||
| 
						 | 
				
			
			@ -456,6 +476,9 @@ class HomeFragment : Fragment() {
 | 
			
		|||
                    home_loading?.isVisible = false
 | 
			
		||||
                    home_loading_error?.isVisible = false
 | 
			
		||||
                    home_loaded?.isVisible = true
 | 
			
		||||
                    if (toggleRandomButton) {
 | 
			
		||||
                        home_random?.isVisible = listHomepageItems.isNotEmpty()
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                is Resource.Failure -> {
 | 
			
		||||
                    home_loading_shimmer?.stopShimmer()
 | 
			
		||||
| 
						 | 
				
			
			@ -791,9 +814,11 @@ class HomeFragment : Fragment() {
 | 
			
		|||
            val dy = scrollY - oldScrollY
 | 
			
		||||
            if (dy > 0) { //check for scroll down
 | 
			
		||||
                home_api_fab?.shrink() // hide
 | 
			
		||||
                home_random?.shrink()
 | 
			
		||||
            } else if (dy < -5) {
 | 
			
		||||
                if (view?.context?.isTvSettings() == false) {
 | 
			
		||||
                    home_api_fab?.extend() // show
 | 
			
		||||
                    home_random?.extend()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -499,13 +499,21 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
 | 
			
		|||
 | 
			
		||||
    private fun updateUIVisibility() {
 | 
			
		||||
        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_video_bar?.isGone = isGone
 | 
			
		||||
        player_pause_play_holder?.isGone = isGone
 | 
			
		||||
        player_pause_play?.isGone = isGone
 | 
			
		||||
        //player_buffering?.isGone = isGone
 | 
			
		||||
        player_top_holder?.isGone = isGone
 | 
			
		||||
        player_video_title?.isGone = isGone
 | 
			
		||||
        player_video_title?.isGone = togglePlayerTitleGone
 | 
			
		||||
        player_video_title_rez?.isGone = isGone
 | 
			
		||||
        player_episode_filler?.isGone = isGone
 | 
			
		||||
        player_center_menu?.isGone = isGone
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -569,11 +569,17 @@ class GeneratorPlayer : FullScreenPlayer() {
 | 
			
		|||
        } else {
 | 
			
		||||
            ""
 | 
			
		||||
        }
 | 
			
		||||
        //Truncate video title if it exceeds limit
 | 
			
		||||
        val differenceInLength = playerVideoTitle.length - limitTitle
 | 
			
		||||
        val margin = 3 //If the difference is smaller than or equal to this value, ignore it
 | 
			
		||||
        if (limitTitle > 0 && differenceInLength > margin) {
 | 
			
		||||
            playerVideoTitle = playerVideoTitle.substring(0, limitTitle - 1) + "..."
 | 
			
		||||
 | 
			
		||||
        //Hide title, if set in setting
 | 
			
		||||
        if (limitTitle < 0) {
 | 
			
		||||
            player_video_title?.visibility = View.GONE
 | 
			
		||||
        } else {
 | 
			
		||||
            //Truncate video title if it exceeds limit
 | 
			
		||||
            val differenceInLength = playerVideoTitle.length - limitTitle
 | 
			
		||||
            val margin = 3 //If the difference is smaller than or equal to this value, ignore it
 | 
			
		||||
            if (limitTitle > 0 && differenceInLength > margin) {
 | 
			
		||||
                playerVideoTitle = playerVideoTitle.substring(0, limitTitle-1) + "..."
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        player_episode_filler_holder?.isVisible = isFiller ?: false
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -512,4 +512,14 @@
 | 
			
		|||
            style="@style/ExtendedFloatingActionButton"
 | 
			
		||||
            android:textColor="?attr/textColor"
 | 
			
		||||
            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>
 | 
			
		||||
| 
						 | 
				
			
			@ -133,6 +133,7 @@
 | 
			
		|||
                    android:gravity="center"
 | 
			
		||||
                    android:textColor="@color/white"
 | 
			
		||||
                    android:textStyle="bold"
 | 
			
		||||
                    android:visibility="visible"
 | 
			
		||||
                    app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                    app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
                    tools:text="Hello world" />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,6 +65,7 @@
 | 
			
		|||
        <item>32 characters</item>
 | 
			
		||||
        <item>64 characters</item>
 | 
			
		||||
        <item>128 characters</item>
 | 
			
		||||
        <item>Hide Title</item>
 | 
			
		||||
    </array>
 | 
			
		||||
    <array name="limit_title_pref_values">
 | 
			
		||||
        <item>0</item>
 | 
			
		||||
| 
						 | 
				
			
			@ -72,6 +73,7 @@
 | 
			
		|||
        <item>32</item>
 | 
			
		||||
        <item>64</item>
 | 
			
		||||
        <item>128</item>
 | 
			
		||||
        <item>-1</item>
 | 
			
		||||
    </array>
 | 
			
		||||
 | 
			
		||||
    <array name="video_buffer_length_names">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,7 @@
 | 
			
		|||
    <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="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="dns_key" translatable="false">dns_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="update">Update</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_length_settings">Video buffer length</string>
 | 
			
		||||
    <string name="video_buffer_disk_settings">Video cache on disk</string>
 | 
			
		||||
| 
						 | 
				
			
			@ -393,6 +394,8 @@
 | 
			
		|||
        CloudStream 3 at your own risk.
 | 
			
		||||
    </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="app_layout">App Layout</string>
 | 
			
		||||
    <string name="preferred_media_settings">Preferred Media</string>
 | 
			
		||||
| 
						 | 
				
			
			@ -467,6 +470,7 @@
 | 
			
		|||
    <string name="actor_background">Background</string>
 | 
			
		||||
 | 
			
		||||
    <string name="home_source">Source</string>
 | 
			
		||||
    <string name="home_random">Random</string>
 | 
			
		||||
 | 
			
		||||
    <string name="coming_soon">Coming soon…</string>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -111,6 +111,12 @@
 | 
			
		|||
            android:key="general"
 | 
			
		||||
            android:title="@string/general"
 | 
			
		||||
            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
 | 
			
		||||
                android:icon="@drawable/ic_baseline_language_24"
 | 
			
		||||
                android:key="@string/provider_lang_key"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue