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

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

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

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

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

@ -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>)
}
}

@ -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()

@ -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)
}

Loading…
Cancel
Save