diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsSelectionMenu.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsSelectionMenu.java index a9eb8d747..114523bae 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsSelectionMenu.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsSelectionMenu.java @@ -79,22 +79,22 @@ public class ListHabitsSelectionMenu extends BaseSelectionMenu switch (item.getItemId()) { case R.id.action_edit_habit: - edit(firstHabit); + showEditScreen(firstHabit); finish(); return true; case R.id.action_archive_habit: - archive(selected); + performArchive(selected); finish(); return true; case R.id.action_unarchive_habit: - unarchive(selected); + performUnarchive(selected); finish(); return true; case R.id.action_delete: - delete(selected); + performDelete(selected); return true; case R.id.action_color: @@ -164,24 +164,26 @@ public class ListHabitsSelectionMenu extends BaseSelectionMenu return R.menu.list_habits_selection; } - private void archive(@NonNull List selected) + private void performArchive(@NonNull List selected) { commandRunner.execute(new ArchiveHabitsCommand(habitList, selected), null); } - private void delete(@NonNull List selected) + private void performDelete(@NonNull List selected) { screen.showDeleteConfirmationScreen(() -> { + listAdapter.performRemove(selected); commandRunner.execute(new DeleteHabitsCommand(habitList, selected), null); finish(); }); } - private void edit(@NonNull Habit firstHabit) + private void performUnarchive(@NonNull List selected) { - screen.showEditHabitScreen(firstHabit); + commandRunner.execute(new UnarchiveHabitsCommand(habitList, selected), + null); } private void showColorPicker(@NonNull List selected, @@ -194,9 +196,8 @@ public class ListHabitsSelectionMenu extends BaseSelectionMenu }); } - private void unarchive(@NonNull List selected) + private void showEditScreen(@NonNull Habit firstHabit) { - commandRunner.execute(new UnarchiveHabitsCommand(habitList, selected), - null); + screen.showEditHabitScreen(firstHabit); } } diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java index fd0ba6778..d0d877df2 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java @@ -83,7 +83,7 @@ public class HabitCardListController implements HabitCardListView.Controller Habit habitFrom = adapter.getItem(from); Habit habitTo = adapter.getItem(to); - adapter.reorder(from, to); + adapter.performReorder(from, to); if (habitListener != null) habitListener.onHabitReorder(habitFrom, habitTo); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListAdapter.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListAdapter.java index a0f091e1b..87450be63 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListAdapter.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListAdapter.java @@ -145,7 +145,7 @@ public class HabitCardListAdapter if (listView == null) return; Habit habit = cache.getHabitByPosition(position); - int score = cache.getScore(habit.getId()); + int score = cache.getScore(habit.getId()); int checkmarks[] = cache.getCheckmarks(habit.getId()); boolean selected = this.selected.contains(habit); @@ -199,9 +199,21 @@ public class HabitCardListAdapter observable.notifyListeners(); } - public void refresh() + /** + * Removes a list of habits from the adapter. + *

+ * Note that this only has effect on the adapter cache. The database is not + * modified, and the change is lost when the cache is refreshed. This method + * is useful for making the ListView more responsive: while we wait for the + * database operation to finish, the cache can be modified to reflect the + * changes immediately. + * + * @param habits list of habits to be removed + */ + public void performRemove(List habits) { - cache.refreshAllHabits(); + for (Habit h : habits) + cache.remove(h.getId()); } /** @@ -216,10 +228,14 @@ public class HabitCardListAdapter * @param from the habit that should be moved * @param to the habit that currently occupies the desired position */ - public void reorder(int from, int to) + public void performReorder(int from, int to) { cache.reorder(from, to); - notifyItemMoved(from, to); + } + + public void refresh() + { + cache.refreshAllHabits(); } public void setFilter(HabitMatcher matcher) diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java index 6c622121c..119c089b3 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java @@ -165,6 +165,20 @@ public class HabitCardListCache implements CommandRunner.Listener this.progressBar = progressBar; } + public void remove(@NonNull Long id) + { + Habit h = data.id_to_habit.get(id); + if(h == null) return; + + int position = data.habits.indexOf(h); + data.habits.remove(position); + data.id_to_habit.remove(id); + data.checkmarks.remove(id); + data.scores.remove(id); + + if (listener != null) listener.onItemRemoved(position); + } + /** * Interface definition for a callback to be invoked when the data on the * cache has been modified. @@ -298,6 +312,8 @@ public class HabitCardListCache implements CommandRunner.Listener protected void onPreExecute() { super.onPreExecute(); + progressBar.setTotal(0); + new Handler().postDelayed(() -> { if (getStatus() == Status.RUNNING) progressBar.show(); }, 1000); @@ -367,16 +383,7 @@ public class HabitCardListCache implements CommandRunner.Listener Set removed = new TreeSet<>(before); removed.removeAll(after); - for (Long id : removed) - { - Habit h = data.id_to_habit.get(id); - int position = data.habits.indexOf(h); - data.habits.remove(position); - data.id_to_habit.remove(id); - data.checkmarks.remove(id); - data.scores.remove(id); - if (listener != null) listener.onItemRemoved(position); - } + for (Long id : removed) remove(id); } } } diff --git a/app/src/test/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListControllerTest.java b/app/src/test/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListControllerTest.java index a72479585..8f545ef77 100644 --- a/app/src/test/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListControllerTest.java +++ b/app/src/test/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListControllerTest.java @@ -119,7 +119,7 @@ public class HabitCardListControllerTest extends BaseUnitTest controller.drop(1, 3); verify(habitListener).onHabitReorder(habits.get(1), habits.get(3)); verify(selectionListener).onSelectionFinish(); - verify(adapter).reorder(1, 3); + verify(adapter).performReorder(1, 3); resetMocks(); } @@ -134,7 +134,7 @@ public class HabitCardListControllerTest extends BaseUnitTest controller.drop(0, 3); verify(habitListener).onHabitReorder(habits.get(0), habits.get(3)); verify(selectionListener).onSelectionFinish(); - verify(adapter).reorder(0, 3); + verify(adapter).performReorder(0, 3); verify(adapter).clearSelection(); }