Add injections

* InjectingContentProvider
* TasksXmlImporter/Exporter
* ReminderService
pull/189/head
Alex Baker 10 years ago
parent faf05d64d1
commit 4a992b35f1

@ -124,8 +124,7 @@ abstract public class AbstractDatabase {
if(ContextManager.getContext() == null) {
throw new NullPointerException("Null context creating database helper");
}
helper = new DatabaseHelper(ContextManager.getContext(),
getName(), getVersion());
helper = new DatabaseHelper(ContextManager.getContext(), getName(), getVersion());
}
}

@ -157,7 +157,7 @@ public class TitleParserTest extends DatabaseTestCase {
private void insertTitleAddTask(String title, Task task) {
task.clear();
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
}
@ -168,7 +168,7 @@ public class TitleParserTest extends DatabaseTestCase {
String title = "Jog today";
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
Date date = newDate(task.getDueDate());
assertEquals(date.getDay()+1, today.get(Calendar.DAY_OF_WEEK));
//Calendar starts 1-6, date.getDay() starts at 0
@ -176,7 +176,7 @@ public class TitleParserTest extends DatabaseTestCase {
task = new Task();
title = "Jog tomorrow";
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
date = newDate(task.getDueDate());
assertEquals((date.getDay()+1) % 7, (today.get(Calendar.DAY_OF_WEEK)+1) % 7);
@ -203,14 +203,14 @@ public class TitleParserTest extends DatabaseTestCase {
task = new Task();
title = "Jog "+ days[i];
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
date = newDate(task.getDueDate());
assertEquals(date.getDay(), i);
task = new Task();
title = "Jog "+ abrevDays[i];
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
date = newDate(task.getDueDate());
assertEquals(date.getDay(), i);
}
@ -234,14 +234,14 @@ public class TitleParserTest extends DatabaseTestCase {
task = new Task();
String title = "Jog " + acceptedString;
task.setTitle(title); //test at end of task. should set importance.
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_LEAST);
}
for (String acceptedString:acceptedStrings){
task = new Task();
String title = acceptedString + " jog";
task.setTitle(title); //test at beginning of task. should not set importance.
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertNotSame(task.getImportance(),Task.IMPORTANCE_LEAST);
}
}
@ -298,25 +298,25 @@ public class TitleParserTest extends DatabaseTestCase {
task = new Task();
String title = "Jog " + acceptedStringAtEnd;
task.setTitle(title); //test at end of task. should set importance.
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_MUST_DO);
task = new Task();
title = acceptedStringAtEnd + " jog";
task.setTitle(title); //test at beginning of task. should not set importance.
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertNotSame(task.getImportance(), Task.IMPORTANCE_MUST_DO);
}
for (String acceptedStringAnywhere:acceptedStringsAnywhere){
task = new Task();
String title = "Jog " + acceptedStringAnywhere;
task.setTitle(title); //test at end of task. should set importance.
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_MUST_DO);
title = acceptedStringAnywhere + " jog";
task.setTitle(title); //test at beginning of task. should set importance.
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_MUST_DO);
}
}
@ -340,25 +340,25 @@ public class TitleParserTest extends DatabaseTestCase {
task = new Task();
String title = "Jog " + acceptedStringAtEnd;
task.setTitle(title); //test at end of task. should set importance.
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_DO_OR_DIE);
task = new Task();
title = acceptedStringAtEnd + " jog";
task.setTitle(title); //test at beginning of task. should not set importance.
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertNotSame(task.getImportance(), Task.IMPORTANCE_DO_OR_DIE);
}
for (String acceptedStringAnywhere:acceptedStringsAnywhere){
task = new Task();
String title = "Jog " + acceptedStringAnywhere;
task.setTitle(title); //test at end of task. should set importance.
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_DO_OR_DIE);
title = acceptedStringAnywhere + " jog";
task.setTitle(title); //test at beginning of task. should set importance.
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_DO_OR_DIE);
}
}
@ -374,7 +374,7 @@ public class TitleParserTest extends DatabaseTestCase {
Task task = new Task();
String title = "Jog daily";
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
RRule rrule = new RRule();
rrule.setFreq(Frequency.DAILY);
rrule.setInterval(1);
@ -384,7 +384,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every day";
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
@ -393,7 +393,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every " + i + " days.";
task.setTitle(title);
rrule.setInterval(i);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
@ -407,7 +407,7 @@ public class TitleParserTest extends DatabaseTestCase {
Task task = new Task();
String title = "Jog weekly";
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
RRule rrule = new RRule();
rrule.setFreq(Frequency.WEEKLY);
rrule.setInterval(1);
@ -417,7 +417,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every week";
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
@ -426,7 +426,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every " + i + " weeks";
task.setTitle(title);
rrule.setInterval(i);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
@ -439,7 +439,7 @@ public class TitleParserTest extends DatabaseTestCase {
Task task = new Task();
String title = "Jog monthly";
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
RRule rrule = new RRule();
rrule.setFreq(Frequency.MONTHLY);
rrule.setInterval(1);
@ -449,7 +449,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every month";
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
@ -458,7 +458,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every " + i + " months";
task.setTitle(title);
rrule.setInterval(i);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
@ -470,7 +470,7 @@ public class TitleParserTest extends DatabaseTestCase {
Task task = new Task();
String title = "Jog daily starting from today";
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
RRule rrule = new RRule();
rrule.setFreq(Frequency.DAILY);
rrule.setInterval(1);
@ -481,7 +481,7 @@ public class TitleParserTest extends DatabaseTestCase {
task.clearValue(Task.UUID);
title = "Jog every day starting from today";
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertTrue(task.hasDueDate());
@ -489,7 +489,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every " + i + " days starting from today";
task.setTitle(title);
rrule.setInterval(i);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertTrue(task.hasDueDate());
task = new Task();
@ -500,7 +500,7 @@ public class TitleParserTest extends DatabaseTestCase {
Task task = new Task();
String title = "Jog weekly starting from today";
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
RRule rrule = new RRule();
rrule.setFreq(Frequency.WEEKLY);
rrule.setInterval(1);
@ -511,7 +511,7 @@ public class TitleParserTest extends DatabaseTestCase {
task.clearValue(Task.UUID);
title = "Jog every week starting from today";
task.setTitle(title);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertTrue(task.hasDueDate());
@ -519,7 +519,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every " + i + " weeks starting from today";
task.setTitle(title);
rrule.setInterval(i);
TaskService.createWithValues(metadataService, tagService, task, null, title);
TaskService.createWithValues(taskService, metadataService, tagService, task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertTrue(task.hasDueDate());
task = new Task();

@ -15,7 +15,7 @@ public class SubtasksHelperTest extends SubtasksTestCase {
createTasks();
TaskListMetadata m = new TaskListMetadata();
m.setFilter(TaskListMetadata.FILTER_ID_ALL);
updater.initializeFromSerializedTree(m, filter, SubtasksHelper.convertTreeToRemoteIds(DEFAULT_SERIALIZED_TREE));
updater.initializeFromSerializedTree(m, filter, SubtasksHelper.convertTreeToRemoteIds(taskService, DEFAULT_SERIALIZED_TREE));
}
private void createTask(String title, String uuid) {
@ -48,7 +48,7 @@ public class SubtasksHelperTest extends SubtasksTestCase {
private static String EXPECTED_REMOTE = "[\"-1\", [\"6\", \"4\", [\"3\", \"1\"]], \"2\", \"5\"]".replaceAll("\\s", "");
public void disabled_testLocalToRemoteIdMapping() {
String mapped = SubtasksHelper.convertTreeToRemoteIds(DEFAULT_SERIALIZED_TREE).replaceAll("\\s", "");
String mapped = SubtasksHelper.convertTreeToRemoteIds(taskService, DEFAULT_SERIALIZED_TREE).replaceAll("\\s", "");
assertEquals(EXPECTED_REMOTE, mapped);
}
}

@ -17,7 +17,7 @@ public class SubtasksMovingTest extends SubtasksTestCase {
createTasks();
TaskListMetadata m = new TaskListMetadata();
m.setFilter(TaskListMetadata.FILTER_ID_ALL);
updater.initializeFromSerializedTree(m, filter, SubtasksHelper.convertTreeToRemoteIds(DEFAULT_SERIALIZED_TREE));
updater.initializeFromSerializedTree(m, filter, SubtasksHelper.convertTreeToRemoteIds(taskService, DEFAULT_SERIALIZED_TREE));
// Assert initial state is correct
expectParentAndPosition(A, null, 0);

@ -14,15 +14,10 @@ import com.todoroo.astrid.service.AstridDependencyInjector;
public class BackupStartupReceiver extends BroadcastReceiver {
static {
AstridDependencyInjector.initialize();
}
@Override
/** Called when device is restarted */
public void onReceive(final Context context, Intent intent) {
ContextManager.setContext(context);
BackupService.scheduleService(context);
}
}

@ -17,8 +17,6 @@ import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.PropertyVisitor;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities;
@ -34,12 +32,15 @@ import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.utility.AstridPreferences;
import org.tasks.R;
import org.tasks.injection.Injector;
import org.xmlpull.v1.XmlSerializer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.inject.Inject;
public class TasksXmlExporter {
private static final String TAG = "TasksXmlExporter";
@ -66,9 +67,9 @@ public class TasksXmlExporter {
// --- implementation
@Autowired TagDataService tagDataService;
@Autowired MetadataService metadataService;
@Autowired TaskService taskService;
@Inject TagDataService tagDataService;
@Inject MetadataService metadataService;
@Inject TaskService taskService;
// 3 is started on Version 4.6.10
private static final int FORMAT = 3;
@ -93,7 +94,7 @@ public class TasksXmlExporter {
}
private TasksXmlExporter(final Context context, final ExportType exportType, File backupDirectoryOverride) {
DependencyInjectionService.getInstance().inject(this);
((Injector) context.getApplicationContext()).inject(this);
this.context = context;
this.exportCount = 0;

@ -22,9 +22,7 @@ import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.PropertyVisitor;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities;
@ -44,6 +42,7 @@ import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.tags.TaskToTagMetadata;
import org.tasks.R;
import org.tasks.injection.Injector;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
@ -54,6 +53,8 @@ import java.util.Date;
import java.util.LinkedHashSet;
import java.util.StringTokenizer;
import javax.inject.Inject;
public class TasksXmlImporter {
private static final String TAG = "TasksXmlImporter";
@ -69,10 +70,10 @@ public class TasksXmlImporter {
// --- implementation
@Autowired TagDataService tagDataService;
@Autowired TagService tagService;
@Autowired MetadataService metadataService;
@Autowired TaskService taskService;
@Inject TagDataService tagDataService;
@Inject TagService tagService;
@Inject MetadataService metadataService;
@Inject TaskService taskService;
private final Handler handler;
private int taskCount;
@ -99,7 +100,7 @@ public class TasksXmlImporter {
* @param runAfterImport optional runnable after import
*/
private TasksXmlImporter(final Context context, String input, Runnable runAfterImport) {
DependencyInjectionService.getInstance().inject(this);
((Injector) context.getApplicationContext()).inject(this);
this.input = input;
this.context = context;

@ -40,13 +40,15 @@ public class TaskDao extends RemoteModelDao<Task> {
private final MetadataDao metadataDao;
private final Broadcaster broadcaster;
private final ReminderService reminderService;
@Inject
public TaskDao(Database database, MetadataDao metadataDao, Broadcaster broadcaster) {
public TaskDao(Database database, MetadataDao metadataDao, Broadcaster broadcaster, ReminderService reminderService) {
super(Task.class);
setDatabase(database);
this.metadataDao = metadataDao;
this.broadcaster = broadcaster;
this.reminderService = reminderService;
}
// --- SQL clause generators
@ -344,7 +346,7 @@ public class TaskDao extends RemoteModelDao<Task> {
values.containsKey(Task.REMINDER_PERIOD.name) ||
values.containsKey(Task.REMINDER_LAST.name) ||
values.containsKey(Task.REMINDER_SNOOZE.name)) {
ReminderService.getInstance().scheduleAlarm(task);
reminderService.scheduleAlarm(this, task);
}
}

@ -5,7 +5,6 @@
*/
package com.todoroo.astrid.provider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
@ -15,7 +14,6 @@ import android.net.Uri;
import android.util.Log;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query;
@ -23,15 +21,20 @@ import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.tags.TagService.Tag;
import org.tasks.injection.InjectingContentProvider;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.inject.Inject;
import dagger.Lazy;
/**
* This is the legacy Astrid task provider. While it will continue to be
* supported, note that it does not expose all of the information in
@ -42,7 +45,7 @@ import java.security.NoSuchAlgorithmException;
* @author Tim Su <tim@todoroo.com>
*
*/
public class Astrid2TaskProvider extends ContentProvider {
public class Astrid2TaskProvider extends InjectingContentProvider {
private static final String TAG = "MessageProvider";
@ -79,9 +82,8 @@ public class Astrid2TaskProvider extends ContentProvider {
private static final String TAG_SEPARATOR = "|";
@Autowired private TaskService taskService;
@Autowired private TagService tagService;
@Inject Lazy<TaskService> taskService;
@Inject Lazy<TagService> tagService;
private static Context ctx = null;
@ -111,7 +113,8 @@ public class Astrid2TaskProvider extends ContentProvider {
@Override
public boolean onCreate() {
ctx = getContext();
super.onCreate();
ctx = getContext();
ContextManager.setContext(ctx);
return false;
}
@ -124,8 +127,8 @@ public class Astrid2TaskProvider extends ContentProvider {
*/
public Cursor getTags() {
Tag[] tags = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE,
Criterion.all);
Tag[] tags = tagService.get().getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE,
Criterion.all);
MatrixCursor ret = new MatrixCursor(TAGS_FIELD_LIST);
@ -170,10 +173,10 @@ public class Astrid2TaskProvider extends ContentProvider {
MatrixCursor ret = new MatrixCursor(TASK_FIELD_LIST);
TodorooCursor<Task> cursor = getTaskService().query(Query.select(Task.ID, Task.TITLE,
Task.IMPORTANCE, Task.DUE_DATE).where(Criterion.and(TaskCriteria.isActive(),
TaskCriteria.isVisible())).
orderBy(SortHelper.defaultTaskOrder()).limit(MAX_NUMBER_OF_TASKS));
TodorooCursor<Task> cursor = taskService.get().query(Query.select(Task.ID, Task.TITLE,
Task.IMPORTANCE, Task.DUE_DATE).where(Criterion.and(TaskCriteria.isActive(),
TaskCriteria.isVisible())).
orderBy(SortHelper.defaultTaskOrder()).limit(MAX_NUMBER_OF_TASKS));
try {
int[] importanceColors = Task.getImportanceColors(ctx.getResources());
Task task = new Task();
@ -181,7 +184,7 @@ public class Astrid2TaskProvider extends ContentProvider {
cursor.moveToNext();
task.readFromCursor(cursor);
String taskTags = tagService.getTagsAsString(task.getId(), TAG_SEPARATOR);
String taskTags = tagService.get().getTagsAsString(task.getId(), TAG_SEPARATOR);
Object[] values = new Object[7];
values[0] = task.getTitle();
@ -263,7 +266,7 @@ public class Astrid2TaskProvider extends ContentProvider {
replace(ID, Task.ID.name).
replace(IMPORTANCE, Task.IMPORTANCE.name);
return getTaskService().updateBySelection(criteria, selectionArgs, task);
return taskService.get().updateBySelection(criteria, selectionArgs, task);
case URI_TAGS:
throw new UnsupportedOperationException("tags updating: not yet");
@ -288,11 +291,4 @@ public class Astrid2TaskProvider extends ContentProvider {
// no context was available
}
}
private TaskService getTaskService() {
if (taskService == null) {
AstridDependencyInjector.inject(this);
}
return taskService;
}
}

@ -5,7 +5,6 @@
*/
package com.todoroo.astrid.provider;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
@ -19,7 +18,6 @@ import android.text.TextUtils;
import com.todoroo.andlib.data.AbstractDatabase;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.DatabaseDao;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.Database;
@ -31,12 +29,17 @@ import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.UserActivity;
import com.todoroo.astrid.service.AstridDependencyInjector;
import org.tasks.injection.InjectingContentProvider;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.Set;
import javax.inject.Inject;
import dagger.Lazy;
/**
* Astrid 3 Content Provider. There are two ways to use this content provider:
* <ul>
@ -64,7 +67,7 @@ import java.util.Set;
* @author Tim Su <tim@todoroo.com>
*
*/
public class Astrid3ContentProvider extends ContentProvider {
public class Astrid3ContentProvider extends InjectingContentProvider {
/** URI for making a request over all items */
private static final int URI_DIR = 1;
@ -81,20 +84,12 @@ public class Astrid3ContentProvider extends ContentProvider {
// --- instance variables
@Autowired private Database database;
@Autowired private TaskDao taskDao;
@Autowired private MetadataDao metadataDao;
@Autowired private StoreObjectDao storeObjectDao;
@Autowired private UserActivityDao userActivityDao;
@Override
public boolean onCreate() {
return true;
}
private boolean open;
@Inject Lazy<Database> database;
@Inject Lazy<TaskDao> taskDao;
@Inject Lazy<MetadataDao> metadataDao;
@Inject Lazy<StoreObjectDao> storeObjectDao;
@Inject Lazy<UserActivityDao> userActivityDao;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
@ -159,25 +154,25 @@ public class Astrid3ContentProvider extends ContentProvider {
if(uri.toString().startsWith(Task.CONTENT_URI.toString())) {
UriHelper<Task> helper = new UriHelper<>();
helper.model = populateModel ? new Task() : null;
helper.dao = taskDao;
helper.dao = taskDao.get();
helper.dao.setDatabase(db);
return helper;
} else if(uri.toString().startsWith(Metadata.CONTENT_URI.toString())) {
UriHelper<Metadata> helper = new UriHelper<>();
helper.model = populateModel ? new Metadata() : null;
helper.dao = metadataDao;
helper.dao = metadataDao.get();
helper.dao.setDatabase(db);
return helper;
} else if(uri.toString().startsWith(StoreObject.CONTENT_URI.toString())) {
UriHelper<StoreObject> helper = new UriHelper<>();
helper.model = populateModel ? new StoreObject() : null;
helper.dao = storeObjectDao;
helper.dao = storeObjectDao.get();
helper.dao.setDatabase(db);
return helper;
} else if(uri.toString().startsWith(UserActivity.CONTENT_URI.toString())) {
UriHelper<UserActivity> helper = new UriHelper<>();
helper.model = populateModel ? new UserActivity() : null;
helper.dao = userActivityDao;
helper.dao = userActivityDao.get();
helper.dao.setDatabase(db);
return helper;
}
@ -190,14 +185,14 @@ public class Astrid3ContentProvider extends ContentProvider {
}
private AbstractDatabase getDatabase() {
if (database == null) {
AstridDependencyInjector.inject(this);
database.openForWriting();
if (!open) {
database.get().openForWriting();
open = true;
}
if(databaseOverride != null) {
return databaseOverride;
}
return database;
return database.get();
}
/* ======================================================================

@ -5,17 +5,20 @@
*/
package com.todoroo.astrid.provider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import com.todoroo.andlib.data.AbstractDatabase;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.service.AstridDependencyInjector;
import org.tasks.injection.InjectingContentProvider;
import javax.inject.Inject;
import dagger.Lazy;
/**
* Non-public-API SQL content provider.
@ -27,7 +30,7 @@ import com.todoroo.astrid.service.AstridDependencyInjector;
* @author Tim Su <tim@todoroo.com>
*
*/
public class SqlContentProvider extends ContentProvider {
public class SqlContentProvider extends InjectingContentProvider {
// --- instance variables
@ -40,12 +43,8 @@ public class SqlContentProvider extends ContentProvider {
"sql", 0);
}
@Autowired private Database database;
@Override
public boolean onCreate() {
return true;
}
private boolean open;
@Inject Lazy<Database> database;
public SqlContentProvider() {
setReadPermission(AstridApiConstants.PERMISSION_READ);
@ -92,8 +91,7 @@ public class SqlContentProvider extends ContentProvider {
* ====================================================================== */
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
throw new UnsupportedOperationException("unimplemented");
}
@ -116,11 +114,11 @@ public class SqlContentProvider extends ContentProvider {
}
private AbstractDatabase getDatabase() {
if (database == null) {
AstridDependencyInjector.inject(this);
database.openForWriting();
if (!open) {
database.get().openForWriting();
open = true;
}
return database;
return database.get();
}
}

@ -12,6 +12,7 @@ import android.util.Log;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.alarms.AlarmService;
import com.todoroo.astrid.dao.TaskDao;
import org.tasks.injection.InjectingService;
import org.tasks.scheduling.RefreshScheduler;
@ -28,6 +29,8 @@ public class ReminderSchedulingService extends InjectingService {
@Inject RefreshScheduler refreshScheduler;
@Inject AlarmService alarmService;
@Inject ReminderService reminderService;
@Inject TaskDao taskDao;
/** Receive the alarm - start the synchronize service! */
@Override
@ -48,7 +51,7 @@ public class ReminderSchedulingService extends InjectingService {
private void scheduleReminders() {
try {
ReminderService.getInstance().scheduleAllAlarms();
reminderService.scheduleAllAlarms(taskDao);
alarmService.scheduleAllAlarms();
refreshScheduler.scheduleAllAlarms();

@ -15,9 +15,7 @@ import android.content.res.Resources;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities;
@ -32,6 +30,9 @@ import org.tasks.R;
import java.util.Date;
import java.util.Random;
import javax.inject.Inject;
import javax.inject.Singleton;
import static org.tasks.date.DateTimeUtils.currentTimeMillis;
import static org.tasks.date.DateTimeUtils.newDate;
@ -42,6 +43,7 @@ import static org.tasks.date.DateTimeUtils.newDate;
* @author Tim Su <tim@todoroo.com>
*
*/
@Singleton
public final class ReminderService {
// --- constants
@ -74,32 +76,15 @@ public final class ReminderService {
// --- instance variables
@Autowired private TaskDao taskDao;
private AlarmScheduler scheduler = new ReminderAlarmScheduler();
private long now = -1; // For tracking when reminders might be scheduled all at once
@Inject
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;
}
void clearInstance() {
instance = null;
}
// --- preference handling
private static boolean preferencesInitialized = false;
@ -129,14 +114,14 @@ public final class ReminderService {
/**
* Schedules all alarms
*/
public void scheduleAllAlarms() {
TodorooCursor<Task> cursor = getTasksWithReminders(NOTIFICATION_PROPERTIES);
public void scheduleAllAlarms(TaskDao taskDao) {
TodorooCursor<Task> cursor = getTasksWithReminders(taskDao, NOTIFICATION_PROPERTIES);
try {
Task task = new Task();
now = DateUtilities.now(); // Before mass scheduling, initialize now variable
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
task.readFromCursor(cursor);
scheduleAlarm(task, false);
scheduleAlarm(task, null);
}
} catch (Exception e) {
// suppress
@ -156,8 +141,8 @@ public final class ReminderService {
/**
* Schedules alarms for a single task
*/
public void scheduleAlarm(Task task) {
scheduleAlarm(task, true);
public void scheduleAlarm(TaskDao taskDao, Task task) {
scheduleAlarm(task, taskDao);
}
public void clearAllAlarms(Task task) {
@ -167,19 +152,13 @@ public final class ReminderService {
scheduler.createAlarm(task, NO_ALARM, TYPE_OVERDUE);
}
/**
* Schedules alarms for a single task
*
* @param shouldPerformPropertyCheck
* whether to check if task has requisite properties
*/
private void scheduleAlarm(Task task, boolean shouldPerformPropertyCheck) {
private void scheduleAlarm(Task task, TaskDao taskDao) {
if(task == null || !task.isSaved()) {
return;
}
// read data if necessary
if(shouldPerformPropertyCheck) {
if(taskDao != null) {
for(Property<?> property : NOTIFICATION_PROPERTIES) {
if(!task.containsValue(property)) {
task = taskDao.fetch(task.getId(), NOTIFICATION_PROPERTIES);
@ -482,12 +461,10 @@ public final class ReminderService {
* Gets a listing of all tasks that are active &
* @return todoroo cursor. PLEASE CLOSE THIS CURSOR!
*/
private TodorooCursor<Task> getTasksWithReminders(Property<?>... properties) {
private TodorooCursor<Task> getTasksWithReminders(TaskDao taskDao, Property<?>... properties) {
return taskDao.query(Query.select(properties).where(Criterion.and(
TaskCriteria.isActive(),
TaskCriteria.ownedByMe(),
Criterion.or(Task.REMINDER_FLAGS.gt(0), Task.REMINDER_PERIOD.gt(0)))));
}
}

@ -20,12 +20,6 @@ import com.todoroo.astrid.service.AstridDependencyInjector;
*/
public class ReminderStartupReceiver extends BroadcastReceiver {
static {
AstridDependencyInjector.initialize();
}
// --- system startup
@Override
/** Called when the system is started up */
public void onReceive(Context context, Intent intent) {

@ -2,9 +2,10 @@ package org.tasks;
import android.app.Application;
import com.todoroo.astrid.service.AstridDependencyInjector;
import org.tasks.injection.Injector;
import org.tasks.injection.TasksModule;
import dagger.ObjectGraph;
public class Tasks extends Application implements Injector {
@ -14,11 +15,28 @@ public class Tasks extends Application implements Injector {
public void onCreate() {
super.onCreate();
injector = AstridDependencyInjector.getInjector();
getInjector();
}
@Override
public void inject(Object caller, Object... modules) {
injector.inject(caller, modules);
getInjector().inject(caller, modules);
}
private Injector getInjector() {
if (injector == null) {
injector = new Injector() {
ObjectGraph objectGraph = ObjectGraph.create(new TasksModule());
@Override
public void inject(Object caller, Object... modules) {
objectGraph
.plus(modules)
.inject(caller);
}
};
}
return injector;
}
}

@ -0,0 +1,16 @@
package org.tasks.injection;
import com.todoroo.astrid.provider.Astrid2TaskProvider;
import com.todoroo.astrid.provider.Astrid3ContentProvider;
import com.todoroo.astrid.provider.SqlContentProvider;
import dagger.Module;
@Module(library = true,
injects = {
Astrid2TaskProvider.class,
Astrid3ContentProvider.class,
SqlContentProvider.class
})
public class ContentProviderModule {
}

@ -1,5 +1,6 @@
package org.tasks.injection;
import com.todoroo.astrid.actfm.TagCommentsFragment;
import com.todoroo.astrid.actfm.TagViewFragment;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.activity.TaskListFragment;
@ -18,7 +19,8 @@ import dagger.Module;
SubtasksListFragment.class,
SubtasksTagListFragment.class,
TagViewFragment.class,
TaskEditFragment.class
TaskEditFragment.class,
TagCommentsFragment.class
})
public class FragmentModule {
}

@ -0,0 +1,12 @@
package org.tasks.injection;
import android.content.ContentProvider;
public abstract class InjectingContentProvider extends ContentProvider {
@Override
public boolean onCreate() {
((Injector) getContext().getApplicationContext()).inject(this, new ContentProviderModule());
return true;
}
}

@ -2,6 +2,8 @@ package org.tasks.injection;
import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.alarms.AlarmControlSet;
import com.todoroo.astrid.backup.TasksXmlExporter;
import com.todoroo.astrid.backup.TasksXmlImporter;
import com.todoroo.astrid.core.CustomFilterExposer;
import com.todoroo.astrid.files.FilesControlSet;
import com.todoroo.astrid.gcal.GCalControlSet;
@ -33,7 +35,9 @@ import dagger.Module;
TimerActionControlSet.class,
CustomFilterExposer.class,
GtasksFilterExposer.class,
TagFilterExposer.class
TagFilterExposer.class,
TasksXmlExporter.class,
TasksXmlImporter.class
}
)
public class TasksModule {

Loading…
Cancel
Save