diff --git a/app/src/androidTest/assets/views/HabitHistoryView/render.png b/app/src/androidTest/assets/views/HabitHistoryView/render.png new file mode 100644 index 000000000..92bfa3727 Binary files /dev/null and b/app/src/androidTest/assets/views/HabitHistoryView/render.png differ diff --git a/app/src/androidTest/assets/views/HabitHistoryView/renderDataOffset.png b/app/src/androidTest/assets/views/HabitHistoryView/renderDataOffset.png new file mode 100644 index 000000000..cb20ba286 Binary files /dev/null and b/app/src/androidTest/assets/views/HabitHistoryView/renderDataOffset.png differ diff --git a/app/src/androidTest/assets/views/HabitHistoryView/renderDifferentSize.png b/app/src/androidTest/assets/views/HabitHistoryView/renderDifferentSize.png new file mode 100644 index 000000000..bf0d14daa Binary files /dev/null and b/app/src/androidTest/assets/views/HabitHistoryView/renderDifferentSize.png differ diff --git a/app/src/androidTest/java/org/isoron/uhabits/unit/views/HabitHistoryViewTest.java b/app/src/androidTest/java/org/isoron/uhabits/unit/views/HabitHistoryViewTest.java new file mode 100644 index 000000000..379db57a9 --- /dev/null +++ b/app/src/androidTest/java/org/isoron/uhabits/unit/views/HabitHistoryViewTest.java @@ -0,0 +1,102 @@ +/* + * 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.unit.views; + +import android.support.test.runner.AndroidJUnit4; +import android.test.suitebuilder.annotation.SmallTest; + +import org.isoron.uhabits.helpers.DateHelper; +import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.unit.HabitFixtures; +import org.isoron.uhabits.views.HabitHistoryView; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class HabitHistoryViewTest extends ViewTest +{ + private Habit habit; + private HabitHistoryView view; + + @Before + public void setup() + { + super.setup(); + + HabitFixtures.purgeHabits(); + HabitFixtures.fixTime(); + + habit = HabitFixtures.createLongHabit(); + + view = new HabitHistoryView(targetContext); + view.setHabit(habit); + measureView(dpToPixels(300), dpToPixels(100), view); + } + + @Test + public void render() throws Throwable + { + assertRenders(view, "HabitHistoryView/render.png"); + } + + @Test + public void render_withDifferentSize() throws Throwable + { + measureView(dpToPixels(200), dpToPixels(200), view); + assertRenders(view, "HabitHistoryView/renderDifferentSize.png"); + } + + @Test + public void render_withDataOffset() throws Throwable + { + view.onScroll(null, null, -300, 0); + view.invalidate(); + + assertRenders(view, "HabitHistoryView/renderDataOffset.png"); + } + + @Test + public void tapDate_withEditableView() throws Throwable + { + view.setIsEditable(true); + tap(view, 280, 30); + waitForAsyncTasks(); + + long today = DateHelper.getStartOfToday(); + assertFalse(habit.repetitions.contains(today)); + } + + @Test + public void tapDate_withReadOnlyView() throws Throwable + { + view.setIsEditable(false); + tap(view, 280, 30); + waitForAsyncTasks(); + + long today = DateHelper.getStartOfToday(); + assertTrue(habit.repetitions.contains(today)); + } + +} diff --git a/app/src/main/java/org/isoron/uhabits/tasks/ToggleRepetitionTask.java b/app/src/main/java/org/isoron/uhabits/tasks/ToggleRepetitionTask.java new file mode 100644 index 000000000..bece42414 --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/tasks/ToggleRepetitionTask.java @@ -0,0 +1,58 @@ +/* + * 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.tasks; + +import org.isoron.uhabits.models.Habit; + +public class ToggleRepetitionTask extends BaseTask +{; + public interface Listener { + void onToggleRepetitionFinished(); + } + + private Listener listener; + private final Habit habit; + private final Long timestamp; + + public ToggleRepetitionTask(Habit habit, Long timestamp) + { + this.timestamp = timestamp; + this.habit = habit; + } + + @Override + protected Void doInBackground(Void... params) + { + habit.repetitions.toggle(timestamp); + return null; + } + + @Override + protected void onPostExecute(Void aVoid) + { + if(listener != null) listener.onToggleRepetitionFinished(); + super.onPostExecute(null); + } + + public void setListener(Listener listener) + { + this.listener = listener; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index 9a8c32020..462277ce9 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -25,14 +25,14 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Align; import android.graphics.Rect; -import android.os.AsyncTask; import android.util.AttributeSet; import android.view.MotionEvent; +import org.isoron.uhabits.R; import org.isoron.uhabits.helpers.ColorHelper; import org.isoron.uhabits.helpers.DateHelper; -import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.tasks.ToggleRepetitionTask; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -40,7 +40,8 @@ import java.util.GregorianCalendar; import java.util.Locale; import java.util.Random; -public class HabitHistoryView extends ScrollableDataView implements HabitDataView +public class HabitHistoryView extends ScrollableDataView implements HabitDataView, + ToggleRepetitionTask.Listener { private Habit habit; private int[] checkmarks; @@ -69,12 +70,15 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie private int textColor; private boolean isEditable; + public HabitHistoryView(Context context) + { + super(context); + init(); + } + public HabitHistoryView(Context context, AttributeSet attrs) { super(context, attrs); - this.primaryColor = ColorHelper.palette[7]; - this.checkmarks = new int[0]; - this.isEditable = false; init(); } @@ -92,6 +96,9 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie createPaints(); createColors(); + isEditable = false; + checkmarks = new int[0]; + primaryColor = ColorHelper.palette[7]; wdays = DateHelper.getShortDayNames(); dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); dfYear = new SimpleDateFormat("yyyy", Locale.getDefault()); @@ -344,22 +351,9 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie final Long timestamp = positionToTimestamp(x, y); if(timestamp == null) return false; - new AsyncTask() - { - @Override - protected Void doInBackground(Void... params) - { - habit.repetitions.toggle(timestamp); - return null; - } - - @Override - protected void onPostExecute(Void aVoid) - { - refreshData(); - invalidate(); - } - }.execute(); + ToggleRepetitionTask task = new ToggleRepetitionTask(habit, timestamp); + task.setListener(this); + task.execute(); return true; } @@ -386,4 +380,12 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie { this.isEditable = isEditable; } + + + @Override + public void onToggleRepetitionFinished() + { + refreshData(); + invalidate(); + } }