package ani.dantotsu.profile import android.content.Intent import android.os.Bundle import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.animation.LayoutAnimationController import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.LiveData import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import ani.dantotsu.R import ani.dantotsu.connections.anilist.ProfileViewModel import ani.dantotsu.connections.anilist.api.Query import ani.dantotsu.databinding.FragmentProfileBinding import ani.dantotsu.loadImage import ani.dantotsu.media.Author import ani.dantotsu.media.AuthorAdapter import ani.dantotsu.media.Character import ani.dantotsu.media.CharacterAdapter import ani.dantotsu.media.Media import ani.dantotsu.media.MediaAdaptor import ani.dantotsu.media.user.ListActivity import ani.dantotsu.setBaseline import ani.dantotsu.setSlideIn import ani.dantotsu.setSlideUp import ani.dantotsu.util.AniMarkdown.Companion.getFullAniHTML import ani.dantotsu.util.Logger import eu.kanade.tachiyomi.util.system.getSerializableCompat import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch class ProfileFragment : Fragment() { lateinit var binding: FragmentProfileBinding private lateinit var activity: ProfileActivity private lateinit var user: Query.UserProfile private val favStaff = arrayListOf() private val favCharacter = arrayListOf() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentProfileBinding.inflate(inflater, container, false) return binding.root } val model: ProfileViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) activity = requireActivity() as ProfileActivity binding.root.setBaseline(activity.navBar) user = arguments?.getSerializableCompat("user") as Query.UserProfile viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) { model.setData(user.id) } binding.profileUserBio.settings.loadWithOverviewMode = true binding.profileUserBio.settings.useWideViewPort = true binding.profileUserBio.setInitialScale(1) val styledHtml = getFullAniHTML( user.about ?: "", ContextCompat.getColor(activity, R.color.bg_opp) ) binding.profileUserBio.loadDataWithBaseURL( null, styledHtml, "text/html; charset=utf-8", "UTF-8", null ) binding.profileUserBio.setBackgroundColor( ContextCompat.getColor( activity, android.R.color.transparent ) ) binding.profileUserBio.setLayerType(View.LAYER_TYPE_HARDWARE, null) binding.profileUserBio.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) binding.profileUserBio.setBackgroundColor( ContextCompat.getColor( activity, android.R.color.transparent ) ) } override fun shouldOverrideUrlLoading( view: WebView?, request: WebResourceRequest? ): Boolean { return true } } binding.userInfoContainer.isVisible = user.about != null binding.statsEpisodesWatched.text = user.statistics.anime.episodesWatched.toString() binding.statsDaysWatched.text = (user.statistics.anime.minutesWatched / (24 * 60)).toString() binding.statsAnimeMeanScore.text = user.statistics.anime.meanScore.toString() binding.statsChaptersRead.text = user.statistics.manga.chaptersRead.toString() binding.statsVolumeRead.text = (user.statistics.manga.volumesRead).toString() binding.statsMangaMeanScore.text = user.statistics.manga.meanScore.toString() initRecyclerView( model.getAnimeFav(), binding.profileFavAnimeContainer, binding.profileFavAnimeRecyclerView, binding.profileFavAnimeProgressBar, binding.profileFavAnime ) initRecyclerView( model.getMangaFav(), binding.profileFavMangaContainer, binding.profileFavMangaRecyclerView, binding.profileFavMangaProgressBar, binding.profileFavManga ) user.favourites?.characters?.nodes?.forEach { i -> favCharacter.add(Character(i.id, i.name.full, i.image.large, i.image.large, "", true)) } user.favourites?.staff?.nodes?.forEach { i -> favStaff.add(Author(i.id, i.name.full, i.image.large , "" )) } setFavPeople() } override fun onResume() { super.onResume() if (this::binding.isInitialized) { binding.root.requestLayout() binding.root.setBaseline(activity.navBar) } } private fun setFavPeople() { if (favStaff.isEmpty()) { binding.profileFavStaffContainer.visibility = View.GONE } else { binding.profileFavStaffRecycler.adapter = AuthorAdapter(favStaff) binding.profileFavStaffRecycler.layoutManager = LinearLayoutManager( activity, LinearLayoutManager.HORIZONTAL, false ) binding.profileFavStaffRecycler.layoutAnimation = LayoutAnimationController(setSlideIn(), 0.25f) } if (favCharacter.isEmpty()) { binding.profileFavCharactersContainer.visibility = View.GONE } else { binding.profileFavCharactersRecycler.adapter = CharacterAdapter(favCharacter) binding.profileFavCharactersRecycler.layoutManager = LinearLayoutManager( activity, LinearLayoutManager.HORIZONTAL, false ) binding.profileFavCharactersRecycler.layoutAnimation = LayoutAnimationController(setSlideIn(), 0.25f) } } private fun initRecyclerView( mode: LiveData>, container: View, recyclerView: RecyclerView, progress: View, title: View ) { container.visibility = View.VISIBLE progress.visibility = View.VISIBLE recyclerView.visibility = View.GONE title.visibility = View.INVISIBLE mode.observe(viewLifecycleOwner) { recyclerView.visibility = View.GONE if (it != null) { if (it.isNotEmpty()) { recyclerView.adapter = MediaAdaptor(0, it, activity, fav=true) recyclerView.layoutManager = LinearLayoutManager( activity, LinearLayoutManager.HORIZONTAL, false ) recyclerView.visibility = View.VISIBLE recyclerView.layoutAnimation = LayoutAnimationController(setSlideIn(), 0.25f) } else { container.visibility = View.GONE } title.visibility = View.VISIBLE title.startAnimation(setSlideUp()) progress.visibility = View.GONE } } } companion object { fun newInstance(query: Query.UserProfile): ProfileFragment { val args = Bundle().apply { putSerializable("user", query) } return ProfileFragment().apply { arguments = args } } } }