more viewbindings + result fix + more tests

This commit is contained in:
LagradOst 2023-07-15 20:00:09 +02:00
parent c946115900
commit f209c7286e
12 changed files with 214 additions and 140 deletions

View file

@ -12,8 +12,14 @@ import com.lagradost.cloudstream3.databinding.FragmentHomeTvBinding
import com.lagradost.cloudstream3.databinding.FragmentSearchBinding import com.lagradost.cloudstream3.databinding.FragmentSearchBinding
import com.lagradost.cloudstream3.databinding.FragmentSearchTvBinding import com.lagradost.cloudstream3.databinding.FragmentSearchTvBinding
import com.lagradost.cloudstream3.databinding.HomeResultGridBinding import com.lagradost.cloudstream3.databinding.HomeResultGridBinding
import com.lagradost.cloudstream3.databinding.HomeScrollViewBinding
import com.lagradost.cloudstream3.databinding.HomeScrollViewTvBinding
import com.lagradost.cloudstream3.databinding.HomepageParentBinding
import com.lagradost.cloudstream3.databinding.HomepageParentTvBinding
import com.lagradost.cloudstream3.databinding.RepositoryItemBinding import com.lagradost.cloudstream3.databinding.RepositoryItemBinding
import com.lagradost.cloudstream3.databinding.RepositoryItemTvBinding import com.lagradost.cloudstream3.databinding.RepositoryItemTvBinding
import com.lagradost.cloudstream3.databinding.SearchResultGridBinding
import com.lagradost.cloudstream3.databinding.SearchResultGridExpandedBinding
import com.lagradost.cloudstream3.utils.SubtitleHelper import com.lagradost.cloudstream3.utils.SubtitleHelper
import com.lagradost.cloudstream3.utils.TestingUtils import com.lagradost.cloudstream3.utils.TestingUtils
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@ -85,6 +91,17 @@ class ExampleInstrumentedTest {
testAllLayouts<HomeResultGridBinding>(activity, R.layout.home_result_grid_expanded, R.layout.home_result_grid) testAllLayouts<HomeResultGridBinding>(activity, R.layout.home_result_grid_expanded, R.layout.home_result_grid)
//testAllLayouts<HomeResultGridExpandedBinding>(activity, R.layout.home_result_grid_expanded, R.layout.home_result_grid) ??? fails ??? //testAllLayouts<HomeResultGridExpandedBinding>(activity, R.layout.home_result_grid_expanded, R.layout.home_result_grid) ??? fails ???
testAllLayouts<SearchResultGridExpandedBinding>(activity, R.layout.search_result_grid, R.layout.search_result_grid_expanded)
testAllLayouts<SearchResultGridBinding>(activity, R.layout.search_result_grid, R.layout.search_result_grid_expanded)
// testAllLayouts<HomeScrollViewBinding>(activity, R.layout.home_scroll_view, R.layout.home_scroll_view_tv)
// testAllLayouts<HomeScrollViewTvBinding>(activity, R.layout.home_scroll_view, R.layout.home_scroll_view_tv)
testAllLayouts<HomepageParentTvBinding>(activity, R.layout.homepage_parent_tv, R.layout.homepage_parent)
testAllLayouts<HomepageParentBinding>(activity, R.layout.homepage_parent_tv, R.layout.homepage_parent)
} }
} }
} }

View file

@ -1,22 +1,20 @@
package com.lagradost.cloudstream3.ui.home package com.lagradost.cloudstream3.ui.home
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.SearchResponse import com.lagradost.cloudstream3.SearchResponse
import com.lagradost.cloudstream3.databinding.HomeResultGridBinding
import com.lagradost.cloudstream3.ui.search.SearchClickCallback import com.lagradost.cloudstream3.ui.search.SearchClickCallback
import com.lagradost.cloudstream3.ui.search.SearchResultBuilder import com.lagradost.cloudstream3.ui.search.SearchResultBuilder
import com.lagradost.cloudstream3.utils.UIHelper.IsBottomLayout import com.lagradost.cloudstream3.utils.UIHelper.IsBottomLayout
import com.lagradost.cloudstream3.utils.UIHelper.toPx import com.lagradost.cloudstream3.utils.UIHelper.toPx
import kotlinx.android.synthetic.main.home_result_grid.view.background_card
import kotlinx.android.synthetic.main.home_result_grid_expanded.view.*
class HomeChildItemAdapter( class HomeChildItemAdapter(
val cardList: MutableList<SearchResponse>, val cardList: MutableList<SearchResponse>,
private val overrideLayout: Int? = null,
private val nextFocusUp: Int? = null, private val nextFocusUp: Int? = null,
private val nextFocusDown: Int? = null, private val nextFocusDown: Int? = null,
private val clickCallback: (SearchClickCallback) -> Unit, private val clickCallback: (SearchClickCallback) -> Unit,
@ -26,11 +24,13 @@ class HomeChildItemAdapter(
var hasNext: Boolean = false var hasNext: Boolean = false
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val layout = overrideLayout val layout = if (parent.context.IsBottomLayout()) R.layout.home_result_grid_expanded else R.layout.home_result_grid
?: if (parent.context.IsBottomLayout()) R.layout.home_result_grid_expanded else R.layout.home_result_grid
val root = LayoutInflater.from(parent.context).inflate(layout, parent, false)
val binding = HomeResultGridBinding.bind(root)
return CardViewHolder( return CardViewHolder(
LayoutInflater.from(parent.context).inflate(layout, parent, false), binding,
clickCallback, clickCallback,
itemCount, itemCount,
nextFocusUp, nextFocusUp,
@ -69,14 +69,14 @@ class HomeChildItemAdapter(
class CardViewHolder class CardViewHolder
constructor( constructor(
itemView: View, val binding: HomeResultGridBinding,
private val clickCallback: (SearchClickCallback) -> Unit, private val clickCallback: (SearchClickCallback) -> Unit,
var itemCount: Int, var itemCount: Int,
private val nextFocusUp: Int? = null, private val nextFocusUp: Int? = null,
private val nextFocusDown: Int? = null, private val nextFocusDown: Int? = null,
private val isHorizontal: Boolean = false private val isHorizontal: Boolean = false
) : ) :
RecyclerView.ViewHolder(itemView) { RecyclerView.ViewHolder(binding.root) {
fun bind(card: SearchResponse, position: Int) { fun bind(card: SearchResponse, position: Int) {
@ -87,7 +87,7 @@ class HomeChildItemAdapter(
else -> null else -> null
} }
(itemView.background_card)?.apply { binding.backgroundCard.apply {
val min = 114.toPx val min = 114.toPx
val max = 180.toPx val max = 180.toPx
@ -119,7 +119,7 @@ class HomeChildItemAdapter(
itemView.tag = position itemView.tag = position
if (position == 0) { // to fix tv if (position == 0) { // to fix tv
itemView.background_card?.nextFocusLeftId = R.id.nav_rail_view binding.backgroundCard.nextFocusLeftId = R.id.nav_rail_view
} }
//val ani = ScaleAnimation(0.9f, 1.0f, 0.9f, 1f) //val ani = ScaleAnimation(0.9f, 1.0f, 0.9f, 1f)
//ani.fillAfter = true //ani.fillAfter = true

View file

@ -10,18 +10,12 @@ import androidx.recyclerview.widget.RecyclerView
import com.lagradost.cloudstream3.HomePageList import com.lagradost.cloudstream3.HomePageList
import com.lagradost.cloudstream3.LoadResponse import com.lagradost.cloudstream3.LoadResponse
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.databinding.HomepageParentBinding
import com.lagradost.cloudstream3.ui.result.setLinearListLayout import com.lagradost.cloudstream3.ui.result.setLinearListLayout
import com.lagradost.cloudstream3.ui.search.SearchClickCallback import com.lagradost.cloudstream3.ui.search.SearchClickCallback
import com.lagradost.cloudstream3.ui.search.SearchFragment.Companion.filterSearchResponse import com.lagradost.cloudstream3.ui.search.SearchFragment.Companion.filterSearchResponse
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.utils.AppUtils.isRecyclerScrollable import com.lagradost.cloudstream3.utils.AppUtils.isRecyclerScrollable
import kotlinx.android.synthetic.main.activity_main_tv.*
import kotlinx.android.synthetic.main.activity_main_tv.view.*
import kotlinx.android.synthetic.main.fragment_home.*
import kotlinx.android.synthetic.main.fragment_home.view.*
import kotlinx.android.synthetic.main.fragment_home_head_tv.*
import kotlinx.android.synthetic.main.fragment_home_head_tv.view.*
import kotlinx.android.synthetic.main.homepage_parent.view.*
class LoadClickCallback( class LoadClickCallback(
val action: Int = 0, val action: Int = 0,
@ -37,12 +31,17 @@ open class ParentItemAdapter(
private val expandCallback: ((String) -> Unit)? = null, private val expandCallback: ((String) -> Unit)? = null,
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val root = LayoutInflater.from(parent.context).inflate(
if (isTvSettings()) R.layout.homepage_parent_tv else R.layout.homepage_parent,
parent,
false
)
val binding = HomepageParentBinding.bind(root)
return ParentViewHolder( return ParentViewHolder(
LayoutInflater.from(parent.context).inflate( binding,
if (isTvSettings()) R.layout.homepage_parent_tv else R.layout.homepage_parent,
parent,
false
),
clickCallback, clickCallback,
moreInfoClickCallback, moreInfoClickCallback,
expandCallback expandCallback
@ -153,14 +152,14 @@ open class ParentItemAdapter(
class ParentViewHolder class ParentViewHolder
constructor( constructor(
itemView: View, val binding: HomepageParentBinding,
private val clickCallback: (SearchClickCallback) -> Unit, private val clickCallback: (SearchClickCallback) -> Unit,
private val moreInfoClickCallback: (HomeViewModel.ExpandableHomepageList) -> Unit, private val moreInfoClickCallback: (HomeViewModel.ExpandableHomepageList) -> Unit,
private val expandCallback: ((String) -> Unit)? = null, private val expandCallback: ((String) -> Unit)? = null,
) : ) :
RecyclerView.ViewHolder(itemView) { RecyclerView.ViewHolder(binding.root) {
val title: TextView = itemView.home_child_more_info val title: TextView = binding.homeChildMoreInfo
private val recyclerView: RecyclerView = itemView.home_child_recyclerview private val recyclerView: RecyclerView = binding.homeChildRecyclerview
fun update(expand: HomeViewModel.ExpandableHomepageList) { fun update(expand: HomeViewModel.ExpandableHomepageList) {
val info = expand.list val info = expand.list

View file

@ -409,10 +409,7 @@ class HomeParentItemAdapterPreview(
// setPageTransformer(null) // setPageTransformer(null)
if (adapter == null) if (adapter == null)
adapter = HomeScrollAdapter( adapter = HomeScrollAdapter()
if (isTvSettings()) R.layout.home_scroll_view_tv else R.layout.home_scroll_view,
if (isTvSettings()) true else null
)
} }
previewAdapter = previewViewpager?.adapter as? HomeScrollAdapter? previewAdapter = previewViewpager?.adapter as? HomeScrollAdapter?
// previewViewpager?.registerOnPageChangeCallback(previewCallback) // previewViewpager?.registerOnPageChangeCallback(previewCallback)

View file

@ -2,24 +2,18 @@ package com.lagradost.cloudstream3.ui.home
import android.content.res.Configuration import android.content.res.Configuration
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
import com.lagradost.cloudstream3.LoadResponse import com.lagradost.cloudstream3.LoadResponse
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.databinding.HomeScrollViewBinding
import com.lagradost.cloudstream3.databinding.HomeScrollViewTvBinding
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.utils.UIHelper.setImage import com.lagradost.cloudstream3.utils.UIHelper.setImage
import kotlinx.android.synthetic.main.home_scroll_view.view.home_scroll_preview
import kotlinx.android.synthetic.main.home_scroll_view.view.home_scroll_preview_tags
import kotlinx.android.synthetic.main.home_scroll_view.view.home_scroll_preview_title
class HomeScrollAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
class HomeScrollAdapter(
@LayoutRes val layout: Int = R.layout.home_scroll_view,
private val forceHorizontalPosters: Boolean? = null
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var items: MutableList<LoadResponse> = mutableListOf() private var items: MutableList<LoadResponse> = mutableListOf()
var hasMoreItems: Boolean = false var hasMoreItems: Boolean = false
@ -45,9 +39,16 @@ class HomeScrollAdapter(
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)
val binding = if(isTvSettings()) {
HomeScrollViewBinding.inflate(inflater,parent,false)
} else {
HomeScrollViewTvBinding.inflate(inflater,parent,false)
}
return CardViewHolder( return CardViewHolder(
LayoutInflater.from(parent.context).inflate(layout, parent, false), binding,
forceHorizontalPosters //forceHorizontalPosters
) )
} }
@ -61,22 +62,30 @@ class HomeScrollAdapter(
class CardViewHolder class CardViewHolder
constructor( constructor(
itemView: View, val binding: ViewBinding,
private val forceHorizontalPosters: Boolean? = null //private val forceHorizontalPosters: Boolean? = null
) : ) :
RecyclerView.ViewHolder(itemView) { RecyclerView.ViewHolder(binding.root) {
fun bind(card: LoadResponse) { fun bind(card: LoadResponse) {
card.apply { val isHorizontal =
val isHorizontal = binding is HomeScrollViewTvBinding || itemView.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
(forceHorizontalPosters == true) || ((forceHorizontalPosters != false) && itemView.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE)
val posterUrl = if (isHorizontal) backgroundPosterUrl ?: posterUrl else posterUrl val posterUrl = if (isHorizontal) card.backgroundPosterUrl ?: card.posterUrl else card.posterUrl
?: backgroundPosterUrl ?: card.backgroundPosterUrl
itemView.home_scroll_preview_tags?.text = tags?.joinToString("") ?: ""
itemView.home_scroll_preview_tags?.isGone = tags.isNullOrEmpty() when(binding) {
itemView.home_scroll_preview?.setImage(posterUrl, posterHeaders) is HomeScrollViewBinding -> {
itemView.home_scroll_preview_title?.text = name binding.homeScrollPreview.setImage(posterUrl)
binding.homeScrollPreviewTags.apply {
text = card.tags?.joinToString("") ?: ""
isGone = card.tags.isNullOrEmpty()
}
binding.homeScrollPreviewTitle.text = card.name
}
is HomeScrollViewTvBinding -> {
binding.homeScrollPreview.setImage(posterUrl)
}
} }
} }
} }

View file

@ -84,7 +84,7 @@ class PageAdapter(
binding.textRating.apply { binding.textRating.apply {
setTextColor(ColorStateList.valueOf(fg)) setTextColor(ColorStateList.valueOf(fg))
} }
binding.textRatingHolder.backgroundTintList = ColorStateList.valueOf(bg) binding.textRating.backgroundTintList = ColorStateList.valueOf(bg)
binding.watchProgress.apply { binding.watchProgress.apply {
progressTintList = ColorStateList.valueOf(fg) progressTintList = ColorStateList.valueOf(fg)
progressBackgroundTintList = ColorStateList.valueOf(bg) progressBackgroundTintList = ColorStateList.valueOf(bg)
@ -111,16 +111,6 @@ class PageAdapter(
} }
binding.imageText.text = item.name binding.imageText.text = item.name
val showRating = (item.personalRating ?: 0) != 0
binding.textRatingHolder.isVisible = showRating
if (showRating) {
// We want to show 8.5 but not 8.0 hence the replace
val rating = ((item.personalRating ?: 0).toDouble() / 10).toString()
.replace(".0", "")
binding.textRating.text = "$rating"
}
} }
} }
} }

View file

@ -64,7 +64,7 @@ class ViewpagerAdapter(
} }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY -> setOnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
val diff = scrollY - oldScrollY val diff = scrollY - oldScrollY
if (diff == 0) return@setOnScrollChangeListener if (diff == 0) return@setOnScrollChangeListener

View file

@ -16,22 +16,13 @@ import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.SearchQuality import com.lagradost.cloudstream3.SearchQuality
import com.lagradost.cloudstream3.SearchResponse import com.lagradost.cloudstream3.SearchResponse
import com.lagradost.cloudstream3.isMovieType import com.lagradost.cloudstream3.isMovieType
import com.lagradost.cloudstream3.syncproviders.SyncAPI
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
import com.lagradost.cloudstream3.utils.DataStoreHelper import com.lagradost.cloudstream3.utils.DataStoreHelper
import com.lagradost.cloudstream3.utils.DataStoreHelper.fixVisual import com.lagradost.cloudstream3.utils.DataStoreHelper.fixVisual
import com.lagradost.cloudstream3.utils.SubtitleHelper import com.lagradost.cloudstream3.utils.SubtitleHelper
import com.lagradost.cloudstream3.utils.UIHelper.setImage import com.lagradost.cloudstream3.utils.UIHelper.setImage
import kotlinx.android.synthetic.main.home_result_grid.view.background_card
import kotlinx.android.synthetic.main.home_result_grid.view.imageText
import kotlinx.android.synthetic.main.home_result_grid.view.imageView
import kotlinx.android.synthetic.main.home_result_grid.view.search_item_download_play
import kotlinx.android.synthetic.main.home_result_grid.view.text_flag
import kotlinx.android.synthetic.main.home_result_grid.view.text_is_dub
import kotlinx.android.synthetic.main.home_result_grid.view.text_is_sub
import kotlinx.android.synthetic.main.home_result_grid.view.text_quality
import kotlinx.android.synthetic.main.home_result_grid.view.title_shadow
import kotlinx.android.synthetic.main.home_result_grid.view.watchProgress
object SearchResultBuilder { object SearchResultBuilder {
private val showCache: MutableMap<String, Boolean> = mutableMapOf() private val showCache: MutableMap<String, Boolean> = mutableMapOf()
@ -59,19 +50,21 @@ object SearchResultBuilder {
nextFocusDown: Int? = null, nextFocusDown: Int? = null,
colorCallback : ((Palette) -> Unit)? = null colorCallback : ((Palette) -> Unit)? = null
) { ) {
val cardView: ImageView = itemView.imageView val cardView: ImageView = itemView.findViewById(R.id.imageView)
val cardText: TextView? = itemView.imageText val cardText: TextView? = itemView.findViewById(R.id.imageText)
val textIsDub: TextView? = itemView.text_is_dub val textIsDub: TextView? = itemView.findViewById(R.id.text_is_dub)
val textIsSub: TextView? = itemView.text_is_sub val textIsSub: TextView? = itemView.findViewById(R.id.text_is_sub)
val textFlag: TextView? = itemView.text_flag val textFlag: TextView? = itemView.findViewById(R.id.text_flag)
val textQuality: TextView? = itemView.text_quality val rating: TextView? = itemView.findViewById(R.id.text_rating)
val shadow: View? = itemView.title_shadow
val bg: CardView = itemView.background_card val textQuality: TextView? = itemView.findViewById(R.id.text_quality)
val shadow: View? = itemView.findViewById(R.id.title_shadow)
val bar: ProgressBar? = itemView.watchProgress val bg: CardView = itemView.findViewById(R.id.background_card)
val playImg: ImageView? = itemView.search_item_download_play
val bar: ProgressBar? = itemView.findViewById(R.id.watchProgress)
val playImg: ImageView? = itemView.findViewById(R.id.search_item_download_play)
// Do logic // Do logic
@ -80,12 +73,25 @@ object SearchResultBuilder {
textIsDub?.isVisible = false textIsDub?.isVisible = false
textIsSub?.isVisible = false textIsSub?.isVisible = false
textFlag?.isVisible = false textFlag?.isVisible = false
rating?.isVisible = false
val showSub = showCache[textIsDub?.context?.getString(R.string.show_sub_key)] ?: 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 showDub = showCache[textIsDub?.context?.getString(R.string.show_dub_key)] ?: false
val showTitle = showCache[cardText?.context?.getString(R.string.show_title_key)] ?: false val showTitle = showCache[cardText?.context?.getString(R.string.show_title_key)] ?: false
val showHd = showCache[textQuality?.context?.getString(R.string.show_hd_key)] ?: false val showHd = showCache[textQuality?.context?.getString(R.string.show_hd_key)] ?: false
if(card is SyncAPI.LibraryItem) {
val showRating = (card.personalRating ?: 0) != 0
rating?.isVisible = showRating
if (showRating) {
// We want to show 8.5 but not 8.0 hence the replace
val ratingText = ((card.personalRating ?: 0).toDouble() / 10).toString()
.replace(".0", "")
rating?.text = ratingText
}
}
shadow?.isVisible = showTitle shadow?.isVisible = showTitle
when (card.quality) { when (card.quality) {

View file

@ -2,19 +2,28 @@ package com.lagradost.cloudstream3.utils
import android.app.Activity import android.app.Activity
import android.app.Dialog import android.app.Dialog
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.* import android.widget.AbsListView
import android.widget.ArrayAdapter
import android.widget.EditText
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.ListView
import android.widget.TextView
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.view.* import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.marginLeft
import androidx.core.view.marginRight
import androidx.core.view.marginTop
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.databinding.BottomSelectionDialogBinding
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIconsAndNoStringRes import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIconsAndNoStringRes
import com.lagradost.cloudstream3.utils.UIHelper.setImage import com.lagradost.cloudstream3.utils.UIHelper.setImage
import kotlinx.android.synthetic.main.add_account_input.*
import kotlinx.android.synthetic.main.add_account_input.text1
import kotlinx.android.synthetic.main.bottom_selection_dialog_direct.*
object SingleSelectionHelper { object SingleSelectionHelper {
fun Activity?.showOptionSelectStringRes( fun Activity?.showOptionSelectStringRes(
@ -82,6 +91,7 @@ object SingleSelectionHelper {
} }
fun Activity?.showDialog( fun Activity?.showDialog(
binding: BottomSelectionDialogBinding,
dialog: Dialog, dialog: Dialog,
items: List<String>, items: List<String>,
selectedIndex: List<Int>, selectedIndex: List<Int>,
@ -95,39 +105,39 @@ object SingleSelectionHelper {
if (this == null) return if (this == null) return
val realShowApply = showApply || isMultiSelect val realShowApply = showApply || isMultiSelect
val listView = dialog.listview1//.findViewById<ListView>(R.id.listview1)!! val listView = binding.listview1//.findViewById<ListView>(R.id.listview1)!!
val textView = dialog.text1//.findViewById<TextView>(R.id.text1)!! val textView = binding.text1//.findViewById<TextView>(R.id.text1)!!
val applyButton = dialog.apply_btt//.findViewById<TextView>(R.id.apply_btt) val applyButton = binding.applyBtt//.findViewById<TextView>(R.id.apply_btt)
val cancelButton = dialog.cancel_btt//findViewById<TextView>(R.id.cancel_btt) val cancelButton = binding.cancelBtt//findViewById<TextView>(R.id.cancel_btt)
val applyHolder = val applyHolder =
dialog.apply_btt_holder//.findViewById<LinearLayout>(R.id.apply_btt_holder) binding.applyBttHolder//.findViewById<LinearLayout>(R.id.apply_btt_holder)
applyHolder?.isVisible = realShowApply applyHolder.isVisible = realShowApply
if (!realShowApply) { if (!realShowApply) {
val params = listView.layoutParams as LinearLayout.LayoutParams val params = listView.layoutParams as LinearLayout.LayoutParams
params.setMargins(listView.marginLeft, listView.marginTop, listView.marginRight, 0) params.setMargins(listView.marginLeft, listView.marginTop, listView.marginRight, 0)
listView.layoutParams = params listView.layoutParams = params
} }
textView?.text = name textView.text = name
textView?.isGone = name.isBlank() textView.isGone = name.isBlank()
val arrayAdapter = ArrayAdapter<String>(this, itemLayout) val arrayAdapter = ArrayAdapter<String>(this, itemLayout)
arrayAdapter.addAll(items) arrayAdapter.addAll(items)
listView?.adapter = arrayAdapter listView.adapter = arrayAdapter
if (isMultiSelect) { if (isMultiSelect) {
listView?.choiceMode = AbsListView.CHOICE_MODE_MULTIPLE listView.choiceMode = AbsListView.CHOICE_MODE_MULTIPLE
} else { } else {
listView?.choiceMode = AbsListView.CHOICE_MODE_SINGLE listView.choiceMode = AbsListView.CHOICE_MODE_SINGLE
} }
for (select in selectedIndex) { for (select in selectedIndex) {
listView?.setItemChecked(select, true) listView.setItemChecked(select, true)
} }
selectedIndex.minOrNull()?.let { selectedIndex.minOrNull()?.let {
listView?.setSelection(it) listView.setSelection(it)
} }
// var lastSelectedIndex = if(selectedIndex.isNotEmpty()) selectedIndex.first() else -1 // var lastSelectedIndex = if(selectedIndex.isNotEmpty()) selectedIndex.first() else -1
@ -136,7 +146,7 @@ object SingleSelectionHelper {
dismissCallback.invoke() dismissCallback.invoke()
} }
listView?.setOnItemClickListener { _, _, which, _ -> listView.setOnItemClickListener { _, _, which, _ ->
// lastSelectedIndex = which // lastSelectedIndex = which
if (realShowApply) { if (realShowApply) {
if (!isMultiSelect) { if (!isMultiSelect) {
@ -148,7 +158,7 @@ object SingleSelectionHelper {
} }
} }
if (realShowApply) { if (realShowApply) {
applyButton?.setOnClickListener { applyButton.setOnClickListener {
val list = ArrayList<Int>() val list = ArrayList<Int>()
for (index in 0 until listView.count) { for (index in 0 until listView.count) {
if (listView.checkedItemPositions[index]) if (listView.checkedItemPositions[index])
@ -157,7 +167,7 @@ object SingleSelectionHelper {
callback.invoke(list) callback.invoke(list)
dialog.dismissSafe(this) dialog.dismissSafe(this)
} }
cancelButton?.setOnClickListener { cancelButton.setOnClickListener {
dialog.dismissSafe(this) dialog.dismissSafe(this)
} }
} }
@ -213,13 +223,26 @@ object SingleSelectionHelper {
) { ) {
if (this == null) return if (this == null) return
val binding: BottomSelectionDialogBinding = BottomSelectionDialogBinding.inflate(
LayoutInflater.from(this)
)
val builder = val builder =
AlertDialog.Builder(this, R.style.AlertDialogCustom) AlertDialog.Builder(this, R.style.AlertDialogCustom)
.setView(R.layout.bottom_selection_dialog) .setView(binding.root)
val dialog = builder.create() val dialog = builder.create()
dialog.show() dialog.show()
showDialog(dialog, items, selectedIndex, name, true, true, callback, dismissCallback) showDialog(
binding,
dialog,
items,
selectedIndex,
name,
showApply = true,
isMultiSelect = true,
callback,
dismissCallback
)
} }
fun Activity?.showDialog( fun Activity?.showDialog(
@ -232,13 +255,19 @@ object SingleSelectionHelper {
) { ) {
if (this == null) return if (this == null) return
val binding: BottomSelectionDialogBinding = BottomSelectionDialogBinding.inflate(
LayoutInflater.from(this)
)
val builder = val builder =
AlertDialog.Builder(this, R.style.AlertDialogCustom) AlertDialog.Builder(this, R.style.AlertDialogCustom)
.setView(R.layout.bottom_selection_dialog) .setView(binding.root)
val dialog = builder.create() val dialog = builder.create()
dialog.show() dialog.show()
showDialog( showDialog(
binding,
dialog, dialog,
items, items,
listOf(selectedIndex), listOf(selectedIndex),
@ -260,12 +289,18 @@ object SingleSelectionHelper {
callback: (Int) -> Unit, callback: (Int) -> Unit,
) { ) {
if (this == null) return if (this == null) return
val binding: BottomSelectionDialogBinding = BottomSelectionDialogBinding.inflate(
LayoutInflater.from(this)
)
val builder = val builder =
BottomSheetDialog(this) BottomSheetDialog(this)
builder.setContentView(R.layout.bottom_selection_dialog) builder.setContentView(binding.root)
builder.show() builder.show()
showDialog( showDialog(
binding,
builder, builder,
items, items,
listOf(selectedIndex), listOf(selectedIndex),
@ -285,13 +320,19 @@ object SingleSelectionHelper {
): BottomSheetDialog { ): BottomSheetDialog {
val builder = val builder =
BottomSheetDialog(this) BottomSheetDialog(this)
builder.setContentView(R.layout.bottom_selection_dialog_direct)
val binding: BottomSelectionDialogBinding = BottomSelectionDialogBinding.inflate(
LayoutInflater.from(this)
)
//builder.setContentView(R.layout.bottom_selection_dialog_direct)
builder.setContentView(binding.root)
builder.show() builder.show()
showDialog( showDialog(
binding,
builder, builder,
items, items,
listOf(), emptyList(),
name, name,
showApply = false, showApply = false,
isMultiSelect = false, isMultiSelect = false,

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/search_result_root" android:id="@+id/search_result_root"
@ -75,6 +75,12 @@
style="@style/SubButton" style="@style/SubButton"
android:layout_gravity="end" /> android:layout_gravity="end" />
<TextView
android:id="@+id/text_rating"
style="@style/RatingButton"
android:layout_gravity="end"
tools:text="7.7" />
<TextView <TextView
android:id="@+id/text_flag" android:id="@+id/text_flag"
style="@style/SearchBox" style="@style/SearchBox"
@ -85,6 +91,18 @@
tools:text="🇸🇪" tools:text="🇸🇪"
tools:visibility="visible" /> tools:visibility="visible" />
</LinearLayout> </LinearLayout>
<androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/watchProgress"
style="@android:style/Widget.Material.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="5dp"
android:layout_gravity="bottom"
android:layout_marginBottom="-1.5dp"
android:progressBackgroundTint="?attr/colorPrimary"
android:progressTint="?attr/colorPrimary"
android:visibility="gone"
tools:progress="50"
tools:visibility="visible" />
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
</FrameLayout> </LinearLayout>

View file

@ -58,29 +58,12 @@
style="@style/SubButton" style="@style/SubButton"
android:layout_gravity="end" /> android:layout_gravity="end" />
<androidx.cardview.widget.CardView
android:id="@+id/text_rating_holder" <TextView
android:layout_width="wrap_content" android:id="@+id/text_rating"
android:layout_height="wrap_content" style="@style/RatingButton"
android:layout_gravity="end" android:layout_gravity="end"
android:layout_margin="2dp" tools:text="7.7" />
android:backgroundTint="@color/ratingColorBg"
android:elevation="0dp"
android:visibility="gone"
app:cardCornerRadius="@dimen/rounded_image_radius"
app:cardElevation="0dp"
tools:visibility="visible">
<TextView
android:id="@+id/text_rating"
style="@style/SearchBox"
android:layout_margin="0dp"
android:minWidth="40dp"
android:textColor="@color/ratingColor"
tools:text="★ 7.7" />
</androidx.cardview.widget.CardView>
<TextView <TextView
android:id="@+id/text_flag" android:id="@+id/text_flag"
@ -93,6 +76,15 @@
tools:visibility="visible" /> tools:visibility="visible" />
</LinearLayout> </LinearLayout>
<ImageView
android:focusable="false"
android:visibility="gone"
android:clickable="false"
android:focusableInTouchMode="false"
android:id="@+id/title_shadow"
android:layout_width="0dp"
android:layout_height="0dp"
tools:ignore="ContentDescription" />
<androidx.core.widget.ContentLoadingProgressBar <androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/watchProgress" android:id="@+id/watchProgress"

View file

@ -125,8 +125,13 @@
<item name="android:textColor">@color/subColorText</item> <item name="android:textColor">@color/subColorText</item>
</style> </style>
<!--<style name="RatingButton" parent="@style/SearchBox">
<item name="android:background">@drawable/rating_bg_color</item>
<item name="android:textColor">@color/ratingColor</item>
</style>-->
<style name="RatingButton" parent="@style/SearchBox"> <style name="RatingButton" parent="@style/SearchBox">
<item name="android:minWidth">30dp</item> <item name="android:minWidth">40dp</item>
<item name="android:background">@drawable/rating_bg_color</item> <item name="android:background">@drawable/rating_bg_color</item>
<item name="drawableTint">@color/ratingColor</item> <item name="drawableTint">@color/ratingColor</item>
<item name="android:textColor">@color/ratingColor</item> <item name="android:textColor">@color/ratingColor</item>