Implement edit habit group activity

This commit is contained in:
Dharanish
2024-07-03 10:30:57 +02:00
parent a2cf78f823
commit 0a1cdd45cb
9 changed files with 82 additions and 40 deletions

View File

@@ -18,13 +18,17 @@
*/
package org.isoron.uhabits.core.ui.screens.habits.list
import org.isoron.uhabits.core.commands.ArchiveHabitGroupsCommand
import org.isoron.uhabits.core.commands.ArchiveHabitsCommand
import org.isoron.uhabits.core.commands.ChangeHabitColorCommand
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.UnarchiveHabitsCommand
import org.isoron.uhabits.core.models.Habit
import org.isoron.uhabits.core.models.HabitGroup
import org.isoron.uhabits.core.models.HabitGroupList
import org.isoron.uhabits.core.models.HabitList
import org.isoron.uhabits.core.models.PaletteColor
import org.isoron.uhabits.core.ui.callbacks.OnColorPickedCallback
@@ -33,33 +37,55 @@ import javax.inject.Inject
class ListHabitsSelectionMenuBehavior @Inject constructor(
private val habitList: HabitList,
private val habitGroupList: HabitGroupList,
private val screen: Screen,
private val adapter: Adapter,
var commandRunner: CommandRunner
) {
fun canArchive(): Boolean {
for (habit in adapter.getSelected()) if (habit.isArchived) return false
for (habit in adapter.getSelectedHabits()) if (habit.isArchived) return false
for (hgr in adapter.getSelectedHabitGroups()) if (hgr.isArchived) return false
return true
}
fun canEdit(): Boolean {
return adapter.getSelected().size == 1
return (adapter.getSelectedHabits().size + adapter.getSelectedHabitGroups().size == 1)
}
fun canUnarchive(): Boolean {
for (habit in adapter.getSelected()) if (!habit.isArchived) return false
for (habit in adapter.getSelectedHabits()) if (!habit.isArchived) return false
for (hgr in adapter.getSelectedHabitGroups()) if (!hgr.isArchived) return false
return true
}
fun onArchiveHabits() {
commandRunner.run(ArchiveHabitsCommand(habitList, adapter.getSelected()))
commandRunner.run(ArchiveHabitsCommand(habitList, adapter.getSelectedHabits()))
commandRunner.run(ArchiveHabitGroupsCommand(habitGroupList, adapter.getSelectedHabitGroups()))
adapter.clearSelection()
}
fun onChangeColor() {
val (color) = adapter.getSelected()[0]
val color = if (adapter.getSelectedHabits().isNotEmpty()) {
adapter.getSelectedHabits()[0].color
} else {
adapter.getSelectedHabitGroups()[0].color
}
screen.showColorPicker(color) { selectedColor: PaletteColor ->
commandRunner.run(ChangeHabitColorCommand(habitList, adapter.getSelected(), selectedColor))
commandRunner.run(
ChangeHabitColorCommand(
habitList,
adapter.getSelectedHabits(),
selectedColor
)
)
commandRunner.run(
ChangeHabitGroupColorCommand(
habitGroupList,
adapter.getSelectedHabitGroups(),
selectedColor
)
)
adapter.clearSelection()
}
}
@@ -67,28 +93,36 @@ class ListHabitsSelectionMenuBehavior @Inject constructor(
fun onDeleteHabits() {
screen.showDeleteConfirmationScreen(
{
adapter.performRemove(adapter.getSelected())
commandRunner.run(DeleteHabitsCommand(habitList, adapter.getSelected()))
adapter.performRemove(adapter.getSelectedHabits())
adapter.performRemoveHabitGroup(adapter.getSelectedHabitGroups())
commandRunner.run(DeleteHabitsCommand(habitList, adapter.getSelectedHabits()))
commandRunner.run(DeleteHabitGroupsCommand(habitGroupList, adapter.getSelectedHabitGroups()))
adapter.clearSelection()
},
adapter.getSelected().size
adapter.getSelectedHabits().size + adapter.getSelectedHabitGroups().size
)
}
fun onEditHabits() {
val selected = adapter.getSelected()
if (selected.isNotEmpty()) screen.showEditHabitsScreen(selected)
val selected = adapter.getSelectedHabits()
if (selected.isNotEmpty()) {
screen.showEditHabitsScreen(selected)
} else {
val selectedGroup = adapter.getSelectedHabitGroups()
screen.showEditHabitGroupScreen(selectedGroup)
}
adapter.clearSelection()
}
fun onUnarchiveHabits() {
commandRunner.run(UnarchiveHabitsCommand(habitList, adapter.getSelected()))
commandRunner.run(UnarchiveHabitsCommand(habitList, adapter.getSelectedHabits()))
adapter.clearSelection()
}
interface Adapter {
fun clearSelection()
fun getSelected(): List<Habit>
fun getSelectedHabits(): List<Habit>
fun getSelectedHabitGroups(): List<HabitGroup>
fun performRemove(selected: List<Habit>)
fun performRemoveHabitGroup(selected: List<HabitGroup>)
@@ -106,5 +140,7 @@ class ListHabitsSelectionMenuBehavior @Inject constructor(
)
fun showEditHabitsScreen(selected: List<Habit>)
fun showEditHabitGroupScreen(selected: List<HabitGroup>)
}
}

View File

@@ -4,7 +4,6 @@ import org.isoron.uhabits.core.commands.CommandRunner
import org.isoron.uhabits.core.commands.DeleteHabitGroupsCommand
import org.isoron.uhabits.core.models.HabitGroup
import org.isoron.uhabits.core.models.HabitGroupList
import org.isoron.uhabits.core.tasks.TaskRunner
import org.isoron.uhabits.core.ui.callbacks.OnConfirmedCallback
import java.io.File
@@ -12,15 +11,13 @@ class ShowHabitGroupMenuPresenter(
private val commandRunner: CommandRunner,
private val habitGroup: HabitGroup,
private val habitGroupList: HabitGroupList,
private val screen: Screen,
private val system: System,
private val taskRunner: TaskRunner
private val screen: Screen
) {
fun onEditHabit() {
fun onEditHabitGroup() {
screen.showEditHabitGroupScreen(habitGroup)
}
fun onDeleteHabit() {
fun onDeleteHabitGroup() {
screen.showDeleteConfirmationScreen {
commandRunner.run(DeleteHabitGroupsCommand(habitGroupList, listOf(habitGroup)))
screen.close()

View File

@@ -52,27 +52,27 @@ class ListHabitsSelectionMenuBehaviorTest : BaseUnitTest() {
@Test
@Throws(Exception::class)
fun canArchive() {
whenever(adapter.getSelected()).thenReturn(listOf(habit1, habit2))
whenever(adapter.getSelectedHabits()).thenReturn(listOf(habit1, habit2))
assertFalse(behavior.canArchive())
whenever(adapter.getSelected()).thenReturn(listOf(habit2, habit3))
whenever(adapter.getSelectedHabits()).thenReturn(listOf(habit2, habit3))
assertTrue(behavior.canArchive())
}
@Test
@Throws(Exception::class)
fun canEdit() {
whenever(adapter.getSelected()).thenReturn(listOf(habit1))
whenever(adapter.getSelectedHabits()).thenReturn(listOf(habit1))
assertTrue(behavior.canEdit())
whenever(adapter.getSelected()).thenReturn(listOf(habit1, habit2))
whenever(adapter.getSelectedHabits()).thenReturn(listOf(habit1, habit2))
assertFalse(behavior.canEdit())
}
@Test
@Throws(Exception::class)
fun canUnarchive() {
whenever(adapter.getSelected()).thenReturn(listOf(habit1, habit2))
whenever(adapter.getSelectedHabits()).thenReturn(listOf(habit1, habit2))
assertFalse(behavior.canUnarchive())
whenever(adapter.getSelected()).thenReturn(listOf(habit1))
whenever(adapter.getSelectedHabits()).thenReturn(listOf(habit1))
assertTrue(behavior.canUnarchive())
}
@@ -80,7 +80,7 @@ class ListHabitsSelectionMenuBehaviorTest : BaseUnitTest() {
@Throws(Exception::class)
fun onArchiveHabits() {
assertFalse(habit2.isArchived)
whenever(adapter.getSelected()).thenReturn(listOf(habit2))
whenever(adapter.getSelectedHabits()).thenReturn(listOf(habit2))
behavior.onArchiveHabits()
assertTrue(habit2.isArchived)
}
@@ -90,7 +90,7 @@ class ListHabitsSelectionMenuBehaviorTest : BaseUnitTest() {
fun onChangeColor() {
assertThat(habit1.color, equalTo(PaletteColor(8)))
assertThat(habit2.color, equalTo(PaletteColor(8)))
whenever(adapter.getSelected()).thenReturn(listOf(habit1, habit2))
whenever(adapter.getSelectedHabits()).thenReturn(listOf(habit1, habit2))
behavior.onChangeColor()
verify(screen)
.showColorPicker(eq(PaletteColor(8)), colorPickerCallback.capture())
@@ -103,7 +103,7 @@ class ListHabitsSelectionMenuBehaviorTest : BaseUnitTest() {
fun onDeleteHabits() {
val id = habit1.id!!
habitList.getById(id)!!
whenever(adapter.getSelected()).thenReturn(listOf(habit1))
whenever(adapter.getSelectedHabits()).thenReturn(listOf(habit1))
behavior.onDeleteHabits()
verify(screen).showDeleteConfirmationScreen(deleteCallback.capture(), eq(1))
deleteCallback.lastValue.onConfirmed()
@@ -114,7 +114,7 @@ class ListHabitsSelectionMenuBehaviorTest : BaseUnitTest() {
@Throws(Exception::class)
fun onEditHabits() {
val selected: List<Habit> = listOf(habit1, habit2)
whenever(adapter.getSelected()).thenReturn(selected)
whenever(adapter.getSelectedHabits()).thenReturn(selected)
behavior.onEditHabits()
verify(screen).showEditHabitsScreen(selected)
}
@@ -123,7 +123,7 @@ class ListHabitsSelectionMenuBehaviorTest : BaseUnitTest() {
@Throws(Exception::class)
fun onUnarchiveHabits() {
assertTrue(habit1.isArchived)
whenever(adapter.getSelected()).thenReturn(listOf(habit1))
whenever(adapter.getSelectedHabits()).thenReturn(listOf(habit1))
behavior.onUnarchiveHabits()
assertFalse(habit1.isArchived)
}