diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.kt index ef560dc6c..4e24609e3 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.kt @@ -76,7 +76,12 @@ data class Habit( frequency = frequency, isNumerical = isNumerical, ) - scores.recompute() + scores.recompute( + this.frequency, + this.isNumerical, + this.targetValue, + this.computedEntries + ) } fun copyFrom(other: Habit) { diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelFactory.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelFactory.kt index 41aa51b71..4bcf77b18 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelFactory.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelFactory.kt @@ -36,7 +36,6 @@ interface ModelFactory { originalEntries = buildOriginalEntries(), computedEntries = buildComputedEntries(), ) - scores.setHabit(habit) streaks.setHabit(habit) return habit } diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ScoreList.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ScoreList.java index 772806142..fd5dcdcd4 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ScoreList.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ScoreList.java @@ -31,13 +31,6 @@ public class ScoreList { private final HashMap list = new HashMap<>(); - private Habit habit; - - public void setHabit(Habit habit) - { - this.habit = habit; - } - /** * Returns the score for a given day. If the timestamp given happens before the first * repetition of the habit or after the last computed score, returns a score with value zero. @@ -83,11 +76,16 @@ public class ScoreList return scores; } - public void recompute() + public void recompute( + Frequency frequency, + boolean isNumerical, + double targetValue, + EntryList computedEntries + ) { list.clear(); - List entries = habit.getOriginalEntries().getKnown(); + List entries = computedEntries.getKnown(); if (entries.isEmpty()) return; Entry oldest = entries.get(entries.size() - 1); @@ -96,10 +94,10 @@ public class ScoreList if (from.isNewerThan(today)) return; double rollingSum = 0.0; - int numerator = habit.getFrequency().getNumerator(); - int denominator = habit.getFrequency().getDenominator(); - final double freq = habit.getFrequency().toDouble(); - final Integer[] values = habit.getComputedEntries() + int numerator = frequency.getNumerator(); + int denominator = frequency.getDenominator(); + final double freq = frequency.toDouble(); + final Integer[] values = computedEntries .getByInterval(from, today) .stream() .map(Entry::getValue) @@ -108,7 +106,7 @@ public class ScoreList // For non-daily boolean habits, we double the numerator and the denominator to smooth // out irregular repetition schedules (for example, weekly habits performed on different // days of the week) - if (!habit.isNumerical() && freq < 1.0) + if (!isNumerical && freq < 1.0) { numerator *= 2; denominator *= 2; @@ -118,14 +116,14 @@ public class ScoreList for (int i = 0; i < values.length; i++) { int offset = values.length - i - 1; - if (habit.isNumerical()) + if (isNumerical) { rollingSum += values[offset]; if (offset + denominator < values.length) { rollingSum -= values[offset + denominator]; } - double percentageCompleted = Math.min(1, rollingSum / 1000 / habit.getTargetValue()); + double percentageCompleted = Math.min(1, rollingSum / 1000 / targetValue); previousValue = Score.compute(freq, previousValue, percentageCompleted); } else