From e2d2b5b4b3aef36610c8e2ca56547db5fb832a98 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Fri, 1 Jan 2021 17:47:28 -0600 Subject: [PATCH] HistoryChart: Customizable first day of week --- .../views/widgets/HistoryWidget/render.png | Bin 30770 -> 31633 bytes .../common/views/ScoreChartTest.java | 6 ++--- .../habits/show/views/HistoryCardViewTest.kt | 3 ++- .../uhabits/widgets/HistoryWidgetTest.java | 4 +-- .../common/dialogs/HistoryEditorDialog.java | 4 +-- .../habits/show/views/HistoryCardView.kt | 11 +++----- .../activities/settings/SettingsFragment.java | 2 +- .../widgets/FrequencyWidgetProvider.kt | 2 +- .../isoron/uhabits/widgets/HistoryWidget.kt | 7 ++--- .../uhabits/widgets/HistoryWidgetProvider.kt | 3 +-- .../org/isoron/uhabits/widgets/ScoreWidget.kt | 2 +- .../uhabits/widgets/StackWidgetService.java | 4 +-- .../isoron/uhabits/widgets/TargetWidget.kt | 2 +- .../java/org/isoron/platform/time/Dates.kt | 2 +- .../uhabits/core/preferences/Preferences.java | 20 ++++++++++++++- .../core/ui/screens/habits/show/ShowHabit.kt | 8 +++--- .../screens/habits/show/views/HistoryCard.kt | 5 ++-- .../uhabits/core/ui/views/HistoryChart.kt | 13 ++++++---- .../isoron/uhabits/core/ui/views/Themes.kt | 2 +- .../uhabits/core/ui/views/HistoryChartTest.kt | 24 +++++++++++------- 20 files changed, 74 insertions(+), 50 deletions(-) diff --git a/android/uhabits-android/src/androidTest/assets/views/widgets/HistoryWidget/render.png b/android/uhabits-android/src/androidTest/assets/views/widgets/HistoryWidget/render.png index a6ed0060bf5bcb8515c7da9858f892d499b389b9..279f22d435d165311fe715b598e52340bd73b526 100644 GIT binary patch literal 31633 zcmb@ubySsIw>L~Ff=a3=sdNZPcZz@@tw>2qcQ=R<(o!N)(jp+;E!`#E-QE4o{nR+$ z`<`?Ddhan9aCtzP<(jx!rpI842kz(n~Rs*G_R8lg@7U4lhr3ho@q@+|63!zgYR8E!=vGbYE-% z$CA;cSlRsijp^lKuZg*7ZE-0d-@eWKhW1`zl+>b~_IJ@F$s@T7 zcs@#-Md|RESqZ8`<)u>AV8!uDU&^|d<{94Sd94=gxCpWC>Od>%P=9=yrPaeTg8P_F z8rN4C@I+CsNsH;pzklrvot;nV>dsE(m<=QRJK{h8nl1=gNTPrG^ukv;%Uvc(e&HsQ z-4kz|`c!$^ehPB(8bUI%>HgkcE41U-JJEbN5-8SF&aYxv7i<5T9FpC`^x;I>#eCv@ z>j|chXo_-HbaQia2`48f>4F)abr!lcB@We(xMw%#l!t@MBU0W2iM9medZ>Q zj*fA1~;XJCvis z-(bnU@^5&F_Zdg@R<0!CkFpRq3D-)a;A**CUn~oamRgco)|{q~SFNlV8FYU0Qf8PB z#I*kHH6=;wE#YxoIn83f_8RH?_wQv#W2X6PITV^# z6Gg@Y54kLeY2*@!OE!MJ$wI*iJ5F#vQiZQkZNDdClHpQzvuqi1iOnX($;w&fOW#d> z853h-+Ok#M^_&uT?b}n#Ur0!#D7$)GrVN_+2L~TI@n}g&Nr~nTpPOG!Z4o`;r%Gg< zWs8rGcRO3n=#1luXbL3QhlO%zZ9g#0t$q+J{;A7AZ+$3dVQC4g{EAK~-D*IFOX2lv zF%1o3&e-6J3SPmp6^aCpGh)GhS~f4zBcV34esX=G}ucf2)uu`1_DXcOBb zbj^=}fkDh`_nGYaqy?$!WG=9=sVS+?C~i?XS97x}_G}j0vo&9@C2s$(35VAC*sw~4 z9UTu3k5RGOh65i52Z!51p9Es<{tgfGb+}es^}$=HLabGgc*<90suGj+({V`Kd^jtAdrbsg7UyTbvA8+c8BKQl8^!~Jj&aVPk;t0Dpd zFiZ8xTsK%AFsd!EGE!6f1~OHAe#B;QCuV__mGv26FgrVY*(>Q+uk7feBO}EW74eXG z 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 literal 30770 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%0D*pZPsoTQDJhX&_x? zjsGm=Y1U?aW!5e8llIc+P6#`@5j#Z1YymO5iO8+alSvYbXF7 zn(PSj#*g#crxjV+9X5h%v+!bBFHi!P%nj>Fz;W3zebT5!%lpCUJmnk7SJhI0vdu7Y zD*y&8&`EeWHm6pD84O}U`aW*tzsrzkB5sOjRl!Zs%kYtAg!iKjsqN$AMmKKUcvA$X zUg#lI;3Sh5q(Ud&luqa5j6fbj6h7}W=dOPgV7UZm=D&24a)((k<5>3Ph<#YUcb%yI zOa}%wBGSIy-`QE(xHIg-;$dUhcJM_ISR5p3C%=5c*l*kyhAo@)ZO_fzAtVIqI7*%F z1SzcT+t3mM@nV=(yYV6lPa1`voa^8e!o;<8b0(s|v1c#Ylq{ zq~mXw#`)sIy8}-aqNj|LherWMEkJfZa)gOoxF>a^_dYk6u%nT&dJu;L239)>SpHN_u^hSjB24>c%=MP}q4 zdy|3E6E(#_5>;u#BW_d$MxtgVR4q#Ko}XFD2!rzo+tQOu1N=3n4pkQW9KZ1)zL-p? zk=8z#%gTU4?3sPz#QHW#bWe9T%yE0+o(dC&bWyr2;Pga}EP;6_v2WjA78aduID<53 zm*v5%3jR89z=c4N3#2A(G+y{2nxIbaaExSN8f6XJ1L1Ka zj3^nhgMX3`h9xFfQ)Ca@Ta+5i9G+hF?ufl|L09;I@SVZZ%l7s(lo_ zS7P3qfLBOeGk5LKz;U)#>&@lA*>S=HKL>b-$i!i2h??sk4h_~aS3iB(ze`SRP)up# zYg991d8lF(H8yrA?lU?s>Xrrt!8G3z4l^LYKp{=AM63-(#1O2^>WQPN%W%9H(%<-} zL>QLoudI({3;Y^i=HkZRMDOtQyo{TLx2I(@d9$8ho+7b2>xK^b?dleTAGk%iyi07_ zPn$Zk&3!dP=oF%+R5(}1h@K2clijYCe;|nTdf}atJi@oA+Kj27@D+h-SQ3)1fKlZ2 zke$wA5M>w>HthD{$~lh~<;bkEvToq&AgS`C6cm1|>9JI^`Ust06Y>o}Lr+>Aq)d+kCF)SiI@8&%@kwS7t$Fo9t5Smn`{MMnhD zY=`08Mo`6d&hhi`MCA>yguTJN38SFA17&B-9;W*$B0`+bMR5b#i{ukHnQHdUhI@N^ zYhip$wNcSjzhJa}&}PZ7m0 z4?`nF)y`!6S1S)jL^*I(e@5H*p}=R6O&9Sqe)&}@C)3)e5=ElI3M`x@#xvakMN(TD znm3tVTJWG}bqZCe3Er1U6;5^;@6TD-NF2SRAi=E0Q?{Q?F_X+g#y6I|G4)dCV~LPY zIC8SQ+hHDwM}MU2R6HQSx!VY3PXSqYD$`l#q#Ds{|gYuSjhkY diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java index 6b45576b9..71ce5262f 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java @@ -50,7 +50,7 @@ public class ScoreChartTest extends BaseViewTest fixtures.purgeHabits(habitList); habit = fixtures.createLongHabit(); presenter = new ScoreCardPresenter(); - ScoreCardViewModel model = presenter.present(habit, prefs.getFirstWeekday(), 0); + ScoreCardViewModel model = presenter.present(habit, prefs.getFirstWeekdayInt(), 0); view = new ScoreChart(targetContext); view.setScores(model.getScores()); @@ -84,7 +84,7 @@ public class ScoreChartTest extends BaseViewTest @Test public void testRender_withMonthlyBucket() throws Throwable { - ScoreCardViewModel model = presenter.present(habit, prefs.getFirstWeekday(), 2); + ScoreCardViewModel model = presenter.present(habit, prefs.getFirstWeekdayInt(), 2); view.setScores(model.getScores()); view.setBucketSize(model.getBucketSize()); view.invalidate(); @@ -102,7 +102,7 @@ public class ScoreChartTest extends BaseViewTest @Test public void testRender_withYearlyBucket() throws Throwable { - ScoreCardViewModel model = presenter.present(habit, prefs.getFirstWeekday(), 4); + ScoreCardViewModel model = presenter.present(habit, prefs.getFirstWeekdayInt(), 4); view.setScores(model.getScores()); view.setBucketSize(model.getBucketSize()); view.invalidate(); diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardViewTest.kt b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardViewTest.kt index ffd2ac4db..f4db382fb 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardViewTest.kt +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardViewTest.kt @@ -22,6 +22,7 @@ import android.view.LayoutInflater import android.view.View import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest +import org.isoron.platform.time.DayOfWeek.SUNDAY import org.isoron.uhabits.BaseViewTest import org.isoron.uhabits.R import org.isoron.uhabits.core.ui.screens.habits.show.views.HistoryCardPresenter @@ -47,7 +48,7 @@ class HistoryCardViewTest : BaseViewTest() { view.update( HistoryCardPresenter().present( habit = habit, - firstWeekday = 1, + firstWeekday = SUNDAY, isSkipEnabled = false, theme = LightTheme(), ) diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java index d5c59fa6c..2d7eaa8ec 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java @@ -29,8 +29,6 @@ import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; -import java.util.*; - @RunWith(AndroidJUnit4.class) @MediumTest public class HistoryWidgetTest extends BaseViewTest @@ -49,7 +47,7 @@ public class HistoryWidgetTest extends BaseViewTest prefs.setWidgetOpacity(255); habit = fixtures.createVeryLongHabit(); - HistoryWidget widget = new HistoryWidget(targetContext, 0, habit, Calendar.SUNDAY); + HistoryWidget widget = new HistoryWidget(targetContext, 0, habit); view = convertToView(widget, 400, 400); } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java index a5a0f7665..96c1ecb26 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java @@ -22,12 +22,12 @@ package org.isoron.uhabits.activities.common.dialogs; import android.app.*; import android.content.*; import android.os.*; +import android.util.*; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.*; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.*; -import android.util.*; import org.isoron.uhabits.*; import org.isoron.uhabits.core.commands.*; diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardView.kt index 8e2533d74..d408b0d4c 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardView.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardView.kt @@ -47,15 +47,12 @@ class HistoryCardView(context: Context, attrs: AttributeSet) : LinearLayout(cont today = data.today, paletteColor = data.color, theme = data.theme, - dateFormatter = JavaLocalDateFormatter(Locale.getDefault()) - ).apply { - series = data.series - } + dateFormatter = JavaLocalDateFormatter(Locale.getDefault()), + series = data.series, + firstWeekday = data.firstWeekday, + ) - // binding.historyChart.setFirstWeekday(data.firstWeekday) // binding.historyChart.setSkipEnabled(data.isSkipEnabled) - // binding.historyChart.setEntries(data.entries) - // binding.historyChart.setColor(androidColor) // if (data.isNumerical) { // binding.historyChart.setNumerical(true) // } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java index 2b7f00070..755b3fd51 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java @@ -177,7 +177,7 @@ public class SettingsFragment extends PreferenceFragmentCompat private void updateWeekdayPreference() { ListPreference weekdayPref = (ListPreference) findPreference("pref_first_weekday"); - int currentFirstWeekday = prefs.getFirstWeekday(); + int currentFirstWeekday = prefs.getFirstWeekday().getDaysSinceSunday() + 1; String[] dayNames = DateUtils.getLongWeekdayNames(Calendar.SATURDAY); String[] dayValues = {"7", "1", "2", "3", "4", "5", "6"}; weekdayPref.setEntries(dayNames); diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.kt index 40a4ba82e..488f6ecf8 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.kt @@ -28,7 +28,7 @@ class FrequencyWidgetProvider : BaseWidgetProvider() { context, id, habits[0], - preferences.firstWeekday + preferences.firstWeekdayInt ) else return StackWidget(context, id, StackWidgetType.FREQUENCY, habits) } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.kt index 353f382f8..0216d7c5d 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.kt @@ -35,8 +35,7 @@ import java.util.Locale class HistoryWidget( context: Context, id: Int, - private val habit: Habit, - private val firstWeekday: Int + private val habit: Habit ) : BaseWidget(context, id) { override fun getOnClickPendingIntent(context: Context): PendingIntent { @@ -66,7 +65,9 @@ class HistoryWidget( today = DateUtils.getTodayWithOffset().toLocalDate(), paletteColor = habit.color, theme = WidgetTheme(), - dateFormatter = JavaLocalDateFormatter(Locale.getDefault()) + dateFormatter = JavaLocalDateFormatter(Locale.getDefault()), + firstWeekday = prefs.firstWeekday, + series = listOf(), ) } ).apply { diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.kt index 9cba71154..014579c5f 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.kt @@ -26,8 +26,7 @@ class HistoryWidgetProvider : BaseWidgetProvider() { if (habits.size == 1) return HistoryWidget( context, id, - habits[0], - preferences.firstWeekday + habits[0] ) else return StackWidget(context, id, StackWidgetType.HISTORY, habits) } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt index cb5a74889..2a66ad8ad 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt @@ -40,7 +40,7 @@ class ScoreWidget( val presenter = ScoreCardPresenter() val viewModel = presenter.present( habit = habit, - firstWeekday = prefs.firstWeekday, + firstWeekday = prefs.firstWeekdayInt, spinnerPosition = prefs.scoreCardSpinnerPosition ) val widgetView = view as GraphWidgetView diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetService.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetService.java index b03c441d3..97179af1a 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetService.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetService.java @@ -97,11 +97,11 @@ class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory case CHECKMARK: return new CheckmarkWidget(context, widgetId, habit); case FREQUENCY: - return new FrequencyWidget(context, widgetId, habit, prefs.getFirstWeekday()); + return new FrequencyWidget(context, widgetId, habit, prefs.getFirstWeekdayInt()); case SCORE: return new ScoreWidget(context, widgetId, habit); case HISTORY: - return new HistoryWidget(context, widgetId, habit, prefs.getFirstWeekday()); + return new HistoryWidget(context, widgetId, habit); case STREAKS: return new StreakWidget(context, widgetId, habit); } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/TargetWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/TargetWidget.kt index b097785a1..bbda50005 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/TargetWidget.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/TargetWidget.kt @@ -46,7 +46,7 @@ class TargetWidget( if (preferedBackgroundAlpha >= 255) widgetView.setShadowAlpha(0x4f) val chart = (widgetView.dataView as TargetChart) val presenter = TargetCardPresenter() - val data = presenter.present(habit, prefs.firstWeekday) + val data = presenter.present(habit, prefs.firstWeekdayInt) chart.setColor(data.color.toThemedAndroidColor(context)) chart.setTargets(data.targets) chart.setLabels(data.intervals.map { intervalToLabel(context.resources, it) }) diff --git a/android/uhabits-core/src/main/java/org/isoron/platform/time/Dates.kt b/android/uhabits-core/src/main/java/org/isoron/platform/time/Dates.kt index d7ac92f3b..d3ef6af33 100644 --- a/android/uhabits-core/src/main/java/org/isoron/platform/time/Dates.kt +++ b/android/uhabits-core/src/main/java/org/isoron/platform/time/Dates.kt @@ -23,7 +23,7 @@ import org.isoron.uhabits.core.models.Timestamp import kotlin.math.abs import kotlin.math.ceil -enum class DayOfWeek(val index: Int) { +enum class DayOfWeek(val daysSinceSunday: Int) { SUNDAY(0), MONDAY(1), TUESDAY(2), diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java index dd1260bf3..9dafdd686 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java @@ -21,6 +21,7 @@ package org.isoron.uhabits.core.preferences; import androidx.annotation.*; +import org.isoron.platform.time.*; import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.ui.*; import org.isoron.uhabits.core.utils.*; @@ -360,13 +361,30 @@ public class Preferences * represented by 7. By default, this is based on the current system locale, * unless the user changed this in the settings. */ - public int getFirstWeekday() + @Deprecated() + public int getFirstWeekdayInt() { String weekday = storage.getString("pref_first_weekday", ""); if (weekday.isEmpty()) return DateUtils.getFirstWeekdayNumberAccordingToLocale(); return Integer.parseInt(weekday); } + public DayOfWeek getFirstWeekday() + { + int weekday = Integer.parseInt(storage.getString("pref_first_weekday", "-1")); + if (weekday < 0) weekday = DateUtils.getFirstWeekdayNumberAccordingToLocale(); + switch (weekday) { + case 1: return DayOfWeek.SUNDAY; + case 2: return DayOfWeek.MONDAY; + case 3: return DayOfWeek.TUESDAY; + case 4: return DayOfWeek.WEDNESDAY; + case 5: return DayOfWeek.THURSDAY; + case 6: return DayOfWeek.FRIDAY; + case 7: return DayOfWeek.SATURDAY; + default: throw new IllegalArgumentException(); + } + } + public interface Listener { default void onCheckmarkSequenceChanged() diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabit.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabit.kt index 2e18cc0d7..de0c1c37e 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabit.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabit.kt @@ -78,7 +78,7 @@ class ShowHabitPresenter { ), target = TargetCardPresenter().present( habit = habit, - firstWeekday = preferences.firstWeekday, + firstWeekday = preferences.firstWeekdayInt, ), streaks = StreakCartPresenter().present( habit = habit, @@ -86,11 +86,11 @@ class ShowHabitPresenter { scores = ScoreCardPresenter().present( spinnerPosition = preferences.scoreCardSpinnerPosition, habit = habit, - firstWeekday = preferences.firstWeekday, + firstWeekday = preferences.firstWeekdayInt, ), frequency = FrequencyCardPresenter().present( habit = habit, - firstWeekday = preferences.firstWeekday, + firstWeekday = preferences.firstWeekdayInt, ), history = HistoryCardPresenter().present( habit = habit, @@ -100,7 +100,7 @@ class ShowHabitPresenter { ), bar = BarCardPresenter().present( habit = habit, - firstWeekday = preferences.firstWeekday, + firstWeekday = preferences.firstWeekdayInt, boolSpinnerPosition = preferences.barCardBoolSpinnerPosition, numericalSpinnerPosition = preferences.barCardNumericalSpinnerPosition, theme = theme, diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt index 0fbce37e1..6f7b8d6b0 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt @@ -19,6 +19,7 @@ package org.isoron.uhabits.core.ui.screens.habits.show.views +import org.isoron.platform.time.DayOfWeek import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.models.Entry.Companion.SKIP @@ -33,7 +34,7 @@ import kotlin.math.max data class HistoryCardViewModel( val color: PaletteColor, - val firstWeekday: Int, + val firstWeekday: DayOfWeek, val series: List, val theme: Theme, val today: LocalDate, @@ -42,7 +43,7 @@ data class HistoryCardViewModel( class HistoryCardPresenter { fun present( habit: Habit, - firstWeekday: Int, + firstWeekday: DayOfWeek, isSkipEnabled: Boolean, theme: Theme, ): HistoryCardViewModel { diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt index 4455bda28..2b9442ced 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt @@ -23,6 +23,7 @@ import org.isoron.platform.gui.Canvas import org.isoron.platform.gui.Color import org.isoron.platform.gui.DataView import org.isoron.platform.gui.TextAlign +import org.isoron.platform.time.DayOfWeek import org.isoron.platform.time.LocalDate import org.isoron.platform.time.LocalDateFormatter import org.isoron.uhabits.core.models.PaletteColor @@ -34,6 +35,8 @@ class HistoryChart( var paletteColor: PaletteColor, var theme: Theme, var dateFormatter: LocalDateFormatter, + var firstWeekday: DayOfWeek, + var series: List, ) : DataView { enum class Square { @@ -43,9 +46,6 @@ class HistoryChart( HATCHED, } - // Data - var series = listOf() - // Style var padding = 0.0 var squareSpacing = 1.0 @@ -69,8 +69,11 @@ class HistoryChart( canvas.setFontSize(height * 0.06) val nColumns = floor((width - 2 * padding) / squareSize).toInt() - 2 - val todayWeekday = today.dayOfWeek - val topLeftOffset = (nColumns - 1 + dataOffset) * 7 + todayWeekday.index + val firstWeekdayOffset = ( + today.dayOfWeek.daysSinceSunday - + firstWeekday.daysSinceSunday + 7 + ) % 7 + val topLeftOffset = (nColumns - 1 + dataOffset) * 7 + firstWeekdayOffset val topLeftDate = today.minus(topLeftOffset) lastPrintedYear = "" diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/views/Themes.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/views/Themes.kt index 5d46b9fcd..587816da6 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/views/Themes.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/views/Themes.kt @@ -114,4 +114,4 @@ class WidgetTheme : LightTheme() { override val highContrastTextColor = Color.WHITE override val mediumContrastTextColor = Color.WHITE.withAlpha(0.50) override val lowContrastTextColor = Color.WHITE.withAlpha(0.10) -} \ No newline at end of file +} diff --git a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt index e9d8a8e87..e97870872 100644 --- a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt +++ b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt @@ -21,6 +21,8 @@ package org.isoron.uhabits.components import kotlinx.coroutines.runBlocking import org.isoron.platform.gui.assertRenders +import org.isoron.platform.time.DayOfWeek +import org.isoron.platform.time.DayOfWeek.SUNDAY import org.isoron.platform.time.JavaLocalDateFormatter import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.models.PaletteColor @@ -37,14 +39,13 @@ import java.util.Locale class HistoryChartTest { val base = "views/HistoryChart" - val fmt = JavaLocalDateFormatter(Locale.US) - val theme = LightTheme() + val view = HistoryChart( - LocalDate(2015, 1, 25), - PaletteColor(7), - theme, - fmt, - ).apply { + today = LocalDate(2015, 1, 25), + paletteColor = PaletteColor(7), + theme = LightTheme(), + dateFormatter = JavaLocalDateFormatter(Locale.US), + firstWeekday = SUNDAY, series = listOf( 2, // today 2, 1, 2, 1, 2, 1, 2, @@ -68,19 +69,24 @@ class HistoryChartTest { else -> OFF } } - } + ) // TODO: Label overflow // TODO: onClick // TODO: HistoryEditorDialog // TODO: Remove excessive padding on widgets - // TODO: First day of the week @Test fun testDraw() = runBlocking { assertRenders(400, 200, "$base/base.png", view) } + @Test + fun testDrawWeekDay() = runBlocking { + view.firstWeekday = DayOfWeek.MONDAY + assertRenders(400, 200, "$base/weekday.png", view) + } + @Test fun testDrawDifferentSize() = runBlocking { assertRenders(200, 200, "$base/small.png", view)