diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/LibraryFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/LibraryFragment.kt index f83e067..bb54e80 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/LibraryFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/LibraryFragment.kt @@ -46,13 +46,11 @@ class LibraryFragment : Fragment() { binding.searchText.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String?): Boolean { - println("onQueryTextSubmit: $query") query?.let { model.search(it) } return false // return false to dismiss the keyboard } override fun onQueryTextChange(newText: String?): Boolean { - println("onQueryTextChange: $newText") newText?.let { model.search(it) } return false // return false to dismiss the keyboard } diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/MyListsFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/MyListsFragment.kt index 486831a..4cff382 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/MyListsFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/MyListsFragment.kt @@ -6,24 +6,20 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.google.android.material.tabs.TabLayoutMediator import kotlinx.coroutines.launch +import org.mosad.teapod.R import org.mosad.teapod.databinding.FragmentMyListsBinding import org.mosad.teapod.parser.crunchyroll.Crunchyroll -import org.mosad.teapod.util.ItemMedia -import org.mosad.teapod.util.adapter.MediaItemListAdapter -import org.mosad.teapod.util.showFragment import org.mosad.teapod.util.toItemMediaList class MyListsFragment : Fragment() { private lateinit var binding: FragmentMyListsBinding - private lateinit var adapter: MediaItemListAdapter + private lateinit var pagerAdapter: FragmentStateAdapter - private val itemList = arrayListOf() - private val pageSize = 30 - private var nextItemIndex = 0 + private val fragments = arrayListOf() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { binding = FragmentMyListsBinding.inflate(inflater, container, false) @@ -33,50 +29,39 @@ class MyListsFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - // TODO replace with pagination3 - // https://medium.com/swlh/paging3-recyclerview-pagination-made-easy-333c7dfa8797 - binding.recyclerMediaLibrary.addOnScrollListener(PaginationScrollListener()) + // tab layout and pager + pagerAdapter = ScreenSlidePagerAdapter(this) + binding.pagerMyLists.adapter = pagerAdapter - // init async - lifecycleScope.launch { - // create and set the adapter, needs context - context?.let { - itemList.addAll(Crunchyroll.browse(n = pageSize).toItemMediaList()) - nextItemIndex += pageSize - - adapter = MediaItemListAdapter(MediaItemListAdapter.OnClickListener { - activity?.showFragment(MediaFragment(it.id)) - }) - binding.recyclerMediaLibrary.adapter = adapter - adapter.submitList(itemList) + // TODO is position 0 always episodes? (and 1 always similar titles) + TabLayoutMediator(binding.tabMyLists, binding.pagerMyLists) { tab, position -> + tab.text = when(position) { + 0 -> getString(R.string.my_list) + 1 -> getString(R.string.crunchylists) + 2 -> getString(R.string.downloads) + else -> "" } + }.attach() + lifecycleScope.launch { + val items = Crunchyroll.watchlist(50).items + + MediaFragmentSimilar(items.toItemMediaList()).also { + fragments.add(it) + pagerAdapter.notifyItemInserted(fragments.indexOf(it)) + } } + } - inner class PaginationScrollListener: RecyclerView.OnScrollListener() { - private var isLoading = false + /** + * A simple pager adapter + * TODO also present in MediaFragment + */ + private inner class ScreenSlidePagerAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { + override fun getItemCount(): Int = fragments.size - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - val layoutManager = recyclerView.layoutManager as GridLayoutManager? - - if (!isLoading) layoutManager?.let { - // itemList.size - 5 to start loading a bit earlier than the actual end - if (layoutManager.findLastCompletelyVisibleItemPosition() >= (itemList.size - 5)) { - // load new browse results async - isLoading = true - lifecycleScope.launch { - val firstNewItemIndex = itemList.lastIndex + 1 - itemList.addAll(Crunchyroll.browse(start = nextItemIndex, n = pageSize).toItemMediaList()) - nextItemIndex += pageSize - - adapter.notifyItemRangeInserted(firstNewItemIndex, pageSize) - isLoading = false - } - } - } - } + override fun createFragment(position: Int): Fragment = fragments[position] } } \ No newline at end of file diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt index ca957af..4f02fbf 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt @@ -98,7 +98,6 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic MediaType.TVSHOW -> tmdbApiController.searchTVShow(seriesCrunchy.title) else -> NoneTMDBSearch } -// println(tmdbSearchResult) tmdbResult = if (tmdbSearchResult.results.isNotEmpty()) { when (val result = tmdbSearchResult.results.first()) { @@ -107,7 +106,6 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic else -> NoneTMDB } } else NoneTMDB -// println(tmdbResult) // currently not used // tmdbTVSeason = if (tmdbResult is TMDBTVShow) { diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/player/fragment/LanguageSettingsDialogFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/player/fragment/LanguageSettingsDialogFragment.kt index a28fb77..deea63b 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/player/fragment/LanguageSettingsDialogFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/player/fragment/LanguageSettingsDialogFragment.kt @@ -66,7 +66,6 @@ class LanguageSettingsDialogFragment : DialogFragment() { // scroll to the position of the view, if it's the selected language binding.scrollLanguages.post { - println("top: ${selectedView?.top}") binding.scrollLanguages.scrollTo(0, selectedView?.top ?: 0) } } diff --git a/app/src/main/res/layout/fragment_my_lists.xml b/app/src/main/res/layout/fragment_my_lists.xml index 5463863..64c3fec 100644 --- a/app/src/main/res/layout/fragment_my_lists.xml +++ b/app/src/main/res/layout/fragment_my_lists.xml @@ -7,19 +7,40 @@ android:background="?themePrimary" tools:context=".ui.activity.main.fragments.MyListsFragment"> - + app:tabMode="fixed" + app:tabSelectedTextColor="?textPrimary" + app:tabTextColor="?textSecondary"> + + + + + + + + \ No newline at end of file