Merge branch 'dev'

pull/14/head
Tim Su 14 years ago
commit 579551e2cf

@ -247,6 +247,8 @@
</intent-filter>
</receiver>
<activity android:name="com.todoroo.astrid.reminders.NotificationActivity"
android:taskAffinity="com.todoroo.astrid.reminders.NotificationActivity"
android:screenOrientation="portrait"
android:clearTaskOnLaunch="true" />
<!-- rmilk -->

@ -6,12 +6,11 @@
<intAttribute key="ch.zork.quicklaunch.index" value="0"/>
<stringAttribute key="ch.zork.quicklaunch.mode" value="run"/>
<intAttribute key="com.android.ide.eclipse.adt.action" value="0"/>
<stringAttribute key="com.android.ide.eclipse.adt.avd" value="android-16"/>
<stringAttribute key="com.android.ide.eclipse.adt.commandline" value="-scale 0.7"/>
<intAttribute key="com.android.ide.eclipse.adt.delay" value="0"/>
<booleanAttribute key="com.android.ide.eclipse.adt.nobootanim" value="true"/>
<intAttribute key="com.android.ide.eclipse.adt.speed" value="0"/>
<booleanAttribute key="com.android.ide.eclipse.adt.target" value="true"/>
<booleanAttribute key="com.android.ide.eclipse.adt.target" value="false"/>
<booleanAttribute key="com.android.ide.eclipse.adt.wipedata" value="false"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/astrid"/>

@ -2,6 +2,7 @@ package com.todoroo.astrid.core;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.service.TaskService;
public final class PluginServices {
@ -9,6 +10,9 @@ public final class PluginServices {
@Autowired
TaskService taskService;
@Autowired
Database database;
private static PluginServices instance;
private PluginServices() {
@ -22,6 +26,7 @@ public final class PluginServices {
}
public static TaskService getTaskService() {
getInstance().database.openForWriting();
return getInstance().taskService;
}

@ -19,12 +19,22 @@
*/
package com.todoroo.astrid.reminders;
import android.app.Activity;
import java.util.Date;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import com.timsu.astrid.R;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
@ -36,7 +46,7 @@ import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
* @author timsu
*
*/
public class NotificationActivity extends Activity {
public class NotificationActivity extends TaskListActivity implements OnTimeSetListener {
// --- constants
@ -45,36 +55,88 @@ public class NotificationActivity extends Activity {
// --- implementation
private long taskId;
@Override
public void onCreate(Bundle savedInstanceState) {
populateFilter(getIntent());
super.onCreate(savedInstanceState);
launchTaskList(getIntent());
displayNotificationPopup();
}
@Override
protected void onNewIntent(Intent intent) {
populateFilter(intent);
super.onNewIntent(intent);
launchTaskList(intent);
}
private void launchTaskList(Intent intent) {
long id = intent.getLongExtra(TOKEN_ID, -1);
if(id == -1)
private void populateFilter(Intent intent) {
taskId = intent.getLongExtra(TOKEN_ID, -1);
if(taskId == -1)
return;
Intent taskListIntent = new Intent(this, TaskListActivity.class);
Filter itemFilter = new Filter(getString(R.string.rmd_NoA_filter),
getString(R.string.rmd_NoA_filter),
new QueryTemplate().where(TaskCriteria.byId(id)),
new QueryTemplate().where(TaskCriteria.byId(taskId)),
null);
intent.putExtra(TaskListActivity.TOKEN_FILTER, itemFilter);
}
/**
* Set up the UI for this activity
*/
private void displayNotificationPopup() {
// hide quick add
findViewById(R.id.taskListFooter).setVisibility(View.GONE);
// instantiate reminder window
ViewGroup parent = (ViewGroup) findViewById(R.id.taskListParent);
getLayoutInflater().inflate(R.layout.notification_control, parent, true);
String reminder = Notifications.getRandomReminder(getResources().getStringArray(R.array.responses));
taskListIntent.putExtra(TaskListActivity.TOKEN_FILTER, itemFilter);
taskListIntent.putExtra(TaskListActivity.TOKEN_REMINDER, reminder);
startActivity(taskListIntent);
((TextView)findViewById(R.id.reminderLabel)).setText(reminder);
// set up listeners
((Button)findViewById(R.id.goAway)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
finish();
}
});
((Button)findViewById(R.id.snooze)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
snooze();
}
});
}
/**
* Snooze and re-trigger this alarm
*/
private void snooze() {
Date now = new Date();
now.setHours(now.getHours() + 1);
int hour = now.getHours();
int minute = now.getMinutes();
TimePickerDialog timePicker = new TimePickerDialog(this, this,
hour, minute, DateUtilities.is24HourFormat(this));
timePicker.show();
}
/** snooze timer set */
@Override
public void onTimeSet(TimePicker picker, int hours, int minutes) {
Date alarmTime = new Date();
alarmTime.setHours(hours);
alarmTime.setMinutes(minutes);
if(alarmTime.getTime() < DateUtilities.now())
alarmTime.setDate(alarmTime.getDate() + 1);
ReminderService.getInstance().scheduleSnoozeAlarm(taskId, alarmTime.getTime());
finish();
}
}

@ -64,11 +64,21 @@ public final class ReminderService {
private AlarmScheduler scheduler = new ReminderAlarmScheduler();
public ReminderService() {
private ReminderService() {
DependencyInjectionService.getInstance().inject(this);
setPreferenceDefaults();
}
// --- singleton
private static ReminderService instance = null;
public static synchronized ReminderService getInstance() {
if(instance == null)
instance = new ReminderService();
return instance;
}
// --- preference handling
private static boolean preferencesInitialized = false;
@ -233,6 +243,18 @@ public final class ReminderService {
return NO_ALARM;
}
/**
* Schedule a snooze alarm for this task
* @param taskId
* @param time
*/
public void scheduleSnoozeAlarm(long taskId, long time) {
if(time < DateUtilities.now())
return;
Task task = taskDao.fetch(taskId, PROPERTIES);
scheduler.createAlarm(task, time, TYPE_SNOOZE);
}
// --- alarm manager alarm creation
/**
@ -287,7 +309,7 @@ public final class ReminderService {
}
}
// --- data fetching classes
// --- data fetching methods
/**
* Gets a listing of all tasks that are active &

@ -25,6 +25,6 @@ public class ReminderStartupReceiver extends BroadcastReceiver {
/** Called when the system is started up */
public void onReceive(Context context, Intent intent) {
ContextManager.setContext(context);
new ReminderService().scheduleAllAlarms();
ReminderService.getInstance().scheduleAllAlarms();
}
}

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible"
android:layout_weight="1">
<TextView android:id="@+id/reminderLabel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="I want you to be the walrus."
android:background="@drawable/reminder_popup"
style="@style/TextAppearance.TLA_Reminder" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/reminderLabel"
android:layout_alignParentLeft="true"
android:orientation="horizontal">
<Button android:id="@+id/snooze"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="49"
android:text="@string/rmd_NoA_snooze" />
<Button android:id="@+id/goAway"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="49"
android:text="@string/rmd_NoA_goAway" />
<ImageView android:id="@+id/astridIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:paddingRight="15dip"
android:paddingLeft="5dip"
android:src="@drawable/icon_blank" />
</LinearLayout>
</RelativeLayout>

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/taskListParent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/background_gradient"
@ -57,34 +58,10 @@
android:layout_height="fill_parent"/>
</FrameLayout>
<!-- Reminder -->
<RelativeLayout android:id="@+id/reminderContainer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:layout_weight="1">
<TextView android:id="@+id/reminderLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
style="@style/TextAppearance.TLA_Reminder"
android:background="@drawable/reminder_popup"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="15px"
android:layout_below="@id/reminderLabel"
android:layout_alignParentRight="true"
android:src="@drawable/icon_blank" />
</RelativeLayout>
<!-- Footer -->
<LinearLayout
android:id="@+id/taskListFooter"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"

@ -51,6 +51,12 @@
<!-- Name of filter when viewing a reminder -->
<string name="rmd_NoA_filter">Reminder!</string>
<!-- Snooze button (remind again later) -->
<string name="rmd_NoA_snooze">Snooze...</string>
<!-- Cancel reminder -->
<string name="rmd_NoA_goAway">Go Away!</string>
<!-- ============================================= reminder preferences == -->

@ -27,11 +27,12 @@ import java.util.List;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.TabActivity;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TabActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
@ -42,6 +43,7 @@ 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.CheckBox;
import android.widget.CompoundButton;
@ -55,7 +57,6 @@ import android.widget.TabHost;
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;
@ -75,8 +76,8 @@ import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.tags.TagsControlSet;
import com.todoroo.astrid.ui.DeadlineTimePickerDialog;
import com.todoroo.astrid.ui.TimeDurationControlSet;
import com.todoroo.astrid.ui.DeadlineTimePickerDialog.OnDeadlineTimeSetListener;
import com.todoroo.astrid.ui.TimeDurationControlSet;
import com.todoroo.astrid.ui.TimeDurationControlSet.TimeDurationType;
import com.todoroo.astrid.utility.Constants;
@ -678,12 +679,14 @@ public final class TaskEditActivity extends TabActivity {
// --- UrgencyControlSet
private class UrgencyControlSet implements TaskEditControlSet,
OnItemSelectedListener, OnDeadlineTimeSetListener, OnDateSetListener {
OnItemSelectedListener, OnDeadlineTimeSetListener, OnDateSetListener,
OnCancelListener {
private static final long SPECIFIC_DATE = -1;
private final Spinner urgency;
private final Spinner spinner;
private ArrayAdapter<UrgencyValue> urgencyAdapter;
private int previousSetting = Task.URGENCY_NONE;
/**
* Container class for urgencies
@ -715,8 +718,8 @@ public final class TaskEditActivity extends TabActivity {
}
public UrgencyControlSet(int urgency) {
this.urgency = (Spinner)findViewById(urgency);
this.urgency.setOnItemSelectedListener(this);
this.spinner = (Spinner)findViewById(urgency);
this.spinner.setOnItemSelectedListener(this);
}
/**
@ -771,8 +774,8 @@ public final class TaskEditActivity extends TabActivity {
TaskEditActivity.this, android.R.layout.simple_spinner_item,
urgencyValues);
urgencyAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
this.urgency.setAdapter(urgencyAdapter);
this.urgency.setSelection(selection);
this.spinner.setAdapter(urgencyAdapter);
this.spinner.setSelection(selection);
}
// --- listening for events
@ -788,7 +791,10 @@ public final class TaskEditActivity extends TabActivity {
customDate.setSeconds(0);
DatePickerDialog datePicker = new DatePickerDialog(TaskEditActivity.this,
this, 1900 + customDate.getYear(), customDate.getMonth(), customDate.getDate());
datePicker.setOnCancelListener(this);
datePicker.show();
} else {
previousSetting = position;
}
}
@ -811,9 +817,11 @@ public final class TaskEditActivity extends TabActivity {
return;
}
new DeadlineTimePickerDialog(TaskEditActivity.this, this,
DeadlineTimePickerDialog timePicker = new DeadlineTimePickerDialog(TaskEditActivity.this, this,
customDate.getHours(), customDate.getMinutes(),
DateUtilities.is24HourFormat(TaskEditActivity.this)).show();
DateUtilities.is24HourFormat(TaskEditActivity.this));
timePicker.setOnCancelListener(this);
timePicker.show();
}
public void onTimeSet(TimePicker view, boolean hasTime, int hourOfDay, int minute) {
@ -826,6 +834,12 @@ public final class TaskEditActivity extends TabActivity {
customDateFinished();
}
@Override
public void onCancel(DialogInterface dialog) {
// user canceled, restore previous choice
spinner.setSelection(previousSetting);
}
private void customDateFinished() {
long time = model.createDueDate(customSetting, customDate.getTime());
createUrgencyList(time);
@ -841,10 +855,11 @@ public final class TaskEditActivity extends TabActivity {
@Override
public void writeToModel(Task task) {
UrgencyValue item = urgencyAdapter.getItem(urgency.getSelectedItemPosition());
if(item.dueDate != SPECIFIC_DATE) // user cancelled specific date
UrgencyValue item = urgencyAdapter.getItem(spinner.getSelectedItemPosition());
if(item.dueDate != SPECIFIC_DATE) // user canceled specific date
task.setValue(Task.DUE_DATE, item.dueDate);
}
}
/**
@ -854,14 +869,15 @@ public final class TaskEditActivity extends TabActivity {
*
*/
private class HideUntilControlSet implements TaskEditControlSet,
OnItemSelectedListener, OnDateSetListener {
OnItemSelectedListener, OnDateSetListener, OnCancelListener {
private static final int SPECIFIC_DATE = -1;
private final Spinner hideUntil;
private final Spinner spinner;
private int previousSetting = Task.HIDE_UNTIL_NONE;
public HideUntilControlSet(int hideUntil) {
this.hideUntil = (Spinner) findViewById(hideUntil);
this.hideUntil.setOnItemSelectedListener(this);
this.spinner = (Spinner) findViewById(hideUntil);
this.spinner.setOnItemSelectedListener(this);
}
private ArrayAdapter<HideUntilValue> adapter;
@ -928,7 +944,10 @@ public final class TaskEditActivity extends TabActivity {
intermediateDate.setSeconds(0);
DatePickerDialog datePicker = new DatePickerDialog(TaskEditActivity.this,
this, 1900 + intermediateDate.getYear(), intermediateDate.getMonth(), intermediateDate.getDate());
datePicker.setOnCancelListener(this);
datePicker.show();
} else {
previousSetting = position;
}
}
@ -948,14 +967,20 @@ public final class TaskEditActivity extends TabActivity {
customDateFinished();
}
@Override
public void onCancel(DialogInterface dialog) {
// user canceled, restore previous choice
spinner.setSelection(previousSetting);
}
private void customDateFinished() {
HideUntilValue[] list = createHideUntilList(intermediateDate.getTime());
adapter = new ArrayAdapter<HideUntilValue>(
TaskEditActivity.this, android.R.layout.simple_spinner_item,
list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
hideUntil.setAdapter(adapter);
hideUntil.setSelection(0);
spinner.setAdapter(adapter);
spinner.setSelection(0);
}
// --- setting up values
@ -985,14 +1010,14 @@ public final class TaskEditActivity extends TabActivity {
adapter = new ArrayAdapter<HideUntilValue>(
TaskEditActivity.this, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
hideUntil.setAdapter(adapter);
spinner.setAdapter(adapter);
hideUntil.setSelection(selection);
spinner.setSelection(selection);
}
@Override
public void writeToModel(Task task) {
HideUntilValue item = adapter.getItem(hideUntil.getSelectedItemPosition());
HideUntilValue item = adapter.getItem(spinner.getSelectedItemPosition());
long value = task.createHideUntil(item.setting, item.date);
task.setValue(Task.HIDE_UNTIL, value);
}

@ -105,9 +105,6 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
/** token for passing a {@link Filter} object through extras */
public static final String TOKEN_FILTER = "filter"; //$NON-NLS-1$
/** token for passing a reminder string through extras */
public static final String TOKEN_REMINDER = "reminder"; //$NON-NLS-1$
// --- instance variables
@Autowired
@ -303,12 +300,6 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
}
});
// show reminder if necessary
String reminder = getIntent().getStringExtra(TOKEN_REMINDER);
if(reminder != null) {
findViewById(R.id.reminderContainer).setVisibility(View.VISIBLE);
((TextView)findViewById(R.id.reminderLabel)).setText(reminder);
}
}
/**
@ -703,18 +694,19 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
itemId = item.getGroupId();
Task task = new Task();
task.setId(itemId);
final ReminderService reminderService = new ReminderService();
reminderService.setScheduler(new AlarmScheduler() {
AlarmScheduler original = ReminderService.getInstance().getScheduler();
ReminderService.getInstance().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.setScheduler(null);
ReminderService.getInstance().setScheduler(null);
}
});
reminderService.scheduleAlarm(task);
if(reminderService.getScheduler() != null)
ReminderService.getInstance().scheduleAlarm(task);
if(ReminderService.getInstance().getScheduler() != null)
Toast.makeText(this, "No alarms", Toast.LENGTH_LONG).show(); //$NON-NLS-1$
ReminderService.getInstance().setScheduler(original);
return true;
}

@ -41,8 +41,6 @@ public class TaskDao extends GenericDao<Task> {
@Autowired
ExceptionService exceptionService;
ReminderService reminderService;
public TaskDao() {
super(Task.class);
DependencyInjectionService.getInstance().inject(this);
@ -230,15 +228,13 @@ public class TaskDao extends GenericDao<Task> {
if(values.containsKey(Task.COMPLETION_DATE.name) && task.isCompleted())
afterComplete(task, values, duringSync);
else {
if(reminderService == null)
reminderService = new ReminderService();
reminderService.scheduleAlarm(task);
ReminderService.getInstance().scheduleAlarm(task);
}
if(duringSync)
return;
// due date was updated, update calendar event
// TODO due date was updated, update calendar event
/*if((values.containsKey(AbstractTaskModel.DEFINITE_DUE_DATE) ||
values.containsKey(AbstractTaskModel.PREFERRED_DUE_DATE)) &&
!values.containsKey(AbstractTaskModel.CALENDAR_URI)) {
@ -265,7 +261,7 @@ public class TaskDao extends GenericDao<Task> {
// create new start and end date for this event
ContentValues newValues = new ContentValues();
TaskEditActivity.createCalendarStartEndTimes(task.getPreferredDueDate(),
task.getDefiniteDueDate(), estimated, newValues); TODO
task.getDefiniteDueDate(), estimated, newValues);
cr.update(uri, newValues, null, null);
}
} catch (Exception e) {

@ -20,7 +20,6 @@ import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.service.ExceptionService.TodorooUncaughtExceptionHandler;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.reminders.ReminderService;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.utility.Preferences;
import com.todoroo.astrid.widget.TasksWidget.UpdateService;
@ -92,9 +91,6 @@ public class StartupService {
// perform startup activities in a background thread
new Thread(new Runnable() {
public void run() {
// schedule alarms
new ReminderService().scheduleAllAlarms();
// start widget updating alarm
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, UpdateService.class);

@ -28,7 +28,7 @@ public final class Constants {
/**
* Whether to turn on debugging logging and UI
*/
public static final boolean DEBUG = false;
public static final boolean DEBUG = true;
// --- notification id's

@ -19,23 +19,14 @@
*/
package com.todoroo.astrid.legacy.data.enums;
import com.timsu.astrid.R;
public enum Importance {
// MOST IMPORTANT
LEVEL_1(R.string.importance_1,
R.color.importance_1,
R.color.task_list_importance_1),
LEVEL_2(R.string.importance_2,
R.color.importance_2,
R.color.task_list_importance_2),
LEVEL_3(R.string.importance_3,
R.color.importance_3,
R.color.task_list_importance_3),
LEVEL_4(R.string.importance_4,
R.color.importance_4,
R.color.task_list_importance_4),
LEVEL_1(0,0,0),
LEVEL_2(0,0,0),
LEVEL_3(0,0,0),
LEVEL_4(0,0,0)
// LEAST IMPORTANT
;

@ -23,29 +23,27 @@ import java.util.Date;
import android.content.res.Resources;
import com.timsu.astrid.R;
public enum RepeatInterval {
DAYS(R.string.repeat_days) {
DAYS(0) {
@Override
public void offsetDateBy(Date input, int number) {
input.setDate(input.getDate() + number);
}
},
WEEKS(R.string.repeat_weeks) {
WEEKS(0) {
@Override
public void offsetDateBy(Date input, int number) {
input.setDate(input.getDate() + 7 * number);
}
},
MONTHS(R.string.repeat_months) {
MONTHS(0) {
@Override
public void offsetDateBy(Date input, int number) {
input.setMonth(input.getMonth() + number);
}
},
HOURS(R.string.repeat_hours) {
HOURS(0) {
@Override
public void offsetDateBy(Date input, int number) {
input.setHours(input.getHours() + number);

@ -7,7 +7,7 @@ import android.database.Cursor;
import android.util.Log;
import com.timsu.astrid.R;
import com.timsu.astrid.utilities.BackupDateUtilities;
import com.todoroo.astrid.backup.BackupDateUtilities;
import com.todoroo.astrid.legacy.data.AbstractController;
import com.todoroo.astrid.legacy.data.enums.Importance;
import com.todoroo.astrid.legacy.data.enums.RepeatInterval;

Loading…
Cancel
Save