diff --git a/app/src/androidTest/assets/views/common/FrequencyChart/render.png b/app/src/androidTest/assets/views/common/FrequencyChart/render.png index 70ec73c84..7486c9d95 100644 Binary files a/app/src/androidTest/assets/views/common/FrequencyChart/render.png and b/app/src/androidTest/assets/views/common/FrequencyChart/render.png differ diff --git a/app/src/androidTest/assets/views/common/FrequencyChart/renderDifferentSize.png b/app/src/androidTest/assets/views/common/FrequencyChart/renderDifferentSize.png index 7dd7a684c..85484946b 100644 Binary files a/app/src/androidTest/assets/views/common/FrequencyChart/renderDifferentSize.png and b/app/src/androidTest/assets/views/common/FrequencyChart/renderDifferentSize.png differ diff --git a/app/src/androidTest/assets/views/common/FrequencyChart/renderTransparent.png b/app/src/androidTest/assets/views/common/FrequencyChart/renderTransparent.png index 70ec73c84..7486c9d95 100644 Binary files a/app/src/androidTest/assets/views/common/FrequencyChart/renderTransparent.png and b/app/src/androidTest/assets/views/common/FrequencyChart/renderTransparent.png differ diff --git a/app/src/androidTest/assets/views/common/ScoreChart/render.png b/app/src/androidTest/assets/views/common/ScoreChart/render.png index 4f606e5e9..282d77a73 100644 Binary files a/app/src/androidTest/assets/views/common/ScoreChart/render.png and b/app/src/androidTest/assets/views/common/ScoreChart/render.png differ diff --git a/app/src/androidTest/assets/views/common/ScoreChart/renderDataOffset.png b/app/src/androidTest/assets/views/common/ScoreChart/renderDataOffset.png index a6eab96e6..6c83dd267 100644 Binary files a/app/src/androidTest/assets/views/common/ScoreChart/renderDataOffset.png and b/app/src/androidTest/assets/views/common/ScoreChart/renderDataOffset.png differ diff --git a/app/src/androidTest/assets/views/common/ScoreChart/renderDifferentSize.png b/app/src/androidTest/assets/views/common/ScoreChart/renderDifferentSize.png index 8eb052d73..7331065f4 100644 Binary files a/app/src/androidTest/assets/views/common/ScoreChart/renderDifferentSize.png and b/app/src/androidTest/assets/views/common/ScoreChart/renderDifferentSize.png differ diff --git a/app/src/androidTest/assets/views/common/ScoreChart/renderMonthly.png b/app/src/androidTest/assets/views/common/ScoreChart/renderMonthly.png index 75f74d515..07f5f8065 100644 Binary files a/app/src/androidTest/assets/views/common/ScoreChart/renderMonthly.png and b/app/src/androidTest/assets/views/common/ScoreChart/renderMonthly.png differ diff --git a/app/src/androidTest/assets/views/common/ScoreChart/renderTransparent.png b/app/src/androidTest/assets/views/common/ScoreChart/renderTransparent.png index 0b7f70a7e..a8a901967 100644 Binary files a/app/src/androidTest/assets/views/common/ScoreChart/renderTransparent.png and b/app/src/androidTest/assets/views/common/ScoreChart/renderTransparent.png differ diff --git a/app/src/androidTest/assets/views/common/ScoreChart/renderYearly.png b/app/src/androidTest/assets/views/common/ScoreChart/renderYearly.png index d186ceefc..4a1b5c2a1 100644 Binary files a/app/src/androidTest/assets/views/common/ScoreChart/renderYearly.png and b/app/src/androidTest/assets/views/common/ScoreChart/renderYearly.png differ diff --git a/app/src/androidTest/assets/views/habits/list/HabitCardView/render.png b/app/src/androidTest/assets/views/habits/list/HabitCardView/render.png index 9144a5077..420f5a7a1 100644 Binary files a/app/src/androidTest/assets/views/habits/list/HabitCardView/render.png and b/app/src/androidTest/assets/views/habits/list/HabitCardView/render.png differ diff --git a/app/src/androidTest/assets/views/habits/list/HabitCardView/render_changed.png b/app/src/androidTest/assets/views/habits/list/HabitCardView/render_changed.png index 4533ccec4..420f5a7a1 100644 Binary files a/app/src/androidTest/assets/views/habits/list/HabitCardView/render_changed.png and b/app/src/androidTest/assets/views/habits/list/HabitCardView/render_changed.png differ diff --git a/app/src/androidTest/assets/views/habits/list/HabitCardView/render_selected.png b/app/src/androidTest/assets/views/habits/list/HabitCardView/render_selected.png index 97b15373d..12c880f0b 100644 Binary files a/app/src/androidTest/assets/views/habits/list/HabitCardView/render_selected.png and b/app/src/androidTest/assets/views/habits/list/HabitCardView/render_selected.png differ diff --git a/app/src/androidTest/assets/views/habits/list/HeaderView/render.png b/app/src/androidTest/assets/views/habits/list/HeaderView/render.png new file mode 100644 index 000000000..7023ecd0d Binary files /dev/null and b/app/src/androidTest/assets/views/habits/list/HeaderView/render.png differ diff --git a/app/src/androidTest/assets/views/habits/list/HeaderView/render_reverse.png b/app/src/androidTest/assets/views/habits/list/HeaderView/render_reverse.png new file mode 100644 index 000000000..127b9becd Binary files /dev/null and b/app/src/androidTest/assets/views/habits/list/HeaderView/render_reverse.png differ diff --git a/app/src/androidTest/assets/views/habits/list/NumberButtonView/render_above.png b/app/src/androidTest/assets/views/habits/list/NumberButtonView/render_above.png new file mode 100644 index 000000000..e6f163935 Binary files /dev/null and b/app/src/androidTest/assets/views/habits/list/NumberButtonView/render_above.png differ diff --git a/app/src/androidTest/assets/views/habits/list/NumberButtonView/render_below.png b/app/src/androidTest/assets/views/habits/list/NumberButtonView/render_below.png new file mode 100644 index 000000000..4f6994f6b Binary files /dev/null and b/app/src/androidTest/assets/views/habits/list/NumberButtonView/render_below.png differ diff --git a/app/src/androidTest/assets/views/habits/list/NumberButtonView/render_zero.png b/app/src/androidTest/assets/views/habits/list/NumberButtonView/render_zero.png new file mode 100644 index 000000000..5a1c2edaf Binary files /dev/null and b/app/src/androidTest/assets/views/habits/list/NumberButtonView/render_zero.png differ diff --git a/app/src/androidTest/assets/views/habits/show/FrequencyCard/render.png b/app/src/androidTest/assets/views/habits/show/FrequencyCard/render.png index 1e050904c..4618f3cae 100644 Binary files a/app/src/androidTest/assets/views/habits/show/FrequencyCard/render.png and b/app/src/androidTest/assets/views/habits/show/FrequencyCard/render.png differ diff --git a/app/src/androidTest/assets/views/habits/show/HistoryCard/render.png b/app/src/androidTest/assets/views/habits/show/HistoryCard/render.png index 7cde393d2..905274e8d 100644 Binary files a/app/src/androidTest/assets/views/habits/show/HistoryCard/render.png and b/app/src/androidTest/assets/views/habits/show/HistoryCard/render.png differ diff --git a/app/src/androidTest/assets/views/habits/show/OverviewCard/render.png b/app/src/androidTest/assets/views/habits/show/OverviewCard/render.png index d3f6cb13c..3f064bf16 100644 Binary files a/app/src/androidTest/assets/views/habits/show/OverviewCard/render.png and b/app/src/androidTest/assets/views/habits/show/OverviewCard/render.png differ diff --git a/app/src/androidTest/assets/views/habits/show/ScoreCard/render.png b/app/src/androidTest/assets/views/habits/show/ScoreCard/render.png index e604ba958..25cb2b29c 100644 Binary files a/app/src/androidTest/assets/views/habits/show/ScoreCard/render.png and b/app/src/androidTest/assets/views/habits/show/ScoreCard/render.png differ diff --git a/app/src/androidTest/assets/views/widgets/CheckmarkWidget/render.png b/app/src/androidTest/assets/views/widgets/CheckmarkWidget/render.png index 9f497ed59..c8244e281 100644 Binary files a/app/src/androidTest/assets/views/widgets/CheckmarkWidget/render.png and b/app/src/androidTest/assets/views/widgets/CheckmarkWidget/render.png differ diff --git a/app/src/androidTest/assets/views/widgets/CheckmarkWidgetView/checked.png b/app/src/androidTest/assets/views/widgets/CheckmarkWidgetView/checked.png index 1437a510b..0aa74bdac 100644 Binary files a/app/src/androidTest/assets/views/widgets/CheckmarkWidgetView/checked.png and b/app/src/androidTest/assets/views/widgets/CheckmarkWidgetView/checked.png differ diff --git a/app/src/androidTest/assets/views/widgets/CheckmarkWidgetView/large_size.png b/app/src/androidTest/assets/views/widgets/CheckmarkWidgetView/large_size.png index bcc1fcf9b..f4e57bd9c 100644 Binary files a/app/src/androidTest/assets/views/widgets/CheckmarkWidgetView/large_size.png and b/app/src/androidTest/assets/views/widgets/CheckmarkWidgetView/large_size.png differ diff --git a/app/src/androidTest/assets/views/widgets/FrequencyWidget/render.png b/app/src/androidTest/assets/views/widgets/FrequencyWidget/render.png index d32b9b837..541a82375 100644 Binary files a/app/src/androidTest/assets/views/widgets/FrequencyWidget/render.png and b/app/src/androidTest/assets/views/widgets/FrequencyWidget/render.png differ diff --git a/app/src/androidTest/assets/views/widgets/ScoreWidget/render.png b/app/src/androidTest/assets/views/widgets/ScoreWidget/render.png index 382bb867d..6d7d0bb9a 100644 Binary files a/app/src/androidTest/assets/views/widgets/ScoreWidget/render.png and b/app/src/androidTest/assets/views/widgets/ScoreWidget/render.png differ diff --git a/app/src/androidTest/assets/views/widgets/StreakWidget/render.png b/app/src/androidTest/assets/views/widgets/StreakWidget/render.png index 7aa31f345..b119b2a50 100644 Binary files a/app/src/androidTest/assets/views/widgets/StreakWidget/render.png and b/app/src/androidTest/assets/views/widgets/StreakWidget/render.png differ diff --git a/app/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java b/app/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java index f01b0f969..0b141a41d 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java +++ b/app/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java @@ -29,15 +29,14 @@ import org.isoron.uhabits.utils.*; import org.isoron.uhabits.widgets.*; import java.io.*; +import java.util.*; import static android.view.View.MeasureSpec.*; import static junit.framework.Assert.*; public class BaseViewTest extends BaseAndroidTest { - protected static final double DEFAULT_SIMILARITY_CUTOFF = 0.09; - - public static final int HISTOGRAM_BIN_SIZE = 8; + protected static final double DEFAULT_SIMILARITY_CUTOFF = 0.001; private double similarityCutoff; @@ -67,11 +66,10 @@ public class BaseViewTest extends BaseAndroidTest Bitmap scaledExpected = Bitmap.createScaledBitmap(expected, width, height, true); - double distance; boolean similarEnough = true; + double distance = distance(actual, scaledExpected); - if ((distance = compareHistograms(getHistogram(actual), - getHistogram(scaledExpected))) > similarityCutoff) + if (distance > similarityCutoff) { similarEnough = false; errorMessage.append(String.format( @@ -144,58 +142,47 @@ public class BaseViewTest extends BaseAndroidTest e.recycle(); } - private double compareHistograms(int[][] actualHistogram, - int[][] expectedHistogram) - { - long diff = 0; - long total = 0; - - for (int i = 0; i < 256 / HISTOGRAM_BIN_SIZE; i++) - { - diff += Math.abs(actualHistogram[0][i] - expectedHistogram[0][i]); - diff += Math.abs(actualHistogram[1][i] - expectedHistogram[1][i]); - diff += Math.abs(actualHistogram[2][i] - expectedHistogram[2][i]); - diff += Math.abs(actualHistogram[3][i] - expectedHistogram[3][i]); - - total += actualHistogram[0][i]; - total += actualHistogram[1][i]; - total += actualHistogram[2][i]; - total += actualHistogram[3][i]; - } - - return (double) diff / total / 2; - } - private Bitmap getBitmapFromAssets(String path) throws IOException { InputStream stream = testContext.getAssets().open(path); return BitmapFactory.decodeStream(stream); } - private int[][] getHistogram(Bitmap bitmap) + private double distance(Bitmap b1, Bitmap b2) { - int histogram[][] = new int[4][256 / HISTOGRAM_BIN_SIZE]; + if(b1.getWidth() != b2.getWidth()) return 1.0; + if(b1.getHeight() != b2.getHeight()) return 1.0; + + Random random = new Random(); - for (int x = 0; x < bitmap.getWidth(); x++) + double distance = 0.0; + for (int x = 0; x < b1.getWidth(); x++) { - for (int y = 0; y < bitmap.getHeight(); y++) + for (int y = 0; y < b1.getHeight(); y++) { - int color = bitmap.getPixel(x, y); - int[] argb = new int[]{ - (color >> 24) & 0xff, //alpha - (color >> 16) & 0xff, //red - (color >> 8) & 0xff, //green - (color) & 0xff //blue - }; - - histogram[0][argb[0] / HISTOGRAM_BIN_SIZE]++; - histogram[1][argb[1] / HISTOGRAM_BIN_SIZE]++; - histogram[2][argb[2] / HISTOGRAM_BIN_SIZE]++; - histogram[3][argb[3] / HISTOGRAM_BIN_SIZE]++; + if(random.nextInt(4) != 0) continue; + + int[] argb1 = colorToArgb(b1.getPixel(x, y)); + int[] argb2 = colorToArgb(b2.getPixel(x, y)); + distance += Math.abs(argb1[0] - argb2[0]); + distance += Math.abs(argb1[1] - argb2[1]); + distance += Math.abs(argb1[2] - argb2[2]); + distance += Math.abs(argb1[3] - argb2[3]); } } - return histogram; + distance /= (0xff * 16) * b1.getWidth() * b1.getHeight(); + return distance; + } + + private int[] colorToArgb(int c1) + { + return new int[]{ + (c1 >> 24) & 0xff, //alpha + (c1 >> 16) & 0xff, //red + (c1 >> 8) & 0xff, //green + (c1) & 0xff //blue + }; } private String getVersionedViewAssetPath(String path) diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.java b/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.java index 162f56b9b..172ce43e5 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.java +++ b/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.java @@ -63,6 +63,7 @@ public class HabitCardViewTest extends BaseViewTest view.setSelected(false); view.setScore(habit.getScores().getTodayValue()); view.setController(controller); + view.setButtonCount(6); measureView(view, dpToPixels(400), dpToPixels(50)); } @@ -86,6 +87,7 @@ public class HabitCardViewTest extends BaseViewTest habit.setName("Wake up early"); habit.setColor(2); habit.getObservable().notifyListeners(); + Thread.sleep(500); assertRenders(view, PATH + "render_changed.png"); } } diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java b/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java new file mode 100644 index 000000000..852532da1 --- /dev/null +++ b/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java @@ -0,0 +1,83 @@ +/* + * 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.activities.habits.list.views; + +import android.support.test.filters.*; +import android.support.test.runner.*; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.preferences.*; +import org.isoron.uhabits.utils.*; +import org.junit.*; +import org.junit.runner.*; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; + +@RunWith(AndroidJUnit4.class) +@MediumTest +public class HeaderViewTest extends BaseViewTest +{ + public static final String PATH = "habits/list/HeaderView/"; + + private HeaderView view; + + private Preferences prefs; + + private MidnightTimer midnightTimer; + + @Override + @Before + public void setUp() + { + super.setUp(); + setSimilarityCutoff(0); + + prefs = mock(Preferences.class); + midnightTimer = mock(MidnightTimer.class); + view = new HeaderView(targetContext, prefs, midnightTimer); + view.setButtonCount(5); + measureView(view, dpToPixels(600), dpToPixels(48)); + } + + @Test + public void testRender() throws Exception + { + when(prefs.shouldReverseCheckmarks()).thenReturn(false); + + assertRenders(view, PATH + "render.png"); + + verify(prefs).shouldReverseCheckmarks(); + verifyNoMoreInteractions(prefs); + } + + @Test + public void testRender_reverse() throws Exception + { + when(prefs.shouldReverseCheckmarks()).thenReturn(true); + + assertRenders(view, PATH + "render_reverse.png"); + + verify(prefs).shouldReverseCheckmarks(); + verifyNoMoreInteractions(prefs); + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonViewTest.java b/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonViewTest.java new file mode 100644 index 000000000..296cfbf71 --- /dev/null +++ b/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonViewTest.java @@ -0,0 +1,113 @@ +/* + * 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.activities.habits.list.views; + +import android.support.test.filters.*; +import android.support.test.runner.*; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.activities.habits.list.controllers.*; +import org.isoron.uhabits.utils.*; +import org.junit.*; +import org.junit.runner.*; + +import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.Matchers.*; +import static org.mockito.Mockito.*; + +@RunWith(AndroidJUnit4.class) +@MediumTest +public class NumberButtonViewTest extends BaseViewTest +{ + public static final String PATH = "habits/list/NumberButtonView/"; + + private NumberButtonView view; + + private NumberButtonController controller; + + @Override + @Before + public void setUp() + { + super.setUp(); + setSimilarityCutoff(0.015f); + + view = new NumberButtonView(targetContext); + + view.setUnit("steps"); + view.setThreshold(100.0); + view.setColor(ColorUtils.getAndroidTestColor(5)); + + measureView(view, dpToPixels(48), dpToPixels(48)); + + controller = mock(NumberButtonController.class); + view.setController(controller); + } + + @Test + public void testFormatValue() + { + assertThat(NumberButtonView.formatValue(0.1235), equalTo("0.12")); + assertThat(NumberButtonView.formatValue(0.1000), equalTo("0.1")); + assertThat(NumberButtonView.formatValue(5.0), equalTo("5")); + assertThat(NumberButtonView.formatValue(5.25), equalTo("5.25")); + assertThat(NumberButtonView.formatValue(12.3456), equalTo("12.3")); + assertThat(NumberButtonView.formatValue(123.123), equalTo("123")); + assertThat(NumberButtonView.formatValue(321.2), equalTo("321")); + assertThat(NumberButtonView.formatValue(4321.2), equalTo("4.3k")); + assertThat(NumberButtonView.formatValue(54321.2), equalTo("54.3k")); + assertThat(NumberButtonView.formatValue(654321.2), equalTo("654k")); + assertThat(NumberButtonView.formatValue(7654321.2), equalTo("7.7M")); + assertThat(NumberButtonView.formatValue(87654321.2), equalTo("87.7M")); + assertThat(NumberButtonView.formatValue(987654321.2), equalTo("988M")); + assertThat(NumberButtonView.formatValue(1987654321.2), equalTo("2.0G")); + } + + @Test + public void testRender_aboveThreshold() throws Exception + { + view.setValue(500); + assertRenders(view, PATH + "render_above.png"); + } + + @Test + public void testRender_belowThreshold() throws Exception + { + view.setValue(99); + assertRenders(view, PATH + "render_below.png"); + } + + @Test + public void testRender_zero() throws Exception + { + view.setValue(0); + assertRenders(view, PATH + "render_zero.png"); + } + + @Test + public void test_click() + { + view.performClick(); + verify(controller).onClick(); + + view.performLongClick(); + verify(controller).onLongClick(); + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java b/app/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java index 4d97a7d4e..10d7bd870 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java +++ b/app/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java @@ -25,7 +25,6 @@ import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; -import org.isoron.uhabits.widgets.*; import org.junit.*; import org.junit.runner.*; @@ -37,7 +36,7 @@ import static org.isoron.uhabits.models.Checkmark.*; @MediumTest public class CheckmarkWidgetTest extends BaseViewTest { - private static final String PATH = "widgets/CheckmarkWidgetView/"; + private static final String PATH = "widgets/CheckmarkWidget/"; private Habit habit; @@ -49,6 +48,8 @@ public class CheckmarkWidgetTest extends BaseViewTest public void setUp() { super.setUp(); + setTheme(R.style.TransparentWidgetTheme); + habit = fixtures.createShortHabit(); checkmarks = habit.getCheckmarks(); CheckmarkWidget widget = new CheckmarkWidget(targetContext, 0, habit); @@ -80,6 +81,6 @@ public class CheckmarkWidgetTest extends BaseViewTest @Test public void testRender() throws Exception { - assertRenders(view, PATH + "checked.png"); + assertRenders(view, PATH + "render.png"); } } diff --git a/app/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java b/app/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java index 65c3fbef9..d339fb3d6 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java +++ b/app/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java @@ -38,8 +38,6 @@ public class CheckmarkWidgetViewTest extends BaseViewTest private CheckmarkWidgetView view; - private Habit habit; - @Override @Before public void setUp() @@ -47,13 +45,12 @@ public class CheckmarkWidgetViewTest extends BaseViewTest super.setUp(); setTheme(R.style.TransparentWidgetTheme); - habit = fixtures.createShortHabit(); + Habit habit = fixtures.createShortHabit(); view = new CheckmarkWidgetView(targetContext); - int color = ColorUtils.getAndroidTestColor(habit.getColor()); double score = habit.getScores().getTodayValue(); float percentage = (float) score; - view.setActiveColor(color); + view.setActiveColor(ColorUtils.getAndroidTestColor(0)); view.setCheckmarkValue(habit.getCheckmarks().getTodayValue()); view.setPercentage(percentage); view.setName(habit.getName()); diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java index fcd61e82b..0200471a9 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java @@ -116,14 +116,14 @@ public class HabitCardView extends FrameLayout public void setHabit(@NonNull Habit habit) { - if (this.habit != null) detachFromHabit(); + if (isAttachedToWindow()) stopListening(); this.habit = habit; checkmarkPanel.setHabit(habit); numberPanel.setHabit(habit); - refresh(); - attachToHabit(); + refresh(); + if (isAttachedToWindow()) startListening(); postInvalidate(); } @@ -177,20 +177,17 @@ public class HabitCardView extends FrameLayout } @Override - protected void onDetachedFromWindow() - { - if (habit != null) detachFromHabit(); - super.onDetachedFromWindow(); - } - - private void attachToHabit() + protected void onAttachedToWindow() { - if (habit != null) habit.getObservable().addListener(this); + super.onAttachedToWindow(); + stopListening(); } - private void detachFromHabit() + @Override + protected void onDetachedFromWindow() { - if (habit != null) habit.getObservable().removeListener(this); + startListening(); + super.onDetachedFromWindow(); } private int getActiveColor(Habit habit) @@ -309,6 +306,16 @@ public class HabitCardView extends FrameLayout postInvalidate(); } + private void startListening() + { + if (habit != null) habit.getObservable().removeListener(this); + } + + private void stopListening() + { + if (habit != null) habit.getObservable().addListener(this); + } + private void triggerRipple(final float x, final float y) { final Drawable background = innerFrame.getBackground(); diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.java index 4eb1f4317..eb6191e1b 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.java @@ -46,18 +46,23 @@ public class HeaderView extends ScrollableChart @Nullable private MidnightTimer midnightTimer; - private final TextPaint paint; + private TextPaint paint; private RectF rect; - public HeaderView(Context context, AttributeSet attrs) + public HeaderView(@NonNull Context context, + @NonNull Preferences prefs, + @NonNull MidnightTimer midnightTimer) { - super(context, attrs); + super(context); + this.prefs = prefs; + this.midnightTimer = midnightTimer; + init(); + } - if (isInEditMode()) - { - setButtonCount(5); - } + public HeaderView(Context context, @Nullable AttributeSet attrs) + { + super(context, attrs); Context appContext = context.getApplicationContext(); if (appContext instanceof HabitsApplication) @@ -68,23 +73,12 @@ public class HeaderView extends ScrollableChart if (context instanceof ListHabitsActivity) { - ListHabitsActivity activity = (ListHabitsActivity) context; - midnightTimer = activity.getListHabitsComponent().getMidnightTimer(); + ListHabitsComponent component = + ((ListHabitsActivity) context).getListHabitsComponent(); + midnightTimer = component.getMidnightTimer(); } - Resources res = context.getResources(); - setScrollerBucketSize((int) res.getDimension(R.dimen.checkmarkWidth)); - - StyledResources sr = new StyledResources(context); - paint = new TextPaint(); - paint.setColor(Color.BLACK); - paint.setAntiAlias(true); - paint.setTextSize(getResources().getDimension(R.dimen.tinyTextSize)); - paint.setTextAlign(Paint.Align.CENTER); - paint.setTypeface(Typeface.DEFAULT_BOLD); - paint.setColor(sr.getColor(R.attr.mediumContrastTextColor)); - - rect = new RectF(); + init(); } @Override @@ -115,14 +109,6 @@ public class HeaderView extends ScrollableChart if (midnightTimer != null) midnightTimer.addListener(this); } - private void updateDirection() - { - int direction = -1; - if (shouldReverseCheckmarks()) direction *= -1; - if (InterfaceUtils.isLayoutRtl(this)) direction *= -1; - setDirection(direction); - } - @Override protected void onDetachedFromWindow() { @@ -131,16 +117,6 @@ public class HeaderView extends ScrollableChart super.onDetachedFromWindow(); } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) - { - int width = MeasureSpec.getSize(widthMeasureSpec); - int height = (int) getContext() - .getResources() - .getDimension(R.dimen.checkmarkHeight); - setMeasuredDimension(width, height); - } - @Override protected void onDraw(Canvas canvas) { @@ -161,7 +137,7 @@ public class HeaderView extends ScrollableChart rect.set(0, 0, width, height); rect.offset(canvas.getWidth(), 0); - if(reverse) rect.offset(- (i + 1) * width, 0); + if (reverse) rect.offset(-(i + 1) * width, 0); else rect.offset((i - buttonCount) * width, 0); if (isRtl) rect.set(canvas.getWidth() - rect.right, rect.top, @@ -170,8 +146,8 @@ public class HeaderView extends ScrollableChart String text = DateUtils.formatHeaderDate(day).toUpperCase(); String[] lines = text.split("\n"); - int y1 = (int)(rect.centerY() - 0.25 * em); - int y2 = (int)(rect.centerY() + 1.25 * em); + int y1 = (int) (rect.centerY() - 0.25 * em); + int y2 = (int) (rect.centerY() + 1.25 * em); canvas.drawText(lines[0], rect.centerX(), y1, paint); canvas.drawText(lines[1], rect.centerX(), y2, paint); @@ -179,9 +155,46 @@ public class HeaderView extends ScrollableChart } } + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = (int) getContext() + .getResources() + .getDimension(R.dimen.checkmarkHeight); + setMeasuredDimension(width, height); + } + + private void init() + { + Resources res = getContext().getResources(); + setScrollerBucketSize((int) res.getDimension(R.dimen.checkmarkWidth)); + + StyledResources sr = new StyledResources(getContext()); + paint = new TextPaint(); + paint.setColor(Color.BLACK); + paint.setAntiAlias(true); + paint.setTextSize(getResources().getDimension(R.dimen.tinyTextSize)); + paint.setTextAlign(Paint.Align.CENTER); + paint.setTypeface(Typeface.DEFAULT_BOLD); + paint.setColor(sr.getColor(R.attr.mediumContrastTextColor)); + + rect = new RectF(); + + if (isInEditMode()) setButtonCount(5); + } + private boolean shouldReverseCheckmarks() { if (prefs == null) return false; return prefs.shouldReverseCheckmarks(); } + + private void updateDirection() + { + int direction = -1; + if (shouldReverseCheckmarks()) direction *= -1; + if (InterfaceUtils.isLayoutRtl(this)) direction *= -1; + setDirection(direction); + } } diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.java index 60279b866..fdfdd6077 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.java @@ -31,7 +31,7 @@ import org.isoron.uhabits.*; import org.isoron.uhabits.activities.habits.list.controllers.*; import org.isoron.uhabits.utils.*; -import java.text.DecimalFormat; +import java.text.*; import static org.isoron.uhabits.utils.AttributeSetUtils.*; import static org.isoron.uhabits.utils.ColorUtils.*; @@ -91,7 +91,6 @@ public class NumberButtonView extends View } /** - * * @param v * @return */ @@ -104,6 +103,7 @@ public class NumberButtonView extends View if (v >= 1e5) return String.format("%.0fk", v / 1e3); if (v >= 1e4) return String.format("%.1fk", v / 1e3); if (v >= 1e3) return String.format("%.1fk", v / 1e3); + if (v >= 1e2) return new DecimalFormat("#").format(v); if (v >= 1e1) return new DecimalFormat("#.#").format(v); return new DecimalFormat("#.##").format(v); } @@ -117,7 +117,11 @@ public class NumberButtonView extends View public void setController(final NumberButtonController controller) { setOnClickListener(v -> controller.onClick()); - setOnLongClickListener(v -> controller.onLongClick()); + setOnLongClickListener(v -> + { + controller.onLongClick(); + return true; + }); } public void setThreshold(double threshold) @@ -142,8 +146,8 @@ public class NumberButtonView extends View protected void onDraw(Canvas canvas) { int activeColor = lightGrey; - if(value > 0 && value < threshold) activeColor = darkGrey; - if(value >= threshold) activeColor = color; + if (value > 0 && value < threshold) activeColor = darkGrey; + if (value >= threshold) activeColor = color; pRegular.setColor(activeColor); pBold.setColor(activeColor); diff --git a/run_tests b/run_tests index e158d0e4f..1391805d6 100755 --- a/run_tests +++ b/run_tests @@ -49,6 +49,9 @@ mkdir -p ${OUTPUT_DIR}/failed adb pull /mnt/sdcard/test-screenshots/ ${OUTPUT_DIR}/failed >> $LOG 2>> $LOG adb pull /storage/sdcard/test-screenshots/ ${OUTPUT_DIR}/failed >> $LOG 2>> $LOG adb pull /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/ ${OUTPUT_DIR}/failed >> $LOG 2>> $LOG + +adb shell rm -r /mnt/sdcard/test-screenshots/ >> $LOG 2>> $LOG +adb shell rm -r /storage/sdcard/test-screenshots/ >> $LOG 2>> $LOG adb shell rm -r /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/ >> $LOG 2>> $LOG info "Fetching logcat..."