From 9df0af524acad4c0ccb71400f8c906c313ab0c27 Mon Sep 17 00:00:00 2001 From: Name Date: Sat, 28 Oct 2017 19:09:10 +0300 Subject: [PATCH] fixed DateUtils FirstWeekDay implemented neatly --- .../common/views/FrequencyChart.java | 5 +- .../activities/common/views/HistoryChart.java | 12 +- .../habits/list/ListHabitsActivity.kt | 5 + .../activities/settings/SettingsActivity.java | 50 +++++++- .../src/main/res/values/strings.xml | 2 +- .../src/main/res/xml/preferences.xml | 69 ++++++----- .../uhabits/core/preferences/Preferences.java | 2 +- .../isoron/uhabits/core/utils/DateUtils.java | 114 ++++++++++++------ 8 files changed, 171 insertions(+), 88 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java index 1c7c02990..ce6facc92 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java @@ -67,7 +67,6 @@ public class FrequencyChart extends ScrollableChart { private boolean isBackgroundTransparent; - private int firstWeekDay; @NonNull private HashMap frequency; @@ -221,7 +220,7 @@ public class FrequencyChart extends ScrollableChart { pText.setColor(textColor); pGrid.setColor(gridColor); - for (String day : DateUtils.getLocaleDayNames(Calendar.SHORT, firstWeekDay)) { + for (String day : DateUtils.getLocaleDayNames(Calendar.SHORT)) { canvas.drawText(day, rGrid.right - columnWidth, rGrid.top + rowHeight / 2 + 0.25f * em, pText); @@ -266,14 +265,12 @@ public class FrequencyChart extends ScrollableChart { initColors(); initDateFormats(); initRects(); - initFirstWeekDay(); } private void initFirstWeekDay() { HabitsApplication app = (HabitsApplication) getContext().getApplicationContext(); Preferences prefs = app.getComponent().getPreferences(); - firstWeekDay = prefs.getFirstWeekDay(); } private void initColors() { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java index 33d87493b..af3ec1218 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java @@ -96,7 +96,6 @@ public class HistoryChart extends ScrollableChart { @NonNull private Controller controller; - private int firstWeekDay; public HistoryChart(Context context) { super(context); @@ -272,7 +271,7 @@ public class HistoryChart extends ScrollableChart { private void drawAxis(Canvas canvas, RectF location) { float verticalOffset = pTextHeader.getFontSpacing() * 0.4f; - for (String day : DateUtils.getLocaleDayNames(Calendar.SHORT, firstWeekDay)) { + for (String day : DateUtils.getLocaleDayNames(Calendar.SHORT)) { location.offset(0, columnWidth); canvas.drawText(day, location.left + headerTextOffset, location.centerY() + verticalOffset, pTextHeader); @@ -343,7 +342,7 @@ public class HistoryChart extends ScrollableChart { private float getWeekdayLabelWidth() { float width = 0; - for (String w : DateUtils.getLocaleDayNames(Calendar.SHORT, firstWeekDay)) + for (String w : DateUtils.getLocaleDayNames(Calendar.SHORT)) width = Math.max(width, pSquareFg.measureText(w)); return width; @@ -360,15 +359,9 @@ public class HistoryChart extends ScrollableChart { initPaints(); initDateFormats(); initRects(); - initFirstWeekDay(); } - private void initFirstWeekDay() { - HabitsApplication app = (HabitsApplication) getContext().getApplicationContext(); - Preferences prefs = app.getComponent().getPreferences(); - firstWeekDay = prefs.getFirstWeekDay(); - } private void initColors() { StyledResources res = new StyledResources(getContext()); @@ -429,7 +422,6 @@ public class HistoryChart extends ScrollableChart { baseDate = DateUtils.getStartOfTodayCalendar(); - baseDate.setFirstDayOfWeek(firstWeekDay); baseDate.add(Calendar.DAY_OF_YEAR, -(getDataOffset() - 1) * 7); nDays = (nColumns - 1) * 7; diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt index a72b62d5b..c91388f69 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt @@ -46,6 +46,11 @@ class ListHabitsActivity : HabitsActivity() { setScreen(screen) component.listHabitsBehavior.onStartup() + + // added + DateUtils.setFirstWeekDay(prefs.firstWeekDay) + DateUtils.setFirstWeekDay(4) + } override fun onPause() { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.java index 72c519833..c65247530 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.java @@ -19,27 +19,35 @@ package org.isoron.uhabits.activities.settings; +import android.content.SharedPreferences; import android.os.*; +import android.preference.Preference; +import android.preference.PreferenceManager; +import android.util.Log; import org.isoron.androidbase.activities.*; import org.isoron.androidbase.utils.*; import org.isoron.uhabits.R; +import org.isoron.uhabits.core.utils.DateUtils; /** * Activity that allows the user to view and modify the app settings. */ -public class SettingsActivity extends BaseActivity -{ +public class SettingsActivity extends BaseActivity implements SharedPreferences.OnSharedPreferenceChangeListener { + + private SharedPreferences prefs; + @Override - protected void onCreate(Bundle savedInstanceState) - { + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.settings_activity); setupActionBarColor(); + prefs = PreferenceManager.getDefaultSharedPreferences(this); + prefs.registerOnSharedPreferenceChangeListener(this); + } - private void setupActionBarColor() - { + private void setupActionBarColor() { StyledResources res = new StyledResources(this); int color = BaseScreen.getDefaultActionBarColor(this); @@ -48,4 +56,34 @@ public class SettingsActivity extends BaseActivity BaseScreen.setupActionBarColor(this, color); } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPref, String key) { + SharedPreferences.Editor editor = sharedPref.edit(); + if (key.equalsIgnoreCase("hours_offset")) { + + int hourOffset = 0; + try { + hourOffset = Integer.parseInt(sharedPref.getString(key, "0")); + editor.putString(key, String.valueOf(hourOffset)); + DateUtils.setNewDayOffset(hourOffset); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + + } else if (key.equalsIgnoreCase("pref_first_week_day")){ + + int firstWeekDay = 0; + try { + firstWeekDay = Integer.parseInt(sharedPref.getString(key, "0")); + editor.putString(key, String.valueOf(firstWeekDay)); + DateUtils.setFirstWeekDay(firstWeekDay); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + + Log.d("debugging", "hello, key is: " + key+", value: "+ sharedPref.getString(key, "0")); + editor.commit(); + } } diff --git a/uhabits-android/src/main/res/values/strings.xml b/uhabits-android/src/main/res/values/strings.xml index 28aa53ff9..801cc91b9 100644 --- a/uhabits-android/src/main/res/values/strings.xml +++ b/uhabits-android/src/main/res/values/strings.xml @@ -86,7 +86,7 @@ Toggle with short press Put checkmarks with a single tap instead of press-and-hold. More convenient, but might cause accidental toggles. Snooze interval on reminders - First day of week + First day of week Rate this app on Google Play Send feedback to developer View source code at GitHub diff --git a/uhabits-android/src/main/res/xml/preferences.xml b/uhabits-android/src/main/res/xml/preferences.xml index 05bb9a6a1..47a4777a5 100644 --- a/uhabits-android/src/main/res/xml/preferences.xml +++ b/uhabits-android/src/main/res/xml/preferences.xml @@ -1,5 +1,4 @@ - - + + @@ -120,11 +127,11 @@ + android:title="@string/generate_bug_report" /> + android:title="@string/repair_database" /> @@ -135,20 +142,20 @@ + android:data="@string/helpURL" /> + android:data="@string/playStoreURL" /> + android:targetPackage="org.isoron.uhabits" /> @@ -160,25 +167,25 @@ + android:title="Enable developer mode" /> + android:title="Enable numerical habits" /> + android:title="Enable cloud sync" /> + android:title="Sync server address" /> + android:title="Sync key" /> diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java index 27a95a2f0..13fa88a67 100644 --- a/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java @@ -126,7 +126,7 @@ public class Preferences { public int getFirstWeekDay() { Calendar calendar = new GregorianCalendar(); - return Integer.parseInt(storage.getString("pref_week_start", String.valueOf(calendar.getFirstDayOfWeek()))); + return Integer.parseInt(storage.getString("pref_first_week_day", String.valueOf(calendar.getFirstDayOfWeek()))); } public String getSyncAddress() { diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/DateUtils.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/DateUtils.java index 5ca0e380f..ce0c42744 100644 --- a/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/DateUtils.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/DateUtils.java @@ -27,7 +27,8 @@ import java.util.*; import static java.util.Calendar.*; -public abstract class DateUtils { +public abstract class DateUtils +{ private static Long fixedLocalTime = null; @@ -38,7 +39,8 @@ public abstract class DateUtils { /** * Time of the day when the new day starts. */ - public static final int NEW_DAY_OFFSET = -9; + public static /*final*/ int NEW_DAY_OFFSET = 3; + public static /*final*/ int FIRST_WEEK_DAY = 7; /** * Number of milliseconds in one day. @@ -50,32 +52,38 @@ public abstract class DateUtils { */ public static final long HOUR_LENGTH = 60 * 60 * 1000; - public static long applyTimezone(long localTimestamp) { + public static long applyTimezone(long localTimestamp) + { TimeZone tz = getTimezone(); return localTimestamp - tz.getOffset(localTimestamp - tz.getOffset(localTimestamp)); } - public static String formatHeaderDate(GregorianCalendar day) { + public static String formatHeaderDate(GregorianCalendar day) + { Locale locale = getLocale(); String dayOfMonth = Integer.toString(day.get(DAY_OF_MONTH)); String dayOfWeek = day.getDisplayName(DAY_OF_WEEK, SHORT, locale); return dayOfWeek + "\n" + dayOfMonth; } - private static GregorianCalendar getCalendar(long timestamp) { + private static GregorianCalendar getCalendar(long timestamp) + { GregorianCalendar day = new GregorianCalendar(TimeZone.getTimeZone("GMT"), getLocale()); day.setTimeInMillis(timestamp); + day.setFirstDayOfWeek(FIRST_WEEK_DAY); return day; } - private static String[] getDayNames(int format) { + private static String[] getDayNames(int format) + { String[] wdays = new String[7]; Calendar day = new GregorianCalendar(); day.set(DAY_OF_WEEK, Calendar.SATURDAY); - for (int i = 0; i < wdays.length; i++) { + for (int i = 0; i < wdays.length; i++) + { wdays[i] = day.getDisplayName(DAY_OF_WEEK, format, getLocale()); day.add(DAY_OF_MONTH, 1); @@ -84,7 +92,8 @@ public abstract class DateUtils { return wdays; } - public static long getLocalTime() { + public static long getLocalTime() + { if (fixedLocalTime != null) return fixedLocalTime; TimeZone tz = getTimezone(); @@ -96,12 +105,16 @@ public abstract class DateUtils { * @return array with weekday names starting according to locale settings, * e.g. [Mo,Di,Mi,Do,Fr,Sa,So] in Germany */ - public static String[] getLocaleDayNames(int format, int firstWeekDay) { + public static String[] getLocaleDayNames(int format) + { String[] days = new String[7]; Calendar calendar = new GregorianCalendar(); - calendar.set(DAY_OF_WEEK, firstWeekDay); - for (int i = 0; i < days.length; i++) { + calendar.setFirstDayOfWeek(FIRST_WEEK_DAY); + calendar.set(DAY_OF_WEEK, calendar.getFirstDayOfWeek()); + + for (int i = 0; i < days.length; i++) + { days[i] = calendar.getDisplayName(DAY_OF_WEEK, format, getLocale()); calendar.add(DAY_OF_MONTH, 1); @@ -114,86 +127,104 @@ public abstract class DateUtils { * @return array with week days numbers starting according to locale * settings, e.g. [2,3,4,5,6,7,1] in Europe */ - public static Integer[] getLocaleWeekdayList() { + public static Integer[] getLocaleWeekdayList() + { Integer[] dayNumbers = new Integer[7]; Calendar calendar = new GregorianCalendar(); + calendar.setFirstDayOfWeek(FIRST_WEEK_DAY); calendar.set(DAY_OF_WEEK, calendar.getFirstDayOfWeek()); - calendar.set(DAY_OF_WEEK, MONDAY); // NOT RESPONSIBLE - - for (int i = 0; i < dayNumbers.length; i++) { + for (int i = 0; i < dayNumbers.length; i++) + { dayNumbers[i] = calendar.get(DAY_OF_WEEK); calendar.add(DAY_OF_MONTH, 1); } return dayNumbers; } - public static String[] getLongDayNames() { + public static String[] getLongDayNames() + { return getDayNames(GregorianCalendar.LONG); } - public static String[] getShortDayNames() { + public static String[] getShortDayNames() + { return getDayNames(SHORT); } @NonNull - public static Timestamp getToday() { + public static Timestamp getToday() + { return new Timestamp(getStartOfToday()); } - public static long getStartOfDay(long timestamp) { + public static long getStartOfDay(long timestamp) + { return (timestamp / DAY_LENGTH) * DAY_LENGTH; } - public static long getStartOfToday() { + public static long getStartOfToday() + { return getStartOfDay(getLocalTime() - NEW_DAY_OFFSET * HOUR_LENGTH); } - public static long millisecondsUntilTomorrow() { + public static long millisecondsUntilTomorrow() + { return getStartOfToday() + DAY_LENGTH - (getLocalTime() - NEW_DAY_OFFSET * HOUR_LENGTH); } - public static GregorianCalendar getStartOfTodayCalendar() { + public static GregorianCalendar getStartOfTodayCalendar() + { return getCalendar(getStartOfToday()); } - private static TimeZone getTimezone() { - if (fixedTimeZone != null) return fixedTimeZone; + private static TimeZone getTimezone() + { + if(fixedTimeZone != null) return fixedTimeZone; return TimeZone.getDefault(); } - public static void setFixedTimeZone(TimeZone tz) { + public static void setFixedTimeZone(TimeZone tz) + { fixedTimeZone = tz; } - public static long removeTimezone(long timestamp) { + public static long removeTimezone(long timestamp) + { TimeZone tz = getTimezone(); return timestamp + tz.getOffset(timestamp); } - public static void setFixedLocalTime(Long timestamp) { + public static void setFixedLocalTime(Long timestamp) + { fixedLocalTime = timestamp; } - public static void setFixedLocale(Locale locale) { + public static void setFixedLocale(Locale locale) + { fixedLocale = locale; } - private static Locale getLocale() { - if (fixedLocale != null) return fixedLocale; + private static Locale getLocale() + { + if(fixedLocale != null) return fixedLocale; return Locale.getDefault(); } - public static Long truncate(TruncateField field, long timestamp) { + public static Long truncate(TruncateField field, long timestamp) + { GregorianCalendar cal = DateUtils.getCalendar(timestamp); + cal.setFirstDayOfWeek(FIRST_WEEK_DAY); - switch (field) { + switch (field) + { case MONTH: cal.set(DAY_OF_MONTH, 1); return cal.getTimeInMillis(); case WEEK_NUMBER: - int firstWeekday = cal.getFirstDayOfWeek(); + int firstDayOfWeek = cal.getFirstDayOfWeek(); + int firstWeekday = firstDayOfWeek; int weekday = cal.get(DAY_OF_WEEK); int delta = weekday - firstWeekday; if (delta < 0) delta += 7; @@ -216,7 +247,20 @@ public abstract class DateUtils { } } - public enum TruncateField { + public enum TruncateField + { MONTH, WEEK_NUMBER, YEAR, QUARTER } -} \ No newline at end of file + + public static void setNewDayOffset(int offset){ + NEW_DAY_OFFSET = offset; + + } + + public static void setFirstWeekDay(int firstWeekDay){ + FIRST_WEEK_DAY = firstWeekDay; + } + + +} +