From d71d3890b52cd745ecb5b556323e09e05155b356 Mon Sep 17 00:00:00 2001 From: coxju <118901131+coxju@users.noreply.github.com> Date: Thu, 11 Jan 2024 02:58:06 +0530 Subject: [PATCH] feat: show random button on library (#855) --- .../ui/library/LibraryFragment.kt | 141 ++++++++++++------ app/src/main/res/layout/fragment_library.xml | 10 ++ app/src/main/res/values/strings.xml | 2 +- 3 files changed, 105 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/library/LibraryFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/library/LibraryFragment.kt index a37fbcb3..8e9c8521 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/library/LibraryFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/library/LibraryFragment.kt @@ -20,11 +20,12 @@ import android.widget.Toast import androidx.annotation.StringRes import androidx.appcompat.widget.SearchView import androidx.core.view.allViews +import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.RecyclerView -import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import com.lagradost.cloudstream3.APIHolder @@ -35,6 +36,7 @@ import com.lagradost.cloudstream3.AcraApplication.Companion.setKey import com.lagradost.cloudstream3.CommonActivity import com.lagradost.cloudstream3.MainActivity import com.lagradost.cloudstream3.R +import com.lagradost.cloudstream3.SearchResponse import com.lagradost.cloudstream3.databinding.FragmentLibraryBinding import com.lagradost.cloudstream3.mvvm.Resource import com.lagradost.cloudstream3.mvvm.debugAssert @@ -80,6 +82,8 @@ data class ProviderLibraryData( class LibraryFragment : Fragment() { companion object { + + val listLibraryItems = mutableListOf() fun newInstance() = LibraryFragment() /** @@ -91,6 +95,7 @@ class LibraryFragment : Fragment() { private val libraryViewModel: LibraryViewModel by activityViewModels() var binding: FragmentLibraryBinding? = null + private var toggleRandomButton = false override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -196,6 +201,25 @@ class LibraryFragment : Fragment() { } } + //Load value for toggling Random button. Hide at startup + context?.let { + val settingsManager = PreferenceManager.getDefaultSharedPreferences(it) + toggleRandomButton = + settingsManager.getBoolean( + getString(R.string.random_button_key), + false + ) && !SettingsFragment.isTvSettings() + binding?.libraryRandom?.visibility = View.GONE + } + + binding?.libraryRandom?.setOnClickListener { + if (listLibraryItems.isNotEmpty()) { + val listLibraryItem = listLibraryItems.random() + libraryViewModel.currentSyncApi?.syncIdName?.let { + loadLibraryItem(it, listLibraryItem.syncId,listLibraryItem) + } + } + } /** * Shows a plugin selection dialogue and saves the response @@ -277,8 +301,10 @@ class LibraryFragment : Fragment() { { isScrollingDown: Boolean -> if (isScrollingDown) { binding?.sortFab?.shrink() + binding?.libraryRandom?.shrink() } else { binding?.sortFab?.extend() + binding?.libraryRandom?.extend() } }) callback@{ searchClickCallback -> // To prevent future accidents @@ -303,52 +329,7 @@ class LibraryFragment : Fragment() { } SEARCH_ACTION_LOAD -> { - // This basically first selects the individual opener and if that is default then - // selects the whole list opener - val savedListSelection = - getKey("$currentAccount/$LIBRARY_FOLDER", syncName.name) - val savedSelection = getKey( - "$currentAccount/$LIBRARY_FOLDER", - syncId - ).takeIf { - it?.openType != LibraryOpenerType.Default - } ?: savedListSelection - - when (savedSelection?.openType) { - null, LibraryOpenerType.Default -> { - // Prevents opening MAL/AniList as a provider - if (APIHolder.getApiFromNameNull(searchClickCallback.card.apiName) != null) { - activity?.loadSearchResult( - searchClickCallback.card - ) - } else { - // Search when no provider can open - QuickSearchFragment.pushSearch( - activity, - searchClickCallback.card.name - ) - } - } - - LibraryOpenerType.None -> {} - LibraryOpenerType.Provider -> - savedSelection.providerData?.apiName?.let { apiName -> - activity?.loadResult( - searchClickCallback.card.url, - apiName, - ) - } - - LibraryOpenerType.Browser -> - openBrowser(searchClickCallback.card.url) - - LibraryOpenerType.Search -> { - QuickSearchFragment.pushSearch( - activity, - searchClickCallback.card.name - ) - } - } + loadLibraryItem(syncName, syncId, searchClickCallback.card) } } } @@ -414,6 +395,16 @@ class LibraryFragment : Fragment() { binding?.viewpager?.setCurrentItem(page, false) } + observe(libraryViewModel.currentPage){ + if (toggleRandomButton) { + listLibraryItems.clear() + listLibraryItems.addAll(pages[it].items) + libraryRandom.isVisible = listLibraryItems.isNotEmpty() + } else { + libraryRandom.isGone = true + } + } + // Only stop loading after 300ms to hide the fade effect the viewpager produces when updating // Without this there would be a flashing effect: // loading -> show old viewpager -> black screen -> show new viewpager @@ -512,6 +503,62 @@ class LibraryFragment : Fragment() { } })*/ } + + private fun loadLibraryItem( + syncName: SyncIdName, + syncId: String, + card: SearchResponse + ) { + // This basically first selects the individual opener and if that is default then + // selects the whole list opener + val savedListSelection = + getKey("$currentAccount/$LIBRARY_FOLDER", syncName.name) + + val savedSelection = getKey( + "$currentAccount/$LIBRARY_FOLDER", + syncId + ).takeIf { + it?.openType != LibraryOpenerType.Default + } ?: savedListSelection + + when (savedSelection?.openType) { + null, LibraryOpenerType.Default -> { + // Prevents opening MAL/AniList as a provider + if (APIHolder.getApiFromNameNull(card.apiName) != null) { + activity?.loadSearchResult( + card + ) + } else { + // Search when no provider can open + QuickSearchFragment.pushSearch( + activity, + card.name + ) + } + } + + LibraryOpenerType.None -> {} + LibraryOpenerType.Provider -> + savedSelection.providerData?.apiName?.let { apiName -> + activity?.loadResult( + card.url, + apiName, + ) + } + + LibraryOpenerType.Browser -> + openBrowser(card.url) + + LibraryOpenerType.Search -> { + QuickSearchFragment.pushSearch( + activity, + card.name + ) + } + } + + } + override fun onConfigurationChanged(newConfig: Configuration) { (binding?.viewpager?.adapter as? ViewpagerAdapter)?.rebind() super.onConfigurationChanged(newConfig) diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index 446c2a81..d49e3d1e 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -159,6 +159,16 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="40dp"> + Features General Random Button - Show random button on Homepage + Show random button on Homepage and Library Provider languages App Layout Preferred media