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..b92623676 100644 --- a/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java +++ b/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java @@ -25,9 +25,12 @@ 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.HashMap; import java.util.Locale; +import java.util.Map; import java.util.TimeZone; public class DateHelper @@ -155,23 +158,94 @@ 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); } 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; + } + + /** + * 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 c3d47d9f0..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 @@ -63,6 +64,8 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV private HashMap frequency; private String wdays[]; + private Integer[] localeWeekdayList; + private Map number2wdays; public HabitFrequencyView(Context context) { @@ -91,6 +94,13 @@ 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 = DateHelper.getWeekdayMap(); + dfMonth = DateHelper.getDateFormat("MMM"); dfYear = DateHelper.getDateFormat("yyyy"); @@ -230,11 +240,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 +276,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); 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..17af430f5 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,8 @@ 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.Map; import java.util.Random; public class HabitHistoryView extends ScrollableDataView implements HabitDataView, @@ -58,6 +60,8 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie private int nColumns; private String wdays[]; + private Integer[] localeWeekdayList; + private Map number2wdays; private SimpleDateFormat dfMonth; private SimpleDateFormat dfYear; @@ -102,6 +106,9 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie dfMonth = DateHelper.getDateFormat("MMM"); dfYear = DateHelper.getDateFormat("yyyy"); + localeWeekdayList = DateHelper.getLocaleWeekdayList(); + number2wdays = DateHelper.getWeekdayMap(); + baseLocation = new RectF(); } @@ -115,6 +122,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 @@ -272,9 +281,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); @@ -298,10 +311,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); } }