diff --git a/android-base/src/main/java/org/isoron/androidbase/activities/BaseSelectionMenu.java b/android-base/src/main/java/org/isoron/androidbase/activities/BaseSelectionMenu.java index 87396e216..280c469ac 100644 --- a/android-base/src/main/java/org/isoron/androidbase/activities/BaseSelectionMenu.java +++ b/android-base/src/main/java/org/isoron/androidbase/activities/BaseSelectionMenu.java @@ -40,6 +40,8 @@ public abstract class BaseSelectionMenu @Nullable private ActionMode actionMode; + public static boolean duplicateIsSelected = false; + /** * Finishes the selection operation. */ diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplicationComponent.java b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplicationComponent.java index 375d2db34..6185cbb86 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplicationComponent.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplicationComponent.java @@ -54,6 +54,8 @@ public interface HabitsApplicationComponent CreateHabitCommandFactory getCreateHabitCommandFactory(); + DuplicateHabitCommandFactory getDuplicateHabitCommandFactory(); + EditHabitCommandFactory getEditHabitCommandFactory(); GenericImporter getGenericImporter(); diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java index 55ea8e691..ece2b1f2d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java @@ -40,6 +40,7 @@ import org.isoron.uhabits.core.preferences.*; import butterknife.*; import static android.view.View.GONE; +import static org.isoron.androidbase.activities.BaseSelectionMenu.duplicateIsSelected; import static org.isoron.uhabits.core.ui.ThemeSwitcher.THEME_LIGHT; public class EditHabitDialog extends AppCompatDialogFragment @@ -119,23 +120,29 @@ public class EditHabitDialog extends AppCompatDialogFragment protected int getTitle() { - if (originalHabit != null) return R.string.edit_habit; + if (originalHabit != null) { + if(duplicateIsSelected){ + return R.string.duplicate_habit; + }else{ + return R.string.edit_habit;} + } else return R.string.create_habit; } protected void saveHabit(@NonNull Habit habit) { if (originalHabit == null) - { commandRunner.execute(component - .getCreateHabitCommandFactory() - .create(habitList, habit), null); - } + .getCreateHabitCommandFactory() + .create(habitList, habit), null); else - { + if (duplicateIsSelected){ + commandRunner.execute(component + .getDuplicateHabitCommandFactory() + .create(habitList, habit), null); + }else { commandRunner.execute(component.getEditHabitCommandFactory(). - create(habitList, originalHabit, habit), originalHabit.getId()); - } + create(habitList, originalHabit, habit), originalHabit.getId());} } private int getTypeFromArguments() diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt index bda22a46e..cc3f8fb8a 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt @@ -230,6 +230,7 @@ class ListHabitsScreen is ChangeHabitColorCommand -> return R.string.toast_habit_changed is CreateHabitCommand -> return R.string.toast_habit_created is DeleteHabitsCommand -> return R.string.toast_habit_deleted + is DuplicateHabitCommand -> return R.string.toast_habit_duplicated is EditHabitCommand -> return R.string.toast_habit_changed is UnarchiveHabitsCommand -> return R.string.toast_habit_unarchived else -> return null diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.kt index 9493b651d..8cf86d4c9 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.kt @@ -64,6 +64,12 @@ class ListHabitsSelectionMenu @Inject constructor( return true } + R.id.action_duplicate -> { + duplicateIsSelected = true + behavior.onDuplicateHabits() + return true + } + R.id.action_color -> { behavior.onChangeColor() return true diff --git a/uhabits-android/src/main/res/menu/list_habits_selection.xml b/uhabits-android/src/main/res/menu/list_habits_selection.xml index 4f274e39e..9191edcd3 100644 --- a/uhabits-android/src/main/res/menu/list_habits_selection.xml +++ b/uhabits-android/src/main/res/menu/list_habits_selection.xml @@ -46,4 +46,9 @@ android:title="@string/delete" app:showAsAction="never"/> + + \ No newline at end of file diff --git a/uhabits-android/src/main/res/values/strings.xml b/uhabits-android/src/main/res/values/strings.xml index fc2906bd9..348152d84 100644 --- a/uhabits-android/src/main/res/values/strings.xml +++ b/uhabits-android/src/main/res/values/strings.xml @@ -22,6 +22,7 @@ Loop Habit Tracker Habits Settings + Duplicate Edit Delete Archive @@ -31,6 +32,7 @@ Habit created Habit deleted + Habit duplicated Habits restored Nothing to undo Nothing to redo @@ -60,6 +62,7 @@ You can have at most one repetition per day Create habit Edit habit + Duplicate habit Check Later @@ -100,6 +103,7 @@ To rearrange the entries, press-and-hold on the name of the habit, then drag it to the correct place. You can see more days by putting your phone in landscape mode. Delete Habit + Delete Habits The habit will be permanently deleted. This action cannot be undone. Habit deleted / not found Weekends diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/DuplicateHabitCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/DuplicateHabitCommand.java new file mode 100644 index 000000000..eac78c8d9 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/DuplicateHabitCommand.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2016 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.core.commands; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import com.google.auto.factory.AutoFactory; +import com.google.auto.factory.Provided; + +import org.isoron.uhabits.core.models.Habit; +import org.isoron.uhabits.core.models.HabitList; +import org.isoron.uhabits.core.models.HabitNotFoundException; +import org.isoron.uhabits.core.models.ModelFactory; + +/** + * Command to create a habit. + */ +@AutoFactory +public class DuplicateHabitCommand extends Command +{ + ModelFactory modelFactory; + + HabitList habitList; + + @NonNull + Habit model; + + @Nullable + Long savedId; + + public DuplicateHabitCommand(@Provided @NonNull ModelFactory modelFactory, + @NonNull HabitList habitList, + @NonNull Habit model) + { + this.modelFactory = modelFactory; + this.habitList = habitList; + this.model = model; + } + + @Override + public void execute() + { + Habit savedHabit = modelFactory.buildHabit(); + savedHabit.copyFrom(model); + savedHabit.setId(savedId); + + habitList.add(savedHabit); + savedId = savedHabit.getId(); + } + + @NonNull + @Override + public Record toRecord() + { + return new Record(this); + } + + @Override + public void undo() + { + if (savedId == null) throw new IllegalStateException(); + + Habit habit = habitList.getById(savedId); + if (habit == null) throw new HabitNotFoundException(); + + habitList.remove(habit); + } + + public static class Record + { + @NonNull + public String id; + + @NonNull + public String event = "CreateHabit"; + + @NonNull + public Habit.HabitData habit; + + @Nullable + public Long savedId; + + public Record(DuplicateHabitCommand command) + { + id = command.getId(); + habit = command.model.getData(); + savedId = command.savedId; + } + + public DuplicateHabitCommand toCommand(@NonNull ModelFactory modelFactory, + @NonNull HabitList habitList) + { + Habit h = modelFactory.buildHabit(habit); + + DuplicateHabitCommand command; + command = new DuplicateHabitCommand(modelFactory, habitList, h); + command.savedId = savedId; + command.setId(id); + return command; + } + } +} \ No newline at end of file diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java index 36d21e9ea..2502e1d59 100644 --- a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java @@ -109,6 +109,11 @@ public class ListHabitsSelectionMenuBehavior }); } + public void onDuplicateHabits() + { + screen.showEditHabitsScreen(adapter.getSelected()); + } + public void onEditHabits() { screen.showEditHabitsScreen(adapter.getSelected());