diff --git a/CHANGELOG.md b/CHANGELOG.md index d2602177f..6bd6da72f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [2.0.2] - Unreleased + +### Fixed +- Fix crash caused by numerical habits with zero target (#903) + ## [2.0.1] - 2021-05-09 ### Added diff --git a/uhabits-android/build.gradle.kts b/uhabits-android/build.gradle.kts index fb5a8bbf1..949adf793 100644 --- a/uhabits-android/build.gradle.kts +++ b/uhabits-android/build.gradle.kts @@ -37,8 +37,8 @@ android { compileSdkVersion(30) defaultConfig { - versionCode(20001) - versionName("2.0.1") + versionCode(20002) + versionName("2.0.2") minSdkVersion(23) targetSdkVersion(30) applicationId("org.isoron.uhabits") diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/TargetChart.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/TargetChart.kt index b03c748c1..1d19cbedb 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/TargetChart.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/TargetChart.kt @@ -117,7 +117,11 @@ class TargetChart : View { barRect[rect.left + stop + padding, rect.top + baseSize * 0.05f, rect.right - padding] = rect.bottom - baseSize * 0.05f canvas.drawRoundRect(barRect, round, round, paint!!) - var percentage = (values[row] / targets[row]).toFloat() + var percentage = if (targets[row] > 0) { + (values[row] / targets[row]).toFloat() + } else { + 1.0f + } percentage = min(1.0f, percentage) // Draw completed box diff --git a/uhabits-android/src/main/play/release-notes/en-US/default.txt b/uhabits-android/src/main/play/release-notes/en-US/default.txt index 6aaae23bc..70bb26533 100644 --- a/uhabits-android/src/main/play/release-notes/en-US/default.txt +++ b/uhabits-android/src/main/play/release-notes/en-US/default.txt @@ -1,3 +1,5 @@ +2.0.2: +* Bug fixes 2.0: * Track numeric habits (e.g. how many pages did you read?) * Skip days without breaking your streak diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ScoreList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ScoreList.kt index 11a2b146c..b5dff17de 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ScoreList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ScoreList.kt @@ -22,6 +22,7 @@ import org.isoron.uhabits.core.models.Score.Companion.compute import java.util.ArrayList import java.util.HashMap import javax.annotation.concurrent.ThreadSafe +import kotlin.math.max import kotlin.math.min @ThreadSafe @@ -93,11 +94,15 @@ class ScoreList { for (i in values.indices) { val offset = values.size - i - 1 if (isNumerical) { - rollingSum += values[offset] + rollingSum += max(0, values[offset]) if (offset + denominator < values.size) { rollingSum -= values[offset + denominator] } - val percentageCompleted = min(1.0, rollingSum / 1000 / targetValue) + val percentageCompleted = if (targetValue > 0) { + min(1.0, rollingSum / 1000 / targetValue) + } else { + 1.0 + } previousValue = compute(freq, previousValue, percentageCompleted) } else { if (values[offset] == Entry.YES_MANUAL) { diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/ScoreListTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/ScoreListTest.kt index c96d2ce46..f78af6d21 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/ScoreListTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/ScoreListTest.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.models +import junit.framework.Assert.assertTrue import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.number.IsCloseTo import org.hamcrest.number.OrderingComparison @@ -121,6 +122,14 @@ class ScoreListTest : BaseUnitTest() { checkScoreValues(expectedValues) } + @Test + fun test_withZeroTarget() { + habit = fixtures.createNumericalHabit() + habit.targetValue = 0.0 + habit.recompute() + assertTrue(habit.scores[today].value.isFinite()) + } + @Test fun test_imperfectNonDaily() { // If the habit should be performed 3 times per week and the user misses 1 repetition