diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt index 8c70d3cb5..c9fac1f4f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt @@ -45,6 +45,7 @@ import org.isoron.uhabits.activities.common.dialogs.WeekdayPickerDialog import org.isoron.uhabits.core.commands.CommandRunner import org.isoron.uhabits.core.commands.CreateHabitCommand import org.isoron.uhabits.core.commands.EditHabitCommand +import org.isoron.uhabits.core.commands.RefreshParentGroupCommand import org.isoron.uhabits.core.models.Frequency import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.HabitGroup @@ -319,6 +320,13 @@ class EditHabitActivity : AppCompatActivity() { ) } component.commandRunner.run(command) + + if (habit.parentID != null) { + val habitGroupList = component.habitGroupList + val refreshCommand = RefreshParentGroupCommand(habit, habitGroupList) + component.commandRunner.run(refreshCommand) + } + finish() } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitGroupList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitGroupList.kt index 376deb81e..b1cc256ff 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitGroupList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitGroupList.kt @@ -78,6 +78,20 @@ abstract class HabitGroupList : Iterable { return null } + /** + * Returns the habit with the specified UUID which is + * present in any of the habit groups within this habit group list. + */ + fun getHabitByID(id: Long): Habit? { + for (hgr in this) { + val habit = hgr.habitList.getById(id) + if (habit != null) { + return habit + } + } + return null + } + /** * Returns the habit group that occupies a certain position. * 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 89fff0dfc..fa076c046 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 @@ -145,7 +145,9 @@ class ScoreList { ) { var current = to while (current >= from) { - val habitScores = habitList.map { it.scores[current].value } + val habitScores = habitList + .filter { !it.isArchived } + .map { it.scores[current].value } val averageScore = if (habitScores.isNotEmpty()) habitScores.average() else 0.0 map[current] = Score(current, averageScore) current = current.minus(1) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/StreakList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/StreakList.kt index 76696e6ad..2214213fc 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/StreakList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/StreakList.kt @@ -79,8 +79,9 @@ class StreakList { var current = from var streakRunning = false var streakStart = from + val notArchivedHabits = habitList.filter { !it.isArchived } while (current <= to) { - if (habitList.all { it.streaks.isInStreaks(current) }) { + if (notArchivedHabits.all { it.streaks.isInStreaks(current) }) { if (!streakRunning) { streakStart = current streakRunning = true diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.kt index 1608b757f..178a193c7 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.kt @@ -25,6 +25,7 @@ import org.isoron.uhabits.core.commands.ChangeHabitGroupColorCommand import org.isoron.uhabits.core.commands.CommandRunner import org.isoron.uhabits.core.commands.DeleteHabitGroupsCommand import org.isoron.uhabits.core.commands.DeleteHabitsCommand +import org.isoron.uhabits.core.commands.RefreshParentGroupCommand import org.isoron.uhabits.core.commands.UnarchiveHabitsCommand import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.HabitGroup @@ -61,6 +62,9 @@ class ListHabitsSelectionMenuBehavior @Inject constructor( fun onArchiveHabits() { commandRunner.run(ArchiveHabitsCommand(habitList, adapter.getSelectedHabits())) commandRunner.run(ArchiveHabitGroupsCommand(habitGroupList, adapter.getSelectedHabitGroups())) + for (habit in adapter.getSelectedHabits()) { + commandRunner.run(RefreshParentGroupCommand(habit, habitGroupList)) + } adapter.clearSelection() } @@ -97,6 +101,9 @@ class ListHabitsSelectionMenuBehavior @Inject constructor( adapter.performRemoveHabitGroup(adapter.getSelectedHabitGroups()) commandRunner.run(DeleteHabitGroupsCommand(habitGroupList, adapter.getSelectedHabitGroups())) commandRunner.run(DeleteHabitsCommand(habitList, adapter.getSelectedHabits())) + for (habit in adapter.getSelectedHabits()) { + commandRunner.run(RefreshParentGroupCommand(habit, habitGroupList)) + } adapter.clearSelection() }, adapter.getSelectedHabits().size + adapter.getSelectedHabitGroups().size @@ -117,6 +124,9 @@ class ListHabitsSelectionMenuBehavior @Inject constructor( fun onUnarchiveHabits() { commandRunner.run(UnarchiveHabitsCommand(habitList, adapter.getSelectedHabits())) + for (habit in adapter.getSelectedHabits()) { + commandRunner.run(RefreshParentGroupCommand(habit, habitGroupList)) + } adapter.clearSelection() } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/EditHabitCommandTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/EditHabitCommandTest.kt index 72f4a0d06..d17ab7e86 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/EditHabitCommandTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/commands/EditHabitCommandTest.kt @@ -52,7 +52,7 @@ class EditHabitCommandTest : BaseUnitTest() { @Test fun testExecute() { - command = EditHabitCommand(habitList, habit.id!!, modified) + command = EditHabitCommand(habitList, habit.uuid!!, modified) val originalScore = habit.scores[today].value assertThat(habit.name, equalTo("original")) command.run() diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt index 26dd82df8..96648b58b 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt @@ -67,6 +67,7 @@ class ListHabitsBehaviorTest : BaseUnitTest() { clearInvocations(habitList) behavior = ListHabitsBehavior( habitList, + habitGroupList, dirFinder, taskRunner, screen,