diff --git a/api/src/main/java/com/todoroo/andlib/utility/TodorooPreferenceActivity.java b/api/src/main/java/com/todoroo/andlib/utility/TodorooPreferenceActivity.java
index a171c17b1..38639a2a8 100644
--- a/api/src/main/java/com/todoroo/andlib/utility/TodorooPreferenceActivity.java
+++ b/api/src/main/java/com/todoroo/andlib/utility/TodorooPreferenceActivity.java
@@ -14,15 +14,18 @@ package com.todoroo.andlib.utility;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
+import android.preference.DialogPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup;
+import android.preference.PreferenceManager;
import android.preference.RingtonePreference;
import com.todoroo.andlib.service.ContextManager;
+import com.todoroo.astrid.ui.TimePreference;
/**
* Displays a preference screen for users to edit their preferences. Override
@@ -74,7 +77,10 @@ abstract public class TodorooPreferenceActivity extends PreferenceActivity {
} else if(preference instanceof EditTextPreference) {
value = ((EditTextPreference) preference).getText();
} else if(preference instanceof RingtonePreference) {
- value = getPreferenceManager().getSharedPreferences().getString(preference.getKey(), null);
+ value = PreferenceManager.getDefaultSharedPreferences(preference.getContext())
+ .getString(preference.getKey(), null);
+ } else if(preference instanceof TimePreference) {
+ value = ((TimePreference) preference).getLastHour();
}
updatePreferences(preference, value);
diff --git a/api/src/main/java/com/todoroo/astrid/ui/TimePreference.java b/api/src/main/java/com/todoroo/astrid/ui/TimePreference.java
new file mode 100644
index 000000000..dd7224b6b
--- /dev/null
+++ b/api/src/main/java/com/todoroo/astrid/ui/TimePreference.java
@@ -0,0 +1,90 @@
+package com.todoroo.astrid.ui;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.preference.DialogPreference;
+import android.text.format.DateFormat;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.TimePicker;
+
+/**
+ * Preference dialog that displays a TimePicker and persists the selected value.
+ *
+ * The xml to use it is of the form:
+ < com.todoroo.astrid.ui.TimePreference
+ android:key="@string/my_key_value"
+ android:defaultValue="-1"
+ android:positiveButtonText="Save"
+ android:negativeButtonText="Reset"
+ android:title="@string/my_pref_title_value" />
+ */
+public class TimePreference extends DialogPreference {
+
+ /** The last hour digit picked by the user in String format */
+ private String lastHour = "0";
+ private TimePicker picker = null;
+
+ public TimePreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ setPositiveButtonText(android.R.string.ok);
+ setNegativeButtonText(android.R.string.cancel);
+
+ }
+
+ @Override
+ public View onCreateDialogView() {
+ picker = new TimePicker(getContext());
+
+ picker.setCurrentHour(Integer.parseInt(getLastHour()));
+ picker.setCurrentMinute(0);
+ picker.setIs24HourView(DateFormat.is24HourFormat(getContext()));
+
+ return picker;
+ }
+
+ @Override
+ public void onBindDialogView(View v) {
+ super.onBindDialogView(v);
+
+ picker.setCurrentHour(Integer.parseInt(getLastHour()));
+ picker.setCurrentMinute(0);
+ picker.setIs24HourView(DateFormat.is24HourFormat(getContext()));
+ }
+
+ @Override
+ public void onDialogClosed(boolean positiveResult) {
+ super.onDialogClosed(positiveResult);
+ /** When the dialog is closed update the lastHour variable and store the value in preferences */
+ if (positiveResult) {
+ lastHour = String.valueOf(picker.getCurrentHour());
+
+ if (callChangeListener(lastHour)) {
+ persistString(lastHour);
+ }
+ }
+ }
+
+ @Override
+ public Object onGetDefaultValue(TypedArray array, int index) {
+ return (array.getString(index));
+ }
+
+ /** When called for the first time initialize the value of the last hour to either the saved one
+ * or to the default one. If a default one is not provided use "0" */
+ @Override
+ public void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+ String defString = (defaultValue == null) ? "0" : defaultValue.toString();
+
+ if (restoreValue) {
+ lastHour = getPersistedString(defString);
+ } else {
+ lastHour = defString;
+ }
+ }
+
+ public String getLastHour() {
+ return lastHour;
+ }
+}
diff --git a/astrid/src/main/java/com/todoroo/astrid/reminders/Notifications.java b/astrid/src/main/java/com/todoroo/astrid/reminders/Notifications.java
index c61bb2b96..5737ff8c2 100644
--- a/astrid/src/main/java/com/todoroo/astrid/reminders/Notifications.java
+++ b/astrid/src/main/java/com/todoroo/astrid/reminders/Notifications.java
@@ -469,9 +469,11 @@ public class Notifications extends BroadcastReceiver {
* @return whether we're in quiet hours
*/
public static boolean isQuietHours() {
+ boolean quietHoursEnabled = Preferences.getBoolean(R.string.p_rmd_enable_quiet, false);
int quietHoursStart = Preferences.getIntegerFromString(R.string.p_rmd_quietStart, -1);
int quietHoursEnd = Preferences.getIntegerFromString(R.string.p_rmd_quietEnd, -1);
- if(quietHoursStart != -1 && quietHoursEnd != -1) {
+
+ if(quietHoursEnabled) {
int hour = newDate().getHours();
if(quietHoursStart <= quietHoursEnd) {
if(hour >= quietHoursStart && hour < quietHoursEnd) {
diff --git a/astrid/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java b/astrid/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java
index 8c742419f..7fd5d40da 100644
--- a/astrid/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java
+++ b/astrid/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java
@@ -31,33 +31,33 @@ public class ReminderPreferences extends TodorooPreferenceActivity {
public void updatePreferences(Preference preference, Object value) {
Resources r = getResources();
- if(r.getString(R.string.p_rmd_quietStart).equals(preference.getKey())) {
- int index = AndroidUtilities.indexOf(r.getStringArray(R.array.EPr_quiet_hours_start_values), value);
- Preference endPreference = findPreference(getString(R.string.p_rmd_quietEnd));
+ if(r.getString(R.string.p_rmd_enable_quiet).equals(preference.getKey())) {
+ if( !(Boolean) value) {
+ preference.setSummary(r.getString(R.string.rmd_EPr_quiet_hours_desc_none));
+ } else {
+ preference.setSummary("");
+ }
+ } else if(r.getString(R.string.p_rmd_quietStart).equals(preference.getKey())) {
+ int index = Integer.parseInt((String) value);
+
if(index <= 0) {
preference.setSummary(r.getString(R.string.rmd_EPr_quiet_hours_desc_none));
- endPreference.setEnabled(false);
} else {
- String setting = r.getStringArray(R.array.EPr_quiet_hours_start)[index];
+ String setting = String.valueOf(index);
preference.setSummary(r.getString(R.string.rmd_EPr_quiet_hours_start_desc, setting));
- endPreference.setEnabled(true);
}
} else if(r.getString(R.string.p_rmd_quietEnd).equals(preference.getKey())) {
- int index = AndroidUtilities.indexOf(r.getStringArray(R.array.EPr_quiet_hours_end_values), value);
+ int index = Integer.parseInt((String) value);
int quietHoursStart = Preferences.getIntegerFromString(R.string.p_rmd_quietStart, -1);
if(index == -1 || quietHoursStart == -1) {
preference.setSummary(r.getString(R.string.rmd_EPr_quiet_hours_desc_none));
} else {
- String setting = r.getStringArray(R.array.EPr_quiet_hours_end)[index];
+ String setting = String.valueOf(index);
preference.setSummary(r.getString(R.string.rmd_EPr_quiet_hours_end_desc, setting));
}
} else if(r.getString(R.string.p_rmd_time).equals(preference.getKey())) {
- int index = AndroidUtilities.indexOf(r.getStringArray(R.array.EPr_rmd_time_values), value);
- if (index != -1 && index < r.getStringArray(R.array.EPr_rmd_time).length) {
- // FIXME this does not fix the underlying cause of the ArrayIndexOutofBoundsException
- String setting = r.getStringArray(R.array.EPr_rmd_time)[index];
- preference.setSummary(r.getString(R.string.rmd_EPr_rmd_time_desc, setting));
- }
+ String setting = (String) value;
+ preference.setSummary(r.getString(R.string.rmd_EPr_rmd_time_desc, setting));
} else if(r.getString(R.string.p_rmd_ringtone).equals(preference.getKey())) {
if(value == null || "content://settings/system/notification_sound".equals(value)) //$NON-NLS-1$
{
@@ -93,7 +93,7 @@ public class ReminderPreferences extends TodorooPreferenceActivity {
preference.setSummary(r.getString(R.string.rmd_EPr_snooze_dialog_desc_false));
}
} else if (r.getString(R.string.p_rmd_enabled).equals(preference.getKey())) {
- if((Boolean)value) {
+ if( (Boolean)value ) {
preference.setSummary(R.string.rmd_EPr_enabled_desc_true);
} else {
preference.setSummary(R.string.rmd_EPr_enabled_desc_false);
diff --git a/astrid/src/main/java/com/todoroo/astrid/reminders/ReminderService.java b/astrid/src/main/java/com/todoroo/astrid/reminders/ReminderService.java
index cb6af502b..96d5294af 100644
--- a/astrid/src/main/java/com/todoroo/astrid/reminders/ReminderService.java
+++ b/astrid/src/main/java/com/todoroo/astrid/reminders/ReminderService.java
@@ -112,6 +112,7 @@ public final class ReminderService {
Editor editor = prefs.edit();
Resources r = context.getResources();
+ Preferences.setIfUnset(prefs, editor, r, R.string.p_rmd_enable_quiet, false);
Preferences.setIfUnset(prefs, editor, r, R.string.p_rmd_quietStart, 22);
Preferences.setIfUnset(prefs, editor, r, R.string.p_rmd_quietEnd, 10);
Preferences.setIfUnset(prefs, editor, r, R.string.p_rmd_default_random_hours, 0);
@@ -320,7 +321,7 @@ public final class ReminderService {
date.setSeconds(0);
dueDateAlarm = date.getTime();
if (dueDate > getNowValue() && dueDateAlarm < getNowValue()) {
- // this only happens for tasks due today, cause dueDateAlarm wouldnt be in the past otherwise
+ // this only happens for tasks due today, cause dueDateAlarm wouldn't be in the past otherwise
// if the default reminder is in the past, then reschedule it
// on this day before start of quiet hours or after quiet hours
// randomly placed in this interval
@@ -336,13 +337,14 @@ public final class ReminderService {
quietHoursEndDate.setMinutes(0);
quietHoursEndDate.setSeconds(0);
+ boolean quietHoursEnabled = Preferences.getBoolean(R.string.p_rmd_enable_quiet, false);
+
long millisToQuiet;
long millisToEndOfDay = dueDate - getNowValue();
- //
int periodDivFactor = 4;
- if(quietHoursStart != -1 && quietHoursEnd != -1) {
+ if(quietHoursEnabled) {
int hour = newDate().getHours();
if(quietHoursStart <= quietHoursEnd) {
if(hour >= quietHoursStart && hour < quietHoursEnd) {
diff --git a/astrid/src/main/java/com/todoroo/astrid/utility/AstridDefaultPreferenceSpec.java b/astrid/src/main/java/com/todoroo/astrid/utility/AstridDefaultPreferenceSpec.java
index 0e46d795f..e817157da 100644
--- a/astrid/src/main/java/com/todoroo/astrid/utility/AstridDefaultPreferenceSpec.java
+++ b/astrid/src/main/java/com/todoroo/astrid/utility/AstridDefaultPreferenceSpec.java
@@ -6,6 +6,7 @@ import android.content.SharedPreferences.Editor;
import android.content.res.Resources;
import com.todoroo.andlib.service.ContextManager;
+import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.activity.BeastModePreferences;
import com.todoroo.astrid.core.SortHelper;
@@ -89,6 +90,46 @@ public class AstridDefaultPreferenceSpec extends AstridPreferenceSpec {
extras.setExtras(context);
+ /** START Migration to new Quiet Hours settings */
+ boolean hasMigrated = Preferences.getBoolean(R.string.p_rmd_hasMigrated, false);
+
+ if(!hasMigrated) {
+ // for each preference load old stored value
+ int quietHoursStart = Preferences.getIntegerFromString(R.string.p_rmd_quietStart_old, -1);
+ int quietHoursEnd = Preferences.getIntegerFromString(R.string.p_rmd_quietEnd_old, -1);
+ int defReminderTime = Preferences.getIntegerFromString(R.string.p_rmd_time_old, -1);
+ System.out.println("!!!!!!!!Values before:" + quietHoursStart + "," + quietHoursEnd + "," + defReminderTime);
+ // if a previous quietHoursStart preference exists and it's not disabled (so it's not 0 or -1)
+ if (quietHoursStart > 0) {
+ quietHoursStart = (quietHoursStart - 5) >= 0 ? quietHoursStart - 5 : 19 + quietHoursStart;
+ // if a previous quietHoursEnd preference exists adapt it
+ if (quietHoursEnd >= 0) {
+ quietHoursEnd = (quietHoursEnd + 9) % 23;
+ }
+ Preferences.setBoolean(R.string.p_rmd_enable_quiet, true);
+ } else {
+ // set new quietHoursEnabled setting to false
+ Preferences.setBoolean( R.string.p_rmd_enable_quiet, false);
+ }
+ // if a previous defReminderTime preference exists
+ if (defReminderTime >= 0 && defReminderTime < r.getStringArray(R.array.EPr_rmd_time).length) {
+ // convert to hours from index. 9 is the initial 9AM in the reminder array
+ // so you have to return 9 hours to get to 0 (and modulo the result to reverse negative results)
+ defReminderTime = (defReminderTime + 9) % 23;
+ } else if (defReminderTime == -1) {
+ defReminderTime = 0;
+ }
+
+ // save changed preferences in the new preference keys
+ Preferences.setStringFromInteger(R.string.p_rmd_quietStart, quietHoursStart);
+ Preferences.setStringFromInteger(R.string.p_rmd_quietEnd, quietHoursEnd);
+ Preferences.setStringFromInteger(R.string.p_rmd_time, defReminderTime);
+
+ // set migration to completed
+ Preferences.setBoolean(R.string.p_rmd_hasMigrated, true);
+ }
+ /** END Migration to new Quiet Hours settings */
+
editor.commit();
}
}
diff --git a/astrid/src/main/res/values/keys.xml b/astrid/src/main/res/values/keys.xml
index 4b6ebeb6e..2f4a4ea9c 100644
--- a/astrid/src/main/res/values/keys.xml
+++ b/astrid/src/main/res/values/keys.xml
@@ -11,16 +11,31 @@
notif_enabled
-
-
- notif_qstart
+
+
+ enable_qhours
+
+
+ notif_qstart_new
- notif_qend
-
+ notif_qend_new
+
+
+ has_migrated_rmd
+
- reminder_time
-
+ reminder_time_new
+
+
+
+ reminder_time
+
+ notif_qstart
+
+ notif_qend
+
+
notif_annoy
diff --git a/astrid/src/main/res/values/strings-reminders.xml b/astrid/src/main/res/values/strings-reminders.xml
index 62ed0b7fa..08e4c923a 100644
--- a/astrid/src/main/res/values/strings-reminders.xml
+++ b/astrid/src/main/res/values/strings-reminders.xml
@@ -82,8 +82,10 @@
Reminders are enabled (this is normal)
- Reminders will never appear on your phone
-
+ Reminders will never appear on your phone
+
+
+ Enable quiet hours
Quiet hours start
@@ -144,7 +146,7 @@
New tasks will have no random reminders
New tasks will remind randomly: %s
-
+
@@ -162,7 +164,7 @@
- monthly
- bi-monthly
-
+
- disabled
@@ -191,7 +193,7 @@
- 6 PM
- 7 PM
-
+
- 9 AM
@@ -219,7 +221,7 @@
- 7 AM
- 8 AM
-
+
- 9 AM
diff --git a/astrid/src/main/res/xml/preferences_reminders.xml b/astrid/src/main/res/xml/preferences_reminders.xml
index 2b32116b6..fae2ff35b 100644
--- a/astrid/src/main/res/xml/preferences_reminders.xml
+++ b/astrid/src/main/res/xml/preferences_reminders.xml
@@ -8,45 +8,48 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/rmd_EPr_alerts_header">
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/astrid/src/test/java/com/todoroo/andlib/utility/DateUtilitiesTest.java b/astrid/src/test/java/com/todoroo/andlib/utility/DateUtilitiesTest.java
index cd7d9cd27..050c7dc27 100644
--- a/astrid/src/test/java/com/todoroo/andlib/utility/DateUtilitiesTest.java
+++ b/astrid/src/test/java/com/todoroo/andlib/utility/DateUtilitiesTest.java
@@ -37,7 +37,7 @@ import static org.tasks.date.DateTimeUtils.newDate;
@RunWith(RobolectricTestRunner.class)
public class DateUtilitiesTest {
- private Locale defaultLocale;
+ private static Locale defaultLocale;
@Before
public void before() {