feat: show random button on library (#855)
This commit is contained in:
parent
19b1a40cf8
commit
d71d3890b5
|
@ -20,11 +20,12 @@ import android.widget.Toast
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
import androidx.appcompat.widget.SearchView
|
import androidx.appcompat.widget.SearchView
|
||||||
import androidx.core.view.allViews
|
import androidx.core.view.allViews
|
||||||
|
import androidx.core.view.isGone
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
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.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import androidx.viewpager2.widget.ViewPager2
|
|
||||||
import com.google.android.material.tabs.TabLayout
|
import com.google.android.material.tabs.TabLayout
|
||||||
import com.google.android.material.tabs.TabLayoutMediator
|
import com.google.android.material.tabs.TabLayoutMediator
|
||||||
import com.lagradost.cloudstream3.APIHolder
|
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.CommonActivity
|
||||||
import com.lagradost.cloudstream3.MainActivity
|
import com.lagradost.cloudstream3.MainActivity
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
|
import com.lagradost.cloudstream3.SearchResponse
|
||||||
import com.lagradost.cloudstream3.databinding.FragmentLibraryBinding
|
import com.lagradost.cloudstream3.databinding.FragmentLibraryBinding
|
||||||
import com.lagradost.cloudstream3.mvvm.Resource
|
import com.lagradost.cloudstream3.mvvm.Resource
|
||||||
import com.lagradost.cloudstream3.mvvm.debugAssert
|
import com.lagradost.cloudstream3.mvvm.debugAssert
|
||||||
|
@ -80,6 +82,8 @@ data class ProviderLibraryData(
|
||||||
|
|
||||||
class LibraryFragment : Fragment() {
|
class LibraryFragment : Fragment() {
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
val listLibraryItems = mutableListOf<SyncAPI.LibraryItem>()
|
||||||
fun newInstance() = LibraryFragment()
|
fun newInstance() = LibraryFragment()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -91,6 +95,7 @@ class LibraryFragment : Fragment() {
|
||||||
private val libraryViewModel: LibraryViewModel by activityViewModels()
|
private val libraryViewModel: LibraryViewModel by activityViewModels()
|
||||||
|
|
||||||
var binding: FragmentLibraryBinding? = null
|
var binding: FragmentLibraryBinding? = null
|
||||||
|
private var toggleRandomButton = false
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
|
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
|
* Shows a plugin selection dialogue and saves the response
|
||||||
|
@ -277,8 +301,10 @@ class LibraryFragment : Fragment() {
|
||||||
{ isScrollingDown: Boolean ->
|
{ isScrollingDown: Boolean ->
|
||||||
if (isScrollingDown) {
|
if (isScrollingDown) {
|
||||||
binding?.sortFab?.shrink()
|
binding?.sortFab?.shrink()
|
||||||
|
binding?.libraryRandom?.shrink()
|
||||||
} else {
|
} else {
|
||||||
binding?.sortFab?.extend()
|
binding?.sortFab?.extend()
|
||||||
|
binding?.libraryRandom?.extend()
|
||||||
}
|
}
|
||||||
}) callback@{ searchClickCallback ->
|
}) callback@{ searchClickCallback ->
|
||||||
// To prevent future accidents
|
// To prevent future accidents
|
||||||
|
@ -303,52 +329,7 @@ class LibraryFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
SEARCH_ACTION_LOAD -> {
|
SEARCH_ACTION_LOAD -> {
|
||||||
// This basically first selects the individual opener and if that is default then
|
loadLibraryItem(syncName, syncId, searchClickCallback.card)
|
||||||
// selects the whole list opener
|
|
||||||
val savedListSelection =
|
|
||||||
getKey<LibraryOpener>("$currentAccount/$LIBRARY_FOLDER", syncName.name)
|
|
||||||
val savedSelection = getKey<LibraryOpener>(
|
|
||||||
"$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
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -414,6 +395,16 @@ class LibraryFragment : Fragment() {
|
||||||
binding?.viewpager?.setCurrentItem(page, false)
|
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
|
// Only stop loading after 300ms to hide the fade effect the viewpager produces when updating
|
||||||
// Without this there would be a flashing effect:
|
// Without this there would be a flashing effect:
|
||||||
// loading -> show old viewpager -> black screen -> show new viewpager
|
// 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<LibraryOpener>("$currentAccount/$LIBRARY_FOLDER", syncName.name)
|
||||||
|
|
||||||
|
val savedSelection = getKey<LibraryOpener>(
|
||||||
|
"$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) {
|
override fun onConfigurationChanged(newConfig: Configuration) {
|
||||||
(binding?.viewpager?.adapter as? ViewpagerAdapter)?.rebind()
|
(binding?.viewpager?.adapter as? ViewpagerAdapter)?.rebind()
|
||||||
super.onConfigurationChanged(newConfig)
|
super.onConfigurationChanged(newConfig)
|
||||||
|
|
|
@ -159,6 +159,16 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_marginBottom="40dp">
|
android:layout_marginBottom="40dp">
|
||||||
|
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
||||||
|
android:id="@+id/library_random"
|
||||||
|
style="@style/ExtendedFloatingActionButton"
|
||||||
|
android:layout_gravity="bottom|start"
|
||||||
|
android:text="@string/home_random"
|
||||||
|
android:textColor="?attr/textColor"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:icon="@drawable/ic_baseline_play_arrow_24"
|
||||||
|
tools:ignore="ContentDescription"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
||||||
android:id="@+id/sort_fab"
|
android:id="@+id/sort_fab"
|
||||||
|
|
|
@ -435,7 +435,7 @@
|
||||||
<string name="pref_category_ui_features">Features</string>
|
<string name="pref_category_ui_features">Features</string>
|
||||||
<string name="category_general">General</string>
|
<string name="category_general">General</string>
|
||||||
<string name="random_button_settings">Random Button</string>
|
<string name="random_button_settings">Random Button</string>
|
||||||
<string name="random_button_settings_desc">Show random button on Homepage</string>
|
<string name="random_button_settings_desc">Show random button on Homepage and Library</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>
|
||||||
|
|
Loading…
Reference in New Issue