Added landscape layout to stat details

This commit is contained in:
Jays2Kings 2022-09-01 18:23:25 -04:00
parent fc81fabd1d
commit 9ae9cfde88
3 changed files with 356 additions and 18 deletions

View file

@ -1,7 +1,6 @@
package eu.kanade.tachiyomi.ui.more.stats.details
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color
@ -14,11 +13,15 @@ import android.widget.TextView
import androidx.annotation.PluralsRes
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.SearchView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import androidx.core.graphics.ColorUtils
import androidx.core.util.Pair
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePaddingRelative
import com.github.mikephil.charting.components.MarkerView
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.data.BarData
@ -57,6 +60,7 @@ import eu.kanade.tachiyomi.util.system.withIOContext
import eu.kanade.tachiyomi.util.system.withUIContext
import eu.kanade.tachiyomi.util.view.backgroundColor
import eu.kanade.tachiyomi.util.view.compatToolTipText
import eu.kanade.tachiyomi.util.view.doOnApplyWindowInsetsCompat
import eu.kanade.tachiyomi.util.view.isControllerVisible
import eu.kanade.tachiyomi.util.view.liftAppbarWith
import eu.kanade.tachiyomi.util.view.setOnQueryTextChangeListener
@ -94,10 +98,12 @@ class StatsDetailsController :
override fun createBinding(inflater: LayoutInflater) = StatsDetailsControllerBinding.inflate(inflater)
@SuppressLint("ClickableViewAccessibility")
val scrollView: View
get() = binding.statsDetailsScrollView ?: binding.statsRecyclerView
override fun onViewCreated(view: View) {
super.onViewCreated(view)
liftAppbarWith(binding.statsDetailsScrollView, false, liftOnScroll = { colorToolbar(it) })
liftAppbarWith(scrollView, false, liftOnScroll = { colorToolbar(it) })
setHasOptionsMenu(true)
if (presenter.selectedStat == null) {
@ -107,6 +113,12 @@ class StatsDetailsController :
resetAndSetup()
initializeChips()
with(binding) {
chartLinearLayout?.doOnApplyWindowInsetsCompat { view, insets, _ ->
view.updatePaddingRelative(
bottom = insets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom,
)
}
statsClearButtonContainer.compatToolTipText = activity?.getString(R.string.clear_filters)
statsClearButtonContainer.setOnClickListener {
resetFilters()
@ -274,8 +286,9 @@ class StatsDetailsController :
val scrollingColor = activity.getResourceColor(R.attr.colorPrimaryVariant)
val topColor = activity.getResourceColor(R.attr.colorSurface)
colorAnimator?.cancel()
val view = binding.filterConstraintLayout ?: binding.statsHorizontalScroll
val percent = ImageUtil.getPercentOfColor(
binding.statsHorizontalScroll.backgroundColor ?: Color.TRANSPARENT,
view.backgroundColor ?: Color.TRANSPARENT,
activity.getResourceColor(R.attr.colorSurface),
activity.getResourceColor(R.attr.colorPrimaryVariant),
)
@ -285,7 +298,7 @@ class StatsDetailsController :
)
colorAnimator = cA
colorAnimator?.addUpdateListener { animator ->
binding.statsHorizontalScroll.setBackgroundColor(
view.setBackgroundColor(
ColorUtils.blendARGB(
topColor,
scrollingColor,
@ -477,8 +490,9 @@ class StatsDetailsController :
private fun resetLayout(updateChipsVisibility: Boolean = false, resetReadDuration: Boolean = updateChipsVisibility) {
with(binding) {
progress.isVisible = true
statsDetailsScrollView.isInvisible = true
statsDetailsScrollView.scrollTo(0, 0)
scrollView.isInvisible = true
scrollView.scrollTo(0, 0)
chartLinearLayout?.isVisible = false
statsPieChart.isVisible = false
statsBarChart.isVisible = false
statsLineChart.isVisible = false
@ -501,6 +515,7 @@ class StatsDetailsController :
binding.noChartData.show(R.drawable.ic_heart_off_24dp, R.string.no_data_for_filters)
presenter.currentStats?.removeAll { it.count == 0 }
handleNoChartLayout()
chartLinearLayout?.isVisible = false
statsPieChart.isVisible = false
statsBarChart.isVisible = false
statsLineChart.isVisible = false
@ -508,7 +523,7 @@ class StatsDetailsController :
binding.noChartData.hide()
handleLayout()
}
statsDetailsScrollView.isVisible = true
scrollView.isVisible = true
progress.isVisible = false
totalDurationStatsText.text = adapter?.list?.sumOf { it.readDuration }?.getReadDuration()
}
@ -603,6 +618,9 @@ class StatsDetailsController :
* Handle which layout should be displayed according to the selected stat
*/
private fun handleLayout() {
binding.chartLinearLayout?.updateLayoutParams<ConstraintLayout.LayoutParams> {
matchConstraintPercentWidth = 0.5f
}
when (presenter.selectedStat) {
Stats.SERIES_TYPE, Stats.STATUS, Stats.LANGUAGE, Stats.TRACKER, Stats.CATEGORY -> handlePieChart()
Stats.SCORE -> handleScoreLayout()
@ -725,9 +743,13 @@ class StatsDetailsController :
statsPieChart.clear()
statsPieChart.invalidate()
statsPieChart.visibility = View.VISIBLE
statsBarChart.visibility = View.GONE
statsLineChart.visibility = View.GONE
chartLinearLayout?.isVisible = true
statsPieChart.isVisible = true
statsBarChart.isVisible = false
statsLineChart.isVisible = false
chartLinearLayout?.updateLayoutParams<ConstraintLayout.LayoutParams> {
matchConstraintPercentWidth = 0.33f
}
try {
val pieData = PieData(pieDataSet)
@ -758,9 +780,10 @@ class StatsDetailsController :
statsBarChart.axisLeft.resetAxisMinimum()
statsBarChart.axisLeft.resetAxisMaximum()
statsPieChart.visibility = View.GONE
statsBarChart.visibility = View.VISIBLE
statsLineChart.visibility = View.GONE
chartLinearLayout?.isVisible = true
statsPieChart.isVisible = false
statsBarChart.isVisible = true
statsLineChart.isVisible = false
try {
val newValueFormatter = object : ValueFormatter() {
@ -870,9 +893,10 @@ class StatsDetailsController :
statsLineChart.clear()
statsLineChart.invalidate()
statsPieChart.visibility = View.GONE
statsBarChart.visibility = View.GONE
statsLineChart.visibility = View.VISIBLE
chartLinearLayout?.isVisible = true
statsPieChart.isVisible = false
statsBarChart.isVisible = false
statsLineChart.isVisible = true
try {
val newValueFormatter = object : ValueFormatter() {

View file

@ -0,0 +1,313 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/stats_details_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="eu.kanade.tachiyomi.ui.more.stats.details.StatsDetailsController">
<eu.kanade.tachiyomi.widget.EmptyView
android:id="@+id/no_chart_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_gravity="center"
android:visibility="gone" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/filter_constraint_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/stats_details_scroll_view"
app:layout_constraintStart_toStartOf="parent">
<HorizontalScrollView
android:id="@+id/stats_horizontal_scroll"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
android:clipToPadding="false"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/stat_sort"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintBottom_toBottomOf="parent"
android:fadingEdgeLength="20dp"
android:requiresFadingEdge="horizontal"
android:scrollbars="none">
<LinearLayout
android:id="@+id/stats_filter_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="0dp"
android:paddingEnd="20dp">
<FrameLayout
android:id="@+id/stats_clear_button_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="12dp"
android:layout_marginEnd="-6dp"
android:clickable="true"
android:focusable="true">
<ImageView
android:id="@+id/stats_clear_button"
android:layout_width="32dp"
android:layout_height="32dp"
android:background="@drawable/round_clear_border"
android:contentDescription="@string/clear"
android:padding="3dp"
android:src="@drawable/ic_close_24dp"
app:tint="@color/gray_button" />
</FrameLayout>
<com.google.android.material.chip.ChipGroup
android:id="@+id/stats_chip_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="5dp"
android:layout_marginStart="12dp"
app:chipSpacingHorizontal="5dp"
app:singleLine="true">
<com.google.android.material.chip.Chip
android:id="@+id/chip_stat"
style="@style/Widget.Tachiyomi.Chip.Stat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/series_type"
app:chipIcon="@drawable/ic_query_stats_24dp"
app:chipIconEnabled="true" />
<com.google.android.material.chip.Chip
android:id="@+id/chip_category"
style="@style/Widget.Tachiyomi.Chip.Stat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/category"
app:chipIcon="@drawable/ic_label_outline_24dp" />
<com.google.android.material.chip.Chip
android:id="@+id/chip_source"
style="@style/Widget.Tachiyomi.Chip.Stat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/source"
app:closeIcon="@drawable/ic_arrow_drop_down_24dp" />
<com.google.android.material.chip.Chip
android:id="@+id/chip_status"
style="@style/Widget.Tachiyomi.Chip.Stat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/status"
app:chipIcon="@drawable/ic_progress_clock_24dp" />
<com.google.android.material.chip.Chip
android:id="@+id/chip_series_type"
style="@style/Widget.Tachiyomi.Chip.Stat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/series_type"
app:chipIcon="@drawable/ic_style_24dp" />
<com.google.android.material.chip.Chip
android:id="@+id/chip_language"
style="@style/Widget.Tachiyomi.Chip.Stat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/language"
app:chipIcon="@drawable/ic_translate_24dp" />
</com.google.android.material.chip.ChipGroup>
</LinearLayout>
</HorizontalScrollView>
<TextView
android:id="@+id/stat_sort"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/stats_horizontal_scroll"
android:layout_marginEnd="12dp"
android:background="@drawable/square_ripple"
android:clickable="true"
android:drawablePadding="6dp"
android:alpha=".8"
app:drawableTint="?android:textColorPrimary"
android:ellipsize="start"
android:focusable="true"
android:gravity="center|end"
android:maxLines="2"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:paddingStart="6dp"
android:paddingEnd="6dp"
android:layout_marginStart="8dp"
android:layout_gravity="center|end"
android:textAlignment="textEnd"
style="?textAppearanceBodyMedium"
android:textColor="?android:attr/textColorPrimary"
tools:text="Title Count"
app:drawableEndCompat="@drawable/ic_sort_24dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:id="@+id/chart_linear_layout"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/filter_constraint_layout"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/stats_recycler_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintVertical_bias="0.0"
app:layout_constraintHeight_max="700dp">
<RelativeLayout
android:id="@+id/stats_date_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"
tools:visibility="visible">
<ImageView
android:id="@+id/stats_date_start_arrow"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:layout_alignParentStart="true"
android:layout_marginStart="20dp"
android:contentDescription="@string/mean_score"
android:src="@drawable/ic_arrow_start_24dp"
app:tint="?attr/colorOnBackground" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/stats_date_text"
style="?textAppearanceLabelLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center_vertical"
android:layout_toStartOf="@id/stats_date_end_arrow"
android:layout_toEndOf="@id/stats_date_start_arrow"
android:ellipsize="end"
android:gravity="center"
android:includeFontPadding="false"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:textSize="16sp"
tools:text="August 6" />
<ImageView
android:id="@+id/stats_date_end_arrow"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:layout_alignParentEnd="true"
android:layout_marginEnd="20dp"
android:contentDescription="@string/mean_score"
android:src="@drawable/ic_arrow_end_24dp"
app:tint="?attr/colorOnBackground" />
</RelativeLayout>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/total_duration_stats_text"
style="?textAppearanceLabelLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:textColor="?attr/colorSecondary"
android:textSize="18sp"
android:visibility="gone"
tools:text="15h27"
tools:visibility="visible" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/stats_chart_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginStart="@dimen/marginNormal"
android:layout_marginTop="@dimen/marginNormal"
android:layout_marginEnd="@dimen/marginNormal"
android:maxWidth="600dp">
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/stats_pie_chart"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constrainedHeight="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintDimensionRatio="@fraction/chartRatio"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:visibility="gone"
tools:visibility="visible" />
<com.github.mikephil.charting.charts.BarChart
android:id="@+id/stats_bar_chart"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constrainedHeight="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintDimensionRatio="@fraction/chartRatio"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:visibility="gone" />
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/stats_line_chart"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constrainedHeight="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintDimensionRatio="@fraction/chartRatio"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:visibility="gone" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/stats_recycler_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:clipToPadding="false"
app:layout_constraintStart_toEndOf="@id/chart_linear_layout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/filter_constraint_layout"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<ProgressBar
android:id="@+id/progress"
android:layout_width="75dp"
android:layout_height="75dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:elevation="30dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -37,7 +37,7 @@
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="6dp"
android:paddingStart="0dp"
android:paddingEnd="20dp">
<FrameLayout
@ -45,6 +45,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="12dp"
android:layout_marginEnd="-6dp"
android:clickable="true"
android:focusable="true">