diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.kt index 361b0294f..759d00a6b 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.kt @@ -24,6 +24,7 @@ import android.view.* import android.widget.* import org.isoron.uhabits.activities.habits.show.views.ScoreCardPresenter.Companion.getTruncateField import org.isoron.uhabits.core.models.* +import org.isoron.uhabits.core.utils.* import org.isoron.uhabits.databinding.* import org.isoron.uhabits.utils.* @@ -95,14 +96,19 @@ class BarCardPresenter( } else { boolBucketSizes[boolSpinnerPosition] } + val today = DateUtils.getToday() + val oldest = habit.computedEntries.getKnown().lastOrNull()?.timestamp ?: today val entries = if (bucketSize == 1) { - habit.computedEntries.getKnown() + habit.computedEntries.getByInterval(oldest, today).map { + if (it.value < 0) Entry(it.timestamp, 0) else it + } } else { habit.computedEntries.groupBy( + original = habit.computedEntries.getByInterval(oldest, today), field = getTruncateField(bucketSize), firstWeekday = firstWeekday, isNumerical = habit.isNumerical, - ).map { Entry(it.timestamp, it.value * 1000) } + ) } return BarCardViewModel( entries = entries, diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/EntryList.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/EntryList.kt index a48a251ce..0220bad0d 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/EntryList.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/EntryList.kt @@ -81,11 +81,11 @@ open class EntryList { * relevant when grouping by week. */ open fun groupBy( + original: List, field: DateUtils.TruncateField, firstWeekday: Int, isNumerical: Boolean, ): List { - val original = getKnown() val truncated = original.map { Entry(it.timestamp.truncate(field, firstWeekday), it.value) } @@ -97,7 +97,9 @@ open class EntryList { values.add(0) } if (isNumerical) { - values[values.lastIndex] += truncated[i].value + if (truncated[i].value > 0) { + values[values.lastIndex] += truncated[i].value + } } else { if (truncated[i].value == YES_MANUAL) { values[values.lastIndex] += 1 @@ -244,7 +246,7 @@ open class EntryList { firstWeekday: Int, isNumerical: Boolean, ): Int { - val groups: List = groupBy(truncateField, firstWeekday, isNumerical) + val groups: List = groupBy(getKnown(), truncateField, firstWeekday, isNumerical) return if (groups.isEmpty()) 0 else groups[0].value } diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryList.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryList.kt index 20d8fda64..d7f7e77dc 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryList.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntryList.kt @@ -71,9 +71,14 @@ class SQLiteEntryList(database: Database) : EntryList() { return super.getKnown() } - override fun groupBy(field: DateUtils.TruncateField, firstWeekday: Int, isNumerical: Boolean): List { + override fun groupBy( + original: List, + field: DateUtils.TruncateField, + firstWeekday: Int, + isNumerical: Boolean + ): List { loadRecords() - return super.groupBy(field, firstWeekday, isNumerical) + return super.groupBy(original, field, firstWeekday, isNumerical) } override fun recomputeFrom(originalEntries: EntryList, frequency: Frequency, isNumerical: Boolean) { diff --git a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/EntryListTest.kt b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/EntryListTest.kt index d6777ab27..3c6ed8bd1 100644 --- a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/EntryListTest.kt +++ b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/EntryListTest.kt @@ -162,6 +162,7 @@ class EntryListTest { } val byMonth = entries.groupBy( + original = entries.getKnown(), field = DateUtils.TruncateField.MONTH, firstWeekday = Calendar.SATURDAY, isNumerical = true, @@ -172,6 +173,7 @@ class EntryListTest { assertThat(byMonth[12], equalTo(Entry(Timestamp.from(2013, Calendar.MAY, 1), 1271))) val byQuarter = entries.groupBy( + original = entries.getKnown(), field = DateUtils.TruncateField.QUARTER, firstWeekday = Calendar.SATURDAY, isNumerical = true, @@ -182,6 +184,7 @@ class EntryListTest { assertThat(byQuarter[5], equalTo(Entry(Timestamp.from(2013, Calendar.JANUARY, 1), 4975))) val byYear = entries.groupBy( + original = entries.getKnown(), field = DateUtils.TruncateField.YEAR, firstWeekday = Calendar.SATURDAY, isNumerical = true, @@ -208,6 +211,7 @@ class EntryListTest { } val byMonth = entries.groupBy( + original = entries.getKnown(), field = DateUtils.TruncateField.MONTH, firstWeekday = Calendar.SATURDAY, isNumerical = false, @@ -218,6 +222,7 @@ class EntryListTest { assertThat(byMonth[12], equalTo(Entry(Timestamp.from(2013, Calendar.MAY, 1), 6))) val byQuarter = entries.groupBy( + original = entries.getKnown(), field = DateUtils.TruncateField.QUARTER, firstWeekday = Calendar.SATURDAY, isNumerical = true, @@ -228,6 +233,7 @@ class EntryListTest { assertThat(byQuarter[5], equalTo(Entry(Timestamp.from(2013, Calendar.JANUARY, 1), 40))) val byYear = entries.groupBy( + original = entries.getKnown(), field = DateUtils.TruncateField.YEAR, firstWeekday = Calendar.SATURDAY, isNumerical = true,