From 545f1ab793f9236bc1ded3a6c95e7efb187675d6 Mon Sep 17 00:00:00 2001 From: LagradOst Date: Thu, 29 Jul 2021 03:46:10 +0200 Subject: [PATCH] homepage working --- .../cloudstream3/ui/home/HomeFragment.kt | 62 ++++++++++++- .../ui/home/HomeParentItemAdapter.kt | 14 ++- .../cloudstream3/ui/search/SearchAdaptor.kt | 85 +++++++++--------- .../cloudstream3/ui/search/SearchFragment.kt | 2 +- .../cloudstream3/ui/search/SearchViewModel.kt | 9 +- .../ic_baseline_keyboard_arrow_down_24.xml | 5 ++ app/src/main/res/layout/activity_main.xml | 87 +++++++++---------- app/src/main/res/layout/fragment_search.xml | 1 + .../res/layout/home_episodes_expanded.xml | 39 +++++++++ app/src/main/res/values/strings.xml | 1 + 10 files changed, 200 insertions(+), 105 deletions(-) create mode 100644 app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml create mode 100644 app/src/main/res/layout/home_episodes_expanded.xml diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt index aae8871d..5e812a7f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt @@ -1,23 +1,29 @@ package com.lagradost.cloudstream3.ui.home +import android.content.res.Configuration import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.bottomsheet.BottomSheetDialog import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.UIHelper.fixPaddingStatusbar +import com.lagradost.cloudstream3.UIHelper.getGridIsCompact import com.lagradost.cloudstream3.UIHelper.loadResult import com.lagradost.cloudstream3.mvvm.Resource import com.lagradost.cloudstream3.mvvm.observe +import com.lagradost.cloudstream3.ui.AutofitRecyclerView +import com.lagradost.cloudstream3.ui.search.SearchAdapter import com.lagradost.cloudstream3.utils.DataStore.getKey import com.lagradost.cloudstream3.utils.DataStore.setKey +import com.lagradost.cloudstream3.utils.Event import com.lagradost.cloudstream3.utils.HOMEPAGE_API -import kotlinx.android.synthetic.main.fragment_child_downloads.* import kotlinx.android.synthetic.main.fragment_home.* class HomeFragment : Fragment() { @@ -34,8 +40,31 @@ class HomeFragment : Fragment() { return inflater.inflate(R.layout.fragment_home, container, false) } + private val configEvent = Event() + private var currentSpan = 1 + + private fun fixGrid() { + val compactView = activity?.getGridIsCompact() ?: false + val spanCountLandscape = if (compactView) 2 else 6 + val spanCountPortrait = if (compactView) 1 else 3 + val orientation = resources.configuration.orientation + + currentSpan = if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + spanCountLandscape + } else { + spanCountPortrait + } + configEvent.invoke(currentSpan) + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + fixGrid() + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + fixGrid() observe(homeViewModel.apiName) { context?.setKey(HOMEPAGE_API, it) @@ -45,7 +74,7 @@ class HomeFragment : Fragment() { when (it) { is Resource.Success -> { val d = it.value - (home_master_recycler?.adapter as ParentItemAdapter?)?.itemList = d.items + (home_master_recycler?.adapter as ParentItemAdapter?)?.items = d.items home_master_recycler?.adapter?.notifyDataSetChanged() } is Resource.Failure -> { @@ -59,8 +88,35 @@ class HomeFragment : Fragment() { val adapter: RecyclerView.Adapter = ParentItemAdapter(listOf(), { card -> (activity as AppCompatActivity).loadResult(card.url, card.slug, card.apiName) - }, { + }, { item -> + val bottomSheetDialogBuilder = BottomSheetDialog(view.context) + bottomSheetDialogBuilder.setContentView(R.layout.home_episodes_expanded) + val title = bottomSheetDialogBuilder.findViewById(R.id.home_expanded_text)!! + title.text = item.name + val recycle = bottomSheetDialogBuilder.findViewById(R.id.home_expanded_recycler)!! + // Span settings + recycle.spanCount = currentSpan + + recycle.adapter = SearchAdapter(item.list, recycle) { card -> + bottomSheetDialogBuilder.dismiss() + (activity as AppCompatActivity).loadResult(card.url, card.slug, card.apiName) + } + + val spanListener = { span: Int -> + recycle.spanCount = span + (recycle.adapter as SearchAdapter).notifyDataSetChanged() + } + + configEvent += spanListener + + bottomSheetDialogBuilder.setOnDismissListener { + configEvent -= spanListener + } + + (recycle.adapter as SearchAdapter).notifyDataSetChanged() + + bottomSheetDialogBuilder.show() }) context?.fixPaddingStatusbar(home_root) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapter.kt index 1607e217..e2618ef9 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapter.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapter.kt @@ -5,18 +5,16 @@ import android.view.View import android.view.ViewGroup import android.widget.FrameLayout import android.widget.TextView -import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.lagradost.cloudstream3.HomePageList import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.SearchResponse -import kotlinx.android.synthetic.main.fragment_home.* import kotlinx.android.synthetic.main.homepage_parent.view.* class ParentItemAdapter( - var itemList: List, + var items: List, private val clickCallback: (SearchResponse) -> Unit, - private val moreInfoClickCallback: (List) -> Unit, + private val moreInfoClickCallback: (HomePageList) -> Unit, ) : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, i: Int): ParentViewHolder { val layout = R.layout.homepage_parent @@ -28,20 +26,20 @@ class ParentItemAdapter( override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is ParentViewHolder -> { - holder.bind(itemList[position]) + holder.bind(items[position]) } } } override fun getItemCount(): Int { - return itemList.size + return items.size } class ParentViewHolder constructor( itemView: View, private val clickCallback: (SearchResponse) -> Unit, - private val moreInfoClickCallback: (List) -> Unit + private val moreInfoClickCallback: (HomePageList) -> Unit ) : RecyclerView.ViewHolder(itemView) { val title: TextView = itemView.home_parent_item_title @@ -53,7 +51,7 @@ class ParentItemAdapter( (recyclerView.adapter as HomeChildItemAdapter).notifyDataSetChanged() moreInfo.setOnClickListener { - moreInfoClickCallback.invoke(info.list) + moreInfoClickCallback.invoke(info) } } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchAdaptor.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchAdaptor.kt index bc0cecc5..299b66ce 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchAdaptor.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchAdaptor.kt @@ -25,10 +25,10 @@ import kotlinx.android.synthetic.main.search_result_grid.view.* import kotlin.math.roundToInt class SearchAdapter( - var cardList: ArrayList, + var cardList: List, private val resView: AutofitRecyclerView, private val clickCallback: (SearchResponse) -> Unit, - ) : +) : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { @@ -70,59 +70,58 @@ class SearchAdapter( private val compactView = itemView.context.getGridIsCompact() private val coverHeight: Int = if (compactView) 80.toPx else (resView.itemWidth / 0.68).roundToInt() - fun bind(card: Any) { - if (card is SearchResponse) { // GENERIC - if (!compactView) { - cardView.apply { - layoutParams = FrameLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - coverHeight - ) - } + fun bind(card: SearchResponse) { + if (!compactView) { + cardView.apply { + layoutParams = FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + coverHeight + ) } + } - textType?.text = when (card.type) { - TvType.Anime -> "Anime" - TvType.Movie -> "Movie" - TvType.ONA -> "ONA" - TvType.TvSeries -> "TV" - } - // search_result_lang?.visibility = View.GONE + textType?.text = when (card.type) { + TvType.Anime -> "Anime" + TvType.Movie -> "Movie" + TvType.ONA -> "ONA" + TvType.TvSeries -> "TV" + } + // search_result_lang?.visibility = View.GONE - textIsDub?.visibility = View.GONE - textIsSub?.visibility = View.GONE + textIsDub?.visibility = View.GONE + textIsSub?.visibility = View.GONE - cardText.text = card.name + cardText.text = card.name - //imageTextProvider.text = card.apiName - if (!card.posterUrl.isNullOrEmpty()) { + //imageTextProvider.text = card.apiName + if (!card.posterUrl.isNullOrEmpty()) { - val glideUrl = - GlideUrl(card.posterUrl) + val glideUrl = + GlideUrl(card.posterUrl) - Glide.with(cardView.context) - .load(glideUrl) - .into(cardView) - } + Glide.with(cardView.context) + .load(glideUrl) + .into(cardView) + } - bg.setOnClickListener { - clickCallback.invoke(card) - } + bg.setOnClickListener { + clickCallback.invoke(card) + } - when (card) { - is AnimeSearchResponse -> { - if (card.dubStatus?.size == 1) { - //search_result_lang?.visibility = View.VISIBLE - if (card.dubStatus.contains(DubStatus.Dubbed)) { - textIsDub?.visibility = View.VISIBLE - //search_result_lang?.setColorFilter(ContextCompat.getColor(activity, R.color.dubColor)) - } else if (card.dubStatus.contains(DubStatus.Subbed)) { - //search_result_lang?.setColorFilter(ContextCompat.getColor(activity, R.color.subColor)) - textIsSub?.visibility = View.VISIBLE - } + when (card) { + is AnimeSearchResponse -> { + if (card.dubStatus?.size == 1) { + //search_result_lang?.visibility = View.VISIBLE + if (card.dubStatus.contains(DubStatus.Dubbed)) { + textIsDub?.visibility = View.VISIBLE + //search_result_lang?.setColorFilter(ContextCompat.getColor(activity, R.color.dubColor)) + } else if (card.dubStatus.contains(DubStatus.Subbed)) { + //search_result_lang?.setColorFilter(ContextCompat.getColor(activity, R.color.subColor)) + textIsSub?.visibility = View.VISIBLE } } } + } } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt index ec2b4b1a..85d5df4d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt @@ -135,7 +135,7 @@ class SearchFragment : Fragment() { is Resource.Success -> { it.value.let { data -> if (data != null) { - (cardSpace?.adapter as SearchAdapter?)?.cardList = ArrayList(data.filterNotNull()) + (cardSpace?.adapter as SearchAdapter?)?.cardList = data.filterNotNull() cardSpace?.adapter?.notifyDataSetChanged() } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchViewModel.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchViewModel.kt index 053d398c..c007621b 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchViewModel.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchViewModel.kt @@ -5,14 +5,15 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.lagradost.cloudstream3.APIHolder.allApi +import com.lagradost.cloudstream3.SearchResponse import com.lagradost.cloudstream3.mvvm.Resource import com.lagradost.cloudstream3.mvvm.safeApiCall import com.lagradost.cloudstream3.ui.APIRepository import kotlinx.coroutines.launch class SearchViewModel : ViewModel() { - private val _searchResponse: MutableLiveData>> = MutableLiveData() - val searchResponse: LiveData>> get() = _searchResponse + private val _searchResponse: MutableLiveData>> = MutableLiveData() + val searchResponse: LiveData>> get() = _searchResponse var searchCounter = 0 private val repo = APIRepository(allApi) @@ -31,7 +32,7 @@ class SearchViewModel : ViewModel() { val data = repo.search(query) if(localSearchCounter != searchCounter) return@launch - _searchResponse.postValue(data as Resource>?) + _searchResponse.postValue(data) } fun quickSearch(query: String) = viewModelScope.launch { @@ -45,6 +46,6 @@ class SearchViewModel : ViewModel() { val data = repo.quickSearch(query) if(localSearchCounter != searchCounter) return@launch - _searchResponse.postValue(data as Resource>?) + _searchResponse.postValue(data) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml new file mode 100644 index 00000000..1aeaa998 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4d18d1c0..24057d8f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,59 +1,54 @@ - - + android:layout_width="match_parent"> + + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:menu="@menu/bottom_nav_menu" + app:layout_constraintBottom_toBottomOf="parent"/> + + + - - - - - - - + android:visibility="gone" + class="com.lagradost.cloudstream3.ui.MyMiniControllerFragment" + tools:ignore="FragmentTagUsage"> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index 4e62cd6d..4f81d47b 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -71,6 +71,7 @@ app:spanCount="3" android:paddingEnd="8dp" android:id="@+id/cardSpace" + tools:listitem="@layout/search_result_grid" android:orientation="vertical" > diff --git a/app/src/main/res/layout/home_episodes_expanded.xml b/app/src/main/res/layout/home_episodes_expanded.xml new file mode 100644 index 00000000..99486b5a --- /dev/null +++ b/app/src/main/res/layout/home_episodes_expanded.xml @@ -0,0 +1,39 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 57e0fb6c..b1fd17fa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,4 +55,5 @@ Sorry, the application crashed. An anonymous bug report will be sent to the developers Disable automatic bug reporting More info + Hide \ No newline at end of file