diff --git a/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt b/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt index 153f60cf..d2ce739f 100644 --- a/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import ani.dantotsu.R @@ -13,7 +14,6 @@ import ani.dantotsu.databinding.FragmentStatisticsBinding import com.github.aachartmodel.aainfographics.aachartcreator.AAChartAlignType import com.github.aachartmodel.aainfographics.aachartcreator.AAChartLayoutType import com.github.aachartmodel.aainfographics.aachartcreator.AAChartModel -import com.github.aachartmodel.aainfographics.aachartcreator.AAChartStackingType import com.github.aachartmodel.aainfographics.aachartcreator.AAChartType import com.github.aachartmodel.aainfographics.aachartcreator.AAChartVerticalAlignType import com.github.aachartmodel.aainfographics.aachartcreator.AAChartZoomType @@ -21,24 +21,21 @@ import com.github.aachartmodel.aainfographics.aachartcreator.AADataElement import com.github.aachartmodel.aainfographics.aachartcreator.AAOptions import com.github.aachartmodel.aainfographics.aachartcreator.AASeriesElement import com.github.aachartmodel.aainfographics.aachartcreator.aa_toAAOptions -import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAChart -import com.github.aachartmodel.aainfographics.aaoptionsmodel.AALang -import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAPosition -import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAScrollablePlotArea import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAStyle import com.github.aachartmodel.aainfographics.aatools.AAColor import com.github.aachartmodel.aainfographics.aatools.AAGradientColor import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import nl.joery.animatedbottombar.AnimatedBottomBar +import java.util.Locale class StatsFragment(private val user: Query.UserProfile, private val activity: ProfileActivity) : Fragment() { private lateinit var binding: FragmentStatisticsBinding private var selected: Int = 0 - private lateinit var tabLayout: AnimatedBottomBar private var stats: Query.StatisticsResponse? = null + private var type: MediaType = MediaType.ANIME + private var statType: StatType = StatType.COUNT override fun onCreateView( inflater: LayoutInflater, @@ -51,42 +48,51 @@ class StatsFragment(private val user: Query.UserProfile, private val activity: P override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - tabLayout = binding.typeTab - val animeTab = tabLayout.createTab(R.drawable.ic_round_movie_filter_24, "Anime") - val mangaTab = tabLayout.createTab(R.drawable.ic_round_menu_book_24, "Manga") - tabLayout.addTab(animeTab) - tabLayout.addTab(mangaTab) - tabLayout.visibility = View.GONE + binding.sourceType.setAdapter( + ArrayAdapter( + requireContext(), + R.layout.item_dropdown, + MediaType.entries.map { it.name.uppercase(Locale.ROOT) } + ) + ) + binding.sourceFilter.setAdapter( + ArrayAdapter( + requireContext(), + R.layout.item_dropdown, + StatType.entries.map { it.name.uppercase(Locale.ROOT) } + ) + ) + + binding.filterContainer.visibility = View.GONE activity.lifecycleScope.launch { stats = Anilist.query.getUserStatistics(user.id) withContext(Dispatchers.Main) { - tabLayout.visibility = View.VISIBLE - tabLayout.setOnTabSelectListener(object : AnimatedBottomBar.OnTabSelectListener { - override fun onTabSelected( - lastIndex: Int, - lastTab: AnimatedBottomBar.Tab?, - newIndex: Int, - newTab: AnimatedBottomBar.Tab - ) { - selected = newIndex - when (newIndex) { - 0 -> loadAnimeStats() - 1 -> loadMangaStats() - } - } - }) - tabLayout.selectTabAt(selected) - loadAnimeStats() + binding.filterContainer.visibility = View.VISIBLE + binding.sourceType.setOnItemClickListener { _, _, i, _ -> + type = MediaType.entries.toTypedArray()[i] + updateStats() + } + binding.sourceFilter.setOnItemClickListener { _, _, i, _ -> + statType = StatType.entries.toTypedArray()[i] + updateStats() + } + updateStats() } } } override fun onResume() { - if (this::tabLayout.isInitialized) { - tabLayout.selectTabAt(selected) - } super.onResume() + updateStats() + } + + + private fun updateStats() { + when (type) { + MediaType.ANIME -> loadAnimeStats() + MediaType.MANGA -> loadMangaStats() + } } private fun loadAnimeStats() { @@ -126,32 +132,50 @@ class StatsFragment(private val user: Query.UserProfile, private val activity: P } private fun getFormatChartModel(anime: Boolean): AAChartModel? { - val fotmatTypes: List = if (anime) { + val names: List = if (anime) { stats?.data?.user?.statistics?.anime?.formats?.map { it.format } ?: emptyList() } else { stats?.data?.user?.statistics?.manga?.formats?.map { it.format } ?: emptyList() } - val formatCount: List = if (anime) { - stats?.data?.user?.statistics?.anime?.formats?.map { it.count } ?: emptyList() + val values: List = if (anime) { + when (statType) { + StatType.COUNT -> stats?.data?.user?.statistics?.anime?.formats?.map { it.count } + StatType.TIME -> stats?.data?.user?.statistics?.anime?.formats?.map { it.minutesWatched } + StatType.MEAN_SCORE -> stats?.data?.user?.statistics?.anime?.formats?.map { it.meanScore } + } ?: emptyList() } else { - stats?.data?.user?.statistics?.manga?.formats?.map { it.count } ?: emptyList() + when (statType) { + StatType.COUNT -> stats?.data?.user?.statistics?.manga?.formats?.map { it.count } + StatType.TIME -> stats?.data?.user?.statistics?.manga?.formats?.map { it.chaptersRead } + StatType.MEAN_SCORE -> stats?.data?.user?.statistics?.manga?.formats?.map { it.meanScore } + } ?: emptyList() } - if (fotmatTypes.isEmpty() || formatCount.isEmpty()) + if (names.isEmpty() || values.isEmpty()) return null return AAChartModel() .chartType(AAChartType.Pie) .title("Format") + .subtitle(statType.name.lowercase(Locale.ROOT)) .zoomType(AAChartZoomType.XY) .dataLabelsEnabled(true) - .series(getElements(fotmatTypes, formatCount)) + .series(getElements(names, values, StatType.COUNT)) } - private fun getElements(types: List, counts: List): Array { - val elements = AASeriesElement() - val dataElements = mutableListOf() - for (i in types.indices) { - dataElements.add(AADataElement().name(types[i]).y(counts[i])) + enum class StatType { + COUNT, TIME, MEAN_SCORE + } + + enum class MediaType { + ANIME, MANGA + } + + private fun getElements(names: List, statData: List, type: StatType): Array { + val statDataElements = mutableListOf() + for (i in statData.indices) { + statDataElements.add(AADataElement().name(names[i]).y(statData[i])) } - return arrayOf(elements.data(dataElements.toTypedArray())) + return arrayOf( + AASeriesElement().name("Count").data(statDataElements.toTypedArray()), + ) } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_statistics.xml b/app/src/main/res/layout/fragment_statistics.xml index f40f3b7b..d3e420e6 100644 --- a/app/src/main/res/layout/fragment_statistics.xml +++ b/app/src/main/res/layout/fragment_statistics.xml @@ -4,26 +4,83 @@ android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical"> - + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="16dp"> + + + + + + + + + + + +