added reminder preferences, fixed up various minor bugs with tests and real app

pull/14/head
Tim Su 14 years ago
parent a453628a8a
commit 8b85736976

@ -188,6 +188,13 @@
</receiver>
<!-- reminders -->
<activity android:name="com.todoroo.astrid.reminders.ReminderPreferences"
android:label="@string/rmd_EPr_alerts_header">
<intent-filter>
<action android:name="com.todoroo.astrid.SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<receiver android:name="com.todoroo.astrid.reminders.ReminderStartupService">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />

@ -55,13 +55,14 @@ public class Notifications extends BroadcastReceiver {
AstridDependencyInjector.initialize();
}
public Notifications() {
DependencyInjectionService.getInstance().inject(this);
}
@Override
/** Alarm intent */
public void onReceive(Context context, Intent intent) {
DependencyInjectionService.getInstance().inject(this);
ContextManager.setContext(context);
if(notificationManager == null)
notificationManager = new AndroidNotificationManager(context);
long id = intent.getLongExtra(ID_KEY, 0);
int type = intent.getIntExtra(TYPE_KEY, (byte) 0);
@ -102,6 +103,8 @@ public class Notifications extends BroadcastReceiver {
*/
public boolean showNotification(long id, int type, String reminder) {
Context context = ContextManager.getContext();
if(notificationManager == null)
notificationManager = new AndroidNotificationManager(context);
Task task;
try {
@ -232,6 +235,7 @@ public class Notifications extends BroadcastReceiver {
if(Constants.DEBUG)
Log.w("Astrid", "Logging notification: " + reminder); //$NON-NLS-1$ //$NON-NLS-2$
notificationManager.notify((int)id, notification);
return true;

@ -0,0 +1,119 @@
/**
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.reminders;
import android.content.res.Resources;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceChangeListener;
import com.timsu.astrid.R;
/**
* Displays the preference screen for users to edit their preferences
*
* @author Tim Su <tim@todoroo.com>
*
*/
public class ReminderPreferences extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_reminders);
PreferenceScreen screen = getPreferenceScreen();
initializePreference(screen);
}
private void initializePreference(Preference preference) {
if(preference instanceof PreferenceGroup) {
PreferenceGroup group = (PreferenceGroup)preference;
for(int i = 0; i < group.getPreferenceCount(); i++) {
initializePreference(group.getPreference(i));
}
} else {
Object value = null;
if(preference instanceof ListPreference)
value = ((ListPreference)preference).getValue();
else if(preference instanceof CheckBoxPreference)
value = ((CheckBoxPreference)preference).isChecked();
else if(preference instanceof EditTextPreference)
value = ((EditTextPreference)preference).getText();
if(value != null)
updatePreferences(preference, value);
preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference myPreference, Object newValue) {
updatePreferences(myPreference, newValue);
return true;
}
});
}
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onStop() {
super.onStop();
}
protected int valueToIndex(String value, String[] array) {
for(int i = 0; i < array.length; i++)
if(array[i].equals(value))
return i;
return -1;
}
/**
*
* @param resource if null, updates all resources
*/
protected void updatePreferences(Preference preference, Object value) {
Resources r = getResources();
if(r.getString(R.string.p_rmd_quietStart).equals(preference.getKey())) {
int index = valueToIndex((String)value, r.getStringArray(R.array.EPr_quiet_hours_start_values));
if(index == -1)
preference.setSummary(r.getString(R.string.rmd_EPr_quiet_hours_desc_none));
else {
String duration = r.getStringArray(R.array.EPr_quiet_hours_start)[index];
preference.setSummary(r.getString(R.string.rmd_EPr_quiet_hours_start_desc, duration));
}
} else if(r.getString(R.string.p_rmd_quietEnd).equals(preference.getKey())) {
int index = valueToIndex((String)value, r.getStringArray(R.array.EPr_quiet_hours_end_values));
if(index == -1)
preference.setSummary(r.getString(R.string.rmd_EPr_quiet_hours_desc_none));
else {
String duration = r.getStringArray(R.array.EPr_quiet_hours_end)[index];
preference.setSummary(r.getString(R.string.rmd_EPr_quiet_hours_end_desc, duration));
}
} else if(r.getString(R.string.p_rmd_ringtone).equals(preference.getKey())) {
if(value == null)
preference.setSummary(r.getString(R.string.rmd_EPr_ringtone_desc_default));
else
preference.setSummary(r.getString(R.string.rmd_EPr_ringtone_desc_custom));
} else if(r.getString(R.string.p_rmd_persistent).equals(preference.getKey())) {
if((Boolean)value)
preference.setSummary(r.getString(R.string.rmd_EPr_persistent_desc_true));
else
preference.setSummary(r.getString(R.string.rmd_EPr_persistent_desc_false));
}
}
}

@ -7,6 +7,9 @@ import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Resources;
import android.util.Log;
import com.timsu.astrid.R;
@ -62,6 +65,32 @@ public final class ReminderService {
public ReminderService() {
DependencyInjectionService.getInstance().inject(this);
setPreferenceDefaults();
}
// --- preference handling
private static boolean preferencesInitialized = false;
/** Set preference defaults, if unset. called at startup */
public void setPreferenceDefaults() {
if(preferencesInitialized)
return;
Context context = ContextManager.getContext();
SharedPreferences prefs = Preferences.getPrefs(context);
Editor editor = prefs.edit();
Resources r = context.getResources();
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, 7);
Preferences.setIfUnset(prefs, editor, r, R.string.p_rmd_time, 12);
Preferences.setIfUnset(prefs, editor, r, R.string.p_rmd_nagging, true);
Preferences.setIfUnset(prefs, editor, r, R.string.p_rmd_persistent, true);
editor.commit();
preferencesInitialized = true;
}
// --- reminder scheduling logic
@ -168,7 +197,7 @@ public final class ReminderService {
else {
// return notification time on this day
Date date = new Date(dueDate);
date.setHours(Preferences.getIntegerFromString(R.string.p_reminder_time));
date.setHours(Preferences.getIntegerFromString(R.string.p_rmd_time));
date.setMinutes(0);
return date.getTime();
}
@ -207,7 +236,7 @@ public final class ReminderService {
/**
* Interface for testing
*/
interface AlarmScheduler {
public interface AlarmScheduler {
public void createAlarm(Task task, long time, int type);
}

@ -51,6 +51,14 @@
<!-- ==================================================== preferences == -->
<string-array name="EPr_default_importance">
<!-- urgency: default importance labels for preferences. -->
<item>!!!! (Highest)</item>
<item>!!!</item>
<item>!!</item>
<item>! (Lowest)</item>
</string-array>
<string-array name="EPr_default_urgency">
<!-- urgency: default urgency labels for preferences. -->
<item>No Urgency</item>
@ -61,7 +69,7 @@
<item>Next Month</item>
</string-array>
<string-array name="TEA_default_hideUntil">
<string-array name="EPr_default_hideUntil">
<!-- hideUntil: default labels for preferences. -->
<item>Don\'t hide</item>
<item>Task is due</item>

@ -28,31 +28,31 @@
<!-- ======================================================== REMINDERS == -->
<!-- hour to start quiet hours (inclusive) -->
<string name="p_notif_quietStart">notif_qstart</string>
<string name="p_rmd_quietStart">notif_qstart</string>
<!-- hour to end quiet hours (non-inclusive) -->
<string name="p_notif_quietEnd">notif_qend</string>
<string name="p_rmd_quietEnd">notif_qend</string>
<!-- whether "clear all notifications" clears astrid notifications -->
<string name="p_notif_annoy">notif_annoy</string>
<string name="p_rmd_persistent">notif_annoy</string>
<!-- whether to vibrate phone when reminder fires -->
<string name="p_notif_vibrate">notif_vibrate</string>
<string name="p_rmd_vibrate">notif_vibrate</string>
<!-- ringtone to use for notifications -->
<string name="p_notification_ringtone">notification_ringtone</string>
<string name="p_rmd_ringtone">notification_ringtone</string>
<!-- icon theme for notifications -->
<string name="p_notif_icon">notif_theme</string>
<string name="p_rmd_icon">notif_theme</string>
<!-- whether astrid nag messages are used -->
<string name="p_nagging">nagging</string>
<string name="p_rmd_nagging">nagging</string>
<!-- reminder time when task doesn't have a due time -->
<string name="p_reminder_time">reminder_time</string>
<!-- reminder time when task doesn't have a due time (hour of day) -->
<string name="p_rmd_time">reminder_time</string>
<!-- default random reminder setting -->
<string name="p_default_reminder_random">notif_default_reminder</string>
<!-- default random reminder setting (in days) -->
<string name="p_rmd_default_random">notif_default_reminder</string>
<string-array name="notif_icon_values">
<!-- Corresponding to the constants in Preferences.java (do not edit) -->
@ -144,6 +144,14 @@
<!-- default urgency setting (corresponds to entry in TEA_urgency) -->
<string name="p_default_urgency_key">p_def_urg</string>
<string-array name="EPr_default_importance_values">
<!-- importance: labels that map EPr_default_importance items to task importance values. -->
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
</string-array>
<string-array name="EPr_default_urgency_values">
<!-- urgency: labels that map EPr_default_urgency items to index in TEA_urgency. -->
<item>0</item>
@ -156,10 +164,10 @@
<string-array name="EPr_default_hideUntil_values">
<!-- hideUntil: labels that map EPr_default_hideUntil items to index in TEA_hideUntil. -->
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
</string-array>
<!-- default importance setting (corresponds to task setting) -->

@ -407,4 +407,9 @@ If you don\'t want to see the new task right after you complete the old one, you
<!-- Default Importance Description (%s => setting) -->
<string name="EPr_default_importance_desc">Currently Set To: %s</string>
<!-- Default Hide Until Title -->
<string name="EPr_default_hideUntil_title">Default Hide Until</string>
<!-- Default Hide Until Description (%s => setting) -->
<string name="EPr_default_hideUntil_desc">Currently Set To: %s</string>
</resources>

@ -5,8 +5,37 @@
<!-- Resources for built-in reminders plug-in -->
<!-- Preference Screen Title -->
<string name="EPr_alerts_header">Reminder Settings</string>
<string name="rmd_EPr_alerts_header">Reminder Settings</string>
<!-- Quiet Hours Start Title -->
<string name="rmd_EPr_quiet_hours_start_title">Quiet Hours Start</string>
<!-- Quiet Hours Start Description (%s => time set) -->
<string name="rmd_EPr_quiet_hours_start_desc">No notifications will appear after %s</string>
<!-- Quiet Hours Start/End Description (disabled) -->
<string name="rmd_EPr_quiet_hours_desc_none">Please set both start and end times</string>
<!-- Quiet Hours End Title -->
<string name="rmd_EPr_quiet_hours_end_title">Quiet Hours End</string>
<!-- Quiet Hours End Description (%s => time set) -->
<string name="rmd_EPr_quiet_hours_end_desc">Notifications will begin appearing starting at %s</string>
<!-- Notification Ringtone Title -->
<string name="rmd_EPr_ringtone_title">Notification Ringtone</string>
<!-- Notification Ringtone Description (when custom tone is set) -->
<string name="rmd_EPr_ringtone_desc_custom">Custom ringtone has been set</string>
<!-- Notification Ringtone Description (when custom tone is not set) -->
<string name="rmd_EPr_ringtone_desc_default">Default ringtone will be used</string>
<!-- Notification Persistence Title -->
<string name="rmd_EPr_persistent_title">Notification Persistence</string>
<!-- Notification Persistence Description (true) -->
<string name="rmd_EPr_persistent_desc_true">Notifications must be viewed individually to be cleared</string>
<!-- Notification Persistence Description (false) -->
<string name="rmd_EPr_persistent_desc_false">Notifications can be cleared with \"Clear All\" button</string>
<!-- Defaults Title -->
<string name="rmd_EPr_defaults_header">New Task Defaults</string>
<!-- =============================================== random reminders == -->
<string-array name="reminders">

@ -2,12 +2,27 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
android:title="@string/EPr_defaults_header">
<ListPreference
android:key="@string/p_default_importance_key"
android:entries="@array/EPr_default_importance"
android:entryValues="@array/EPr_default_importance_values"
android:title="@string/EPr_default_importance_title" />
<ListPreference
android:key="@string/p_default_urgency_key"
android:entries="@array/EPr_default_urgency"
android:entryValues="@array/EPr_default_urgency_values"
android:title="@string/EPr_default_urgency_title" />
<ListPreference
android:key="@string/p_default_hideUntil_key"
android:entries="@array/EPr_default_hideUntil"
android:entryValues="@array/EPr_default_hideUntil_values"
android:title="@string/EPr_default_hideUntil_title" />
</PreferenceScreen>
<PreferenceCategory
android:title="@string/prefs_category_appearance">
<CheckBoxPreference
android:key="@string/p_colorize"
android:title="@string/prefs_colorize_title"
android:summary="@string/prefs_colorize_desc" />
<ListPreference
android:key="@string/p_fontSize"
android:entries="@array/EPr_font_size"
@ -18,11 +33,6 @@
<PreferenceCategory
android:title="@string/prefs_category_other">
<CheckBoxPreference
android:key="@string/p_nagging"
android:title="@string/prefs_nagging_title"
android:summary="@string/prefs_nagging_desc"
android:defaultValue="true" />
<CheckBoxPreference
android:key="@string/p_backup"
android:title="@string/prefs_backup_title"

@ -1,47 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/EPr_alerts_header">
android:title="@string/rmd_EPr_alerts_header">
<ListPreference
android:key="@string/p_notif_quietStart"
android:key="@string/p_rmd_quietStart"
android:entries="@array/EPr_quiet_hours_start"
android:entryValues="@array/EPr_quiet_hours_start_values"
android:title="@string/prefs_quietStart_title"
android:summary="@string/prefs_quietStart_desc" />
android:title="@string/rmd_EPr_quiet_hours_start_title"/>
<ListPreference
android:key="@string/p_notif_quietEnd"
android:key="@string/p_rmd_quietEnd"
android:entries="@array/EPr_quiet_hours_end"
android:entryValues="@array/EPr_quiet_hours_end_values"
android:title="@string/prefs_quietEnd_title"
android:summary="@string/prefs_quietEnd_desc" />
android:title="@string/rmd_EPr_quiet_hours_end_title"/>
<CheckBoxPreference
android:key="@string/p_notif_annoy"
android:title="@string/prefs_annoy_title"
android:summary="@string/prefs_annoy_desc" />
android:key="@string/p_rmd_persistent"
android:title="@string/rmd_EPr_persistent_title"/>
<CheckBoxPreference
android:key="@string/p_notif_vibrate"
android:key="@string/p_rmd_vibrate"
android:title="@string/prefs_vibrate_title"
android:summary="@string/prefs_vibrate_desc" />
<EditTextPreference
android:key="@string/p_default_reminder_random"
android:key="@string/p_rmd_default_random"
android:title="@string/prefs_defaultRemind_title"
android:summary="@string/prefs_defaultRemind_desc" />
<RingtonePreference
android:key="@string/p_notification_ringtone"
android:title="@string/prefs_notification_title"
android:summary="@string/prefs_notification_desc"
android:key="@string/p_rmd_ringtone"
android:title="@string/rmd_EPr_ringtone_title"
android:ringtoneType="notification"
android:showDefault="true"
android:showSilent="true" />
<ListPreference
android:key="@string/p_notif_icon"
android:entries="@array/notif_icon_entries"
android:entryValues="@array/notif_icon_values"
android:title="@string/prefs_notificon_title"
android:summary="@string/prefs_notificon_desc" />
<CheckBoxPreference
android:key="@string/p_nagging"
android:key="@string/p_rmd_nagging"
android:title="@string/prefs_nagging_title"
android:summary="@string/prefs_nagging_desc"
android:defaultValue="true" />

@ -43,10 +43,10 @@ public class Preferences {
Resources r = context.getResources();
Editor editor = prefs.edit();
if(!prefs.contains(r.getString(R.string.p_notif_annoy))) {
editor.putBoolean(r.getString(R.string.p_notif_annoy),
DEFAULT_PERSISTENCE_MODE);
}
// if(!prefs.contains(r.getString(R.string.p_notif_annoy))) {
// editor.putBoolean(r.getString(R.string.p_notif_annoy),
// DEFAULT_PERSISTENCE_MODE);
// }
if(!prefs.contains(r.getString(R.string.p_fontSize))) {
editor.putString(r.getString(R.string.p_fontSize), "20");
}
@ -59,9 +59,9 @@ public class Preferences {
if(!prefs.contains(r.getString(R.string.p_colorize))) {
editor.putBoolean(r.getString(R.string.p_colorize), DEFAULT_COLORIZE);
}
if(!prefs.contains(r.getString(R.string.p_notif_vibrate))) {
editor.putBoolean(r.getString(R.string.p_notif_vibrate), true);
}
// if(!prefs.contains(r.getString(R.string.p_notif_vibrate))) {
// editor.putBoolean(r.getString(R.string.p_notif_vibrate), true);
// }
if (!prefs.contains(r.getString(R.string.p_backup))) {
editor.putBoolean(r.getString(R.string.p_backup), true);
}
@ -230,47 +230,53 @@ public class Preferences {
/** returns hour at which quiet hours start, or null if not set */
public static Integer getQuietHourStart(Context context) {
return getIntegerValue(context, R.string.p_notif_quietStart);
// return getIntegerValue(context, R.string.p_notif_quietStart);
return 0;
}
/** returns hour at which quiet hours start, or null if not set */
public static Integer getQuietHourEnd(Context context) {
return getIntegerValue(context, R.string.p_notif_quietEnd);
// return getIntegerValue(context, R.string.p_notif_quietEnd);
return 0;
}
/** returns hour at which quiet hours start, or null if not set */
public static int getNotificationIconTheme(Context context) {
Integer index = getIntegerValue(context, R.string.p_notif_icon);
if(index == null)
index = 0;
return index;
// Integer index = getIntegerValue(context, R.string.p_notif_icon);
// if(index == null)
// index = 0;
// return index;
return 0;
}
/** Get notification ring tone, or null if not set */
public static Uri getNotificationRingtone(Context context) {
Resources r = context.getResources();
String value = getPrefs(context).getString(r.getString(
R.string.p_notification_ringtone), "");
try {
return Uri.parse(value);
} catch (RuntimeException e) {
return null;
}
// String value = getPrefs(context).getString(r.getString(
// R.string.p_notification_ringtone), "");
//
// try {
// return Uri.parse(value);
// } catch (RuntimeException e) {
// return null;
// }
return null;
}
/** Get perstence mode setting */
public static boolean isPersistenceMode(Context context) {
Resources r = context.getResources();
return getPrefs(context).getBoolean(r.getString(
R.string.p_notif_annoy), DEFAULT_PERSISTENCE_MODE);
// return getPrefs(context).getBoolean(r.getString(
// R.string.p_notif_annoy), DEFAULT_PERSISTENCE_MODE);
return false;
}
/** Get vibration mode setting */
public static boolean shouldVibrate(Context context) {
Resources r = context.getResources();
return getPrefs(context).getBoolean(r.getString(
R.string.p_notif_vibrate), true);
// return getPrefs(context).getBoolean(r.getString(
// R.string.p_notif_vibrate), true);
return false;
}
/** Return # of days to remind by default */
@ -283,8 +289,9 @@ public class Preferences {
/** whether nags for postponing and other things should be shown */
public static boolean shouldShowNags(Context context) {
return getPrefs(context).getBoolean(context.getResources().
getString(R.string.p_nagging), true);
// return getPrefs(context).getBoolean(context.getResources().
// getString(R.string.p_nagging), true);
return false;
}
// --- appearance settings

@ -27,9 +27,9 @@ import java.util.List;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TabActivity;
import android.app.TimePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.ContentValues;
import android.content.DialogInterface;
@ -45,7 +45,6 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
@ -61,21 +60,22 @@ import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import android.widget.ToggleButton;
import android.widget.AdapterView.OnItemSelectedListener;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R;
import com.timsu.astrid.data.enums.RepeatInterval;
import com.timsu.astrid.data.task.AbstractTaskModel.RepeatInfo;
import com.timsu.astrid.data.task.TaskModelForEdit;
import com.timsu.astrid.data.task.AbstractTaskModel.RepeatInfo;
import com.timsu.astrid.utilities.AstridUtilities;
import com.timsu.astrid.widget.NumberPicker;
import com.timsu.astrid.widget.NumberPickerDialog;
import com.timsu.astrid.widget.NumberPickerDialog.OnNumberPickedListener;
import com.timsu.astrid.widget.TimeDurationControlSet;
import com.timsu.astrid.widget.NumberPickerDialog.OnNumberPickedListener;
import com.timsu.astrid.widget.TimeDurationControlSet.TimeDurationType;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService;
@ -938,7 +938,7 @@ public final class TaskEditActivity extends TabActivity {
hideUntil.setAdapter(adapter);
if(isNewTask()) {
hideUntil.setSelection(0);
hideUntil.setSelection(Preferences.getIntegerFromString(R.string.p_default_hideUntil_key));
} else if(date <= DUE_DATE_LESS_SEVEN){
hideUntil.setSelection((int)date);
} else {
@ -980,7 +980,7 @@ public final class TaskEditActivity extends TabActivity {
random = (CheckBox)findViewById(randomId);
mode = (Spinner)findViewById(modeId);
periodic = Preferences.getIntegerFromString(R.string.p_default_reminder_random)
periodic = Preferences.getIntegerFromString(R.string.p_rmd_default_random)
* DateUtilities.ONE_DAY;
updatePeriodicString();

@ -1,5 +1,6 @@
package com.todoroo.astrid.activity;
import java.util.Date;
import java.util.List;
import java.util.Map.Entry;
@ -28,6 +29,7 @@ import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.AdapterContextMenuInfo;
@ -52,6 +54,7 @@ import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.reminders.Notifications;
import com.todoroo.astrid.reminders.ReminderService;
import com.todoroo.astrid.reminders.ReminderService.AlarmScheduler;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.TaskService;
@ -540,7 +543,15 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
itemId = item.getGroupId();
Task task = new Task();
task.setId(itemId);
new ReminderService().scheduleAlarm(task);
ReminderService reminderService = new ReminderService();
reminderService.setScheduler(new AlarmScheduler() {
@Override
public void createAlarm(Task theTask, long time, int type) {
Toast.makeText(TaskListActivity.this, "Scheduled Alarm: " + //$NON-NLS-1$
new Date(time), Toast.LENGTH_LONG).show();
}
});
reminderService.scheduleAlarm(task);
return true;
}

@ -11,11 +11,11 @@ import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Paint;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
import android.widget.CheckBox;
import android.widget.CursorAdapter;
import android.widget.LinearLayout;
@ -34,6 +34,7 @@ import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.TaskDetail;
import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.utility.Preferences;
/**
* Adapter for displaying a user's tasks as a list
@ -83,6 +84,7 @@ public class TaskAdapter extends CursorAdapter {
private final int resource;
private final LayoutInflater inflater;
protected OnCompletedTaskListener onCompletedTaskListener = null;
private final int fontSize;
/**
* Constructor
@ -112,6 +114,7 @@ public class TaskAdapter extends CursorAdapter {
completedItems = new HashMap<Long, Boolean>();
detailCache = new HashMap<Long, ArrayList<TaskDetail>>();
fontSize = Preferences.getIntegerFromString(R.string.p_fontSize);
IMPORTANCE_COLORS = Task.getImportanceColors(activity.getResources());
}
@ -129,6 +132,7 @@ public class TaskAdapter extends CursorAdapter {
ViewHolder viewHolder = new ViewHolder();
viewHolder.task = new Task();
viewHolder.nameView = (TextView)view.findViewById(R.id.title);
viewHolder.nameView.setTextSize(fontSize);
viewHolder.completeBox = (CheckBox)view.findViewById(R.id.completeBox);
viewHolder.dueDate = (TextView)view.findViewById(R.id.dueDate);
viewHolder.details = (LinearLayout)view.findViewById(R.id.details);

@ -21,6 +21,7 @@ import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.utility.Preferences;
/**
* Data Model which represents a task users need to accomplish.
@ -184,10 +185,8 @@ public final class Task extends AbstractModel {
* Call to load task default values from preferences.
*/
public static void refreshDefaultValues() {
/*defaultValues.put(URGENCY.name,
Preferences.getIntegerFromString(R.string.EPr_default_urgency_key));
defaultValues.put(IMPORTANCE.name,
Preferences.getIntegerFromString(R.string.EPr_default_importance_key));*/
Preferences.getIntegerFromString(R.string.p_default_importance_key));
defaultValuesLoaded = true;
}
@ -260,8 +259,10 @@ public final class Task extends AbstractModel {
* @return true if hours, minutes, and seconds indicate end of day
*/
private static boolean isEndOfDay(Date date) {
return date.getHours() == 23 && date.getMinutes() == 59 &&
date.getSeconds() == 59;
int hours = date.getHours();
int minutes = date.getMinutes();
int seconds = date.getSeconds();
return hours == 23 && minutes == 59 && seconds == 59;
}
/**
@ -286,7 +287,7 @@ public final class Task extends AbstractModel {
* Checks whether this due date has a due time or only a date
*/
public boolean hasDueTime() {
return isEndOfDay(new Date(getValue(DUE_DATE)));
return !isEndOfDay(new Date(getValue(DUE_DATE)));
}
/**
@ -298,7 +299,7 @@ public final class Task extends AbstractModel {
public boolean getFlag(IntegerProperty property, int flag) {
return (getValue(property) & flag) > 0;
}
/**
* @return repeat data structure. Requires REPEAT
*/

@ -8,7 +8,6 @@ import android.preference.PreferenceManager;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.astrid.model.Task;
public class Preferences {
@ -21,22 +20,41 @@ public class Preferences {
Editor editor = prefs.edit();
Resources r = context.getResources();
if(getIntegerFromString(R.string.p_default_urgency_key) == null) {
editor.putString(r.getString(R.string.p_default_urgency_key),
Integer.toString(4));
}
if(getIntegerFromString(R.string.p_default_importance_key) == null) {
editor.putString(r.getString(R.string.p_default_importance_key),
Integer.toString(Task.IMPORTANCE_SHOULD_DO));
}
if(getIntegerFromString(R.string.p_reminder_time) == null) {
editor.putString(r.getString(R.string.p_reminder_time),
Integer.toString(12));
}
setIfUnset(prefs, editor, r, R.string.p_default_urgency_key, 4);
setIfUnset(prefs, editor, r, R.string.p_default_importance_key, 2);
setIfUnset(prefs, editor, r, R.string.p_default_hideUntil_key, 0);
editor.commit();
}
/**
* Helper to write to editor if key specified is null
* @param prefs
* @param editor
* @param r
* @param keyResource
* @param value
*/
public static void setIfUnset(SharedPreferences prefs, Editor editor, Resources r, int keyResource, int value) {
String key = r.getString(keyResource);
if(!prefs.contains(key))
editor.putString(key, Integer.toString(value));
}
/**
* Helper to write to editor if key specified is null
* @param prefs
* @param editor
* @param r
* @param keyResource
* @param value
*/
public static void setIfUnset(SharedPreferences prefs, Editor editor, Resources r, int keyResource, boolean value) {
String key = r.getString(keyResource);
if(!prefs.contains(key))
editor.putBoolean(key, value);
}
/* ======================================================================
* ========================================================= system prefs
* ====================================================================== */

@ -113,8 +113,8 @@ public class NotificationTests extends DatabaseTestCase {
intent.putExtra(Notifications.ID_KEY, task.getId());
int hour = new Date().getHours();
Preferences.setStringFromInteger(R.string.p_notif_quietStart, hour - 1);
Preferences.setStringFromInteger(R.string.p_notif_quietEnd, hour + 1);
Preferences.setStringFromInteger(R.string.p_rmd_quietStart, hour - 1);
Preferences.setStringFromInteger(R.string.p_rmd_quietEnd, hour + 1);
// due date notification has vibrate
Notifications.setNotificationManager(new TestNotificationManager() {
@ -142,8 +142,8 @@ public class NotificationTests extends DatabaseTestCase {
new Notifications().onReceive(getContext(), intent);
// wrapping works
Preferences.setStringFromInteger(R.string.p_notif_quietStart, hour + 2);
Preferences.setStringFromInteger(R.string.p_notif_quietEnd, hour + 1);
Preferences.setStringFromInteger(R.string.p_rmd_quietStart, hour + 2);
Preferences.setStringFromInteger(R.string.p_rmd_quietEnd, hour + 1);
Notifications.setNotificationManager(new TestNotificationManager() {
public void notify(int id, Notification notification) {
@ -157,7 +157,7 @@ public class NotificationTests extends DatabaseTestCase {
// nonstop notification still sounds
task.setValue(Task.REMINDER_FLAGS, Task.NOTIFY_NONSTOP);
task.save();
taskDao.persist(task);
Notifications.setNotificationManager(new TestNotificationManager() {
public void notify(int id, Notification notification) {
assertTrue(notification.sound != null ||

@ -19,20 +19,18 @@ public class DatabaseTestCase extends TodorooTestCase {
public static Database database = new TestDatabase();
public AlarmDatabase alarmsDatabase;
static {
AstridDependencyInjector.initialize();
// initialize test dependency injector
TestDependencyInjector injector = TestDependencyInjector.initialize("db");
injector.addInjectable("database", database);
}
@Override
protected void setUp() throws Exception {
super.setUp();
// initialize test dependency injector
TestDependencyInjector injector = TestDependencyInjector.initialize("db");
injector.addInjectable("database", database);
DependencyInjectionService.getInstance().inject(this);
// empty out test databases

@ -34,7 +34,9 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
private static final String TAGS_TEST = "tagstest";
private static final String TASKS_TEST = "taskstest";
// --- setup and teardnwo
// --- setup and teardown
private AlarmDatabase alarmsDatabase;
@Autowired
TaskDao taskDao;
@ -117,6 +119,7 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
taskController.saveTask(griffey, false);
TaskModelForEdit guti = new com.todoroo.astrid.legacy.data.task.TaskModelForEdit();
Date createdDate = new Date();
guti.setName("franklin gutierrez");
guti.setPreferredDueDate(new Date(System.currentTimeMillis() + 5000000L));
guti.setImportance(Importance.LEVEL_1);
@ -125,7 +128,6 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
guti.setElapsedSeconds(500);
guti.setNotificationIntervalSeconds(200);
taskController.saveTask(guti, false);
Date createdDate = new Date();
// assert created
assertEquals(2, taskController.getAllTaskIdentifiers().size());

Loading…
Cancel
Save