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