From 16c65f19fd2b856841dfbff16a3425f15fe5e3fe Mon Sep 17 00:00:00 2001 From: Eduardo Esparza <92958867+eduebernal@users.noreply.github.com> Date: Thu, 8 Sep 2022 18:01:12 -0700 Subject: [PATCH] fix marker scaling for numerical habits in frequency display (#1489) --- .../activities/common/views/FrequencyChart.kt | 24 ++++++++++++++++--- .../habits/show/views/FrequencyCardView.kt | 1 + .../isoron/uhabits/widgets/FrequencyWidget.kt | 1 + .../habits/show/views/FrequencyCard.kt | 2 ++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.kt index 417ab21f2..41c67ff27 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.kt @@ -63,7 +63,9 @@ class FrequencyChart : ScrollableChart { private var primaryColor = 0 private var isBackgroundTransparent = false private lateinit var frequency: HashMap> + private var maxFreq = 0 private var firstWeekday = Calendar.SUNDAY + private var isNumerical: Boolean = false constructor(context: Context?) : super(context) { init() @@ -80,8 +82,14 @@ class FrequencyChart : ScrollableChart { postInvalidate() } + fun setIsNumerical(type: Boolean) { + isNumerical = type + postInvalidate() + } + fun setFrequency(frequency: java.util.HashMap>) { this.frequency = frequency + maxFreq = getMaxFreq(frequency) postInvalidate() } @@ -90,6 +98,15 @@ class FrequencyChart : ScrollableChart { postInvalidate() } + private fun getMaxFreq(frequency: HashMap>): Int { + var maxValue = 1 + for (values in frequency.values) for (value in values) maxValue = max( + value, + maxValue + ) + return maxValue + } + fun setIsBackgroundTransparent(isBackgroundTransparent: Boolean) { this.isBackgroundTransparent = isBackgroundTransparent initColors() @@ -213,7 +230,7 @@ class FrequencyChart : ScrollableChart { canvas.drawLine(rGrid.left, rGrid.top, rGrid.right, rGrid.top, pGrid!!) } - private fun drawMarker(canvas: Canvas, rect: RectF?, value: Int?, frequency: Int) { + private fun drawMarker(canvas: Canvas, rect: RectF?, value: Int?, weekdayFrequency: Int) { // value can be negative when the entry is skipped val valueCopy = value?.let { max(0, it) } @@ -221,8 +238,8 @@ class FrequencyChart : ScrollableChart { // maximal allowed mark radius val maxRadius = (rect.height() - 2 * padding) / 2.0f // the real mark radius is scaled down by a factor depending on the maximal frequency - - val scale = 1.0f / frequency * valueCopy!! + val scalingFactor = if (isNumerical) maxFreq else weekdayFrequency + val scale = 1.0f / scalingFactor * valueCopy!! val radius = maxRadius * scale val colorIndex = min((colors.size - 1), ((colors.size - 1) * scale).roundToInt()) pGraph!!.color = colors[colorIndex] @@ -285,5 +302,6 @@ class FrequencyChart : ScrollableChart { frequency[Timestamp(date)] = values date.add(Calendar.MONTH, -1) } + maxFreq = getMaxFreq(frequency) } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardView.kt index cf7daf769..f31b23408 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardView.kt @@ -33,6 +33,7 @@ class FrequencyCardView(context: Context, attrs: AttributeSet) : LinearLayout(co fun setState(state: FrequencyCardState) { val androidColor = state.theme.color(state.color).toInt() binding.frequencyChart.setFrequency(state.frequency) + binding.frequencyChart.setIsNumerical(state.isNumerical) binding.frequencyChart.setFirstWeekday(state.firstWeekday) binding.title.setTextColor(androidColor) binding.frequencyChart.setColor(androidColor) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.kt b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.kt index 8ef1b4a48..8b76cb1b3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.kt @@ -49,6 +49,7 @@ class FrequencyWidget( (widgetView.dataView as FrequencyChart).apply { setFirstWeekday(firstWeekday) setColor(WidgetTheme().color(habit.color).toInt()) + setIsNumerical(habit.isNumerical) setFrequency(habit.originalEntries.computeWeekdayFrequency(habit.isNumerical)) } } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/FrequencyCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/FrequencyCard.kt index fd46c3473..cdb12d32d 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/FrequencyCard.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/FrequencyCard.kt @@ -30,6 +30,7 @@ data class FrequencyCardState( val firstWeekday: Int, val frequency: HashMap>, val theme: Theme, + val isNumerical: Boolean ) class FrequencyCardPresenter { @@ -40,6 +41,7 @@ class FrequencyCardPresenter { theme: Theme ) = FrequencyCardState( color = habit.color, + isNumerical = habit.isNumerical, frequency = habit.originalEntries.computeWeekdayFrequency( isNumerical = habit.isNumerical ),