2022-12-26 16:10:38 +01:00
package org.mosad.teapod.ui.activity.main.fragments
import android.os.Bundle
2023-10-15 18:44:22 +02:00
import android.util.Log
2022-12-26 16:10:38 +01:00
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
2023-10-15 18:44:22 +02:00
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
2022-12-26 16:10:38 +01:00
import androidx.lifecycle.lifecycleScope
2023-10-15 18:44:22 +02:00
import androidx.lifecycle.repeatOnLifecycle
2022-12-26 19:43:40 +01:00
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.google.android.material.tabs.TabLayoutMediator
2022-12-26 16:10:38 +01:00
import kotlinx.coroutines.launch
2022-12-26 19:43:40 +01:00
import org.mosad.teapod.R
2022-12-26 16:10:38 +01:00
import org.mosad.teapod.databinding.FragmentMyListsBinding
2023-10-15 18:44:22 +02:00
import org.mosad.teapod.ui.activity.main.viewmodel.MyListsFragmentViewModel
2022-12-26 16:10:38 +01:00
import org.mosad.teapod.util.toItemMediaList
class MyListsFragment : Fragment ( ) {
private lateinit var binding : FragmentMyListsBinding
2022-12-26 19:43:40 +01:00
private lateinit var pagerAdapter : FragmentStateAdapter
2022-12-26 16:10:38 +01:00
2023-10-15 18:44:22 +02:00
private val model : MyListsFragmentViewModel by viewModels ( )
2022-12-26 19:43:40 +01:00
private val fragments = arrayListOf < Fragment > ( )
2022-12-26 16:10:38 +01:00
override fun onCreateView ( inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ) : View {
binding = FragmentMyListsBinding . inflate ( inflater , container , false )
return binding . root
}
override fun onViewCreated ( view : View , savedInstanceState : Bundle ? ) {
super . onViewCreated ( view , savedInstanceState )
2022-12-26 19:43:40 +01:00
// tab layout and pager
pagerAdapter = ScreenSlidePagerAdapter ( this )
binding . pagerMyLists . adapter = pagerAdapter
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 ( )
2022-12-26 16:10:38 +01:00
2023-10-15 18:44:22 +02:00
viewLifecycleOwner . lifecycleScope . launch {
viewLifecycleOwner . repeatOnLifecycle ( Lifecycle . State . STARTED ) {
model . onUiState ( viewLifecycleOwner . lifecycleScope ) { uiState ->
when ( uiState ) {
is MyListsFragmentViewModel . UiState . Normal -> bindUiStateNormal ( uiState )
is MyListsFragmentViewModel . UiState . Loading -> bindUiStateLoading ( )
is MyListsFragmentViewModel . UiState . Error -> bindUiStateError ( uiState )
}
}
2022-12-26 16:10:38 +01:00
}
}
2023-10-15 18:44:22 +02:00
}
private fun bindUiStateNormal ( uiState : MyListsFragmentViewModel . UiState . Normal ) {
MediaFragmentSimilar ( uiState . watchlistItems . toItemMediaList ( ) ) . also {
fragments . add ( it )
pagerAdapter . notifyItemInserted ( fragments . indexOf ( it ) )
}
}
private fun bindUiStateLoading ( ) {
// currently not used
}
2022-12-26 16:10:38 +01:00
2023-10-15 18:44:22 +02:00
private fun bindUiStateError ( uiState : MyListsFragmentViewModel . UiState . Error ) {
// currently not used
Log . e ( javaClass . name , " A error occurred while loading a UiState: ${uiState.message} " )
2022-12-26 19:43:40 +01:00
}
2022-12-26 16:10:38 +01:00
2022-12-26 19:43:40 +01:00
/ * *
* A simple pager adapter
* TODO also present in MediaFragment
* /
private inner class ScreenSlidePagerAdapter ( fragment : Fragment ) : FragmentStateAdapter ( fragment ) {
override fun getItemCount ( ) : Int = fragments . size
2022-12-26 16:10:38 +01:00
2022-12-26 19:43:40 +01:00
override fun createFragment ( position : Int ) : Fragment = fragments [ position ]
2022-12-26 16:10:38 +01:00
}
}