Implement edit habit group activity

pull/2020/head
Dharanish 1 year ago
parent a2cf78f823
commit 0a1cdd45cb

@ -56,7 +56,7 @@ class EditHabitGroupActivity : AppCompatActivity() {
if (intent.hasExtra("habitGroupId")) { if (intent.hasExtra("habitGroupId")) {
binding.toolbar.title = getString(R.string.edit_habit_group) binding.toolbar.title = getString(R.string.edit_habit_group)
habitGroupId = intent.getLongExtra("habitId", -1) habitGroupId = intent.getLongExtra("habitGroupId", -1)
val hgr = component.habitGroupList.getById(habitGroupId)!! val hgr = component.habitGroupList.getById(habitGroupId)!!
color = hgr.color color = hgr.color
hgr.reminder?.let { hgr.reminder?.let {

@ -41,6 +41,7 @@ import org.isoron.uhabits.core.commands.ChangeHabitColorCommand
import org.isoron.uhabits.core.commands.Command import org.isoron.uhabits.core.commands.Command
import org.isoron.uhabits.core.commands.CommandRunner import org.isoron.uhabits.core.commands.CommandRunner
import org.isoron.uhabits.core.commands.CreateHabitCommand import org.isoron.uhabits.core.commands.CreateHabitCommand
import org.isoron.uhabits.core.commands.DeleteHabitGroupsCommand
import org.isoron.uhabits.core.commands.DeleteHabitsCommand import org.isoron.uhabits.core.commands.DeleteHabitsCommand
import org.isoron.uhabits.core.commands.EditHabitCommand import org.isoron.uhabits.core.commands.EditHabitCommand
import org.isoron.uhabits.core.commands.UnarchiveHabitsCommand import org.isoron.uhabits.core.commands.UnarchiveHabitsCommand
@ -179,6 +180,11 @@ class ListHabitsScreen
activity.startActivity(intent) activity.startActivity(intent)
} }
override fun showEditHabitGroupScreen(selected: List<HabitGroup>) {
val intent = intentFactory.startEditGroupActivity(activity, selected[0])
activity.startActivity(intent)
}
override fun showFAQScreen() { override fun showFAQScreen() {
val intent = intentFactory.viewFAQ(activity) val intent = intentFactory.viewFAQ(activity)
activity.startActivity(intent) activity.startActivity(intent)
@ -318,6 +324,12 @@ class ListHabitsScreen
command.selected.size command.selected.size
) )
} }
is DeleteHabitGroupsCommand -> {
return activity.resources.getQuantityString(
R.plurals.toast_habits_deleted,
command.selected.size
)
}
is EditHabitCommand -> { is EditHabitCommand -> {
return activity.resources.getQuantityString(R.plurals.toast_habits_changed, 1) return activity.resources.getQuantityString(R.plurals.toast_habits_changed, 1)
} }

@ -82,7 +82,7 @@ class ListHabitsSelectionMenu @Inject constructor(
itemArchive.isVisible = behavior.canArchive() itemArchive.isVisible = behavior.canArchive()
itemUnarchive.isVisible = behavior.canUnarchive() itemUnarchive.isVisible = behavior.canUnarchive()
itemNotify.isVisible = prefs.isDeveloper itemNotify.isVisible = prefs.isDeveloper
activeActionMode?.title = listAdapter.selectedHabits.size.toString() activeActionMode?.title = (listAdapter.selectedHabits.size + listAdapter.selectedHabitGroups.size).toString()
return true return true
} }
override fun onDestroyActionMode(mode: ActionMode?) { override fun onDestroyActionMode(mode: ActionMode?) {

@ -79,11 +79,12 @@ class HabitCardListAdapter @Inject constructor(
*/ */
override fun clearSelection() { override fun clearSelection() {
selectedHabits.clear() selectedHabits.clear()
selectedHabitGroups.clear()
notifyDataSetChanged() notifyDataSetChanged()
observable.notifyListeners() observable.notifyListeners()
} }
override fun getSelected(): List<Habit> { override fun getSelectedHabits(): List<Habit> {
return ArrayList(selectedHabits) return ArrayList(selectedHabits)
} }

@ -8,11 +8,9 @@ import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.isoron.uhabits.AndroidDirFinder
import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.HabitsApplication
import org.isoron.uhabits.R import org.isoron.uhabits.R
import org.isoron.uhabits.activities.AndroidThemeSwitcher import org.isoron.uhabits.activities.AndroidThemeSwitcher
import org.isoron.uhabits.activities.HabitGroupsDirFinder
import org.isoron.uhabits.activities.common.dialogs.ConfirmDeleteDialog import org.isoron.uhabits.activities.common.dialogs.ConfirmDeleteDialog
import org.isoron.uhabits.core.commands.Command import org.isoron.uhabits.core.commands.Command
import org.isoron.uhabits.core.commands.CommandRunner import org.isoron.uhabits.core.commands.CommandRunner
@ -68,9 +66,7 @@ class ShowHabitGroupActivity : AppCompatActivity(), CommandRunner.Listener {
commandRunner = commandRunner, commandRunner = commandRunner,
habitGroup = habitGroup, habitGroup = habitGroup,
habitGroupList = habitGroupList, habitGroupList = habitGroupList,
screen = screen, screen = screen
system = HabitGroupsDirFinder(AndroidDirFinder(this)),
taskRunner = appComponent.taskRunner
) )
menu = ShowHabitGroupMenu( menu = ShowHabitGroupMenu(

@ -19,11 +19,11 @@ class ShowHabitGroupMenu(
fun onOptionsItemSelected(item: MenuItem): Boolean { fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.action_edit_habit_group -> { R.id.action_edit_habit_group -> {
presenter.onEditHabit() presenter.onEditHabitGroup()
return true return true
} }
R.id.action_delete -> { R.id.action_delete -> {
presenter.onDeleteHabit() presenter.onDeleteHabitGroup()
return true return true
} }
} }

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

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

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

Loading…
Cancel
Save