From 821a7db8f49a14267aabb31dcaeacb98360e1a60 Mon Sep 17 00:00:00 2001 From: Denis Date: Sun, 3 Apr 2016 23:37:41 +0200 Subject: [PATCH 1/5] comment the numbering scheme --- .../isoron/uhabits/helpers/DateHelper.java | 40 +++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java b/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java index b2c300453..81ad27b9a 100644 --- a/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java +++ b/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java @@ -25,6 +25,7 @@ import android.text.format.DateFormat; import org.isoron.uhabits.R; import java.text.SimpleDateFormat; +import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; @@ -155,17 +156,50 @@ public class DateHelper } + /** + * Throughout the code, it is assumed that the weekdays are numbered + * from 0 (Saturday) to 6 (Friday). + * + * see https://github.com/iSoron/uhabits/issues/74 + * + * In the Java Calendar they are numbered from 1 (Sunday) to 7 (Saturday) + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
daydayNumberwdaysIndex
Su11
Mo22
Tu33
We44
Th55
Fr66
Sa70
+ * + * So we have {@code wdaysIndex = dayNumber % 7} + * + * @return array with names from Saturday to Friday according to the current locale + * + * @see #getWeekday(long) + * @see java.util.Calendar#SUNDAY + * + */ public static String[] getDayNames(int format) { String[] wdays = new String[7]; - GregorianCalendar day = new GregorianCalendar(); - day.set(GregorianCalendar.DAY_OF_WEEK, 0); + Calendar day = new GregorianCalendar(); + // we start with Saturday + day.set(GregorianCalendar.DAY_OF_WEEK, Calendar.SATURDAY); - for (int i = 0; i < 7; i++) + for (int i = 0; i < wdays.length; i++) { wdays[i] = day.getDisplayName(GregorianCalendar.DAY_OF_WEEK, format, Locale.getDefault()); + // advance in time by one day day.add(GregorianCalendar.DAY_OF_MONTH, 1); } From 0d5335693b6f1139ff4b68975269d5515a0b96be Mon Sep 17 00:00:00 2001 From: Denis Date: Tue, 5 Apr 2016 19:25:16 +0200 Subject: [PATCH 2/5] fix order of markers --- .../isoron/uhabits/helpers/DateHelper.java | 24 ++++++++++++++++++ .../uhabits/views/HabitFrequencyView.java | 25 ++++++++++++++----- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java b/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java index 81ad27b9a..1df5edf01 100644 --- a/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java +++ b/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java @@ -206,6 +206,30 @@ public class DateHelper return wdays; } + + /** + * + * @return array with week days numbers starting according to locale settings, + * e.g. [2,3,4,5,6,7,1] in Europe + * + * @see java.util.Calendar#SUNDAY + * + */ + public static Integer[] getLocaleWeekdayList() + { + Integer[] dayNumbers = new Integer[7]; + // a dummy calendar + Calendar calendar = new GregorianCalendar(); + // set staring day according to locale + calendar.set(GregorianCalendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek()); + for (int i = 0; i < dayNumbers.length; i++) { + dayNumbers[i] = calendar.get(GregorianCalendar.DAY_OF_WEEK); + // advance in time by one day + calendar.add(GregorianCalendar.DAY_OF_MONTH, 1); + } + return dayNumbers; + } + public static String formatWeekdayList(Context context, boolean weekday[]) { String shortDayNames[] = getShortDayNames(); diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitFrequencyView.java b/app/src/main/java/org/isoron/uhabits/views/HabitFrequencyView.java index c3d47d9f0..cdca6c97c 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitFrequencyView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitFrequencyView.java @@ -63,6 +63,8 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV private HashMap frequency; private String wdays[]; + private Integer[] localeWeekdayList; + private HashMap number2wdays; public HabitFrequencyView(Context context) { @@ -91,6 +93,17 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV wdays = DateHelper.getShortDayNames(); + /** + * here we create the mapping of week days numbers into the "wdays"-indices + * @see DateHelper#getDayNames(int) + */ + localeWeekdayList = DateHelper.getLocaleWeekdayList(); + number2wdays = new HashMap<>(); + for (Integer number : localeWeekdayList) { + int wdaysIndex = number % 7; + number2wdays.put(number, wdaysIndex); + } + dfMonth = DateHelper.getDateFormat("MMM"); dfYear = DateHelper.getDateFormat("yyyy"); @@ -230,11 +243,12 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV float rowHeight = rect.height() / 8.0f; prevRect.set(rect); - for (int i = 0; i < 7; i++) + for (int j = 0; j < localeWeekdayList.length; j++) { rect.set(0, 0, baseSize, baseSize); - rect.offset(prevRect.left, prevRect.top + columnWidth * i); + rect.offset(prevRect.left, prevRect.top + columnWidth * j); + int i = number2wdays.get(localeWeekdayList[j]); if(values != null) drawMarker(canvas, rect, values[i]); @@ -265,16 +279,15 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV private void drawGrid(Canvas canvas, RectF rGrid) { - int nRows = 7; + int nRows = localeWeekdayList.length; float rowHeight = rGrid.height() / (nRows + 1); pText.setTextAlign(Paint.Align.LEFT); pText.setColor(textColor); pGrid.setColor(dimmedTextColor); - for (int i = 0; i < nRows; i++) - { - canvas.drawText(wdays[i], rGrid.right - columnWidth, + for (Integer dayNumber : localeWeekdayList) { + canvas.drawText(wdays[number2wdays.get(dayNumber)], rGrid.right - columnWidth, rGrid.top + rowHeight / 2 + 0.25f * em, pText); pGrid.setStrokeWidth(1f); From 71dbb3b69fd9ecaa2324c6232ed8b97a2022f640 Mon Sep 17 00:00:00 2001 From: Denis Date: Tue, 5 Apr 2016 22:25:04 +0200 Subject: [PATCH 3/5] fix order in history view --- .../isoron/uhabits/views/HabitHistoryView.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) 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 0958bf275..ea9a6bc0d 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -40,6 +40,7 @@ import org.isoron.uhabits.tasks.ToggleRepetitionTask; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; +import java.util.HashMap; import java.util.Random; public class HabitHistoryView extends ScrollableDataView implements HabitDataView, @@ -58,6 +59,8 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie private int nColumns; private String wdays[]; + private Integer[] localeWeekdayList; + private HashMap number2wdays; private SimpleDateFormat dfMonth; private SimpleDateFormat dfYear; @@ -102,6 +105,17 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie dfMonth = DateHelper.getDateFormat("MMM"); dfYear = DateHelper.getDateFormat("yyyy"); + /** + * here we create the mapping of week days numbers into the "wdays"-indices + * @see DateHelper#getDayNames(int) + */ + localeWeekdayList = DateHelper.getLocaleWeekdayList(); + number2wdays = new HashMap<>(); + for (Integer number : localeWeekdayList) { + int wdaysIndex = number % 7; + number2wdays.put(number, wdaysIndex); + } + baseLocation = new RectF(); } @@ -298,10 +312,10 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie private void drawAxis(Canvas canvas, RectF location) { - for (int i = 0; i < 7; i++) + for (Integer dayNumber : localeWeekdayList) { location.offset(0, columnWidth); - canvas.drawText(wdays[i], location.left + headerTextOffset, + canvas.drawText(wdays[number2wdays.get(dayNumber)], location.left + headerTextOffset, location.bottom - headerTextOffset, pTextHeader); } } From 9e471d68b23a813fbad8b8c6188bd3dbfbdeef5b Mon Sep 17 00:00:00 2001 From: Denis Date: Tue, 5 Apr 2016 23:18:13 +0200 Subject: [PATCH 4/5] fix order in history view --- .../org/isoron/uhabits/views/HabitHistoryView.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 ea9a6bc0d..599d0223d 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -129,6 +129,8 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie baseDate.add(Calendar.DAY_OF_YEAR, -nDays); baseDate.add(Calendar.DAY_OF_YEAR, -todayWeekday); + // ???? + baseDate.add(Calendar.DAY_OF_YEAR, localeWeekdayList[0]); } @Override @@ -286,9 +288,13 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie drawColumnHeader(canvas, location, date); location.offset(0, columnWidth); - for (int j = 0; j < 7; j++) + int todayOfYear = DateHelper.getStartOfTodayCalendar().get(Calendar.DAY_OF_YEAR); + + for (Integer dayNumber : localeWeekdayList) { - if (!(column == nColumns - 2 && getDataOffset() == 0 && j > todayWeekday)) + int dayOfYear = date.get(Calendar.DAY_OF_YEAR); + int j = number2wdays.get(dayNumber); + if (!(column == nColumns - 2 && getDataOffset() == 0 && dayOfYear > todayOfYear)) { int checkmarkOffset = getDataOffset() * 7 + nDays - 7 * (column + 1) + todayWeekday - j; drawSquare(canvas, location, date, checkmarkOffset); From d5b640aa12d489a28939947df28deb414328881d Mon Sep 17 00:00:00 2001 From: Denis Date: Tue, 5 Apr 2016 23:34:35 +0200 Subject: [PATCH 5/5] move the map to DateHelper --- .../org/isoron/uhabits/helpers/DateHelper.java | 16 ++++++++++++++++ .../isoron/uhabits/views/HabitFrequencyView.java | 9 +++------ .../isoron/uhabits/views/HabitHistoryView.java | 13 +++---------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java b/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java index 1df5edf01..b92623676 100644 --- a/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java +++ b/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java @@ -28,7 +28,9 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; import java.util.TimeZone; public class DateHelper @@ -230,6 +232,20 @@ public class DateHelper return dayNumbers; } + /** + * here we create the mapping of week days numbers into the "wdays"-indices + * + * @see DateHelper#getDayNames(int) + */ + public static Map getWeekdayMap() + { + Map number2wdays = new HashMap<>(); + for (Integer number : getLocaleWeekdayList()) { + number2wdays.put(number, number % 7); + } + return number2wdays; + } + public static String formatWeekdayList(Context context, boolean weekday[]) { String shortDayNames[] = getShortDayNames(); diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitFrequencyView.java b/app/src/main/java/org/isoron/uhabits/views/HabitFrequencyView.java index cdca6c97c..1f1f712e5 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitFrequencyView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitFrequencyView.java @@ -35,6 +35,7 @@ import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; +import java.util.Map; import java.util.Random; public class HabitFrequencyView extends ScrollableDataView implements HabitDataView @@ -64,7 +65,7 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV private HashMap frequency; private String wdays[]; private Integer[] localeWeekdayList; - private HashMap number2wdays; + private Map number2wdays; public HabitFrequencyView(Context context) { @@ -98,11 +99,7 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV * @see DateHelper#getDayNames(int) */ localeWeekdayList = DateHelper.getLocaleWeekdayList(); - number2wdays = new HashMap<>(); - for (Integer number : localeWeekdayList) { - int wdaysIndex = number % 7; - number2wdays.put(number, wdaysIndex); - } + number2wdays = DateHelper.getWeekdayMap(); dfMonth = DateHelper.getDateFormat("MMM"); dfYear = DateHelper.getDateFormat("yyyy"); 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 599d0223d..17af430f5 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -41,6 +41,7 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.HashMap; +import java.util.Map; import java.util.Random; public class HabitHistoryView extends ScrollableDataView implements HabitDataView, @@ -60,7 +61,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie private String wdays[]; private Integer[] localeWeekdayList; - private HashMap number2wdays; + private Map number2wdays; private SimpleDateFormat dfMonth; private SimpleDateFormat dfYear; @@ -105,16 +106,8 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie dfMonth = DateHelper.getDateFormat("MMM"); dfYear = DateHelper.getDateFormat("yyyy"); - /** - * here we create the mapping of week days numbers into the "wdays"-indices - * @see DateHelper#getDayNames(int) - */ localeWeekdayList = DateHelper.getLocaleWeekdayList(); - number2wdays = new HashMap<>(); - for (Integer number : localeWeekdayList) { - int wdaysIndex = number % 7; - number2wdays.put(number, wdaysIndex); - } + number2wdays = DateHelper.getWeekdayMap(); baseLocation = new RectF(); }