pull/77/merge
Denis 10 years ago
commit 9fc69386a1

@ -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)
*
* <table>
* <thead>
* <tr><th>day</th><th>dayNumber</th><th>wdaysIndex</th></tr>
* <thead>
* <tbody>
* <tr><td>Su</td><td>1</td><td>1</td></tr>
* <tr><td>Mo</td><td>2</td><td>2</td></tr>
* <tr><td>Tu</td><td>3</td><td>3</td></tr>
* <tr><td>We</td><td>4</td><td>4</td></tr>
* <tr><td>Th</td><td>5</td><td>5</td></tr>
* <tr><td>Fr</td><td>6</td><td>6</td></tr>
* <tr><td>Sa</td><td>7</td><td>0</td></tr>
* </tbody>
* </table>
*
* 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<Integer, Integer> getWeekdayMap()
{
Map<Integer, Integer> 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();

@ -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<Long, Integer[]> frequency;
private String wdays[];
private Integer[] localeWeekdayList;
private Map<Integer, Integer> 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);

@ -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<Integer, Integer> 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);
}
}

Loading…
Cancel
Save